【问题标题】:How to tell the HTTP server to not send chunked encoding如何告诉 HTTP 服务器不发送分块编码
【发布时间】:2015-11-05 08:15:57
【问题描述】:

我目前正在编写一个 HTTP 客户端来对返回 HTTP 响应的 URL 执行 HTTP POST。

但是,对于错误消息代码 400 和 500,它会发回非分块 HTTP 响应,而对于成功消息代码 201,它会发送分块响应。

在请求中,我设置了内容长度,所以我不确定为什么它仍然向我们发送分块传输编码。我可以在请求中设置任何其他标头,告诉 HTTP 服务器不要发送分块编码吗?

        headerList.append("POST /v2/charges HTTP/1.1")
        headerList.append("Content-Type: application/json")
        headerList.append("host: xxxxxxxxx")
        headerList.append("request-id: ABCD001123")
        headerList.append("Content-length: %d" %len(Msg))
        hostReqHeader = "\r\n".join(headerList)
        reqData = hostReqHeader + '\r\n\r\n' + qbPosMsg

我使用套接字来发送这些 HTTP 消息,而不是使用 httplib 或请求库。

【问题讨论】:

  • 坏消息:RFC7230, ¶4.1,“接收者必须能够解析和解码分块传输编码。”因此,没有通用的标准方法来防止分块编码。我想可能有一种特定于您的服务器且超出标准范围的方法。你用的是什么服务器?
  • 另见 ¶4.3,“客户端不得在 TE 中发送分块传输编码名称;HTTP/1.1 接收者始终可以接受分块。

标签: python http http-headers chunked-encoding


【解决方案1】:

分块是 HTTP/1.1 的必需特性。如果您不需要任何其他 1.1 特定功能,请在请求中指定 HTTP/1.0:

    headerList.append("POST /v2/charges HTTP/1.0")

【讨论】:

    【解决方案2】:

    您在请求中指定的 Content-Length 标头适用于请求,而不是服务器的响应。

    分块传输编码从不用于 HTTP 请求,仅用于响应,并且仅在客户端指定 HTTP/1.1 作为协议时使用。

    如果您的客户端不支持分块响应,只需在请求中指定 HTTP/1.0 作为协议(在您的代码中将 HTTP/1.1 替换为 HTTP/1.0)。

    仍然使用 HTTP 1.0 没有任何问题。 HTTP 1.0 对于使用几行代码编写简单客户端的能力仍然非常有用,它仍然可以查询所有现代 Web 服务器。所以在这种情况下是非常合适的。我认为这就是 HTTP 的美妙之处,即基本协议如此简单。 HTTP 1.1 和 HTTP 2.0 在能够编写支持它们的客户端方面逐渐增加了复杂性,但所有这些复杂性都是可选的 - HTTP 1.0 仍然可以使用。

    【讨论】:

    • “分块传输编码从不用于 HTTP 请求,仅用于响应,并且仅当客户端指定 HTTP/1.1 作为协议时。” - 我不认为这是正确的。 RFC 指的是消息正文上的分块编码,并没有具体提及它仅适用于响应。 datatracker.ietf.org/doc/html/rfc2616#section-3.6.1
    • 此外,来自 RFC -“所有 HTTP/1.1 应用程序必须能够接收和解码“分块”传输编码”。因此,如果您的应用程序不支持分块编码,那么根据定义,您实现的是 HTTP 1.0,而不是 1.1。这很好 - 告诉服务器你是 1.0。
    猜你喜欢
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    相关资源
    最近更新 更多