my $tlist = "";
foreach my $src (@src) {
- if($src =~ /([a-z0-9]+)\.c$/) {
+ if($src =~ /([a-z0-9_]+)\.c$/) {
my $name = $1;
if($embed) {
my $fn = $src;
function(curl_add_pytests _targetname _test_flags)
set(_depends "")
if(NOT _targetname STREQUAL "pytest-ci")
- set(_depends "test-http-clients")
+ set(_depends "http-clients")
endif()
string(REPLACE " " ";" _test_flags_list "${_test_flags}")
add_custom_target(${_targetname}
#
# SPDX-License-Identifier: curl
-h2-pausing
-h2-serverpush
-h2-upgrade-extreme
-hx-download
-hx-upload
-tls-session-reuse
-upload-pausing
-ws-data
-ws-pingpong
+clients
+clients.c
# SPDX-License-Identifier: curl
#
###########################################################################
-
-add_custom_target(test-http-clients)
-
-# Get check_PROGRAMS variable
+# Get BUNDLE, BUNDLE_SRC, FIRSTFILES, TESTFILES variables
curl_transform_makefile_inc("Makefile.inc" "${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
include("${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake")
-foreach(_target IN LISTS check_PROGRAMS)
- set(_target_name "curlt-client-${_target}")
- add_executable(${_target_name} EXCLUDE_FROM_ALL "${_target}.c")
- add_dependencies(testdeps ${_target_name})
- add_dependencies(test-http-clients ${_target_name})
- target_include_directories(${_target_name} PRIVATE
- "${PROJECT_BINARY_DIR}/lib" # for "curl_config.h"
- "${PROJECT_SOURCE_DIR}/lib" # for "curl_setup.h"
- )
- target_link_libraries(${_target_name} ${LIB_SELECTED} ${CURL_LIBS})
- target_compile_definitions(${_target_name} PRIVATE "CURL_NO_OLDIES" "$<$<BOOL:MSVC>:_CRT_SECURE_NO_DEPRECATE>")
- if(LIB_SELECTED STREQUAL LIB_STATIC AND WIN32)
- set_property(TARGET ${_target_name} APPEND PROPERTY COMPILE_DEFINITIONS "CURL_STATICLIB")
- endif()
- set_target_properties(${_target_name} PROPERTIES OUTPUT_NAME "${_target}" ROJECT_LABEL "Test client ${_target}"
- UNITY_BUILD OFFP)
-endforeach()
+add_custom_command(
+ OUTPUT "${BUNDLE_SRC}"
+ COMMAND ${PERL_EXECUTABLE} "${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl" --test ${TESTFILES}
+ ${CURL_MK_UNITY_OPTION} --srcdir "${CMAKE_CURRENT_SOURCE_DIR}" > "${BUNDLE_SRC}"
+ DEPENDS
+ "${PROJECT_SOURCE_DIR}/scripts/mk-unity.pl" "${CMAKE_CURRENT_SOURCE_DIR}/Makefile.inc" ${FIRSTFILES} ${TESTFILES}
+ VERBATIM)
+
+add_executable(http-clients EXCLUDE_FROM_ALL "${BUNDLE_SRC}")
+add_dependencies(testdeps http-clients)
+target_include_directories(http-clients PRIVATE
+ "${PROJECT_BINARY_DIR}/lib" # for "curl_config.h"
+ "${CMAKE_CURRENT_SOURCE_DIR}" # for "first.h"
+)
+target_link_libraries(http-clients ${LIB_SELECTED} ${CURL_LIBS})
+set_property(TARGET http-clients APPEND PROPERTY COMPILE_DEFINITIONS "CURL_NO_OLDIES"
+ "$<$<BOOL:MSVC>:_CRT_SECURE_NO_DEPRECATE>")
+if(LIB_SELECTED STREQUAL LIB_STATIC AND WIN32)
+ set_property(TARGET http-clients APPEND PROPERTY COMPILE_DEFINITIONS "CURL_STATICLIB")
+endif()
+set_target_properties(http-clients PROPERTIES OUTPUT_NAME "${BUNDLE}" PROJECT_LABEL "Test ${BUNDLE}" UNITY_BUILD OFF)
# SPDX-License-Identifier: curl
#
###########################################################################
-
AUTOMAKE_OPTIONS = foreign nostdinc
-EXTRA_DIST = CMakeLists.txt
-
# Specify our include paths here, and do it relative to $(top_srcdir) and
# $(top_builddir), to ensure that these paths which belong to the library
# being currently built and tested are searched before the library which
# might possibly already be installed in the system.
#
# $(top_srcdir)/include is for libcurl's external include files
+# $(top_builddir)/lib is for libcurl's generated lib/curl_config.h file
-AM_CPPFLAGS = -I$(top_srcdir)/include \
- -I$(top_builddir)/lib \
- -I$(top_srcdir)/lib
+AM_CPPFLAGS = -I$(top_srcdir)/include \
+ -I$(top_builddir)/lib \
+ -I$(srcdir)
-LIBDIR = $(top_builddir)/lib
+# Get BUNDLE, BUNDLE_SRC, FIRSTFILES, TESTFILES variables
+include Makefile.inc
-# Avoid libcurl obsolete stuff
-AM_CPPFLAGS += -DCURL_NO_OLDIES
+EXTRA_DIST = CMakeLists.txt $(FIRSTFILES) $(TESTFILES)
+
+CFLAGS += @CURL_CFLAG_EXTRAS@
+
+# Prevent LIBS from being used for all link targets
+LIBS = $(BLANK_AT_MAKETIME)
+
+LIBDIR = $(top_builddir)/lib
if USE_CPPFLAG_CURL_STATICLIB
AM_CPPFLAGS += -DCURL_STATICLIB
AM_CPPFLAGS += -DWIN32_LEAN_AND_MEAN
endif
-# Prevent LIBS from being used for all link targets
-LIBS = $(BLANK_AT_MAKETIME)
-
-# Dependencies
-LDADD = $(LIBDIR)/libcurl.la @LIBCURL_PC_LIBS_PRIVATE@
+AM_CPPFLAGS += -DCURL_NO_OLDIES
-# This might hold -Werror
-CFLAGS += @CURL_CFLAG_EXTRAS@
+$(BUNDLE_SRC): $(top_srcdir)/scripts/mk-unity.pl Makefile.inc $(FIRSTFILES) $(TESTFILES)
+ @PERL@ $(top_srcdir)/scripts/mk-unity.pl --test $(TESTFILES) > $(BUNDLE_SRC)
-# Get check_PROGRAMS variable
-include Makefile.inc
-
-all: $(check_PROGRAMS)
+noinst_PROGRAMS = $(BUNDLE)
+nodist_clients_SOURCES = $(BUNDLE_SRC)
+clients_SOURCES =
+clients_LDADD = $(LIBDIR)/libcurl.la @LIBCURL_PC_LIBS_PRIVATE@
+clients_CFLAGS = $(AM_CFLAGS)
+CLEANFILES = $(BUNDLE_SRC)
CHECKSRC = $(CS_$(V))
CS_0 = @echo " RUN " $@;
CS_1 =
CS_ = $(CS_0)
+# ignore generated C files since they play by slightly different rules!
checksrc:
- $(CHECKSRC)(@PERL@ $(top_srcdir)/scripts/checksrc.pl -D$(srcdir) $(srcdir)/*.c)
+ $(CHECKSRC)(@PERL@ $(top_srcdir)/scripts/checksrc.pl -D$(srcdir) \
+ -W$(srcdir)/$(BUNDLE_SRC) \
+ $(srcdir)/*.[ch])
if NOT_CURL_CI
all-local: checksrc
endif
+
+clean-local:
+ rm -f $(BUNDLE)
###########################################################################
# Shared between CMakeLists.txt and Makefile.am
-check_PROGRAMS = \
- h2-pausing \
- h2-serverpush \
- h2-upgrade-extreme \
- hx-download \
- hx-upload \
- tls-session-reuse \
- upload-pausing \
- ws-data \
- ws-pingpong
+BUNDLE = clients
+BUNDLE_SRC = clients.c
+
+# Files referenced from the bundle source
+FIRSTFILES = first.c first.h
+
+# All test clients
+TESTFILES = \
+ h2_pausing.c \
+ h2_serverpush.c \
+ h2_upgrade_extreme.c \
+ hx_download.c \
+ hx_upload.c \
+ tls_session_reuse.c \
+ upload_pausing.c \
+ ws_data.c \
+ ws_pingpong.c
--- /dev/null
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 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
+ *
+ ***************************************************************************/
+
+int main(int argc, char **argv)
+{
+ entry_func_t entry_func;
+ char *entry_name;
+ size_t tmp;
+
+ if(argc < 2) {
+ fprintf(stderr, "Pass clientname as first argument\n");
+ return 1;
+ }
+
+ entry_name = argv[1];
+ entry_func = NULL;
+ for(tmp = 0; tmp < CURL_ARRAYSIZE(s_entries); ++tmp) {
+ if(strcmp(entry_name, s_entries[tmp].name) == 0) {
+ entry_func = s_entries[tmp].ptr;
+ break;
+ }
+ }
+
+ if(!entry_func) {
+ fprintf(stderr, "Test '%s' not found.\n", entry_name);
+ return 99;
+ }
+
+ return entry_func(argc - 1, argv + 1);
+}
--- /dev/null
+#ifndef HEADER_CLIENT_FIRST_H
+#define HEADER_CLIENT_FIRST_H
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 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
+ *
+ ***************************************************************************/
+#ifdef HAVE_CONFIG_H
+#include "curl_config.h" /* for CURL_DISABLE_WEBSOCKETS */
+#endif
+
+typedef int (*entry_func_t)(int, char **);
+
+struct entry_s {
+ const char *name;
+ entry_func_t ptr;
+};
+
+#include <curl/curl.h>
+
+#include <stdio.h> /* for fprintf() */
+#include <stdlib.h> /* for calloc(), free(), strtol() */
+#include <string.h> /* for strchr(), strcmp() */
+
+#ifdef _WIN32
+#include <windows.h> /* for Sleep() */
+#define strdup _strdup
+#else
+#include <sys/time.h> /* for usleep() */
+#include <unistd.h> /* for usleep() */
+#endif
+
+#ifdef __TANDEM
+#include <cextdecs.h(PROCESS_DELAY_)> /* for usleep() logic */
+#endif
+
+#if defined(_MSC_VER) && (_MSC_VER <= 1700)
+#pragma warning(disable:4127) /* "conditional expression is constant" */
+#endif
+
+#define CURL_ARRAYSIZE(A) (sizeof(A)/sizeof((A)[0]))
+
+#define ERR() \
+ do { \
+ fprintf(stderr, "something unexpected went wrong - bailing out!\n"); \
+ return 2; \
+ } while(0)
+
+static void log_line_start(FILE *log, const char *idsbuf, curl_infotype type)
+{
+ /*
+ * This is the trace look that is similar to what libcurl makes on its
+ * own.
+ */
+ static const char * const s_infotype[] = {
+ "* ", "< ", "> ", "{ ", "} ", "{ ", "} "
+ };
+ if(idsbuf && *idsbuf)
+ fprintf(log, "%s%s", idsbuf, s_infotype[type]);
+ else
+ fputs(s_infotype[type], log);
+}
+
+#define TRC_IDS_FORMAT_IDS_1 "[%" CURL_FORMAT_CURL_OFF_T "-x] "
+#define TRC_IDS_FORMAT_IDS_2 "[%" CURL_FORMAT_CURL_OFF_T "-%" \
+ CURL_FORMAT_CURL_OFF_T "] "
+/*
+** callback for CURLOPT_DEBUGFUNCTION
+*/
+static int debug_cb(CURL *handle, curl_infotype type,
+ char *data, size_t size, void *userdata)
+{
+ FILE *output = stderr;
+ static int newl = 0;
+ static int traced_data = 0;
+ char idsbuf[60];
+ curl_off_t xfer_id, conn_id;
+
+ (void)handle; /* not used */
+ (void)userdata;
+
+ if(!curl_easy_getinfo(handle, CURLINFO_XFER_ID, &xfer_id) && xfer_id >= 0) {
+ if(!curl_easy_getinfo(handle, CURLINFO_CONN_ID, &conn_id) &&
+ conn_id >= 0) {
+ curl_msnprintf(idsbuf, sizeof(idsbuf), TRC_IDS_FORMAT_IDS_2, xfer_id,
+ conn_id);
+ }
+ else {
+ curl_msnprintf(idsbuf, sizeof(idsbuf), TRC_IDS_FORMAT_IDS_1, xfer_id);
+ }
+ }
+ else
+ idsbuf[0] = 0;
+
+ switch(type) {
+ case CURLINFO_HEADER_OUT:
+ if(size > 0) {
+ size_t st = 0;
+ size_t i;
+ for(i = 0; i < size - 1; i++) {
+ if(data[i] == '\n') { /* LF */
+ if(!newl) {
+ log_line_start(output, idsbuf, type);
+ }
+ (void)fwrite(data + st, i - st + 1, 1, output);
+ st = i + 1;
+ newl = 0;
+ }
+ }
+ if(!newl)
+ log_line_start(output, idsbuf, type);
+ (void)fwrite(data + st, i - st + 1, 1, output);
+ }
+ newl = (size && (data[size - 1] != '\n')) ? 1 : 0;
+ traced_data = 0;
+ break;
+ case CURLINFO_TEXT:
+ case CURLINFO_HEADER_IN:
+ if(!newl)
+ log_line_start(output, idsbuf, type);
+ (void)fwrite(data, size, 1, output);
+ newl = (size && (data[size - 1] != '\n')) ? 1 : 0;
+ traced_data = 0;
+ break;
+ case CURLINFO_DATA_OUT:
+ case CURLINFO_DATA_IN:
+ case CURLINFO_SSL_DATA_IN:
+ case CURLINFO_SSL_DATA_OUT:
+ if(!traced_data) {
+ if(!newl)
+ log_line_start(output, idsbuf, type);
+ fprintf(output, "[%ld bytes data]\n", (long)size);
+ newl = 0;
+ traced_data = 1;
+ }
+ break;
+ default: /* nada */
+ newl = 0;
+ traced_data = 1;
+ break;
+ }
+
+ return 0;
+}
+
+static void dump(const char *text, unsigned char *ptr, size_t size, char nohex)
+{
+ size_t i;
+ size_t c;
+
+ unsigned int width = 0x10;
+
+ if(nohex)
+ /* without the hex output, we can fit more on screen */
+ width = 0x40;
+
+ fprintf(stderr, "%s, %lu bytes (0x%lx)\n",
+ text, (unsigned long)size, (unsigned long)size);
+
+ for(i = 0; i < size; i += width) {
+
+ fprintf(stderr, "%4.4lx: ", (unsigned long)i);
+
+ if(!nohex) {
+ /* hex not disabled, show it */
+ for(c = 0; c < width; c++)
+ if(i + c < size)
+ fprintf(stderr, "%02x ", ptr[i + c]);
+ else
+ fputs(" ", stderr);
+ }
+
+ for(c = 0; (c < width) && (i + c < size); c++) {
+ /* check for 0D0A; if found, skip past and start a new line of output */
+ if(nohex && (i + c + 1 < size) && ptr[i + c] == 0x0D &&
+ ptr[i + c + 1] == 0x0A) {
+ i += (c + 2 - width);
+ break;
+ }
+ fprintf(stderr, "%c",
+ (ptr[i + c] >= 0x20) && (ptr[i + c] < 0x80) ? ptr[i + c] : '.');
+ /* check again for 0D0A, to avoid an extra \n if it's at width */
+ if(nohex && (i + c + 2 < size) && ptr[i + c + 1] == 0x0D &&
+ ptr[i + c + 2] == 0x0A) {
+ i += (c + 3 - width);
+ break;
+ }
+ }
+ fputc('\n', stderr); /* newline */
+ }
+}
+
+#ifndef CURL_DISABLE_WEBSOCKETS
+/* 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);
+}
+#endif /* CURL_DISABLE_WEBSOCKETS */
+
+static int coptind;
+static char *coptarg;
+
+static int cgetopt(int argc, char * const argv[], const char *optstring)
+{
+ static int optpos = 1;
+ int coptopt;
+ char *arg;
+
+ if(coptind == 0) { /* Reset? */
+ coptind = !!argc;
+ optpos = 1;
+ }
+
+ arg = argv[coptind];
+ if(arg && strcmp(arg, "--") == 0) {
+ coptind++;
+ return -1;
+ }
+ else if(!arg || arg[0] != '-') {
+ return -1;
+ }
+ else {
+ const char *opt = strchr(optstring, arg[optpos]);
+ coptopt = arg[optpos];
+ if(!opt) {
+ if(!arg[++optpos]) {
+ coptind++;
+ optpos = 1;
+ }
+ return '?';
+ }
+ else if(opt[1] == ':') {
+ if(arg[optpos + 1]) {
+ coptarg = arg + optpos + 1;
+ coptind++;
+ optpos = 1;
+ return coptopt;
+ }
+ else if(argv[coptind + 1]) {
+ coptarg = argv[coptind + 1];
+ coptind += 2;
+ optpos = 1;
+ return coptopt;
+ }
+ else {
+ if(!arg[++optpos]) {
+ coptind++;
+ optpos = 1;
+ }
+ return *optstring == ':' ? ':' : '?';
+ }
+ }
+ else {
+ if(!arg[++optpos]) {
+ coptind++;
+ optpos = 1;
+ }
+ return coptopt;
+ }
+ }
+}
+
+#endif /* HEADER_CLIENT_FIRST_H */
* SPDX-License-Identifier: curl
*
***************************************************************************/
-/* <DESC>
- * HTTP/2 download pausing
- * </DESC>
- */
/* This is based on the PoC client of issue #11982
*/
-#include <curl/curl.h>
-
#include <assert.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#ifndef _MSC_VER
-/* somewhat Unix-specific */
-#include <unistd.h> /* getopt() */
-#endif
-
-#ifndef _MSC_VER
-#define HANDLECOUNT 2
-
-static void log_line_start(FILE *log, const char *idsbuf, curl_infotype type)
-{
- /*
- * This is the trace look that is similar to what libcurl makes on its
- * own.
- */
- static const char * const s_infotype[] = {
- "* ", "< ", "> ", "{ ", "} ", "{ ", "} "
- };
- if(idsbuf && *idsbuf)
- fprintf(log, "%s%s", idsbuf, s_infotype[type]);
- else
- fputs(s_infotype[type], log);
-}
-
-#define TRC_IDS_FORMAT_IDS_1 "[%" CURL_FORMAT_CURL_OFF_T "-x] "
-#define TRC_IDS_FORMAT_IDS_2 "[%" CURL_FORMAT_CURL_OFF_T "-%" \
- CURL_FORMAT_CURL_OFF_T "] "
-/*
-** callback for CURLOPT_DEBUGFUNCTION
-*/
-static int debug_cb(CURL *handle, curl_infotype type,
- char *data, size_t size,
- void *userdata)
-{
- FILE *output = stderr;
- static int newl = 0;
- static int traced_data = 0;
- char idsbuf[60];
- curl_off_t xfer_id, conn_id;
-
- (void)handle; /* not used */
- (void)userdata;
-
- if(!curl_easy_getinfo(handle, CURLINFO_XFER_ID, &xfer_id) && xfer_id >= 0) {
- if(!curl_easy_getinfo(handle, CURLINFO_CONN_ID, &conn_id) &&
- conn_id >= 0) {
- curl_msnprintf(idsbuf, sizeof(idsbuf), TRC_IDS_FORMAT_IDS_2, xfer_id,
- conn_id);
- }
- else {
- curl_msnprintf(idsbuf, sizeof(idsbuf), TRC_IDS_FORMAT_IDS_1, xfer_id);
- }
- }
- else
- idsbuf[0] = 0;
- switch(type) {
- case CURLINFO_HEADER_OUT:
- if(size > 0) {
- size_t st = 0;
- size_t i;
- for(i = 0; i < size - 1; i++) {
- if(data[i] == '\n') { /* LF */
- if(!newl) {
- log_line_start(output, idsbuf, type);
- }
- (void)fwrite(data + st, i - st + 1, 1, output);
- st = i + 1;
- newl = 0;
- }
- }
- if(!newl)
- log_line_start(output, idsbuf, type);
- (void)fwrite(data + st, i - st + 1, 1, output);
- }
- newl = (size && (data[size - 1] != '\n')) ? 1 : 0;
- traced_data = 0;
- break;
- case CURLINFO_TEXT:
- case CURLINFO_HEADER_IN:
- if(!newl)
- log_line_start(output, idsbuf, type);
- (void)fwrite(data, size, 1, output);
- newl = (size && (data[size - 1] != '\n')) ? 1 : 0;
- traced_data = 0;
- break;
- case CURLINFO_DATA_OUT:
- case CURLINFO_DATA_IN:
- case CURLINFO_SSL_DATA_IN:
- case CURLINFO_SSL_DATA_OUT:
- if(!traced_data) {
- if(!newl)
- log_line_start(output, idsbuf, type);
- fprintf(output, "[%ld bytes data]\n", (long)size);
- newl = 0;
- traced_data = 1;
- }
- break;
- default: /* nada */
- newl = 0;
- traced_data = 1;
- break;
- }
-
- return 0;
-}
-
-static void usage(const char *msg)
+static void usage_h2_pausing(const char *msg)
{
if(msg)
fprintf(stderr, "%s\n", msg);
struct handle
{
- int idx;
+ size_t idx;
int paused;
int resumed;
int errored;
if(curl_easy_getinfo(handle->h, CURLINFO_CONTENT_LENGTH_DOWNLOAD_T,
&totalsize) == CURLE_OK)
fprintf(stderr, "INFO: [%d] write, Content-Length %"CURL_FORMAT_CURL_OFF_T
- "\n", handle->idx, totalsize);
+ "\n", (int)handle->idx, totalsize);
if(!handle->resumed) {
++handle->paused;
fprintf(stderr, "INFO: [%d] write, PAUSING %d time on %lu bytes\n",
- handle->idx, handle->paused, (long)realsize);
+ (int)handle->idx, handle->paused, (long)realsize);
assert(handle->paused == 1);
return CURL_WRITEFUNC_PAUSE;
}
if(handle->fail_write) {
++handle->errored;
fprintf(stderr, "INFO: [%d] FAIL write of %lu bytes, %d time\n",
- handle->idx, (long)realsize, handle->errored);
+ (int)handle->idx, (long)realsize, handle->errored);
return CURL_WRITEFUNC_ERROR;
}
fprintf(stderr, "INFO: [%d] write, accepting %lu bytes\n",
- handle->idx, (long)realsize);
+ (int)handle->idx, (long)realsize);
return realsize;
}
-#define ERR() \
- do { \
- fprintf(stderr, "something unexpected went wrong - bailing out!\n"); \
- return 2; \
- } while(0)
-
-#endif /* !_MSC_VER */
-
-int main(int argc, char *argv[])
+static int test_h2_pausing(int argc, char *argv[])
{
-#ifndef _MSC_VER
- struct handle handles[HANDLECOUNT];
+ struct handle handles[2];
CURLM *multi_handle;
- int i, still_running = 1, msgs_left, numfds;
+ int still_running = 1, msgs_left, numfds;
+ size_t i;
CURLMsg *msg;
int rounds = 0;
int rc = 0;
int http_version = CURL_HTTP_VERSION_2_0;
int ch;
- while((ch = getopt(argc, argv, "hV:")) != -1) {
+ while((ch = cgetopt(argc, argv, "hV:")) != -1) {
switch(ch) {
case 'h':
- usage(NULL);
+ usage_h2_pausing(NULL);
return 2;
case 'V': {
- if(!strcmp("http/1.1", optarg))
+ if(!strcmp("http/1.1", coptarg))
http_version = CURL_HTTP_VERSION_1_1;
- else if(!strcmp("h2", optarg))
+ else if(!strcmp("h2", coptarg))
http_version = CURL_HTTP_VERSION_2_0;
- else if(!strcmp("h3", optarg))
+ else if(!strcmp("h3", coptarg))
http_version = CURL_HTTP_VERSION_3ONLY;
else {
- usage("invalid http version");
+ usage_h2_pausing("invalid http version");
return 1;
}
break;
}
default:
- usage("invalid option");
- return 1;
+ usage_h2_pausing("invalid option");
+ return 1;
}
}
- argc -= optind;
- argv += optind;
+ argc -= coptind;
+ argv += coptind;
if(argc != 1) {
fprintf(stderr, "ERROR: need URL as argument\n");
host, port);
resolve = curl_slist_append(resolve, resolve_buf);
- for(i = 0; i < HANDLECOUNT; i++) {
+ for(i = 0; i < CURL_ARRAYSIZE(handles); i++) {
handles[i].idx = i;
handles[i].paused = 0;
handles[i].resumed = 0;
if(!multi_handle)
ERR();
- for(i = 0; i < HANDLECOUNT; i++) {
+ for(i = 0; i < CURL_ARRAYSIZE(handles); i++) {
if(curl_multi_add_handle(multi_handle, handles[i].h) != CURLM_OK)
ERR();
}
if(!still_running) {
int as_expected = 1;
fprintf(stderr, "INFO: no more handles running\n");
- for(i = 0; i < HANDLECOUNT; i++) {
+ for(i = 0; i < CURL_ARRAYSIZE(handles); i++) {
if(!handles[i].paused) {
- fprintf(stderr, "ERROR: [%d] NOT PAUSED\n", i);
+ fprintf(stderr, "ERROR: [%d] NOT PAUSED\n", (int)i);
as_expected = 0;
}
else if(handles[i].paused != 1) {
fprintf(stderr, "ERROR: [%d] PAUSED %d times!\n",
- i, handles[i].paused);
+ (int)i, handles[i].paused);
as_expected = 0;
}
else if(!handles[i].resumed) {
- fprintf(stderr, "ERROR: [%d] NOT resumed!\n", i);
+ fprintf(stderr, "ERROR: [%d] NOT resumed!\n", (int)i);
as_expected = 0;
}
else if(handles[i].errored != 1) {
fprintf(stderr, "ERROR: [%d] NOT errored once, %d instead!\n",
- i, handles[i].errored);
+ (int)i, handles[i].errored);
as_expected = 0;
}
}
/* !checksrc! disable EQUALSNULL 1 */
while((msg = curl_multi_info_read(multi_handle, &msgs_left)) != NULL) {
if(msg->msg == CURLMSG_DONE) {
- for(i = 0; i < HANDLECOUNT; i++) {
+ for(i = 0; i < CURL_ARRAYSIZE(handles); i++) {
if(msg->easy_handle == handles[i].h) {
if(handles[i].paused != 1 || !handles[i].resumed) {
fprintf(stderr, "ERROR: [%d] done, pauses=%d, resumed=%d, "
- "result %d - wtf?\n", i, handles[i].paused,
+ "result %d - wtf?\n", (int)i, handles[i].paused,
handles[i].resumed, msg->data.result);
rc = 1;
goto out;
/* Successfully paused? */
if(!all_paused) {
- for(i = 0; i < HANDLECOUNT; i++) {
+ for(i = 0; i < CURL_ARRAYSIZE(handles); i++) {
if(!handles[i].paused) {
break;
}
}
- all_paused = (i == HANDLECOUNT);
+ all_paused = (i == CURL_ARRAYSIZE(handles));
if(all_paused) {
fprintf(stderr, "INFO: all transfers paused\n");
/* give transfer some rounds to mess things up */
}
if(resume_round > 0 && rounds == resume_round) {
/* time to resume */
- for(i = 0; i < HANDLECOUNT; i++) {
- fprintf(stderr, "INFO: [%d] resumed\n", i);
+ for(i = 0; i < CURL_ARRAYSIZE(handles); i++) {
+ fprintf(stderr, "INFO: [%d] resumed\n", (int)i);
handles[i].resumed = 1;
curl_easy_pause(handles[i].h, CURLPAUSE_CONT);
}
}
out:
- for(i = 0; i < HANDLECOUNT; i++) {
+ for(i = 0; i < CURL_ARRAYSIZE(handles); i++) {
curl_multi_remove_handle(multi_handle, handles[i].h);
curl_easy_cleanup(handles[i].h);
}
-
curl_slist_free_all(resolve);
curl_free(host);
curl_free(port);
curl_global_cleanup();
return rc;
-#else
- (void)argc;
- (void)argv;
- fprintf(stderr, "Not supported with this compiler.\n");
- return 1;
-#endif /* !_MSC_VER */
}
* SPDX-License-Identifier: curl
*
***************************************************************************/
-/* <DESC>
- * HTTP/2 server push
- * </DESC>
- */
-/* curl stuff */
-#include <curl/curl.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#ifndef CURLPIPE_MULTIPLEX
-#error "too old libcurl, cannot do HTTP/2 server push!"
-#endif
-
-static
-void dump(const char *text, unsigned char *ptr, size_t size,
- char nohex)
-{
- size_t i;
- size_t c;
-
- unsigned int width = 0x10;
-
- if(nohex)
- /* without the hex output, we can fit more on screen */
- width = 0x40;
-
- fprintf(stderr, "%s, %lu bytes (0x%lx)\n",
- text, (unsigned long)size, (unsigned long)size);
-
- for(i = 0; i < size; i += width) {
- fprintf(stderr, "%4.4lx: ", (unsigned long)i);
-
- if(!nohex) {
- /* hex not disabled, show it */
- for(c = 0; c < width; c++)
- if(i + c < size)
- fprintf(stderr, "%02x ", ptr[i + c]);
- else
- fputs(" ", stderr);
- }
-
- for(c = 0; (c < width) && (i + c < size); c++) {
- /* check for 0D0A; if found, skip past and start a new line of output */
- if(nohex && (i + c + 1 < size) && ptr[i + c] == 0x0D &&
- ptr[i + c + 1] == 0x0A) {
- i += (c + 2 - width);
- break;
- }
- fprintf(stderr, "%c",
- (ptr[i + c] >= 0x20) && (ptr[i + c] < 0x80) ? ptr[i + c] : '.');
- /* check again for 0D0A, to avoid an extra \n if it's at width */
- if(nohex && (i + c + 2 < size) && ptr[i + c + 1] == 0x0D &&
- ptr[i + c + 2] == 0x0A) {
- i += (c + 3 - width);
- break;
- }
- }
- fputc('\n', stderr); /* newline */
- }
-}
-
-static
-int my_trace(CURL *handle, curl_infotype type,
- char *data, size_t size,
- void *userp)
+static int my_trace(CURL *handle, curl_infotype type,
+ char *data, size_t size, void *userp)
{
const char *text;
(void)handle; /* prevent compiler warning */
return 0;
}
-#define OUTPUTFILE "download_0.data"
-
-static int setup(CURL *hnd, const char *url)
+static int setup_h2_serverpush(CURL *hnd, const char *url)
{
- FILE *out = fopen(OUTPUTFILE, "wb");
+ FILE *out = fopen("download_0.data", "wb");
if(!out)
/* failed */
return 1;
curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(hnd, CURLOPT_DEBUGFUNCTION, my_trace);
-#if (CURLPIPE_MULTIPLEX > 0)
/* wait for pipe connection to confirm */
curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L);
-#endif
+
return 0; /* all is good */
}
return rv;
}
-
/*
* Download a file over HTTP/2, take care of server push.
*/
-int main(int argc, char *argv[])
+static int test_h2_serverpush(int argc, char *argv[])
{
CURL *easy;
CURLM *multi_handle;
curl_multi_setopt(multi_handle, CURLMOPT_PUSHDATA, &transfers);
easy = curl_easy_init();
- if(setup(easy, url)) {
+ if(setup_h2_serverpush(easy, url)) {
fprintf(stderr, "failed\n");
return 1;
}
* SPDX-License-Identifier: curl
*
***************************************************************************/
-/* <DESC>
- * HTTP/2 Upgrade test
- * </DESC>
- */
-#include <curl/curl.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-static void log_line_start(FILE *log, const char *idsbuf, curl_infotype type)
-{
- /*
- * This is the trace look that is similar to what libcurl makes on its
- * own.
- */
- static const char * const s_infotype[] = {
- "* ", "< ", "> ", "{ ", "} ", "{ ", "} "
- };
- if(idsbuf && *idsbuf)
- fprintf(log, "%s%s", idsbuf, s_infotype[type]);
- else
- fputs(s_infotype[type], log);
-}
-
-#define TRC_IDS_FORMAT_IDS_1 "[%" CURL_FORMAT_CURL_OFF_T "-x] "
-#define TRC_IDS_FORMAT_IDS_2 "[%" CURL_FORMAT_CURL_OFF_T "-%" \
- CURL_FORMAT_CURL_OFF_T "] "
-/*
-** callback for CURLOPT_DEBUGFUNCTION
-*/
-static int debug_cb(CURL *handle, curl_infotype type,
- char *data, size_t size,
- void *userdata)
-{
- FILE *output = stderr;
- static int newl = 0;
- static int traced_data = 0;
- char idsbuf[60];
- curl_off_t xfer_id, conn_id;
-
- (void)handle; /* not used */
- (void)userdata;
-
- if(!curl_easy_getinfo(handle, CURLINFO_XFER_ID, &xfer_id) && xfer_id >= 0) {
- if(!curl_easy_getinfo(handle, CURLINFO_CONN_ID, &conn_id) &&
- conn_id >= 0) {
- curl_msnprintf(idsbuf, sizeof(idsbuf), TRC_IDS_FORMAT_IDS_2, xfer_id,
- conn_id);
- }
- else {
- curl_msnprintf(idsbuf, sizeof(idsbuf), TRC_IDS_FORMAT_IDS_1, xfer_id);
- }
- }
- else
- idsbuf[0] = 0;
-
- switch(type) {
- case CURLINFO_HEADER_OUT:
- if(size > 0) {
- size_t st = 0;
- size_t i;
- for(i = 0; i < size - 1; i++) {
- if(data[i] == '\n') { /* LF */
- if(!newl) {
- log_line_start(output, idsbuf, type);
- }
- (void)fwrite(data + st, i - st + 1, 1, output);
- st = i + 1;
- newl = 0;
- }
- }
- if(!newl)
- log_line_start(output, idsbuf, type);
- (void)fwrite(data + st, i - st + 1, 1, output);
- }
- newl = (size && (data[size - 1] != '\n')) ? 1 : 0;
- traced_data = 0;
- break;
- case CURLINFO_TEXT:
- case CURLINFO_HEADER_IN:
- if(!newl)
- log_line_start(output, idsbuf, type);
- (void)fwrite(data, size, 1, output);
- newl = (size && (data[size - 1] != '\n')) ? 1 : 0;
- traced_data = 0;
- break;
- case CURLINFO_DATA_OUT:
- case CURLINFO_DATA_IN:
- case CURLINFO_SSL_DATA_IN:
- case CURLINFO_SSL_DATA_OUT:
- if(!traced_data) {
- if(!newl)
- log_line_start(output, idsbuf, type);
- fprintf(output, "[%ld bytes data]\n", (long)size);
- newl = 0;
- traced_data = 1;
- }
- break;
- default: /* nada */
- newl = 0;
- traced_data = 1;
- break;
- }
-
- return 0;
-}
-
-static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *opaque)
+static size_t write_h2ue_cb(char *ptr, size_t size, size_t nmemb, void *opaque)
{
(void)ptr;
(void)opaque;
return size * nmemb;
}
-int main(int argc, char *argv[])
+static int test_h2_upgrade_extreme(int argc, char *argv[])
{
const char *url;
CURLM *multi = NULL;
curl_easy_setopt(easy, CURLOPT_AUTOREFERER, 1L);
curl_easy_setopt(easy, CURLOPT_FAILONERROR, 1L);
curl_easy_setopt(easy, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
- curl_easy_setopt(easy, CURLOPT_WRITEFUNCTION, write_cb);
+ curl_easy_setopt(easy, CURLOPT_WRITEFUNCTION, write_h2ue_cb);
curl_easy_setopt(easy, CURLOPT_WRITEDATA, NULL);
curl_easy_setopt(easy, CURLOPT_HTTPGET, 1L);
curl_msnprintf(range, sizeof(range),
} while(running_handles > 0 || start_count);
fprintf(stderr, "exiting\n");
- exitcode = EXIT_SUCCESS;
+ exitcode = 0;
cleanup:
* SPDX-License-Identifier: curl
*
***************************************************************************/
-/* <DESC>
- * HTTP/2 server push
- * </DESC>
- */
-/* curl stuff */
-#include <curl/curl.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#ifndef _MSC_VER
-/* somewhat Unix-specific */
-#include <unistd.h> /* getopt() */
-#endif
-
-#ifdef _WIN32
-#define strdup _strdup
-#endif
-
-#ifndef CURLPIPE_MULTIPLEX
-#error "too old libcurl, cannot do HTTP/2 server push!"
-#endif
-
-#ifndef _MSC_VER
-static int verbose = 1;
-
-static void log_line_start(FILE *log, const char *idsbuf, curl_infotype type)
-{
- /*
- * This is the trace look that is similar to what libcurl makes on its
- * own.
- */
- static const char * const s_infotype[] = {
- "* ", "< ", "> ", "{ ", "} ", "{ ", "} "
- };
- if(idsbuf && *idsbuf)
- fprintf(log, "%s%s", idsbuf, s_infotype[type]);
- else
- fputs(s_infotype[type], log);
-}
-
-#define TRC_IDS_FORMAT_IDS_1 "[%" CURL_FORMAT_CURL_OFF_T "-x] "
-#define TRC_IDS_FORMAT_IDS_2 "[%" CURL_FORMAT_CURL_OFF_T "-%" \
- CURL_FORMAT_CURL_OFF_T "] "
-/*
-** callback for CURLOPT_DEBUGFUNCTION
-*/
-static int debug_cb(CURL *handle, curl_infotype type,
- char *data, size_t size,
- void *userdata)
-{
- FILE *output = stderr;
- static int newl = 0;
- static int traced_data = 0;
- char idsbuf[60];
- curl_off_t xfer_id, conn_id;
-
- (void)handle; /* not used */
- (void)userdata;
-
- if(!curl_easy_getinfo(handle, CURLINFO_XFER_ID, &xfer_id) && xfer_id >= 0) {
- if(!curl_easy_getinfo(handle, CURLINFO_CONN_ID, &conn_id) &&
- conn_id >= 0) {
- curl_msnprintf(idsbuf, sizeof(idsbuf), TRC_IDS_FORMAT_IDS_2, xfer_id,
- conn_id);
- }
- else {
- curl_msnprintf(idsbuf, sizeof(idsbuf), TRC_IDS_FORMAT_IDS_1, xfer_id);
- }
- }
- else
- idsbuf[0] = 0;
-
- switch(type) {
- case CURLINFO_HEADER_OUT:
- if(size > 0) {
- size_t st = 0;
- size_t i;
- for(i = 0; i < size - 1; i++) {
- if(data[i] == '\n') { /* LF */
- if(!newl) {
- log_line_start(output, idsbuf, type);
- }
- (void)fwrite(data + st, i - st + 1, 1, output);
- st = i + 1;
- newl = 0;
- }
- }
- if(!newl)
- log_line_start(output, idsbuf, type);
- (void)fwrite(data + st, i - st + 1, 1, output);
- }
- newl = (size && (data[size - 1] != '\n')) ? 1 : 0;
- traced_data = 0;
- break;
- case CURLINFO_TEXT:
- case CURLINFO_HEADER_IN:
- if(!newl)
- log_line_start(output, idsbuf, type);
- (void)fwrite(data, size, 1, output);
- newl = (size && (data[size - 1] != '\n')) ? 1 : 0;
- traced_data = 0;
- break;
- case CURLINFO_DATA_OUT:
- case CURLINFO_DATA_IN:
- case CURLINFO_SSL_DATA_IN:
- case CURLINFO_SSL_DATA_OUT:
- if(!traced_data) {
- if(!newl)
- log_line_start(output, idsbuf, type);
- fprintf(output, "[%ld bytes data]\n", (long)size);
- newl = 0;
- traced_data = 1;
- }
- break;
- default: /* nada */
- newl = 0;
- traced_data = 1;
- break;
- }
- return 0;
-}
+static int verbose_d = 1;
-struct transfer {
+struct transfer_d {
int idx;
CURL *easy;
char filename[128];
CURLcode result;
};
-static size_t transfer_count = 1;
-static struct transfer *transfers;
-static int forbid_reuse = 0;
+static size_t transfer_count_d = 1;
+static struct transfer_d *transfer_d;
+static int forbid_reuse_d = 0;
-static struct transfer *get_transfer_for_easy(CURL *easy)
+static struct transfer_d *get_transfer_for_easy_d(CURL *easy)
{
size_t i;
- for(i = 0; i < transfer_count; ++i) {
- if(easy == transfers[i].easy)
- return &transfers[i];
+ for(i = 0; i < transfer_count_d; ++i) {
+ if(easy == transfer_d[i].easy)
+ return &transfer_d[i];
}
return NULL;
}
-static size_t my_write_cb(char *buf, size_t nitems, size_t buflen,
- void *userdata)
+static size_t my_write_d_cb(char *buf, size_t nitems, size_t buflen,
+ void *userdata)
{
- struct transfer *t = userdata;
+ struct transfer_d *t = userdata;
size_t blen = (nitems * buflen);
size_t nwritten;
return (size_t)nwritten;
}
-static int my_progress_cb(void *userdata,
- curl_off_t dltotal, curl_off_t dlnow,
- curl_off_t ultotal, curl_off_t ulnow)
+static int my_progress_d_cb(void *userdata,
+ curl_off_t dltotal, curl_off_t dlnow,
+ curl_off_t ultotal, curl_off_t ulnow)
{
- struct transfer *t = userdata;
+ struct transfer_d *t = userdata;
(void)ultotal;
(void)ulnow;
(void)dltotal;
return 0;
}
-static int setup(CURL *hnd, const char *url, struct transfer *t,
- long http_version, struct curl_slist *host,
- CURLSH *share, int use_earlydata, int fresh_connect)
+static int setup_hx_download(CURL *hnd, const char *url, struct transfer_d *t,
+ long http_version, struct curl_slist *host,
+ CURLSH *share, int use_earlydata,
+ int fresh_connect)
{
curl_easy_setopt(hnd, CURLOPT_SHARE, share);
curl_easy_setopt(hnd, CURLOPT_URL, url);
curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYHOST, 0L);
curl_easy_setopt(hnd, CURLOPT_ACCEPT_ENCODING, "");
curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, (long)(128 * 1024));
- curl_easy_setopt(hnd, CURLOPT_WRITEFUNCTION, my_write_cb);
+ curl_easy_setopt(hnd, CURLOPT_WRITEFUNCTION, my_write_d_cb);
curl_easy_setopt(hnd, CURLOPT_WRITEDATA, t);
curl_easy_setopt(hnd, CURLOPT_NOPROGRESS, 0L);
- curl_easy_setopt(hnd, CURLOPT_XFERINFOFUNCTION, my_progress_cb);
+ curl_easy_setopt(hnd, CURLOPT_XFERINFOFUNCTION, my_progress_d_cb);
curl_easy_setopt(hnd, CURLOPT_XFERINFODATA, t);
if(use_earlydata)
curl_easy_setopt(hnd, CURLOPT_SSL_OPTIONS, (long)CURLSSLOPT_EARLYDATA);
- if(forbid_reuse)
+ if(forbid_reuse_d)
curl_easy_setopt(hnd, CURLOPT_FORBID_REUSE, 1L);
if(host)
curl_easy_setopt(hnd, CURLOPT_RESOLVE, host);
curl_easy_setopt(hnd, CURLOPT_FRESH_CONNECT, 1L);
/* please be verbose */
- if(verbose) {
+ if(verbose_d) {
curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(hnd, CURLOPT_DEBUGFUNCTION, debug_cb);
}
-#if (CURLPIPE_MULTIPLEX > 0)
/* wait for pipe connection to confirm */
curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L);
-#endif
+
return 0; /* all is good */
}
-static void usage(const char *msg)
+static void usage_hx_download(const char *msg)
{
if(msg)
fprintf(stderr, "%s\n", msg);
" -V http_version (http/1.1, h2, h3) http version to use\n"
);
}
-#endif /* !_MSC_VER */
/*
* Download a file over HTTP/2, take care of server push.
*/
-int main(int argc, char *argv[])
+static int test_hx_download(int argc, char *argv[])
{
-#ifndef _MSC_VER
CURLM *multi_handle;
struct CURLMsg *m;
CURLSH *share;
size_t abort_offset = 0;
size_t fail_offset = 0;
int abort_paused = 0, use_earlydata = 0;
- struct transfer *t;
+ struct transfer_d *t;
int http_version = CURL_HTTP_VERSION_2_0;
int ch;
struct curl_slist *host = NULL;
int fresh_connect = 0;
int result = 0;
- while((ch = getopt(argc, argv, "aefhm:n:xA:F:M:P:r:T:V:")) != -1) {
+ while((ch = cgetopt(argc, argv, "aefhm:n:xA:F:M:P:r:T:V:")) != -1) {
switch(ch) {
case 'h':
- usage(NULL);
+ usage_hx_download(NULL);
result = 2;
goto cleanup;
case 'a':
use_earlydata = 1;
break;
case 'f':
- forbid_reuse = 1;
+ forbid_reuse_d = 1;
break;
case 'm':
- max_parallel = (size_t)strtol(optarg, NULL, 10);
+ max_parallel = (size_t)strtol(coptarg, NULL, 10);
break;
case 'n':
- transfer_count = (size_t)strtol(optarg, NULL, 10);
+ transfer_count_d = (size_t)strtol(coptarg, NULL, 10);
break;
case 'x':
fresh_connect = 1;
break;
case 'A':
- abort_offset = (size_t)strtol(optarg, NULL, 10);
+ abort_offset = (size_t)strtol(coptarg, NULL, 10);
break;
case 'F':
- fail_offset = (size_t)strtol(optarg, NULL, 10);
+ fail_offset = (size_t)strtol(coptarg, NULL, 10);
break;
case 'M':
- max_host_conns = (size_t)strtol(optarg, NULL, 10);
+ max_host_conns = (size_t)strtol(coptarg, NULL, 10);
break;
case 'P':
- pause_offset = (size_t)strtol(optarg, NULL, 10);
+ pause_offset = (size_t)strtol(coptarg, NULL, 10);
break;
case 'r':
free(resolve);
- resolve = strdup(optarg);
+ resolve = strdup(coptarg);
break;
case 'T':
- max_total_conns = (size_t)strtol(optarg, NULL, 10);
+ max_total_conns = (size_t)strtol(coptarg, NULL, 10);
break;
case 'V': {
- if(!strcmp("http/1.1", optarg))
+ if(!strcmp("http/1.1", coptarg))
http_version = CURL_HTTP_VERSION_1_1;
- else if(!strcmp("h2", optarg))
+ else if(!strcmp("h2", coptarg))
http_version = CURL_HTTP_VERSION_2_0;
- else if(!strcmp("h3", optarg))
+ else if(!strcmp("h3", coptarg))
http_version = CURL_HTTP_VERSION_3ONLY;
else {
- usage("invalid http version");
+ usage_hx_download("invalid http version");
result = 1;
goto cleanup;
}
break;
}
default:
- usage("invalid option");
+ usage_hx_download("invalid option");
result = 1;
goto cleanup;
}
}
- argc -= optind;
- argv += optind;
+ argc -= coptind;
+ argv += coptind;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl_global_trace("ids,time,http/2,http/3");
if(argc != 1) {
- usage("not enough arguments");
+ usage_hx_download("not enough arguments");
result = 2;
goto cleanup;
}
curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_PSL);
curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_HSTS);
- transfers = calloc(transfer_count, sizeof(*transfers));
- if(!transfers) {
+ transfer_d = calloc(transfer_count_d, sizeof(*transfer_d));
+ if(!transfer_d) {
fprintf(stderr, "error allocating transfer structs\n");
result = 1;
goto cleanup;
(long)max_host_conns);
active_transfers = 0;
- for(i = 0; i < transfer_count; ++i) {
- t = &transfers[i];
+ for(i = 0; i < transfer_count_d; ++i) {
+ t = &transfer_d[i];
t->idx = (int)i;
t->abort_at = (curl_off_t)abort_offset;
t->fail_at = (curl_off_t)fail_offset;
t->pause_at = (curl_off_t)pause_offset;
}
- n = (max_parallel < transfer_count) ? max_parallel : transfer_count;
+ n = (max_parallel < transfer_count_d) ? max_parallel : transfer_count_d;
for(i = 0; i < n; ++i) {
- t = &transfers[i];
+ t = &transfer_d[i];
t->easy = curl_easy_init();
if(!t->easy ||
- setup(t->easy, url, t, http_version, host, share, use_earlydata,
- fresh_connect)) {
+ setup_hx_download(t->easy, url, t, http_version, host, share,
+ use_earlydata, fresh_connect)) {
fprintf(stderr, "[t-%d] FAILED setup\n", (int)i);
result = 1;
goto cleanup;
CURL *e = m->easy_handle;
--active_transfers;
curl_multi_remove_handle(multi_handle, e);
- t = get_transfer_for_easy(e);
+ t = get_transfer_for_easy_d(e);
if(t) {
t->done = 1;
t->result = m->data.result;
/* nothing happening, maintenance */
if(abort_paused) {
/* abort paused transfers */
- for(i = 0; i < transfer_count; ++i) {
- t = &transfers[i];
+ for(i = 0; i < transfer_count_d; ++i) {
+ t = &transfer_d[i];
if(!t->done && t->paused && t->easy) {
curl_multi_remove_handle(multi_handle, t->easy);
t->done = 1;
}
else {
/* resume one paused transfer */
- for(i = 0; i < transfer_count; ++i) {
- t = &transfers[i];
+ for(i = 0; i < transfer_count_d; ++i) {
+ t = &transfer_d[i];
if(!t->done && t->paused) {
t->resumed = 1;
t->paused = 0;
}
while(active_transfers < max_parallel) {
- for(i = 0; i < transfer_count; ++i) {
- t = &transfers[i];
+ for(i = 0; i < transfer_count_d; ++i) {
+ t = &transfer_d[i];
if(!t->started) {
t->easy = curl_easy_init();
if(!t->easy ||
- setup(t->easy, url, t, http_version, host, share,
- use_earlydata, fresh_connect)) {
+ setup_hx_download(t->easy, url, t, http_version, host, share,
+ use_earlydata, fresh_connect)) {
fprintf(stderr, "[t-%d] FAILED setup\n", (int)i);
result = 1;
goto cleanup;
}
}
/* all started */
- if(i == transfer_count)
+ if(i == transfer_count_d)
break;
}
} while(m);
curl_multi_cleanup(multi_handle);
- for(i = 0; i < transfer_count; ++i) {
- t = &transfers[i];
+ for(i = 0; i < transfer_count_d; ++i) {
+ t = &transfer_d[i];
if(t->out) {
fclose(t->out);
t->out = NULL;
if(t->result)
result = t->result;
}
- free(transfers);
+ free(transfer_d);
curl_share_cleanup(share);
curl_slist_free_all(host);
free(resolve);
return result;
-#else
- (void)argc;
- (void)argv;
- fprintf(stderr, "Not supported with this compiler.\n");
- return 1;
-#endif /* !_MSC_VER */
}
* SPDX-License-Identifier: curl
*
***************************************************************************/
-/* <DESC>
- * HTTP upload tests and tweaks
- * </DESC>
- */
-/* curl stuff */
-#include <curl/curl.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#ifndef _MSC_VER
-/* somewhat Unix-specific */
-#include <unistd.h> /* getopt() */
-#endif
-
-#ifndef CURLPIPE_MULTIPLEX
-#error "too old libcurl"
-#endif
-
-#ifndef _MSC_VER
-static int verbose = 1;
-
-static void log_line_start(FILE *log, const char *idsbuf, curl_infotype type)
-{
- /*
- * This is the trace look that is similar to what libcurl makes on its
- * own.
- */
- static const char * const s_infotype[] = {
- "* ", "< ", "> ", "{ ", "} ", "{ ", "} "
- };
- if(idsbuf && *idsbuf)
- fprintf(log, "%s%s", idsbuf, s_infotype[type]);
- else
- fputs(s_infotype[type], log);
-}
-
-#define TRC_IDS_FORMAT_IDS_1 "[%" CURL_FORMAT_CURL_OFF_T "-x] "
-#define TRC_IDS_FORMAT_IDS_2 "[%" CURL_FORMAT_CURL_OFF_T "-%" \
- CURL_FORMAT_CURL_OFF_T "] "
-/*
-** callback for CURLOPT_DEBUGFUNCTION
-*/
-static int debug_cb(CURL *handle, curl_infotype type,
- char *data, size_t size,
- void *userdata)
-{
- FILE *output = stderr;
- static int newl = 0;
- static int traced_data = 0;
- char idsbuf[60];
- curl_off_t xfer_id, conn_id;
-
- (void)handle; /* not used */
- (void)userdata;
-
- if(!curl_easy_getinfo(handle, CURLINFO_XFER_ID, &xfer_id) && xfer_id >= 0) {
- if(!curl_easy_getinfo(handle, CURLINFO_CONN_ID, &conn_id) &&
- conn_id >= 0) {
- curl_msnprintf(idsbuf, sizeof(idsbuf), TRC_IDS_FORMAT_IDS_2, xfer_id,
- conn_id);
- }
- else {
- curl_msnprintf(idsbuf, sizeof(idsbuf), TRC_IDS_FORMAT_IDS_1, xfer_id);
- }
- }
- else
- idsbuf[0] = 0;
-
- switch(type) {
- case CURLINFO_HEADER_OUT:
- if(size > 0) {
- size_t st = 0;
- size_t i;
- for(i = 0; i < size - 1; i++) {
- if(data[i] == '\n') { /* LF */
- if(!newl) {
- log_line_start(output, idsbuf, type);
- }
- (void)fwrite(data + st, i - st + 1, 1, output);
- st = i + 1;
- newl = 0;
- }
- }
- if(!newl)
- log_line_start(output, idsbuf, type);
- (void)fwrite(data + st, i - st + 1, 1, output);
- }
- newl = (size && (data[size - 1] != '\n')) ? 1 : 0;
- traced_data = 0;
- break;
- case CURLINFO_TEXT:
- case CURLINFO_HEADER_IN:
- if(!newl)
- log_line_start(output, idsbuf, type);
- (void)fwrite(data, size, 1, output);
- newl = (size && (data[size - 1] != '\n')) ? 1 : 0;
- traced_data = 0;
- break;
- case CURLINFO_DATA_OUT:
- case CURLINFO_DATA_IN:
- case CURLINFO_SSL_DATA_IN:
- case CURLINFO_SSL_DATA_OUT:
- if(!traced_data) {
- if(!newl)
- log_line_start(output, idsbuf, type);
- fprintf(output, "[%ld bytes data]\n", (long)size);
- newl = 0;
- traced_data = 1;
- }
- break;
- default: /* nada */
- newl = 0;
- traced_data = 1;
- break;
- }
- return 0;
-}
+static int verbose_u = 1;
-struct transfer {
+struct transfer_u {
int idx;
CURL *easy;
const char *method;
int done;
};
-static size_t transfer_count = 1;
-static struct transfer *transfers;
-static int forbid_reuse = 0;
+static size_t transfer_count_u = 1;
+static struct transfer_u *transfer_u;
+static int forbid_reuse_u = 0;
-static struct transfer *get_transfer_for_easy(CURL *easy)
+static struct transfer_u *get_transfer_for_easy_u(CURL *easy)
{
size_t i;
- for(i = 0; i < transfer_count; ++i) {
- if(easy == transfers[i].easy)
- return &transfers[i];
+ for(i = 0; i < transfer_count_u; ++i) {
+ if(easy == transfer_u[i].easy)
+ return &transfer_u[i];
}
return NULL;
}
-static size_t my_write_cb(char *buf, size_t nitems, size_t buflen,
- void *userdata)
+static size_t my_write_u_cb(char *buf, size_t nitems, size_t buflen,
+ void *userdata)
{
- struct transfer *t = userdata;
+ struct transfer_u *t = userdata;
size_t blen = (nitems * buflen);
size_t nwritten;
static size_t my_read_cb(char *buf, size_t nitems, size_t buflen,
void *userdata)
{
- struct transfer *t = userdata;
+ struct transfer_u *t = userdata;
size_t blen = (nitems * buflen);
size_t nread;
return (size_t)nread;
}
-static int my_progress_cb(void *userdata,
- curl_off_t dltotal, curl_off_t dlnow,
- curl_off_t ultotal, curl_off_t ulnow)
+static int my_progress_u_cb(void *userdata,
+ curl_off_t dltotal, curl_off_t dlnow,
+ curl_off_t ultotal, curl_off_t ulnow)
{
- struct transfer *t = userdata;
+ struct transfer_u *t = userdata;
(void)ultotal;
(void)dlnow;
(void)dltotal;
return 0;
}
-static int setup(CURL *hnd, const char *url, struct transfer *t,
- long http_version, struct curl_slist *host,
- CURLSH *share, int use_earlydata, int announce_length)
+static int setup_hx_upload(CURL *hnd, const char *url, struct transfer_u *t,
+ long http_version, struct curl_slist *host,
+ CURLSH *share, int use_earlydata,
+ int announce_length)
{
curl_easy_setopt(hnd, CURLOPT_SHARE, share);
curl_easy_setopt(hnd, CURLOPT_URL, url);
curl_easy_setopt(hnd, CURLOPT_SSL_VERIFYHOST, 0L);
curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, (long)(128 * 1024));
curl_easy_setopt(hnd, CURLOPT_FOLLOWLOCATION, CURLFOLLOW_OBEYCODE);
- curl_easy_setopt(hnd, CURLOPT_WRITEFUNCTION, my_write_cb);
+ curl_easy_setopt(hnd, CURLOPT_WRITEFUNCTION, my_write_u_cb);
curl_easy_setopt(hnd, CURLOPT_WRITEDATA, t);
if(use_earlydata)
curl_easy_setopt(hnd, CURLOPT_SSL_OPTIONS, (long)CURLSSLOPT_EARLYDATA);
curl_easy_setopt(hnd, CURLOPT_INFILESIZE_LARGE, t->send_total);
curl_easy_setopt(hnd, CURLOPT_NOPROGRESS, 0L);
- curl_easy_setopt(hnd, CURLOPT_XFERINFOFUNCTION, my_progress_cb);
+ curl_easy_setopt(hnd, CURLOPT_XFERINFOFUNCTION, my_progress_u_cb);
curl_easy_setopt(hnd, CURLOPT_XFERINFODATA, t);
- if(forbid_reuse)
+ if(forbid_reuse_u)
curl_easy_setopt(hnd, CURLOPT_FORBID_REUSE, 1L);
if(host)
curl_easy_setopt(hnd, CURLOPT_RESOLVE, host);
/* please be verbose */
- if(verbose) {
+ if(verbose_u) {
curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(hnd, CURLOPT_DEBUGFUNCTION, debug_cb);
}
-#if (CURLPIPE_MULTIPLEX > 0)
/* wait for pipe connection to confirm */
curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L);
-#endif
+
return 0; /* all is good */
}
-static void usage(const char *msg)
+static void usage_hx_upload(const char *msg)
{
if(msg)
fprintf(stderr, "%s\n", msg);
" -V http_version (http/1.1, h2, h3) http version to use\n"
);
}
-#endif /* !_MSC_VER */
/*
* Download a file over HTTP/2, take care of server push.
*/
-int main(int argc, char *argv[])
+static int test_hx_upload(int argc, char *argv[])
{
-#ifndef _MSC_VER
CURLM *multi_handle;
CURLSH *share;
const char *url;
int reuse_easy = 0;
int use_earlydata = 0;
int announce_length = 0;
- struct transfer *t;
+ struct transfer_u *t;
int http_version = CURL_HTTP_VERSION_2_0;
struct curl_slist *host = NULL;
const char *resolve = NULL;
int ch;
- while((ch = getopt(argc, argv, "aefhlm:n:A:F:M:P:r:RS:V:")) != -1) {
+ while((ch = cgetopt(argc, argv, "aefhlm:n:A:F:M:P:r:RS:V:")) != -1) {
switch(ch) {
case 'h':
- usage(NULL);
+ usage_hx_upload(NULL);
return 2;
case 'a':
abort_paused = 1;
use_earlydata = 1;
break;
case 'f':
- forbid_reuse = 1;
+ forbid_reuse_u = 1;
break;
case 'l':
announce_length = 1;
break;
case 'm':
- max_parallel = (size_t)strtol(optarg, NULL, 10);
+ max_parallel = (size_t)strtol(coptarg, NULL, 10);
break;
case 'n':
- transfer_count = (size_t)strtol(optarg, NULL, 10);
+ transfer_count_u = (size_t)strtol(coptarg, NULL, 10);
break;
case 'A':
- abort_offset = (size_t)strtol(optarg, NULL, 10);
+ abort_offset = (size_t)strtol(coptarg, NULL, 10);
break;
case 'F':
- fail_offset = (size_t)strtol(optarg, NULL, 10);
+ fail_offset = (size_t)strtol(coptarg, NULL, 10);
break;
case 'M':
- method = optarg;
+ method = coptarg;
break;
case 'P':
- pause_offset = (size_t)strtol(optarg, NULL, 10);
+ pause_offset = (size_t)strtol(coptarg, NULL, 10);
break;
case 'r':
- resolve = optarg;
+ resolve = coptarg;
break;
case 'R':
reuse_easy = 1;
break;
case 'S':
- send_total = (size_t)strtol(optarg, NULL, 10);
+ send_total = (size_t)strtol(coptarg, NULL, 10);
break;
case 'V': {
- if(!strcmp("http/1.1", optarg))
+ if(!strcmp("http/1.1", coptarg))
http_version = CURL_HTTP_VERSION_1_1;
- else if(!strcmp("h2", optarg))
+ else if(!strcmp("h2", coptarg))
http_version = CURL_HTTP_VERSION_2_0;
- else if(!strcmp("h3", optarg))
+ else if(!strcmp("h3", coptarg))
http_version = CURL_HTTP_VERSION_3ONLY;
else {
- usage("invalid http version");
+ usage_hx_upload("invalid http version");
return 1;
}
break;
}
default:
- usage("invalid option");
- return 1;
+ usage_hx_upload("invalid option");
+ return 1;
}
}
- argc -= optind;
- argv += optind;
+ argc -= coptind;
+ argv += coptind;
if(max_parallel > 1 && reuse_easy) {
- usage("cannot mix -R and -P");
+ usage_hx_upload("cannot mix -R and -P");
return 2;
}
curl_global_trace("ids,time,http/2,http/3");
if(argc != 1) {
- usage("not enough arguments");
+ usage_hx_upload("not enough arguments");
return 2;
}
url = argv[0];
curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_PSL);
curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_HSTS);
- transfers = calloc(transfer_count, sizeof(*transfers));
- if(!transfers) {
+ transfer_u = calloc(transfer_count_u, sizeof(*transfer_u));
+ if(!transfer_u) {
fprintf(stderr, "error allocating transfer structs\n");
return 1;
}
active_transfers = 0;
- for(i = 0; i < transfer_count; ++i) {
- t = &transfers[i];
+ for(i = 0; i < transfer_count_u; ++i) {
+ t = &transfer_u[i];
t->idx = (int)i;
t->method = method;
t->send_total = (curl_off_t)send_total;
fprintf(stderr, "failed to init easy handle\n");
return 1;
}
- for(i = 0; i < transfer_count; ++i) {
- t = &transfers[i];
+ for(i = 0; i < transfer_count_u; ++i) {
+ t = &transfer_u[i];
t->easy = easy;
- if(setup(t->easy, url, t, http_version, host, share, use_earlydata,
- announce_length)) {
+ if(setup_hx_upload(t->easy, url, t, http_version, host, share,
+ use_earlydata, announce_length)) {
fprintf(stderr, "[t-%d] FAILED setup\n", (int)i);
return 1;
}
multi_handle = curl_multi_init();
curl_multi_setopt(multi_handle, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX);
- n = (max_parallel < transfer_count) ? max_parallel : transfer_count;
+ n = (max_parallel < transfer_count_u) ? max_parallel : transfer_count_u;
for(i = 0; i < n; ++i) {
- t = &transfers[i];
+ t = &transfer_u[i];
t->easy = curl_easy_init();
- if(!t->easy || setup(t->easy, url, t, http_version, host, share,
- use_earlydata, announce_length)) {
+ if(!t->easy || setup_hx_upload(t->easy, url, t, http_version, host,
+ share, use_earlydata, announce_length)) {
fprintf(stderr, "[t-%d] FAILED setup\n", (int)i);
return 1;
}
CURL *e = m->easy_handle;
--active_transfers;
curl_multi_remove_handle(multi_handle, e);
- t = get_transfer_for_easy(e);
+ t = get_transfer_for_easy_u(e);
if(t) {
long res_status;
curl_easy_getinfo(e, CURLINFO_RESPONSE_CODE, &res_status);
/* nothing happening, maintenance */
if(abort_paused) {
/* abort paused transfers */
- for(i = 0; i < transfer_count; ++i) {
- t = &transfers[i];
+ for(i = 0; i < transfer_count_u; ++i) {
+ t = &transfer_u[i];
if(!t->done && t->paused && t->easy) {
curl_multi_remove_handle(multi_handle, t->easy);
t->done = 1;
}
else {
/* resume one paused transfer */
- for(i = 0; i < transfer_count; ++i) {
- t = &transfers[i];
+ for(i = 0; i < transfer_count_u; ++i) {
+ t = &transfer_u[i];
if(!t->done && t->paused) {
t->resumed = 1;
t->paused = 0;
}
while(active_transfers < max_parallel) {
- for(i = 0; i < transfer_count; ++i) {
- t = &transfers[i];
+ for(i = 0; i < transfer_count_u; ++i) {
+ t = &transfer_u[i];
if(!t->started) {
t->easy = curl_easy_init();
- if(!t->easy || setup(t->easy, url, t, http_version, host,
- share, use_earlydata, announce_length)) {
+ if(!t->easy || setup_hx_upload(t->easy, url, t, http_version,
+ host, share, use_earlydata,
+ announce_length)) {
fprintf(stderr, "[t-%d] FAILED setup\n", (int)i);
return 1;
}
}
}
/* all started */
- if(i == transfer_count)
+ if(i == transfer_count_u)
break;
}
} while(m);
curl_multi_cleanup(multi_handle);
}
- for(i = 0; i < transfer_count; ++i) {
- t = &transfers[i];
+ for(i = 0; i < transfer_count_u; ++i) {
+ t = &transfer_u[i];
if(t->out) {
fclose(t->out);
t->out = NULL;
t->easy = NULL;
}
}
- free(transfers);
+ free(transfer_u);
curl_share_cleanup(share);
return 0;
-#else
- (void)argc;
- (void)argv;
- fprintf(stderr, "Not supported with this compiler.\n");
- return 1;
-#endif /* !_MSC_VER */
}
* SPDX-License-Identifier: curl
*
***************************************************************************/
-/* <DESC>
- * TLS session reuse
- * </DESC>
- */
-#include <curl/curl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-static void log_line_start(FILE *log, const char *idsbuf, curl_infotype type)
-{
- /*
- * This is the trace look that is similar to what libcurl makes on its
- * own.
- */
- static const char * const s_infotype[] = {
- "* ", "< ", "> ", "{ ", "} ", "{ ", "} "
- };
- if(idsbuf && *idsbuf)
- fprintf(log, "%s%s", idsbuf, s_infotype[type]);
- else
- fputs(s_infotype[type], log);
-}
-
-#define TRC_IDS_FORMAT_IDS_1 "[%" CURL_FORMAT_CURL_OFF_T "-x] "
-#define TRC_IDS_FORMAT_IDS_2 "[%" CURL_FORMAT_CURL_OFF_T "-%" \
- CURL_FORMAT_CURL_OFF_T "] "
-/*
-** callback for CURLOPT_DEBUGFUNCTION
-*/
-static int debug_cb(CURL *handle, curl_infotype type,
- char *data, size_t size,
- void *userdata)
-{
- FILE *output = stderr;
- static int newl = 0;
- static int traced_data = 0;
- char idsbuf[60];
- curl_off_t xfer_id, conn_id;
-
- (void)handle; /* not used */
- (void)userdata;
-
- if(!curl_easy_getinfo(handle, CURLINFO_XFER_ID, &xfer_id) && xfer_id >= 0) {
- if(!curl_easy_getinfo(handle, CURLINFO_CONN_ID, &conn_id) &&
- conn_id >= 0) {
- curl_msnprintf(idsbuf, sizeof(idsbuf), TRC_IDS_FORMAT_IDS_2, xfer_id,
- conn_id);
- }
- else {
- curl_msnprintf(idsbuf, sizeof(idsbuf), TRC_IDS_FORMAT_IDS_1, xfer_id);
- }
- }
- else
- idsbuf[0] = 0;
-
- switch(type) {
- case CURLINFO_HEADER_OUT:
- if(size > 0) {
- size_t st = 0;
- size_t i;
- for(i = 0; i < size - 1; i++) {
- if(data[i] == '\n') { /* LF */
- if(!newl) {
- log_line_start(output, idsbuf, type);
- }
- (void)fwrite(data + st, i - st + 1, 1, output);
- st = i + 1;
- newl = 0;
- }
- }
- if(!newl)
- log_line_start(output, idsbuf, type);
- (void)fwrite(data + st, i - st + 1, 1, output);
- }
- newl = (size && (data[size - 1] != '\n')) ? 1 : 0;
- traced_data = 0;
- break;
- case CURLINFO_TEXT:
- case CURLINFO_HEADER_IN:
- if(!newl)
- log_line_start(output, idsbuf, type);
- (void)fwrite(data, size, 1, output);
- newl = (size && (data[size - 1] != '\n')) ? 1 : 0;
- traced_data = 0;
- break;
- case CURLINFO_DATA_OUT:
- case CURLINFO_DATA_IN:
- case CURLINFO_SSL_DATA_IN:
- case CURLINFO_SSL_DATA_OUT:
- if(!traced_data) {
- if(!newl)
- log_line_start(output, idsbuf, type);
- fprintf(output, "[%ld bytes data]\n", (long)size);
- newl = 0;
- traced_data = 1;
- }
- break;
- default: /* nada */
- newl = 0;
- traced_data = 1;
- break;
- }
-
- return 0;
-}
-
-static size_t write_cb(char *ptr, size_t size, size_t nmemb, void *opaque)
+static size_t write_tse_cb(char *ptr, size_t size, size_t nmemb, void *opaque)
{
(void)ptr;
(void)opaque;
curl_easy_setopt(easy, CURLOPT_AUTOREFERER, 1L);
curl_easy_setopt(easy, CURLOPT_FAILONERROR, 1L);
curl_easy_setopt(easy, CURLOPT_HTTP_VERSION, http_version);
- curl_easy_setopt(easy, CURLOPT_WRITEFUNCTION, write_cb);
+ curl_easy_setopt(easy, CURLOPT_WRITEFUNCTION, write_tse_cb);
curl_easy_setopt(easy, CURLOPT_WRITEDATA, NULL);
curl_easy_setopt(easy, CURLOPT_HTTPGET, 1L);
curl_easy_setopt(easy, CURLOPT_SSL_VERIFYPEER, 0L);
return 0;
}
-int main(int argc, char *argv[])
+static int test_tls_session_reuse(int argc, char *argv[])
{
const char *url;
CURLM *multi = NULL;
} while(ongoing || add_more);
fprintf(stderr, "exiting\n");
- exitcode = EXIT_SUCCESS;
+ exitcode = 0;
cleanup:
* SPDX-License-Identifier: curl
*
***************************************************************************/
-/* <DESC>
- * upload pausing
- * </DESC>
- */
/* This is based on the PoC client of issue #11769
*/
-#include <curl/curl.h>
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#ifndef _MSC_VER
-/* somewhat Unix-specific */
-#include <unistd.h> /* getopt() */
-#endif
-
-#ifndef _MSC_VER
-static void log_line_start(FILE *log, const char *idsbuf, curl_infotype type)
-{
- /*
- * This is the trace look that is similar to what libcurl makes on its
- * own.
- */
- static const char * const s_infotype[] = {
- "* ", "< ", "> ", "{ ", "} ", "{ ", "} "
- };
- if(idsbuf && *idsbuf)
- fprintf(log, "%s%s", idsbuf, s_infotype[type]);
- else
- fputs(s_infotype[type], log);
-}
-
-#define TRC_IDS_FORMAT_IDS_1 "[%" CURL_FORMAT_CURL_OFF_T "-x] "
-#define TRC_IDS_FORMAT_IDS_2 "[%" CURL_FORMAT_CURL_OFF_T "-%" \
- CURL_FORMAT_CURL_OFF_T "] "
-/*
-** callback for CURLOPT_DEBUGFUNCTION
-*/
-static int debug_cb(CURL *handle, curl_infotype type,
- char *data, size_t size,
- void *userdata)
-{
- FILE *output = stderr;
- static int newl = 0;
- static int traced_data = 0;
- char idsbuf[60];
- curl_off_t xfer_id, conn_id;
-
- (void)handle; /* not used */
- (void)userdata;
-
- if(!curl_easy_getinfo(handle, CURLINFO_XFER_ID, &xfer_id) && xfer_id >= 0) {
- if(!curl_easy_getinfo(handle, CURLINFO_CONN_ID, &conn_id) &&
- conn_id >= 0) {
- curl_msnprintf(idsbuf, sizeof(idsbuf), TRC_IDS_FORMAT_IDS_2, xfer_id,
- conn_id);
- }
- else {
- curl_msnprintf(idsbuf, sizeof(idsbuf), TRC_IDS_FORMAT_IDS_1, xfer_id);
- }
- }
- else
- idsbuf[0] = 0;
-
- switch(type) {
- case CURLINFO_HEADER_OUT:
- if(size > 0) {
- size_t st = 0;
- size_t i;
- for(i = 0; i < size - 1; i++) {
- if(data[i] == '\n') { /* LF */
- if(!newl) {
- log_line_start(output, idsbuf, type);
- }
- (void)fwrite(data + st, i - st + 1, 1, output);
- st = i + 1;
- newl = 0;
- }
- }
- if(!newl)
- log_line_start(output, idsbuf, type);
- (void)fwrite(data + st, i - st + 1, 1, output);
- }
- newl = (size && (data[size - 1] != '\n')) ? 1 : 0;
- traced_data = 0;
- break;
- case CURLINFO_TEXT:
- case CURLINFO_HEADER_IN:
- if(!newl)
- log_line_start(output, idsbuf, type);
- (void)fwrite(data, size, 1, output);
- newl = (size && (data[size - 1] != '\n')) ? 1 : 0;
- traced_data = 0;
- break;
- case CURLINFO_DATA_OUT:
- case CURLINFO_DATA_IN:
- case CURLINFO_SSL_DATA_IN:
- case CURLINFO_SSL_DATA_OUT:
- if(!traced_data) {
- if(!newl)
- log_line_start(output, idsbuf, type);
- fprintf(output, "[%ld bytes data]\n", (long)size);
- newl = 0;
- traced_data = 1;
- }
- break;
- default: /* nada */
- newl = 0;
- traced_data = 1;
- break;
- }
-
- return 0;
-}
-
-#define PAUSE_READ_AFTER 1
static size_t total_read = 0;
static size_t read_callback(char *ptr, size_t size, size_t nmemb,
void *userdata)
{
+ static const size_t PAUSE_READ_AFTER = 1;
+
(void)size;
(void)nmemb;
(void)userdata;
return 0;
}
-static void usage(const char *msg)
+static void usage_upload_pausing(const char *msg)
{
if(msg)
fprintf(stderr, "%s\n", msg);
);
}
-#define ERR() \
- do { \
- fprintf(stderr, "something unexpected went wrong - bailing out!\n"); \
- return 2; \
- } while(0)
-
-#endif /* !_MSC_VER */
-
-int main(int argc, char *argv[])
+static int test_upload_pausing(int argc, char *argv[])
{
-#ifndef _MSC_VER
CURL *curl;
CURLcode rc = CURLE_OK;
CURLU *cu;
long http_version = CURL_HTTP_VERSION_1_1;
int ch;
- while((ch = getopt(argc, argv, "V:")) != -1) {
+ while((ch = cgetopt(argc, argv, "V:")) != -1) {
switch(ch) {
case 'V': {
- if(!strcmp("http/1.1", optarg))
+ if(!strcmp("http/1.1", coptarg))
http_version = CURL_HTTP_VERSION_1_1;
- else if(!strcmp("h2", optarg))
+ else if(!strcmp("h2", coptarg))
http_version = CURL_HTTP_VERSION_2_0;
- else if(!strcmp("h3", optarg))
+ else if(!strcmp("h3", coptarg))
http_version = CURL_HTTP_VERSION_3ONLY;
else {
- usage("invalid http version");
+ usage_upload_pausing("invalid http version");
return 1;
}
break;
}
default:
- usage("invalid option");
- return 1;
+ usage_upload_pausing("invalid option");
+ return 1;
}
}
- argc -= optind;
- argv += optind;
+ argc -= coptind;
+ argv += coptind;
if(argc != 1) {
- usage("not enough arguments");
+ usage_upload_pausing("not enough arguments");
return 2;
}
url = argv[0];
curl_global_cleanup();
return (int)rc;
-#else
- (void)argc;
- (void)argv;
- fprintf(stderr, "Not supported with this compiler.\n");
- return 1;
-#endif /* !_MSC_VER */
}
* SPDX-License-Identifier: curl
*
***************************************************************************/
-/* <DESC>
- * WebSockets data echos
- * </DESC>
- */
-/* curl stuff */
-#include <curl/curl.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#if !defined(CURL_DISABLE_WEBSOCKETS) && !defined(_MSC_VER)
-
-#ifndef _MSC_VER
-/* somewhat Unix-specific */
-#include <unistd.h> /* getopt() */
-#endif
-
-#ifdef _WIN32
-#include <windows.h>
-#else
-#include <sys/time.h>
-#endif
-
-
-static
-void dump(const char *text, unsigned char *ptr, size_t size,
- char nohex)
-{
- size_t i;
- size_t c;
-
- unsigned int width = 0x10;
-
- if(nohex)
- /* without the hex output, we can fit more on screen */
- width = 0x40;
-
- fprintf(stderr, "%s, %lu bytes (0x%lx)\n",
- text, (unsigned long)size, (unsigned long)size);
-
- for(i = 0; i < size; i += width) {
-
- fprintf(stderr, "%4.4lx: ", (unsigned long)i);
-
- if(!nohex) {
- /* hex not disabled, show it */
- for(c = 0; c < width; c++)
- if(i + c < size)
- fprintf(stderr, "%02x ", ptr[i + c]);
- else
- fputs(" ", stderr);
- }
-
- for(c = 0; (c < width) && (i + c < size); c++) {
- /* check for 0D0A; if found, skip past and start a new line of output */
- if(nohex && (i + c + 1 < size) && ptr[i + c] == 0x0D &&
- ptr[i + c + 1] == 0x0A) {
- i += (c + 2 - width);
- break;
- }
- fprintf(stderr, "%c",
- (ptr[i + c] >= 0x20) && (ptr[i + c] < 0x80) ? ptr[i + c] : '.');
- /* check again for 0D0A, to avoid an extra \n if it's at width */
- if(nohex && (i + c + 2 < size) && ptr[i + c + 1] == 0x0D &&
- ptr[i + c + 2] == 0x0A) {
- i += (c + 3 - width);
- break;
- }
- }
- fputc('\n', stderr); /* newline */
- }
-}
+#ifndef CURL_DISABLE_WEBSOCKETS
static CURLcode check_recv(const struct curl_ws_frame *frame,
size_t r_offset, size_t nread, size_t exp_len)
return CURLE_OK;
}
-#if defined(__TANDEM)
-# include <cextdecs.h(PROCESS_DELAY_)>
-#endif
-
-/* 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 CURLcode data_echo(CURL *curl, size_t count,
size_t plen_min, size_t plen_max)
{
if(rblock && sblock) {
fprintf(stderr, "EAGAIN, sleep, try again\n");
- #ifdef _WIN32
+#ifdef _WIN32
Sleep(100);
- #elif defined(__TANDEM)
+#elif defined(__TANDEM)
/* NonStop only defines usleep when building for a threading model */
- # if defined(_PUT_MODEL_) || defined(_KLT_MODEL_)
+# if defined(_PUT_MODEL_) || defined(_KLT_MODEL_)
usleep(100*1000);
- # else
+# else
PROCESS_DELAY_(100*1000);
- # endif
- #else
+# endif
+#else
usleep(100*1000);
- #endif
+#endif
}
}
return r;
}
-static void usage(const char *msg)
+static void usage_ws_data(const char *msg)
{
if(msg)
fprintf(stderr, "%s\n", msg);
#endif
-int main(int argc, char *argv[])
+static int test_ws_data(int argc, char *argv[])
{
-#if !defined(CURL_DISABLE_WEBSOCKETS) && !defined(_MSC_VER)
+#ifndef CURL_DISABLE_WEBSOCKETS
CURL *curl;
CURLcode res = CURLE_OK;
const char *url;
size_t plen_min = 0, plen_max = 0, count = 1;
int ch;
- while((ch = getopt(argc, argv, "c:hm:M:")) != -1) {
+ while((ch = cgetopt(argc, argv, "c:hm:M:")) != -1) {
switch(ch) {
case 'h':
- usage(NULL);
+ usage_ws_data(NULL);
res = CURLE_BAD_FUNCTION_ARGUMENT;
goto cleanup;
case 'c':
- count = (size_t)strtol(optarg, NULL, 10);
+ count = (size_t)strtol(coptarg, NULL, 10);
break;
case 'm':
- plen_min = (size_t)strtol(optarg, NULL, 10);
+ plen_min = (size_t)strtol(coptarg, NULL, 10);
break;
case 'M':
- plen_max = (size_t)strtol(optarg, NULL, 10);
+ plen_max = (size_t)strtol(coptarg, NULL, 10);
break;
default:
- usage("invalid option");
+ usage_ws_data("invalid option");
res = CURLE_BAD_FUNCTION_ARGUMENT;
goto cleanup;
}
}
- argc -= optind;
- argv += optind;
+ argc -= coptind;
+ argv += coptind;
if(!plen_max)
plen_max = plen_min;
}
if(argc != 1) {
- usage(NULL);
+ usage_ws_data(NULL);
res = CURLE_BAD_FUNCTION_ARGUMENT;
goto cleanup;
}
* SPDX-License-Identifier: curl
*
***************************************************************************/
-/* <DESC>
- * WebSockets pingpong
- * </DESC>
- */
-/* curl stuff */
-#include "curl_setup.h"
-#include <curl/curl.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#ifdef _WIN32
-#include <windows.h>
-#else
-#include <sys/time.h>
-#endif
-
#ifndef CURL_DISABLE_WEBSOCKETS
static CURLcode ping(CURL *curl, const char *send_payload)
return CURLE_RECV_ERROR;
}
-/* 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);
-}
-
-#if defined(__TANDEM)
-# include <cextdecs.h(PROCESS_DELAY_)>
-#endif
static CURLcode pingpong(CURL *curl, const char *payload)
{
CURLcode res;
#endif
-int main(int argc, char *argv[])
+static int test_ws_pingpong(int argc, char *argv[])
{
#ifndef CURL_DISABLE_WEBSOCKETS
CURL *curl;
count = 2
docname = 'data-10m'
url = f'https://localhost:{env.https_port}/{docname}'
- client = LocalClient(name='hx-download', env=env)
+ client = LocalClient(name='hx_download', env=env)
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
r = client.run(args=[
run_env['CURL_DEBUG'] = 'multi,http/2'
if swin_max > 0:
run_env['CURL_H2_STREAM_WIN_MAX'] = f'{swin_max}'
- client = LocalClient(name='hx-download', env=env, run_env=run_env)
+ client = LocalClient(name='hx_download', env=env, run_env=run_env)
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
r = client.run(args=[
max_parallel = 5
docname = 'data-10m'
url = f'https://localhost:{env.https_port}/{docname}'
- client = LocalClient(name='hx-download', env=env)
+ client = LocalClient(name='hx_download', env=env)
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
r = client.run(args=[
pause_offset = 12 * 1024
docname = 'data-1m'
url = f'https://localhost:{env.https_port}/{docname}'
- client = LocalClient(name='hx-download', env=env)
+ client = LocalClient(name='hx_download', env=env)
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
r = client.run(args=[
abort_offset = 12 * 1024
docname = 'data-1m'
url = f'https://localhost:{env.https_port}/{docname}'
- client = LocalClient(name='hx-download', env=env)
+ client = LocalClient(name='hx_download', env=env)
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
r = client.run(args=[
fail_offset = 12 * 1024
docname = 'data-1m'
url = f'https://localhost:{env.https_port}/{docname}'
- client = LocalClient(name='hx-download', env=env)
+ client = LocalClient(name='hx_download', env=env)
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
r = client.run(args=[
# before protocol switch has happened
def test_02_25_h2_upgrade_x(self, env: Env, httpd):
url = f'http://localhost:{env.http_port}/data-100k'
- client = LocalClient(name='h2-upgrade-extreme', env=env, timeout=15)
+ client = LocalClient(name='h2_upgrade_extreme', env=env, timeout=15)
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
r = client.run(args=[url])
@pytest.mark.parametrize("proto", ['http/1.1', 'h2', 'h3'])
def test_02_26_session_shared_reuse(self, env: Env, proto, httpd, nghttpx):
url = f'https://{env.authority_for(env.domain1, proto)}/data-100k'
- client = LocalClient(name='tls-session-reuse', env=env)
+ client = LocalClient(name='tls_session_reuse', env=env)
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
r = client.run(args=[proto, url])
def test_02_27a_paused_no_cl(self, env: Env, httpd, nghttpx, proto):
url = f'https://{env.authority_for(env.domain1, proto)}' \
'/curltest/tweak/?&chunks=6&chunk_size=8000'
- client = LocalClient(env=env, name='h2-pausing')
+ client = LocalClient(env=env, name='h2_pausing')
r = client.run(args=['-V', proto, url])
r.check_exit_code(0)
def test_02_27b_paused_no_cl(self, env: Env, httpd, nghttpx, proto):
url = f'https://{env.authority_for(env.domain1, proto)}' \
'/curltest/tweak/?error=502'
- client = LocalClient(env=env, name='h2-pausing')
+ client = LocalClient(env=env, name='h2_pausing')
r = client.run(args=['-V', proto, url])
r.check_exit_code(0)
def test_02_27c_paused_no_cl(self, env: Env, httpd, nghttpx, proto):
url = f'https://{env.authority_for(env.domain1, proto)}' \
'/curltest/tweak/?status=200&chunks=1&chunk_size=100'
- client = LocalClient(env=env, name='h2-pausing')
+ client = LocalClient(env=env, name='h2_pausing')
r = client.run(args=['-V', proto, url])
r.check_exit_code(0)
count = 2
docname = 'data-10m'
url = f'https://localhost:{env.https_port}/{docname}'
- client = LocalClient(name='hx-download', env=env)
+ client = LocalClient(name='hx_download', env=env)
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
r = client.run(args=[
if proto != 'h3':
port = env.nghttpx_https_port
url = f'https://{env.domain1}:{port}/{docname}'
- client = LocalClient(name='hx-download', env=env)
+ client = LocalClient(name='hx_download', env=env)
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
r = client.run(args=[
url = f'https://{env.domain1}:{port}/{docname}'
run_env = os.environ.copy()
run_env['CURL_DEBUG'] = 'multi'
- client = LocalClient(name='hx-download', env=env, run_env=run_env)
+ client = LocalClient(name='hx_download', env=env, run_env=run_env)
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
r = client.run(args=[
url = f'https://{env.domain1}:{port}/{docname}'
run_env = os.environ.copy()
run_env['CURL_DEBUG'] = 'multi'
- client = LocalClient(name='hx-download', env=env, run_env=run_env)
+ client = LocalClient(name='hx_download', env=env, run_env=run_env)
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
r = client.run(args=[
pause_offset = 1024 * 1024
docname = 'bomb-100m.txt.var'
url = f'https://localhost:{env.https_port}/{docname}'
- client = LocalClient(name='hx-download', env=env)
+ client = LocalClient(name='hx_download', env=env)
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
r = client.run(args=[
count = 2
upload_size = 128*1024
url = f'https://localhost:{env.https_port}/curltest/put'
- client = LocalClient(name='hx-upload', env=env)
+ client = LocalClient(name='hx_upload', env=env)
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
r = client.run(args=[
count = 2
upload_size = 128*1024
url = f'https://localhost:{env.https_port}/curltest/put'
- client = LocalClient(name='hx-upload', env=env)
+ client = LocalClient(name='hx_upload', env=env)
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
r = client.run(args=[
count = 2
upload_size = 128*1024
url = f'https://localhost:{env.https_port}/curltest/echo'
- client = LocalClient(name='hx-upload', env=env)
+ client = LocalClient(name='hx_upload', env=env)
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
r = client.run(args=[
pytest.skip("h3 not supported")
if proto == 'h3' and env.curl_uses_lib('msh3'):
pytest.skip("msh3 fails here")
- client = LocalClient(name='upload-pausing', env=env, timeout=60)
+ client = LocalClient(name='upload_pausing', env=env, timeout=60)
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
url = f'https://{env.authority_for(env.domain1, proto)}/curltest/echo?id=[0-0]&die_after=0'
pytest.skip("h3 not supported")
if proto == 'h3' and env.curl_uses_lib('msh3'):
pytest.skip("msh3 fails here")
- client = LocalClient(name='upload-pausing', env=env, timeout=60)
+ client = LocalClient(name='upload_pausing', env=env, timeout=60)
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
url = f'https://{env.authority_for(env.domain1, proto)}/curltest/echo?id=0&just_die=1'
pytest.skip("h3 not supported")
if proto == 'h3' and env.curl_uses_lib('msh3'):
pytest.skip("msh3 fails here")
- client = LocalClient(name='upload-pausing', env=env, timeout=60)
+ client = LocalClient(name='upload_pausing', env=env, timeout=60)
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
url = f'https://{env.authority_for(env.domain1, proto)}/curltest/echo?id=0&die_after_100=1'
count = 1
upload_size = 128*1024
url = f'https://localhost:{env.https_port}/curltest/put-redir-{httpcode}'
- client = LocalClient(name='hx-upload', env=env)
+ client = LocalClient(name='hx_upload', env=env)
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
r = client.run(args=[
if proto != 'h3':
port = env.nghttpx_https_port
url = f'https://{env.domain1}:{port}/curltest/put'
- client = LocalClient(name='hx-upload', env=env)
+ client = LocalClient(name='hx_upload', env=env)
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
r = client.run(args=[
count = 2
docname = 'data10k.data'
url = f'https://{env.domain1}:{caddy.port}/{docname}'
- client = LocalClient(name='hx-download', env=env)
+ client = LocalClient(name='hx_download', env=env)
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
r = client.run(args=[
self.httpd_configure(env, httpd)
# use localhost as we do not have resolve support in local client
url = f'https://localhost:{env.https_port}/push/data1'
- client = LocalClient(name='h2-serverpush', env=env)
+ client = LocalClient(name='h2_serverpush', env=env)
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
r = client.run(args=[url])
count = 2
docname = 'data-10k'
url = f'https://localhost:{env.https_port}/{docname}'
- client = LocalClient(name='hx-download', env=env)
+ client = LocalClient(name='hx_download', env=env)
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
r = client.run(args=[
count = 10
docname = 'data.json'
url = f'https://localhost:{env.https_port}/{docname}'
- client = LocalClient(name='hx-download', env=env, run_env={
+ client = LocalClient(name='hx_download', env=env, run_env={
'CURL_GRACEFUL_SHUTDOWN': '2000',
'CURL_DEBUG': 'ssl,multi'
})
count = 500
docname = 'data.json'
url = f'https://localhost:{env.https_port}/{docname}'
- client = LocalClient(name='hx-download', env=env, run_env={
+ client = LocalClient(name='hx_download', env=env, run_env={
'CURL_GRACEFUL_SHUTDOWN': '2000',
'CURL_DEBUG': 'ssl,multi'
})
@pytest.fixture(autouse=True, scope='class')
def ws_echo(self, env):
- self.run_dir = os.path.join(env.gen_dir, 'ws-echo-server')
+ self.run_dir = os.path.join(env.gen_dir, 'ws_echo_server')
err_file = os.path.join(self.run_dir, 'stderr')
self._rmrf(self.run_dir)
self._mkpath(self.run_dir)
def test_20_02_pingpong_small(self, env: Env, ws_echo):
payload = 125 * "x"
- client = LocalClient(env=env, name='ws-pingpong')
+ client = LocalClient(env=env, name='ws_pingpong')
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
url = f'ws://localhost:{env.ws_port}/'
# the python websocket server does not like 'large' control frames
def test_20_03_pingpong_too_large(self, env: Env, ws_echo):
payload = 127 * "x"
- client = LocalClient(env=env, name='ws-pingpong')
+ client = LocalClient(env=env, name='ws_pingpong')
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
url = f'ws://localhost:{env.ws_port}/'
r.check_exit_code(100) # CURLE_TOO_LARGE
def test_20_04_data_small(self, env: Env, ws_echo):
- client = LocalClient(env=env, name='ws-data')
+ client = LocalClient(env=env, name='ws_data')
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
url = f'ws://localhost:{env.ws_port}/'
r.check_exit_code(0)
def test_20_05_data_med(self, env: Env, ws_echo):
- client = LocalClient(env=env, name='ws-data')
+ client = LocalClient(env=env, name='ws_data')
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
url = f'ws://localhost:{env.ws_port}/'
r.check_exit_code(0)
def test_20_06_data_large(self, env: Env, ws_echo):
- client = LocalClient(env=env, name='ws-data')
+ client = LocalClient(env=env, name='ws_data')
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
url = f'ws://localhost:{env.ws_port}/'
def test_20_07_data_large_small_recv(self, env: Env, ws_echo):
run_env = os.environ.copy()
run_env['CURL_WS_CHUNK_SIZE'] = '1024'
- client = LocalClient(env=env, name='ws-data', run_env=run_env)
+ client = LocalClient(env=env, name='ws_data', run_env=run_env)
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
url = f'ws://localhost:{env.ws_port}/'
def test_20_08_data_very_large(self, env: Env, ws_echo):
run_env = os.environ.copy()
run_env['CURL_WS_CHUNK_EAGAIN'] = '8192'
- client = LocalClient(env=env, name='ws-data', run_env=run_env)
+ client = LocalClient(env=env, name='ws_data', run_env=run_env)
if not client.exists():
pytest.skip(f'example client not built: {client.name}')
url = f'ws://localhost:{env.ws_port}/'
timeout: Optional[float] = None,
run_env: Optional[Dict[str,str]] = None):
self.name = name
- self.path = os.path.join(env.build_dir, f'tests/http/clients/{name}')
+ self.path = os.path.join(env.build_dir, 'tests/http/clients/clients')
self.env = env
self._run_env = run_env
self._timeout = timeout if timeout else env.test_timeout
self._rmf(self._stderrfile)
start = datetime.now()
exception = None
- myargs = [self.path]
+ myargs = [self.path, self.name]
myargs.extend(args)
run_env = None
if self._run_env: