Rob Shearman : wininet: Change HTTP_EncodeBase64 to operate on a series of bytes, instead of text .

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jan 15 07:43:03 CST 2007


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

Author: Rob Shearman <rob at codeweavers.com>
Date:   Fri Jan 12 19:17:20 2007 -0600

wininet: Change HTTP_EncodeBase64 to operate on a series of bytes,  instead of text.

Change HTTP_EncodeBasicAuth to convert the username and password into 
utf8 before base64 encoding.

---

 dlls/wininet/http.c |   28 +++++++++++++++-------------
 1 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index c4c8fe4..dd56560 100644
--- a/dlls/wininet/http.c
+++ b/dlls/wininet/http.c
@@ -846,22 +846,22 @@ end:
 }
 
 /***********************************************************************
- *  HTTP_DecodeBase64
+ *  HTTP_EncodeBase64
  */
-static UINT HTTP_EncodeBase64( LPCWSTR bin, LPWSTR base64 )
+static UINT HTTP_EncodeBase64( LPCSTR bin, unsigned int len, LPWSTR base64 )
 {
     UINT n = 0, x;
     static LPCSTR HTTP_Base64Enc = 
         "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 
-    while( bin[0] )
+    while( len > 0 )
     {
         /* first 6 bits, all from bin[0] */
         base64[n++] = HTTP_Base64Enc[(bin[0] & 0xfc) >> 2];
         x = (bin[0] & 3) << 4;
 
         /* next 6 bits, 2 from bin[0] and 4 from bin[1] */
-        if( !bin[1] )
+        if( len == 1 )
         {
             base64[n++] = HTTP_Base64Enc[x];
             base64[n++] = '=';
@@ -872,7 +872,7 @@ static UINT HTTP_EncodeBase64( LPCWSTR b
         x = ( bin[1] & 0x0f ) << 2;
 
         /* next 6 bits 4 from bin[1] and 2 from bin[2] */
-        if( !bin[2] )
+        if( len == 2 )
         {
             base64[n++] = HTTP_Base64Enc[x];
             base64[n++] = '=';
@@ -883,6 +883,7 @@ static UINT HTTP_EncodeBase64( LPCWSTR b
         /* last 6 bits, all from bin [2] */
         base64[n++] = HTTP_Base64Enc[ bin[2] & 0x3f ];
         bin += 3;
+        len -= 3;
     }
     base64[n] = 0;
     return n;
@@ -896,12 +897,13 @@ static UINT HTTP_EncodeBase64( LPCWSTR b
 static LPWSTR HTTP_EncodeBasicAuth( LPCWSTR username, LPCWSTR password)
 {
     UINT len;
-    LPWSTR in, out;
+    char *in;
+    LPWSTR out;
     static const WCHAR szBasic[] = {'B','a','s','i','c',' ',0};
-    static const WCHAR szColon[] = {':',0};
 
-    len = lstrlenW( username ) + 1 + lstrlenW ( password ) + 1;
-    in = HeapAlloc( GetProcessHeap(), 0, len*sizeof(WCHAR) );
+    len = WideCharToMultiByte(CP_UTF8, 0, username, lstrlenW(username), NULL, 0, NULL, NULL) +
+        1 + WideCharToMultiByte(CP_UTF8, 0, password, lstrlenW(password), NULL, 0, NULL, NULL);
+    in = HeapAlloc( GetProcessHeap(), 0, (len+1)*sizeof(CHAR) );
     if( !in )
         return NULL;
 
@@ -910,11 +912,11 @@ static LPWSTR HTTP_EncodeBasicAuth( LPCW
     out = HeapAlloc( GetProcessHeap(), 0, len*sizeof(WCHAR) );
     if( out )
     {
-        lstrcpyW( in, username );
-        lstrcatW( in, szColon );
-        lstrcatW( in, password );
+        WideCharToMultiByte(CP_UTF8, 0, username, -1, NULL, 0, NULL, NULL);
+        strcat(in, ":");
+        WideCharToMultiByte(CP_UTF8, 0, password, -1, NULL, 0, NULL, NULL);
         lstrcpyW( out, szBasic );
-        HTTP_EncodeBase64( in, &out[strlenW(out)] );
+        HTTP_EncodeBase64( in, len, &out[strlenW(out)] );
     }
     HeapFree( GetProcessHeap(), 0, in );
 




More information about the wine-cvs mailing list