Jacek Caban : wininet: Improved netconn_drain_content.

Alexandre Julliard julliard at winehq.org
Mon Feb 27 15:12:09 CST 2017


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Feb 27 15:20:26 2017 +0100

wininet: Improved netconn_drain_content.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wininet/http.c       | 15 ++++++++------
 dlls/wininet/tests/http.c | 52 +++++++++++++++++++++++++++++++++++++++++------
 2 files changed, 55 insertions(+), 12 deletions(-)

diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index 635b7d6..21b93dd 100644
--- a/dlls/wininet/http.c
+++ b/dlls/wininet/http.c
@@ -2682,17 +2682,20 @@ static BOOL netconn_drain_content(data_stream_t *stream, http_request_t *req)
 {
     netconn_stream_t *netconn_stream = (netconn_stream_t*)stream;
     BYTE buf[1024];
-    int len;
+    int len, res;
+    size_t size;
 
-    if(netconn_end_of_data(stream, req))
-        return TRUE;
+    if(netconn_stream->content_length == ~0u)
+        return FALSE;
 
-    do {
-        if(NETCON_recv(req->netconn, buf, sizeof(buf), FALSE, &len) != ERROR_SUCCESS)
+    while(netconn_stream->content_read < netconn_stream->content_length) {
+        size = min(sizeof(buf), netconn_stream->content_length-netconn_stream->content_read);
+        res = NETCON_recv(req->netconn, buf, size, FALSE, &len);
+        if(res || !len)
             return FALSE;
 
         netconn_stream->content_read += len;
-    }while(netconn_stream->content_read < netconn_stream->content_length);
+    }
 
     return TRUE;
 }
diff --git a/dlls/wininet/tests/http.c b/dlls/wininet/tests/http.c
index fb64e3c..6df30fa 100644
--- a/dlls/wininet/tests/http.c
+++ b/dlls/wininet/tests/http.c
@@ -4652,7 +4652,14 @@ static void _readex_expect_sync_data(unsigned line, HINTERNET req, DWORD flags,
     _readex_expect_sync_data_len(line, req, flags, buf, buf_size, exdata, strlen(exdata));
 }
 
-static void send_response_and_wait(const char *response, BOOL close_connection, INTERNET_BUFFERSW *buf)
+static void close_connection(void)
+{
+    char c;
+    SetEvent(conn_wait_event);
+    recv(server_socket, &c, 1, 0);
+}
+
+static void send_response_and_wait(const char *response, BOOL do_close_connection, INTERNET_BUFFERSW *buf)
 {
     DWORD orig_size = buf->dwBufferLength;
 
@@ -4661,11 +4668,8 @@ static void send_response_and_wait(const char *response, BOOL close_connection,
     if(response)
         server_send_string(response);
 
-    if(close_connection) {
-        char c;
-        SetEvent(conn_wait_event);
-        recv(server_socket, &c, 1, 0);
-    }
+    if(do_close_connection)
+        close_connection();
 
     WaitForSingleObject(hCompleteEvent, INFINITE);
 
@@ -4821,6 +4825,41 @@ static void test_http_read(int port)
     CloseHandle(server_req_rec_event);
 }
 
+static void test_connection_break(int port)
+{
+    INTERNET_BUFFERSW ib;
+    test_request_t req;
+    char buf[24000];
+
+    if(!is_ie7plus)
+        return;
+
+    hCompleteEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
+    conn_wait_event = CreateEventW(NULL, FALSE, FALSE, NULL);
+    server_req_rec_event = CreateEventW(NULL, FALSE, FALSE, NULL);
+
+    memset(&ib, 0, sizeof(ib));
+    ib.dwStructSize = sizeof(ib);
+    ib.lpvBuffer = buf;
+
+    trace("Testing InternetReadFileExW on broken connection...\n");
+
+    open_read_test_request(port, &req,
+                           "HTTP/1.1 200 OK\r\n"
+                           "Server: winetest\r\n"
+                           "Content-Length: 10000\r\n"
+                           "\r\n"
+                           "xx");
+
+    /* close connection and make sure that it's closed on handle release. */
+    close_connection();
+    SET_EXPECT(INTERNET_STATUS_CLOSING_CONNECTION);
+    SET_EXPECT(INTERNET_STATUS_CONNECTION_CLOSED);
+    close_async_handle(req.session, hCompleteEvent, 2);
+    CHECK_NOTIFIED(INTERNET_STATUS_CLOSING_CONNECTION);
+    CHECK_NOTIFIED(INTERNET_STATUS_CONNECTION_CLOSED);
+}
+
 static void test_long_url(int port)
 {
     char long_path[INTERNET_MAX_PATH_LENGTH*2] = "/echo_request?";
@@ -4919,6 +4958,7 @@ static void test_http_connection(void)
     test_basic_auth_credentials_reuse(si.port);
     test_async_read(si.port);
     test_http_read(si.port);
+    test_connection_break(si.port);
     test_long_url(si.port);
     test_remove_dot_segments(si.port);
 




More information about the wine-cvs mailing list