HTTP/1.1 413 FULL Head

昨天,server调用新浪的OpenAPI功能失效。出现的现象是:服务器上线时是可以正常使用的。但是隔一段时间就变得不可用。刚开始以为是socket连接过多或者socket等资源没有释放。后来查了一下socket连接发现不是这样子的. 下面是连接新浪服务器的tcp。发现只有两个。

1
2
3
4
5
6
7
$ netstat -np | grep 123.125.29

tcp 0 0 -- ::ffff:123.125.29.244:443 ESTABLISHED -
tcp 0 0 -- ::ffff:123.125.29.244:443 ESTABLISHED -
$ netstat -np | grep 180.149.135
tcp 28 0 -- ::ffff:180.149.135.176:443 CLOSE_WAIT -
tcp 28 0 -- ::ffff:180.149.135.176:443 CLOSE_WAIT -

后来还看了HttpClient的源码和PoolingClientConnectionManager, 发现并不是这个引起的。另外给大家说个事情。使用Http Client+PoolingClientConnectionManager,然后再使用HttpGet和HttpPost的话,HttpGet和HttpPost是不需要release的.另外socket也不需要显示的关掉。唯一需要注意的是HttpResponse需要把Entity中的Stream流关掉。否则请求有可能被Hold住。详细的介绍见 HttpClient 卡死 response为null . 如果你不是使用HttpClient+PoolingClientConnectionManager, 而是每次new出来的新HttpClient,那就需要关闭Socket,详细解决方法见 JAVA的HttpClient问题:The server failed to respond with a valid HTTP response 。但是上面都没有解决问题, 最后还是将HTTP的status code打印出来。发现是:

1
HTTP/1.1 413 FULL head

这问题出在,有多个线程在往HTTP 请求中增加Header, 而且header一直没有清空。就导致了这个问题。