我在C中写了一些WinHttp代码.我正在通过SSL发送请求,为了处理SSL错误,我正在注册一个WINHTTP_STATUS_CALLBACK函数,通过调用WinHttpSetStatusCallback并将dwNotificationFlags设置为WINHTTP_CALLBACK_STATUS_SECURE_FAILURE.
WINHTTP_STATUS_CALLBACK的文档说,当使用dwInternetStatus= WINHTTP_CALLBACK_STATUS_SECURE_FAILURE 调用回调时,它表示
从服务器检索安全套接字层(SSL)证书时遇到一个或多个错误.lpvStatusInformation参数包含一个标志.有关更多信息,请参阅lpvStatusInformation的说明.
现在,该lpvStatusInformation参数被输入为LPVOID.但是我从文档中的声明中得出它,在WINHTTP_CALLBACK_STATUS_SECURE_FAILURE的情况下它不被视为指针.
该文件lpvStatusInformation说:
如果dwInternetStatus参数为WINHTTP_CALLBACK_STATUS_SECURE_FAILURE,则此参数可以是以下值之一.
......这些值是这些十六进制值之一:1,2,4,8,10,20,40.(见WinHttp.h)
这对我来说似乎很清楚.我不应该取消引用指针来获取值.所述 lpvStatusInformation保持的十六进制值,而不是一个指针.
我能正确地解释这个吗?
我已经用这种方式编写了代码,并且它在过去也有用.我认为!但是现在我得到的lpvStatusInformation是0x0104f288.这与任何十六进制值都没有任何关系.也不可能通过对可能的值进行OR运算来创建该值(尽管doc在同一个DWORD中没有说明多个状态项).它看起来像是指向我的指针.当我取消引用指针时,我得到0x8,这对应于WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CA,这至少是有道理的.
问题是,我应该取消引用该指针吗?
这是回调代码:
void CALLBACK Iirf_WinHttpSslStatusCallback( HINTERNET hInternet,
DWORD_PTR context,
DWORD code,
void * pInfo,
DWORD infoLength)
{
if (code == WINHTTP_CALLBACK_STATUS_SECURE_FAILURE) {
ConfigInfo * cfg = (ConfigInfo *) context; // app-specific structure
DWORD details = (DWORD) pInfo; // do not de-reference??
CHAR buffer[32];
CHAR * statusDescription = NULL;
switch (details) {
case …Run Code Online (Sandbox Code Playgroud) 我会说得对.
这就是浏览器请求的样子
GET /index.html HTTP/1.1
这就是winHTTP所做的
获取http://site.com/index.html HTTP/1.1
有没有我可以获得winHTTP请求与常规格式相同的格式?如果它有任何区别,我正在使用VC++ 2008
如何指定带路径的URL,例如:http://stackoverflow.com/questions.
以下工作但不是上面在示例中指定的URL.
LPCWSTR useragent = L"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 GTB7.1 ( .NET CLR 3.5.30729)";
DWORD dwSize = 0;
DWORD dwDownloaded = 0;
LPSTR pszOutBuffer;
BOOL bResults = FALSE;
HINTERNET hSession = NULL, hConnect = NULL, hRequest = NULL;
// Use WinHttpOpen to obtain a session handle.
hSession = WinHttpOpen(useragent,
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS, 0 );
// Specify an HTTP server.
if( hSession )
hConnect = WinHttpConnect( hSession, L"www.stackoverflow.com",
INTERNET_DEFAULT_HTTPS_PORT, 0 );
// Create …Run Code Online (Sandbox Code Playgroud) 使用Windows HTTP API我在localhost上运行HTTP文件服务器.
这包括打电话HttpAddUrl(hRequestQueue, L"http://localhost:80/", NULL).
ERROR_ACCESS_DENIED除非用户以管理员身份运行应用程序,否则会失败.对于没有管理员权限的用户,我需要此功能.(无论如何,运行本地主机服务器的用户出了什么问题?这只是为了用户自己.)
我找到了一个针对Vista和XP的修补程序,它似乎旨在解决这个问题,但是对于Windows 7没什么.这篇文章暗示它已经在Vista SP1中修复了,而且我有Windows 7 SP1并且它仍然是一个问题 - 修复程序没有成功到Windows 7?
我还能做些什么来让服务器为非管理员运行吗?
我正在使用Microsoft的WinHttpRequestCOM对象来请求具有无效证书的网页:
IWinHttpRequest http = new WinHttpRequest();
http.Open("GET", url, false);
http.Send(null);
Run Code Online (Sandbox Code Playgroud)
除了调用Send抛出异常外:
0x80072F0D - The certificate authority is invalid or incorrect
Run Code Online (Sandbox Code Playgroud)
我怎么说WinHttpRequest我不在乎,我想要它检索我要求的页面?
我非常感谢任何可以帮助我解决问题的帮助.
从Excel VBA代码我需要从HTTPS站点https://redmine.itransition.com/下载并解析CSV文件.我尝试使用WinHTTP来获取文件.但是,我无法理解为什么身份验证不起作用.这是相关代码:
TargetURL = "https://redmine.itransition.com/projects/pmct/time_entries.csv"
Set HTTPReq = CreateObject("WinHttp.WinHttpRequest.5.1")
HTTPReq.Option(4) = 13056 ' WinHttpRequestOption_SslErrorIgnoreFlags 13056: ignore all err, 0: accept no err
HTTPReq.Open "GET", TargetURL, False
HTTPReq.SetCredentials "UN", "PW", 0
HTTPReq.send
Run Code Online (Sandbox Code Playgroud)
返回以下响应(仅列出某些字符串):
Content-Type: text/html; charset=utf-8
Status: 406
X-Runtime: 5
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用成功的手动身份验证后从Firefox cookie发送"Cookie"字符串
HTTPReq.setRequestHeader "Cookie", SetCookieString
HTTPReq.send
Run Code Online (Sandbox Code Playgroud)
我很容易得到预期的文件.当然,我对这种解决方案不满意,并希望执行真正的WinHTTP身份验证.但是,我无法理解我的代码中出了什么问题或错过了什么.我很可能必须使用.SetClientCertificate方法,但这对我来说还不清楚 - 需要哪个证书?
或者,更一般:我应该使用哪些WinHTTP方法或函数进行调试,以找出哪个步骤阻塞/不正确并阻止我进行正确的身份验证?我花了两周时间通过MSDN和各种资源寻求,但仍然没有解决方案.
提前感谢您的建议!
我想在使用WinHTTP下载文件时在我的C++ Windows应用程序中实现进度条.知道怎么做吗?看起来好像WinHttpSetStatusCallback是我想要使用的,但是我没有看到要查找的通知...或者如何获得"下载百分比"...
救命!
谢谢!
我正在尝试使用 HTTP 和 HTTPS(在不同的场景中)从默认分别使用端口 5080 和 5443 的服务下载文件。我想使用 WinInet(或 WinHTTP),因为它们是 Windows 原生的,但似乎 WinInet 和 WinHTTP 都只支持使用端口 80 或端口 443,并且不支持指定其他任何内容。
是否可以指定不同的端口,而我忽略了一些东西?如果没有,下一个最佳的本机选项是使用 WinSock 吗?
编辑:如下回答,第三个参数的类型为 INTERNET_PORT,但将接受任何 DWORD。微软的文档令人困惑,正如此处所写的,InternetConnect,它说“nServerPort 可以是以下值之一。”,这使人们相信只有提供的常量是有效的。
相反,您可以提供任何端口值(DWORD 类型)。
我在 InternetConnect 文档页面上提交了反馈,因此希望未来的读者能够更清楚地了解这一点。