如何判断HTTP响应是否在C中终止

时间:2016-02-16 04:31:07

标签: http browser https mbed

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

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

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

但是,这并不总是有明显的原因。我尝试openssl s_client,它的行为相同 - 如果HTTP响应以\n终止,则s_client在获取所有数据后立即返回。否则它会永远阻塞,等待更多数据。

真正的浏览器似乎能够正确处理这个问题。除了设置超时之外,还有什么可以做的吗?

1 个答案:

答案 0 :(得分:0)

  

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

HTTP呼叫\r\n不呼叫 \n。请参阅RFC 2616, Hypertext Transfer Protocol - HTTP/1.1和第15页:

  

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

     

CRLF = CR LF

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

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