Jacek Caban : wininet: Moved more redirect URL handling to a helper function and get rid of its maximum size assumption.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu May 19 10:32:06 CDT 2016
Module: wine
Branch: master
Commit: e73f5782ff38dc69e0c16752c8c4a591340ac22d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e73f5782ff38dc69e0c16752c8c4a591340ac22d
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed May 18 18:03:09 2016 +0200
wininet: Moved more redirect URL handling to a helper function and get rid of its maximum size assumption.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/wininet/http.c | 124 +++++++++++++++++++++++-----------------------------
1 file changed, 55 insertions(+), 69 deletions(-)
diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index 889c606..dfe8a39 100644
--- a/dlls/wininet/http.c
+++ b/dlls/wininet/http.c
@@ -203,7 +203,6 @@ static INT HTTP_GetCustomHeaderIndex(http_request_t *req, LPCWSTR lpszField, INT
static BOOL HTTP_DeleteCustomHeader(http_request_t *req, DWORD index);
static LPWSTR HTTP_build_req( LPCWSTR *list, int len );
static DWORD HTTP_HttpQueryInfoW(http_request_t*, DWORD, LPVOID, LPDWORD, LPDWORD);
-static LPWSTR HTTP_GetRedirectURL(http_request_t *req, LPCWSTR lpszUrl);
static UINT HTTP_DecodeBase64(LPCWSTR base64, LPSTR bin);
static BOOL drain_content(http_request_t*,BOOL);
@@ -4048,64 +4047,57 @@ BOOL WINAPI HttpQueryInfoA(HINTERNET hHttpRequest, DWORD dwInfoLevel,
return result;
}
-/***********************************************************************
- * HTTP_GetRedirectURL (internal)
- */
-static LPWSTR HTTP_GetRedirectURL(http_request_t *request, LPCWSTR lpszUrl)
+static WCHAR *get_redirect_url(http_request_t *request)
{
static WCHAR szHttp[] = {'h','t','t','p',0};
static WCHAR szHttps[] = {'h','t','t','p','s',0};
http_session_t *session = request->session;
- URL_COMPONENTSW urlComponents;
- DWORD url_length = 0;
- LPWSTR orig_url;
- LPWSTR combined_url;
+ URL_COMPONENTSW urlComponents = { sizeof(urlComponents) };
+ WCHAR *orig_url = NULL, *redirect_url = NULL, *combined_url = NULL;
+ DWORD url_length = 0, res;
+ BOOL b;
+
+ url_length = 0;
+ res = HTTP_HttpQueryInfoW(request, HTTP_QUERY_LOCATION, redirect_url, &url_length, NULL);
+ if(res == ERROR_INSUFFICIENT_BUFFER) {
+ redirect_url = heap_alloc(url_length);
+ res = HTTP_HttpQueryInfoW(request, HTTP_QUERY_LOCATION, redirect_url, &url_length, NULL);
+ }
+ if(res != ERROR_SUCCESS) {
+ heap_free(redirect_url);
+ return NULL;
+ }
- urlComponents.dwStructSize = sizeof(URL_COMPONENTSW);
urlComponents.lpszScheme = (request->hdr.dwFlags & INTERNET_FLAG_SECURE) ? szHttps : szHttp;
- urlComponents.dwSchemeLength = 0;
urlComponents.lpszHostName = request->server->name;
- urlComponents.dwHostNameLength = 0;
urlComponents.nPort = request->server->port;
urlComponents.lpszUserName = session->userName;
- urlComponents.dwUserNameLength = 0;
- urlComponents.lpszPassword = NULL;
- urlComponents.dwPasswordLength = 0;
urlComponents.lpszUrlPath = request->path;
- urlComponents.dwUrlPathLength = 0;
- urlComponents.lpszExtraInfo = NULL;
- urlComponents.dwExtraInfoLength = 0;
- if (!InternetCreateUrlW(&urlComponents, 0, NULL, &url_length) &&
- (GetLastError() != ERROR_INSUFFICIENT_BUFFER))
- return NULL;
-
- orig_url = heap_alloc(url_length);
+ b = InternetCreateUrlW(&urlComponents, 0, NULL, &url_length);
+ if(!b && GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
+ orig_url = heap_alloc(url_length);
- /* convert from bytes to characters */
- url_length = url_length / sizeof(WCHAR) - 1;
- if (!InternetCreateUrlW(&urlComponents, 0, orig_url, &url_length))
- {
- heap_free(orig_url);
- return NULL;
+ /* convert from bytes to characters */
+ url_length = url_length / sizeof(WCHAR) - 1;
+ b = InternetCreateUrlW(&urlComponents, 0, orig_url, &url_length);
}
- url_length = 0;
- if (!InternetCombineUrlW(orig_url, lpszUrl, NULL, &url_length, ICU_ENCODE_SPACES_ONLY) &&
- (GetLastError() != ERROR_INSUFFICIENT_BUFFER))
- {
- heap_free(orig_url);
- return NULL;
+ if(b) {
+ url_length = 0;
+ b = InternetCombineUrlW(orig_url, redirect_url, NULL, &url_length, ICU_ENCODE_SPACES_ONLY);
+ if(!b && GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
+ combined_url = heap_alloc(url_length * sizeof(WCHAR));
+ b = InternetCombineUrlW(orig_url, redirect_url, combined_url, &url_length, ICU_ENCODE_SPACES_ONLY);
+ if(!b) {
+ heap_free(combined_url);
+ combined_url = NULL;
+ }
+ }
}
- combined_url = heap_alloc(url_length * sizeof(WCHAR));
- if (!InternetCombineUrlW(orig_url, lpszUrl, combined_url, &url_length, ICU_ENCODE_SPACES_ONLY))
- {
- heap_free(orig_url);
- heap_free(combined_url);
- return NULL;
- }
heap_free(orig_url);
+ heap_free(redirect_url);
return combined_url;
}
@@ -5095,14 +5087,15 @@ static DWORD HTTP_HttpSendRequestW(http_request_t *request, LPCWSTR lpszHeaders,
if (!(request->hdr.dwFlags & INTERNET_FLAG_NO_AUTO_REDIRECT) && responseLen)
{
- WCHAR *new_url, szNewLocation[INTERNET_MAX_URL_LENGTH];
- dwBufferSize=sizeof(szNewLocation);
+ WCHAR *new_url;
+
switch(request->status_code) {
case HTTP_STATUS_REDIRECT:
case HTTP_STATUS_MOVED:
case HTTP_STATUS_REDIRECT_KEEP_VERB:
case HTTP_STATUS_REDIRECT_METHOD:
- if(HTTP_HttpQueryInfoW(request,HTTP_QUERY_LOCATION,szNewLocation,&dwBufferSize,NULL) != ERROR_SUCCESS)
+ new_url = get_redirect_url(request);
+ if(!new_url)
break;
if (strcmpW(request->verb, szGET) && strcmpW(request->verb, szHEAD) &&
@@ -5112,17 +5105,13 @@ static DWORD HTTP_HttpSendRequestW(http_request_t *request, LPCWSTR lpszHeaders,
request->verb = heap_strdupW(szGET);
}
http_release_netconn(request, drain_content(request, FALSE));
- if ((new_url = HTTP_GetRedirectURL( request, szNewLocation )))
- {
- INTERNET_SendCallback(&request->hdr, request->hdr.dwContext, INTERNET_STATUS_REDIRECT,
- new_url, (strlenW(new_url) + 1) * sizeof(WCHAR));
- res = HTTP_HandleRedirect(request, new_url);
- if (res == ERROR_SUCCESS)
- {
- heap_free(requestString);
- loop_next = TRUE;
- }
- heap_free( new_url );
+ INTERNET_SendCallback(&request->hdr, request->hdr.dwContext, INTERNET_STATUS_REDIRECT,
+ new_url, (strlenW(new_url) + 1) * sizeof(WCHAR));
+ res = HTTP_HandleRedirect(request, new_url);
+ heap_free(new_url);
+ if (res == ERROR_SUCCESS) {
+ heap_free(requestString);
+ loop_next = TRUE;
}
redirected = TRUE;
}
@@ -5265,7 +5254,6 @@ static void AsyncHttpSendRequestProc(task_header_t *hdr)
static DWORD HTTP_HttpEndRequestW(http_request_t *request, DWORD dwFlags, DWORD_PTR dwContext)
{
- DWORD dwBufferSize;
INT responseLen;
DWORD res = ERROR_SUCCESS;
@@ -5302,9 +5290,10 @@ static DWORD HTTP_HttpEndRequestW(http_request_t *request, DWORD dwFlags, DWORD_
case HTTP_STATUS_MOVED:
case HTTP_STATUS_REDIRECT_METHOD:
case HTTP_STATUS_REDIRECT_KEEP_VERB: {
- WCHAR *new_url, szNewLocation[INTERNET_MAX_URL_LENGTH];
- dwBufferSize=sizeof(szNewLocation);
- if (HTTP_HttpQueryInfoW(request, HTTP_QUERY_LOCATION, szNewLocation, &dwBufferSize, NULL) != ERROR_SUCCESS)
+ WCHAR *new_url;
+
+ new_url = get_redirect_url(request);
+ if(!new_url)
break;
if (strcmpW(request->verb, szGET) && strcmpW(request->verb, szHEAD) &&
@@ -5314,15 +5303,12 @@ static DWORD HTTP_HttpEndRequestW(http_request_t *request, DWORD dwFlags, DWORD_
request->verb = heap_strdupW(szGET);
}
http_release_netconn(request, drain_content(request, FALSE));
- if ((new_url = HTTP_GetRedirectURL( request, szNewLocation )))
- {
- INTERNET_SendCallback(&request->hdr, request->hdr.dwContext, INTERNET_STATUS_REDIRECT,
- new_url, (strlenW(new_url) + 1) * sizeof(WCHAR));
- res = HTTP_HandleRedirect(request, new_url);
- if (res == ERROR_SUCCESS)
- res = HTTP_HttpSendRequestW(request, NULL, 0, NULL, 0, 0, TRUE);
- heap_free( new_url );
- }
+ INTERNET_SendCallback(&request->hdr, request->hdr.dwContext, INTERNET_STATUS_REDIRECT,
+ new_url, (strlenW(new_url) + 1) * sizeof(WCHAR));
+ res = HTTP_HandleRedirect(request, new_url);
+ heap_free(new_url);
+ if (res == ERROR_SUCCESS)
+ res = HTTP_HttpSendRequestW(request, NULL, 0, NULL, 0, 0, TRUE);
}
}
}
More information about the wine-cvs
mailing list