Module: wine Branch: master Commit: 50bea867d2ca6d657e3db8a8193204cf83311201 URL: https://gitlab.winehq.org/wine/wine/-/commit/50bea867d2ca6d657e3db8a8193204c...
Author: Paul Gofman pgofman@codeweavers.com Date: Tue Nov 15 18:48:55 2022 -0600
winhttp: Move read buffer to websocket.
---
dlls/winhttp/request.c | 23 +++++++++++++++++++---- dlls/winhttp/winhttp_private.h | 2 ++ 2 files changed, 21 insertions(+), 4 deletions(-)
diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c index 0af71b40fe9..9ff0c9202c5 100644 --- a/dlls/winhttp/request.c +++ b/dlls/winhttp/request.c @@ -3192,6 +3192,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,19 @@ HINTERNET WINAPI WinHttpWebSocketCompleteUpgrade( HINTERNET hrequest, DWORD_PTR socket->hdr.flags = request->connect->hdr.flags & WINHTTP_FLAG_ASYNC; socket->keepalive_interval = 30000; socket->send_buffer_size = request->websocket_send_buffer_size; + if (request->read_size) + { + if (!(socket->read_buffer = malloc( request->read_size ))) + { + ERR( "No memory.\n" ); + free( socket ); + release_object( &request->hdr ); + return NULL; + } + 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; + } InitializeSRWLock( &socket->send_lock ); init_queue( &socket->send_q ); init_queue( &socket->recv_q ); @@ -3674,11 +3688,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 934c9fd4492..9b94ce98de4 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;