[PATCH 1/2] winhttp: Semi-stub WinHttpWebSocketClose
Alistair Leslie-Hughes
leslie_alistair at hotmail.com
Tue Jun 23 23:05:51 CDT 2020
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
---
dlls/winhttp/request.c | 36 ++++++++++++++++++++++++++++++++++--
dlls/winhttp/tests/winhttp.c | 5 +++++
2 files changed, 39 insertions(+), 2 deletions(-)
diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c
index 0c038289f8..7ca2dfe864 100644
--- a/dlls/winhttp/request.c
+++ b/dlls/winhttp/request.c
@@ -3146,8 +3146,40 @@ DWORD WINAPI WinHttpWebSocketShutdown( HINTERNET hsocket, USHORT status, void *r
DWORD WINAPI WinHttpWebSocketClose( HINTERNET hsocket, USHORT status, void *reason, DWORD len )
{
- FIXME("%p, %u, %p, %u\n", hsocket, status, reason, len);
- return ERROR_INVALID_PARAMETER;
+ struct socket *sock;
+ DWORD ret;
+ int i;
+ /* FIN and Close (0x88), Mask bit (0x80), 4 bits blank mask. */
+ unsigned char simple[6] = {0x88, 0x80, 0x00, 0x00, 0x00, 0x00};
+
+ FIXME("%p, %u, %p, %u Semi-stub\n", hsocket, status, reason, len);
+
+ if (len > WINHTTP_WEB_SOCKET_MAX_CLOSE_REASON_LENGTH || (!len && reason))
+ return ERROR_INVALID_PARAMETER;
+
+ if (!(sock = (struct socket *)grab_object( hsocket )))
+ {
+ return ERROR_INVALID_HANDLE;
+ }
+
+ if (sock->hdr.type != WINHTTP_HANDLE_TYPE_SOCKET)
+ {
+ ERR("Incorrect handle type\n");
+ release_object( &sock->hdr );
+ return ERROR_WINHTTP_INCORRECT_HANDLE_TYPE;
+ }
+
+ if (len || status != WINHTTP_WEB_SOCKET_SUCCESS_CLOSE_STATUS)
+ {
+ WARN("User supplied error message %d currently not supported.\n", status);
+ }
+
+ i = 0;
+ /* Just send the simplest close message we have to */
+ ret = netconn_send(sock->request->netconn, simple, ARRAY_SIZE(simple), &i);
+
+ release_object( &sock->request->hdr );
+ return ret;
}
DWORD WINAPI WinHttpWebSocketQueryCloseStatus( HINTERNET hsocket, USHORT *status, void *reason, DWORD len,
diff --git a/dlls/winhttp/tests/winhttp.c b/dlls/winhttp/tests/winhttp.c
index be02bbe250..44f156ba39 100644
--- a/dlls/winhttp/tests/winhttp.c
+++ b/dlls/winhttp/tests/winhttp.c
@@ -37,6 +37,7 @@
DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
+static DWORD (WINAPI *pWinHttpWebSocketClose)(HINTERNET,USHORT,void *,DWORD);
static HINTERNET (WINAPI *pWinHttpWebSocketCompleteUpgrade)(HINTERNET,DWORD_PTR);
static BOOL proxy_active(void)
@@ -3248,6 +3249,9 @@ static void test_websocket(int port)
ret = WinHttpCloseHandle(connection);
ok(ret, "got %u\n", GetLastError());
+ ret = pWinHttpWebSocketClose(socket, WINHTTP_WEB_SOCKET_SUCCESS_CLOSE_STATUS, NULL, 0);
+ ok(ret == NO_ERROR, "got %u\n", GetLastError());
+
/* request handle is still valid */
size = sizeof(ctx);
ret = WinHttpQueryOption(request, WINHTTP_OPTION_CONTEXT_VALUE, &ctx, &size);
@@ -4942,6 +4946,7 @@ START_TEST (winhttp)
DWORD ret;
HMODULE mod = GetModuleHandleA("winhttp.dll");
+ pWinHttpWebSocketClose = (void *)GetProcAddress(mod, "WinHttpWebSocketClose");
pWinHttpWebSocketCompleteUpgrade = (void *)GetProcAddress(mod, "WinHttpWebSocketCompleteUpgrade");
test_WinHttpOpenRequest();
--
2.27.0
More information about the wine-devel
mailing list