首页 > 解决方案 > HTTP 标头结束

问题描述

我正在尝试构建一个程序来识别标题的结尾。现在我知道 http 标头以空行结尾,如Detect end of http get request header (java)中所述,但是,据我了解,情况并非总是如此。

例如,在多部分中,您有一个带有边界的内容类型,并且在该边界中有一个空白空间,例如

Reading line: POST /hello:hello HTTP/1.1
Reading line: bla: bla
Reading line: Content-Type: multipart/form-data; boundary=--------------------------276559868742390689469124
Reading line: cache-control: no-cache
Reading line: Postman-Token: be8db757-81f4-49db-9187-30d66d0dd3d5
Reading line: User-Agent: PostmanRuntime/7.1.5
Reading line: Accept: */*
Reading line: Host: localhost:8080
Reading line: accept-encoding: gzip, deflate
Reading line: content-length: 498
Reading line: Connection: keep-alive
Reading line: 
Reading line: ----------------------------276559868742390689469124
Reading line: Content-Disposition: form-data; name=""; filename="TimeComplexity.txt"
Reading line: Content-Type: text/plain

所以显然寻找一个空的空间似乎并不是每次都有效。我注意到的是,后跟空格的 Content-Type 似乎总是 HTTP 标头的结尾,对吗?如果没有,还有哪些其他解决方案?除了提取内容长度并提取标题之前的内容外,似乎..慢。还可以提到我正在尝试在 java 中解析消息,但是如果您粘贴任何代码,我不介意其他语言的示例,但是,我试图从理论上理解它,我相信我可以管理其余的。

提前致谢!

标签: javasocketshttpnetwork-programmingtheory

解决方案


HTTP 标头可以按任何顺序排列。每个标题都以 CRLF 结尾,在最后一个标题之后有一个 CRLF 创建一个空行。这表明没有更多的标题。其余的是 HTTP 消息体。有关 HTTP 协议规范,请参阅RFC 2616

您的最后一个 HTTP 标头是Connection标头。下面的正文数据(大小为 498 字节)是multipart/form-data格式的 MIME 数据。MIME 看起来类似于 HTTP,因为它也有由空行分隔的标头和正文。但 MIME 也有分隔 MIME 数据不同部分的边界,每个部分都有自己的标题和正文。请参阅 RFC 2045 - 2047、7578和其他MIME 相关的 RFC。


推荐阅读