如何使HTTP / 2连接保持活动状态,直到请求/响应会话完成?

时间:2018-07-12 10:27:10

标签: header connection frame http2

我目前正在使用HttpDeclarePush来利用HTTP / 2中的服务器推送功能。

我能够成功创建此函数接受的所有参数。但是问题是HttpDeclarePush执行时返回1229(ERROR_CONNECTION_INVALID)-https://docs.microsoft.com/en-us/windows/desktop/debug/system-error-codes--1000-1299-的值。

在进一步研究中,我发现HttpHeaderConnectionhttps://docs.microsoft.com/en-us/windows/desktop/api/http/ne-http-_http_header_id)中的_HTTP_HEADER_ID实际上是作为'close'传递给函数的。这意味着在每个请求响应中,服务器都会关闭连接,在我的情况下也是如此,我在日志中进行了检查。

这是代码。

class http2_native_module : public CHttpModule
{
public:
    REQUEST_NOTIFICATION_STATUS OnBeginRequest(IN IHttpContext * p_http_context, IN IHttpEventProvider * p_provider)
    {
        HTTP_REQUEST_ID    request_id;
        const HTTPAPI_VERSION version = HTTPAPI_VERSION_2;

        auto pHttpRequest = p_http_context->GetRequest();
        auto phttpRequestRaw = pHttpRequest->GetRawHttpRequest();
        HANDLE p_req_queue_handle = nullptr;
        auto isHttp2 = phttpRequestRaw->Flags;

    try {
            const auto request_queue_handle = HttpCreateRequestQueue(version, nullptr, nullptr, NULL, &p_req_queue_handle);

            const auto verb = phttpRequestRaw->Verb;
            const auto http_path = L"/polyfills.0d74a55d0dbab6b8c32c.js"; //ITEM that I want to PUSH to client
            const auto query = nullptr;


            request_id = phttpRequestRaw->RequestId;
            auto headers = phttpRequestRaw->Headers;

            auto connId = phttpRequestRaw->ConnectionId;                

            WriteEventViewerLog(L"OnBeginRequest - Entering HTTPDECLAREPUSH");

            headers.KnownHeaders[1].pRawValue = NULL;
            headers.KnownHeaders[1].RawValueLength = 0;

            const auto is_success = HttpDeclarePush(p_req_queue_handle, request_id, verb, http_path, query, &headers);

            sprintf_s(szBuffer, "%lu", is_success);
            Log("is_success value", szBuffer);  //ERROR CODE 1229 here
            HttpCloseRequestQueue(p_req_queue_handle);
        }
        catch (std::bad_alloc & e)
        {
            auto something = e;
        }

        return RQ_NOTIFICATION_CONTINUE;
    }

我什至尝试如下更新标头连接值,但仍然给我1229。

headers.KnownHeaders[1].pRawValue = NULL;
headers.KnownHeaders[1].RawValueLength = 0;

我从https://http2.github.io/http2-spec/中了解到,HTTP / 2实际上忽略了HTTP HEADER中的内容,并使用其他一些机制作为其FRAME的一部分。

这使我们进入下一个问题,该问题如何使连接保持打开状态,这是否与HTTP2使用的FRAME(类似于HEADER)有关,如果这样,则C ++或Microsoft如何帮助我们使用HTTP2中的FRAME?

0 个答案:

没有答案