2016-07-30 13 views
0

Ich habe einen Code, der eine Post-Anfrage an einen Server, aber ich versuche, ein Cookie aus der Antwort setzen. (Nur für den Fall, ich bin eine Anfrage an eine BurningBoard Anmeldung tun)Set Cookie von Antwort in WinHttp

Hier haben Sie meinen Code:

HttpsWebRequestPost("example.com", "/api.php?action=UserLogin", "loginUsername=" + USERNAME + "&loginPassword=" + PASSWORD + "&url=/index.php?page=Portal"); 

Und:

#pragma once 

#include <Windows.h> 
#include <WinHttp.h> 
#include <stdio.h> 
#include <iostream> //getchar 
#include <fstream> 

#pragma comment(lib, "winhttp.lib") 

using namespace std; 

std::wstring get_utf16(const std::string &str, int codepage) 
{ 
    if (str.empty()) return std::wstring(); 
    int sz = MultiByteToWideChar(codepage, 0, &str[0], (int)str.size(), 0, 0); 
    std::wstring res(sz, 0); 
    MultiByteToWideChar(codepage, 0, &str[0], (int)str.size(), &res[0], sz); 
    return res; 
} 

string HttpsWebRequestPost(string domain, string url, string dat) 
{ 
    //Extra 
    LPSTR data = const_cast<char *>(dat.c_str());; 
    DWORD data_len = strlen(data); 


    wstring sdomain = get_utf16(domain, CP_UTF8); 
    wstring surl = get_utf16(url, CP_UTF8); 
    string response; 

    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(L"WinHTTP Example/1.0", 
     WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, 
     WINHTTP_NO_PROXY_NAME, 
     WINHTTP_NO_PROXY_BYPASS, 0); 

    // Specify an HTTP server. 
    if (hSession) 
     hConnect = WinHttpConnect(hSession, sdomain.c_str(), 
      INTERNET_DEFAULT_HTTP_PORT, 0); 

    // Create an HTTP request handle. 
    if (hConnect) 
     hRequest = WinHttpOpenRequest(hConnect, L"POST", surl.c_str(), 
      NULL, WINHTTP_NO_REFERER, 
      WINHTTP_DEFAULT_ACCEPT_TYPES, 
      0); 

    LPCWSTR additionalHeaders = L"Content-Type: application/x-www-form-urlencoded\r\n"; 
    DWORD headersLength = -1; 

    // Send a request. 
    if (hRequest) 
     bResults = WinHttpSendRequest(hRequest, 
      additionalHeaders, headersLength, 
      (LPVOID)data, data_len, 
      data_len, 0); 


    // End the request. 
    if (bResults) 
     bResults = WinHttpReceiveResponse(hRequest, NULL); 

    // Keep checking for data until there is nothing left. 
    if (bResults) 
    { 
     do 
     { 
      // Check for available data. 
      dwSize = 0; 
      if (!WinHttpQueryDataAvailable(hRequest, &dwSize)) 
       printf("Error %u in WinHttpQueryDataAvailable.\n", 
        GetLastError()); 

      // Allocate space for the buffer. 
      pszOutBuffer = new char[dwSize + 1]; 
      if (!pszOutBuffer) 
      { 
       printf("Out of memory\n"); 
       dwSize = 0; 
      } 
      else 
      { 
       // Read the data. 
       ZeroMemory(pszOutBuffer, dwSize + 1); 

       if (!WinHttpReadData(hRequest, (LPVOID)pszOutBuffer, 
        dwSize, &dwDownloaded)) 
        printf("Error %u in WinHttpReadData.\n", GetLastError()); 
       else 
        //printf("%s", pszOutBuffer); 
        response = response + string(pszOutBuffer); 
       // Free the memory allocated to the buffer. 
       delete[] pszOutBuffer; 
      } 
     } while (dwSize > 0); 
    } 

    // Report any errors. 
    if (!bResults) 
     printf("Error %d has occurred.\n", GetLastError()); 

    // Close any open handles. 
    if (hRequest) WinHttpCloseHandle(hRequest); 
    if (hConnect) WinHttpCloseHandle(hConnect); 
    if (hSession) WinHttpCloseHandle(hSession); 

    return response; 

} 

schließlich das ist, was ich als Antwort in WireShark:

Hypertext Transfer Protocol 
    HTTP/1.1 200 OK\r\n 
    Request Version: HTTP/1.1 
    Status Code: 200 
    Response Phrase: OK 
    Date: Sat, 30 Jul 2016 11:55:02 GMT\r\n 
    Server: Apache\r\n 
    Set-Cookie: wcf_cookieHash=*******hash******; HttpOnly\r\n 
    Set-Cookie: wcf_boardLastActivityTime=1469879702; expires=Sun, 30-Jul-2017 11:55:02 GMT; HttpOnly\r\n 
    Cache-Control: max-age=0, private\r\n 
    Expires: Sat, 30 Jul 2016 11:55:02 GMT\r\n 
    Vary: Accept-Encoding\r\n 
    Connection: close\r\n 
    Transfer-Encoding: chunked\r\n 
    Content-Type: text/html; charset=UTF-8\r\n 
    \r\n 

Kann jemand mir helfen, Plätzchen bitte hinzuzufügen? Dank

AKTUALISIERT

Jetzt bin ich havig Probleme Daten aus dem Header zu bekommen, ich nur die ersten „H“ erhalten.

string HttpsWebRequestPost(string domain, string url, string dat) 
{ 
    //Extra 
    LPSTR data = const_cast<char *>(dat.c_str());; 
    DWORD data_len = strlen(data); 


    wstring sdomain = get_utf16(domain, CP_UTF8); 
    wstring surl = get_utf16(url, CP_UTF8); 
    string response; 

    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(L"WinHTTP Example/1.0", 
     WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, 
     WINHTTP_NO_PROXY_NAME, 
     WINHTTP_NO_PROXY_BYPASS, 0); 

    // Specify an HTTP server. 
    if (hSession) 
     hConnect = WinHttpConnect(hSession, sdomain.c_str(), 
      INTERNET_DEFAULT_HTTP_PORT, 0); 

    // Create an HTTP request handle. 
    if (hConnect) 
     hRequest = WinHttpOpenRequest(hConnect, L"POST", surl.c_str(), 
      NULL, WINHTTP_NO_REFERER, 
      WINHTTP_DEFAULT_ACCEPT_TYPES, 
      0); 

    LPCWSTR additionalHeaders = L"Content-Type: application/x-www-form-urlencoded\r\n"; 
    DWORD headersLength = -1; 

    // Send a request. 
    if (hRequest) 
     bResults = WinHttpSendRequest(hRequest, 
      additionalHeaders, headersLength, 
      (LPVOID)data, data_len, 
      data_len, 0); 

    // End the request. 
    if (bResults) 
     bResults = WinHttpReceiveResponse(hRequest, NULL); 


    // First, use WinHttpQueryHeaders to obtain the size of the buffer. 
    if (bResults) 
    { 
     do 
     { 
     dwSize = 0; 
     if (!WinHttpQueryDataAvailable(hRequest, &dwSize)) 
      printf("Error %u in WinHttpQueryDataAvailable.\n", 
       GetLastError()); 

     WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_RAW_HEADERS_CRLF, 
      WINHTTP_HEADER_NAME_BY_INDEX, NULL, 
      &dwSize, WINHTTP_NO_HEADER_INDEX); 

      // Allocate space for the buffer. 
      pszOutBuffer = new char[dwSize + 1]; 
      if (!pszOutBuffer) 
      { 
       printf("Out of memory\n"); 
       dwSize = 0; 
      } 
      else 
      { 
       // Read the data. 
       ZeroMemory(pszOutBuffer, dwSize + 1); 

       bResults = WinHttpQueryHeaders(hRequest, 
        WINHTTP_QUERY_RAW_HEADERS_CRLF, 
        WINHTTP_HEADER_NAME_BY_INDEX, 
        (LPVOID)pszOutBuffer, &dwSize, 
        WINHTTP_NO_HEADER_INDEX); 
       //printf("%s", pszOutBuffer); 
       response = response + string(pszOutBuffer); 
       // Free the memory allocated to the buffer. 
       delete[] pszOutBuffer; 
      } 
     } while (dwSize > 0); 
    } 


    // Free the allocated memory. 
    //delete[] pszOutBuffer; 

    // Report any errors. 
    if (!bResults) 
     printf("Error %d has occurred.\n", GetLastError()); 

    // Close any open handles. 
    if (hRequest) WinHttpCloseHandle(hRequest); 
    if (hConnect) WinHttpCloseHandle(hConnect); 
    if (hSession) WinHttpCloseHandle(hSession); 

    return response; 

} 

Antwort

1

Cookies sollten automatisch funktionieren, wenn Sie alle Ihre Anfragen innerhalb derselben Sitzung stellen. Rufen Sie WinHttpOpen einmal auf, verwenden Sie das Session-Handle in allen Anfragen. Es ist die Sitzung, die das Cookie-Glas verwaltet.

Siehe auch: Cookie Handling in WinHTTP

+0

Ja, aber ich mag einen Antrag machen und dann das Cookie extrahiert daraus in einem anderen Antrag zu setzen, weil ich mehrere Aktionen mit diesen Cookies – Jose

+0

Nun machen müssen, 'Cookie:' und 'Set-Cookie:' sind HTTP-Header wie jeder andere. Wenn Sie die von WinHTTP verwaltete Cookie-Jar nicht mögen, können Sie immer Ihre eigenen verwalten, indem Sie 'Set-Cookie:' Header aus den Antworten ('WinHttpQueryHeaders') lesen und verarbeiten und passende' Cookie: 'Header zu Ihrem hinzufügen Anfragen ('WinHttpAddRequestHeaders') –

+0

Ja, das Problem ist, dass die Antwort, die mein Code gibt, in startet und die Kopfzeile nicht anzeigt. – Jose