=?UTF-8?Q?Michael=20M=C3=BCller=20?=: wininet: Set Host header in HttpSendRequestW instead of HttpOpenRequestW.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Aug 25 09:38:02 CDT 2015


Module: wine
Branch: master
Commit: 7bed453481ef76068c6103d2d2b533f26c1c43a7
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7bed453481ef76068c6103d2d2b533f26c1c43a7

Author: Michael Müller <michael at fds-team.de>
Date:   Tue Aug 25 07:26:43 2015 +0200

wininet: Set Host header in HttpSendRequestW instead of HttpOpenRequestW.

---

 dlls/wininet/http.c       | 25 ++++++++++++-------------
 dlls/wininet/tests/http.c |  8 ++++----
 2 files changed, 16 insertions(+), 17 deletions(-)

diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index 5dd1b3b..edea9f8 100644
--- a/dlls/wininet/http.c
+++ b/dlls/wininet/http.c
@@ -376,6 +376,7 @@ static WCHAR *get_host_header( http_request_t *req )
 
     EnterCriticalSection( &req->headers_section );
     if ((header = HTTP_GetHeader( req, hostW ))) ret = heap_strdupW( header->lpszValue );
+    else ret = heap_strdupW( req->server->canon_host_port );
     LeaveCriticalSection( &req->headers_section );
     return ret;
 }
@@ -1886,20 +1887,21 @@ static BOOL HTTP_GetRequestURL(http_request_t *req, LPWSTR buf)
     static const WCHAR https[] = { 'h','t','t','p','s',':','/','/',0 };
     static const WCHAR slash[] = { '/',0 };
     LPHTTPHEADERW host_header;
+    const WCHAR *host;
     LPCWSTR scheme;
 
-    host_header = HTTP_GetHeader(req, hostW);
-    if(!host_header)
-        return FALSE;
-
     EnterCriticalSection( &req->headers_section );
 
+    host_header = HTTP_GetHeader(req, hostW);
+    if (host_header) host = host_header->lpszValue;
+    else host = req->server->canon_host_port;
+
     if (req->hdr.dwFlags & INTERNET_FLAG_SECURE)
         scheme = https;
     else
         scheme = http;
     strcpyW(buf, scheme);
-    strcatW(buf, host_header->lpszValue);
+    strcatW(buf, host);
     if (req->path[0] != '/')
         strcatW(buf, slash);
     strcatW(buf, req->path);
@@ -2140,16 +2142,12 @@ static DWORD HTTPREQ_QueryOption(object_header_t *hdr, DWORD option, void *buffe
     case INTERNET_OPTION_URL: {
         static const WCHAR httpW[] = {'h','t','t','p',':','/','/',0};
         WCHAR url[INTERNET_MAX_URL_LENGTH];
-        HTTPHEADERW *host;
 
         TRACE("INTERNET_OPTION_URL\n");
 
-        EnterCriticalSection( &req->headers_section );
-        host = HTTP_GetHeader(req, hostW);
         strcpyW(url, httpW);
-        strcatW(url, host->lpszValue);
+        strcatW(url, req->server->canon_host_port);
         strcatW(url, req->path);
-        LeaveCriticalSection( &req->headers_section );
 
         TRACE("INTERNET_OPTION_URL: %s\n",debugstr_w(url));
         return str_to_buffer(url, buffer, size, unicode);
@@ -3417,8 +3415,6 @@ static DWORD HTTP_HttpOpenRequestW(http_session_t *session,
     request->verb = heap_strdupW(lpszVerb && *lpszVerb ? lpszVerb : szGET);
     request->version = heap_strdupW(lpszVersion && *lpszVersion ? lpszVersion : g_szHttp1_1);
 
-    HTTP_ProcessHeader(request, hostW, request->server->canon_host_port, HTTP_ADDREQ_FLAG_ADD | HTTP_ADDHDR_FLAG_REQ);
-
     if (hIC->proxy && hIC->proxy[0] && !HTTP_ShouldBypassProxy(hIC, session->hostName))
         HTTP_DealWithProxy( hIC, session, request );
 
@@ -4911,6 +4907,9 @@ static DWORD HTTP_HttpSendRequestW(http_request_t *request, LPCWSTR lpszHeaders,
     if (!request->verb)
         request->verb = heap_strdupW(szGET);
 
+    HTTP_ProcessHeader(request, hostW, request->server->canon_host_port,
+                       HTTP_ADDREQ_FLAG_ADD_IF_NEW | HTTP_ADDHDR_FLAG_REQ);
+
     if (dwContentLength || strcmpW(request->verb, szGET))
     {
         sprintfW(contentLengthStr, szContentLength, dwContentLength);
@@ -5121,7 +5120,7 @@ static DWORD HTTP_HttpSendRequestW(http_request_t *request, LPCWSTR lpszHeaders,
                 dwBufferSize=2048;
                 if (request->status_code == HTTP_STATUS_DENIED)
                 {
-                    WCHAR *host = get_host_header( request );
+                    WCHAR *host = heap_strdupW( request->server->canon_host_port );
                     DWORD dwIndex = 0;
                     while (HTTP_HttpQueryInfoW(request,HTTP_QUERY_WWW_AUTHENTICATE,szAuthValue,&dwBufferSize,&dwIndex) == ERROR_SUCCESS)
                     {
diff --git a/dlls/wininet/tests/http.c b/dlls/wininet/tests/http.c
index 6b018de..14998f2 100644
--- a/dlls/wininet/tests/http.c
+++ b/dlls/wininet/tests/http.c
@@ -2979,8 +2979,8 @@ static void test_header_override(int port)
     memset(buffer, 0, sizeof(buffer));
     ret = HttpQueryInfoA(req, HTTP_QUERY_HOST | HTTP_QUERY_FLAG_REQUEST_HEADERS, buffer, &size, &count);
     err = GetLastError();
-    todo_wine ok(!ret, "HttpQueryInfo succeeded\n");
-    todo_wine ok(err == ERROR_HTTP_HEADER_NOT_FOUND, "Expected error ERROR_HTTP_HEADER_NOT_FOUND, got %d\n", err);
+    ok(!ret, "HttpQueryInfo succeeded\n");
+    ok(err == ERROR_HTTP_HEADER_NOT_FOUND, "Expected error ERROR_HTTP_HEADER_NOT_FOUND, got %d\n", err);
 
     size = sizeof(buffer) - 1;
     memset(buffer, 0, sizeof(buffer));
@@ -3001,12 +3001,12 @@ static void test_header_override(int port)
     memset(buffer, 0, sizeof(buffer));
     ret = InternetQueryOptionA(req, INTERNET_OPTION_URL, buffer, &size);
     ok(ret, "InternetQueryOption failed\n");
-    todo_wine ok(!strcmp(full_url, buffer), "Expected %s, got %s\n", full_url, buffer);
+    ok(!strcmp(full_url, buffer), "Expected %s, got %s\n", full_url, buffer);
 
     ret = HttpSendRequestA(req, NULL, 0, NULL, 0);
     ok(ret, "HttpSendRequest failed\n");
 
-    test_status_code_todo(req, 200);
+    test_status_code(req, 200);
 
     InternetCloseHandle(req);
     req = HttpOpenRequestA(con, NULL, "/test_host_override", NULL, NULL, NULL, INTERNET_FLAG_KEEP_CONNECTION, 0);




More information about the wine-cvs mailing list