nghttp2/package_README.html

870 lines
54 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>nghttp2 - HTTP/2.0 C Library &mdash; nghttp2 0.3.0-DEV documentation</title>
<link rel="stylesheet" href="_static/default.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="_static/default2.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '0.3.0-DEV',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<link rel="top" title="nghttp2 0.3.0-DEV documentation" href="index.html" />
<link rel="next" title="API Reference" href="apiref.html" />
<link rel="prev" title="nghttp2 - HTTP/2.0 C Library" href="index.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="apiref.html" title="API Reference"
accesskey="N">next</a> |</li>
<li class="right" >
<a href="index.html" title="nghttp2 - HTTP/2.0 C Library"
accesskey="P">previous</a> |</li>
<li><a href="index.html">nghttp2 0.3.0-DEV documentation</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<div class="section" id="nghttp2-http-2-0-c-library">
<h1>nghttp2 - HTTP/2.0 C Library<a class="headerlink" href="#nghttp2-http-2-0-c-library" title="Permalink to this headline"></a></h1>
<p>This is an experimental implementation of Hypertext Transfer Protocol
version 2.0.</p>
<div class="section" id="development-status">
<h2>Development Status<a class="headerlink" href="#development-status" title="Permalink to this headline"></a></h2>
<p>We started to implement HTTP-draft-07/2.0
(<a class="reference external" href="http://tools.ietf.org/html/draft-ietf-httpbis-http2-07">http://tools.ietf.org/html/draft-ietf-httpbis-http2-07</a>) and the
header compression
(<a class="reference external" href="http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-04">http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-04</a>).</p>
<p>The nghttp2 code base was forked from spdylay project.</p>
<table border="1" class="docutils">
<colgroup>
<col width="60%" />
<col width="40%" />
</colgroup>
<thead valign="bottom">
<tr class="row-odd"><th class="head">Features</th>
<th class="head">HTTP-draft-07/2.0</th>
</tr>
</thead>
<tbody valign="top">
<tr class="row-even"><td>:authority</td>
<td>Done</td>
</tr>
<tr class="row-odd"><td>HPACK-draft-04</td>
<td>Done</td>
</tr>
<tr class="row-even"><td>SETTINGS_HEADER_TABLE_SIZE</td>
<td>Done</td>
</tr>
<tr class="row-odd"><td>SETTINGS_ENABLE_PUSH</td>
<td>Done</td>
</tr>
<tr class="row-even"><td>FRAME_SIZE_ERROR</td>
<td>Done</td>
</tr>
<tr class="row-odd"><td>SETTINGS with ACK</td>
<td>Done</td>
</tr>
<tr class="row-even"><td>Header Continuation</td>
<td>&nbsp;</td>
</tr>
<tr class="row-odd"><td>ALPN</td>
<td>&nbsp;</td>
</tr>
</tbody>
</table>
</div>
<div class="section" id="public-test-server">
<h2>Public Test Server<a class="headerlink" href="#public-test-server" title="Permalink to this headline"></a></h2>
<p>The following endpoints are available to try out nghttp2
implementation. These endpoints supports <tt class="docutils literal"><span class="pre">HTTP-draft-07/2.0</span></tt> and
the earlier draft versions are not supporeted.</p>
<ul>
<li><p class="first"><a class="reference external" href="https://106.186.112.116">https://106.186.112.116</a> (TLS + NPN)</p>
<p>NPN offers <tt class="docutils literal"><span class="pre">HTTP-draft-07/2.0</span></tt>, <tt class="docutils literal"><span class="pre">spdy/3.1</span></tt>, <tt class="docutils literal"><span class="pre">spdy/3</span></tt>,
<tt class="docutils literal"><span class="pre">spdy/2</span></tt> and <tt class="docutils literal"><span class="pre">http/1.1</span></tt>.</p>
<p>Note: certificate is self-signed and a browser will show alert</p>
</li>
<li><p class="first"><a class="reference external" href="http://106.186.112.116">http://106.186.112.116</a> (Upgrade + Direct)</p>
</li>
</ul>
</div>
<div class="section" id="requirements">
<h2>Requirements<a class="headerlink" href="#requirements" title="Permalink to this headline"></a></h2>
<p>The following packages are needed to build the library:</p>
<ul class="simple">
<li>pkg-config &gt;= 0.20</li>
<li>zlib &gt;= 1.2.3</li>
</ul>
<p>To build and run the unit test programs, the following packages are
required:</p>
<ul class="simple">
<li>cunit &gt;= 2.1</li>
</ul>
<p>To build the documentation, you need to install:</p>
<ul class="simple">
<li>sphinx (<a class="reference external" href="http://sphinx-doc.org/">http://sphinx-doc.org/</a>)</li>
</ul>
<p>To build and run the application programs (<tt class="docutils literal"><span class="pre">nghttp</span></tt>, <tt class="docutils literal"><span class="pre">nghttpd</span></tt> and
<tt class="docutils literal"><span class="pre">nghttpx</span></tt>) in <tt class="docutils literal"><span class="pre">src</span></tt> directory, the following packages are
required:</p>
<ul class="simple">
<li>OpenSSL &gt;= 1.0.1</li>
<li>libevent-openssl &gt;= 2.0.8</li>
</ul>
<p>To enable SPDY protocol in the application program <tt class="docutils literal"><span class="pre">nghttpx</span></tt>, the
following packages are required:</p>
<ul class="simple">
<li>spdylay &gt;= 1.0.0</li>
</ul>
<p>To enable <tt class="docutils literal"><span class="pre">-a</span></tt> option (getting linked assets from the downloaded
resource) in <tt class="docutils literal"><span class="pre">nghttp</span></tt>, the following packages are needed:</p>
<ul class="simple">
<li>libxml2 &gt;= 2.7.7</li>
</ul>
<p>The header compression test tools in hdtest directory require the
following package:</p>
<ul class="simple">
<li>jansson &gt;= 2.5</li>
</ul>
<p>If you are using Ubuntu 12.04, you need the following packages
installed:</p>
<ul class="simple">
<li>autoconf</li>
<li>automake</li>
<li>autotools-dev</li>
<li>libtool</li>
<li>pkg-config</li>
<li>zlib1g-dev</li>
<li>libcunit1-dev</li>
<li>libssl-dev</li>
<li>libxml2-dev</li>
<li>libevent-dev</li>
<li>libjansson-dev</li>
</ul>
<p>spdylay is not packaged in Ubuntu, so you need to build it yourself:
<a class="reference external" href="http://spdylay.sourceforge.net/">http://spdylay.sourceforge.net/</a></p>
</div>
<div class="section" id="build-from-git">
<h2>Build from git<a class="headerlink" href="#build-from-git" title="Permalink to this headline"></a></h2>
<p>Building from git is easy, but please be sure that at least autoconf 2.68 is
used:</p>
<div class="highlight-c"><pre>$ autoreconf -i
$ automake
$ autoconf
$ ./configure
$ make</pre>
</div>
</div>
<div class="section" id="building-documentation">
<h2>Building documentation<a class="headerlink" href="#building-documentation" title="Permalink to this headline"></a></h2>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">Documentation is still incomplete.</p>
</div>
<p>To build documentation, run:</p>
<div class="highlight-c"><pre>$ make html</pre>
</div>
<p>The documents will be generated under <tt class="docutils literal"><span class="pre">doc/manual/html/</span></tt>.</p>
<p>The generated documents will not be installed with <tt class="docutils literal"><span class="pre">make</span> <span class="pre">install</span></tt>.</p>
<p>The online documentation is available at
<a class="reference external" href="http://tatsuhiro-t.github.io/nghttp2/">http://tatsuhiro-t.github.io/nghttp2/</a></p>
</div>
<div class="section" id="client-server-and-proxy-programs">
<h2>Client, Server and Proxy programs<a class="headerlink" href="#client-server-and-proxy-programs" title="Permalink to this headline"></a></h2>
<p>The src directory contains HTTP/2.0 client, server and proxy programs.</p>
<div class="section" id="nghttp-client">
<h3>nghttp - client<a class="headerlink" href="#nghttp-client" title="Permalink to this headline"></a></h3>
<p><tt class="docutils literal"><span class="pre">nghttp</span></tt> is a HTTP/2.0 client. It can connect to the HTTP/2.0 server
with prior knowledge, HTTP Upgrade and NPN TLS extension.</p>
<p>It has verbose output mode for framing information. Here is sample
output from <tt class="docutils literal"><span class="pre">nghttp</span></tt> client:</p>
<div class="highlight-c"><pre>$ src/nghttp -vn https://localhost:8443
[ 0.003] NPN select next protocol: the remote server offers:
* HTTP-draft-07/2.0
* spdy/3
* spdy/2
* http/1.1
NPN selected the protocol: HTTP-draft-07/2.0
[ 0.005] send SETTINGS frame &lt;length=16, flags=0x00, stream_id=0&gt;
(niv=2)
[SETTINGS_MAX_CONCURRENT_STREAMS(4):100]
[SETTINGS_INITIAL_WINDOW_SIZE(7):65535]
[ 0.006] send HEADERS frame &lt;length=47, flags=0x05, stream_id=1&gt;
; END_STREAM | END_HEADERS
; Open new stream
:authority: localhost:8443
:method: GET
:path: /
:scheme: https
accept: */*
accept-encoding: gzip, deflate
user-agent: nghttp2/0.1.0-DEV
[ 0.006] recv SETTINGS frame &lt;length=16, flags=0x00, stream_id=0&gt;
(niv=2)
[SETTINGS_MAX_CONCURRENT_STREAMS(4):100]
[SETTINGS_INITIAL_WINDOW_SIZE(7):65535]
[ 0.006] send SETTINGS frame &lt;length=0, flags=0x01, stream_id=0&gt;
; ACK
(niv=0)
[ 0.006] recv WINDOW_UPDATE frame &lt;length=4, flags=0x00, stream_id=0&gt;
(window_size_increment=1000000007)
[ 0.006] recv SETTINGS frame &lt;length=0, flags=0x01, stream_id=0&gt;
; ACK
(niv=0)
[ 0.006] recv HEADERS frame &lt;length=132, flags=0x04, stream_id=1&gt;
; END_HEADERS
; First response header
:status: 200
accept-ranges: bytes
content-encoding: gzip
content-length: 146
content-type: text/html
date: Sun, 27 Oct 2013 14:23:54 GMT
etag: "b1-4e5535a027780-gzip"
last-modified: Sun, 01 Sep 2013 14:34:22 GMT
server: Apache/2.4.6 (Debian)
vary: Accept-Encoding
via: 1.1 nghttpx
[ 0.006] recv DATA frame &lt;length=146, flags=0x00, stream_id=1&gt;
[ 0.006] recv DATA frame &lt;length=0, flags=0x01, stream_id=1&gt;
; END_STREAM
[ 0.007] send GOAWAY frame &lt;length=8, flags=0x00, stream_id=0&gt;
(last_stream_id=0, error_code=NO_ERROR(0), opaque_data(0)=[])</pre>
</div>
<p>The HTTP Upgrade is performed like this:</p>
<div class="highlight-c"><pre>$ src/nghttp -vnu http://localhost:8080
[ 0.000] HTTP Upgrade request
GET / HTTP/1.1
Host: localhost:8080
Connection: Upgrade, HTTP2-Settings
Upgrade: HTTP-draft-07/2.0
HTTP2-Settings: AAAABAAAAGQAAAAHAAD__w
Accept: */*
User-Agent: nghttp2/0.1.0-DEV
[ 0.000] HTTP Upgrade response
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: HTTP-draft-07/2.0
[ 0.001] HTTP Upgrade success
[ 0.001] send SETTINGS frame &lt;length=16, flags=0x00, stream_id=0&gt;
(niv=2)
[SETTINGS_MAX_CONCURRENT_STREAMS(4):100]
[SETTINGS_INITIAL_WINDOW_SIZE(7):65535]
[ 0.001] recv SETTINGS frame &lt;length=16, flags=0x00, stream_id=0&gt;
(niv=2)
[SETTINGS_MAX_CONCURRENT_STREAMS(4):100]
[SETTINGS_INITIAL_WINDOW_SIZE(7):65535]
[ 0.001] recv WINDOW_UPDATE frame &lt;length=4, flags=0x00, stream_id=0&gt;
(window_size_increment=1000000007)
[ 0.001] recv HEADERS frame &lt;length=121, flags=0x04, stream_id=1&gt;
; END_HEADERS
; First response header
:status: 200
accept-ranges: bytes
content-length: 177
content-type: text/html
date: Sun, 27 Oct 2013 14:26:04 GMT
etag: "b1-4e5535a027780"
last-modified: Sun, 01 Sep 2013 14:34:22 GMT
server: Apache/2.4.6 (Debian)
vary: Accept-Encoding
via: 1.1 nghttpx
[ 0.001] recv DATA frame &lt;length=177, flags=0x00, stream_id=1&gt;
[ 0.001] recv DATA frame &lt;length=0, flags=0x01, stream_id=1&gt;
; END_STREAM
[ 0.001] send SETTINGS frame &lt;length=0, flags=0x01, stream_id=0&gt;
; ACK
(niv=0)
[ 0.001] send GOAWAY frame &lt;length=8, flags=0x00, stream_id=0&gt;
(last_stream_id=0, error_code=NO_ERROR(0), opaque_data(0)=[])
[ 0.001] recv SETTINGS frame &lt;length=0, flags=0x01, stream_id=0&gt;
; ACK
(niv=0)</pre>
</div>
</div>
<div class="section" id="nghttpd-server">
<h3>nghttpd - server<a class="headerlink" href="#nghttpd-server" title="Permalink to this headline"></a></h3>
<p><tt class="docutils literal"><span class="pre">nghttpd</span></tt> is static web server. It is single threaded and
multiplexes connections using non-blocking socket.</p>
<p>By default, it uses SSL/TLS connection. Use <tt class="docutils literal"><span class="pre">--no-tls</span></tt> option to
disable it.</p>
<p><tt class="docutils literal"><span class="pre">nghttpd</span></tt> only accept the HTTP/2.0 connection via NPN or direct
HTTP/2.0 connection. No HTTP Upgrade is supported.</p>
<p>Just like <tt class="docutils literal"><span class="pre">nghttp</span></tt>, it has verbose output mode for framing
information. Here is sample output from <tt class="docutils literal"><span class="pre">nghttpd</span></tt> server:</p>
<div class="highlight-c"><pre>$ src/nghttpd --no-tls -v 8080
IPv4: listen on port 8080
IPv6: listen on port 8080
[id=1] [ 1.189] send SETTINGS frame &lt;length=8, flags=0x00, stream_id=0&gt;
(niv=1)
[SETTINGS_MAX_CONCURRENT_STREAMS(4):100]
[id=1] [ 1.191] recv SETTINGS frame &lt;length=16, flags=0x00, stream_id=0&gt;
(niv=2)
[SETTINGS_MAX_CONCURRENT_STREAMS(4):100]
[SETTINGS_INITIAL_WINDOW_SIZE(7):65535]
[id=1] [ 1.191] recv HEADERS frame &lt;length=47, flags=0x05, stream_id=1&gt;
; END_STREAM | END_HEADERS
; Open new stream
:authority: localhost:8080
:method: GET
:path: /
:scheme: http
accept: */*
accept-encoding: gzip, deflate
user-agent: nghttp2/0.1.0-DEV
[id=1] [ 1.192] send SETTINGS frame &lt;length=0, flags=0x01, stream_id=0&gt;
; ACK
(niv=0)
[id=1] [ 1.192] send HEADERS frame &lt;length=70, flags=0x04, stream_id=1&gt;
; END_HEADERS
; First response header
:status: 404
content-encoding: gzip
content-type: text/html; charset=UTF-8
date: Sun, 27 Oct 2013 14:27:53 GMT
server: nghttpd nghttp2/0.1.0-DEV
[id=1] [ 1.192] send DATA frame &lt;length=117, flags=0x00, stream_id=1&gt;
[id=1] [ 1.192] send DATA frame &lt;length=0, flags=0x01, stream_id=1&gt;
; END_STREAM
[id=1] [ 1.192] stream_id=1 closed
[id=1] [ 1.192] recv SETTINGS frame &lt;length=0, flags=0x01, stream_id=0&gt;
; ACK
(niv=0)
[id=1] [ 1.192] recv GOAWAY frame &lt;length=8, flags=0x00, stream_id=0&gt;
(last_stream_id=0, error_code=NO_ERROR(0), opaque_data(0)=[])
[id=1] [ 1.192] closed</pre>
</div>
</div>
<div class="section" id="nghttpx-proxy">
<h3>nghttpx - proxy<a class="headerlink" href="#nghttpx-proxy" title="Permalink to this headline"></a></h3>
<p>The <tt class="docutils literal"><span class="pre">nghttpx</span></tt> is a multi-threaded reverse proxy for
HTTP-draft-07/2.0, SPDY and HTTP/1.1. It has several operation modes:</p>
<table border="1" class="docutils">
<colgroup>
<col width="24%" />
<col width="40%" />
<col width="19%" />
<col width="17%" />
</colgroup>
<thead valign="bottom">
<tr class="row-odd"><th class="head">Mode option</th>
<th class="head">Frontend</th>
<th class="head">Backend</th>
<th class="head">Note</th>
</tr>
</thead>
<tbody valign="top">
<tr class="row-even"><td>default mode</td>
<td>HTTP/2.0, SPDY, HTTP/1.1 (TLS)</td>
<td>HTTP/1.1</td>
<td>Reverse proxy</td>
</tr>
<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">--http2-proxy</span></tt></td>
<td>HTTP/2.0, SPDY, HTTP/1.1 (TLS)</td>
<td>HTTP/1.1</td>
<td>SPDY proxy</td>
</tr>
<tr class="row-even"><td><tt class="docutils literal"><span class="pre">--http2-bridge</span></tt></td>
<td>HTTP/2.0, SPDY, HTTP/1.1 (TLS)</td>
<td>HTTP/2.0 (TLS)</td>
<td>&nbsp;</td>
</tr>
<tr class="row-odd"><td><tt class="docutils literal"><span class="pre">--client</span></tt></td>
<td>HTTP/2.0, HTTP/1.1</td>
<td>HTTP/2.0 (TLS)</td>
<td>&nbsp;</td>
</tr>
<tr class="row-even"><td><tt class="docutils literal"><span class="pre">--client-proxy</span></tt></td>
<td>HTTP/2.0, HTTP/1.1</td>
<td>HTTP/2.0 (TLS)</td>
<td>Forward proxy</td>
</tr>
</tbody>
</table>
<p>The interesting mode at the moment is the default mode. It works like
a reverse proxy and listens HTTP-draft-07/2.0, SPDY and HTTP/1.1 and
can be deployed SSL/TLS terminator for existing web server.</p>
<p>The default mode, <tt class="docutils literal"><span class="pre">--http2-proxy</span></tt> and <tt class="docutils literal"><span class="pre">--http2-bridge</span></tt> modes use
SSL/TLS in the frontend connection by default. To disable SSL/TLS, use
<tt class="docutils literal"><span class="pre">--frontend-no-tls</span></tt> option. If that option is used, SPDY is disabled
in the frontend and incoming HTTP/1.1 connection can be upgraded to
HTTP/2.0 through HTTP Upgrade.</p>
<p>The <tt class="docutils literal"><span class="pre">--http2-bridge</span></tt>, <tt class="docutils literal"><span class="pre">--client</span></tt> and <tt class="docutils literal"><span class="pre">--client-proxy</span></tt> modes use
SSL/TLS in the backend connection by deafult. To disable SSL/TLS, use
<tt class="docutils literal"><span class="pre">--backend-no-tls</span></tt> option.</p>
<p>The <tt class="docutils literal"><span class="pre">nghttpx</span></tt> supports configuration file. See <tt class="docutils literal"><span class="pre">--conf</span></tt> option and
sample configuration file <tt class="docutils literal"><span class="pre">nghttpx.conf.sample</span></tt>.</p>
<p>In the default mode, (without any of <tt class="docutils literal"><span class="pre">--http2-proxy</span></tt>,
<tt class="docutils literal"><span class="pre">--http2-bridge</span></tt>, <tt class="docutils literal"><span class="pre">--client-proxy</span></tt> and <tt class="docutils literal"><span class="pre">--client</span></tt> options),
<tt class="docutils literal"><span class="pre">nghttpx</span></tt> works as reverse proxy to the backend server:</p>
<div class="highlight-c"><div class="highlight"><pre><span class="n">Client</span> <span class="o">&lt;--</span> <span class="p">(</span><span class="n">HTTP</span><span class="o">/</span><span class="mf">2.0</span><span class="p">,</span> <span class="n">SPDY</span><span class="p">,</span> <span class="n">HTTP</span><span class="o">/</span><span class="mf">1.1</span><span class="p">)</span> <span class="o">--&gt;</span> <span class="n">nghttpx</span> <span class="o">&lt;--</span> <span class="p">(</span><span class="n">HTTP</span><span class="o">/</span><span class="mf">1.1</span><span class="p">)</span> <span class="o">--&gt;</span> <span class="n">Web</span> <span class="n">Server</span>
<span class="p">[</span><span class="n">reverse</span> <span class="n">proxy</span><span class="p">]</span>
</pre></div>
</div>
<p>With <tt class="docutils literal"><span class="pre">--http2-proxy</span></tt> option, it works as so called secure proxy (aka
SPDY proxy):</p>
<div class="highlight-c"><div class="highlight"><pre><span class="n">Client</span> <span class="o">&lt;--</span> <span class="p">(</span><span class="n">HTTP</span><span class="o">/</span><span class="mf">2.0</span><span class="p">,</span> <span class="n">SPDY</span><span class="p">,</span> <span class="n">HTTP</span><span class="o">/</span><span class="mf">1.1</span><span class="p">)</span> <span class="o">--&gt;</span> <span class="n">nghttpx</span> <span class="o">&lt;--</span> <span class="p">(</span><span class="n">HTTP</span><span class="o">/</span><span class="mf">1.1</span><span class="p">)</span> <span class="o">--&gt;</span> <span class="n">Proxy</span>
<span class="p">[</span><span class="n">secure</span> <span class="n">proxy</span><span class="p">]</span> <span class="p">(</span><span class="n">e</span><span class="p">.</span><span class="n">g</span><span class="p">.,</span> <span class="n">Squid</span><span class="p">)</span>
</pre></div>
</div>
<p>The <tt class="docutils literal"><span class="pre">Client</span></tt> in the above is needs to be configured to use
<tt class="docutils literal"><span class="pre">nghttpx</span></tt> as secure proxy.</p>
<p>At the time of this writing, Chrome is the only browser which supports
secure proxy. The one way to configure Chrome to use secure proxy is
create proxy.pac script like this:</p>
<div class="highlight-c"><div class="highlight"><pre><span class="n">function</span> <span class="nf">FindProxyForURL</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">host</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="s">&quot;HTTPS SERVERADDR:PORT&quot;</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</div>
<p><tt class="docutils literal"><span class="pre">SERVERADDR</span></tt> and <tt class="docutils literal"><span class="pre">PORT</span></tt> is the hostname/address and port of the
machine nghttpx is running. Please note that Chrome requires valid
certificate for secure proxy.</p>
<p>Then run chrome with the following arguments:</p>
<div class="highlight-c"><pre>$ google-chrome --proxy-pac-url=file:///path/to/proxy.pac --use-npn</pre>
</div>
<p>With <tt class="docutils literal"><span class="pre">--http2-bridge</span></tt>, it accepts HTTP/2.0, SPDY and HTTP/1.1
connections and communicates with backend in HTTP/2.0:</p>
<div class="highlight-c"><div class="highlight"><pre><span class="n">Client</span> <span class="o">&lt;--</span> <span class="p">(</span><span class="n">HTTP</span><span class="o">/</span><span class="mf">2.0</span><span class="p">,</span> <span class="n">SPDY</span><span class="p">,</span> <span class="n">HTTP</span><span class="o">/</span><span class="mf">1.1</span><span class="p">)</span> <span class="o">--&gt;</span> <span class="n">nghttpx</span> <span class="o">&lt;--</span> <span class="p">(</span><span class="n">HTTP</span><span class="o">/</span><span class="mf">2.0</span><span class="p">)</span> <span class="o">--&gt;</span> <span class="n">Web</span> <span class="n">or</span> <span class="n">HTTP</span><span class="o">/</span><span class="mf">2.0</span> <span class="n">Proxy</span> <span class="n">etc</span>
<span class="p">(</span><span class="n">e</span><span class="p">.</span><span class="n">g</span><span class="p">.,</span> <span class="n">nghttpx</span> <span class="o">-</span><span class="n">s</span><span class="p">)</span>
</pre></div>
</div>
<p>With <tt class="docutils literal"><span class="pre">--client-proxy</span></tt> option, it works as forward proxy and expects
that the backend is HTTP/2.0 proxy:</p>
<div class="highlight-c"><div class="highlight"><pre><span class="n">Client</span> <span class="o">&lt;--</span> <span class="p">(</span><span class="n">HTTP</span><span class="o">/</span><span class="mf">2.0</span><span class="p">,</span> <span class="n">HTTP</span><span class="o">/</span><span class="mf">1.1</span><span class="p">)</span> <span class="o">--&gt;</span> <span class="n">nghttpx</span> <span class="o">&lt;--</span> <span class="p">(</span><span class="n">HTTP</span><span class="o">/</span><span class="mf">2.0</span><span class="p">)</span> <span class="o">--&gt;</span> <span class="n">HTTP</span><span class="o">/</span><span class="mf">2.0</span> <span class="n">Proxy</span>
<span class="p">[</span><span class="n">forward</span> <span class="n">proxy</span><span class="p">]</span> <span class="p">(</span><span class="n">e</span><span class="p">.</span><span class="n">g</span><span class="p">.,</span> <span class="n">nghttpx</span> <span class="o">-</span><span class="n">s</span><span class="p">)</span>
</pre></div>
</div>
<p>The <tt class="docutils literal"><span class="pre">Client</span></tt> is needs to be configured to use nghttpx as forward
proxy. The frontend HTTP/1.1 connection can be upgraded to HTTP/2.0
through HTTP Upgrade. With the above configuration, one can use
HTTP/1.1 client to access and test their HTTP/2.0 servers.</p>
<p>With <tt class="docutils literal"><span class="pre">--client</span></tt> option, it works as reverse proxy and expects that
the backend is HTTP/2.0 Web server:</p>
<div class="highlight-c"><div class="highlight"><pre><span class="n">Client</span> <span class="o">&lt;--</span> <span class="p">(</span><span class="n">HTTP</span><span class="o">/</span><span class="mf">2.0</span><span class="p">,</span> <span class="n">HTTP</span><span class="o">/</span><span class="mf">1.1</span><span class="p">)</span> <span class="o">--&gt;</span> <span class="n">nghttpx</span> <span class="o">&lt;--</span> <span class="p">(</span><span class="n">HTTP</span><span class="o">/</span><span class="mf">2.0</span><span class="p">)</span> <span class="o">--&gt;</span> <span class="n">Web</span> <span class="n">Server</span>
<span class="p">[</span><span class="n">reverse</span> <span class="n">proxy</span><span class="p">]</span>
</pre></div>
</div>
<p>The frontend HTTP/1.1 connection can be upgraded to HTTP/2.0
through HTTP Upgrade.</p>
<p>For the operation modes which talk to the backend in HTTP/2.0 over
SSL/TLS, the backend connections can be tunneled though HTTP
proxy. The proxy is specified using <tt class="docutils literal"><span class="pre">--backend-http-proxy-uri</span></tt>
option. The following figure illustrates the example of
<tt class="docutils literal"><span class="pre">--http2-bridge</span></tt> and <tt class="docutils literal"><span class="pre">--backend-http-proxy-uri</span></tt> option to talk to
the outside HTTP/2.0 proxy through HTTP proxy:</p>
<div class="highlight-c"><div class="highlight"><pre><span class="n">Client</span> <span class="o">&lt;--</span> <span class="p">(</span><span class="n">HTTP</span><span class="o">/</span><span class="mf">2.0</span><span class="p">,</span> <span class="n">SPDY</span><span class="p">,</span> <span class="n">HTTP</span><span class="o">/</span><span class="mf">1.1</span><span class="p">)</span> <span class="o">--&gt;</span> <span class="n">nghttpx</span> <span class="o">&lt;--</span> <span class="p">(</span><span class="n">HTTP</span><span class="o">/</span><span class="mf">2.0</span><span class="p">)</span> <span class="o">--</span>
<span class="o">--===================---&gt;</span> <span class="n">HTTP</span><span class="o">/</span><span class="mf">2.0</span> <span class="n">Proxy</span>
<span class="p">(</span><span class="n">HTTP</span> <span class="n">proxy</span> <span class="n">tunnel</span><span class="p">)</span> <span class="p">(</span><span class="n">e</span><span class="p">.</span><span class="n">g</span><span class="p">.,</span> <span class="n">nghttpx</span> <span class="o">-</span><span class="n">s</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="header-compression-test-tools">
<h2>Header compression test tools<a class="headerlink" href="#header-compression-test-tools" title="Permalink to this headline"></a></h2>
<p>The <tt class="docutils literal"><span class="pre">hdtest</span></tt> directory contains header compression test tools. The
<tt class="docutils literal"><span class="pre">deflatehd</span></tt> is command-line header compression tool. The
<tt class="docutils literal"><span class="pre">inflatehd</span></tt> is command-line header decompression tool. Both tools
read input from stdin and write output to stdout. The errors are
written to stderr. They take JSON as input and output.</p>
<div class="section" id="deflatehd-header-compressor">
<h3>deflatehd - header compressor<a class="headerlink" href="#deflatehd-header-compressor" title="Permalink to this headline"></a></h3>
<p>The <tt class="docutils literal"><span class="pre">deflatehd</span></tt> reads JSON array or HTTP/1-style header fields from
stdin and outputs compressed header block in JSON array.</p>
<p>For the JSON input, the element of input array must be a JSON
object. Each object must have at least following key:</p>
<dl class="docutils">
<dt>headers</dt>
<dd>A JSON array of name/value pairs. The each element is a JSON array
of 2 strings. The index 0 must contain header name and the index 1
must contain header value.</dd>
</dl>
<p>Example:</p>
<div class="highlight-c"><div class="highlight"><pre><span class="p">[</span>
<span class="p">{</span>
<span class="s">&quot;headers&quot;</span><span class="o">:</span> <span class="p">[</span>
<span class="p">[</span> <span class="s">&quot;:method&quot;</span><span class="p">,</span> <span class="s">&quot;GET&quot;</span> <span class="p">],</span>
<span class="p">[</span> <span class="s">&quot;:path&quot;</span><span class="p">,</span> <span class="s">&quot;/&quot;</span> <span class="p">]</span>
<span class="p">]</span>
<span class="p">},</span>
<span class="p">{</span>
<span class="s">&quot;headers&quot;</span><span class="o">:</span> <span class="p">[</span>
<span class="p">[</span> <span class="s">&quot;:method&quot;</span><span class="p">,</span> <span class="s">&quot;POST&quot;</span> <span class="p">],</span>
<span class="p">[</span> <span class="s">&quot;:path&quot;</span><span class="p">,</span> <span class="s">&quot;/&quot;</span> <span class="p">]</span>
<span class="p">]</span>
<span class="p">}</span>
<span class="p">]</span>
</pre></div>
</div>
<p>These header sets are processed in the order they appear in the JSON
outer most array using same compression context.</p>
<p>With <tt class="docutils literal"><span class="pre">-t</span></tt> option, the program can accept more familiar HTTP/1 style
header field block. Each header set is delimited by empty line:</p>
<p>Example:</p>
<div class="highlight-c"><div class="highlight"><pre><span class="o">:</span><span class="n">method</span><span class="o">:</span> <span class="n">GET</span>
<span class="o">:</span><span class="n">scheme</span><span class="o">:</span> <span class="n">https</span>
<span class="o">:</span><span class="n">path</span><span class="o">:</span> <span class="o">/</span>
<span class="o">:</span><span class="n">method</span><span class="o">:</span> <span class="n">POST</span>
<span class="n">user</span><span class="o">-</span><span class="n">agent</span><span class="o">:</span> <span class="n">nghttp2</span>
</pre></div>
</div>
<p>The output is a JSON array and each element is JSON object, which has
at least following keys:</p>
<dl class="docutils">
<dt>seq</dt>
<dd>The index of header set in the input.</dd>
<dt>inputLen</dt>
<dd>The sum of length of name/value pair in the input.</dd>
<dt>outputLength</dt>
<dd>The length of compressed header block.</dd>
<dt>percentageOfOriginalSize</dt>
<dd>inputLen / outputLength * 100</dd>
<dt>output</dt>
<dd>The compressed header block in hex string.</dd>
</dl>
<p>Examples:</p>
<div class="highlight-c"><div class="highlight"><pre><span class="p">[</span>
<span class="p">{</span>
<span class="s">&quot;seq&quot;</span><span class="o">:</span> <span class="mi">0</span><span class="p">,</span>
<span class="s">&quot;inputLen&quot;</span><span class="o">:</span> <span class="mi">66</span><span class="p">,</span>
<span class="s">&quot;outputLength&quot;</span><span class="o">:</span> <span class="mi">20</span><span class="p">,</span>
<span class="s">&quot;percentageOfOriginalSize&quot;</span><span class="o">:</span> <span class="mf">30.303030303030305</span><span class="p">,</span>
<span class="s">&quot;output&quot;</span><span class="o">:</span> <span class="s">&quot;818703881f3468e5891afcbf863c856659c62e3f&quot;</span>
<span class="p">},</span>
<span class="p">{</span>
<span class="s">&quot;seq&quot;</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="s">&quot;inputLen&quot;</span><span class="o">:</span> <span class="mi">74</span><span class="p">,</span>
<span class="s">&quot;outputLength&quot;</span><span class="o">:</span> <span class="mi">10</span><span class="p">,</span>
<span class="s">&quot;percentageOfOriginalSize&quot;</span><span class="o">:</span> <span class="mf">13.513513513513514</span><span class="p">,</span>
<span class="s">&quot;output&quot;</span><span class="o">:</span> <span class="s">&quot;87038504252dd5918386&quot;</span>
<span class="p">}</span>
<span class="p">]</span>
</pre></div>
</div>
<p>The output can be used as the input for <tt class="docutils literal"><span class="pre">inflatehd</span></tt>.</p>
<p>With <tt class="docutils literal"><span class="pre">-d</span></tt> option, the extra <tt class="docutils literal"><span class="pre">headerTable</span></tt> key is added and its
associated value contains the state of dyanmic header table after the
corresponding header set was processed. The value contains following
keys:</p>
<dl class="docutils">
<dt>entries</dt>
<dd>The entry in the header table. If <tt class="docutils literal"><span class="pre">referenced</span></tt> is <tt class="docutils literal"><span class="pre">true</span></tt>, it
is in the reference set. The <tt class="docutils literal"><span class="pre">size</span></tt> includes the overhead (32
bytes). The <tt class="docutils literal"><span class="pre">index</span></tt> corresponds to the index of header table.
The <tt class="docutils literal"><span class="pre">name</span></tt> is the header field name and the <tt class="docutils literal"><span class="pre">value</span></tt> is the
header field value. They may be displayed as <tt class="docutils literal"><span class="pre">**DEALLOCATED**</span></tt>,
which means that the memory for that string is freed and not
available. This will happen when specifying smaller value in
<tt class="docutils literal"><span class="pre">-S</span></tt> than <tt class="docutils literal"><span class="pre">-s</span></tt>.</dd>
<dt>size</dt>
<dd>The sum of the spaces entries occupied, this includes the
entry overhead.</dd>
<dt>maxSize</dt>
<dd>The maximum header table size.</dd>
<dt>deflateSize</dt>
<dd>The sum of the spaces entries occupied within <tt class="docutils literal"><span class="pre">maxDeflateSize</span></tt>.</dd>
<dt>maxDeflateSize</dt>
<dd>The maximum header table size encoder uses. This can be smaller
than <tt class="docutils literal"><span class="pre">maxSize</span></tt>. In this case, encoder only uses up to first
<tt class="docutils literal"><span class="pre">maxDeflateSize</span></tt> buffer. Since the header table size is still
<tt class="docutils literal"><span class="pre">maxSize</span></tt>, the encoder has to keep track of entries ouside the
<tt class="docutils literal"><span class="pre">maxDeflateSize</span></tt> but inside the <tt class="docutils literal"><span class="pre">maxSize</span></tt> and make sure that
they are no longer referenced.</dd>
</dl>
<p>Example:</p>
<div class="highlight-c"><div class="highlight"><pre><span class="p">[</span>
<span class="p">{</span>
<span class="s">&quot;seq&quot;</span><span class="o">:</span> <span class="mi">0</span><span class="p">,</span>
<span class="s">&quot;inputLen&quot;</span><span class="o">:</span> <span class="mi">66</span><span class="p">,</span>
<span class="s">&quot;outputLength&quot;</span><span class="o">:</span> <span class="mi">20</span><span class="p">,</span>
<span class="s">&quot;percentageOfOriginalSize&quot;</span><span class="o">:</span> <span class="mf">30.303030303030305</span><span class="p">,</span>
<span class="s">&quot;output&quot;</span><span class="o">:</span> <span class="s">&quot;818703881f3468e5891afcbf863c856659c62e3f&quot;</span><span class="p">,</span>
<span class="s">&quot;headerTable&quot;</span><span class="o">:</span> <span class="p">{</span>
<span class="s">&quot;entries&quot;</span><span class="o">:</span> <span class="p">[</span>
<span class="p">{</span>
<span class="s">&quot;index&quot;</span><span class="o">:</span> <span class="mi">0</span><span class="p">,</span>
<span class="s">&quot;name&quot;</span><span class="o">:</span> <span class="s">&quot;user-agent&quot;</span><span class="p">,</span>
<span class="s">&quot;value&quot;</span><span class="o">:</span> <span class="s">&quot;nghttp2&quot;</span><span class="p">,</span>
<span class="s">&quot;referenced&quot;</span><span class="o">:</span> <span class="nb">true</span><span class="p">,</span>
<span class="s">&quot;size&quot;</span><span class="o">:</span> <span class="mi">49</span>
<span class="p">},</span>
<span class="p">{</span>
<span class="s">&quot;index&quot;</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="s">&quot;name&quot;</span><span class="o">:</span> <span class="s">&quot;:path&quot;</span><span class="p">,</span>
<span class="s">&quot;value&quot;</span><span class="o">:</span> <span class="s">&quot;/&quot;</span><span class="p">,</span>
<span class="s">&quot;referenced&quot;</span><span class="o">:</span> <span class="nb">true</span><span class="p">,</span>
<span class="s">&quot;size&quot;</span><span class="o">:</span> <span class="mi">38</span>
<span class="p">},</span>
<span class="p">{</span>
<span class="s">&quot;index&quot;</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span>
<span class="s">&quot;name&quot;</span><span class="o">:</span> <span class="s">&quot;:authority&quot;</span><span class="p">,</span>
<span class="s">&quot;value&quot;</span><span class="o">:</span> <span class="s">&quot;example.org&quot;</span><span class="p">,</span>
<span class="s">&quot;referenced&quot;</span><span class="o">:</span> <span class="nb">true</span><span class="p">,</span>
<span class="s">&quot;size&quot;</span><span class="o">:</span> <span class="mi">53</span>
<span class="p">},</span>
<span class="p">{</span>
<span class="s">&quot;index&quot;</span><span class="o">:</span> <span class="mi">3</span><span class="p">,</span>
<span class="s">&quot;name&quot;</span><span class="o">:</span> <span class="s">&quot;:scheme&quot;</span><span class="p">,</span>
<span class="s">&quot;value&quot;</span><span class="o">:</span> <span class="s">&quot;https&quot;</span><span class="p">,</span>
<span class="s">&quot;referenced&quot;</span><span class="o">:</span> <span class="nb">true</span><span class="p">,</span>
<span class="s">&quot;size&quot;</span><span class="o">:</span> <span class="mi">44</span>
<span class="p">},</span>
<span class="p">{</span>
<span class="s">&quot;index&quot;</span><span class="o">:</span> <span class="mi">4</span><span class="p">,</span>
<span class="s">&quot;name&quot;</span><span class="o">:</span> <span class="s">&quot;:method&quot;</span><span class="p">,</span>
<span class="s">&quot;value&quot;</span><span class="o">:</span> <span class="s">&quot;GET&quot;</span><span class="p">,</span>
<span class="s">&quot;referenced&quot;</span><span class="o">:</span> <span class="nb">true</span><span class="p">,</span>
<span class="s">&quot;size&quot;</span><span class="o">:</span> <span class="mi">42</span>
<span class="p">}</span>
<span class="p">],</span>
<span class="s">&quot;size&quot;</span><span class="o">:</span> <span class="mi">226</span><span class="p">,</span>
<span class="s">&quot;maxSize&quot;</span><span class="o">:</span> <span class="mi">4096</span><span class="p">,</span>
<span class="s">&quot;deflateSize&quot;</span><span class="o">:</span> <span class="mi">226</span><span class="p">,</span>
<span class="s">&quot;maxDeflateSize&quot;</span><span class="o">:</span> <span class="mi">4096</span>
<span class="p">}</span>
<span class="p">},</span>
<span class="p">{</span>
<span class="s">&quot;seq&quot;</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="s">&quot;inputLen&quot;</span><span class="o">:</span> <span class="mi">74</span><span class="p">,</span>
<span class="s">&quot;outputLength&quot;</span><span class="o">:</span> <span class="mi">10</span><span class="p">,</span>
<span class="s">&quot;percentageOfOriginalSize&quot;</span><span class="o">:</span> <span class="mf">13.513513513513514</span><span class="p">,</span>
<span class="s">&quot;output&quot;</span><span class="o">:</span> <span class="s">&quot;87038504252dd5918386&quot;</span><span class="p">,</span>
<span class="s">&quot;headerTable&quot;</span><span class="o">:</span> <span class="p">{</span>
<span class="s">&quot;entries&quot;</span><span class="o">:</span> <span class="p">[</span>
<span class="p">{</span>
<span class="s">&quot;index&quot;</span><span class="o">:</span> <span class="mi">0</span><span class="p">,</span>
<span class="s">&quot;name&quot;</span><span class="o">:</span> <span class="s">&quot;:path&quot;</span><span class="p">,</span>
<span class="s">&quot;value&quot;</span><span class="o">:</span> <span class="s">&quot;/account&quot;</span><span class="p">,</span>
<span class="s">&quot;referenced&quot;</span><span class="o">:</span> <span class="nb">true</span><span class="p">,</span>
<span class="s">&quot;size&quot;</span><span class="o">:</span> <span class="mi">45</span>
<span class="p">},</span>
<span class="p">{</span>
<span class="s">&quot;index&quot;</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="s">&quot;name&quot;</span><span class="o">:</span> <span class="s">&quot;:method&quot;</span><span class="p">,</span>
<span class="s">&quot;value&quot;</span><span class="o">:</span> <span class="s">&quot;POST&quot;</span><span class="p">,</span>
<span class="s">&quot;referenced&quot;</span><span class="o">:</span> <span class="nb">true</span><span class="p">,</span>
<span class="s">&quot;size&quot;</span><span class="o">:</span> <span class="mi">43</span>
<span class="p">},</span>
<span class="p">{</span>
<span class="s">&quot;index&quot;</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span>
<span class="s">&quot;name&quot;</span><span class="o">:</span> <span class="s">&quot;user-agent&quot;</span><span class="p">,</span>
<span class="s">&quot;value&quot;</span><span class="o">:</span> <span class="s">&quot;nghttp2&quot;</span><span class="p">,</span>
<span class="s">&quot;referenced&quot;</span><span class="o">:</span> <span class="nb">true</span><span class="p">,</span>
<span class="s">&quot;size&quot;</span><span class="o">:</span> <span class="mi">49</span>
<span class="p">},</span>
<span class="p">{</span>
<span class="s">&quot;index&quot;</span><span class="o">:</span> <span class="mi">3</span><span class="p">,</span>
<span class="s">&quot;name&quot;</span><span class="o">:</span> <span class="s">&quot;:path&quot;</span><span class="p">,</span>
<span class="s">&quot;value&quot;</span><span class="o">:</span> <span class="s">&quot;/&quot;</span><span class="p">,</span>
<span class="s">&quot;referenced&quot;</span><span class="o">:</span> <span class="nb">false</span><span class="p">,</span>
<span class="s">&quot;size&quot;</span><span class="o">:</span> <span class="mi">38</span>
<span class="p">},</span>
<span class="p">{</span>
<span class="s">&quot;index&quot;</span><span class="o">:</span> <span class="mi">4</span><span class="p">,</span>
<span class="s">&quot;name&quot;</span><span class="o">:</span> <span class="s">&quot;:authority&quot;</span><span class="p">,</span>
<span class="s">&quot;value&quot;</span><span class="o">:</span> <span class="s">&quot;example.org&quot;</span><span class="p">,</span>
<span class="s">&quot;referenced&quot;</span><span class="o">:</span> <span class="nb">true</span><span class="p">,</span>
<span class="s">&quot;size&quot;</span><span class="o">:</span> <span class="mi">53</span>
<span class="p">},</span>
<span class="p">{</span>
<span class="s">&quot;index&quot;</span><span class="o">:</span> <span class="mi">5</span><span class="p">,</span>
<span class="s">&quot;name&quot;</span><span class="o">:</span> <span class="s">&quot;:scheme&quot;</span><span class="p">,</span>
<span class="s">&quot;value&quot;</span><span class="o">:</span> <span class="s">&quot;https&quot;</span><span class="p">,</span>
<span class="s">&quot;referenced&quot;</span><span class="o">:</span> <span class="nb">true</span><span class="p">,</span>
<span class="s">&quot;size&quot;</span><span class="o">:</span> <span class="mi">44</span>
<span class="p">},</span>
<span class="p">{</span>
<span class="s">&quot;index&quot;</span><span class="o">:</span> <span class="mi">6</span><span class="p">,</span>
<span class="s">&quot;name&quot;</span><span class="o">:</span> <span class="s">&quot;:method&quot;</span><span class="p">,</span>
<span class="s">&quot;value&quot;</span><span class="o">:</span> <span class="s">&quot;GET&quot;</span><span class="p">,</span>
<span class="s">&quot;referenced&quot;</span><span class="o">:</span> <span class="nb">false</span><span class="p">,</span>
<span class="s">&quot;size&quot;</span><span class="o">:</span> <span class="mi">42</span>
<span class="p">}</span>
<span class="p">],</span>
<span class="s">&quot;size&quot;</span><span class="o">:</span> <span class="mi">314</span><span class="p">,</span>
<span class="s">&quot;maxSize&quot;</span><span class="o">:</span> <span class="mi">4096</span><span class="p">,</span>
<span class="s">&quot;deflateSize&quot;</span><span class="o">:</span> <span class="mi">314</span><span class="p">,</span>
<span class="s">&quot;maxDeflateSize&quot;</span><span class="o">:</span> <span class="mi">4096</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">]</span>
</pre></div>
</div>
</div>
<div class="section" id="inflatehd-header-decompressor">
<h3>inflatehd - header decompressor<a class="headerlink" href="#inflatehd-header-decompressor" title="Permalink to this headline"></a></h3>
<p>The <tt class="docutils literal"><span class="pre">inflatehd</span></tt> reads JSON array from stdin and outputs decompressed
name/value pairs in JSON array. The element of input array must be a
JSON object. Each object must have at least following key:</p>
<dl class="docutils">
<dt>output</dt>
<dd>compressed header block in hex string.</dd>
</dl>
<p>Example:</p>
<div class="highlight-c"><div class="highlight"><pre><span class="p">[</span>
<span class="p">{</span> <span class="s">&quot;output&quot;</span><span class="o">:</span> <span class="s">&quot;0284f77778ff&quot;</span> <span class="p">},</span>
<span class="p">{</span> <span class="s">&quot;output&quot;</span><span class="o">:</span> <span class="s">&quot;0185fafd3c3c7f81&quot;</span> <span class="p">}</span>
<span class="p">]</span>
</pre></div>
</div>
<p>The output is a JSON array and each element is JSON object, which has
at least following keys:</p>
<dl class="docutils">
<dt>seq</dt>
<dd>The index of header set in the input.</dd>
<dt>headers</dt>
<dd>The JSON array contains decompressed name/value pairs. Each
element is JSON aray having 2 elements. The index 0 of the array
contains the header field name. The index 1 contains the header
field value.</dd>
</dl>
<p>Example:</p>
<div class="highlight-c"><div class="highlight"><pre><span class="p">[</span>
<span class="p">{</span>
<span class="s">&quot;seq&quot;</span><span class="o">:</span> <span class="mi">0</span><span class="p">,</span>
<span class="s">&quot;headers&quot;</span><span class="o">:</span> <span class="p">[</span>
<span class="p">[</span><span class="s">&quot;:authority&quot;</span><span class="p">,</span> <span class="s">&quot;example.org&quot;</span><span class="p">],</span>
<span class="p">[</span><span class="s">&quot;:method&quot;</span><span class="p">,</span> <span class="s">&quot;GET&quot;</span><span class="p">],</span>
<span class="p">[</span><span class="s">&quot;:path&quot;</span><span class="p">,</span> <span class="s">&quot;/&quot;</span><span class="p">],</span>
<span class="p">[</span><span class="s">&quot;:scheme&quot;</span><span class="p">,</span> <span class="s">&quot;https&quot;</span><span class="p">],</span>
<span class="p">[</span><span class="s">&quot;user-agent&quot;</span><span class="p">,</span> <span class="s">&quot;nghttp2&quot;</span><span class="p">]</span>
<span class="p">]</span>
<span class="p">},</span>
<span class="p">{</span>
<span class="s">&quot;seq&quot;</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="s">&quot;headers&quot;</span><span class="o">:</span> <span class="p">[</span>
<span class="p">[</span><span class="s">&quot;:authority&quot;</span><span class="p">,</span> <span class="s">&quot;example.org&quot;</span><span class="p">],</span>
<span class="p">[</span><span class="s">&quot;:method&quot;</span><span class="p">,</span> <span class="s">&quot;POST&quot;</span><span class="p">],</span>
<span class="p">[</span><span class="s">&quot;:path&quot;</span><span class="p">,</span> <span class="s">&quot;/account&quot;</span><span class="p">],</span>
<span class="p">[</span><span class="s">&quot;:scheme&quot;</span><span class="p">,</span> <span class="s">&quot;https&quot;</span><span class="p">],</span>
<span class="p">[</span><span class="s">&quot;user-agent&quot;</span><span class="p">,</span> <span class="s">&quot;nghttp2&quot;</span><span class="p">]</span>
<span class="p">]</span>
<span class="p">}</span>
<span class="p">]</span>
</pre></div>
</div>
<p>The output can be used as the input for <tt class="docutils literal"><span class="pre">deflatehd</span></tt>.</p>
<p>With <tt class="docutils literal"><span class="pre">-d</span></tt> option, the extra <tt class="docutils literal"><span class="pre">headerTable</span></tt> key is added and its
associated value contains the state of dyanmic header table after the
corresponding header set was processed. The format is the same as
<tt class="docutils literal"><span class="pre">deflatehd</span></tt>.</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper"><h3>Menu</h3>
<ul>
<li><a href="https://github.com/tatsuhiro-t/nghttp2/issues">Issues</a></li>
<li><a href="https://github.com/tatsuhiro-t/nghttp2">Source</a></li>
</ul>
<h3><a href="index.html">Table Of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">nghttp2 - HTTP/2.0 C Library</a><ul>
<li><a class="reference internal" href="#development-status">Development Status</a></li>
<li><a class="reference internal" href="#public-test-server">Public Test Server</a></li>
<li><a class="reference internal" href="#requirements">Requirements</a></li>
<li><a class="reference internal" href="#build-from-git">Build from git</a></li>
<li><a class="reference internal" href="#building-documentation">Building documentation</a></li>
<li><a class="reference internal" href="#client-server-and-proxy-programs">Client, Server and Proxy programs</a><ul>
<li><a class="reference internal" href="#nghttp-client">nghttp - client</a></li>
<li><a class="reference internal" href="#nghttpd-server">nghttpd - server</a></li>
<li><a class="reference internal" href="#nghttpx-proxy">nghttpx - proxy</a></li>
</ul>
</li>
<li><a class="reference internal" href="#header-compression-test-tools">Header compression test tools</a><ul>
<li><a class="reference internal" href="#deflatehd-header-compressor">deflatehd - header compressor</a></li>
<li><a class="reference internal" href="#inflatehd-header-decompressor">inflatehd - header decompressor</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>Previous topic</h4>
<p class="topless"><a href="index.html"
title="previous chapter">nghttp2 - HTTP/2.0 C Library</a></p>
<h4>Next topic</h4>
<p class="topless"><a href="apiref.html"
title="next chapter">API Reference</a></p>
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="_sources/package_README.txt"
rel="nofollow">Show Source</a></li>
</ul>
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="apiref.html" title="API Reference"
>next</a> |</li>
<li class="right" >
<a href="index.html" title="nghttp2 - HTTP/2.0 C Library"
>previous</a> |</li>
<li><a href="index.html">nghttp2 0.3.0-DEV documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2012, 2013, Tatsuhiro Tsujikawa.
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>