Mike McCormack : wininet: Add a test for basic authentication.

Alexandre Julliard julliard at wine.codeweavers.com
Tue May 30 13:07:29 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 8af1faec244ed1ad1ffd25673b9e248ef5d96e93
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=8af1faec244ed1ad1ffd25673b9e248ef5d96e93

Author: Mike McCormack <mike at codeweavers.com>
Date:   Tue May 30 22:55:16 2006 +0900

wininet: Add a test for basic authentication.

---

 dlls/wininet/tests/http.c |  227 ++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 192 insertions(+), 35 deletions(-)

diff --git a/dlls/wininet/tests/http.c b/dlls/wininet/tests/http.c
index 2cad8a5..4992202 100644
--- a/dlls/wininet/tests/http.c
+++ b/dlls/wininet/tests/http.c
@@ -808,6 +808,13 @@ static const char okmsg[] =
 "Server: winetest\r\n"
 "\r\n";
 
+static const char proxymsg[] =
+"HTTP/1.1 407 Proxy Authentication Required\r\n"
+"Server: winetest\r\n"
+"Proxy-Connection: close\r\n"
+"Proxy-Authenticate: Basic realm=\"placebo\"\r\n"
+"\r\n";
+
 static const char page1[] =
 "<HTML>\r\n"
 "<HEAD><TITLE>wininet test page</TITLE></HEAD>\r\n"
@@ -822,16 +829,20 @@ struct server_info {
 static DWORD CALLBACK server_thread(LPVOID param)
 {
     struct server_info *si = param;
-    int r, s, c, i;
+    int r, s, c, i, on;
     struct sockaddr_in sa;
     char buffer[0x100];
     WSADATA wsaData;
+    int last_request = 0;
 
     WSAStartup(MAKEWORD(1,1), &wsaData);
 
     s = socket(AF_INET, SOCK_STREAM, 0);
     if (s<0)
-        return FALSE;
+        return 1;
+
+    on = 1;
+    setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char*)&on, sizeof on);
 
     memset(&sa, 0, sizeof sa);
     sa.sin_family = AF_INET;
@@ -842,59 +853,72 @@ static DWORD CALLBACK server_thread(LPVO
     if (r<0)
         return 1;
 
-    listen(s, 1);
+    listen(s, 0);
 
     SetEvent(si->hEvent);
 
-    c = accept(s, NULL, NULL);
-
-    memset(buffer, 0, sizeof buffer);
-    for(i=0; i<(sizeof buffer-1); i++)
+    do
     {
-        r = recv(c, &buffer[i], 1, 0);
-        if (r != 1)
-            break;
-        if (i<4) continue;
-        if (buffer[i-2] == '\n' && buffer[i] == '\n' &&
-            buffer[i-3] == '\r' && buffer[i-1] == '\r')
-            break;
-    }
+        c = accept(s, NULL, NULL);
+
+        memset(buffer, 0, sizeof buffer);
+        for(i=0; i<(sizeof buffer-1); i++)
+        {
+            r = recv(c, &buffer[i], 1, 0);
+            if (r != 1)
+                break;
+            if (i<4) continue;
+            if (buffer[i-2] == '\n' && buffer[i] == '\n' &&
+                buffer[i-3] == '\r' && buffer[i-1] == '\r')
+                break;
+        }
+
+        if (strstr(buffer, "GET /test1"))
+        {
+            send(c, okmsg, sizeof okmsg-1, 0);
+            send(c, page1, sizeof page1-1, 0);
+        }
+
+        if (strstr(buffer, "/test2"))
+        {
+            if (strstr(buffer, "Proxy-Authorization: Basic bWlrZToxMTAx"))
+            {
+                send(c, okmsg, sizeof okmsg-1, 0);
+                send(c, page1, sizeof page1-1, 0);
+            }
+            else
+                send(c, proxymsg, sizeof proxymsg-1, 0);
+        }
+
+        if (strstr(buffer, "/quit"))
+        {
+            send(c, okmsg, sizeof okmsg-1, 0);
+            send(c, page1, sizeof page1-1, 0);
+            last_request = 1;
+        }
 
-    send(c, okmsg, sizeof okmsg-1, 0);
-    send(c, page1, sizeof page1-1, 0);
+        shutdown(c, 2);
+        closesocket(c);
+    } while (!last_request);
 
-    closesocket(c);
     closesocket(s);
 
     return 0;
 }
 
-static void test_http_connection(void)
+static void test_basic_request(int port, char *url)
 {
-    struct server_info si;
     HINTERNET hi, hc, hr;
-    HANDLE hThread;
-    DWORD id = 0, r, count;
+    DWORD r, count;
     char buffer[0x100];
 
-    si.hEvent = CreateEvent(NULL, 0, 0, NULL);
-    si.port = 7531;
-
-    hThread = CreateThread(NULL, 0, server_thread, (LPVOID) &si, 0, &id);
-    ok( hThread != NULL, "create thread failed\n");
-
-    r = WaitForSingleObject(si.hEvent, 3000);
-    ok (r == WAIT_OBJECT_0, "failed to start wininet test server\n");
-    if (r != WAIT_OBJECT_0)
-        return;
-
     hi = InternetOpen(NULL, 0, NULL, NULL, 0);
     ok(hi != NULL, "open failed\n");
 
-    hc = InternetConnect(hi, "localhost", si.port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
+    hc = InternetConnect(hi, "localhost", port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
     ok(hc != NULL, "connect failed\n");
 
-    hr = HttpOpenRequest(hc, NULL, "/test", NULL, NULL, NULL, 0, 0);
+    hr = HttpOpenRequest(hc, NULL, url, NULL, NULL, NULL, 0, 0);
     ok(hr != NULL, "HttpOpenRequest failed\n");
 
     r = HttpSendRequest(hr, NULL, 0, NULL, 0);
@@ -910,6 +934,139 @@ static void test_http_connection(void)
     InternetCloseHandle(hr);
     InternetCloseHandle(hc);
     InternetCloseHandle(hi);
+}
+
+static void test_proxy_indirect(int port)
+{
+    HINTERNET hi, hc, hr;
+    DWORD r, sz, val;
+    char buffer[0x40];
+
+    hi = InternetOpen(NULL, 0, NULL, NULL, 0);
+    ok(hi != NULL, "open failed\n");
+
+    hc = InternetConnect(hi, "localhost", port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
+    ok(hc != NULL, "connect failed\n");
+
+    hr = HttpOpenRequest(hc, NULL, "/test2", NULL, NULL, NULL, 0, 0);
+    ok(hr != NULL, "HttpOpenRequest failed\n");
+
+    r = HttpSendRequest(hr, NULL, 0, NULL, 0);
+    ok(r, "HttpSendRequest failed\n");
+
+    sz = sizeof buffer;
+    r = HttpQueryInfo(hr, HTTP_QUERY_PROXY_AUTHENTICATE, buffer, &sz, NULL);
+    ok(r, "HttpQueryInfo failed\n");
+    ok(!strcmp(buffer, "Basic realm=\"placebo\""), "proxy auth info wrong\n");
+
+    sz = sizeof buffer;
+    r = HttpQueryInfo(hr, HTTP_QUERY_STATUS_CODE, buffer, &sz, NULL);
+    ok(r, "HttpQueryInfo failed\n");
+    ok(!strcmp(buffer, "407"), "proxy code wrong\n");
+
+    sz = sizeof val;
+    r = HttpQueryInfo(hr, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER, &val, &sz, NULL);
+    ok(r, "HttpQueryInfo failed\n");
+    ok(val == 407, "proxy code wrong\n");
+
+    sz = sizeof buffer;
+    r = HttpQueryInfo(hr, HTTP_QUERY_STATUS_TEXT, buffer, &sz, NULL);
+    ok(r, "HttpQueryInfo failed\n");
+    ok(!strcmp(buffer, "Proxy Authentication Required"), "proxy text wrong\n");
+
+    sz = sizeof buffer;
+    r = HttpQueryInfo(hr, HTTP_QUERY_VERSION, buffer, &sz, NULL);
+    ok(r, "HttpQueryInfo failed\n");
+    ok(!strcmp(buffer, "HTTP/1.1"), "http version wrong\n");
+
+    sz = sizeof buffer;
+    r = HttpQueryInfo(hr, HTTP_QUERY_SERVER, buffer, &sz, NULL);
+    ok(r, "HttpQueryInfo failed\n");
+    ok(!strcmp(buffer, "winetest"), "http server wrong\n");
+
+    sz = sizeof buffer;
+    r = HttpQueryInfo(hr, HTTP_QUERY_CONTENT_ENCODING, buffer, &sz, NULL);
+    ok(GetLastError() == ERROR_HTTP_HEADER_NOT_FOUND, "HttpQueryInfo should fail\n");
+    ok(r == FALSE, "HttpQueryInfo failed\n");
+
+    InternetCloseHandle(hr);
+    InternetCloseHandle(hc);
+    InternetCloseHandle(hi);
+}
+
+static void test_proxy_direct(int port)
+{
+    HINTERNET hi, hc, hr;
+    DWORD r, sz;
+    char buffer[0x40];
+
+    sprintf(buffer, "localhost:%d\n", port);
+    hi = InternetOpen(NULL, INTERNET_OPEN_TYPE_PROXY, buffer, NULL, 0);
+    ok(hi != NULL, "open failed\n");
+
+    /* try connect without authorization */
+    hc = InternetConnect(hi, "www.winehq.org/", port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
+    ok(hc != NULL, "connect failed\n");
+
+    hr = HttpOpenRequest(hc, NULL, "/test2", NULL, NULL, NULL, 0, 0);
+    ok(hr != NULL, "HttpOpenRequest failed\n");
+
+    r = HttpSendRequest(hr, NULL, 0, NULL, 0);
+    ok(r, "HttpSendRequest failed\n");
+
+    sz = sizeof buffer;
+    r = HttpQueryInfo(hr, HTTP_QUERY_STATUS_CODE, buffer, &sz, NULL);
+    ok(r, "HttpQueryInfo failed\n");
+    ok(!strcmp(buffer, "407"), "proxy code wrong\n");
+
+
+    /* set the user + password then try again */
+    todo_wine {
+    r = InternetSetOption(hr, INTERNET_OPTION_PROXY_USERNAME, "mike", 4);
+    ok(r, "failed to set user\n");
+
+    r = InternetSetOption(hr, INTERNET_OPTION_PROXY_PASSWORD, "1101", 4);
+    ok(r, "failed to set password\n");
+    }
+
+    r = HttpSendRequest(hr, NULL, 0, NULL, 0);
+    ok(r, "HttpSendRequest failed\n");
+    sz = sizeof buffer;
+    r = HttpQueryInfo(hr, HTTP_QUERY_STATUS_CODE, buffer, &sz, NULL);
+    ok(r, "HttpQueryInfo failed\n");
+    todo_wine {
+    ok(!strcmp(buffer, "200"), "proxy code wrong\n");
+    }
+
+
+    InternetCloseHandle(hr);
+    InternetCloseHandle(hc);
+    InternetCloseHandle(hi);
+}
+
+static void test_http_connection(void)
+{
+    struct server_info si;
+    HANDLE hThread;
+    DWORD id = 0, r;
+
+    si.hEvent = CreateEvent(NULL, 0, 0, NULL);
+    si.port = 7531;
+
+    hThread = CreateThread(NULL, 0, server_thread, (LPVOID) &si, 0, &id);
+    ok( hThread != NULL, "create thread failed\n");
+
+    r = WaitForSingleObject(si.hEvent, 10000);
+    ok (r == WAIT_OBJECT_0, "failed to start wininet test server\n");
+    if (r != WAIT_OBJECT_0)
+        return;
+
+    test_basic_request(si.port, "/test1");
+    test_proxy_indirect(si.port);
+    test_proxy_direct(si.port);
+
+    /* send the basic request again to shutdown the server thread */
+    test_basic_request(si.port, "/quit");
 
     r = WaitForSingleObject(hThread, 3000);
     ok( r == WAIT_OBJECT_0, "thread wait failed\n");




More information about the wine-cvs mailing list