Hans Leidekker : winhttp: Read any data left in the request buffer for websocket connections.
Alexandre Julliard
julliard at winehq.org
Wed Sep 22 16:04:38 CDT 2021
Module: wine
Branch: master
Commit: f738af16fbdab32d820f9ea0749da3397d5c1995
URL: https://source.winehq.org/git/wine.git/?a=commit;h=f738af16fbdab32d820f9ea0749da3397d5c1995
Author: Hans Leidekker <hans at codeweavers.com>
Date: Wed Sep 22 12:44:13 2021 +0200
winhttp: Read any data left in the request buffer for websocket connections.
Fixes the case where a websocket server sends an unsolicited frame with the upgrade response.
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/winhttp/request.c | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)
diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c
index e6802eaaf70..8e390de549e 100644
--- a/dlls/winhttp/request.c
+++ b/dlls/winhttp/request.c
@@ -3309,9 +3309,20 @@ DWORD WINAPI WinHttpWebSocketSend( HINTERNET hsocket, WINHTTP_WEB_SOCKET_BUFFER_
static DWORD receive_bytes( struct socket *socket, char *buf, DWORD len, DWORD *ret_len )
{
- DWORD err;
- if ((err = netconn_recv( socket->request->netconn, buf, len, 0, (int *)ret_len ))) return err;
- if (*ret_len != len) return ERROR_WINHTTP_INVALID_SERVER_RESPONSE;
+ DWORD err, size = 0, needed = len;
+ char *ptr = buf;
+ int received;
+
+ if (socket->request->read_size)
+ {
+ size = min( needed, socket->request->read_size );
+ memcpy( ptr, socket->request->read_buf + socket->request->read_pos, size );
+ remove_data( socket->request, size );
+ needed -= size;
+ ptr += size;
+ }
+ if ((err = netconn_recv( socket->request->netconn, ptr, needed, 0, &received ))) return err;
+ if ((*ret_len = size + received) != len) return ERROR_WINHTTP_INVALID_SERVER_RESPONSE;
return ERROR_SUCCESS;
}
More information about the wine-cvs
mailing list