WININET: Pass pointers round internally instead of handles

Mike McCormack mike at codeweavers.com
Sun Jun 13 22:12:58 CDT 2004


ChangeLog:
* Pass pointers round internally instead of handles
-------------- next part --------------
Index: dlls/wininet/http.c
===================================================================
RCS file: /home/wine/wine/dlls/wininet/http.c,v
retrieving revision 1.62
diff -u -r1.62 http.c
--- dlls/wininet/http.c	1 Jun 2004 20:19:56 -0000	1.62
+++ dlls/wininet/http.c	14 Jun 2004 01:55:15 -0000
@@ -96,16 +96,9 @@
 BOOL HTTP_DeleteCustomHeader(LPWININETHTTPREQW lpwhr, INT index);
 
 /***********************************************************************
- *           HttpAddRequestHeadersW (WININET.@)
- *
- * Adds one or more HTTP header to the request handler
- *
- * RETURNS
- *    TRUE  on success
- *    FALSE on failure
- *
+ *           HTTP_HttpAddRequestHeadersW (internal)
  */
-BOOL WINAPI HttpAddRequestHeadersW(HINTERNET hHttpRequest,
+static BOOL WINAPI HTTP_HttpAddRequestHeadersW(LPWININETHTTPREQW lpwhr,
 	LPCWSTR lpszHeader, DWORD dwHeaderLength, DWORD dwModifier)
 {
     LPWSTR lpszStart;
@@ -113,21 +106,6 @@
     LPWSTR buffer;
     WCHAR value[MAX_FIELD_VALUE_LEN], field[MAX_FIELD_LEN];
     BOOL bSuccess = FALSE;
-    LPWININETHTTPREQW lpwhr;
-
-    TRACE("%p, %s, %li, %li\n", hHttpRequest, debugstr_w(lpszHeader), dwHeaderLength,
-          dwModifier);
-
-    lpwhr = (LPWININETHTTPREQW) WININET_GetObject( hHttpRequest );
-
-    if (NULL == lpwhr ||  lpwhr->hdr.htype != WH_HHTTPREQ)
-    {
-        INTERNET_SetLastError(ERROR_INTERNET_INCORRECT_HANDLE_TYPE);
-        return FALSE;
-    }
-
-    if (!lpszHeader) 
-      return TRUE;
 
     TRACE("copying header: %s\n", debugstr_w(lpszHeader));
     buffer = WININET_strdupW(lpszHeader);
@@ -158,6 +136,40 @@
     } while (bSuccess);
 
     HeapFree(GetProcessHeap(), 0, buffer);
+
+    return bSuccess;
+}
+
+/***********************************************************************
+ *           HttpAddRequestHeadersW (WININET.@)
+ *
+ * Adds one or more HTTP header to the request handler
+ *
+ * RETURNS
+ *    TRUE  on success
+ *    FALSE on failure
+ *
+ */
+BOOL WINAPI HttpAddRequestHeadersW(HINTERNET hHttpRequest,
+	LPCWSTR lpszHeader, DWORD dwHeaderLength, DWORD dwModifier)
+{
+    BOOL bSuccess = FALSE;
+    LPWININETHTTPREQW lpwhr;
+
+    TRACE("%p, %s, %li, %li\n", hHttpRequest, debugstr_w(lpszHeader), dwHeaderLength,
+          dwModifier);
+
+    if (!lpszHeader) 
+      return TRUE;
+
+    lpwhr = (LPWININETHTTPREQW) WININET_GetObject( hHttpRequest );
+    if (NULL == lpwhr ||  lpwhr->hdr.htype != WH_HHTTPREQ)
+    {
+        INTERNET_SetLastError(ERROR_INTERNET_INCORRECT_HANDLE_TYPE);
+        return bSuccess;
+    }
+    bSuccess = HTTP_HttpAddRequestHeadersW( lpwhr, lpszHeader, dwHeaderLength, dwModifier );
+
     return bSuccess;
 }
 
@@ -704,7 +716,7 @@
         agent_header = HeapAlloc( GetProcessHeap(), 0, len*sizeof(WCHAR) );
         sprintfW(agent_header, user_agent, hIC->lpszAgent );
 
-        HttpAddRequestHeadersW(handle, agent_header, strlenW(agent_header),
+        HTTP_HttpAddRequestHeadersW(lpwhr, agent_header, strlenW(agent_header),
                                HTTP_ADDREQ_FLAG_ADD);
         HeapFree(GetProcessHeap(), 0, agent_header);
     }
@@ -725,7 +737,7 @@
         InternetGetCookieW(lpszUrl, NULL, lpszCookies + cnt, &nCookieSize);
         strcatW(lpszCookies, szcrlf);
 
-        HttpAddRequestHeadersW(handle, lpszCookies, strlenW(lpszCookies),
+        HTTP_HttpAddRequestHeadersW(lpwhr, lpszCookies, strlenW(lpszCookies),
                                HTTP_ADDREQ_FLAG_ADD);
         HeapFree(GetProcessHeap(), 0, lpszCookies);
     }
@@ -774,149 +786,24 @@
 
 
 /***********************************************************************
- *           HttpQueryInfoW (WININET.@)
- *
- * Queries for information about an HTTP request
- *
- * RETURNS
- *    TRUE  on success
- *    FALSE on failure
- *
+ *           HTTP_HttpQueryInfoW (internal)
  */
-BOOL WINAPI HttpQueryInfoW(HINTERNET hHttpRequest, DWORD dwInfoLevel,
+BOOL WINAPI HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD dwInfoLevel,
 	LPVOID lpBuffer, LPDWORD lpdwBufferLength, LPDWORD lpdwIndex)
 {
     LPHTTPHEADERW lphttpHdr = NULL;
     BOOL bSuccess = FALSE;
-    LPWININETHTTPREQW lpwhr;
     static const WCHAR szFmt[] = { '%','s',':',' ','%','s','%','s',0 };
     static const WCHAR szcrlf[] = { '\r','\n',0 };
     static const WCHAR sznul[] = { 0 };
 
-    if (TRACE_ON(wininet)) {
-#define FE(x) { x, #x }
-	static const wininet_flag_info query_flags[] = {
-	    FE(HTTP_QUERY_MIME_VERSION),
-	    FE(HTTP_QUERY_CONTENT_TYPE),
-	    FE(HTTP_QUERY_CONTENT_TRANSFER_ENCODING),
-	    FE(HTTP_QUERY_CONTENT_ID),
-	    FE(HTTP_QUERY_CONTENT_DESCRIPTION),
-	    FE(HTTP_QUERY_CONTENT_LENGTH),
-	    FE(HTTP_QUERY_CONTENT_LANGUAGE),
-	    FE(HTTP_QUERY_ALLOW),
-	    FE(HTTP_QUERY_PUBLIC),
-	    FE(HTTP_QUERY_DATE),
-	    FE(HTTP_QUERY_EXPIRES),
-	    FE(HTTP_QUERY_LAST_MODIFIED),
-	    FE(HTTP_QUERY_MESSAGE_ID),
-	    FE(HTTP_QUERY_URI),
-	    FE(HTTP_QUERY_DERIVED_FROM),
-	    FE(HTTP_QUERY_COST),
-	    FE(HTTP_QUERY_LINK),
-	    FE(HTTP_QUERY_PRAGMA),
-	    FE(HTTP_QUERY_VERSION),
-	    FE(HTTP_QUERY_STATUS_CODE),
-	    FE(HTTP_QUERY_STATUS_TEXT),
-	    FE(HTTP_QUERY_RAW_HEADERS),
-	    FE(HTTP_QUERY_RAW_HEADERS_CRLF),
-	    FE(HTTP_QUERY_CONNECTION),
-	    FE(HTTP_QUERY_ACCEPT),
-	    FE(HTTP_QUERY_ACCEPT_CHARSET),
-	    FE(HTTP_QUERY_ACCEPT_ENCODING),
-	    FE(HTTP_QUERY_ACCEPT_LANGUAGE),
-	    FE(HTTP_QUERY_AUTHORIZATION),
-	    FE(HTTP_QUERY_CONTENT_ENCODING),
-	    FE(HTTP_QUERY_FORWARDED),
-	    FE(HTTP_QUERY_FROM),
-	    FE(HTTP_QUERY_IF_MODIFIED_SINCE),
-	    FE(HTTP_QUERY_LOCATION),
-	    FE(HTTP_QUERY_ORIG_URI),
-	    FE(HTTP_QUERY_REFERER),
-	    FE(HTTP_QUERY_RETRY_AFTER),
-	    FE(HTTP_QUERY_SERVER),
-	    FE(HTTP_QUERY_TITLE),
-	    FE(HTTP_QUERY_USER_AGENT),
-	    FE(HTTP_QUERY_WWW_AUTHENTICATE),
-	    FE(HTTP_QUERY_PROXY_AUTHENTICATE),
-	    FE(HTTP_QUERY_ACCEPT_RANGES),
-	    FE(HTTP_QUERY_SET_COOKIE),
-	    FE(HTTP_QUERY_COOKIE),
-	    FE(HTTP_QUERY_REQUEST_METHOD),
-	    FE(HTTP_QUERY_REFRESH),
-	    FE(HTTP_QUERY_CONTENT_DISPOSITION),
-	    FE(HTTP_QUERY_AGE),
-	    FE(HTTP_QUERY_CACHE_CONTROL),
-	    FE(HTTP_QUERY_CONTENT_BASE),
-	    FE(HTTP_QUERY_CONTENT_LOCATION),
-	    FE(HTTP_QUERY_CONTENT_MD5),
-	    FE(HTTP_QUERY_CONTENT_RANGE),
-	    FE(HTTP_QUERY_ETAG),
-	    FE(HTTP_QUERY_HOST),
-	    FE(HTTP_QUERY_IF_MATCH),
-	    FE(HTTP_QUERY_IF_NONE_MATCH),
-	    FE(HTTP_QUERY_IF_RANGE),
-	    FE(HTTP_QUERY_IF_UNMODIFIED_SINCE),
-	    FE(HTTP_QUERY_MAX_FORWARDS),
-	    FE(HTTP_QUERY_PROXY_AUTHORIZATION),
-	    FE(HTTP_QUERY_RANGE),
-	    FE(HTTP_QUERY_TRANSFER_ENCODING),
-	    FE(HTTP_QUERY_UPGRADE),
-	    FE(HTTP_QUERY_VARY),
-	    FE(HTTP_QUERY_VIA),
-	    FE(HTTP_QUERY_WARNING),
-	    FE(HTTP_QUERY_CUSTOM)
-	};
-	static const wininet_flag_info modifier_flags[] = {
-	    FE(HTTP_QUERY_FLAG_REQUEST_HEADERS),
-	    FE(HTTP_QUERY_FLAG_SYSTEMTIME),
-	    FE(HTTP_QUERY_FLAG_NUMBER),
-	    FE(HTTP_QUERY_FLAG_COALESCE)
-	};
-#undef FE
-	DWORD info_mod = dwInfoLevel & HTTP_QUERY_MODIFIER_FLAGS_MASK;
-	DWORD info = dwInfoLevel & HTTP_QUERY_HEADER_MASK;
-	int i;
-
-	TRACE("(%p, 0x%08lx)--> %ld\n", hHttpRequest, dwInfoLevel, dwInfoLevel);
-	TRACE("  Attribute:");
-	for (i = 0; i < (sizeof(query_flags) / sizeof(query_flags[0])); i++) {
-	    if (query_flags[i].val == info) {
-		DPRINTF(" %s", query_flags[i].name);
-		break;
-	    }
-	}
-	if (i == (sizeof(query_flags) / sizeof(query_flags[0]))) {
-	    DPRINTF(" Unknown (%08lx)", info);
-	}
-
-	DPRINTF(" Modifier:");
-	for (i = 0; i < (sizeof(modifier_flags) / sizeof(modifier_flags[0])); i++) {
-	    if (modifier_flags[i].val & info_mod) {
-		DPRINTF(" %s", modifier_flags[i].name);
-		info_mod &= ~ modifier_flags[i].val;
-	    }
-	}
-	
-	if (info_mod) {
-	    DPRINTF(" Unknown (%08lx)", info_mod);
-	}
-	DPRINTF("\n");
-    }
-    
-    lpwhr = (LPWININETHTTPREQW) WININET_GetObject( hHttpRequest );
-    if (NULL == lpwhr ||  lpwhr->hdr.htype != WH_HHTTPREQ)
-    {
-        INTERNET_SetLastError(ERROR_INTERNET_INCORRECT_HANDLE_TYPE);
-	goto lend;
-    }
-
     /* Find requested header structure */
     if ((dwInfoLevel & ~HTTP_QUERY_MODIFIER_FLAGS_MASK) == HTTP_QUERY_CUSTOM)
     {
         INT index = HTTP_GetCustomHeaderIndex(lpwhr, (LPWSTR)lpBuffer);
 
         if (index < 0)
-            goto lend;
+            return bSuccess;
 
         lphttpHdr = &lpwhr->pCustHeaders[index];
     }
@@ -957,7 +844,7 @@
            {
               *lpdwBufferLength = (size + 1) * sizeof(WCHAR);
               INTERNET_SetLastError(ERROR_INSUFFICIENT_BUFFER);
-              goto lend;
+              return bSuccess;
            }
 
            /* Append standard request heades */
@@ -990,20 +877,20 @@
 
             *lpdwBufferLength = (cnt + delim) * sizeof(WCHAR);
             bSuccess = TRUE;
-            goto lend;
+            return bSuccess;
         }
 	else if (index >= 0 && index <= HTTP_QUERY_MAX && lpwhr->StdHeaders[index].lpszValue)
 	{
 	    lphttpHdr = &lpwhr->StdHeaders[index];
 	}
 	else
-            goto lend;
+            return bSuccess;
     }
 
     /* Ensure header satisifies requested attributes */
     if ((dwInfoLevel & HTTP_QUERY_FLAG_REQUEST_HEADERS) &&
 	    (~lphttpHdr->wFlags & HDR_ISREQUEST))
-	goto lend;
+	return bSuccess;
 
     /* coalesce value to reuqested type */
     if (dwInfoLevel & HTTP_QUERY_FLAG_NUMBER)
@@ -1024,7 +911,7 @@
         tmpTM = *gmtime(&tmpTime);
         STHook = (SYSTEMTIME *) lpBuffer;
         if(STHook==NULL)
-            goto lend;
+            return bSuccess;
 
 	STHook->wDay = tmpTM.tm_mday;
 	STHook->wHour = tmpTM.tm_hour;
@@ -1061,7 +948,7 @@
         {
             *lpdwBufferLength = len;
             INTERNET_SetLastError(ERROR_INSUFFICIENT_BUFFER);
-            goto lend;
+            return bSuccess;
         }
 
         memcpy(lpBuffer, lphttpHdr->lpszValue, len);
@@ -1070,8 +957,145 @@
 
 	TRACE(" returning string : '%s'\n", debugstr_w(lpBuffer));
     }
+    return bSuccess;
+}
+
+/***********************************************************************
+ *           HttpQueryInfoW (WININET.@)
+ *
+ * Queries for information about an HTTP request
+ *
+ * RETURNS
+ *    TRUE  on success
+ *    FALSE on failure
+ *
+ */
+BOOL WINAPI HttpQueryInfoW(HINTERNET hHttpRequest, DWORD dwInfoLevel,
+	LPVOID lpBuffer, LPDWORD lpdwBufferLength, LPDWORD lpdwIndex)
+{
+    BOOL bSuccess = FALSE;
+    LPWININETHTTPREQW lpwhr;
+
+    if (TRACE_ON(wininet)) {
+#define FE(x) { x, #x }
+	static const wininet_flag_info query_flags[] = {
+	    FE(HTTP_QUERY_MIME_VERSION),
+	    FE(HTTP_QUERY_CONTENT_TYPE),
+	    FE(HTTP_QUERY_CONTENT_TRANSFER_ENCODING),
+	    FE(HTTP_QUERY_CONTENT_ID),
+	    FE(HTTP_QUERY_CONTENT_DESCRIPTION),
+	    FE(HTTP_QUERY_CONTENT_LENGTH),
+	    FE(HTTP_QUERY_CONTENT_LANGUAGE),
+	    FE(HTTP_QUERY_ALLOW),
+	    FE(HTTP_QUERY_PUBLIC),
+	    FE(HTTP_QUERY_DATE),
+	    FE(HTTP_QUERY_EXPIRES),
+	    FE(HTTP_QUERY_LAST_MODIFIED),
+	    FE(HTTP_QUERY_MESSAGE_ID),
+	    FE(HTTP_QUERY_URI),
+	    FE(HTTP_QUERY_DERIVED_FROM),
+	    FE(HTTP_QUERY_COST),
+	    FE(HTTP_QUERY_LINK),
+	    FE(HTTP_QUERY_PRAGMA),
+	    FE(HTTP_QUERY_VERSION),
+	    FE(HTTP_QUERY_STATUS_CODE),
+	    FE(HTTP_QUERY_STATUS_TEXT),
+	    FE(HTTP_QUERY_RAW_HEADERS),
+	    FE(HTTP_QUERY_RAW_HEADERS_CRLF),
+	    FE(HTTP_QUERY_CONNECTION),
+	    FE(HTTP_QUERY_ACCEPT),
+	    FE(HTTP_QUERY_ACCEPT_CHARSET),
+	    FE(HTTP_QUERY_ACCEPT_ENCODING),
+	    FE(HTTP_QUERY_ACCEPT_LANGUAGE),
+	    FE(HTTP_QUERY_AUTHORIZATION),
+	    FE(HTTP_QUERY_CONTENT_ENCODING),
+	    FE(HTTP_QUERY_FORWARDED),
+	    FE(HTTP_QUERY_FROM),
+	    FE(HTTP_QUERY_IF_MODIFIED_SINCE),
+	    FE(HTTP_QUERY_LOCATION),
+	    FE(HTTP_QUERY_ORIG_URI),
+	    FE(HTTP_QUERY_REFERER),
+	    FE(HTTP_QUERY_RETRY_AFTER),
+	    FE(HTTP_QUERY_SERVER),
+	    FE(HTTP_QUERY_TITLE),
+	    FE(HTTP_QUERY_USER_AGENT),
+	    FE(HTTP_QUERY_WWW_AUTHENTICATE),
+	    FE(HTTP_QUERY_PROXY_AUTHENTICATE),
+	    FE(HTTP_QUERY_ACCEPT_RANGES),
+	    FE(HTTP_QUERY_SET_COOKIE),
+	    FE(HTTP_QUERY_COOKIE),
+	    FE(HTTP_QUERY_REQUEST_METHOD),
+	    FE(HTTP_QUERY_REFRESH),
+	    FE(HTTP_QUERY_CONTENT_DISPOSITION),
+	    FE(HTTP_QUERY_AGE),
+	    FE(HTTP_QUERY_CACHE_CONTROL),
+	    FE(HTTP_QUERY_CONTENT_BASE),
+	    FE(HTTP_QUERY_CONTENT_LOCATION),
+	    FE(HTTP_QUERY_CONTENT_MD5),
+	    FE(HTTP_QUERY_CONTENT_RANGE),
+	    FE(HTTP_QUERY_ETAG),
+	    FE(HTTP_QUERY_HOST),
+	    FE(HTTP_QUERY_IF_MATCH),
+	    FE(HTTP_QUERY_IF_NONE_MATCH),
+	    FE(HTTP_QUERY_IF_RANGE),
+	    FE(HTTP_QUERY_IF_UNMODIFIED_SINCE),
+	    FE(HTTP_QUERY_MAX_FORWARDS),
+	    FE(HTTP_QUERY_PROXY_AUTHORIZATION),
+	    FE(HTTP_QUERY_RANGE),
+	    FE(HTTP_QUERY_TRANSFER_ENCODING),
+	    FE(HTTP_QUERY_UPGRADE),
+	    FE(HTTP_QUERY_VARY),
+	    FE(HTTP_QUERY_VIA),
+	    FE(HTTP_QUERY_WARNING),
+	    FE(HTTP_QUERY_CUSTOM)
+	};
+	static const wininet_flag_info modifier_flags[] = {
+	    FE(HTTP_QUERY_FLAG_REQUEST_HEADERS),
+	    FE(HTTP_QUERY_FLAG_SYSTEMTIME),
+	    FE(HTTP_QUERY_FLAG_NUMBER),
+	    FE(HTTP_QUERY_FLAG_COALESCE)
+	};
+#undef FE
+	DWORD info_mod = dwInfoLevel & HTTP_QUERY_MODIFIER_FLAGS_MASK;
+	DWORD info = dwInfoLevel & HTTP_QUERY_HEADER_MASK;
+	int i;
+
+	TRACE("(%p, 0x%08lx)--> %ld\n", hHttpRequest, dwInfoLevel, dwInfoLevel);
+	TRACE("  Attribute:");
+	for (i = 0; i < (sizeof(query_flags) / sizeof(query_flags[0])); i++) {
+	    if (query_flags[i].val == info) {
+		DPRINTF(" %s", query_flags[i].name);
+		break;
+	    }
+	}
+	if (i == (sizeof(query_flags) / sizeof(query_flags[0]))) {
+	    DPRINTF(" Unknown (%08lx)", info);
+	}
+
+	DPRINTF(" Modifier:");
+	for (i = 0; i < (sizeof(modifier_flags) / sizeof(modifier_flags[0])); i++) {
+	    if (modifier_flags[i].val & info_mod) {
+		DPRINTF(" %s", modifier_flags[i].name);
+		info_mod &= ~ modifier_flags[i].val;
+	    }
+	}
+	
+	if (info_mod) {
+	    DPRINTF(" Unknown (%08lx)", info_mod);
+	}
+	DPRINTF("\n");
+    }
+    
+    lpwhr = (LPWININETHTTPREQW) WININET_GetObject( hHttpRequest );
+    if (NULL == lpwhr ||  lpwhr->hdr.htype != WH_HHTTPREQ)
+    {
+        INTERNET_SetLastError(ERROR_INTERNET_INCORRECT_HANDLE_TYPE);
+	return FALSE;
+    }
+
+    bSuccess = HTTP_HttpQueryInfoW( lpwhr, dwInfoLevel,
+	                            lpBuffer, lpdwBufferLength, lpdwIndex);
 
-lend:
     TRACE("%d <--\n", bSuccess);
     return bSuccess;
 }
@@ -1412,9 +1436,11 @@
     /* if we are using optional stuff, we must add the fixed header of that option length */
     if (lpOptional && dwOptionalLength)
     {
-        char contentLengthStr[sizeof("Content-Length: ") + 20 /* int */ + 2 /* \n\r */];
-        sprintf(contentLengthStr, "Content-Length: %li\r\n", dwOptionalLength);
-        HttpAddRequestHeadersA(hHttpRequest, contentLengthStr, -1L, HTTP_ADDREQ_FLAG_ADD);
+        static const WCHAR szContentLength[] = {
+            'C','o','n','t','e','n','t','-','L','e','n','g','t','h',':',' ','%','l','i','\r','\n',0};
+        WCHAR contentLengthStr[sizeof szContentLength/2 /* includes \n\r */ + 20 /* int */ ];
+        sprintfW(contentLengthStr, szContentLength, dwOptionalLength);
+        HTTP_HttpAddRequestHeadersW(lpwhr, contentLengthStr, -1L, HTTP_ADDREQ_FLAG_ADD);
     }
 
     do
@@ -1743,13 +1769,13 @@
     if(!(hIC->hdr.dwFlags & INTERNET_FLAG_NO_AUTO_REDIRECT) && bSuccess)
     {
         DWORD dwCode,dwCodeLength=sizeof(DWORD),dwIndex=0;
-        if(HttpQueryInfoW(hHttpRequest,HTTP_QUERY_FLAG_NUMBER|HTTP_QUERY_STATUS_CODE,&dwCode,&dwCodeLength,&dwIndex) &&
+        if(HTTP_HttpQueryInfoW(lpwhr,HTTP_QUERY_FLAG_NUMBER|HTTP_QUERY_STATUS_CODE,&dwCode,&dwCodeLength,&dwIndex) &&
             (dwCode==302 || dwCode==301))
         {
             WCHAR szNewLocation[2048];
             DWORD dwBufferSize=2048;
             dwIndex=0;
-            if(HttpQueryInfoW(hHttpRequest,HTTP_QUERY_LOCATION,szNewLocation,&dwBufferSize,&dwIndex))
+            if(HTTP_HttpQueryInfoW(lpwhr,HTTP_QUERY_LOCATION,szNewLocation,&dwBufferSize,&dwIndex))
             {
                 SendAsyncCallback(hIC, hHttpRequest, lpwhr->hdr.dwContext,
                       INTERNET_STATUS_REDIRECT, szNewLocation,


More information about the wine-patches mailing list