c++ - 使用 BIO_read 时的部分 HTTP 响应

标签 c++ http ssl https openssl

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

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

如果有可能给出一个得到完整响应的例子,请

最佳答案

Is it possible to get HTTP response from server using BIO_read

是的。


If it is possible show an example of getting full response, please

来自 SSL/TLS Client在 OpenSS 维基上:

#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 执行部分读取。您可以根据响应 header 确定响应的长度。然后添加带有安全阀的第三个条件 - 预期响应长度。对于提供错误响应长度的损坏的网络服务器和损坏的代理,您需要一个安全阀。

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

关于c++ - 使用 BIO_read 时的部分 HTTP 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37530730/

相关文章:

java - 具有并发慢速TCP客户端连接的tomcat Java NIO

unit-testing - 在 Go 中为 httptest.NewServer 使用自定义 URL

apache - 什么是 Apache 的 OpenSSL 以及为什么一台服务器有它而另一台没有

c++ - 为什么循环是无限的?

c++ - 在字符数组的开头添加空格

c++ - c++中long long的模运算

php - 跨域认证

c++ - 什么是 undefined reference /未解析的外部符号错误,我该如何解决?

http - azure Blob : "The condition specified using HTTP conditional header(s) is not met"

java - GCM 服务器推送失败并出现 SSLException (Java)