Commit 4319ec6b authored by Rob Shearman's avatar Rob Shearman Committed by Alexandre Julliard

wininet: Make HTTP_HandleRedirect no longer call HTTP_HttpSendRequestW.

Make the redirect handling in HTTP_HttpSendRequestW iterate instead of recurse.
parent fb4980d6
...@@ -102,9 +102,7 @@ static BOOL HTTP_InsertProxyAuthorization( LPWININETHTTPREQW lpwhr, ...@@ -102,9 +102,7 @@ static BOOL HTTP_InsertProxyAuthorization( LPWININETHTTPREQW lpwhr,
static BOOL WINAPI HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD static BOOL WINAPI HTTP_HttpQueryInfoW( LPWININETHTTPREQW lpwhr, DWORD
dwInfoLevel, LPVOID lpBuffer, LPDWORD lpdwBufferLength, LPDWORD dwInfoLevel, LPVOID lpBuffer, LPDWORD lpdwBufferLength, LPDWORD
lpdwIndex); lpdwIndex);
static BOOL HTTP_HandleRedirect(LPWININETHTTPREQW lpwhr, LPCWSTR lpszUrl, static BOOL HTTP_HandleRedirect(LPWININETHTTPREQW lpwhr, LPCWSTR lpszUrl);
LPCWSTR lpszHeaders, DWORD dwHeaderLength, LPVOID lpOptional, DWORD
dwOptionalLength, DWORD dwContentLength);
LPHTTPHEADERW HTTP_GetHeader(LPWININETHTTPREQW req, LPCWSTR head) LPHTTPHEADERW HTTP_GetHeader(LPWININETHTTPREQW req, LPCWSTR head)
...@@ -636,7 +634,9 @@ BOOL WINAPI HttpEndRequestW(HINTERNET hRequest, ...@@ -636,7 +634,9 @@ BOOL WINAPI HttpEndRequestW(HINTERNET hRequest,
/* redirects are always GETs */ /* redirects are always GETs */
HeapFree(GetProcessHeap(),0,lpwhr->lpszVerb); HeapFree(GetProcessHeap(),0,lpwhr->lpszVerb);
lpwhr->lpszVerb = WININET_strdupW(szGET); lpwhr->lpszVerb = WININET_strdupW(szGET);
return HTTP_HandleRedirect(lpwhr, szNewLocation, NULL, 0, NULL, 0, 0); rc = HTTP_HandleRedirect(lpwhr, szNewLocation);
if (rc)
rc = HTTP_HttpSendRequestW(lpwhr, NULL, 0, NULL, 0, 0, TRUE);
} }
} }
} }
...@@ -1928,9 +1928,7 @@ BOOL WINAPI HttpSendRequestA(HINTERNET hHttpRequest, LPCSTR lpszHeaders, ...@@ -1928,9 +1928,7 @@ BOOL WINAPI HttpSendRequestA(HINTERNET hHttpRequest, LPCSTR lpszHeaders,
/*********************************************************************** /***********************************************************************
* HTTP_HandleRedirect (internal) * HTTP_HandleRedirect (internal)
*/ */
static BOOL HTTP_HandleRedirect(LPWININETHTTPREQW lpwhr, LPCWSTR lpszUrl, LPCWSTR lpszHeaders, static BOOL HTTP_HandleRedirect(LPWININETHTTPREQW lpwhr, LPCWSTR lpszUrl)
DWORD dwHeaderLength, LPVOID lpOptional, DWORD dwOptionalLength,
DWORD dwContentLength)
{ {
LPWININETHTTPSESSIONW lpwhs = lpwhr->lpHttpSession; LPWININETHTTPSESSIONW lpwhs = lpwhr->lpHttpSession;
LPWININETAPPINFOW hIC = lpwhs->lpAppInfo; LPWININETAPPINFOW hIC = lpwhs->lpAppInfo;
...@@ -2136,8 +2134,7 @@ static BOOL HTTP_HandleRedirect(LPWININETHTTPREQW lpwhr, LPCWSTR lpszUrl, LPCWST ...@@ -2136,8 +2134,7 @@ static BOOL HTTP_HandleRedirect(LPWININETHTTPREQW lpwhr, LPCWSTR lpszUrl, LPCWST
} }
} }
return HTTP_HttpSendRequestW(lpwhr, lpszHeaders, dwHeaderLength, lpOptional, return TRUE;
dwOptionalLength, dwContentLength, TRUE);
} }
/*********************************************************************** /***********************************************************************
...@@ -2225,7 +2222,6 @@ BOOL WINAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeaders, ...@@ -2225,7 +2222,6 @@ BOOL WINAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeaders,
INT responseLen; INT responseLen;
BOOL loop_next = FALSE; BOOL loop_next = FALSE;
INTERNET_ASYNC_RESULT iar; INTERNET_ASYNC_RESULT iar;
LPHTTPHEADERW Host;
TRACE("--> %p\n", lpwhr); TRACE("--> %p\n", lpwhr);
...@@ -2247,14 +2243,16 @@ BOOL WINAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeaders, ...@@ -2247,14 +2243,16 @@ BOOL WINAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeaders,
HTTP_ADDREQ_FLAG_ADD | HTTP_ADDHDR_FLAG_REPLACE); HTTP_ADDREQ_FLAG_ADD | HTTP_ADDHDR_FLAG_REPLACE);
} }
Host = HTTP_GetHeader(lpwhr,szHost);
do do
{ {
DWORD len; DWORD len;
char *ascii_req; char *ascii_req;
TRACE("Going to url %s %s\n", debugstr_w(Host->lpszValue), debugstr_w(lpwhr->lpszPath)); if (TRACE_ON(wininet))
loop_next = FALSE; {
LPHTTPHEADERW Host = HTTP_GetHeader(lpwhr,szHost);
TRACE("Going to url %s %s\n", debugstr_w(Host->lpszValue), debugstr_w(lpwhr->lpszPath));
}
HTTP_FixURL(lpwhr); HTTP_FixURL(lpwhr);
...@@ -2315,8 +2313,30 @@ BOOL WINAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeaders, ...@@ -2315,8 +2313,30 @@ BOOL WINAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeaders,
INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
INTERNET_STATUS_RESPONSE_RECEIVED, &responseLen, INTERNET_STATUS_RESPONSE_RECEIVED, &responseLen,
sizeof(DWORD)); sizeof(DWORD));
HTTP_ProcessHeaders(lpwhr); HTTP_ProcessHeaders(lpwhr);
if (!(lpwhr->hdr.dwFlags & INTERNET_FLAG_NO_AUTO_REDIRECT) && bSuccess)
{
DWORD dwCode,dwCodeLength=sizeof(DWORD),dwIndex=0;
WCHAR szNewLocation[2048];
DWORD dwBufferSize=2048;
if (HTTP_HttpQueryInfoW(lpwhr,HTTP_QUERY_FLAG_NUMBER|HTTP_QUERY_STATUS_CODE,&dwCode,&dwCodeLength,&dwIndex) &&
(dwCode==HTTP_STATUS_REDIRECT || dwCode==HTTP_STATUS_MOVED) &&
HTTP_HttpQueryInfoW(lpwhr,HTTP_QUERY_LOCATION,szNewLocation,&dwBufferSize,&dwIndex))
{
INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
INTERNET_STATUS_REDIRECT, szNewLocation,
dwBufferSize);
bSuccess = HTTP_HandleRedirect(lpwhr, szNewLocation);
if (bSuccess)
{
HeapFree(GetProcessHeap(), 0, requestString);
loop_next = TRUE;
}
}
}
} }
else else
bSuccess = TRUE; bSuccess = TRUE;
...@@ -2328,28 +2348,6 @@ lend: ...@@ -2328,28 +2348,6 @@ lend:
HeapFree(GetProcessHeap(), 0, requestString); HeapFree(GetProcessHeap(), 0, requestString);
/* TODO: send notification for P3P header */ /* TODO: send notification for P3P header */
if(!(lpwhr->hdr.dwFlags & INTERNET_FLAG_NO_AUTO_REDIRECT) && bSuccess && bEndRequest)
{
DWORD dwCode,dwCodeLength=sizeof(DWORD),dwIndex=0;
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(HTTP_HttpQueryInfoW(lpwhr,HTTP_QUERY_LOCATION,szNewLocation,&dwBufferSize,&dwIndex))
{
INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
INTERNET_STATUS_REDIRECT, szNewLocation,
dwBufferSize);
return HTTP_HandleRedirect(lpwhr, szNewLocation, lpszHeaders,
dwHeaderLength, lpOptional, dwOptionalLength,
dwContentLength);
}
}
}
iar.dwResult = (DWORD)bSuccess; iar.dwResult = (DWORD)bSuccess;
iar.dwError = bSuccess ? ERROR_SUCCESS : INTERNET_GetLastError(); iar.dwError = bSuccess ? ERROR_SUCCESS : INTERNET_GetLastError();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment