From: Paul Gofman pgofman@codeweavers.com
--- dlls/winhttp/request.c | 18 ++++++++++++++---- dlls/winhttp/winhttp_private.h | 2 ++ 2 files changed, 16 insertions(+), 4 deletions(-)
diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c index 33a04829404..a3420507da7 100644 --- a/dlls/winhttp/request.c +++ b/dlls/winhttp/request.c @@ -3186,6 +3186,7 @@ static void socket_destroy( struct object_header *hdr )
netconn_release( socket->netconn ); release_object( &socket->request->hdr ); + free( socket->read_buffer ); free( socket->send_frame_buffer ); free( socket ); } @@ -3266,6 +3267,14 @@ HINTERNET WINAPI WinHttpWebSocketCompleteUpgrade( HINTERNET hrequest, DWORD_PTR netconn_addref( request->netconn ); socket->netconn = request->netconn;
+ if (request->read_size) + { + socket->read_buffer = malloc( request->read_size ); + socket->bytes_in_read_buffer = request->read_size; + memcpy( socket->read_buffer, request->read_buf + request->read_pos, request->read_size ); + request->read_pos = request->read_size = 0; + } + addref_object( &request->hdr ); socket->request = request;
@@ -3668,11 +3677,12 @@ static DWORD receive_bytes( struct socket *socket, char *buf, DWORD len, DWORD * char *ptr = buf; int received;
- if (socket->request->read_size) + if (socket->bytes_in_read_buffer) { - size = min( needed, socket->request->read_size ); - memcpy( ptr, socket->request->read_buf + socket->request->read_pos, size ); - remove_data( socket->request, size ); + size = min( needed, socket->bytes_in_read_buffer ); + memcpy( ptr, socket->read_buffer, size ); + memmove( socket->read_buffer, socket->read_buffer + size, socket->bytes_in_read_buffer - size ); + socket->bytes_in_read_buffer -= size; needed -= size; ptr += size; } diff --git a/dlls/winhttp/winhttp_private.h b/dlls/winhttp/winhttp_private.h index 996b61ac63e..5885f46058d 100644 --- a/dlls/winhttp/winhttp_private.h +++ b/dlls/winhttp/winhttp_private.h @@ -277,6 +277,8 @@ struct socket unsigned int send_remaining_size; unsigned int bytes_in_send_frame_buffer; unsigned int client_buffer_offset; + char *read_buffer; + unsigned int bytes_in_read_buffer; SRWLOCK send_lock; volatile LONG pending_noncontrol_send; enum fragment_type sending_fragment_type;