502 lines
28 KiB
HTML
502 lines
28 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 — nghttp2 0.1.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.1.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.1.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.1.0-DEV documentation</a> »</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-defat-04/2.0
|
|
(<a class="reference external" href="http://tools.ietf.org/html/draft-ietf-httpbis-http2-04">http://tools.ietf.org/html/draft-ietf-httpbis-http2-04</a>) based on
|
|
spdylay code base. The header compression is based on
|
|
<a class="reference external" href="http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-01">http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-01</a></p>
|
|
<p>Currently, the library lacks the following features:</p>
|
|
<ul class="simple">
|
|
<li>Header continuation</li>
|
|
<li>ALPN: instead, NPN is used</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 >= 0.20</li>
|
|
<li>zlib >= 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 >= 2.1</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 >= 1.0.1</li>
|
|
<li>libevent-openssl >= 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 >= 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
|
|
resouce) in <tt class="docutils literal"><span class="pre">nghttp</span></tt>, the following
|
|
packages are needed:</p>
|
|
<ul class="simple">
|
|
<li>libxml2 >= 2.7.7</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>
|
|
</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 HTTP-default04/2.0 client. It can connect to the
|
|
HTTP/2.0 server with prior knowledge, HTTP Upgrade and NPN TLS
|
|
extension.</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>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 -nv https://localhost:3000/
|
|
[ 0.000] NPN select next protocol: the remote server offers:
|
|
* HTTP-draft-04/2.0
|
|
* spdy/3
|
|
* spdy/2
|
|
* http/1.1
|
|
NPN selected the protocol: HTTP-draft-04/2.0
|
|
[ 0.005] send SETTINGS frame <length=0, flags=0, stream_id=0>
|
|
(niv=0)
|
|
[ 0.005] send HEADERS frame <length=58, flags=5, stream_id=1>
|
|
; END_STREAM | END_HEADERS
|
|
; Open new stream
|
|
:host: localhost:3000
|
|
:method: GET
|
|
:path: /
|
|
:scheme: https
|
|
accept: */*
|
|
accept-encoding: gzip, deflate
|
|
user-agent: nghttp2/0.1.0-DEV
|
|
[ 0.005] recv SETTINGS frame <length=16, flags=0, stream_id=0>
|
|
(niv=2)
|
|
[4:100]
|
|
[7:65536]
|
|
[ 0.005] recv WINDOW_UPDATE frame <length=4, flags=1, stream_id=0>
|
|
; END_FLOW_CONTROL
|
|
(window_size_increment=0)
|
|
[ 0.006] recv HEADERS frame <length=179, flags=4, stream_id=1>
|
|
; END_HEADERS
|
|
; First response header
|
|
:status: 200 OK
|
|
accept-ranges: bytes
|
|
content-encoding: gzip
|
|
content-length: 56
|
|
content-type: text/html
|
|
date: Sat, 27 Jul 2013 12:08:56 GMT
|
|
etag: "cf405c-2d-45adabdf282c0"
|
|
last-modified: Tue, 04 Nov 2008 10:44:03 GMT
|
|
server: Apache/2.2.22 (Debian)
|
|
vary: Accept-Encoding
|
|
via: 1.1 nghttpx
|
|
[ 0.006] recv DATA frame (length=56, flags=0, stream_id=1)
|
|
[ 0.006] recv DATA frame (length=0, flags=1, stream_id=1)
|
|
[ 0.006] send GOAWAY frame <length=8, flags=0, stream_id=0>
|
|
(last_stream_id=0, error_code=NO_ERROR(0), opaque_data=)</pre>
|
|
</div>
|
|
<p>The HTTP Upgrade is performed like this:</p>
|
|
<div class="highlight-c"><pre>$ src/nghttp --no-tls -nvu http://localhost:3000/
|
|
[ 0.000] HTTP Upgrade request
|
|
GET / HTTP/1.1
|
|
Host: localhost:3000
|
|
Connection: Upgrade, HTTP2-Settings
|
|
Upgrade: HTTP-draft-04/2.0
|
|
HTTP2-Settings: AAAABAAAAGQAAAAHAAD__w
|
|
Accept: */*
|
|
User-Agent: nghttp2/0.1.0-DEV
|
|
|
|
|
|
[ 0.183] HTTP Upgrade response
|
|
HTTP/1.1 101 Switching Protocols
|
|
Connection: Upgrade
|
|
Upgrade: HTTP/2.0
|
|
|
|
|
|
[ 0.183] HTTP Upgrade success
|
|
[ 0.183] send SETTINGS frame <length=16, flags=0x00, stream_id=0>
|
|
(niv=2)
|
|
[4:100]
|
|
[7:65535]
|
|
[ 0.202] recv SETTINGS frame <length=16, flags=0x00, stream_id=0>
|
|
(niv=2)
|
|
[4:100]
|
|
[7:65536]
|
|
[ 0.202] recv WINDOW_UPDATE frame <length=4, flags=0x01, stream_id=0>
|
|
; END_FLOW_CONTROL
|
|
(window_size_increment=0)
|
|
[ 0.275] recv HEADERS frame <length=198, flags=0x04, stream_id=1>
|
|
; END_HEADERS
|
|
; First response header
|
|
:status: 200 OK
|
|
accept-ranges: bytes
|
|
content-length: 45
|
|
content-type: text/html
|
|
date: Sat, 03 Aug 2013 10:21:20 GMT
|
|
etag: "cf405c-2d-45adabdf282c0"
|
|
last-modified: Tue, 04 Nov 2008 10:44:03 GMT
|
|
server: Apache/2.2.22 (Debian)
|
|
vary: Accept-Encoding
|
|
via: 1.1 nghttpx
|
|
x-pad: avoid browser bug
|
|
[ 0.275] recv DATA frame (length=45, flags=0, stream_id=1)
|
|
[ 0.275] recv DATA frame (length=0, flags=1, stream_id=1)
|
|
[ 0.275] send GOAWAY frame <length=8, flags=0x00, stream_id=0>
|
|
(last_stream_id=0, error_code=NO_ERROR(0), opaque_data=)</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 3000 --no-tls -v
|
|
IPv4: listen on port 3000
|
|
IPv6: listen on port 3000
|
|
[id=1] [ 1.020] send SETTINGS frame <length=8, flags=0, stream_id=0>
|
|
(niv=1)
|
|
[4:100]
|
|
[id=1] [ 1.020] closed
|
|
[id=2] [ 1.838] send SETTINGS frame <length=8, flags=0, stream_id=0>
|
|
(niv=1)
|
|
[4:100]
|
|
[id=2] [ 1.838] recv SETTINGS frame <length=0, flags=0, stream_id=0>
|
|
(niv=0)
|
|
[id=2] [ 1.838] recv HEADERS frame <length=58, flags=5, stream_id=1>
|
|
; END_STREAM | END_HEADERS
|
|
; Open new stream
|
|
:host: localhost:3000
|
|
:method: GET
|
|
:path: /
|
|
:scheme: http
|
|
accept: */*
|
|
accept-encoding: gzip, deflate
|
|
user-agent: nghttp2/0.1.0-DEV
|
|
[id=2] [ 1.838] send HEADERS frame <length=105, flags=4, stream_id=1>
|
|
; END_HEADERS
|
|
; First response header
|
|
:status: 404 Not Found
|
|
content-encoding: gzip
|
|
content-type: text/html; charset=UTF-8
|
|
date: Sat, 27 Jul 2013 12:32:10 GMT
|
|
server: nghttpd nghttp2/0.1.0-DEV
|
|
[id=2] [ 1.838] send DATA frame (length=127, flags=0, stream_id=1)
|
|
[id=2] [ 1.838] send DATA frame (length=0, flags=1, stream_id=1)
|
|
[id=2] [ 1.838] stream_id=1 closed
|
|
[id=2] [ 1.839] 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-04/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">--spdy</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">--spdy-bridge</span></tt></td>
|
|
<td>HTTP/2.0, SPDY, HTTP/1.1 (TLS)</td>
|
|
<td>HTTP/2.0 (TLS)</td>
|
|
<td> </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> </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-04/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">--spdy</span></tt> and <tt class="docutils literal"><span class="pre">--spdy-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">--spdy-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>The <tt class="docutils literal"><span class="pre">nghttpx</span></tt> is ported from <tt class="docutils literal"><span class="pre">shrpx</span></tt> in spdylay project, and it
|
|
still has SPDY color in option names. They will be fixed as the
|
|
development goes.</p>
|
|
<p>In the default mode, (without any of <tt class="docutils literal"><span class="pre">--spdy</span></tt>, <tt class="docutils literal"><span class="pre">--spdy-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"><--</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">--></span> <span class="n">nghttpx</span> <span class="o"><--</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">--></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">--spdy</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"><--</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">--></span> <span class="n">nghttpx</span> <span class="o"><--</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">--></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">"HTTPS SERVERADDR:PORT"</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">--spdy-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"><--</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">--></span> <span class="n">nghttpx</span> <span class="o"><--</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="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"><--</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">--></span> <span class="n">nghttpx</span> <span class="o"><--</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="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"><--</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">--></span> <span class="n">nghttpx</span> <span class="o"><--</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="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">--spdy-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"><--</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">--></span> <span class="n">nghttpx</span> <span class="o"><--</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">--===================---></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>
|
|
|
|
|
|
</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="#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>
|
|
</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.1.0-DEV documentation</a> »</li>
|
|
</ul>
|
|
</div>
|
|
<div class="footer">
|
|
© Copyright 2012, 2013, Tatsuhiro Tsujikawa.
|
|
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
|
|
</div>
|
|
</body>
|
|
</html> |