我目前正在使用HttpDeclarePush
来利用HTTP / 2中的服务器推送功能。
我能够成功创建此函数接受的所有参数。但是问题是HttpDeclarePush
执行时返回1229(ERROR_CONNECTION_INVALID)-https://docs.microsoft.com/en-us/windows/desktop/debug/system-error-codes--1000-1299-的值。
在进一步研究中,我发现HttpHeaderConnection
(https://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?