希望了解使用curl进行的HTTP请求中两个字节的含义--trace

时间:2017-06-14 16:23:46

标签: http curl libcurl

tl; dr“HTTP标头末尾与HTTP响应主体开头之间的字节0x33 0x39 0x0d 0x0a会引用什么?”

我正在使用非常出色的libcurl向各种第三方端点发出HTTP请求。这些端点不在我的控制之下,需要实现规范。为了帮助调试和开发这些端点,我已经实现了如果使用curl.setopt(pycurl.VERBOSE, 1)curl.setopt(pycurl.DEBUGFUNCTION, debug_function)

从命令行使用-v标志发出curl请求时可能会看到的文本输出功能

这一直很好但最近我遇到了一个请求,我的调试功能没有像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 ++程序员而且我无法逆向工程逻辑。

有谁知道这些字节是什么?

1 个答案:

答案 0 :(得分:2)

0d 0a分别代表ASCII control characterscarriage 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可能会支持此功能。