tl; dr“HTTP标头末尾与HTTP响应主体开头之间的字节0x33
0x39
0x0d
0x0a
会引用什么?”
我正在使用非常出色的libcurl向各种第三方端点发出HTTP请求。这些端点不在我的控制之下,需要实现规范。为了帮助调试和开发这些端点,我已经实现了如果使用curl.setopt(pycurl.VERBOSE, 1)
和curl.setopt(pycurl.DEBUGFUNCTION, debug_function)
这一直很好但最近我遇到了一个请求,我的调试功能没有像curl的调试输出那样处理。我确定是因为我不了解HTTP规范。
如果使用--verbose
从命令行发出curl请求,则会返回以下内容。
# redacted headers
< Via: 1.1 vegur
<
{"code":"InvalidCredentials","message":"Bad credentials"}*
Connection #0 to host redacted left intact
如果使用--trace
发出相同的请求,则会返回以下内容
0000: 56 69 61 3a 20 31 2e 31 20 76 65 67 75 72 0d 0a Via: 1.1 vegur..
<= Recv header, 2 bytes (0x2)
0000: 0d 0a ..
<= Recv data, 1 bytes (0x1)
0000: 33 3
<= Recv data, 62 bytes (0x3e)
0000: 39 0d 0a 7b 22 63 6f 64 65 22 3a 22 49 6e 76 61 9..{"code":"Inva
0010: 6c 69 64 43 72 65 64 65 6e 74 69 61 6c 73 22 2c lidCredentials",
0020: 22 6d 65 73 73 61 67 65 22 3a 22 42 61 64 20 63 "message":"Bad c
0030: 72 65 64 65 6e 74 69 61 6c 73 22 7d 0d 0a redentials"}..
<= Recv data, 1 bytes (0x1)
0000: 30 0
<= Recv data, 4 bytes (0x4)
0000: 0d 0a 0d 0a ....
== Info: Connection #0 to host redacted left intact
我测试过的所有HTTP客户端库都没有在响应体中包含这些字节的部分,所以我猜这些是我不知道的HTTP规范的一部分,但我找不到引用对他们而且我不知道如何处理它们。
如果它有用,我认为 curl正在使用这个https://github.com/curl/curl/blob/master/src/tool_cb_dbg.c来构建第一个示例位中的输出我不是真正的ac / c ++程序员而且我无法逆向工程逻辑。
有谁知道这些字节是什么?
答案 0 :(得分:2)
0d 0a
分别代表ASCII control characters和carriage return line feed。 CRLF在HTTP中用于mark the end of a header field(此时您不必担心一些历史异常)。双重CRLF应该是消息的mark the end of the fields section。
您观察到的33 39
是&#34; 39&#34;在ascii。这是chunk size indicator - 被视为十六进制数。响应标头中存在Transfer-Encoding: chunked
可能会支持此功能。