gpt4 book ai didi

java - 即使没有内容长度 header ,也从 HTTP 请求中获取内容

转载 作者:可可西里 更新时间:2023-11-01 16:05:48 26 4
gpt4 key购买 nike

我正在测试一个客户端,该客户端向我发送了一个没有内容长度 header 但有内容的 HTTP 请求。

如何在没有内容长度 header 帮助的情况下提取此内容?

最佳答案

为了完整性,我保留了原始答案,但我一直在寻找 HTTP RFC (2616)第 4.3 节:

The presence of a message-body in a request is signaled by the inclusion of a Content-Length or Transfer-Encoding header field in the request's message-headers. A message-body MUST NOT be included in a request if the specification of the request method (section 5.1.1) does not allow sending an entity-body in requests. A server SHOULD read and forward a message-body on any request; if the request method does not include defined semantics for an entity-body, then the message-body SHOULD be ignored when handling the request.

因此,如果您没有内容长度,您必须有一个传输编码(如果没有,您应该以 400 状态响应以指示错误请求或 411 (“要求的长度”))。那时,你按照传输编码告诉你的去做:)

现在,如果您正在处理 servlet API(或类似的 HTTP API),它可能会为您处理所有这些 - 此时您可能能够使用下面的技术来阅读从流直到它不再产生数据,因为 API 会处理它(即它不仅仅是原始套接字流)。

如果您能向我们提供有关您的背景的更多信息,那将会有所帮助。


原始答案

如果没有内容长度,则意味着内容会一直持续到数据结束(当套接字关闭时)。

继续从输入流中读取(例如将其写入 ByteArrayOutputStream 以存储它,或者可能是一个文件)直到 InputStream.read 返回 -1。例如:

byte[] buffer = new byte[8192];
ByteArrayOutputStream output = new ByteArrayOutputStream();
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1)
{
output.write(buffer, 0, bytesRead);
}
// Now use the data in "output"

编辑:正如评论中指出的那样,客户端可能正在使用分块编码。通常,您使用的 HTTP API 应该为您处理这个问题,但如果您处理的是原始套接字,则必须自己处理。

关于这是一个请求(因此客户端无法关闭连接)这一点很有趣 - 我认为客户端可以关闭发送部分,但我不现在看看它如何映射到 TCP 中的任何内容。我的低级网络知识并非如此。

如果这个答案“绝对没用”,我会删除它...

关于java - 即使没有内容长度 header ,也从 HTTP 请求中获取内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5178017/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com