wine-staging/patches/wininet-Cleanup/0007-wininet-Delay-setting-the-http-host-header.patch

139 lines
5.3 KiB
Diff

From 086a65eab198ca7d2ab4215660369b0e05dbfbbf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Sat, 16 May 2015 01:39:33 +0200
Subject: wininet: Delay setting the http host header.
This change temporarly breaks two other tests which were only
working by pure accident before.
---
dlls/wininet/http.c | 28 ++++++++++++++++++----------
dlls/wininet/tests/http.c | 10 +++++-----
2 files changed, 23 insertions(+), 15 deletions(-)
diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index 3539dc8..356ebb6 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;
}
@@ -1878,20 +1879,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);
@@ -2132,14 +2134,19 @@ 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;
+ HTTPHEADERW *host_header;
+ const WCHAR *host;
TRACE("INTERNET_OPTION_URL\n");
EnterCriticalSection( &req->headers_section );
- host = HTTP_GetHeader(req, hostW);
+
+ host_header = HTTP_GetHeader(req, hostW);
+ if (host_header) host = host_header->lpszValue;
+ else host = req->server->canon_host_port;
+
strcpyW(url, httpW);
- strcatW(url, host->lpszValue);
+ strcatW(url, host);
strcatW(url, req->path);
LeaveCriticalSection( &req->headers_section );
@@ -3406,8 +3413,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 );
@@ -4899,6 +4904,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);
diff --git a/dlls/wininet/tests/http.c b/dlls/wininet/tests/http.c
index 165a76e..2ac075f 100644
--- a/dlls/wininet/tests/http.c
+++ b/dlls/wininet/tests/http.c
@@ -3038,8 +3038,8 @@ static void test_header_override(int port)
count = 0;
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);
memset(buffer, 0, sizeof(buffer));
size = sizeof(buffer)-1;
@@ -3065,7 +3065,7 @@ static void test_header_override(int port)
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);
@@ -3215,7 +3215,7 @@ static void test_header_override(int port)
ret = HttpSendRequestA( req, NULL, 0, NULL, 0 );
ok( ret, "HttpSendRequestA failed %u\n", GetLastError() );
- test_status_code(req, 200);
+ test_status_code_todo(req, 200);
InternetCloseHandle(req);
InternetCloseHandle(con);
@@ -3254,7 +3254,7 @@ static void test_header_override(int port)
ret = HttpSendRequestA(req, NULL, 0, NULL, 0);
ok(ret, "HttpSendRequestA failed %u\n", GetLastError());
- test_status_code(req, 200);
+ test_status_code_todo(req, 200);
InternetCloseHandle(req);
InternetCloseHandle(con);
--
2.4.0