2016-07-30 5 views
0

У меня есть код, который отправляет запрос на сервер, но я пытаюсь установить Cookie из ответа. (На всякий случай, я делаю запрос на BurningBoard Входа)Установить Cookie из ответа в WinHttp

Здесь есть мой код:

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

И:

#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; 

} 

Наконец, это то, что я получаю, как ответ в 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 

Может кто-нибудь помочь мне добавить куки, пожалуйста? Благодаря

ОБНОВЛЕНО

Теперь я havig неприятности, чтобы получить данные из заголовка, я получаю только первый «H».

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; 

} 

ответ

1

Файлы cookie должны работать автоматически, если вы сделаете все ваши запросы в течение одной сессии. Вызовите WinHttpOpen один раз, используйте этот дескриптор сеанса во всех запросах. Это сеанс, который поддерживает куклу cookie.

Смотрите также: Cookie Handling in WinHTTP

+0

Да, но я хочу, чтобы сделать запрос, а затем извлечь печенье из него, чтобы установить его в другом запросе, потому что мне нужно сделать несколько действий с этими печеньем – Jose

+0

Ну, 'Cookie:' и 'Set-Cookie:' являются HTTP-заголовками, как и любые другие. Если вам не нравится кук-файл cookie, поддерживаемый WinHTTP, вы всегда можете сохранить свой собственный, прочитав и обработав 'Set-Cookie:' заголовки ответов ('WinHttpQueryHeaders') и добавив соответствующие заголовки' Cookie: 'к вашему запросы ('WinHttpAddRequestHeaders') –

+0

Да, проблема в том, что ответ, который мой код дает, начинается с и не отображает заголовок. – Jose

 Смежные вопросы

  • Нет связанных вопросов^_^