是否可以使用 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/