HttpSendRequest 失败并出现错误 12152,但 InternetOpenUrl 不会

HttpSendRequest fails with error 12152, but InternetOpenUrl doesn't

尝试使用 HttpSendRequest 向网站发送获取请求时,请注意,这已在多个网站上尝试过(googleWhosebugyoutube, 等), 出现错误, error 12152 (The server returned an invalid or unrecognized response).

使用Fiddler时得到比较正常的响应,就是这个错误[Fiddler] ReadResponse() failed: The server did not return a complete response for this request. Server returned 0 bytes.

奇怪的是,即使使用所有相同的参数,InternetOpenUrl 也不会失败。这是我的代码:

HINTERNET hInternet = InternetOpenW(..., DIRECT, NULL, NULL, 0);

HINTERNET hHttp = InternetConnectW(hInternet, L"whosebug.com", 443, NULL, NULL, INTERNET_SERVICE_HTTP, INTERNET_FLAG_SECURE, 0);

static const WCHAR anyAccept[] = { '*','/','*', 0 };

LPCWSTR accept[2] = { anyAccept, NULL };

HINTERNET hRequest = HttpOpenRequestW(hHttp, L"GET", L"/", NULL, NULL, accept, 0, 0);

HttpSendRequestW(hRequest, NULL, 0, NULL, 0);

//InternetOpenUrlW(hInternet, L"https://whosebug.com/", NULL, 0, 0, 0);

据我所知,查看 ReactOSInternetConnectW 上发布的源代码,使用 http 服务,使用 HTTP_Connect,就像 InternetOpenUrl,唯一的区别是,在 OpenUrl 中,它将 dwInternalFlags 参数设置为 INET_OPENURL,而在 Connect 中,它将其设置为 0,但在那之后,一切都是完全相同的,OpenUrl 也使用 HttpOpenRequestW & HttpSendRequestW,那么问题是什么,为什么执行 Connect => OpenRequest(GET) => SendRequest 会导致错误代码 12152,但执行 OpenUrl 却成功完成?

您正在尝试通过 443 端口建立安全部分,但您在 HttpOpenRequest 调用中缺少 INTERNET_FLAG_SECURE 标志。

MSDN documentation

变化:

HttpOpenRequestW(hHttp, L"GET", L"/", NULL, NULL, accept, 0, 0);

至:

HttpOpenRequestW(hHttp, L"GET", L"/", NULL, NULL, accept, INTERNET_FLAG_SECURE, 0);