Jacek Caban : wininet: Store server_t in http_request_t.

Alexandre Julliard julliard at winehq.org
Fri May 25 10:52:49 CDT 2012


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri May 25 16:34:24 2012 +0200

wininet: Store server_t in http_request_t.

---

 dlls/wininet/http.c     |   77 +++++++++++++++++++++++++----------------------
 dlls/wininet/internet.h |    1 +
 2 files changed, 42 insertions(+), 36 deletions(-)

diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index 2f64b03..d8b3d1c 100644
--- a/dlls/wininet/http.c
+++ b/dlls/wininet/http.c
@@ -1182,7 +1182,7 @@ static BOOL HTTP_DoAuthorization( http_request_t *request, LPCWSTR pszAuthValue,
 
         sec_status = InitializeSecurityContextW(first ? &pAuthInfo->cred : NULL,
                                                 first ? NULL : &pAuthInfo->ctx,
-                                                first ? request->session->serverName : NULL,
+                                                first ? request->server->name : NULL,
                                                 context_req, 0, SECURITY_NETWORK_DREP,
                                                 in.pvBuffer ? &in_desc : NULL,
                                                 0, &pAuthInfo->ctx, &out_desc,
@@ -1698,6 +1698,7 @@ static BOOL HTTP_DealWithProxy(appinfo_t *hIC, http_session_t *session, http_req
     WCHAR proxy[INTERNET_MAX_URL_LENGTH];
     static WCHAR szNul[] = { 0 };
     URL_COMPONENTSW UrlComponents;
+    server_t *new_server;
     static const WCHAR protoHttp[] = { 'h','t','t','p',0 };
     static const WCHAR szHttp[] = { 'h','t','t','p',':','/','/',0 };
     static const WCHAR szFormat[] = { 'h','t','t','p',':','/','/','%','s',0 };
@@ -1725,16 +1726,20 @@ static BOOL HTTP_DealWithProxy(appinfo_t *hIC, http_session_t *session, http_req
     if(UrlComponents.nPort == INTERNET_INVALID_PORT_NUMBER)
         UrlComponents.nPort = INTERNET_DEFAULT_HTTP_PORT;
 
-    heap_free(session->serverName);
-    session->serverName = heap_strdupW(UrlComponents.lpszHostName);
-    session->serverPort = UrlComponents.nPort;
+    new_server = get_server(UrlComponents.lpszHostName, UrlComponents.nPort);
+    if(!new_server)
+        return FALSE;
+
+    server_release(request->server);
+    request->server = new_server;
 
-    TRACE("proxy server=%s port=%d\n", debugstr_w(session->serverName), session->serverPort);
+    TRACE("proxy server=%s port=%d\n", debugstr_w(new_server->name), new_server->port);
     return TRUE;
 }
 
-static DWORD HTTP_ResolveName(http_request_t *request, server_t *server)
+static DWORD HTTP_ResolveName(http_request_t *request)
 {
+    server_t *server = request->server;
     socklen_t addr_len;
     const void *addr;
 
@@ -1833,6 +1838,9 @@ static void HTTPREQ_Destroy(object_header_t *hdr)
     destroy_authinfo(request->authInfo);
     destroy_authinfo(request->proxyAuthInfo);
 
+    if(request->server)
+        server_release(request->server);
+
     heap_free(request->path);
     heap_free(request->verb);
     heap_free(request->rawHeaders);
@@ -3063,6 +3071,7 @@ static DWORD HTTP_HttpOpenRequestW(http_session_t *session,
 {
     appinfo_t *hIC = session->appInfo;
     http_request_t *request;
+    INTERNET_PORT port;
     DWORD len, res = ERROR_SUCCESS;
 
     TRACE("-->\n");
@@ -3089,6 +3098,16 @@ static DWORD HTTP_HttpOpenRequestW(http_session_t *session,
     request->session = session;
     list_add_head( &session->hdr.children, &request->hdr.entry );
 
+    port = session->serverPort;
+    if(port == INTERNET_INVALID_PORT_NUMBER)
+        port = dwFlags & INTERNET_FLAG_SECURE ? INTERNET_DEFAULT_HTTPS_PORT : INTERNET_DEFAULT_HTTP_PORT;
+
+    request->server = get_server(session->serverName, port);
+    if(!request->server) {
+        WININET_Release(&request->hdr);
+        return ERROR_OUTOFMEMORY;
+    }
+
     if (dwFlags & INTERNET_FLAG_IGNORE_CERT_CN_INVALID)
         request->security_flags |= SECURITY_FLAG_IGNORE_CERT_CN_INVALID;
     if (dwFlags & INTERNET_FLAG_IGNORE_CERT_DATE_INVALID)
@@ -3156,11 +3175,6 @@ static DWORD HTTP_HttpOpenRequestW(http_session_t *session,
         HTTP_ProcessHeader(request, hostW, session->hostName,
                 HTTP_ADDREQ_FLAG_ADD | HTTP_ADDHDR_FLAG_REQ);
 
-    if (session->serverPort == INTERNET_INVALID_PORT_NUMBER)
-        session->serverPort = (dwFlags & INTERNET_FLAG_SECURE ?
-                        INTERNET_DEFAULT_HTTPS_PORT :
-                        INTERNET_DEFAULT_HTTP_PORT);
-
     if (session->hostPort == INTERNET_INVALID_PORT_NUMBER)
         session->hostPort = (dwFlags & INTERNET_FLAG_SECURE ?
                         INTERNET_DEFAULT_HTTPS_PORT :
@@ -3913,12 +3927,12 @@ static DWORD HTTP_HandleRedirect(http_request_t *request, LPCWSTR lpszUrl)
 
         reset_data_stream(request);
 
-        if(!using_proxy) {
-            if(strcmpiW(session->serverName, hostName)) {
-                heap_free(session->serverName);
-                session->serverName = heap_strdupW(hostName);
-            }
-            session->serverPort = urlComponents.nPort;
+        if(!using_proxy && (strcmpiW(request->server->name, hostName) || request->server->port != urlComponents.nPort)) {
+            server_t *new_server;
+
+            new_server = get_server(hostName, urlComponents.nPort);
+            server_release(request->server);
+            request->server = new_server;
         }
     }
     heap_free(request->path);
@@ -4601,28 +4615,20 @@ static void HTTP_CacheRequest(http_request_t *request)
 static DWORD open_http_connection(http_request_t *request, BOOL *reusing)
 {
     const BOOL is_https = (request->hdr.dwFlags & INTERNET_FLAG_SECURE) != 0;
-    http_session_t *session = request->session;
     netconn_t *netconn = NULL;
-    server_t *server;
     DWORD res;
 
     assert(!request->netconn);
     reset_data_stream(request);
 
-    server = get_server(session->serverName, session->serverPort);
-    if(!server)
-        return ERROR_OUTOFMEMORY;
-
-    res = HTTP_ResolveName(request, server);
-    if(res != ERROR_SUCCESS) {
-        server_release(server);
+    res = HTTP_ResolveName(request);
+    if(res != ERROR_SUCCESS)
         return res;
-    }
 
     EnterCriticalSection(&connection_pool_cs);
 
-    while(!list_empty(&server->conn_pool)) {
-        netconn = LIST_ENTRY(list_head(&server->conn_pool), netconn_t, pool_entry);
+    while(!list_empty(&request->server->conn_pool)) {
+        netconn = LIST_ENTRY(list_head(&request->server->conn_pool), netconn_t, pool_entry);
         list_remove(&netconn->pool_entry);
 
         if(NETCON_is_alive(netconn))
@@ -4644,11 +4650,10 @@ static DWORD open_http_connection(http_request_t *request, BOOL *reusing)
 
     INTERNET_SendCallback(&request->hdr, request->hdr.dwContext,
                           INTERNET_STATUS_CONNECTING_TO_SERVER,
-                          server->addr_str,
-                          strlen(server->addr_str)+1);
+                          request->server->addr_str,
+                          strlen(request->server->addr_str)+1);
 
-    res = create_netconn(is_https, server, request->security_flags, request->connect_timeout, &netconn);
-    server_release(server);
+    res = create_netconn(is_https, request->server, request->security_flags, request->connect_timeout, &netconn);
     if(res != ERROR_SUCCESS) {
         ERR("create_netconn failed: %u\n", res);
         return res;
@@ -4658,7 +4663,7 @@ static DWORD open_http_connection(http_request_t *request, BOOL *reusing)
 
     INTERNET_SendCallback(&request->hdr, request->hdr.dwContext,
             INTERNET_STATUS_CONNECTED_TO_SERVER,
-            server->addr_str, strlen(server->addr_str)+1);
+            request->server->addr_str, strlen(request->server->addr_str)+1);
 
     if(is_https) {
         /* Note: we differ from Microsoft's WinINet here. they seem to have
@@ -4667,7 +4672,7 @@ static DWORD open_http_connection(http_request_t *request, BOOL *reusing)
          * behaviour to be more correct and to not cause any incompatibilities
          * because using a secure connection through a proxy server is a rare
          * case that would be hard for anyone to depend on */
-        if(session->appInfo->proxy)
+        if(request->session->appInfo->proxy)
             res = HTTP_SecureProxyConnect(request);
         if(res == ERROR_SUCCESS)
             res = NETCON_secure_connect(request->netconn);
@@ -4693,7 +4698,7 @@ static DWORD open_http_connection(http_request_t *request, BOOL *reusing)
     }
 
     *reusing = FALSE;
-    TRACE("Created connection to %s: %p\n", debugstr_w(server->name), netconn);
+    TRACE("Created connection to %s: %p\n", debugstr_w(request->server->name), netconn);
     return ERROR_SUCCESS;
 }
 
diff --git a/dlls/wininet/internet.h b/dlls/wininet/internet.h
index 1956e07..38d6275 100644
--- a/dlls/wininet/internet.h
+++ b/dlls/wininet/internet.h
@@ -304,6 +304,7 @@ typedef struct
 {
     object_header_t hdr;
     http_session_t *session;
+    server_t *server;
     LPWSTR path;
     LPWSTR verb;
     LPWSTR rawHeaders;




More information about the wine-cvs mailing list