【发布时间】:2016-05-30 17:07:30
【问题描述】:
是否可以使用 BIO_read (C++) 从服务器获取 HTTP 响应?
当我尝试将 BIO_read(bio, buffer, sizeof(buff)) 用于 http 响应时 - 在缓冲区中,我只得到部分响应,而不是全部。
如果可以展示一个获得完整响应的示例,请
【问题讨论】:
标签: c++ http ssl https openssl
是否可以使用 BIO_read (C++) 从服务器获取 HTTP 响应?
当我尝试将 BIO_read(bio, buffer, sizeof(buff)) 用于 http 响应时 - 在缓冲区中,我只得到部分响应,而不是全部。
如果可以展示一个获得完整响应的示例,请
【问题讨论】:
标签: c++ http ssl https openssl
是否可以使用 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 响应并获得预期的长度。上面的代码主要是因为服务器关闭了连接,并且作为带外信号,您可以使用它来完全接收响应。
【讨论】: