[2/3] wininet: Start the first chunk as soon as we have some data.

Jacek Caban jacek at codeweavers.com
Thu Jul 21 07:25:07 CDT 2016


Hi Hans,

On 19.07.2016 11:27, Hans Leidekker wrote:
> Signed-off-by: Hans Leidekker <hans at codeweavers.com>
> ---
>  dlls/wininet/http.c | 7 +++++++
>  1 file changed, 7 insertions(+)
>
> diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
> index 2c62d97..c4cf66b 100644
> --- a/dlls/wininet/http.c
> +++ b/dlls/wininet/http.c
> @@ -2921,6 +2921,7 @@ static DWORD set_content_length(http_request_t *request)
>          !strcmpiW(encoding, szChunked))
>      {
>          chunked_stream_t *chunked_stream;
> +        DWORD res;
>  
>          chunked_stream = heap_alloc(sizeof(*chunked_stream));
>          if(!chunked_stream)
> @@ -2935,6 +2936,12 @@ static DWORD set_content_length(http_request_t *request)
>              memcpy(chunked_stream->buf, request->read_buf+request->read_pos, request->read_size);
>              chunked_stream->buf_size = request->read_size;
>              request->read_size = request->read_pos = 0;
> +
> +            res = start_next_chunk(chunked_stream, request);
> +            if (res != ERROR_SUCCESS) {
> +                heap_free(chunked_stream);
> +                return res;
> +            }

It seems to me that you're fixing a problem is a wrong place.
start_next_chunk should be called by HTTP_ReceiveRequestData via
refill_read_buffer anyway. I'd suggest to investigate why it doesn't
work in your case.

Also, see the attached test. We shouldn't need any chunk to complete
requests. It's an existing problem in current Wine, which may be
unrelated to your problem, but having such blocking calls here is not a
step in the right direction.

Thanks,
Jacek
-------------- next part --------------
diff --git a/dlls/wininet/tests/http.c b/dlls/wininet/tests/http.c
index e84ffa3..c36f67e 100644
--- a/dlls/wininet/tests/http.c
+++ b/dlls/wininet/tests/http.c
@@ -4718,6 +4718,20 @@ static void test_http_read(int port)
 
     close_async_handle(req.session, hCompleteEvent, 2);
 
+    open_read_test_request(port, &req,
+                           "HTTP/1.1 200 OK\r\n"
+                           "Server: winetest\r\n"
+                           "Transfer-Encoding: chunked\r\n"
+                           "\r\n");
+    readex_expect_async(req.request, IRF_NO_WAIT, &ib, sizeof(buf));
+    send_response_and_wait("9\r\n123456789", FALSE, &ib);
+    readex_expect_sync_data(req.request, IRF_NO_WAIT, &ib, sizeof(buf), "123456789");
+    readex_expect_async(req.request, IRF_NO_WAIT, &ib, sizeof(buf));
+    send_response_and_wait("\r\n1\r\nx\r\n0\r\n\r\n", TRUE, &ib);
+    readex_expect_sync_data(req.request, IRF_NO_WAIT, &ib, sizeof(buf), "x");
+    readex_expect_sync_data(req.request, IRF_NO_WAIT, &ib, sizeof(buf), "");
+    close_async_handle(req.session, hCompleteEvent, 2);
+
     CloseHandle(hCompleteEvent);
     CloseHandle(conn_wait_event);
     CloseHandle(server_req_rec_event);


More information about the wine-devel mailing list