Unless explicitly turned off decoding of gzip, deflate is supported.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47505
Signed-off-by: Alistair Leslie-Hughes leslie_alistair@hotmail.com --- dlls/wininet/internet.c | 1 + dlls/wininet/internet.h | 2 +- dlls/wininet/tests/http.c | 62 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 1 deletion(-)
diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c index cef151c7bf2..4ac66660aa3 100644 --- a/dlls/wininet/internet.c +++ b/dlls/wininet/internet.c @@ -107,6 +107,7 @@ void *alloc_object(object_header_t *parent, const object_vtbl_t *vtbl, size_t si if(!ret) return NULL;
+ ret->decoding = -1; list_init(&ret->children);
EnterCriticalSection( &WININET_cs ); diff --git a/dlls/wininet/internet.h b/dlls/wininet/internet.h index e9d68e2c2d9..462c7a47635 100644 --- a/dlls/wininet/internet.h +++ b/dlls/wininet/internet.h @@ -283,7 +283,7 @@ struct _object_header_t ULONG ErrorMask; DWORD dwInternalFlags; LONG refs; - BOOL decoding; + INT decoding; INTERNET_STATUS_CALLBACK lpfnStatusCB; struct list entry; struct list children; diff --git a/dlls/wininet/tests/http.c b/dlls/wininet/tests/http.c index d32f01be2c5..ed35025d5f4 100644 --- a/dlls/wininet/tests/http.c +++ b/dlls/wininet/tests/http.c @@ -3523,6 +3523,67 @@ static void test_not_modified(int port) InternetCloseHandle(ses); }
+static void test_deflate(int port) +{ + DWORD len; + char buf[256]; + HINTERNET ses, con, req; + BOOL ret; + BOOL b; + char binary[] = "\x1f\x8b\x08"; + char text[] = "<!DOCTYPE HTML PUBLIC"; + + ses = InternetOpenA("winetest", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); + ok(ses != NULL, "InternetOpen failed\n"); + + con = InternetConnectA(ses, "test.winehq.org", port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); + ok(con != NULL, "InternetConnect failed\n"); + + /* Default Decoding */ + req = HttpOpenRequestA(con, NULL, "/tests/gzip.php", NULL, NULL, NULL, 0, 0); + ok(req != NULL, "HttpOpenRequest failed\n"); + + SetLastError(0xdeadbeef); + ret = HttpSendRequestW(req, L"Accept-Encoding: gzip, deflate", ~0u, NULL, 0); + ok(ret, "HttpSendRequest failed: %u\n", GetLastError()); + test_status_code(req, 200); + + len = sizeof(buf)-1; + ret = HttpQueryInfoA(req, HTTP_QUERY_CONTENT_LENGTH, buf, &len, 0); + ok(!ret, "HttpQueryInfo should have failed\n"); + ok(GetLastError() == ERROR_HTTP_HEADER_NOT_FOUND , "got %u\n", GetLastError()); + + ret = InternetReadFile(req, buf, 256, &len); + ok(ret, "InternetReadFile failed %d\n", GetLastError()); + ok(!strncmp(buf, text, strlen(text)), "got %s\n", debugstr_a(buf)); + + InternetCloseHandle(req); + InternetCloseHandle(con); + + /* Disabled Decoding */ + b = FALSE; + InternetSetOptionA(ses, INTERNET_OPTION_HTTP_DECODING, &b, sizeof(b)); + + con = InternetConnectA(ses, "test.winehq.org", port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); + ok(con != NULL, "InternetConnect failed\n"); + + req = HttpOpenRequestA(con, NULL, "/tests/gzip.php", NULL, NULL, NULL, 0, 0); + ok(req != NULL, "HttpOpenRequest failed\n"); + + SetLastError(0xdeadbeef); + ret = HttpSendRequestW(req, L"Accept-Encoding: gzip, deflate", ~0u, NULL, 0); + ok(ret, "HttpSendRequest failed: %u\n", GetLastError()); + test_status_code(req, 200); + + ret = InternetReadFile(req, buf, 256, &len); + ok(ret, "InternetReadFile failed %d\n", GetLastError()); + ok(!strncmp(buf, binary, strlen(binary)), "got %s\n", debugstr_a(buf)); + + InternetCloseHandle(req); + InternetCloseHandle(con); + InternetCloseHandle(ses); +} + static void test_conn_close(int port) { HINTERNET session, connection, req; @@ -6097,6 +6158,7 @@ static void test_http_connection(void) test_options(si.port); test_no_content(si.port); test_not_modified(si.port); + test_deflate(si.port); test_conn_close(si.port); test_no_cache(si.port); test_cache_read_gzipped(si.port);