1

我正在为我的嵌入式项目实现最低 HTTPS 层,其中我使用mbedTLS 进行 TLS并硬编码 HTTP 标头以与 HTTPS 服务器通信。

它适用于普通网站。但到目前为止,我的实现通过检查读取的最后一个字节是否为\n.

if( ret > 0 && output[len-1] == '\n' )
{
    ret = 0;
    output[len] = 0;
    break;
}

然而,由于显而易见的原因,这并不总是有效。我试过openssl s_client了,它的行为是一样的——如果 HTTP 响应以 终止\n,然后s_client在获取所有数据后立即返回。否则它将永远阻塞,等待更多数据。

一个真正的浏览器似乎能够正确处理这个问题。除了设置超时,我还能做些什么吗?

4

1 回答 1

0

如何判断 HTTP 响应是否在 C 中终止...
但是到目前为止,我的实现通过检查读取的最后一个字节是否是\n...来检测 HTTPS 响应的结束...
但是,由于明显的原因,这并不总是有效...

HTTP 调用\r\n,而不是 \n。请参阅RFC 2616,超文本传输​​协议 - HTTP/1.1和第 15 页:

HTTP/1.1 将序列 CR LF 定义为除实体主体之外的所有协议元素的行尾标记(有关宽容的应用程序,请参见附录 19.3)。实体主体内的行尾标记由其关联的媒体类型定义,如 3.7 节所述。

CRLF = CR LF

现在,各种服务器发送的是完全不同的球赛。会有重复的行尾标记、缺少行尾标记和不正确的行尾标记。它的狂野,狂野的西部。

您可能想查看 HTTP 解析器的参考实现。如果是这样,请查看libeventcURL的解析器以及它们如何维护其状态机。

于 2016-02-16T08:26:46.620 回答