Module: wine Branch: master Commit: 4e53f0caa08b24bf7747c37f8c09d3e0bf40bd10 URL: http://source.winehq.org/git/wine.git/?a=commit;h=4e53f0caa08b24bf7747c37f8c...
Author: Jacek Caban jacek@codeweavers.com Date: Wed Jun 25 14:41:47 2014 +0200
wininet: Don't try to read content in response to HEAD request.
---
dlls/wininet/http.c | 3 ++- dlls/wininet/tests/http.c | 56 +++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 56 insertions(+), 3 deletions(-)
diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c index 6c60c3a..b5e6a73 100644 --- a/dlls/wininet/http.c +++ b/dlls/wininet/http.c @@ -2881,10 +2881,11 @@ static const data_stream_vtbl_t chunked_stream_vtbl = { static DWORD set_content_length(http_request_t *request) { static const WCHAR szChunked[] = {'c','h','u','n','k','e','d',0}; + static const WCHAR headW[] = {'H','E','A','D',0}; WCHAR encoding[20]; DWORD size;
- if(request->status_code == HTTP_STATUS_NO_CONTENT) { + if(request->status_code == HTTP_STATUS_NO_CONTENT || !strcmpW(request->verb, headW)) { request->contentLength = request->netconn_stream.content_length = 0; return ERROR_SUCCESS; } diff --git a/dlls/wininet/tests/http.c b/dlls/wininet/tests/http.c index 6e30ad4..4e8ea5b 100644 --- a/dlls/wininet/tests/http.c +++ b/dlls/wininet/tests/http.c @@ -1979,7 +1979,7 @@ static const char *send_buffer; static DWORD CALLBACK server_thread(LPVOID param) { struct server_info *si = param; - int r, c, i, on, count = 0; + int r, c = -1, i, on, count = 0; SOCKET s; struct sockaddr_in sa; char buffer[0x100]; @@ -2015,7 +2015,8 @@ static DWORD CALLBACK server_thread(LPVOID param)
do { - c = accept(s, NULL, NULL); + if(c == -1) + c = accept(s, NULL, NULL);
memset(buffer, 0, sizeof buffer); for(i=0; i<(sizeof buffer-1); i++) @@ -2221,6 +2222,16 @@ static DWORD CALLBACK server_thread(LPVOID param) else send(c, notokmsg, sizeof(notokmsg)-1, 0); } + if (strstr(buffer, "HEAD /test_head")) { + static const char head_response[] = + "HTTP/1.1 200 OK\r\n" + "Connection: Keep-Alive\r\n" + "Content-Length: 100\r\n" + "\r\n"; + + send(c, head_response, sizeof(head_response), 0); + continue; + } if (strstr(buffer, "GET /send_from_buffer")) send(c, send_buffer, strlen(send_buffer), 0); if (strstr(buffer, "/test_cache_control_verb")) @@ -2235,6 +2246,7 @@ static DWORD CALLBACK server_thread(LPVOID param)
shutdown(c, 2); closesocket(c); + c = -1; } while (!last_request);
closesocket(s); @@ -3635,6 +3647,45 @@ static void test_response_without_headers(int port) InternetCloseHandle(hi); }
+static void test_head_request(int port) +{ + DWORD len, content_length; + HINTERNET ses, con, req; + BYTE buf[100]; + BOOL ret; + + ses = InternetOpenA("winetest", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); + ok(ses != NULL, "InternetOpen failed\n"); + + con = InternetConnectA(ses, "localhost", port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); + ok(con != NULL, "InternetConnect failed\n"); + + req = HttpOpenRequestA(con, "HEAD", "/test_head", NULL, NULL, NULL, INTERNET_FLAG_KEEP_CONNECTION, 0); + ok(req != NULL, "HttpOpenRequest failed\n"); + + ret = HttpSendRequestA(req, NULL, 0, NULL, 0); + ok(ret, "HttpSendRequest failed: %u\n", GetLastError()); + + len = sizeof(content_length); + content_length = -1; + ret = HttpQueryInfoA(req, HTTP_QUERY_FLAG_NUMBER|HTTP_QUERY_CONTENT_LENGTH, &content_length, &len, 0); + ok(ret, "HttpQueryInfo dailed: %u\n", GetLastError()); + ok(len == sizeof(DWORD), "len = %u\n", len); + ok(content_length == 100, "content_length = %u\n", content_length); + + len = -1; + ret = InternetReadFile(req, buf, sizeof(buf), &len); + ok(ret, "InternetReadFile failed: %u\n", GetLastError()); + + len = -1; + ret = InternetReadFile(req, buf, sizeof(buf), &len); + ok(ret, "InternetReadFile failed: %u\n", GetLastError()); + + InternetCloseHandle(req); + InternetCloseHandle(con); + InternetCloseHandle(ses); +} + static void test_HttpQueryInfo(int port) { HINTERNET hi, hc, hr; @@ -4048,6 +4099,7 @@ static void test_http_connection(void) test_connection_closing(si.port); test_cache_control_verb(si.port); test_successive_HttpSendRequest(si.port); + test_head_request(si.port);
/* send the basic request again to shutdown the server thread */ test_basic_request(si.port, "GET", "/quit");