Annotation of embedaddon/curl/docs/HTTP3.md, revision 1.1.1.1

1.1       misho       1: # HTTP3 (and QUIC)
                      2: 
                      3: ## Resources
                      4: 
                      5: [HTTP/3 Explained](https://daniel.haxx.se/http3-explained/) - the online free
                      6: book describing the protocols involved.
                      7: 
                      8: [QUIC implementation](https://github.com/curl/curl/wiki/QUIC-implementation) -
                      9: the wiki page describing the plan for how to support QUIC and HTTP/3 in curl
                     10: and libcurl.
                     11: 
                     12: [quicwg.org](https://quicwg.org/) - home of the official protocol drafts
                     13: 
                     14: ## QUIC libraries
                     15: 
                     16: QUIC libraries we're experimenting with:
                     17: 
                     18: [ngtcp2](https://github.com/ngtcp2/ngtcp2)
                     19: 
                     20: [quiche](https://github.com/cloudflare/quiche)
                     21: 
                     22: ## Experimental!
                     23: 
                     24: HTTP/3 and QUIC support in curl is considered **EXPERIMENTAL** until further
                     25: notice. It needs to be enabled at build-time.
                     26: 
                     27: Further development and tweaking of the HTTP/3 support in curl will happen in
                     28: in the master branch using pull-requests, just like ordinary changes.
                     29: 
                     30: # ngtcp2 version
                     31: 
                     32: ## Build with OpenSSL
                     33: 
                     34: Build (patched) OpenSSL
                     35: 
                     36:      % git clone --depth 1 -b OpenSSL_1_1_1d-quic-draft-27 https://github.com/tatsuhiro-t/openssl
                     37:      % cd openssl
                     38:      % ./config enable-tls1_3 --prefix=<somewhere1>
                     39:      % make
                     40:      % make install_sw
                     41: 
                     42: Build nghttp3
                     43: 
                     44:      % cd ..
                     45:      % git clone https://github.com/ngtcp2/nghttp3
                     46:      % cd nghttp3
                     47:      % autoreconf -i
                     48:      % ./configure --prefix=<somewhere2> --enable-lib-only
                     49:      % make
                     50:      % make install
                     51: 
                     52: Build ngtcp2
                     53: 
                     54:      % cd ..
                     55:      % git clone https://github.com/ngtcp2/ngtcp2
                     56:      % cd ngtcp2
                     57:      % autoreconf -i
                     58:      % ./configure PKG_CONFIG_PATH=<somewhere1>/lib/pkgconfig:<somewhere2>/lib/pkgconfig LDFLAGS="-Wl,-rpath,<somewhere1>/lib" --prefix=<somewhere3>
                     59:      % make
                     60:      % make install
                     61: 
                     62: Build curl
                     63: 
                     64:      % cd ..
                     65:      % git clone https://github.com/curl/curl
                     66:      % cd curl
                     67:      % ./buildconf
                     68:      % LDFLAGS="-Wl,-rpath,<somewhere1>/lib" ./configure --with-ssl=<somewhere1> --with-nghttp3=<somewhere2> --with-ngtcp2=<somewhere3> --enable-alt-svc
                     69:      % make
                     70: 
                     71: ## Build with GnuTLS
                     72: 
                     73: Build (patched) GnuTLS
                     74: 
                     75:      % git clone --depth 1 -b tmp-quic https://gitlab.com/gnutls/gnutls.git
                     76:      % cd gnutls
                     77:      % ./bootstrap
                     78:      % ./configure --disable-doc --prefix=<somewhere1>
                     79:      % make
                     80:      % make install
                     81: 
                     82: Build nghttp3
                     83: 
                     84:      % cd ..
                     85:      % git clone https://github.com/ngtcp2/nghttp3
                     86:      % cd nghttp3
                     87:      % autoreconf -i
                     88:      % ./configure --prefix=<somewhere2> --enable-lib-only
                     89:      % make
                     90:      % make install
                     91: 
                     92: Build ngtcp2
                     93: 
                     94:      % cd ..
                     95:      % git clone https://github.com/ngtcp2/ngtcp2
                     96:      % cd ngtcp2
                     97:      % autoreconf -i
                     98:      % ./configure PKG_CONFIG_PATH=<somewhere1>/lib/pkgconfig:<somewhere2>/lib/pkgconfig LDFLAGS="-Wl,-rpath,<somewhere1>/lib" --prefix=<somewhere3>
                     99:      % make
                    100:      % make install
                    101: 
                    102: Build curl
                    103: 
                    104:      % cd ..
                    105:      % git clone https://github.com/curl/curl
                    106:      % cd curl
                    107:      % ./buildconf
                    108:      % ./configure --without-ssl --with-gnutls=<somewhere1> --with-nghttp3=<somewhere2> --with-ngtcp2=<somewhere3> --enable-alt-svc
                    109:      % make
                    110: 
                    111: # quiche version
                    112: 
                    113: ## build
                    114: 
                    115: Clone quiche and BoringSSL:
                    116: 
                    117:      % git clone --recursive https://github.com/cloudflare/quiche
                    118: 
                    119: Build BoringSSL (it needs to be built manually so it can be reused with curl):
                    120: 
                    121:      % cd quiche/deps/boringssl
                    122:      % mkdir build
                    123:      % cd build
                    124:      % cmake -DCMAKE_POSITION_INDEPENDENT_CODE=on ..
                    125:      % make
                    126:      % cd ..
                    127:      % mkdir -p .openssl/lib
                    128:      % cp build/crypto/libcrypto.a build/ssl/libssl.a .openssl/lib
                    129:      % ln -s $PWD/include .openssl
                    130: 
                    131: Build quiche:
                    132: 
                    133:      % cd ../..
                    134:      % QUICHE_BSSL_PATH=$PWD/deps/boringssl cargo build --release --features pkg-config-meta
                    135: 
                    136: Build curl:
                    137: 
                    138:      % cd ..
                    139:      % git clone https://github.com/curl/curl
                    140:      % cd curl
                    141:      % ./buildconf
                    142:      % ./configure LDFLAGS="-Wl,-rpath,$PWD/../quiche/target/release" --with-ssl=$PWD/../quiche/deps/boringssl/.openssl --with-quiche=$PWD/../quiche/target/release --enable-alt-svc
                    143:      % make
                    144: 
                    145: ## Run
                    146: 
                    147: Use HTTP/3 directly:
                    148: 
                    149:     curl --http3 https://nghttp2.org:8443/
                    150: 
                    151: Upgrade via Alt-Svc:
                    152: 
                    153:     curl --alt-svc altsvc.cache https://quic.aiortc.org/
                    154: 
                    155: See this [list of public HTTP/3 servers](https://bagder.github.io/HTTP3-test/)

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>