function wrapHandler(callable $handler, LoggerInterface $logger, LoggerInterface $tracer)
return function (array $request, Connection $connection, Transport $transport = null, $options) use ($handler, $logger, $tracer) {
$response = Core::proxy($handler($request), function ($response) use ($connection, $transport, $logger, $tracer, $request, $options) {
if (isset($response['error']) === true) {
if ($response['error'] instanceof ConnectException || $response['error'] instanceof RingException) {
$connection->markDead();
$transport->connectionPool->scheduleCheck();
$neverRetry = isset($request['client']['never_retry']) ? $request['client']['never_retry'] : false;
$shouldRetry = $transport->shouldRetry($request);
if ($shouldRetry && !$neverRetry) {
return $transport->performRequest(
$request['http_method'],
$request['uri'],
$request['body'],
$options
在代码TODO里面日志记录下$response信息。发现了response的error信息如下:
cURL: [P]roblem (2) in the Chunked-Encoded data
好了,这里其实把error的真身拿出来了,就可以google了。也确实给我们google到了: https://github.com/jackalope/jackalope-jackrabbit/issues/89
按照里面的方法,强行设置HTTP的version头为1.0就能解决了。
我们尝试在Connection.php里面将version头设置上:
public function performRequest($method, $uri, $params = null, $body = null, $options = [], Transport $transport = null)
if (isset($body) === true) {
$body = $this->serializer->serialize($body);
$request = [
'http_method' => $method,
'scheme' => $this->transportSchema,
'uri' => $this->getURI($uri, $params),
'body' => $body,
'headers' => [
'host' => [$this->host]
'version' => "1.0"
$request = array_merge_recursive($request, $this->connectionParams, $options);
确实解决了这个问题。
问题是可以这样解决,但是基本上来说,难道这个错误是客户端引起的么?根,还在提供es的gateway这端的。
先把version头去掉,我决定tcpdump抓包看看情况。
我使用HTTP过滤了下包显示,发现了一个奇怪的现象:
#107是response开始,我看了下实际的头:
有个Transfer-Encoding: chunked。这个就代表请求结果过长,所以我把这个请求结果分段返回给客户端。
wireshark把红框框了出来。想告诉我们的是,这个chunk返回的数据并不全。
好了,这个我们基本上找到了问题的根源:
服务端支持Transfer-Encoding:chunked,但是不知道什么原因,没有全部返回所有数据。
所以第二种解决方法也出现了:服务端关闭对Transfer-Encoding:chunked的支持。
但是再问一下,为什么服务端会没有全部返回正常的chunked数据呢?
还要展开下,我在wireshark中按照tcp流方式显示了这个response,发现了一个很诡异的现象:
#107还是我们response的开始,然后#108,#109,#110,#111都是chunk数据,并且seq也按照如期地在顺序增长,但是到了#112,客户端这边莫名奇妙返回了一个RST。然后服务端返回了一个ACK。然后就是拒绝大戏了,服务端不断往这边送东西,客户端不断返回RST。到最后,这个连接就断开了。
所以现在的问题追结到为什么会发送#112这个请求。
看win窗口,到#114的时候win窗口已经为0了,而在后面的请求中,win窗口仍然一直为0,说明应用程序一直没有去读缓存区中获取数据。那这个问题估摸就在php-curl或者curl_lib上了。
最终也没有去追php-curl和curllib库的问题了,主要这个库公司统一部署的,不大可能由于这个问题进行修改了,最后的方法还是通过gateway服务端不使用chunk的头来解决了这个问题。
本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/p/5985239.html,如需转载请自行联系原作者
浅析http请求的content-type及使用场景
在HTTP协议消息头中,使用Content-Type来表示媒体类型信息。它被用来告诉服务端如何处理请求的数据,以及告诉客户端(一般是浏览器)如何解析响应的数据,比如显示图片,解析html或仅仅展示一个文本等。
HTTP 请求头Cache-Control 详解
大家好,我是阿萨。昨天我们学习了缓存机制。[你了解缓存吗?]了解了缓存基本原理。今天我们就详细学习下抓包的请求中Cache-Control 字段的所有设置的含义。
使用 http-proxy 代理 HTTP 请求时遇到的 the requested url is invalid 错误消息
使用 http-proxy 代理 HTTP 请求时遇到的 the requested url is invalid 错误消息
浅谈http缓存使用(Cache-Control、Last-Modified、ETag使用)
浅谈http缓存使用(Cache-Control、Last-Modified、ETag使用)
我又踩坑了!如何为HttpClient请求设置Content-Type标头?
小编对于Http协议有知识漏洞,搬砖时一直关注Chrome DevTools,忽略了还有Entity Header一说
OPA 22 - sinor fake xml http request
Created by Wang, Jerry, last modified on Nov 08, 2015
Http Header中到底有些啥?
在互联网时代,Http协议被广泛使用。相信小伙伴们对Http协议并不陌生,没错,你写的接口大部分都是Http接口,前端和后端的数据交互,大部分也是通过Http协议来交互的。那你有没有想过Http协议中,除了我们经常使用消息体来传输数据外,它的消息头中包含哪些内容呢?今天,冰河就带你一探究竟。
服务端有异常, 导致: Ajax 请求报错 net::ERR_INCOMPLETE_CHUNKED_ENCODING
但是,这个 Ajax Http 接口使用浏览器可以直接返回。