Hans Leidekker : winhttp: Add a helper to retrieve the redirect URL.

Alexandre Julliard julliard at winehq.org
Tue Mar 5 12:59:18 CST 2013


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

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Tue Mar  5 12:14:50 2013 +0100

winhttp: Add a helper to retrieve the redirect URL.

---

 dlls/winhttp/request.c |   27 +++++++++++++++++++--------
 1 files changed, 19 insertions(+), 8 deletions(-)

diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c
index 9915a43..12b1f25 100644
--- a/dlls/winhttp/request.c
+++ b/dlls/winhttp/request.c
@@ -1574,28 +1574,39 @@ end:
     return TRUE;
 }
 
+static WCHAR *get_redirect_url( request_t *request, DWORD *len )
+{
+    DWORD size;
+    WCHAR *ret;
+
+    query_headers( request, WINHTTP_QUERY_LOCATION, NULL, NULL, &size, NULL );
+    if (get_last_error() != ERROR_INSUFFICIENT_BUFFER) return FALSE;
+    if (!(ret = heap_alloc( size ))) return NULL;
+    *len = size / sizeof(WCHAR);
+    if (query_headers( request, WINHTTP_QUERY_LOCATION, NULL, ret, &size, NULL )) return ret;
+    heap_free( ret );
+    return NULL;
+}
+
 static BOOL handle_redirect( request_t *request, DWORD status )
 {
     BOOL ret = FALSE;
-    DWORD size, len;
+    DWORD len;
     URL_COMPONENTS uc;
     connect_t *connect = request->connect;
     INTERNET_PORT port;
-    WCHAR *hostname = NULL, *location = NULL;
+    WCHAR *hostname = NULL, *location;
     int index;
 
-    size = 0;
-    query_headers( request, WINHTTP_QUERY_LOCATION, NULL, NULL, &size, NULL );
-    if (!(location = heap_alloc( size ))) return FALSE;
-    if (!query_headers( request, WINHTTP_QUERY_LOCATION, NULL, location, &size, NULL )) goto end;
+    if (!(location = get_redirect_url( request, &len ))) return FALSE;
 
-    send_callback( &request->hdr, WINHTTP_CALLBACK_STATUS_REDIRECT, location, size / sizeof(WCHAR) + 1 );
+    send_callback( &request->hdr, WINHTTP_CALLBACK_STATUS_REDIRECT, location, len + 1 );
 
     memset( &uc, 0, sizeof(uc) );
     uc.dwStructSize = sizeof(uc);
     uc.dwSchemeLength = uc.dwHostNameLength = uc.dwUrlPathLength = uc.dwExtraInfoLength = ~0u;
 
-    if (!WinHttpCrackUrl( location, size / sizeof(WCHAR), 0, &uc )) /* assume relative redirect */
+    if (!WinHttpCrackUrl( location, len, 0, &uc )) /* assume relative redirect */
     {
         WCHAR *path, *p;
 




More information about the wine-cvs mailing list