【问题标题】:Partial HTTP response when using BIO_read使用 BIO_read 时的部分 HTTP 响应
【发布时间】:2016-05-30 17:07:30
【问题描述】:

是否可以使用 BIO_read (C++) 从服务器获取 HTTP 响应?

当我尝试将 BIO_read(bio, buffer, sizeof(buff)) 用于 http 响应时 - 在缓冲区中,我只得到部分响应,而不是全部。

如果可以展示一个获得完整响应的示例,请

【问题讨论】:

    标签: c++ http ssl https openssl


    【解决方案1】:

    是否可以使用 BIO_read 从服务器获取 HTTP 响应

    是的。


    如果可以显示获得完整响应的示例,请

    来自 OpenSS wiki 上的 SSL/TLS Client

    #define HOST_NAME "www.random.org"
    #define HOST_PORT "443"
    #define HOST_RESOURCE "/cgi-bin/randbyte?nbytes=32&format=h"
    ...
    
    BIO *web = NULL, *out = NULL;
    ...
    
    BIO_puts(web, "GET " HOST_RESOURCE " HTTP/1.1\r\n"
                  "Host: " HOST_NAME "\r\n"
                  "Connection: close\r\n\r\n");
    BIO_puts(out, "\n");
    ...
    
    int len = 0;
    do
    {
      char buff[1536] = {};
      len = BIO_read(web, buff, sizeof(buff));
    
      if(len > 0)
        BIO_write(out, buff, len);
    
    } while (len > 0 || BIO_should_retry(web));
    

    你应该注意两件事。首先,检查BIO_read 的返回值。其次,BIO_should_retry 用于检测是否由于潜在的竞争而需要读取更多数据。

    它的不是一个完整的例子。在生产中应该发生的是您对BIO 执行部分读取。您可以根据响应标头确定响应的长度。然后添加带有安全阀的第三个条件 - 预期响应长度。您需要一个安全阀来处理损坏的 Web 服务器和提供错误响应长度的损坏的代理。

    如果您从 HTTP 请求中删除了 Connection: close,那么您将需要解析 HTTP 响应并获得预期的长度。上面的代码主要是因为服务器关闭了连接,并且作为带外信号,您可以使用它来完全接收响应。

    【讨论】:

    • 我可以用 Cout 而不是 BIO_write 打印服务器答案吗?
    猜你喜欢
    • 2018-04-14
    • 2012-01-04
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多