Jacek Caban : wininet: Make sure that we have data buffered before sending INTERNET_STATUS_REQUEST_COMPLETE notification .

Alexandre Julliard julliard at winehq.org
Tue Jan 13 10:56:33 CST 2009


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Jan 13 00:28:25 2009 +0100

wininet: Make sure that we have data buffered before sending INTERNET_STATUS_REQUEST_COMPLETE notification.

---

 dlls/wininet/http.c       |   50 +++++++++++++++++++++++++++++++-------------
 dlls/wininet/tests/http.c |    2 +-
 2 files changed, 36 insertions(+), 16 deletions(-)

diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index d4ea219..cdcf8e1 100644
--- a/dlls/wininet/http.c
+++ b/dlls/wininet/http.c
@@ -1636,6 +1636,29 @@ static DWORD HTTPREQ_SetOption(WININETHANDLEHEADER *hdr, DWORD option, void *buf
     return ERROR_INTERNET_INVALID_OPTION;
 }
 
+static void HTTP_ReceiveRequestData(WININETHTTPREQW *req)
+{
+    INTERNET_ASYNC_RESULT iar;
+    BYTE buffer[4096];
+    BOOL res;
+
+    TRACE("%p\n", req);
+
+    res = NETCON_recv(&req->netConnection, buffer,
+                min(sizeof(buffer), req->dwContentLength - req->dwContentRead),
+                MSG_PEEK, (int *)&iar.dwError);
+
+    if(res) {
+        iar.dwResult = (DWORD_PTR)req->hdr.hInternet;
+    }else {
+        iar.dwResult = 0;
+        iar.dwError = INTERNET_GetLastError();
+    }
+
+    INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, INTERNET_STATUS_REQUEST_COMPLETE, &iar,
+                          sizeof(INTERNET_ASYNC_RESULT));
+}
+
 static DWORD HTTP_Read(WININETHTTPREQW *req, void *buffer, DWORD size, DWORD *read, BOOL sync)
 {
     int bytes_read;
@@ -1847,17 +1870,8 @@ static BOOL HTTPREQ_WriteFile(WININETHANDLEHEADER *hdr, const void *buffer, DWOR
 static void HTTPREQ_AsyncQueryDataAvailableProc(WORKREQUEST *workRequest)
 {
     WININETHTTPREQW *req = (WININETHTTPREQW*)workRequest->hdr;
-    INTERNET_ASYNC_RESULT iar;
-    char buffer[4048];
 
-    TRACE("%p\n", workRequest->hdr);
-
-    iar.dwResult = NETCON_recv(&req->netConnection, buffer,
-                               min(sizeof(buffer), req->dwContentLength - req->dwContentRead),
-                               MSG_PEEK, (int *)&iar.dwError);
-
-    INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, INTERNET_STATUS_REQUEST_COMPLETE, &iar,
-                          sizeof(INTERNET_ASYNC_RESULT));
+    HTTP_ReceiveRequestData(req);
 }
 
 static DWORD HTTPREQ_QueryDataAvailable(WININETHANDLEHEADER *hdr, DWORD *available, DWORD flags, DWORD_PTR ctx)
@@ -3465,12 +3479,18 @@ lend:
 
     /* TODO: send notification for P3P header */
 
-    iar.dwResult = (DWORD_PTR)lpwhr->hdr.hInternet;
-    iar.dwError = bSuccess ? ERROR_SUCCESS : INTERNET_GetLastError();
+    if(lpwhr->lpHttpSession->lpAppInfo->hdr.dwFlags & INTERNET_FLAG_ASYNC) {
+        if(bSuccess) {
+            HTTP_ReceiveRequestData(lpwhr);
+        }else {
+            iar.dwResult = (DWORD_PTR)lpwhr->hdr.hInternet;
+            iar.dwError = INTERNET_GetLastError();
 
-    INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
-                          INTERNET_STATUS_REQUEST_COMPLETE, &iar,
-                          sizeof(INTERNET_ASYNC_RESULT));
+            INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
+                                  INTERNET_STATUS_REQUEST_COMPLETE, &iar,
+                                  sizeof(INTERNET_ASYNC_RESULT));
+        }
+    }
 
     TRACE("<--\n");
     if (bSuccess) INTERNET_SetLastError(ERROR_SUCCESS);
diff --git a/dlls/wininet/tests/http.c b/dlls/wininet/tests/http.c
index 89995bf..34f4708 100644
--- a/dlls/wininet/tests/http.c
+++ b/dlls/wininet/tests/http.c
@@ -367,7 +367,7 @@ static void InternetReadFile_test(int flags)
     if (flags & INTERNET_FLAG_ASYNC)
         CHECK_NOTIFIED(INTERNET_STATUS_REQUEST_COMPLETE);
     else
-        todo_wine CHECK_NOT_NOTIFIED(INTERNET_STATUS_REQUEST_COMPLETE);
+        CHECK_NOT_NOTIFIED(INTERNET_STATUS_REQUEST_COMPLETE);
     /* Sent on WinXP only if first_connection_to_test_url is TRUE, on Win98 always sent */
     CLEAR_NOTIFIED(INTERNET_STATUS_CONNECTING_TO_SERVER);
     CLEAR_NOTIFIED(INTERNET_STATUS_CONNECTED_TO_SERVER);




More information about the wine-cvs mailing list