gpt4 book ai didi

c++ - http请求正文之前和之后的垃圾

转载 作者:行者123 更新时间:2023-11-28 04:13:15 27 4
gpt4 key购买 nike

在某些网站上,https 正文前后添加垃圾。我不知道这是什么大多数网站工作正常。也许问题出在https?b7 和 0 是什么?为什么?

要求:

GET /api/3/ticker/ltc_btc? HTTP/1.1
Host: yobit.net
Content-Length: 0
Connection: close
Accept-Encoding: identity

响应:

HTTP/1.1 200 OK
Date: Fri, 26 Jul 2019 22:34:41 GMT
Content-Type: text/html; charset=utf8
Transfer-Encoding: chunked
Connection: close
Set-Cookie: __cfduid=d1d616fde8dba864f15748d871ff9819f1564180481; expires=Sat, 25-Jul-20 22:34:41 GMT; path=/; domain=.yobit.net; HttpOnly; Secure
Set-Cookie: locale=en; expires=Thu, 26-Jul-2029 22:34:41 GMT; path=/
Vary: Accept-Encoding
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block;
x-download-options: noopen
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Server: cloudflare
CF-RAY: 4fc9d7a81c548ff7-DME

b7
{"ltc_btc":{"high":0.00964924,"low":0.00935811,"avg":0.00950367,"vol":192.35202559,"vol_cur":20190.08465994,"last":0.00964229,"buy":0.00957471,"sell":0.00964486,"updated":1564180338}}
0
Response sendHTTPS(Request& request) {
WSADATA wsaData;
WORD DllVersion = MAKEWORD(2, 2);
if (WSAStartup(DllVersion, &wsaData)) {
return Response();
}
std::string req = str(request);
addrinfo* pAddrInfo;
getaddrinfo(request.uri.host().c_str(), "443", 0, &pAddrInfo);

SOCKET connection = socket(
pAddrInfo->ai_family,
pAddrInfo->ai_socktype,
pAddrInfo->ai_protocol
);
if (!connection)
return Response();

int error = connect(connection, pAddrInfo->ai_addr, pAddrInfo->ai_addrlen);
if (error)
return Response();

SSL_library_init();
SSLeay_add_ssl_algorithms();
SSL_load_error_strings();

const SSL_METHOD *meth = TLSv1_2_client_method();
SSL_CTX *ctx = SSL_CTX_new(meth);

SSL *ssl = SSL_new(ctx);
if (!ssl)
return Response();

int sock = SSL_get_fd(ssl);
SSL_set_fd(ssl, connection);

error = SSL_connect(ssl);
if (error <= 0)
return Response();

int len = SSL_write(ssl, req.c_str(), req.size());
if (len <= 0)
return Response();

std::string result = "";
char buffer[16384] = { 0 };//16 kib
int bytes_recv = 0;

do {
bytes_recv = SSL_read(ssl, buffer, sizeof(buffer));
if (bytes_recv > 0)
result.append(buffer, bytes_recv);
} while (bytes_recv > 0);

closesocket(connection);
SSL_shutdown(ssl);
SSL_free(ssl);
SSL_CTX_free(ctx);

return Response(result);
}

最佳答案

这不是“垃圾”,而是 HTTP 1.1 的基本部分。这是分块内容传输编码,请参阅 section 3.6.1 of RFC 2616 .这是由

的存在指定的
Transfer-Encoding: chunked

在响应的 header 中。如果响应包含这样的 header ,您将需要使用分块传输编码来解码响应的内容。这不是很复杂,有关完整的详细信息,请参阅 RFC 2616。

或者,您可以在原始请求中指定 HTTP/1.0,以向服务器表明您手写的 HTTP 客户端不支持协议(protocol)级别 1.1。 HTTP 1.0 没有分块传输编码,无需处理。

但是,如果您的应用程序需要一些其他 HTTP 1.1 功能,您别无选择,只能准备在来自服务器的任何响应中处理分块传输编码。您的客户端无法表明它是否接受到服务器的分块传输编码。是否发送 block 完全取决于服务器。

关于c++ - http请求正文之前和之后的垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57227729/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com