标签: winhttp

澄清WINHTTP_STATUS_CALLBACK函数的用法,用于SSL状态代码


我在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)

winhttp

3
推荐指数
1
解决办法
4707
查看次数

winHTTP GET请求C++

我会说得对.

有没有我可以获得winHTTP请求与常规格式相同的格式?如果它有任何区别,我正在使用VC++ 2008

c++ get winhttp winhttprequest

2
推荐指数
1
解决办法
8018
查看次数

WinHTTP错误无效的URL

如何指定带路径的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)

c++ winhttp

2
推荐指数
1
解决办法
2508
查看次数

对于非管理员用户,localhost上的HttpAddUrl失败

使用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?

我还能做些什么来让服务器为非管理员运行吗?

c++ http localhost winhttp

2
推荐指数
2
解决办法
2704
查看次数

如何使用IWinHttpRequest忽略无效证书?

我正在使用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我不在乎,我想要它检索我要求的页面?

winapi winhttp

2
推荐指数
1
解决办法
9366
查看次数

不理解为什么WinHTTP不验证某些HTTPS资源

我非常感谢任何可以帮助我解决问题的帮助.

从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和各种资源寻求,但仍然没有解决方案.

提前感谢您的建议!

authentication https vba winhttp

2
推荐指数
1
解决办法
2万
查看次数

使用WinHTTP下载HTTP文件的进度指示

我想在使用WinHTTP下载文件时在我的C++ Windows应用程序中实现进度条.知道怎么做吗?看起来好像WinHttpSetStatusCallback是我想要使用的,但是我没有看到要查找的通知...或者如何获得"下载百分比"...

救命!

谢谢!

c++ winhttp winhttprequest

1
推荐指数
1
解决办法
2361
查看次数

WinInet 或 WinHTTP 支持自定义端口吗?如果是这样,我该如何实施?

我正在尝试使用 HTTP 和 HTTPS(在不同的场景中)从默认分别使用端口 5080 和 5443 的服务下载文件。我想使用 WinInet(或 WinHTTP),因为它们是 Windows 原生的,但似乎 WinInet 和 WinHTTP 都只支持使用端口 80 或端口 443,并且不支持指定其他任何内容。

是否可以指定不同的端口,而我忽略了一些东西?如果没有,下一个最佳的本机选项是使用 WinSock 吗?

编辑:如下回答,第三个参数的类型为 INTERNET_PORT,但将接受任何 DWORD。微软的文档令人困惑,正如此处所写的,InternetConnect,它说“nServerPort 可以是以下值之一。”,这使人们相信只有提供的常量是有效的。

相反,您可以提供任何端口值(DWORD 类型)。

我在 InternetConnect 文档页面上提交了反馈,因此希望未来的读者能够更清楚地了解这一点。

c++ winapi wininet winhttp

1
推荐指数
1
解决办法
376
查看次数

标签 统计

winhttp ×8

c++ ×5

winapi ×2

winhttprequest ×2

authentication ×1

get ×1

http ×1

https ×1

localhost ×1

vba ×1

wininet ×1