一次使用自定义 Http Header 引发的血案

HttpClient Http Header 自定义 nginx 不转发 

起因

最近在整理我们产品的 OpenAPI Demo (Python、C#、Java),为使各语言 Demo 表现一致,使用同样的测试数据和同样的请求封装方式。

在 Python、C# 都特别顺利写完后,Java 遇到问题了:其中有一个接口返回 HTTP 400 错误,而其他接口都正常

环境

  1. JDK 1.8
  2. JAVA 调用接口使用 Apache HttpClient 4.2.1

排查

疑因1

由于 HTTP 400 Bad Request 很明显的是客户请求不满足服务端的要求,是客户端的问题,所以最先怀疑是客户端参数没传。

经过再三确认后,确认参数传递没有问题。

疑因2

排除疑因1后,有点陷入死局,不知如何下手。最后,有可能是请求通过 nginx 转发时,nginx 破坏了请求,导致应用服务器报 400.

于是,登录服务器,查看 Nginx 日志,发现请求没有被转发,如下图:

与正常的的请求相比,如下图:

未被转发的请求缺少了 Http Header : Host,也就是说错误的请求的 Host Header 被客户端丢弃,通过 Wireshark 抓包也确认是客户端的请求中没有 Host Header

疑因3

通过排除疑因2的过程,明确了问题出在请求调用方,而请求方式都是统一的封装接口,那么最有可能的原因就是请求的参数不一致导致。

于是,逐个去掉该请求的参数,发现其中一个 key 为 “productName”, value 为“测试修改产品名称” 的参数导致。将 value 改为其它值进行测试,发现没有问题,于是逐个去掉 value 的汉字,发现只要去掉“名”字就可测试通过。

这就奇了怪了,为什么有“名”字就测试不通过呢,又为什么其它语言能测试通过?!!!

思考。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

然后,对比有“名”字和无“名”字两次 wireshark 的抓包。

哇哇哇,为什么有“名”字的 Header 有换行

然后,将“名”字转换成 Unicode ,其值为 \u540d

ASCII 转换

然后对照 ASCCI 码表发现,发现 0D 表示“回车键”

ASCCI 码表

至此就清楚了,请求封装的代码将请求数据也放到了 Header ,而恰巧“名”字导致了 Header 头不合规范,从而导致 Host Header 丢失。而对比其它语言的请求封装类,并没有将请求数据放到 Header 中,这也解释了其它语言为什么可以测试通过。

经查 OpenAPI 的协议文档,并没有要求将请求数据放到 Header,而当时为什么这么做了,也无从考查。。。。。。

总结

虽然这次问题解决了,但却花费了半天的时间,在排查问题的时候,还是要再细心一些,多抓包并仔细分析,多对比正常情况与异常情况的不同,可能会事半功倍。

谨记!!!

一次使用自定义 Http Header 引发的血案的更多相关文章

  1. 自定义 Preference Header 布局

    1. Preference Header 概述: 对于什么是 Preference Header,以及何时使用 Preference Header,请参考我的另一篇博文: 何时使用 Preferenc ...

  2. iOS-AFNetworking封装Get(自定义HTTP Header)和Post请求及文件下载

    前面提到AFNetworking是一个很强大的网络三方库,首先你需要引入AFNetworking三方库:如封装的有误还请指出,谢谢! 1.Get请求 /**Get请求 url 服务器请求地址 succ ...

  3. Vuejs中slot实现自定义组件header、footer等

    Vuejs中slot实现自定义组件header.footer等 vue中的slot主要负责内容分发,之前有介绍过slot的内容,具体链接:http://www.cnblogs.com/vipzhou/ ...

  4. Nginx获取自定义头部header的值

    http://blog.csdn.net/xbynet/article/details/51899286?_t=t http://shift-alt-ctrl.iteye.com/blog/23314 ...

  5. [WCF]缺少一行代码引发的血案

    这是今天作项目支持的发现的一个关于WCF的问题,虽然最终我只是添加了一行代码就解决了这个问题,但是整个纠错过程是痛苦的,甚至最终发现这个问题都具有偶然性.具体来说,这是一个关于如何自动为服务接口(契约 ...

  6. 一个由正则表达式引发的血案 vs2017使用rdlc实现批量打印 vs2017使用rdlc [asp.net core 源码分析] 01 - Session SignalR sql for xml path用法 MemCahe C# 操作Excel图形——绘制、读取、隐藏、删除图形 IOC,DIP,DI,IoC容器

    1. 血案由来 近期我在为Lazada卖家中心做一个自助注册的项目,其中的shop name校验规则较为复杂,要求:1. 英文字母大小写2. 数字3. 越南文4. 一些特殊字符,如“&”,“- ...

  7. dubbox微服务实例及引发的“血案”

    Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成. 主要核心部件: Remoting: 网络通信框架 ...

  8. Integer.parseInt 引发的血案

    Integer.parseInt 处理一个空字符串, 结果出错了, 程序没有注意到,搞了很久, 引发了血案啊!! 最后,终于 观察到了, 最后的部分: Caused by: java.lang.NoC ...

  9. Replication的犄角旮旯(六)-- 一个DDL引发的血案(上)(如何近似估算DDL操作进度)

    <Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...

随机推荐

  1. Tool.js(javascript帮助类)

    //string.format $.format = function (source, params) { ) return function () { var args = $.makeArray ...

  2. Go语言中方法和函数的区别

    今天看<Go语言实战>发现方法和函数不太一样,写的格式不一样,用法也不一样.所以记一次笔记. 在Go语言中,函数和方法不太一样,有明确的概念区分.其他语言中,比如Java,一般来说,函数就 ...

  3. 论文阅读 | Text Processing Like Humans Do: Visually Attacking and Shielding NLP Systems

    [code&data] [pdf] 主要工作 文章首先证明了对抗攻击对NLP系统的影响力,然后提出了三种屏蔽方法: visual character embeddings adversaria ...

  4. 2019牛客暑期多校训练营(第五场)- G subsequence 1

    题目链接:https://ac.nowcoder.com/acm/contest/885/G 题意:给定字符串s,t,求s中满足字典序大于t的子序列的个数. 思路:组合数学+dp.当子序列长度大于m时 ...

  5. sql server 中 like 中文不匹配问题解决就这么简单

    原文:sql server 中 like 中文不匹配问题解决就这么简单 MS-SQL Server select * from Book where BookName like'%C语言%'  在SQ ...

  6. BEGIN_MESSAGE_MAP和END_MESSAGE_MAP()

    这两个宏表示这个类的消息映射开始和结束,中间的宏定义定义了此类的所有的消息映射.前面的afx_msg void OnPaint():只是声明OnPaint()函数的一个消息处理函数,然后是OnPain ...

  7. iterm2 vim 开启滚轮

    之前使用mac自带终端时,可以通过上下滑动触摸板来在vim中快速浏览上下文.最近听说iterm2功能更加强大,索性试一试.发现默认没有这个功能,感觉应该可以通过配置实现,于是在iterm2的prefe ...

  8. c# 是如何对一个可遍历对象实现遍历的

    public class Persons:IEnumerable { public Persons(string[] people) { this.people = people; } public ...

  9. MVC中的Action过滤器

    Action过滤器可以用在调用动作方法之前或之后,执行一些特殊的逻辑,比如用登录验证: Action过滤器实现IActionFilter接口,该接口有两个方法: public interface IA ...

  10. 解决vs code编写python输出中文乱码问题

    环境: win7 vscode 1.37.0 插件: python Code Runner 乱码问题: 创建一个python文件,运行如下代码,打印显示乱码.: 解决乱码步骤: Ctrl+Shift+ ...