http请求之前和之后的垃圾

trash before body of http request and after

本文关键字:之后 请求 http      更新时间:2023-10-16

在某些站点到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的基本部分。这是块的内容传输编码,请参见RFC 2616的第3.6.1节。

Transfer-Encoding: chunked

在响应的标题中。如果响应包含这样的标头,则需要使用块状传输编码来解码响应的内容。这不是很复杂,请参见RFC 2616。

另外,您可以在原始请求中指定HTTP/1.0,以向服务器指示您的手写的HTTP客户端不支持协议级别1.1。HTTP 1.0没有块的传输编码,也不需要处理。

但是,如果您的应用程序需要其他一些HTTP 1.1功能,则您别无选择,但可以准备处理服务器中任何响应中的块传输编码。您的客户无需指示它是否接受编码到服务器的大块传输。是否发送块完全取决于服务器。