test2304: verify websocket handling when connection is closed
This commit is contained in:
parent
b716511f0f
commit
86b4b66c54
@ -241,7 +241,7 @@ test2100 \
|
||||
\
|
||||
test2200 test2201 test2202 test2203 test2204 test2205 \
|
||||
\
|
||||
test2300 test2301 test2302 test2303 \
|
||||
test2300 test2301 test2302 test2303 test2304 \
|
||||
\
|
||||
test2500 \
|
||||
\
|
||||
|
||||
68
tests/data/test2304
Normal file
68
tests/data/test2304
Normal file
@ -0,0 +1,68 @@
|
||||
<testcase>
|
||||
<info>
|
||||
<keywords>
|
||||
WebSockets
|
||||
</keywords>
|
||||
</info>
|
||||
|
||||
#
|
||||
# Sends a PING + a 5 byte hello TEXT
|
||||
<reply>
|
||||
<data nocheck="yes" nonewline="yes">
|
||||
HTTP/1.1 101 Switching to WebSockets swsclose
|
||||
Server: test-server/fake
|
||||
Upgrade: websocket
|
||||
Connection: Upgrade
|
||||
Something: else
|
||||
Sec-WebSocket-Accept: HkPsVga7+8LuxM4RGQ5p9tZHeYs=
|
||||
|
||||
%hex[%89%00%81%05hello]hex%
|
||||
</data>
|
||||
# allow upgrade
|
||||
<servercmd>
|
||||
upgrade
|
||||
</servercmd>
|
||||
</reply>
|
||||
|
||||
#
|
||||
# Client-side
|
||||
<client>
|
||||
# require debug for the forced CURL_ENTROPY
|
||||
<features>
|
||||
debug
|
||||
ws
|
||||
</features>
|
||||
<server>
|
||||
http
|
||||
</server>
|
||||
<name>
|
||||
WebSockets curl_ws_recv() with closed connection
|
||||
</name>
|
||||
<tool>
|
||||
lib%TESTNUMBER
|
||||
</tool>
|
||||
<command>
|
||||
ws://%HOSTIP:%HTTPPORT/%TESTNUMBER
|
||||
</command>
|
||||
</client>
|
||||
|
||||
#
|
||||
# PONG with no data and the 32 bit mask
|
||||
#
|
||||
<verify>
|
||||
<protocol nocheck="yes" crlf="yes">
|
||||
GET /%TESTNUMBER HTTP/1.1
|
||||
Host: %HOSTIP:%HTTPPORT
|
||||
User-Agent: websocket/2304
|
||||
Accept: */*
|
||||
Upgrade: websocket
|
||||
Connection: Upgrade
|
||||
Sec-WebSocket-Version: 13
|
||||
Sec-WebSocket-Key: NDMyMTUzMjE2MzIxNzMyMQ==
|
||||
|
||||
</protocol>
|
||||
<stdout mode="text">
|
||||
Connection closed
|
||||
</stdout>
|
||||
</verify>
|
||||
</testcase>
|
||||
@ -69,7 +69,7 @@ noinst_PROGRAMS = chkhostname libauthretry libntlmconnect \
|
||||
lib1915 lib1916 lib1917 lib1918 lib1919 \
|
||||
lib1933 lib1934 lib1935 lib1936 lib1937 lib1938 lib1939 lib1940 \
|
||||
lib1945 lib1946 lib1947 lib1948 lib1955 lib1956 lib1957 lib1958 lib1959 \
|
||||
lib2301 lib2302 \
|
||||
lib2301 lib2302 lib2304 \
|
||||
lib3010 lib3025 lib3026 lib3027 \
|
||||
lib3100 lib3101
|
||||
|
||||
@ -795,6 +795,9 @@ lib2301_LDADD = $(TESTUTIL_LIBS)
|
||||
lib2302_SOURCES = lib2302.c $(SUPPORTFILES)
|
||||
lib2302_LDADD = $(TESTUTIL_LIBS)
|
||||
|
||||
lib2304_SOURCES = lib2304.c $(SUPPORTFILES)
|
||||
lib2304_LDADD = $(TESTUTIL_LIBS)
|
||||
|
||||
lib3010_SOURCES = lib3010.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
|
||||
lib3010_LDADD = $(TESTUTIL_LIBS)
|
||||
lib3010_CPPFLAGS = $(AM_CPPFLAGS)
|
||||
|
||||
127
tests/libtest/lib2304.c
Normal file
127
tests/libtest/lib2304.c
Normal file
@ -0,0 +1,127 @@
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2022, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
* are also available at https://curl.se/docs/copyright.html.
|
||||
*
|
||||
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||
* copies of the Software, and permit persons to whom the Software is
|
||||
* furnished to do so, under the terms of the COPYING file.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
* SPDX-License-Identifier: curl
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
#include "test.h"
|
||||
|
||||
#ifdef USE_WEBSOCKETS
|
||||
|
||||
static int ping(CURL *curl, const char *send_payload)
|
||||
{
|
||||
size_t sent;
|
||||
CURLcode result =
|
||||
curl_ws_send(curl, send_payload, strlen(send_payload), &sent, 0,
|
||||
CURLWS_PING);
|
||||
fprintf(stderr,
|
||||
"ws: curl_ws_send returned %u, sent %u\n", (int)result, (int)sent);
|
||||
|
||||
return (int)result;
|
||||
}
|
||||
|
||||
static int recv_pong(CURL *curl, const char *exected_payload)
|
||||
{
|
||||
size_t rlen;
|
||||
struct curl_ws_frame *meta;
|
||||
char buffer[256];
|
||||
CURLcode result = curl_ws_recv(curl, buffer, sizeof(buffer), &rlen, &meta);
|
||||
if(!result) {
|
||||
if(meta->flags & CURLWS_PONG) {
|
||||
int same = 0;
|
||||
fprintf(stderr, "ws: got PONG back\n");
|
||||
if(rlen == strlen(exected_payload)) {
|
||||
if(!memcmp(exected_payload, buffer, rlen)) {
|
||||
fprintf(stderr, "ws: got the same payload back\n");
|
||||
same = 1;
|
||||
}
|
||||
}
|
||||
if(!same)
|
||||
fprintf(stderr, "ws: did NOT get the same payload back\n");
|
||||
}
|
||||
else {
|
||||
fprintf(stderr, "recv_pong: got %u bytes rflags %x\n", (int)rlen,
|
||||
meta->flags);
|
||||
}
|
||||
}
|
||||
fprintf(stderr, "ws: curl_ws_recv returned %u, received %u\n", (int)result,
|
||||
rlen);
|
||||
return (int)result;
|
||||
}
|
||||
|
||||
/* just close the connection */
|
||||
static void websocket_close(CURL *curl)
|
||||
{
|
||||
size_t sent;
|
||||
CURLcode result =
|
||||
curl_ws_send(curl, "", 0, &sent, 0, CURLWS_CLOSE);
|
||||
fprintf(stderr,
|
||||
"ws: curl_ws_send returned %u, sent %u\n", (int)result, (int)sent);
|
||||
}
|
||||
|
||||
static void websocket(CURL *curl)
|
||||
{
|
||||
int i = 0;
|
||||
fprintf(stderr, "ws: websocket() starts\n");
|
||||
do {
|
||||
fprintf(stderr, "Send ping\n");
|
||||
if(ping(curl, "foobar"))
|
||||
return;
|
||||
fprintf(stderr, "Receive pong\n");
|
||||
if(recv_pong(curl, "foobar")) {
|
||||
printf("Connection closed\n");
|
||||
return;
|
||||
}
|
||||
sleep(2);
|
||||
} while(i++ < 10);
|
||||
websocket_close(curl);
|
||||
}
|
||||
|
||||
int test(char *URL)
|
||||
{
|
||||
CURL *curl;
|
||||
CURLcode res = CURLE_OK;
|
||||
|
||||
global_init(CURL_GLOBAL_ALL);
|
||||
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
curl_easy_setopt(curl, CURLOPT_URL, URL);
|
||||
|
||||
/* use the callback style */
|
||||
curl_easy_setopt(curl, CURLOPT_USERAGENT, "websocket/2304");
|
||||
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
|
||||
curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 2L); /* websocket style */
|
||||
res = curl_easy_perform(curl);
|
||||
fprintf(stderr, "curl_easy_perform() returned %u\n", (int)res);
|
||||
if(res == CURLE_OK)
|
||||
websocket(curl);
|
||||
|
||||
/* always cleanup */
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
curl_global_cleanup();
|
||||
return (int)res;
|
||||
}
|
||||
|
||||
#else
|
||||
NO_SUPPORT_BUILT_IN
|
||||
#endif
|
||||
Loading…
Reference in New Issue
Block a user