如何使用 winhttp 库以编程方式捕获重定向https端口号

问题描述

我有一个客户端(使用 winhttp 库用 C++ 编写)并连接到 Http(s) 服务器。服务器从认的 80 端口响应,服务器发送一个带有 307 状态代码的临时重定向消息,告诉客户端使用某个重定向端口。 Winhttp 套接字(在客户端)然后自动使用 443 端口进行通信。(我可以在wireshark 日志中看到通信)我试图在此处导出重定向的端口号(443)并希望使用此 443 端口进一步通信/通信那个服务器。 我的问题是

  1. winhttp(client socket) 如何自动知道使用/通信到重定向的端口 443 端口,因为服务器没有提到使用这个端口(从wireshark 日志中看到)
  2. 如何使用 winhttp api 以编程方式捕获新的重定向端口号:

我试过: 设置重定向回调:
WINHTTP_STATUS_CALLBACK setCallback = WinHttpSetStatusCallback(hRequest,WinhttpRedirectCallback, WINHTTP_CALLBACK_FLAG_REDIRECT, (DWORD_PTR)NULL); 一旦我收到响应 WinHttpReceiveResponse() 和 winhttp 处理重定向并使用 443 端口,回调 WinhttpRedirectCallback() 被调用。在回调中,我尝试使用 WinHttpQueryHeaders() 检索端口(443)信息并使用 WINHTTP_QUERY_HOST 选项查询,这会导致垃圾信息,并且还使用 WINHTTP_OPTION_CONNECTION_INFO 查询不返回端口的 IP 信息和其他数字

void CALLBACK WinhttpRedirectCallback(
    IN HINTERNET hInternet,IN DWORD_PTR dwContext,IN DWORD dwInternetStatus,IN LPVOID lpvstatusinformation,IN DWORD dwStatusinformationLength   [![debugScreenshotowithRuntimeValues][1]][1]
)
{

    if (WINHTTP_CALLBACK_FLAG_REDIRECT == dwInternetStatus)
    {
        DWORD* pStatusInfovalue = lpvstatusinformation;

        wchar_t hostPort[16];
        DWORD hpSize = sizeof(hostPort);
        DWORD hpContentSize = sizeof(hostPort);

        BOOL bRetVal = WinHttpQueryHeaders(hInternet,WINHTTP_QUERY_HOST,WINHTTP_HEADER_NAME_BY_INDEX,&hostPort,&hpContentSize,WINHTTP_NO_HEADER_INDEX);
....
      WINHTTP_CONNECTION_INFO ConnInfo;
      DWORD dwConnInfoSize = sizeof(WINHTTP_CONNECTION_INFO);
      BOOL bRetVal = WinHttpQueryHeaders( hInternet,WINHTTP_OPTION_CONNECTION_INFO,&ConnInfo,&dwConnInfoSize))
      if( bRetVal == TRUE) {
            struct sockaddr_in* sin = (struct sockaddr_in*)(&ConnInfo.LocalAddress);
            unsigned char* ip = (unsigned char*)&sin->sin_addr.s_addr;
            uint16_t m_Port = sin->sin_port;

            struct sockaddr_in* sin2 = (struct sockaddr_in*)(&ConnInfo.RemoteAddress);
            unsigned char* ip2 = (unsigned char*)&sin2->sin_addr.s_addr;
            uint16_t m_Port2 = sin2->sin_port;
       }


  [1]: https://i.stack.imgur.com/tb418.png

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)