Http keep-alive protocol" Connection:close"来自客户但没有"连接"服务器的标头

时间:2016-03-31 09:50:34

标签: java http odata sap keep-alive

我遇到连接断开的问题,我认为这是由于http keepalive的行为不正确,但我无法理解' culpit'在客户端或服务器端。

我正在处理客户端发送的场景和HTTP 1.1请求:

Connection: close

并且服务器不会使用Connection标头进行回复。 行为如下:

  1. 客户端发送请求
  2. 服务器发送响应
  3. 服务器不会关闭连接
  4. 客户端不会关闭连接(.1)
  5. 客户端使用相同的连接发送另一个请求
  6. 服务器没有做任何事情,30"关闭连接
  7. 组件如下:

    • 客户端: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协议违规?
    • 可以通过发送不同的标题来修复吗?

0 个答案:

没有答案