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