wininet: Implement basic non-proxy authentication.
diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index 91736cf..4febb76 100644
--- a/dlls/wininet/http.c
+++ b/dlls/wininet/http.c
@@ -424,9 +424,13 @@
 {
     SECURITY_STATUS sec_status;
     struct HttpAuthInfo *pAuthInfo = lpwhr->pAuthInfo;
+    LPWSTR password = lpwhr->lpHttpSession->lpszPassword;
+    LPWSTR domain_and_username = lpwhr->lpHttpSession->lpszUserName;
 
     TRACE("%s\n", debugstr_w(pszAuthValue));
 
+    if (!domain_and_username) return FALSE;
+
     if (!pAuthInfo)
     {
         TimeStamp exp;
@@ -452,13 +456,13 @@
         if (!is_basic_auth_value(pszAuthValue))
         {
             SEC_WINNT_AUTH_IDENTITY_W nt_auth_identity;
-            WCHAR *user = strchrW(lpwhr->lpHttpSession->lpszUserName, '\\');
-            WCHAR *domain = lpwhr->lpHttpSession->lpszUserName;
+            WCHAR *user = strchrW(domain_and_username, '\\');
+            WCHAR *domain = domain_and_username;
 
             if (user) user++;
             else
             {
-                user = lpwhr->lpHttpSession->lpszUserName;
+                user = domain_and_username;
                 domain = NULL;
             }
             nt_auth_identity.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
@@ -466,7 +470,7 @@
             nt_auth_identity.UserLength = strlenW(nt_auth_identity.User);
             nt_auth_identity.Domain = domain;
             nt_auth_identity.DomainLength = domain ? user - domain - 1 : 0;
-            nt_auth_identity.Password = lpwhr->lpHttpSession->lpszPassword;
+            nt_auth_identity.Password = password;
             nt_auth_identity.PasswordLength = strlenW(nt_auth_identity.Password);
 
             /* FIXME: make sure scheme accepts SEC_WINNT_AUTH_IDENTITY before calling AcquireCredentialsHandle */
@@ -500,8 +504,26 @@
 
     if (is_basic_auth_value(pszAuthValue))
     {
-        FIXME("do basic authentication\n");
-        return FALSE;
+        int userlen = WideCharToMultiByte(CP_UTF8, 0, domain_and_username, lstrlenW(domain_and_username), NULL, 0, NULL, NULL);
+        int passlen = WideCharToMultiByte(CP_UTF8, 0, password, lstrlenW(password), NULL, 0, NULL, NULL);
+        char *auth_data;
+
+        TRACE("basic authentication\n");
+
+        /* length includes a nul terminator, which will be re-used for the ':' */
+        auth_data = HeapAlloc(GetProcessHeap(), 0, userlen + 1 + passlen);
+        if (!auth_data)
+            return FALSE;
+
+        WideCharToMultiByte(CP_UTF8, 0, domain_and_username, -1, auth_data, userlen, NULL, NULL);
+        auth_data[userlen] = ':';
+        WideCharToMultiByte(CP_UTF8, 0, password, -1, &auth_data[userlen+1], passlen, NULL, NULL);
+
+        pAuthInfo->auth_data = auth_data;
+        pAuthInfo->auth_data_len = userlen + 1 + passlen;
+        pAuthInfo->finished = TRUE;
+
+        return TRUE;
     }
     else
     {