HttpSendRequest 失败并出现错误 12152,但 InternetOpenUrl 不会
HttpSendRequest fails with error 12152, but InternetOpenUrl doesn't
尝试使用 HttpSendRequest
向网站发送获取请求时,请注意,这已在多个网站上尝试过(google
、Whosebug
、youtube
, 等), 出现错误, 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);
据我所知,查看 ReactOS、InternetConnectW
上发布的源代码,使用 http 服务,使用 HTTP_Connect
,就像 InternetOpenUrl
,唯一的区别是,在 OpenUrl 中,它将 dwInternalFlags
参数设置为 INET_OPENURL
,而在 Connect 中,它将其设置为 0,但在那之后,一切都是完全相同的,OpenUrl 也使用 HttpOpenRequestW
& HttpSendRequestW
,那么问题是什么,为什么执行 Connect => OpenRequest(GET) => SendRequest
会导致错误代码 12152,但执行 OpenUrl 却成功完成?
您正在尝试通过 443 端口建立安全部分,但您在 HttpOpenRequest
调用中缺少 INTERNET_FLAG_SECURE
标志。
变化:
HttpOpenRequestW(hHttp, L"GET", L"/", NULL, NULL, accept, 0, 0);
至:
HttpOpenRequestW(hHttp, L"GET", L"/", NULL, NULL, accept, INTERNET_FLAG_SECURE, 0);
尝试使用 HttpSendRequest
向网站发送获取请求时,请注意,这已在多个网站上尝试过(google
、Whosebug
、youtube
, 等), 出现错误, 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);
据我所知,查看 ReactOS、InternetConnectW
上发布的源代码,使用 http 服务,使用 HTTP_Connect
,就像 InternetOpenUrl
,唯一的区别是,在 OpenUrl 中,它将 dwInternalFlags
参数设置为 INET_OPENURL
,而在 Connect 中,它将其设置为 0,但在那之后,一切都是完全相同的,OpenUrl 也使用 HttpOpenRequestW
& HttpSendRequestW
,那么问题是什么,为什么执行 Connect => OpenRequest(GET) => SendRequest
会导致错误代码 12152,但执行 OpenUrl 却成功完成?
您正在尝试通过 443 端口建立安全部分,但您在 HttpOpenRequest
调用中缺少 INTERNET_FLAG_SECURE
标志。
变化:
HttpOpenRequestW(hHttp, L"GET", L"/", NULL, NULL, accept, 0, 0);
至:
HttpOpenRequestW(hHttp, L"GET", L"/", NULL, NULL, accept, INTERNET_FLAG_SECURE, 0);