# Copyright (c) 2017 - 2018 LiteSpeed Technologies Inc. See LICENSE. LSQUIC Examples =============== test/http_client.c demonstrates how to use HTTP features of QUIC. Usage Examples -------------- Fetch Google's home page: ./http_client -H www.google.com -s 74.125.22.106:443 -p / or even ./http_client -H www.google.co.uk -s 2a00:1450:4009:80c::2003:443 -p / In the example above, -H specifies the domain; it is also used as the value of SNI paramater in the handshake. The IP address and the port number are specified using the -s flag. (Since www.google.com has different IP addresses in different regions, check that you are using the correct IP address by resolving www.google.com first by using nslookup, dig, ping, or some other tool.) POST a file to calculate its CRC32 checksum: ./http_client -H www.litespeedtech.com -s 127.0.0.1:443 \ -p /cgi-bin/crc32.cgi -P file-256M -M POST HTTP/1.1 200 OK content-type: text/plain date: Fri, 09 Jun 2017 08:40:45 GMT server: LiteSpeed alt-svc: quic=":443"; v="35,37" CRC32: 2A0E7DBB This is a good way to check that the payload gets to the other side correctly. The CGI script is: #!/usr/bin/perl use String::CRC32; printf "Content-type: text/plain\r\n\r\nCRC32: %X\n", crc32(*STDIN) On the command line, I do alias crc32="perl -MString::CRC32 -e'printf qq(%X\n), crc32(<>)'" To submit several requests concurrently, one can use -n and -r options: ./http_client -H www.litespeedtech.com -s 127.0.0.1:443 \ -p /cgi-bin/crc32.cgi -P file-256M -M POST -n 3 -r 10 This will open three parallel connections which will make ten POST requests together. To perform load testing, it is good to mix sending and receiving data: for i in {1..100}; do ./http_client $COMMON_OPTS -p /cgi-bin/crc32.cgi -P file-256M \ -M POST >out-post.$i & ./http_client $COMMON_OPTS -p /docs/file-256M >out-get.$i & sleep 1 done If you don't want to create a hundred 256-megabyte out-get.* files, use -K flag to discard output. Control QUIC Settings via -o Flag --------------------------------- Most of the settings in struct lsquic_engine_settings can be controlled via -o flag. With exception of es_versions, which is a bit mask, other es_* options can be mapped to corresponding -o value via s/^es_//: es_cfcw => -o cwcf=12345 es_max_streams_in => -o max_streams_in=123 And so on. The code to set options via -o flag lives in set_engine_option(). It is good to update this function at the same time as member fields are added to struct lsquic_engine_settings. Control LSQUIC Behavior via Environment Variables ------------------------------------------------- LSQUIC_PACER_INTERTICK Number of microsecods to use as constant intertick time in lieu of the pacer's dynamic intertick time approximation. Only available in debug builds. LSQUIC_CUBIC_SAMPLING_RATE Number of microseconds between times CWND is logged at info level. Only available in debug builds. Control Network-Related Stuff ----------------------------- -D Set `do not fragment' flag on outgoing UDP packets. -z BYTES Maximum size of outgoing UDP packets. The default is 1370 bytes for IPv4 socket and 1350 bytes for IPv6 socket. -S opt=val Socket options. Supported options: sndbuf=12345 # Sets SO_SNDBUF rcvbuf=12345 # Sets SO_RCVBUF More Compilation Options ------------------------ -DFULL_CONN_STATS=1 Track some statistics about full connection -- packets in, sent, delayed, stream payload per packet size ratio, and some others -- and print them at NOTICE level when connection is destroyed. This is useful when performing network testing and especially analyzing the effects of changing send buffer size (see -S sndbuf= in the previous section). -DLSQUIC_PACKINTS_SANITY_CHECK=1 Turn on sanity checking for packet interval code. The packet interval code, shared by both send and receive history modules, contained a bug which prompted me to add a checking function. -DLSQUIC_SEND_STATS=0 Turn off statistics collection performed by the send controller: number of packets sent, resent, and delayed. -DLSQUIC_LOWEST_LOG_LEVEL=LSQ_LOG_WARN If you want to go even faster: compile out some log levels entirely. -DLSQUIC_EXTRA_CHECKS=1 Add relatively expensive run-time sanity checks