| # QUICHE | |
| QUICHE stands for QUIC, Http, Etc. It is Google's production-ready | |
| implementation of QUIC, HTTP/2, HTTP/3, and related protocols and tools. It | |
| powers Google's servers, Chromium, Envoy, and other projects. It is actively | |
| developed and maintained. | |
| There are two public QUICHE repositories. Either one may be used by embedders, | |
| as they are automatically kept in sync: | |
| * https://quiche.googlesource.com/quiche | |
| * https://github.com/google/quiche | |
| To embed QUICHE in your project, platform APIs need to be implemented and build | |
| files need to be created. Note that it is on the QUICHE team's roadmap to | |
| include default implementation for all platform APIs and to open-source build | |
| files. In the meanwhile, take a look at open source embedders like Chromium and | |
| Envoy to get started: | |
| * [Platform implementations in Chromium](https://source.chromium.org/chromium/chromium/src/+/main:net/third_party/quiche/overrides/quiche_platform_impl/) | |
| * [Build file in Chromium](https://source.chromium.org/chromium/chromium/src/+/main:net/third_party/quiche/BUILD.gn) | |
| * [Platform implementations in Envoy](https://github.com/envoyproxy/envoy/tree/master/source/common/quic/platform) | |
| * [Build file in Envoy](https://github.com/envoyproxy/envoy/blob/main/bazel/external/quiche.BUILD) | |
| To contribute to QUICHE, follow instructions at | |
| [CONTRIBUTING.md](CONTRIBUTING.md). | |
| QUICHE is only supported on little-endian platforms. | |
| ## Build and run standalone QUICHE | |
| QUICHE has binaries that can run on Linux platforms. | |
| Follow the [instructions](https://bazel.build/install) to install Bazel. | |
| ``` | |
| sudo apt install libicu-dev clang lld | |
| cd <directory that will be the root of your quiche implmentation> | |
| git clone https://github.com/google/quiche.git | |
| cd quiche | |
| CC=clang bazel build -c opt //... | |
| ./bazel-bin/quiche/<target_name> <arguments> | |
| ``` | |
| There are several targets that can be built and then run. Full usage | |
| instructions are available using the `--helpfull` flag on any binary. | |
| * quic_packet_printer: from a provided packet, parses and prints out the | |
| contents that are accessible without decryption. | |
| Usage: `quic_packet_printer server|client <hex dump of packet>` | |
| * crypto_message_printer: dumps the contents of a QUIC crypto handshake | |
| message in a human readable format. | |
| Usage: `crypto_message_printer_bin <hex of message>` | |
| * quic_client: connects to a host using QUIC and HTTP/3, sends a request to | |
| the provided URL, and displays the response. | |
| Usage: `quic_client <URL>` | |
| * quic_server: listens forever on --port (default 6121) until halted via | |
| ctrl-c. | |
| * masque_client: tunnels to a URL via an identified proxy (See RFC 9298). | |
| Usage: `masque_client [options] <proxy-url> <urls>` | |
| * masque_server: a MASQUE tunnel proxy that defaults to port 9661. | |
| Usage: `masque_server` | |
| * web_transport_test_server: a server that clients can connect to via | |
| WebTransport. | |
| * moqt_relay: a relay for the Media Over QUIC transport for publishers and | |
| subscribers can connect to. | |
| Usage: `moqt_relay` | |
| ## Logging | |
| Most log messages in QUICHE use the QUICHE_DLOG macro. In standalone quiche, | |
| these all either go to stderr, or are suppressed, based on the --stderrthreshold | |
| flag. | |
| To send INFO level log messages to a file, you would therefore invoke | |
| `<binary> <args> > <logfile> 2>&1` | |
| Use the `--helpfull` flag for more. |