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

标签 c++ https

在某些网站上,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/

相关文章:

c++ - 为什么按值捕获 std::istringstream 右值的 Op 不符合 Accumulateable 概念?

c++ - 修改 Bellman-Ford 算法以维护基于成本的有序列表

c++ - 调用CreateFile打开串口 "comX"时如何设置限制时间?

c++ - 删除在 DLL 中创建的对象

php - 此应用程序中的不安全内容错误

post - 在 Gravatar 上用于 POST 请求 https xml-rpc 的 Bash 脚本

java - 如何在不禁用 ssl 验证的情况下调用 https URL?

android - 带 HTTPS 的 KSOAP 2 Android

javascript - 如何在node.js中发送表单数据

c++ - 总是返回成员变量 getter 的引用是个好主意吗?