我遇到连接断开的问题,我认为这是由于http keepalive的行为不正确,但我无法理解'culpit'是在客户端还是在服务器端 .
我正在处理客户端发送和HTTP 1.1请求的场景:
Connection: close
并且服务器不会使用Connection标头进行回复 . 行为如下:
-
客户端发送请求
-
服务器发送响应
-
服务器不会关闭连接
-
客户端不关闭连接(.1)
-
客户端使用相同的连接发送另一个请求
-
服务器不执行任何操作,并在30“关闭连接后
组件如下:
-
客户端:Java HttpConnection(在Dell Boomi iPaaS中)
-
服务器:SAP ERP OData Webservice
根据这篇文章:“Should a server adhere to the HTTP Connection: close header sent from a client?”问题似乎在客户端 . 但是,Java HttpURLCoonnection实现应该非常强大(在Linux v 1.7.0_55-b13上测试x64服务器VM,在Windows 7 v 1.7.0_75-b13上测试x64服务器) .
以下是来自客户的第一个请求的完整标头集:
GET /sap/opu/odata/SAP/ZZSALESORDER_SRV/$metadata HTTP/1.1
User-Agent: Boomi Http Transport
Authorization: Basic YmPRIVATESECRETPLEASExNg==
X-CSRF-Token: Fetch
Connection: close
Cache-Control: no-cache
Pragma: no-cache
Host: some.server.behind.firewall.local:8000
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Cookie: sap-usercontext=sap-client=100; SAP_SESSIONID_DEV_100=Cm7LsDSECRETSECRETSECTERFaIMak%3d
这些是来自服务器响应的:
HTTP/1.1 200 OK
content-type: application/xml
content-length: 79750
x-csrf-token: oolTHISAGAINISASECRET3PA==
last-modified: Fri, 25 Mar 2016 17:55:35 GMT
dataserviceversion: 2.0
服务器回复后,客户端使用相同的连接发送第二个请求:
PUT /sap/opu/odata/SAP/ZZSALESORDER_SRV/SalesOrderItems(NumDocSap='1200001534',PosId='000020') HTTP/1.1
User-Agent: Boomi Http Transport
Content-Type: application/atom+xml
X-CSRF-Token: oolZMYSECRETPA==
Connection: close
Authorization: Basic YmPRIVATESECRETPLEASExNg==
Cache-Control: no-cache
Pragma: no-cache
Host: some.server.behind.firewall.local:8000
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Content-Length: 406
Cookie: sap-usercontext=sap-client=100; SAP_SESSIONID_DEV_100=Cm7PRETTYPRIVATESECRETak%3d
并且服务器在30“之后没有回复并突然关闭连接 .
设置JVM标志可以完全解决问题
http.keepAlive=false
在Java客户端(Boomi),但这似乎更多的解决方法,然后解决方案 .
有人可以解释一下:
-
客户端或服务器端是否存在HTTP协议违规?
-
可以通过发送不同的 Headers 来修复吗?