xref: /curl/docs/internals/HYPER.md (revision 3040971d)
1<!--
2Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
3
4SPDX-License-Identifier: curl
5-->
6
7# Hyper
8
9Hyper is a separate HTTP library written in Rust. curl can be told to use this
10library as a backend to deal with HTTP.
11
12## EXPERIMENTAL
13
14Hyper support in curl is considered **EXPERIMENTAL** until further notice. It
15needs to be explicitly enabled at build-time.
16
17Further development and tweaking of the Hyper backend support in curl happens
18in the master branch using pull-requests, just like ordinary changes.
19
20## Hyper version
21
22The C API for Hyper is brand new and is still under development.
23
24## Build curl with hyper
25
26Using Rust 1.64.0 or later, build hyper and enable its C API like this:
27
28     % git clone https://github.com/hyperium/hyper
29     % cd hyper
30     % RUSTFLAGS="--cfg hyper_unstable_ffi" cargo rustc --features client,http1,http2,ffi --crate-type cdylib
31
32Also, `--release` can be added for a release (optimized) build.
33
34Build curl to use hyper's C API:
35
36     % git clone https://github.com/curl/curl
37     % cd curl
38     % autoreconf -fi
39     % ./configure LDFLAGS="-Wl,-rpath,<hyper-dir>/target/debug -Wl,-rpath,<hyper-dir>/target/release" --with-openssl --with-hyper=<hyper-dir>
40     % make
41
42# Using Hyper internally
43
44Hyper is a low level HTTP transport library. curl itself provides all HTTP
45headers and Hyper provides all received headers back to curl.
46
47Therefore, most of the "header logic" in curl as in responding to and acting
48on specific input and output headers are done the same way in curl code.
49
50The API in Hyper delivers received HTTP headers as (cleaned up) name=value
51pairs, making it impossible for curl to know the exact byte representation
52over the wire with Hyper.
53
54## Limitations
55
56The hyper backend does not support
57
58- `CURLOPT_IGNORE_CONTENT_LENGTH`
59- `--raw` and disabling `CURLOPT_HTTP_TRANSFER_DECODING`
60- RTSP
61- hyper is much stricter about what HTTP header contents it allows
62- leading whitespace in first HTTP/1 response header
63- HTTP/0.9
64- HTTP/2 upgrade using HTTP:// URLs. Aka 'h2c'
65- HTTP/2 in general. Hyper has support for HTTP/2 but the curl side
66  needs changes so that a `hyper_clientconn` can last for the duration
67  of a connection. Probably this means turning the Hyper HTTP/2 backend
68  into a connection filter.
69
70## Remaining issues
71
72This backend is still not feature complete with the native backend. Areas that
73still need attention and verification include:
74
75- multiplexed HTTP/2
76- h2 Upgrade:
77- receiving HTTP/1 trailers
78- sending HTTP/1 trailers
79