如何以编程方式配置WinHTTP跟踪?

时间:2014-08-28 21:23:28

标签: c winapi winhttp

我有一个C应用程序(不是C ++或C#),它使用WinHTTP从客户端的角度测试与API的连接。这是下载文件的代码。

 DWORD Measure(FILE* fout, LPCTSTR lpszUrl) {
      int i;
      DWORD dwResult = 0;
      DWORD dwSize = 0;
      DWORD dwDownloaded = 0;
      DWORD dwRequestSize = 0;
      LPSTR pszOutBuffer;
      BOOL  bResults = FALSE;
      HINTERNET  hSession = NULL;
      HINTERNET  hConnect = NULL;
      HINTERNET  hRequest = NULL;
      WINHTTP_STATUS_CALLBACK status = NULL;

      if (0 == dwResult) {
            hSession = WinHttpOpen(_T("Test/1.0"), WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);
            if (hSession == NULL) {
                 dwResult = GetLastError();
            }
      }

      if (0 == dwResult) {
            status = WinHttpSetStatusCallback(hSession, (WINHTTP_STATUS_CALLBACK)HttpCallback, WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS, NULL);
            if (WINHTTP_INVALID_STATUS_CALLBACK == status) {
                 dwResult = GetLastError();
            }
      }

      if (0 == dwResult) {
            hConnect = WinHttpConnect(hSession, lpszUrl, INTERNET_DEFAULT_HTTPS_PORT, 0);
            if (hConnect == NULL) {
                 dwResult = GetLastError();
            }
      }

      if (0 == dwResult) {
            hRequest = WinHttpOpenRequest(hConnect, L"GET",  NULL, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_SECURE | WINHTTP_FLAG_REFRESH);
            if (hRequest == NULL) {
                 dwResult = GetLastError();
            }
      }

      if (0 == dwResult) {
            bResults = WinHttpSendRequest(hRequest,WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0);
      }

      if (0 == dwResult) {
            if(!QueryPerformanceCounter(&liDownloadStart)){
                 dwResult = GetLastError();
            }
      }

      if (bResults) {
            bResults = WinHttpReceiveResponse(hRequest, NULL);
            if (!bResults) {
                 dwResult = GetLastError();
            }
      }

      if (dwResult == 0 && bResults) {
            do {
                 dwSize = 0;
                 if( !WinHttpQueryDataAvailable( hRequest, &dwSize ) ){
                      dwResult = GetLastError();
                 }

                 if (0 == dwResult) {
                      dwRequestSize += dwSize;
                 }

                 pszOutBuffer = (LPSTR)malloc(dwSize+1);
                 if (!pszOutBuffer) {
                      dwResult = ERROR_OUTOFMEMORY;
                 }

                 if (dwResult == 0) {
                      ZeroMemory(pszOutBuffer, dwSize + 1);
                      if( !WinHttpReadData( hRequest, (LPVOID)pszOutBuffer, dwSize, &dwDownloaded ) ){
                            dwResult = GetLastError();
                      }
                      free(pszOutBuffer);
                 }

            } while (dwSize > 0 && dwResult == 0);
      }

      if (hRequest) WinHttpCloseHandle(hRequest);
      if (hConnect) WinHttpCloseHandle(hConnect);
      if (hSession) WinHttpCloseHandle(hSession);

      return dwResult;
} 

我可以使用以下模块启用跟踪:

BOOL enable = TRUE;
WinHttpSetOption(NULL, WINHTTP_OPTION_ENABLETRACING, &enable, sizeof(enable));

按照文章Capturing WinHTTP Logs中的说明,我可以要求用户启用跟踪,包括应存储文件的路径。

netsh winhttp set tracing trace-file-prefix="C:\Temp\dpws" level=verbose format=ansi state=enabled max-trace-file-size=1073741824

然而,大多数运行我的应用程序的人都受到技术挑战。他们可能会在完成后忘记禁用它。

如何以编程方式为我的进程启用WinHTTP跟踪?

0 个答案:

没有答案
相关问题