1
0
mirror of https://github.com/apache/httpd.git synced 2025-08-08 15:02:10 +03:00

reworked mod_h2 donation checkin into build system, added documentation

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1690248 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Stefan Eissing
2015-07-10 11:45:46 +00:00
parent d80e4641d5
commit 8c27a4cd1b
360 changed files with 1210 additions and 24833 deletions

View File

@@ -1,6 +1,9 @@
-*- coding: utf-8 -*-
Changes with Apache 2.5.0
*) mod_h2: added donated http/2 implementation to build system. Similar
configuration options to mod_ssl. [Stefan Eissing]
*) mod_reqtimeout: Don't let pipelining checks and keep-alive times interfere
with the timeouts computed for subsequent requests. PR 56729.
[Eric Covener, Yann Ylavic]

View File

@@ -678,6 +678,127 @@ case $host in
esac
])
dnl
dnl APACHE_CHECK_NGHTTP2
dnl
dnl Configure for nghttp2, giving preference to
dnl "--with-nghttp2=<path>" if it was specified.
dnl
AC_DEFUN(APACHE_CHECK_NGHTTP2,[
AC_CACHE_CHECK([for nghttp2], [ac_cv_nghttp2], [
dnl initialise the variables we use
ac_cv_nghttp2=no
ap_nghttp2_found=""
ap_nghttp2_base=""
ap_nghttp2_libs=""
dnl Determine the nghttp2 base directory, if any
AC_MSG_CHECKING([for user-provided nghttp2 base directory])
AC_ARG_WITH(nghttp2, APACHE_HELP_STRING(--with-nghttp2=PATH, nghttp2 installation directory), [
dnl If --with-nghttp2 specifies a directory, we use that directory
if test "x$withval" != "xyes" -a "x$withval" != "x"; then
dnl This ensures $withval is actually a directory and that it is absolute
ap_nghttp2_base="`cd $withval ; pwd`"
fi
])
if test "x$ap_nghttp2_base" = "x"; then
AC_MSG_RESULT(none)
else
AC_MSG_RESULT($ap_nghttp2_base)
fi
dnl Run header and version checks
saved_CPPFLAGS="$CPPFLAGS"
saved_LIBS="$LIBS"
saved_LDFLAGS="$LDFLAGS"
dnl Before doing anything else, load in pkg-config variables
if test -n "$PKGCONFIG"; then
saved_PKG_CONFIG_PATH="$PKG_CONFIG_PATH"
AC_MSG_CHECKING([for pkg-config along $PKG_CONFIG_PATH])
if test "x$ap_nghttp2_base" != "x" -a \
-f "${ap_nghttp2_base}/lib/pkgconfig/libnghttp2.pc"; then
dnl Ensure that the given path is used by pkg-config too, otherwise
dnl the system libnghttp2.pc might be picked up instead.
PKG_CONFIG_PATH="${ap_nghttp2_base}/lib/pkgconfig${PKG_CONFIG_PATH+:}${PKG_CONFIG_PATH}"
export PKG_CONFIG_PATH
fi
AC_ARG_ENABLE(nghttp2-staticlib-deps,APACHE_HELP_STRING(--enable-nghttp2-staticlib-deps,[link mod_h2 with dependencies of libnghttp2's static libraries (as indicated by "pkg-config --static"). Must be specified in addition to --enable-h2.]), [
if test "$enableval" = "yes"; then
PKGCONFIG_LIBOPTS="--static"
fi
])
ap_nghttp2_libs="`$PKGCONFIG $PKGCONFIG_LIBOPTS --libs-only-l --silence-errors libnghttp2`"
if test $? -eq 0; then
ap_nghttp2_found="yes"
pkglookup="`$PKGCONFIG --cflags-only-I libnghttp2`"
APR_ADDTO(CPPFLAGS, [$pkglookup])
APR_ADDTO(MOD_CFLAGS, [$pkglookup])
APR_ADDTO(ab_CFLAGS, [$pkglookup])
pkglookup="`$PKGCONFIG $PKGCONFIG_LIBOPTS --libs-only-L libnghttp2`"
APR_ADDTO(LDFLAGS, [$pkglookup])
APR_ADDTO(MOD_LDFLAGS, [$pkglookup])
pkglookup="`$PKGCONFIG $PKGCONFIG_LIBOPTS --libs-only-other libnghttp2`"
APR_ADDTO(LDFLAGS, [$pkglookup])
APR_ADDTO(MOD_LDFLAGS, [$pkglookup])
fi
PKG_CONFIG_PATH="$saved_PKG_CONFIG_PATH"
fi
dnl fall back to the user-supplied directory if not found via pkg-config
if test "x$ap_nghttp2_base" != "x" -a "x$ap_nghttp2_found" = "x"; then
APR_ADDTO(CPPFLAGS, [-I$ap_nghttp2_base/include])
APR_ADDTO(MOD_CFLAGS, [-I$ap_nghttp2_base/include])
APR_ADDTO(ab_CFLAGS, [-I$ap_nghttp2_base/include])
APR_ADDTO(LDFLAGS, [-L$ap_nghttp2_base/lib])
APR_ADDTO(MOD_LDFLAGS, [-L$ap_nghttp2_base/lib])
if test "x$ap_platform_runtime_link_flag" != "x"; then
APR_ADDTO(LDFLAGS, [$ap_platform_runtime_link_flag$ap_nghttp2_base/lib])
APR_ADDTO(MOD_LDFLAGS, [$ap_platform_runtime_link_flag$ap_nghttp2_base/lib])
fi
fi
AC_MSG_CHECKING([for nghttp2 version >= 1.0.0])
AC_TRY_COMPILE([#include <nghttp2/nghttp2ver.h>],[
#if !defined(NGHTTP2_VERSION_NUM)
#error "Missing nghttp2 version"
#endif
#if NGHTTP2_VERSION_NUM < 0x010000
#error "Unsupported nghttp2 version " NGHTTP2_VERSION_TEXT
#endif],
[AC_MSG_RESULT(OK)
ac_cv_nghttp2=yes],
[AC_MSG_RESULT(FAILED)])
if test "x$ac_cv_nghttp2" = "xyes"; then
ap_nghttp2_libs="${ap_nghttp2_libs:--lnghttp2} `$apr_config --libs`"
APR_ADDTO(MOD_LDFLAGS, [$ap_nghttp2_libs])
APR_ADDTO(LIBS, [$ap_nghttp2_libs])
APR_SETVAR(ab_LDFLAGS, [$MOD_LDFLAGS])
APACHE_SUBST(ab_CFLAGS)
APACHE_SUBST(ab_LDFLAGS)
dnl Run library and function checks
liberrors=""
AC_CHECK_HEADERS([nghttp2/nghttp2.h])
AC_CHECK_FUNCS([nghttp2_session_server_new2], [], [liberrors="yes"])
if test "x$liberrors" != "x"; then
AC_MSG_WARN([nghttp2 library is unusable])
fi
else
AC_MSG_WARN([nghttp2 version is too old])
fi
dnl restore
CPPFLAGS="$saved_CPPFLAGS"
LIBS="$saved_LIBS"
LDFLAGS="$saved_LDFLAGS"
])
if test "x$ac_cv_nghttp2" = "xyes"; then
AC_DEFINE(HAVE_NGHTTP2, 1, [Define if nghttp2 is available])
fi
])
dnl
dnl APACHE_EXPORT_ARGUMENTS
dnl Export (via APACHE_SUBST) the various path-related variables that

View File

@@ -0,0 +1,12 @@
#
# This is the Apache server configuration file providing HTTP/2 support.
# It contains the configuration directives to instruct the server how to
# serve pages via the http/2 protocol. For detailed information about these
# directives see <URL:http://httpd.apache.org/docs/trunk/mod/mod_h2.html>
#
# Required modules: mod_h2
<IfModule h2_module>
# This can also set to "off" and turned on only for specific virtual hosts
H2Engine on
</IfModule>

View File

@@ -426,3 +426,6 @@ SSLRandomSeed connect builtin
#RequestHeader unset DNT env=bad_DNT
#</IfModule>
# h2/h2c (HTTP/2) connections
#Include @rel_sysconfdir@/extra/httpd-h2.conf

View File

@@ -53,6 +53,7 @@
<modulefile>mod_file_cache.xml</modulefile>
<modulefile>mod_filter.xml</modulefile>
<modulefile>mod_firehose.xml</modulefile>
<modulefile>mod_h2.xml</modulefile>
<modulefile>mod_headers.xml</modulefile>
<modulefile>mod_heartbeat.xml</modulefile>
<modulefile>mod_heartmonitor.xml</modulefile>

View File

@@ -0,0 +1,5 @@
# GENERATED FROM XML -- DO NOT EDIT
URI: mod_h2.html.en
Content-Language: en
Content-type: text/html; charset=ISO-8859-1

View File

@@ -0,0 +1,409 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
<meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type" />
<!--
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
This file is generated from xml source: DO NOT EDIT
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-->
<title>mod_h2 - Apache HTTP Server Version 2.5</title>
<link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
<link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
<link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" /><link rel="stylesheet" type="text/css" href="../style/css/prettify.css" />
<script src="../style/scripts/prettify.min.js" type="text/javascript">
</script>
<link href="../images/favicon.ico" rel="shortcut icon" /></head>
<body>
<div id="page-header">
<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/quickreference.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a></p>
<p class="apache">Apache HTTP Server Version 2.5</p>
<img alt="" src="../images/feather.gif" /></div>
<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="../images/left.gif" /></a></div>
<div id="path">
<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">HTTP Server</a> &gt; <a href="http://httpd.apache.org/docs/">Documentation</a> &gt; <a href="../">Version 2.5</a> &gt; <a href="./">Modules</a></div>
<div id="page-content">
<div id="preamble"><h1>Apache Module mod_h2</h1>
<div class="toplang">
<p><span>Available Languages: </span><a href="../en/mod/mod_h2.html" title="English">&nbsp;en&nbsp;</a></p>
</div>
<table class="module"><tr><th><a href="module-dict.html#Description">Description:</a></th><td>Support for the HTTP/2 transport layer</td></tr>
<tr><th><a href="module-dict.html#Status">Status:</a></th><td>Extension</td></tr>
<tr><th><a href="module-dict.html#ModuleIdentifier">Module<6C>Identifier:</a></th><td>h2_module</td></tr>
<tr><th><a href="module-dict.html#SourceFile">Source<63>File:</a></th><td>mod_h2.c</td></tr></table>
<h3>Summary</h3>
<p>This module provides HTTP/2 (RFC 7540) support for the Apache
HTTP Server.</p>
<p>This module relies on <a href="http://nghttp2.org/">libnghttp2</a>
to provide the core http/2 engine.</p>
</div>
<div id="quickview"><h3 class="directives">Directives</h3>
<ul id="toc">
<li><img alt="" src="../images/down.gif" /> <a href="#h2bufferoutput">H2BufferOutput</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#h2buffersize">H2BufferSize</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#h2bufferwritemax">H2BufferWriteMax</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#h2direct">H2Direct</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#h2engine">H2Engine</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#h2maxheaderlistsize">H2MaxHeaderListSize</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#h2maxsessionstreams">H2MaxSessionStreams</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#h2maxworkeridleseconds">H2MaxWorkerIdleSeconds</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#h2maxworkers">H2MaxWorkers</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#h2minworkers">H2MinWorkers</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#h2serializeheaders">H2SerializeHeaders</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#h2sessionextrafiles">H2SessionExtraFiles</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#h2streammaxmemsize">H2StreamMaxMemSize</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#h2windowsize">H2WindowSize</a></li>
</ul>
<ul class="seealso"><li><a href="#comments_section">Comments</a></li></ul></div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="H2BufferOutput" id="H2BufferOutput">H2BufferOutput</a> <a name="h2bufferoutput" id="h2bufferoutput">Directive</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Output Buffering Switch</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>H2BufferOutput on|off</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_h2</td></tr>
</table>
<p>
This directive toggles if buffering of HTTP/2 output shall be used
or if data is written immediately when it arrives. Unless specified
otherwise, this directive is <code>on</code> for TLS connections and
<code>off</code> for plain connections.
</p>
<div class="example"><h3>Example</h3><pre class="prettyprint lang-config">H2BufferOutput on</pre>
</div>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="H2BufferSize" id="H2BufferSize">H2BufferSize</a> <a name="h2buffersize" id="h2buffersize">Directive</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Buffer size for outgoing data per HTTP/2 connection.</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>H2BufferSize <em>bytes</em></code></td></tr>
<tr><th><a href="directive-dict.html#Default">Default:</a></th><td><code>H2BufferSize 65536</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_h2</td></tr>
</table>
<p>
This directive sets the size of the buffer used to hold outgoing
HTTP/2 raw data, should <code>H2BufferOutput</code> be switched on.
This data is allocated per HTTP/2 connection, not stream and is
counted against the raw protocol data.
</p>
<div class="example"><h3>Example</h3><pre class="prettyprint lang-config">H2BufferSize 128000</pre>
</div>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="H2BufferWriteMax" id="H2BufferWriteMax">H2BufferWriteMax</a> <a name="h2bufferwritemax" id="h2bufferwritemax">Directive</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Maximum size of write on a HTTP/2 connection.</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>H2BufferWriteMax <em>bytes</em></code></td></tr>
<tr><th><a href="directive-dict.html#Default">Default:</a></th><td><code>H2BufferWriteMax 16384</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_h2</td></tr>
</table>
<p>
This directive sets maximum amount of data sent out in a single
write on a http/2 connection. It only takes effect when
<code>H2BufferOutput</code> is switched on.
</p><p>
This directive affects performance of underlying TLS transports. TLS
transforms each write into an encrypted record. Clients need
to receive all of the record in order to decrypt it. Larger sizes
result in better server performance, shorter sizes can affect web
page paint timings.
</p><p>
<code>BufferSize</code> should be a multiple of <code>H2BufferWriteMax</code>.
<code>H2BufferWriteMax</code>, if larger than 16k, should be a multiple of 16k,
since this is the TLS max record size. Be aware that there are TLS
extensions to limit the record size to powers of 2 less than 16k.
</p>
<div class="example"><h3>Example</h3><pre class="prettyprint lang-config">H2BufferWriteMax 8000</pre>
</div>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="H2Direct" id="H2Direct">H2Direct</a> <a name="h2direct" id="h2direct">Directive</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>H2 Direct Protocol Switch</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>H2Direct on|off</code></td></tr>
<tr><th><a href="directive-dict.html#Default">Default:</a></th><td><code>H2Direct on</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_h2</td></tr>
</table>
<p>
This directive toggles the usage of the HTTP/2 Direct Mode. This
should be used inside a
<code class="directive"><a href="../mod/core.html#virtualhost">&lt;VirtualHost&gt;</a></code>
section to enable direct HTTP/2 communication for that virtual host.
Direct communication means that if the first bytes received by the
server on a connection match the HTTP/2 preamble, the HTTP/2
protocol is switched to immediately without further negotiation.
This mode falls outside the RFC 7540 but has become widely implemented
as it is very convenient for development and testing.
By default the direct HTTP/2 mode is enabled.
</p>
<div class="example"><h3>Example</h3><pre class="prettyprint lang-config">H2Direct on</pre>
</div>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="H2Engine" id="H2Engine">H2Engine</a> <a name="h2engine" id="h2engine">Directive</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>H2 Engine Operation Switch</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>H2Engine on|off</code></td></tr>
<tr><th><a href="directive-dict.html#Default">Default:</a></th><td><code>H2Engine off</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_h2</td></tr>
</table>
<p>
This directive toggles the usage of the HTTP/2 Protocol Engine. This
should be used inside a
<code class="directive"><a href="../mod/core.html#virtualhost">&lt;VirtualHost&gt;</a></code>
section to enable HTTP/2 for that virtual host. By default the
HTTP/2 Protocol Engine is disabled for both the main server and all
configured virtual hosts.
</p>
<div class="example"><h3>Example</h3><pre class="prettyprint lang-config">&lt;VirtualHost _default_:443&gt;
H2Engine on
#...
&lt;/VirtualHost&gt;</pre>
</div>
<p>
The HTTP/2 engine is usable in TLS and plain scenarios, supporting
the 'h2' and 'h2c' variants of the protocol.
</p>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="H2MaxHeaderListSize" id="H2MaxHeaderListSize">H2MaxHeaderListSize</a> <a name="h2maxheaderlistsize" id="h2maxheaderlistsize">Directive</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Maximum size of acceptable stream headers.</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>H2MaxHeaderListSize <em>bytes</em></code></td></tr>
<tr><th><a href="directive-dict.html#Default">Default:</a></th><td><code>H2MaxHeaderListSize 16384</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_h2</td></tr>
</table>
<p>
This directive sets the maximum amount of stream header bytes that
the server is willing to accept. It is announced to the client during
the initial HTTP/2 handshake.
</p>
<div class="example"><h3>Example</h3><pre class="prettyprint lang-config">H2MaxHeaderListSize 10000</pre>
</div>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="H2MaxSessionStreams" id="H2MaxSessionStreams">H2MaxSessionStreams</a> <a name="h2maxsessionstreams" id="h2maxsessionstreams">Directive</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Maximum number of active streams per HTTP/2 session.</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>H2MaxSessionStreams <em>n</em></code></td></tr>
<tr><th><a href="directive-dict.html#Default">Default:</a></th><td><code>H2MaxSessionStreams 100</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_h2</td></tr>
</table>
<p>
This directive sets the maximum number of active streams per HTTP/2 session (e.g. connection)
that the server allows. A stream is active if it is not <code>idle</code> or
<code>closed</code> according to RFC 7540.
</p>
<div class="example"><h3>Example</h3><pre class="prettyprint lang-config">H2MaxSessionStreams 20</pre>
</div>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="H2MaxWorkerIdleSeconds" id="H2MaxWorkerIdleSeconds">H2MaxWorkerIdleSeconds</a> <a name="h2maxworkeridleseconds" id="h2maxworkeridleseconds">Directive</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Maximum number of seconds h2 workers remain idle until shut down.</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>H2MaxWorkerIdleSeconds <em>n</em></code></td></tr>
<tr><th><a href="directive-dict.html#Default">Default:</a></th><td><code>H2MaxWorkerIdleSeconds 600</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_h2</td></tr>
</table>
<p>
This directive sets the maximum number of seconds a h2 worker may
idle until it shuts itself down. This only happens while the number of
h2 workers exceeds <code>H2MinWorkers</code>.
</p>
<div class="example"><h3>Example</h3><pre class="prettyprint lang-config">H2MaxWorkerIdleSeconds 20</pre>
</div>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="H2MaxWorkers" id="H2MaxWorkers">H2MaxWorkers</a> <a name="h2maxworkers" id="h2maxworkers">Directive</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Maximum number of worker threads to use per child process.</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>H2MaxWorkers <em>n</em></code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_h2</td></tr>
</table>
<p>
This directive sets the maximum number of worker threads to spawn
per child process for HTTP/2 processing. If this directive is not used,
<code>mod_h2</code> will chose a value suitable for the <code>mpm</code>
module loaded.
</p>
<div class="example"><h3>Example</h3><pre class="prettyprint lang-config">H2MaxWorkers 20</pre>
</div>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="H2MinWorkers" id="H2MinWorkers">H2MinWorkers</a> <a name="h2minworkers" id="h2minworkers">Directive</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Minimal number of worker threads to use per child process.</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>H2MinWorkers <em>n</em></code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_h2</td></tr>
</table>
<p>
This directive sets the minimum number of worker threads to spawn
per child process for HTTP/2 processing. If this directive is not used,
<code>mod_h2</code> will chose a value suitable for the <code>mpm</code>
module loaded.
</p>
<div class="example"><h3>Example</h3><pre class="prettyprint lang-config">H2MinWorkers 10</pre>
</div>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="H2SerializeHeaders" id="H2SerializeHeaders">H2SerializeHeaders</a> <a name="h2serializeheaders" id="h2serializeheaders">Directive</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Serialize Request/Resoonse Processing Switch</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>H2SerializeHeaders on|off</code></td></tr>
<tr><th><a href="directive-dict.html#Default">Default:</a></th><td><code>H2SerializeHeaders off</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_h2</td></tr>
</table>
<p>
This directive toggles if HTTP/2 requests shall be serialized in
HTTP/1.1 format for processing by <code>httpd</code> core or if
received binary data shall be passed into the <code>request_rec</code>s
directly.
</p>
<p>
Serialization will lower performance, but gives more backward
compatibility in case custom filters/hooks need it.
</p>
<div class="example"><h3>Example</h3><pre class="prettyprint lang-config">H2SerializeHeaders on</pre>
</div>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="H2SessionExtraFiles" id="H2SessionExtraFiles">H2SessionExtraFiles</a> <a name="h2sessionextrafiles" id="h2sessionextrafiles">Directive</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Number of Extra File Handles</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>H2SessionExtraFiles <em>n</em></code></td></tr>
<tr><th><a href="directive-dict.html#Default">Default:</a></th><td><code>H2SessionExtraFiles 5</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_h2</td></tr>
</table>
<p>
This directive sets maximum number of <em>extra</em> file handles
a HTTP/2 session is allowed to use. A file handle is counted as
<em>extra</em> when it is transfered from a h2 worker thread to
the main HTTP/2 connection handling. This commonly happens when
serving static files.
</p><p>
Depending on the processing model configured on the server, the
number of connections times number of active streams may exceed
the number of file handles for the process. On the other hand,
converting every file into memory bytes early results in too
many buffer writes. This option helps to mitigate that.
</p><p>
The number of file handles used by a server process is then in
the order of:
</p>
<pre>(h2_connections * extra_files) + (h2_max_worker)</pre>
<div class="example"><h3>Example</h3><pre class="prettyprint lang-config">H2SessionExtraFiles 10</pre>
</div>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="H2StreamMaxMemSize" id="H2StreamMaxMemSize">H2StreamMaxMemSize</a> <a name="h2streammaxmemsize" id="h2streammaxmemsize">Directive</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Maximum amount of output data buffered per stream.</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>H2StreamMaxMemSize <em>bytes</em></code></td></tr>
<tr><th><a href="directive-dict.html#Default">Default:</a></th><td><code>H2StreamMaxMemSize 65536</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_h2</td></tr>
</table>
<p>
This directive sets the maximum number of outgoing data bytes buffered in memory
for an active streams. This memory is not allocated per stream as such. Allocations
are counted against this limit when they are about to be done. Stream processing
freezes when the limit has been reached and will only continue when buffered data
has been sent out to the client.
</p>
<div class="example"><h3>Example</h3><pre class="prettyprint lang-config">H2StreamMaxMemSize 128000</pre>
</div>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="H2WindowSize" id="H2WindowSize">H2WindowSize</a> <a name="h2windowsize" id="h2windowsize">Directive</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Size of Stream Window for upstream data.</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>H2WindowSize <em>bytes</em></code></td></tr>
<tr><th><a href="directive-dict.html#Default">Default:</a></th><td><code>H2WindowSize 65536</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_h2</td></tr>
</table>
<p>
This directive sets the size of the window that is used for flow control
from client to server and limits the amount of data the server has to buffer.
The client will stop sending on a stream once the limit has been reached until
the server announces more available space (as it has processed some of the data).
</p><p>
This limit affects only request bodies, not its meta data such as headers. Also,
it has no effect on response bodies as the window size for those are managed
by the clients.
</p>
<div class="example"><h3>Example</h3><pre class="prettyprint lang-config">H2WindowSize 128000</pre>
</div>
</div>
</div>
<div class="bottomlang">
<p><span>Available Languages: </span><a href="../en/mod/mod_h2.html" title="English">&nbsp;en&nbsp;</a></p>
</div><div class="top"><a href="#page-header"><img src="../images/up.gif" alt="top" /></a></div><div class="section"><h2><a id="comments_section" name="comments_section">Comments</a></h2><div class="warning"><strong>Notice:</strong><br />This is not a Q&amp;A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed again by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Freenode, or sent to our <a href="http://httpd.apache.org/lists.html">mailing lists</a>.</div>
<script type="text/javascript"><!--//--><![CDATA[//><!--
var comments_shortname = 'httpd';
var comments_identifier = 'http://httpd.apache.org/docs/trunk/mod/mod_h2.html';
(function(w, d) {
if (w.location.hostname.toLowerCase() == "httpd.apache.org") {
d.write('<div id="comments_thread"><\/div>');
var s = d.createElement('script');
s.type = 'text/javascript';
s.async = true;
s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
(d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
}
else {
d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>');
}
})(window, document);
//--><!]]></script></div><div id="footer">
<p class="apache">Copyright 2015 The Apache Software Foundation.<br />Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/quickreference.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a></p></div><script type="text/javascript"><!--//--><![CDATA[//><!--
if (typeof(prettyPrint) !== 'undefined') {
prettyPrint();
}
//--><!]]></script>
</body></html>

416
docs/manual/mod/mod_h2.xml Normal file
View File

@@ -0,0 +1,416 @@
<?xml version="1.0"?>
<!DOCTYPE modulesynopsis SYSTEM "../style/modulesynopsis.dtd">
<?xml-stylesheet type="text/xsl" href="../style/manual.en.xsl"?>
<!-- $LastChangedRevision: 1682937 $ -->
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<modulesynopsis metafile="mod_h2.xml.meta">
<name>mod_h2</name>
<description>Support for the HTTP/2 transport layer</description>
<status>Extension</status>
<sourcefile>mod_h2.c</sourcefile>
<identifier>h2_module</identifier>
<summary>
<p>This module provides HTTP/2 (RFC 7540) support for the Apache
HTTP Server.</p>
<p>This module relies on <a href="http://nghttp2.org/">libnghttp2</a>
to provide the core http/2 engine.</p>
</summary>
<directivesynopsis>
<name>H2Engine</name>
<description>H2 Engine Operation Switch</description>
<syntax>H2Engine on|off</syntax>
<default>H2Engine off</default>
<contextlist>
<context>server config</context>
<context>virtual host</context>
</contextlist>
<usage>
<p>
This directive toggles the usage of the HTTP/2 Protocol Engine. This
should be used inside a
<directive module="core" type="section">VirtualHost</directive>
section to enable HTTP/2 for that virtual host. By default the
HTTP/2 Protocol Engine is disabled for both the main server and all
configured virtual hosts.
</p>
<example><title>Example</title>
<highlight language="config">
&lt;VirtualHost _default_:443&gt;
H2Engine on
#...
&lt;/VirtualHost&gt;
</highlight>
</example>
<p>
The HTTP/2 engine is usable in TLS and plain scenarios, supporting
the 'h2' and 'h2c' variants of the protocol.
</p>
</usage>
</directivesynopsis>
<directivesynopsis>
<name>H2Direct</name>
<description>H2 Direct Protocol Switch</description>
<syntax>H2Direct on|off</syntax>
<default>H2Direct on</default>
<contextlist>
<context>server config</context>
<context>virtual host</context>
</contextlist>
<usage>
<p>
This directive toggles the usage of the HTTP/2 Direct Mode. This
should be used inside a
<directive module="core" type="section">VirtualHost</directive>
section to enable direct HTTP/2 communication for that virtual host.
Direct communication means that if the first bytes received by the
server on a connection match the HTTP/2 preamble, the HTTP/2
protocol is switched to immediately without further negotiation.
This mode falls outside the RFC 7540 but has become widely implemented
as it is very convenient for development and testing.
By default the direct HTTP/2 mode is enabled.
</p>
<example><title>Example</title>
<highlight language="config">
H2Direct on
</highlight>
</example>
</usage>
</directivesynopsis>
<directivesynopsis>
<name>H2MaxSessionStreams</name>
<description>Maximum number of active streams per HTTP/2 session.</description>
<syntax>H2MaxSessionStreams <em>n</em></syntax>
<default>H2MaxSessionStreams 100</default>
<contextlist>
<context>server config</context>
<context>virtual host</context>
</contextlist>
<usage>
<p>
This directive sets the maximum number of active streams per HTTP/2 session (e.g. connection)
that the server allows. A stream is active if it is not <code>idle</code> or
<code>closed</code> according to RFC 7540.
</p>
<example><title>Example</title>
<highlight language="config">
H2MaxSessionStreams 20
</highlight>
</example>
</usage>
</directivesynopsis>
<directivesynopsis>
<name>H2StreamMaxMemSize</name>
<description>Maximum amount of output data buffered per stream.</description>
<syntax>H2StreamMaxMemSize <em>bytes</em></syntax>
<default>H2StreamMaxMemSize 65536</default>
<contextlist>
<context>server config</context>
<context>virtual host</context>
</contextlist>
<usage>
<p>
This directive sets the maximum number of outgoing data bytes buffered in memory
for an active streams. This memory is not allocated per stream as such. Allocations
are counted against this limit when they are about to be done. Stream processing
freezes when the limit has been reached and will only continue when buffered data
has been sent out to the client.
</p>
<example><title>Example</title>
<highlight language="config">
H2StreamMaxMemSize 128000
</highlight>
</example>
</usage>
</directivesynopsis>
<directivesynopsis>
<name>H2WindowSize</name>
<description>Size of Stream Window for upstream data.</description>
<syntax>H2WindowSize <em>bytes</em></syntax>
<default>H2WindowSize 65536</default>
<contextlist>
<context>server config</context>
<context>virtual host</context>
</contextlist>
<usage>
<p>
This directive sets the size of the window that is used for flow control
from client to server and limits the amount of data the server has to buffer.
The client will stop sending on a stream once the limit has been reached until
the server announces more available space (as it has processed some of the data).
</p><p>
This limit affects only request bodies, not its meta data such as headers. Also,
it has no effect on response bodies as the window size for those are managed
by the clients.
</p>
<example><title>Example</title>
<highlight language="config">
H2WindowSize 128000
</highlight>
</example>
</usage>
</directivesynopsis>
<directivesynopsis>
<name>H2MaxHeaderListSize</name>
<description>Maximum size of acceptable stream headers.</description>
<syntax>H2MaxHeaderListSize <em>bytes</em></syntax>
<default>H2MaxHeaderListSize 16384</default>
<contextlist>
<context>server config</context>
<context>virtual host</context>
</contextlist>
<usage>
<p>
This directive sets the maximum amount of stream header bytes that
the server is willing to accept. It is announced to the client during
the initial HTTP/2 handshake.
</p>
<example><title>Example</title>
<highlight language="config">
H2MaxHeaderListSize 10000
</highlight>
</example>
</usage>
</directivesynopsis>
<directivesynopsis>
<name>H2MinWorkers</name>
<description>Minimal number of worker threads to use per child process.</description>
<syntax>H2MinWorkers <em>n</em></syntax>
<contextlist>
<context>server config</context>
</contextlist>
<usage>
<p>
This directive sets the minimum number of worker threads to spawn
per child process for HTTP/2 processing. If this directive is not used,
<code>mod_h2</code> will chose a value suitable for the <code>mpm</code>
module loaded.
</p>
<example><title>Example</title>
<highlight language="config">
H2MinWorkers 10
</highlight>
</example>
</usage>
</directivesynopsis>
<directivesynopsis>
<name>H2MaxWorkers</name>
<description>Maximum number of worker threads to use per child process.</description>
<syntax>H2MaxWorkers <em>n</em></syntax>
<contextlist>
<context>server config</context>
</contextlist>
<usage>
<p>
This directive sets the maximum number of worker threads to spawn
per child process for HTTP/2 processing. If this directive is not used,
<code>mod_h2</code> will chose a value suitable for the <code>mpm</code>
module loaded.
</p>
<example><title>Example</title>
<highlight language="config">
H2MaxWorkers 20
</highlight>
</example>
</usage>
</directivesynopsis>
<directivesynopsis>
<name>H2MaxWorkerIdleSeconds</name>
<description>Maximum number of seconds h2 workers remain idle until shut down.</description>
<syntax>H2MaxWorkerIdleSeconds <em>n</em></syntax>
<default>H2MaxWorkerIdleSeconds 600</default>
<contextlist>
<context>server config</context>
</contextlist>
<usage>
<p>
This directive sets the maximum number of seconds a h2 worker may
idle until it shuts itself down. This only happens while the number of
h2 workers exceeds <code>H2MinWorkers</code>.
</p>
<example><title>Example</title>
<highlight language="config">
H2MaxWorkerIdleSeconds 20
</highlight>
</example>
</usage>
</directivesynopsis>
<directivesynopsis>
<name>H2BufferOutput</name>
<description>Output Buffering Switch</description>
<syntax>H2BufferOutput on|off</syntax>
<contextlist>
<context>server config</context>
<context>virtual host</context>
</contextlist>
<usage>
<p>
This directive toggles if buffering of HTTP/2 output shall be used
or if data is written immediately when it arrives. Unless specified
otherwise, this directive is <code>on</code> for TLS connections and
<code>off</code> for plain connections.
</p>
<example><title>Example</title>
<highlight language="config">
H2BufferOutput on
</highlight>
</example>
</usage>
</directivesynopsis>
<directivesynopsis>
<name>H2BufferSize</name>
<description>Buffer size for outgoing data per HTTP/2 connection.</description>
<syntax>H2BufferSize <em>bytes</em></syntax>
<default>H2BufferSize 65536</default>
<contextlist>
<context>server config</context>
<context>virtual host</context>
</contextlist>
<usage>
<p>
This directive sets the size of the buffer used to hold outgoing
HTTP/2 raw data, should <code>H2BufferOutput</code> be switched on.
This data is allocated per HTTP/2 connection, not stream and is
counted against the raw protocol data.
</p>
<example><title>Example</title>
<highlight language="config">
H2BufferSize 128000
</highlight>
</example>
</usage>
</directivesynopsis>
<directivesynopsis>
<name>H2BufferWriteMax</name>
<description>Maximum size of write on a HTTP/2 connection.</description>
<syntax>H2BufferWriteMax <em>bytes</em></syntax>
<default>H2BufferWriteMax 16384</default>
<contextlist>
<context>server config</context>
<context>virtual host</context>
</contextlist>
<usage>
<p>
This directive sets maximum amount of data sent out in a single
write on a http/2 connection. It only takes effect when
<code>H2BufferOutput</code> is switched on.
</p><p>
This directive affects performance of underlying TLS transports. TLS
transforms each write into an encrypted record. Clients need
to receive all of the record in order to decrypt it. Larger sizes
result in better server performance, shorter sizes can affect web
page paint timings.
</p><p>
<code>BufferSize</code> should be a multiple of <code>H2BufferWriteMax</code>.
<code>H2BufferWriteMax</code>, if larger than 16k, should be a multiple of 16k,
since this is the TLS max record size. Be aware that there are TLS
extensions to limit the record size to powers of 2 less than 16k.
</p>
<example><title>Example</title>
<highlight language="config">
H2BufferWriteMax 8000
</highlight>
</example>
</usage>
</directivesynopsis>
<directivesynopsis>
<name>H2SessionExtraFiles</name>
<description>Number of Extra File Handles</description>
<syntax>H2SessionExtraFiles <em>n</em></syntax>
<default>H2SessionExtraFiles 5</default>
<contextlist>
<context>server config</context>
<context>virtual host</context>
</contextlist>
<usage>
<p>
This directive sets maximum number of <em>extra</em> file handles
a HTTP/2 session is allowed to use. A file handle is counted as
<em>extra</em> when it is transfered from a h2 worker thread to
the main HTTP/2 connection handling. This commonly happens when
serving static files.
</p><p>
Depending on the processing model configured on the server, the
number of connections times number of active streams may exceed
the number of file handles for the process. On the other hand,
converting every file into memory bytes early results in too
many buffer writes. This option helps to mitigate that.
</p><p>
The number of file handles used by a server process is then in
the order of:
</p>
<pre>
(h2_connections * extra_files) + (h2_max_worker)
</pre>
<example><title>Example</title>
<highlight language="config">
H2SessionExtraFiles 10
</highlight>
</example>
</usage>
</directivesynopsis>
<directivesynopsis>
<name>H2SerializeHeaders</name>
<description>Serialize Request/Resoonse Processing Switch</description>
<syntax>H2SerializeHeaders on|off</syntax>
<default>H2SerializeHeaders off</default>
<contextlist>
<context>server config</context>
<context>virtual host</context>
</contextlist>
<usage>
<p>
This directive toggles if HTTP/2 requests shall be serialized in
HTTP/1.1 format for processing by <code>httpd</code> core or if
received binary data shall be passed into the <code>request_rec</code>s
directly.
</p>
<p>
Serialization will lower performance, but gives more backward
compatibility in case custom filters/hooks need it.
</p>
<example><title>Example</title>
<highlight language="config">
H2SerializeHeaders on
</highlight>
</example>
</usage>
</directivesynopsis>
</modulesynopsis>

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!-- GENERATED FROM XML: DO NOT EDIT -->
<metafile reference="mod_h2.xml">
<basename>mod_h2</basename>
<path>/mod/</path>
<relpath>..</relpath>
<variants>
<variant>en</variant>
</variants>
</metafile>

View File

@@ -497,7 +497,21 @@ media type in the HTTP Content-Type header field</td></tr>
will exit.</td></tr>
<tr class="odd"><td><a href="mod_unixd.html#group">Group <var>unix-group</var></a></td><td> #-1 </td><td>s</td><td>B</td></tr><tr class="odd"><td class="descr" colspan="4">Group under which the server will answer
requests</td></tr>
<tr><td><a href="mod_headers.html#header" id="H" name="H">Header [<var>condition</var>] add|append|echo|edit|edit*|merge|set|setifempty|unset|note
<tr><td><a href="mod_h2.html#h2bufferoutput" id="H" name="H">H2BufferOutput on|off</a></td><td></td><td>sv</td><td>E</td></tr><tr><td class="descr" colspan="4">Output Buffering Switch</td></tr>
<tr class="odd"><td><a href="mod_h2.html#h2buffersize">H2BufferSize <em>bytes</em></a></td><td> 65536 </td><td>sv</td><td>E</td></tr><tr class="odd"><td class="descr" colspan="4">Buffer size for outgoing data per HTTP/2 connection.</td></tr>
<tr><td><a href="mod_h2.html#h2bufferwritemax">H2BufferWriteMax <em>bytes</em></a></td><td> 16384 </td><td>sv</td><td>E</td></tr><tr><td class="descr" colspan="4">Maximum size of write on a HTTP/2 connection.</td></tr>
<tr class="odd"><td><a href="mod_h2.html#h2direct">H2Direct on|off</a></td><td> on </td><td>sv</td><td>E</td></tr><tr class="odd"><td class="descr" colspan="4">H2 Direct Protocol Switch</td></tr>
<tr><td><a href="mod_h2.html#h2engine">H2Engine on|off</a></td><td> off </td><td>sv</td><td>E</td></tr><tr><td class="descr" colspan="4">H2 Engine Operation Switch</td></tr>
<tr class="odd"><td><a href="mod_h2.html#h2maxheaderlistsize">H2MaxHeaderListSize <em>bytes</em></a></td><td> 16384 </td><td>sv</td><td>E</td></tr><tr class="odd"><td class="descr" colspan="4">Maximum size of acceptable stream headers.</td></tr>
<tr><td><a href="mod_h2.html#h2maxsessionstreams">H2MaxSessionStreams <em>n</em></a></td><td> 100 </td><td>sv</td><td>E</td></tr><tr><td class="descr" colspan="4">Maximum number of active streams per HTTP/2 session.</td></tr>
<tr class="odd"><td><a href="mod_h2.html#h2maxworkeridleseconds">H2MaxWorkerIdleSeconds <em>n</em></a></td><td> 600 </td><td>s</td><td>E</td></tr><tr class="odd"><td class="descr" colspan="4">Maximum number of seconds h2 workers remain idle until shut down.</td></tr>
<tr><td><a href="mod_h2.html#h2maxworkers">H2MaxWorkers <em>n</em></a></td><td></td><td>s</td><td>E</td></tr><tr><td class="descr" colspan="4">Maximum number of worker threads to use per child process.</td></tr>
<tr class="odd"><td><a href="mod_h2.html#h2minworkers">H2MinWorkers <em>n</em></a></td><td></td><td>s</td><td>E</td></tr><tr class="odd"><td class="descr" colspan="4">Minimal number of worker threads to use per child process.</td></tr>
<tr><td><a href="mod_h2.html#h2serializeheaders">H2SerializeHeaders on|off</a></td><td> off </td><td>sv</td><td>E</td></tr><tr><td class="descr" colspan="4">Serialize Request/Resoonse Processing Switch</td></tr>
<tr class="odd"><td><a href="mod_h2.html#h2sessionextrafiles">H2SessionExtraFiles <em>n</em></a></td><td> 5 </td><td>sv</td><td>E</td></tr><tr class="odd"><td class="descr" colspan="4">Number of Extra File Handles</td></tr>
<tr><td><a href="mod_h2.html#h2streammaxmemsize">H2StreamMaxMemSize <em>bytes</em></a></td><td> 65536 </td><td>sv</td><td>E</td></tr><tr><td class="descr" colspan="4">Maximum amount of output data buffered per stream.</td></tr>
<tr class="odd"><td><a href="mod_h2.html#h2windowsize">H2WindowSize <em>bytes</em></a></td><td> 65536 </td><td>sv</td><td>E</td></tr><tr class="odd"><td class="descr" colspan="4">Size of Stream Window for upstream data.</td></tr>
<tr><td><a href="mod_headers.html#header">Header [<var>condition</var>] add|append|echo|edit|edit*|merge|set|setifempty|unset|note
<var>header</var> [[expr=]<var>value</var> [<var>replacement</var>]
[early|env=[!]<var>varname</var>|expr=<var>expression</var>]]
</a></td><td></td><td>svdh</td><td>E</td></tr><tr><td class="descr" colspan="4">Configure HTTP response headers</td></tr>

View File

@@ -41,6 +41,9 @@ generators/
http/
This directory houses modules that basic HTTP protocol implementation.
http2/
This directory houses modules that provide HTTP/2 protocol implementation.
loggers/
This directory houses modules that handle logging functions.

View File

@@ -1 +0,0 @@
Stefan Eissing <stefan.eissing at greenbytes.de>

View File

@@ -1,271 +0,0 @@
v0.8.0
--------------------------------------------------------------------------------
* when serving static files, these are kept open longer (and buffer copied
less). Use config "H2SessionExtraFiles" to change the value. The more you
can give per connection, the better. But you may run out of open file
handles, if not careful. Default value is 5, which seems to work on my
config with mpms worker, event and prefork. Basically, eaach httpd process
needs at least #connections + #workers + (#conn * #extrafiles) available.
* main connection buffering, buffer sizes and write sizes are configurable,
see README.md for the list of options. buffer sizes and write sizes influence
the TLS performance. Defaults seem reasonably, but ymmv.
* general performance improved due to better handling of stream close and
resource cleanup
* prefork mpm confirmed working. Unless configured otherwise, each session
will only have 1 worker thread. Raise this with "H2MaxWorkers"
* changed sandbox cipher config to mozilla recommendation (thanks Lucas)
* sandbox update to nghttp2 1.0.5
v0.7.3
--------------------------------------------------------------------------------
* sandbox update to nghttp2 1.0.4
* rework of stream scheduling and thread sync
* test suite runs with mpm_prefork on OS X and Ubuntu (feedback welcome)
v0.7.2
--------------------------------------------------------------------------------
* fixes crash with certain modules that (correctly) expected their
pre_connection hooks to work. Solves #28
* fixes log statements and Makefile to compile sandbox on 32bit linux
v0.7.1
--------------------------------------------------------------------------------
* h2_mplx now uses reference counting to enable a controlled destruction on
session termination. If this fixes all the crashes reported, remains to
be seen.
v0.7.0
--------------------------------------------------------------------------------
* switching to nghttp2 v1.0.*, compilation + linkage with nghttp2 v0.7.* will
not work any more as there have been changes in nghttp2's API. The sandbox
builds against v1.0.2 and also pulls curl 7.43.0 which did the same version
switch.
* keeping support for h2-16/h2-14 ALPN identifiers until a 1.0 release
* varying h2 support (on|off) among virtual hosts on the same port is now
possible and should work correctly.
* improved mod_ssl alpn patch to correctly select the proper virtual host
even if the SSL library invokes SNI after ALPN callbacks.
* Disabled NPN support in sandbox built. The patch for httpd 2.4.x is still
there, but no longer applied.
* KNOWN ISSUE: when using mpm_event, the error
"error scoreboard is full, not at MaxRequestWorkers"
sometimes happens. Under investigation. mpm_worker ist stable and recommended
for now.
v0.6.6
--------------------------------------------------------------------------------
* adding sni_misdirect.patch for httpd/mod_ssl that changes status code when
TLS connections are reused for other vhosts.
v0.6.5
--------------------------------------------------------------------------------
* httpd scoreboard fixups: scoreboard handles are still updated on the main
connection from all stream request incoming from it, since it is not trivial
to get new handles for h2 workers. Updating of scoreboard status has been
improved, no workers remain on "G"raceful shutdown in load tests any longer.
* some refacoring to isolate tls/alpn/upgrade code
* adding php-wrapper script to distribution, was missing
v0.6.4
--------------------------------------------------------------------------------
* accepting "h2" on Upgrade: headers and allowing also Upgrade to work on TLS
connections that talk HTTP/1.1.
* logging WARNING once when mod_h2 is used in a "prefork" mpm configuration.
There seem to be issues with mod_proxy/rewrite and dankging I/O.
* added test suites for combinations with mod_proxy and mod_rewrite
* added test for request with Host: header where h2 is not enabled
* sandbox now builds local openssl 1.0.2 if 1.0.1 or older are installed
on the system. Prior 1.0.1 was accepted, but NPN support will be disabled
soon.
* added "Known Problems" section in README
* direct mode should also work with TLS connections, untested currently.
v0.6.3
--------------------------------------------------------------------------------
* h2c direct mode is now enabled on http: virtual hosts. It can be disabled
by configuring "H2Direct off" for the base server. This works for clients
with prior knowledge that a http server supports h2c.
v0.6.2
--------------------------------------------------------------------------------
* added "H2Direct (on|off)" as config directive. On a non-TLS host, it enables
direct h2c communication without any Upgrade dance. Useful for testing, for
example with h2load.
* fixed concurrency issue observed on a mpm_event server when closing sessions
v0.6.1
--------------------------------------------------------------------------------
* relaxing task finished sync due to segfaults with mpm_event
* mod_reqtimeout enabled on stream processing again
* merged pr from ecovener, fix for ap_update_vhost_from_headers use
* tinkering with buffering on main connection
v0.6.0
--------------------------------------------------------------------------------
* fiddling around with task/worker assignments to use the global h2_workers
lock less, giving better parallelism
* ./configure --enable-werror enables all sorts of compiler diagnostics, if
the chosen compiler supports them
* merged pull request with compiler warning fixes by LPardue and @samhurst
(Thanks!)
* new config option "H2SerializeHeaders (On|Off)" that determines if request
response headers should be serialized/parsed when converting from HTTP/2 to
httpd's internal HTTP/1 processing or request_recs are manipulated directly.
"Off" is default, "On" gives better compatibility.
* new config options "H2HackMpmEvent (On|Off) that enables a hack to make
internal connection work with the mpm_event module. Has no effect if other
mpm modules have been configured. Defaults to "On"."
* upgrading sandbox to nghttp2 0.7.15
v0.5.6
--------------------------------------------------------------------------------
* making SSL variables available in subprocess (e.g. CGI) environments if
configured (fixes #19)
v0.5.5
--------------------------------------------------------------------------------
* improved transfer of large resources by 50% by more efficient writes
v0.5.4
--------------------------------------------------------------------------------
* moving request handling and http/1 emulation into worker thread, offloading
main
* some fixes in connection shutdown re race condition with still active workers
* removing reqtimeout filters on stream connections
* taking in latest alpn changes from httpd trunk, made separate npn patch for
those who need to run with openssl 1.0.1
* fixed handling of transient bucket in stream output data (led to corrupted
responses)
* reworked task join to eliminate race conditions during session shutdown
* info logging is less verbose
v0.5.2
--------------------------------------------------------------------------------
* rewrote the input handling
* forwarding headers in camel case to HTTP/1 request prossing
* merging duplicate headers into single line with proper separators
* eliminated h2_bucket by using apr_bucket_brigades everywhere
* added test cases and fixed chunked input processing
* sandbox now uses curl 7.42.0
* enhanced alpn patch slightly, compatible to old one, no need to repatch mod_ssl on existing installations
* adding some tests with fcgi, for sandbox testing please install php5-cgi
v0.5.1
--------------------------------------------------------------------------------
* ensuring HOST header is properly set for internal request handling
* updated sandbox to latest nghttp2 release
v0.5.0
--------------------------------------------------------------------------------
* improved resource handling and performance
* fixes lookup of correct server config when several virtual hosts are
available
v0.4.5
--------------------------------------------------------------------------------
* fixed base64 decoding to use correct dialect when upgrading to h2c
v0.4.4
--------------------------------------------------------------------------------
* adds missing file in distribution tar, fixes #11
* sandbox now uses nghttp2 0.7.11
v0.4.3
--------------------------------------------------------------------------------
* heavy work on internal data transfers, use of apache bucket brigades for
improved performance and parallelism
* mod_h2 now performs proper flow-control on input. Uploads can no longer
flood memory of the server.
* changed mod_ssl patch to reflect current trunk changes in regard to NPN/ALPN
support.
* patched the trunk ALPN patch to make it do the right thing if no
ALPNPreference is configured
* added DESTDIR support in Makefile as supplied by Hanno Böck.
v0.4.2
--------------------------------------------------------------------------------
* adding more low-level logging to NPN/ALPN negotiation
* added '-Werror' to module compiler flags (thanks @devurandom)
* debugged and tcpdumped around h2c startup handling with curl on certain
platforms. If you experience connection hangers, report pls with 'trace2'
level error log.
v0.4.1
--------------------------------------------------------------------------------
* fixing infinite loop when aborting session with tasks hanging in read
v0.4.0
--------------------------------------------------------------------------------
* h2 + h2-16 will be negiotiated/upgraded. Priority handling is implemented
in nghttp2, however assigning requests to workers has currently not the
necessary information.
* Alt-Svc support based on https://http2.github.io/http2-spec/alt-svc.html#indicator
Configuration directives "H2AltSvc" and "H2AltSvcMaxAge" added. Configurable
per virtual host.
* reduced lock contention and eliminated broadcast signalling on internal
condition variables, improved multi-thread performance
v0.3.1
--------------------------------------------------------------------------------
* defining _GNU_SOURCE to pull in proper features and make APR header files
happy, fixes #7
v0.3.0
--------------------------------------------------------------------------------
* new directory structure, all sandbox related parts have been moved to
own sandbox dir
* non-sandbox configuration no longer triggers building of sandbox stuff
* cleanup up distribution builds to have smaller and working tar balls
v0.2.2
--------------------------------------------------------------------------------
* optimizations on response reads
* being more apacheeeish, using APR_RINGs for queue handling
* using openssl latest.tar.gz to retrieve latest openssl for sandbox
* fixed crash in large request header handling
* better flushing of stream io resulting in performance improvements
* added sandbox tests for chunked responses of various sizes
* integrated fix (https://github.com/icing/mod_h2/pull/5) from
Jonathan (invader444) to fix chunked encoding when converting http/1
responses to http2 unchunked data.
v0.2.1
--------------------------------------------------------------------------------
* changed apr_pool usage to have more recycling, 50% performance increase in
loadtest
* added hack to enable mod_h2 to run in mpm_event (experimental)
* changed internal stream/data lookup from O(n/2) to O(log(n)) time
* fixed index in http2 to http1 header conversion leading to segfaults
* update openssl version downloaded for sandbox
* using sha256 for self-signed sandbox certificates
* sandbox certificate no longer announces itself as roo
(last 3 thanks to michael.koeller at greenbytes.de)
v0.2.0
--------------------------------------------------------------------------------
* merged pull request from Tatsuhiro Tsujikawa, removing code for CONTINUATION
frames that are never seen by mod_h2
* request/response headers are filtered when converting between HTTP/1.1 and
HTTP/2 where they can only do harm (Expect/Connection/etc.)
* added test cases for uploads
* fixed handling of uploads ;-)
* enabled h2c upgrade for "OPTIONS *" requests
* changed h2_stream_set implementation to use sorted apr array
* switched to nghttp2 v0.7.7 in sandbox
v0.1.1
--------------------------------------------------------------------------------
* added cgi test cases (needs python installed)
* fixed typo in configure.ac that did not set the CPP flags correctly (#3)
* fixed handling of chunked encoding in responses
* merged header macro pull request from MATSUMOTO, Ryosuke
v0.1.0
--------------------------------------------------------------------------------
* first alpha release, see README on how to use it and what is all missing
* h2 supported with openssl > 1.0.1 and patched mod_ssl (patch included and used in sandbox)
* h2c supported
* only usable in mpm_worker right now
* configure --enable-sandbox for a local install of everything needed
* tested with httpd 2.4.12 and nghttp2 0.7.5 on Ubuntu 14.04 and OS X 10.10

View File

@@ -1,149 +0,0 @@
mod_h2 - a http/2 modules for apache httpd
==========================================
The mod_h2 Apache httpd module implements the HTTP2 protocol (h2+h2c) on
top of libnghttp2 for httpd 2.4 servers. For a general description, see
the README, installation issues are detailed in INSTALL.
This document is for discussion of the module's internals, current issues
and exploration of ideas.
THE GOALS
---------
The goals of this module can be stated as follows:
- make the full htpp2 standard available in Apache httpd
- provide it as a module on top of httpd 2.4.x
- support deployment on standard unix platforms
HOW IT WORKS
------------
The architecture of this module is heavily inspired by Google's mod_spdy:
The incoming, parallel requests (http2 streams) are dispatched to a thread
pool, responses are collected and multiplexed on the original connection.
The major players in ascii art:
h2_conn -> h2_session ------> h2_mplx ----> h2_task / h2_worker
(socket) (nghttp2_session) |-> h2_task / h2_worker
|-> h2_task / h2_worker
...
h2_session: by using nghttp2 API, is doing the http2 frame work, stream
states, flow control, etc. Sits as connection level filter
on standard httpd connections. Gets active either by ALPN
selection or as HTTP/1.1 Upgrade from a request.
h2_mplx: is a somewhat specialized bucket_brigate. It multiplexes data
buckets associated with stream IDs in both directions and
has some specials to reset streams or announce response headers.
It also performs flow control on the downlink of streams.
h2_task: having own conn_rec instance, plus in/out filters at connection
level, is converting http2 streams into http/1.1 requests and
parses back responses to http2 usable headers and data.
LIFETIMES
---------
For each connection that uses HTTP/2, a new h2_session is created. That lives
as long as all objects it creates: h2_stream and h2_task instances. So, when
closing a h2_session, this waits until all associated h2_streams have
been destroyed. h2_streams will only be destroyed when their h2_task is either
removed from the schedule queue or has terminated.
Insofar, the lifetimes from h2_session/h2_stream have the similar relations as
conn_rec/request_rec with the exception that there can be many simultaneous
h2_streams active per h2_session (and in various worker threads).
THREAD HANDLING
---------------
h2_session is only ever accessed from the thread handling the original
connection. Same for h2_stream instances. The execution of what is necessary
for execution of a h2_stream happens in h2_task. h2_task gets instantiated
in the connection thread, but is the handed to a worker and, apart from
checking its status atomically, not called by any other thread.
The object that shovels the data packages back and forth and is accessed from
multiple threads is h2_mplx. h2_tasks use it to retrieve their input and feed
it their output. h2_mplx blocks h2_tasks when no input is available or
the amount of output queue has reached a certain maximum.
There is a nice thread pool in apr-util which even suports priority scheduling.
It would be good to exchange the h2_worker(s) for this pool, except mod_h2
has the use case that streams can be aborted by the client and the
corresponding task needs to be removed from the schedule without any
blocking wait for a possibly running task to complete. This is not offered
by apr-util.
LOCKS / CONDITIONS
------------------
apr_thread_mutex_t is used for locking. apr_thread_cond_t is used for blocking
and signalling. The number of such objects created grows linear with the
number of parallel main connections, plus the number of worker threads.
This means it is not influenced by the number of outstanding requests. The
intention for this is to allow, possibly, many outstanding requests per HTTP/2
connection without consuming unnecessary server resources.
MEMORY HANDLING
---------------
The session pool is a sub pool of the main connection pool, with the twist
that it has its own allocator (apr_allocator_t). That allocator is protected
with a apr_thread_mutex (one instance per session). All further sub-pools share
this allocator.
Protecting the allocator allows sub pools to live in other threads
concurrently, Necessary for parallel processing of HTTP/2 streams. (As
alternative, using root pool for streams was tested, but resulted in poorer
performance).
Everything related to a h2_stream (and even the struct itself) is allocated
from a new subpool. This guarantuees that all memory is recycled when the
stream is destroyed. Same holds true for h2_tasks, which get their own
sub pools.
FILE BUCKET HANDLING
--------------------
Requests for static resources result most often in a single file bucket being
send as body of the response. This would ideally be placed into eh h2_mplx,
thus finished the h2_task and freeing the h2_worker for other things.
This is difficult for the following 2 reasons:
1. Finishing the h2_task will free pool and run registered cleanup functions
that closes the file. The file needs to traverse this boundary. Early
attempts at doing this nicely have failed.
2. In load scenarios, we quickly run out of open file handles. With 100 max
parallel stream per connection, the process limits can be reached quite
easily.
Solving 1) can be done by careful coding and good debugging of what the apache
runtime does here. Solving 2) requires some kind of resource booking scheme
inside the httpd child process, it seems.
For now, mod_h2 reads files when placing the data into the h2_mplx. That means
that files are completely read before the h2_task is finished and the h2_worker
is available again. This limits the number of open files in buckets to the
number of h2_worker (by order of magnitude - there can be sub requests etc.).
This works well and stable, but does not allow the transfer speeds of httpd's
optimized HTTP/1 implementtion.
DISCUSSION / OPEN QUESTIONS
---------------------------
- HTTP/2 Padding feature is not implemented. As RFC7540, Ch. 10.7 describes,
using a fixed length padding is counter-productive, same as simple random
schemes. The ideal padding is supposed to be chosen by the application. So
maybe a response note or special header should determine it?
- HTTP/2 Priority handling of streams is implemented in nghttp2, HOWEVER it
has no effect on h2_task scheduling. If there is a backlog of streams for
processing by workers, the stream with the highest priority should be
processed first. This information is currently not available via the nghttp2
API.

View File

@@ -1,375 +0,0 @@
mod-h2 - a http/2 modules for apache httpd, Installation
========================================================
Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation,
Inc.
Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. This file is offered as-is,
without warranty of any kind.
Basic Installation
==================
Briefly, the shell command `./configure && make && make install'
should configure, build, and install this package. The following
more-detailed instructions are generic; see the `README' file for
instructions specific to this package. Some packages provide this
`INSTALL' file but do not implement all of the features documented
below. The lack of an optional feature in a given package is not
necessarily a bug. More recommendations for GNU packages can be found
in *note Makefile Conventions: (standards)Makefile Conventions.
The `configure' shell script attempts to guess correct values for
various system-dependent variables used during compilation. It uses
those values to create a `Makefile' in each directory of the package.
It may also create one or more `.h' files containing system-dependent
definitions. Finally, it creates a shell script `config.status' that
you can run in the future to recreate the current configuration, and a
file `config.log' containing compiler output (useful mainly for
debugging `configure').
It can also use an optional file (typically called `config.cache'
and enabled with `--cache-file=config.cache' or simply `-C') that saves
the results of its tests to speed up reconfiguring. Caching is
disabled by default to prevent problems with accidental use of stale
cache files.
If you need to do unusual things to compile the package, please try
to figure out how `configure' could check whether to do them, and mail
diffs or instructions to the address given in the `README' so they can
be considered for the next release. If you are using the cache, and at
some point `config.cache' contains results you don't want to keep, you
may remove or edit it.
The file `configure.ac' (or `configure.in') is used to create
`configure' by a program called `autoconf'. You need `configure.ac' if
you want to change it or regenerate `configure' using a newer version
of `autoconf'.
The simplest way to compile this package is:
1. `cd' to the directory containing the package's source code and type
`./configure' to configure the package for your system.
Running `configure' might take a while. While running, it prints
some messages telling which features it is checking for.
2. Type `make' to compile the package.
3. Optionally, type `make check' to run any self-tests that come with
the package, generally using the just-built uninstalled binaries.
4. Type `make install' to install the programs and any data files and
documentation. When installing into a prefix owned by root, it is
recommended that the package be configured and built as a regular
user, and only the `make install' phase executed with root
privileges.
5. Optionally, type `make installcheck' to repeat any self-tests, but
this time using the binaries in their final installed location.
This target does not install anything. Running this target as a
regular user, particularly if the prior `make install' required
root privileges, verifies that the installation completed
correctly.
6. You can remove the program binaries and object files from the
source code directory by typing `make clean'. To also remove the
files that `configure' created (so you can compile the package for
a different kind of computer), type `make distclean'. There is
also a `make maintainer-clean' target, but that is intended mainly
for the package's developers. If you use it, you may have to get
all sorts of other programs in order to regenerate files that came
with the distribution.
7. Often, you can also type `make uninstall' to remove the installed
files again. In practice, not all packages have tested that
uninstallation works correctly, even though it is required by the
GNU Coding Standards.
8. Some packages, particularly those that use Automake, provide `make
distcheck', which can by used by developers to test that all other
targets like `make install' and `make uninstall' work correctly.
This target is generally not run by end users.
Compilers and Options
=====================
Some systems require unusual options for compilation or linking that
the `configure' script does not know about. Run `./configure --help'
for details on some of the pertinent environment variables.
You can give `configure' initial values for configuration parameters
by setting variables in the command line or in the environment. Here
is an example:
./configure CC=c99 CFLAGS=-g LIBS=-lposix
*Note Defining Variables::, for more details.
Compiling For Multiple Architectures
====================================
You can compile the package for more than one kind of computer at the
same time, by placing the object files for each architecture in their
own directory. To do this, you can use GNU `make'. `cd' to the
directory where you want the object files and executables to go and run
the `configure' script. `configure' automatically checks for the
source code in the directory that `configure' is in and in `..'. This
is known as a "VPATH" build.
With a non-GNU `make', it is safer to compile the package for one
architecture at a time in the source code directory. After you have
installed the package for one architecture, use `make distclean' before
reconfiguring for another architecture.
On MacOS X 10.5 and later systems, you can create libraries and
executables that work on multiple system types--known as "fat" or
"universal" binaries--by specifying multiple `-arch' options to the
compiler but only a single `-arch' option to the preprocessor. Like
this:
./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
CPP="gcc -E" CXXCPP="g++ -E"
This is not guaranteed to produce working output in all cases, you
may have to build one architecture at a time and combine the results
using the `lipo' tool if you have problems.
Installation Names
==================
By default, `make install' installs the package's commands under
`/usr/local/bin', include files under `/usr/local/include', etc. You
can specify an installation prefix other than `/usr/local' by giving
`configure' the option `--prefix=PREFIX', where PREFIX must be an
absolute file name.
You can specify separate installation prefixes for
architecture-specific files and architecture-independent files. If you
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
PREFIX as the prefix for installing programs and libraries.
Documentation and other data files still use the regular prefix.
In addition, if you use an unusual directory layout you can give
options like `--bindir=DIR' to specify different values for particular
kinds of files. Run `configure --help' for a list of the directories
you can set and what kinds of files go in them. In general, the
default for these options is expressed in terms of `${prefix}', so that
specifying just `--prefix' will affect all of the other directory
specifications that were not explicitly provided.
The most portable way to affect installation locations is to pass the
correct locations to `configure'; however, many packages provide one or
both of the following shortcuts of passing variable assignments to the
`make install' command line to change installation locations without
having to reconfigure or recompile.
The first method involves providing an override variable for each
affected directory. For example, `make install
prefix=/alternate/directory' will choose an alternate location for all
directory configuration variables that were expressed in terms of
`${prefix}'. Any directories that were specified during `configure',
but not in terms of `${prefix}', must each be overridden at install
time for the entire installation to be relocated. The approach of
makefile variable overrides for each directory variable is required by
the GNU Coding Standards, and ideally causes no recompilation.
However, some platforms have known limitations with the semantics of
shared libraries that end up requiring recompilation when using this
method, particularly noticeable in packages that use GNU Libtool.
The second method involves providing the `DESTDIR' variable. For
example, `make install DESTDIR=/alternate/directory' will prepend
`/alternate/directory' before all installation names. The approach of
`DESTDIR' overrides is not required by the GNU Coding Standards, and
does not work on platforms that have drive letters. On the other hand,
it does better at avoiding recompilation issues, and works well even
when some directory options were not specified in terms of `${prefix}'
at `configure' time.
Optional Features
=================
If the package supports it, you can cause programs to be installed
with an extra prefix or suffix on their names by giving `configure' the
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
Some packages pay attention to `--enable-FEATURE' options to
`configure', where FEATURE indicates an optional part of the package.
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
is something like `gnu-as' or `x' (for the X Window System). The
`README' should mention any `--enable-' and `--with-' options that the
package recognizes.
For packages that use the X Window System, `configure' can usually
find the X include and library files automatically, but if it doesn't,
you can use the `configure' options `--x-includes=DIR' and
`--x-libraries=DIR' to specify their locations.
Some packages offer the ability to configure how verbose the
execution of `make' will be. For these packages, running `./configure
--enable-silent-rules' sets the default to minimal output, which can be
overridden with `make V=1'; while running `./configure
--disable-silent-rules' sets the default to verbose, which can be
overridden with `make V=0'.
Particular systems
==================
On HP-UX, the default C compiler is not ANSI C compatible. If GNU
CC is not installed, it is recommended to use the following options in
order to use an ANSI C compiler:
./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
and if that doesn't work, install pre-built binaries of GCC for HP-UX.
HP-UX `make' updates targets which have the same time stamps as
their prerequisites, which makes it generally unusable when shipped
generated files such as `configure' are involved. Use GNU `make'
instead.
On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
parse its `<wchar.h>' header file. The option `-nodtk' can be used as
a workaround. If GNU CC is not installed, it is therefore recommended
to try
./configure CC="cc"
and if that doesn't work, try
./configure CC="cc -nodtk"
On Solaris, don't put `/usr/ucb' early in your `PATH'. This
directory contains several dysfunctional programs; working variants of
these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
in your `PATH', put it _after_ `/usr/bin'.
On Haiku, software installed for all users goes in `/boot/common',
not `/usr/local'. It is recommended to use the following options:
./configure --prefix=/boot/common
Specifying the System Type
==========================
There may be some features `configure' cannot figure out
automatically, but needs to determine by the type of machine the package
will run on. Usually, assuming the package is built to be run on the
_same_ architectures, `configure' can figure that out, but if it prints
a message saying it cannot guess the machine type, give it the
`--build=TYPE' option. TYPE can either be a short name for the system
type, such as `sun4', or a canonical name which has the form:
CPU-COMPANY-SYSTEM
where SYSTEM can have one of these forms:
OS
KERNEL-OS
See the file `config.sub' for the possible values of each field. If
`config.sub' isn't included in this package, then this package doesn't
need to know the machine type.
If you are _building_ compiler tools for cross-compiling, you should
use the option `--target=TYPE' to select the type of system they will
produce code for.
If you want to _use_ a cross compiler, that generates code for a
platform different from the build platform, you should specify the
"host" platform (i.e., that on which the generated programs will
eventually be run) with `--host=TYPE'.
Sharing Defaults
================
If you want to set default values for `configure' scripts to share,
you can create a site shell script called `config.site' that gives
default values for variables like `CC', `cache_file', and `prefix'.
`configure' looks for `PREFIX/share/config.site' if it exists, then
`PREFIX/etc/config.site' if it exists. Or, you can set the
`CONFIG_SITE' environment variable to the location of the site script.
A warning: not all `configure' scripts look for a site script.
Defining Variables
==================
Variables not defined in a site shell script can be set in the
environment passed to `configure'. However, some packages may run
configure again during the build, and the customized values of these
variables may be lost. In order to avoid this problem, you should set
them in the `configure' command line, using `VAR=value'. For example:
./configure CC=/usr/local2/bin/gcc
causes the specified `gcc' to be used as the C compiler (unless it is
overridden in the site shell script).
Unfortunately, this technique does not work for `CONFIG_SHELL' due to
an Autoconf limitation. Until the limitation is lifted, you can use
this workaround:
CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
`configure' Invocation
======================
`configure' recognizes the following options to control how it
operates.
`--help'
`-h'
Print a summary of all of the options to `configure', and exit.
`--help=short'
`--help=recursive'
Print a summary of the options unique to this package's
`configure', and exit. The `short' variant lists options used
only in the top level, while the `recursive' variant lists options
also present in any nested packages.
`--version'
`-V'
Print the version of Autoconf used to generate the `configure'
script, and exit.
`--cache-file=FILE'
Enable the cache: use and save the results of the tests in FILE,
traditionally `config.cache'. FILE defaults to `/dev/null' to
disable caching.
`--config-cache'
`-C'
Alias for `--cache-file=config.cache'.
`--quiet'
`--silent'
`-q'
Do not print messages saying which checks are being made. To
suppress all normal output, redirect it to `/dev/null' (any error
messages will still be shown).
`--srcdir=DIR'
Look for the package's source code in directory DIR. Usually
`configure' can determine that directory automatically.
`--prefix=DIR'
Use DIR as the installation prefix. *note Installation Names::
for more details, including other options available for fine-tuning
the installation locations.
`--no-create'
`-n'
Run the configure checks, but stop before creating any output
files.
`configure' also accepts some other, not widely useful, options. Run
`configure --help' for more details.

View File

@@ -1,202 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@@ -1,48 +0,0 @@
# Copyright 2015 greenbytes GmbH (https://www.greenbytes.de)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
SUBDIRS = @BUILD_SUBDIRS@
DIST_SUBDIRS = mod_h2 sandbox setup
ACLOCAL_AMFLAGS = -I m4
dist_doc_DATA = README
.PHONY: test loadtest start stop restart
start:
make -C sandbox start
restart:
make -C sandbox restart
stop:
make -C sandbox stop
test:
make -C sandbox test
loadtest:
make -C sandbox loadtest
mpm_worker:
make -C sandbox mpm_worker
mpm_event:
make -C sandbox mpm_event
mpm_prefork:
make -C sandbox mpm_prefork

View File

View File

@@ -1 +0,0 @@
See README.md

57
modules/http2/README.h2 Normal file
View File

@@ -0,0 +1,57 @@
The h2 module adds support for the HTTP/2 protocol to the server.
Specifically, it supports the protocols "h2" (HTTP2 over TLS) and "h2c"
(HTTP2 over plain HTTP connections via Upgrade). Additionally it offers
the "direct" mode for both encrypted and unencrypted connections.
You may enable it for the whole server or specific virtual hosts only.
BUILD
If you have libnghttp2 (https://nghttp2.org) installed on your system, simply
add
--enable-h2
to your httpd ./configure invocation. Should libnghttp2 reside in a unusual
location, add
--with-nghttp2=<path>
to ./configure. <path> is expected to be the installation prefix, so there
should be a <path>/lib/libnghttp2.*. If your system support pkg-config,
<path>/lib/pkgconfig/libnghttp2.pc will be inspected.
If you want to link nghttp2 statically into the mod_h2 module, you may
similarly to mod_ssl add
--enable-nghttp2-staticlib-deps
For this, the lib directory should only contain the libnghttp2.a, not its
shared cousins.
CONFIGURATION
The most important configuration options is
H2Engine On|Off
which can be set on the base server or a virtual host. By default, the
engine is 'Off'. Please see the documentation of mod_h2 for a complete
list and explanation of other options.
TLS CONFIGURATION
If you want to use HTTP/2 with a browser, most modern browsers will support
it without further configuration. However, browsers so far only support
HTTP/2 over TLS and are expecially picky about the certificate and
encryption ciphers used.
Server admins may look for up-to-date information about "modern" TLS
compatibility under:
https://wiki.mozilla.org/Security/Server_Side_TLS#Modern_compatibility

View File

@@ -1,209 +0,0 @@
#mod_h2 - http/2 for Apache httpd
Copyright (C) 2015 greenbytes GmbH
Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. This file is offered as-is,
without warranty of any kind. See LICENSE for details.
This repository contains a Apache httpd module implementing the HTTP2
protocol. It uses nghttp2 (https://nghttp2.org) as base engine and connects
it with the Apache infrastructure.
##Status
In development. Use at your own risk. See [Known Problems](#known-problems) below for a list
of things you might encounter.
##Tested Platforms
* OS: Ubuntu 14.04, OS X 10.10
* Apache httpd 2.4.12 (patch needed)
* Openssl 1.0.1 + 1.0.2
If someone wants to test other platforms or contribute adapations in a
github pull request, she is more than welcome.
##Features
This module supports the protocols "h2" (HTTP2 over TLS) and "h2c" (HTTP2 over plain
HTTP connections via Upgrade). You can enable it for the whole server or
for specific virtual hosts only. More on this below on "Configuration".
Specifically, the protocols "h2", "h2-16", "h2-14" and its "h2c" cousins
are announced to clients. Support for "h2-14" and "h2-16" is expected to
disappear silently as these are no standard and are currently being used
for the interop testing phase only.
##Configuration
The test setup in test/conf/* that gets installed in gen/install for the
local httpd build contains some simple examples of how this module can
be configured.
There are several configuration commands available when mod_h2 is loaded,
such as:
* H2Engine (on/off), "on" to enable HTTP/2 protocol handling, default: off
* H2MaxSessionStreams n maximum number of open streams per session, default: 100
* H2InitialWindowSize n initial window size on client DATA, default: 16k
* H2MaxHeaderListSize n maximum acceptable size of request headers, default: 64k
* H2MinWorkers n minimum number of worker threads per child, default: mpm configured MaxWorkers/2
* H2MaxWorkers n maximum number of worker threads per child, default: mpm configured thread limit/2
* H2StreamMaxMemSize n maximum number of bytes buffered in memory for a stream, default: 64k
* H2AltSvc name=host:port Announce an "alternate service" to clients (see https://http2.github.io/http2-spec/alt-svc.html for details), default: empty
* H2AltSvcMaxAge n number of seconds Alt-Svc information is valid, default: will not be sent, specification defaults to 24h
* H2SerializeHeaders (on/off), "off" serialize/parse request+response headers for streams, as if they arrived in HTTP/1 format. When off, certain parts of httpd core filters are disabled/replaced to allow for a more efficient handling.
* H2HackMpmEvent (on/off), "on" performs a hack on internal connection in order to make mpm_event working, has no effect on other mpm modules
* H2Direct (on/off), "on" to enable h2c direct mode on a non-TLS host, default: off
* H2BufferOutput (on/off), if output data shall be buffered. "on" for TLS connections, "off" otherwise
* H2BufferSize n size of output buffer (if enabled), defaults to 64k
* H2BufferWriteMax n max. number of bytes in a single write when buffering output, defaults to 16k
* H2SessionExtraFiles n number of extra file handles a session might keep open to improve performance, depends on mpm module used and ulimit of processes, defaults to 5
All these configuration parameters can be set on servers/virtual hosts and
are not available on directory level. Note that Worker configuration is
only relevant on the base apache server and will be read - but ignored -
on any virtual hosts.
##Dependencies
1. The module is written in plain C and links to libnghttp2 and the
apache runtime. Currently, only nghttp2 version 0.7.x are supported. nghttp2 v1.0.0 introduced a incompatible API change. mod_h2 will change once there is a curl release working with 1.0.0. That release of mod_h2 will then stop support for nghttp2 0.7.x. Heads up.
1. For "h2" support - the part of HTTP2 that uses TLS - a patched mod_ssl
needs to be present in the server. The patch is available in httpd/patches
and automatically applied in sandbox mode.
1. For ALPN/NPN protocol negotiation (the basic TLS HELLO part) to work,
at least OpenSSL 1.0.1 is needed (OpenSSL 1.0.2 perferred).
1. mod_h2 is tested with the `mpm_worker` module. The `mpm_event` module is supported by a hack at the moment, handle with care.
##Installation
mod_h2 is using autoconf/automake for configuration and build handling. If you
have a git checkout, refer to 'Build from git' below. If you have a release
extracted, you need to:
```
> cd mod_h2-x.x.x
> ./configure
> make
```
For general handling of 'configure', see INSTALL. For mod_h2 specifically,
there are two arguments to know:
* `--enable-sandbox` build a complete sandbox installation with own httpd, own libnghttp2
* `--enable-werror` build with tons of compiler diagnostics enabled
* `--with-apxs=<pathtoapxs>` for a non-sandboxed installation where the apxs (from the apache development environment) is in an unusual location.
If you run 'configure' without arguments, it assumes a non-sandbox'ed built
where apxs and libnghttp2 are properly installed.
###Sandbox Installation:
The sandbox installation puts everything in ./gen/install: httpd, nghttp2, curl
and other fine things. For testing the module, or just trying it out, this
has the following advantages:
* conflicts with "wrong" versions already installed on your system are avoided
* you can do the installation and test without root privileges
* certain patches can be applied that are necessary for all features to work, see "Dependencies"."
##Build from git
Building from git is easy, but please be sure that at least autoconf 2.68 is
used::
```
> autoreconf -i
> automake
> autoconf
> ./configure
> make
```
##Supported Platforms
mod_h2 has been developed under Ubuntu 14.04 LTS and OS X 10.10. The module
itself depends only on an installed APXS (the Apache runtime platform) and
libnghttp2. As long as both are present, the module itself should build
just fine.
Ubuntu :Install the prerequisite software. On a 14.04 LTS server, that should be:
```
> sudo apt-get install git gcc g++ libpcre3-dev libcunit1-dev libev-dev libjansson-dev libjemalloc-dev cython make binutils autoconf automake autotools-dev libtool pkg-config zlib1g-dev libssl-dev libxml2-dev libevent-dev python3.4-dev libevent-openssl-2.0-5 php5-cgi
```
OS X: on OS X 10.10, building the project requires a homebrew installation and the following packages installed via brew:
* pkg-config
* for httpd the Makefile will download and install:
* pcre
* apr + apr-util
* openssl
exact versions and download urls in httpd/Makefile
* for nghttp2 the Makefile will download and install:
* zlib
* libev
exact versions and download urls in httpd/Makefile
* for sandbox tests you will need php5-cgi from homebrew
##Architecture, Limits, Details
See DISCUSS.
##Sandbox Testing
The sandbox build contains some test cases. In order to run those, you
need to:
```
> make
> make install
> make test
```
The sandbox creates its own httpd and nghttp2 installation in gen/install
and configures httpd to run on ports 12345+12346 (TLS). It also generates
a self-signed certificate for the servers under the name test.example.org
and test-ser.example.org.
You should make entries in /etc/hosts like
```
127.0.0.1 test.example.org test
127.0.0.1 test-ser.example.org test
```
for tests to work properly.
Another issue is testing with browsers like Chrome or Firefox. If you point
them at test.example.org, they will complain about the self-signed certificate,
offer you to connect anyway and, if you choose that, refuse to work. I think
they have a much stricter cert checking for HTTP/2 and the UI needs an update
here.
I myself configure an additional site into the sandbox server with a real
certificate and test browsers successfully there. But I cannot share this
certificate with the world. If there is a better way to test browser interop,
I am happy to be given pointers.
#Known Issues
* If you use the "prefork" mpm, there are reported problems with using mod_h2 and mod_prody/mod_rewrite against another server which disappear when using mpm_event or mpm_worker in the otherwise unchanged configuration.
* If you test chrome/firefox against a httpd with mod_h2 and get "ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY", this means that the browser considers the installed SSL certificates as not good enough to use HTTP/2. This will happen with the sandbox installation, as that one has only a self-signed certificate. If you disable mod_h2, chrome/firefox will seem to be working fine again against your server. This is due to the fact that SSL requirements are, for backward compatibility, relaxed when talking HTTP/1. Unfortunately, chrome/firefox do currently not offer a better user experience in indicating what part of the certificate was considered inadequate. For example, certain signing algorithms in combination with expiration dates are no longer accepted. This becomes pretty hard to debug for someone not fluent in TLS and PKI.
* Some modules will not be fully compatible with HTTP/2 connections. mod_logio, for example, will not properly report the accumulated traffic per connection as requests are handled in sub-connecition and that data is never aggregated.
##TODO
* Thanks to the excellent nghttp2, the module currently supports stream priority
handling, but nghttp2 offers at the moment (v0.7.15) no way to use the prio
information for request scheduling.
* mpm_event: supported by a hack atm. Needs an official patch with an Optional
function
* http trailers are not implemented
* mod_h2 removes reqtimeout input filter for its connection.
##Licensing
Please see the file called LICENSE.
##Credits
This work has been funded by the GSM Association (http://gsma.com). The module
itself was heavily influenced by mod_spdy, the Google implementation of their
SPDY protocol. And without Tatsuhiro Tsujikawa excellent nghttp2 work, this
would not have been possible.
Münster, 20.05.2015,
Stefan Eissing, greenbytes GmbH

View File

@@ -14,44 +14,52 @@ dnl See the License for the specific language governing permissions and
dnl limitations under the License.
dnl # start of module specific part
APACHE_MODPATH_INIT(ssl)
APACHE_MODPATH_INIT(http2)
dnl # list of module object files
ssl_objs="dnl
mod_ssl.lo dnl
ssl_engine_config.lo dnl
ssl_engine_init.lo dnl
ssl_engine_io.lo dnl
ssl_engine_kernel.lo dnl
ssl_engine_log.lo dnl
ssl_engine_mutex.lo dnl
ssl_engine_pphrase.lo dnl
ssl_engine_rand.lo dnl
ssl_engine_vars.lo dnl
ssl_scache.lo dnl
ssl_util_stapling.lo dnl
ssl_util.lo dnl
ssl_util_ssl.lo dnl
ssl_engine_ocsp.lo dnl
ssl_util_ocsp.lo dnl
h2_objs="dnl
mod_h2.lo dnl
h2_alpn.lo dnl
h2_alt_svc.lo dnl
h2_config.lo dnl
h2_conn.lo dnl
h2_conn_io.lo dnl
h2_ctx.lo dnl
h2_from_h1.lo dnl
h2_h2.lo dnl
h2_io.lo dnl
h2_io_set.lo dnl
h2_mplx.lo dnl
h2_request.lo dnl
h2_response.lo dnl
h2_session.lo dnl
h2_stream.lo dnl
h2_stream_set.lo dnl
h2_task.lo dnl
h2_task_input.lo dnl
h2_task_output.lo dnl
h2_task_queue.lo dnl
h2_to_h1.lo dnl
h2_upgrade.lo dnl
h2_util.lo dnl
h2_worker.lo dnl
h2_workers.lo dnl
"
dnl # hook module into the Autoconf mechanism (--enable-ssl option)
APACHE_MODULE(ssl, [SSL/TLS support (mod_ssl)], $ssl_objs, , most, [
APACHE_CHECK_OPENSSL
if test "$ac_cv_openssl" = "yes" ; then
dnl # hook module into the Autoconf mechanism (--enable-h2 option)
APACHE_MODULE(h2, [HTTP/2 support (mod_h2)], $h2_objs, , most, [
APACHE_CHECK_NGHTTP2
if test "$ac_cv_nghttp2" = "yes" ; then
if test "x$enable_ssl" = "xshared"; then
# The only symbol which needs to be exported is the module
# structure, so ask libtool to hide everything else:
APR_ADDTO(MOD_SSL_LDADD, [-export-symbols-regex ssl_module])
APR_ADDTO(MOD_H2_LDADD, [-export-symbols-regex h2_module])
fi
else
enable_ssl=no
enable_h2=no
fi
])
# Ensure that other modules can pick up mod_ssl.h
APR_ADDTO(INCLUDES, [-I\$(top_srcdir)/$modpath_current])
dnl # end of module specific part
APACHE_MODPATH_FINISH

View File

@@ -1,204 +0,0 @@
# Copyright 2015 greenbytes GmbH (https://www.greenbytes.de)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
AC_PREREQ([2.69])
AC_INIT([mod_h2], [0.8.0], [stefan.eissing@greenbytes.de])
LT_PREREQ([2.2.6])
LT_INIT()
dnl See versioning rule:
dnl http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
AC_SUBST(LT_CURRENT, 11)
AC_SUBST(LT_REVISION, 0)
AC_SUBST(LT_AGE, 6)
major=`echo $PACKAGE_VERSION |cut -d. -f1 | sed -e "s/[^0-9]//g"`
minor=`echo $PACKAGE_VERSION |cut -d. -f2 | sed -e "s/[^0-9]//g"`
patch=`echo $PACKAGE_VERSION |cut -d. -f3 | cut -d- -f1 | sed -e "s/[^0-9]//g"`
PACKAGE_VERSION_NUM=`printf "0x%02x%02x%02x" "$major" "$minor" "$patch"`
AC_SUBST(PACKAGE_VERSION_NUM)
AC_CANONICAL_BUILD
AC_CANONICAL_HOST
AC_CANONICAL_TARGET
AC_CONFIG_MACRO_DIR([m4])
AM_INIT_AUTOMAKE([subdir-objects no-define])
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
AC_CONFIG_SRCDIR([mod_h2/h2_config.c])
AC_CONFIG_HEADERS([mod_h2/config.h])
AC_ARG_ENABLE([werror],
[AS_HELP_STRING([--enable-werror],
[Turn on compile time warnings])],
[werror=$enableval], [werror=no])
AC_ARG_ENABLE([sandbox], [AS_HELP_STRING([--enable-sandbox],
[Build a sandbox installation [default=no]])],
[case "${enableval}" in
yes) build_mode=sandbox ;;
no) build_mode=extern ;;
*) AC_MSG_ERROR([bad value ${enableval} for --enable-sandbox]) ;;
esac],
[build_mode=extern])
AC_ARG_WITH([apxs], [AS_HELP_STRING([--with-apxs],
[Use APXS executable [default=check]])],
[request_apxs=$withval], [request_apxs=check])
# Checks for programs.
AC_PROG_CC
AC_PROG_CC_STDC
if test "x$werror" != "xno"; then
AX_CHECK_COMPILE_FLAG([-Wall], [CFLAGS="$CFLAGS -Wall"])
AX_CHECK_COMPILE_FLAG([-Wextra], [CFLAGS="$CFLAGS -Wextra"])
AX_CHECK_COMPILE_FLAG([-Werror], [CFLAGS="$CFLAGS -Werror"])
AX_CHECK_COMPILE_FLAG([-Wmissing-prototypes], [CFLAGS="$CFLAGS -Wmissing-prototypes"])
AX_CHECK_COMPILE_FLAG([-Wstrict-prototypes], [CFLAGS="$CFLAGS -Wstrict-prototypes"])
AX_CHECK_COMPILE_FLAG([-Wmissing-declarations], [CFLAGS="$CFLAGS -Wmissing-declarations"])
AX_CHECK_COMPILE_FLAG([-Wpointer-arith], [CFLAGS="$CFLAGS -Wpointer-arith"])
# we like to use such things...
#AX_CHECK_COMPILE_FLAG([-Wdeclaration-after-statement], [CFLAGS="$CFLAGS -Wdeclaration-after-statement"])
AX_CHECK_COMPILE_FLAG([-Wformat-security], [CFLAGS="$CFLAGS -Wformat-security"])
AX_CHECK_COMPILE_FLAG([-Wwrite-strings], [CFLAGS="$CFLAGS -Wwrite-strings"])
AX_CHECK_COMPILE_FLAG([-Wshadow], [CFLAGS="$CFLAGS -Wshadow"])
AX_CHECK_COMPILE_FLAG([-Winline], [CFLAGS="$CFLAGS -Winline"])
AX_CHECK_COMPILE_FLAG([-Wnested-externs], [CFLAGS="$CFLAGS -Wnested-externs"])
AX_CHECK_COMPILE_FLAG([-Wfloat-equal], [CFLAGS="$CFLAGS -Wfloat-equal"])
AX_CHECK_COMPILE_FLAG([-Wundef], [CFLAGS="$CFLAGS -Wundef"])
AX_CHECK_COMPILE_FLAG([-Wendif-labels], [CFLAGS="$CFLAGS -Wendif-labels"])
AX_CHECK_COMPILE_FLAG([-Wempty-body], [CFLAGS="$CFLAGS -Wempty-body"])
# does not make sense with APR as it prefers char* to void*
# AX_CHECK_COMPILE_FLAG([-Wcast-align], [CFLAGS="$CFLAGS -Wcast-align"])
AX_CHECK_COMPILE_FLAG([-Wclobbered], [CFLAGS="$CFLAGS -Wclobbered"])
AX_CHECK_COMPILE_FLAG([-Wvla], [CFLAGS="$CFLAGS -Wvla"])
AX_CHECK_COMPILE_FLAG([-Wpragmas], [CFLAGS="$CFLAGS -Wpragmas"])
AX_CHECK_COMPILE_FLAG([-Wunreachable-code], [CFLAGS="$CFLAGS -Wunreachable-code"])
AX_CHECK_COMPILE_FLAG([-Waddress], [CFLAGS="$CFLAGS -Waddress"])
AX_CHECK_COMPILE_FLAG([-Wattributes], [CFLAGS="$CFLAGS -Wattributes"])
AX_CHECK_COMPILE_FLAG([-Wdiv-by-zero], [CFLAGS="$CFLAGS -Wdiv-by-zero"])
AX_CHECK_COMPILE_FLAG([-Wshorten-64-to-32], [CFLAGS="$CFLAGS -Wshorten-64-to-32"])
fi
AC_MSG_NOTICE("configuring for $build_mode build")
if test x"$build_mode" = "xsandbox"; then
if test x"$request_apxs" != "xcheck"; then
AC_MSG_ERROR([when sandbox mode is enabled, specifying apxs is not allowed])
fi
# easy, we know where everything will be
#
export BUILD_SUBDIRS="sandbox mod_h2"
prefix="$PWD/sandbox/install"
APXS="$prefix/bin/apxs"
LDFLAGS="$LDFLAGS -L${prefix}/lib"
LIBS="$LIBS -lnghttp2"
CPPFLAGS="$CPPFLAGS -I${prefix}/include"
export SYSCONF_DIR="$prefix/conf"
export LIBEXEC_DIR="$prefix/modules"
# On Ubuntu, we have a propblem with APR 1.5.1 and system includes that
# causes compilation to abort since no definition of PATH_MAX can be found.
# In sandbox build, we just define it therefore, as a quick workaround
CPPFLAGS="$CPPFLAGS -DPATH_MAX=4096"
else
# production, we need to find where the apxs is. which then
# can tell us the various directories we need.
#
if test x"$request_apxs" = "xcheck"; then
AC_PATH_PROG([APXS], [apxs])
if test "x${APXS}" = "x"; then
AC_MSG_ERROR("no APXS installation found")
fi
else
APXS="$request_apxs"
AC_MSG_NOTICE("using APXS=$APXS as configured")
fi
export BUILD_SUBDIRS="mod_h2 setup"
prefix="$($APXS -q prefix)"
LDFLAGS="$LDFLAGS -L$($APXS -q libdir)"
CPPFLAGS="$CPPFLAGS -I$($APXS -q includedir) -I$($APXS -q APR_INCLUDEDIR)"
export SYSCONF_DIR="$($APXS -q sysconfdir)"
export LIBEXEC_DIR="$($APXS -q LIBEXECDIR)"
# We need nghttp2 to be in our link path, check for it.
#
AC_CHECK_LIB([nghttp2], [nghttp2_session_server_new2], ,
[AC_MSG_ERROR("library nghttp2 not found")])
fi
# Checks for header files.
AC_CHECK_HEADERS([ \
assert.h \
stddef.h \
])
# Checks for typedefs, structures, and compiler characteristics.
AC_TYPE_INT32_T
AC_TYPE_SIZE_T
AC_TYPE_SSIZE_T
AC_TYPE_UINT32_T
AC_TYPE_UINT8_T
# Checks for library functions.
AC_CHECK_FUNCS([memmove memset strcasecmp strchr])
AC_CHECK_PROG([A2ENMOD],[a2enmod])
# substitution in generated files
AC_SUBST(BUILD_SUBDIRS)
AC_SUBST(SYSCONF_DIR)
AC_SUBST(LIBEXEC_DIR)
AC_CONFIG_FILES([
Makefile
mod_h2/Makefile
mod_h2/h2_version.h
sandbox/Makefile
setup/Makefile
])
AC_OUTPUT
AC_MSG_NOTICE([summary of build options:
Version: ${VERSION} shared $LT_CURRENT:$LT_REVISION:$LT_AGE
Host type: ${host}
Build Type: ${build_mode}
Install prefix: ${prefix}
APXS: ${APXS}
C compiler: ${CC}
CFLAGS: ${CFLAGS}
WARNCFLAGS: ${WARNCFLAGS}
LDFLAGS: ${LDFLAGS}
LIBS: ${LIBS}
CPPFLAGS: ${CPPFLAGS}
C preprocessor: ${CPP}
BUILD_SUBDIRS ${BUILD_SUBDIRS}
a2enmod ${A2ENMOD:--}
])

View File

@@ -21,7 +21,6 @@
#undef PACKAGE_STRING
#undef PACKAGE_NAME
#undef PACKAGE_BUGREPORT
#include "config.h"
typedef enum {
H2_CONF_ENABLED,

View File

@@ -293,8 +293,9 @@ apr_status_t h2_session_process(h2_session *session)
break;
}
if (!have_read && !have_written) {
/* Nothing to read or write, we may have sessions, but
if (!have_read && !have_written
&& !h2_stream_set_is_empty(session->streams)) {
/* Nothing to read or write, we have streams, but
* the have no data yet ready to be delivered. Slowly
* back off to give others a chance to do their work.
*/
@@ -349,6 +350,13 @@ conn_rec *h2_conn_create(conn_rec *master, apr_pool_t *pool)
"h2_task: creating conn");
return NULL;
}
/* TODO: we simulate that we had already a request on this connection.
* This keeps the mod_ssl SNI vs. Host name matcher from answering
* 400 Bad Request
* when names do not match. We prefer a predictable 421 status.
*/
c->keepalives = 1;
return c;
}
@@ -371,7 +379,7 @@ apr_status_t h2_conn_prep(h2_task_env *env, conn_rec *master, h2_worker *worker)
env->c.conn_config = ap_create_conn_config(env->pool);
env->c.notes = apr_table_make(env->pool, 5);
ap_set_module_config(env->c.conn_config, &core_module,
h2_worker_get_socket(worker));

View File

@@ -341,6 +341,55 @@ static apr_status_t validate_status_line(request_rec *r)
return APR_EGENERAL;
}
/*
* Determine the protocol to use for the response. Potentially downgrade
* to HTTP/1.0 in some situations and/or turn off keepalives.
*
* also prepare r->status_line.
*/
static void basic_http_header_check(request_rec *r,
const char **protocol)
{
apr_status_t rv;
if (r->assbackwards) {
/* no such thing as a response protocol */
return;
}
rv = validate_status_line(r);
if (!r->status_line) {
r->status_line = ap_get_status_line(r->status);
} else if (rv != APR_SUCCESS) {
/* Status line is OK but our own reason phrase
* would be preferred if defined
*/
const char *tmp = ap_get_status_line(r->status);
if (!strncmp(tmp, r->status_line, 3)) {
r->status_line = tmp;
}
}
/* Note that we must downgrade before checking for force responses. */
if (r->proto_num > HTTP_VERSION(1,0)
&& apr_table_get(r->subprocess_env, "downgrade-1.0")) {
r->proto_num = HTTP_VERSION(1,0);
}
/* kludge around broken browsers when indicated by force-response-1.0
*/
if (r->proto_num == HTTP_VERSION(1,0)
&& apr_table_get(r->subprocess_env, "force-response-1.0")) {
*protocol = "HTTP/1.0";
r->connection->keepalive = AP_CONN_CLOSE;
}
else {
*protocol = AP_SERVER_PROTOCOL;
}
}
static void set_basic_http_header(request_rec *r, apr_table_t *headers)
{
char *date = NULL;
@@ -428,19 +477,7 @@ static h2_response *create_response(h2_from_h1 *from_h1, request_rec *r)
}
/* determine the protocol and whether we should use keepalives. */
status = validate_status_line(r);
if (!r->status_line) {
r->status_line = ap_get_status_line(r->status);
}
else if (status != APR_SUCCESS) {
/* Status line is OK but our own reason phrase
* would be preferred if defined
*/
const char *tmp = ap_get_status_line(r->status);
if (!strncmp(tmp, r->status_line, 3)) {
r->status_line = tmp;
}
}
ap_set_keepalive(r);
if (r->chunked) {
apr_table_unset(r->headers_out, "Content-Length");

View File

@@ -37,13 +37,13 @@
#include "h2_h2.h"
const char *h2_alpn_protos[] = {
"h2", "h2-16", "h2-14"
"h2",
};
apr_size_t h2_alpn_protos_len = (sizeof(h2_alpn_protos)
/ sizeof(h2_alpn_protos[0]));
const char *h2_upgrade_protos[] = {
"h2c", "h2c-16", "h2c-14",
"h2c",
};
apr_size_t h2_upgrade_protos_len = (sizeof(h2_upgrade_protos)
/ sizeof(h2_upgrade_protos[0]));

View File

@@ -33,6 +33,7 @@
#include "h2_io_set.h"
#include "h2_response.h"
#include "h2_mplx.h"
#include "h2_request.h"
#include "h2_stream.h"
#include "h2_stream_set.h"
#include "h2_task.h"
@@ -693,9 +694,11 @@ apr_status_t h2_mplx_out_trywait(h2_mplx *m, apr_interval_time_t timeout,
if (APR_SUCCESS == status) {
m->added_output = iowait;
status = apr_thread_cond_timedwait(m->added_output, m->lock, timeout);
ap_log_cerror(APLOG_MARK, APLOG_TRACE2, 0, m->c,
"h2_mplx(%ld): trywait on data for %f ms)",
m->id, timeout/1000.0);
if (APLOGctrace2(m->c)) {
ap_log_cerror(APLOG_MARK, APLOG_TRACE2, 0, m->c,
"h2_mplx(%ld): trywait on data for %f ms)",
m->id, timeout/1000.0);
}
m->added_output = NULL;
apr_thread_mutex_unlock(m->lock);
}
@@ -749,3 +752,27 @@ h2_task *h2_mplx_pop_task(h2_mplx *m, int *has_more)
return task;
}
apr_status_t h2_mplx_create_task(h2_mplx *m, struct h2_stream *stream)
{
AP_DEBUG_ASSERT(m);
if (m->aborted) {
return APR_ECONNABORTED;
}
apr_status_t status = apr_thread_mutex_lock(m->lock);
if (APR_SUCCESS == status) {
conn_rec *c = h2_conn_create(m->c, stream->pool);
if (c == NULL) {
ap_log_cerror(APLOG_MARK, APLOG_ERR, APR_ENOMEM, m->c,
"h2_mplx(%ld-%d): start stream",
m->id, stream->id);
return APR_ENOMEM;
}
stream->task = h2_task_create(m->id, stream->id,
stream->pool, m, c);
apr_thread_mutex_unlock(m->lock);
}
return status;
}

View File

@@ -149,6 +149,8 @@ apr_status_t h2_mplx_do_task(h2_mplx *mplx, struct h2_task *task);
struct h2_task *h2_mplx_pop_task(h2_mplx *mplx, int *has_more);
apr_status_t h2_mplx_create_task(h2_mplx *mplx, struct h2_stream *stream);
/*******************************************************************************
* Input handling of streams.
******************************************************************************/

View File

@@ -16,7 +16,7 @@
#ifndef __mod_h2__h2_response__
#define __mod_h2__h2_response__
/* h2_response is just the data belonging to the head of a HTTP response,
/* h2_response is just the data belonging the the head of a HTTP response,
* suitable prepared to be fed to nghttp2 for response submit.
*/
typedef struct h2_headers {

View File

@@ -147,34 +147,29 @@ apr_status_t h2_stream_rwrite(h2_stream *stream, request_rec *r)
apr_status_t h2_stream_write_eoh(h2_stream *stream, int eos)
{
apr_status_t status;
AP_DEBUG_ASSERT(stream);
/* Seeing the end-of-headers, we have everything we need to
* start processing it.
*/
conn_rec *c = h2_conn_create(stream->m->c, stream->pool);
if (c == NULL) {
ap_log_cerror(APLOG_MARK, APLOG_ERR, APR_ENOMEM, stream->m->c,
"h2_stream(%ld-%d): create connection",
stream->m->id, stream->id);
return APR_ENOMEM;
}
stream->task = h2_task_create(stream->m->id, stream->id,
stream->pool, stream->m, c);
apr_status_t status = h2_request_end_headers(stream->request,
stream->m, stream->task, eos);
status = h2_mplx_create_task(stream->m, stream);
if (status == APR_SUCCESS) {
status = h2_mplx_do_task(stream->m, stream->task);
status = h2_request_end_headers(stream->request,
stream->m, stream->task, eos);
if (status == APR_SUCCESS) {
status = h2_mplx_do_task(stream->m, stream->task);
}
if (eos) {
status = h2_stream_write_eos(stream);
}
ap_log_cerror(APLOG_MARK, APLOG_DEBUG, status, stream->m->c,
"h2_mplx(%ld-%d): start stream, task %s %s (%s)",
stream->m->id, stream->id,
stream->request->method, stream->request->path,
stream->request->authority);
}
if (eos) {
status = h2_stream_write_eos(stream);
}
ap_log_cerror(APLOG_MARK, APLOG_DEBUG, status, stream->m->c,
"h2_stream(%ld-%d): end header, task %s %s (%s)",
stream->m->id, stream->id,
stream->request->method, stream->request->path,
stream->request->authority);
return status;
}

View File

@@ -390,11 +390,12 @@ static request_rec *h2_task_create_request(h2_task_env *env)
r->protocol = (char*)"HTTP/1.1";
r->proto_num = HTTP_VERSION(1, 1);
r->hostname = env->authority;
/* update what we think the virtual host is based on the headers we've
* now read. may update status.
* Leave r->hostname empty, vhost will parse if form our Host: header,
* otherwise we get complains about port numbers.
*/
r->hostname = NULL;
ap_update_vhost_from_headers(r);
/* we may have switched to another server */

View File

@@ -20,7 +20,7 @@
* @macro
* Version number of the h2 module as c string
*/
#define MOD_H2_VERSION "@PACKAGE_VERSION@"
#define MOD_H2_VERSION "0.8.1"
/**
* @macro
@@ -28,7 +28,7 @@
* release. This is a 24 bit number with 8 bits for major number, 8 bits
* for minor and 8 bits for patch. Version 1.2.3 becomes 0x010203.
*/
#define MOD_H2_VERSION_NUM @PACKAGE_VERSION_NUM@
#define MOD_H2_VERSION_NUM 0x000801
#endif /* mod_h2_h2_version_h */

View File

@@ -1,74 +0,0 @@
# ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT])
#
# DESCRIPTION
#
# Check whether the given FLAG works with the current language's compiler
# or gives an error. (Warnings, however, are ignored)
#
# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
# success/failure.
#
# If EXTRA-FLAGS is defined, it is added to the current language's default
# flags (e.g. CFLAGS) when the check is done. The check is thus made with
# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to
# force the compiler to issue an error when a bad flag is given.
#
# INPUT gives an alternative input source to AC_COMPILE_IFELSE.
#
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG.
#
# LICENSE
#
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# As a special exception, the respective Autoconf Macro's copyright owner
# gives unlimited permission to copy, distribute and modify the configure
# scripts that are the output of Autoconf when processing the Macro. You
# need not follow the terms of the GNU General Public License when using
# or distributing such scripts, even though portions of the text of the
# Macro appear in them. The GNU General Public License (GPL) does govern
# all other use of the material that constitutes the Autoconf Macro.
#
# This special exception to the GPL applies to versions of the Autoconf
# Macro released by the Autoconf Archive. When you make and distribute a
# modified version of the Autoconf Macro, you may extend this special
# exception to the GPL to apply to your modified version as well.
#serial 3
AC_DEFUN([AX_CHECK_COMPILE_FLAG],
[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl
AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [
ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS
_AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1"
AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],
[AS_VAR_SET(CACHEVAR,[yes])],
[AS_VAR_SET(CACHEVAR,[no])])
_AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags])
AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes],
[m4_default([$2], :)],
[m4_default([$3], :)])
AS_VAR_POPDEF([CACHEVAR])dnl
])dnl AX_CHECK_COMPILE_FLAGS

View File

@@ -1 +0,0 @@
# just so it is not empty

View File

@@ -1,982 +0,0 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXFileReference section */
B20946CA1B25D4430041992F /* test_alt_host.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = test_alt_host.sh; sourceTree = "<group>"; };
B20946CC1B2865BB0041992F /* h2_alpn.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = h2_alpn.c; sourceTree = "<group>"; };
B20946CD1B2865BB0041992F /* h2_alpn.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = h2_alpn.h; sourceTree = "<group>"; };
B20946CE1B29D8C30041992F /* sni_misdirect.patch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = sni_misdirect.patch; sourceTree = "<group>"; };
B20E441F1ACC07E8003D21AE /* test_curl_get.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = test_curl_get.sh; sourceTree = "<group>"; };
B20E44201ACC088E003D21AE /* test_curl_post.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = test_curl_post.sh; sourceTree = "<group>"; };
B21BFCF91B023B840031EBCD /* h2_task_queue.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = h2_task_queue.c; sourceTree = "<group>"; };
B21BFCFA1B023B840031EBCD /* h2_task_queue.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = h2_task_queue.h; sourceTree = "<group>"; };
B225490C1A6EAC37004BDEC9 /* mod_h2.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = mod_h2.c; sourceTree = "<group>"; };
B225490D1A6EAE9F004BDEC9 /* h2_config.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = h2_config.c; sourceTree = "<group>"; };
B225490E1A6EAE9F004BDEC9 /* h2_config.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = h2_config.h; sourceTree = "<group>"; };
B225491E1A6FB8DF004BDEC9 /* h2_h2.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = h2_h2.c; sourceTree = "<group>"; };
B225491F1A6FB8DF004BDEC9 /* h2_h2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = h2_h2.h; sourceTree = "<group>"; };
B22549331A6FBEF1004BDEC9 /* h2_ctx.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = h2_ctx.c; sourceTree = "<group>"; };
B22549341A6FBEF1004BDEC9 /* h2_ctx.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = h2_ctx.h; sourceTree = "<group>"; };
B22549361A6FCCAA004BDEC9 /* mod_h2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mod_h2.h; sourceTree = "<group>"; };
B22549371A6FCE13004BDEC9 /* h2_private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = h2_private.h; sourceTree = "<group>"; };
B22549381A710329004BDEC9 /* h2_session.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = h2_session.c; sourceTree = "<group>"; };
B22549391A710329004BDEC9 /* h2_session.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = h2_session.h; sourceTree = "<group>"; };
B225493A1A711985004BDEC9 /* h2_conn_io.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = h2_conn_io.c; sourceTree = "<group>"; };
B225493B1A711985004BDEC9 /* h2_conn_io.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = h2_conn_io.h; sourceTree = "<group>"; };
B225493C1A713D18004BDEC9 /* h2_util.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = h2_util.c; sourceTree = "<group>"; };
B225493D1A713D18004BDEC9 /* h2_util.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = h2_util.h; sourceTree = "<group>"; };
B227966E1AEE93B000376B40 /* httpd-npn.unified.diff.patch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "httpd-npn.unified.diff.patch"; sourceTree = "<group>"; };
B22D25281AA89A0B0041D8E5 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; };
B24CB1221AC94D6A0057413B /* h2_alt_svc.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = h2_alt_svc.c; sourceTree = "<group>"; };
B24CB1231AC94D6A0057413B /* h2_alt_svc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = h2_alt_svc.h; sourceTree = "<group>"; };
B24CB1241AC96BFE0057413B /* test_curl_altsvc.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = test_curl_altsvc.sh; sourceTree = "<group>"; };
B2546D881A7F71F80033A875 /* h2_task.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = h2_task.c; sourceTree = "<group>"; };
B2546D891A7F71F80033A875 /* h2_task.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = h2_task.h; sourceTree = "<group>"; };
B2546D8E1A7FA7D70033A875 /* h2_task_output.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = h2_task_output.c; sourceTree = "<group>"; };
B2546D8F1A7FA7D70033A875 /* h2_task_output.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = h2_task_output.h; sourceTree = "<group>"; };
B2546D971A7FC2A60033A875 /* h2_from_h1.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = h2_from_h1.c; sourceTree = "<group>"; };
B2546D981A7FC2A60033A875 /* h2_from_h1.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = h2_from_h1.h; sourceTree = "<group>"; };
B2546D991A81079D0033A875 /* h2_stream_set.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = h2_stream_set.c; sourceTree = "<group>"; };
B2546D9A1A81079D0033A875 /* h2_stream_set.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = h2_stream_set.h; sourceTree = "<group>"; };
B256C4BA1ADD5FF10042C760 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
B271425E1AB9DD59004EF82E /* h2_io_set.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = h2_io_set.c; sourceTree = "<group>"; };
B271425F1AB9DD59004EF82E /* h2_io_set.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = h2_io_set.h; sourceTree = "<group>"; };
B27142601AB9DD76004EF82E /* h2_io.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = h2_io.c; sourceTree = "<group>"; };
B27142611AB9DD76004EF82E /* h2_io.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = h2_io.h; sourceTree = "<group>"; };
B272F2311B1E13D8007A20A5 /* httpd-2.4.x-alpn-v4.patch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "httpd-2.4.x-alpn-v4.patch"; sourceTree = "<group>"; };
B27BBD2D1A6575C200C58A41 /* README */ = {isa = PBXFileReference; lastKnownFileType = text; path = README; sourceTree = "<group>"; };
B27D32E81A9487B4003DBAF4 /* h2_mplx.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = h2_mplx.c; sourceTree = "<group>"; };
B27D32E91A9487B4003DBAF4 /* h2_mplx.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = h2_mplx.h; sourceTree = "<group>"; };
B284ACC91A7B9DF900C35863 /* h2_task_input.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = h2_task_input.c; sourceTree = "<group>"; };
B284ACCA1A7B9DF900C35863 /* h2_task_input.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = h2_task_input.h; sourceTree = "<group>"; };
B2A6EF171A9B598B005DFC5B /* h2_request.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = h2_request.c; sourceTree = "<group>"; };
B2A6EF181A9B598B005DFC5B /* h2_request.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = h2_request.h; sourceTree = "<group>"; };
B2A6EF281A9C79A6005DFC5B /* h2_upgrade.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = h2_upgrade.c; sourceTree = "<group>"; };
B2A6EF291A9C79A6005DFC5B /* h2_upgrade.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = h2_upgrade.h; sourceTree = "<group>"; };
B2A6EF2A1A9E3A93005DFC5B /* INSTALL */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = INSTALL; sourceTree = "<group>"; };
B2A6EF2C1A9F2452005DFC5B /* DISCUSS */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = DISCUSS; sourceTree = "<group>"; };
B2AABE611AC5A9B400A90B72 /* h2_version.h.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = h2_version.h.in; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.c; };
B2B170B31B2EC73400EDC007 /* test.example.org.conf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = test.example.org.conf; sourceTree = "<group>"; };
B2B170B41B2F02C100EDC007 /* testrun */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = testrun; sourceTree = "<group>"; };
B2B170B61B303B0C00EDC007 /* noh2.example.org.x509.input */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = noh2.example.org.x509.input; sourceTree = "<group>"; };
B2B170B81B316FB100EDC007 /* aaa-noh2.example.org.conf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "aaa-noh2.example.org.conf"; sourceTree = "<group>"; };
B2B170B91B31BF7000EDC007 /* httpd-2.4.12-alpn-v5.patch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "httpd-2.4.12-alpn-v5.patch"; sourceTree = "<group>"; };
B2C16D251A779C55000B2297 /* h2_stream.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = h2_stream.c; sourceTree = "<group>"; };
B2C16D261A779C55000B2297 /* h2_stream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = h2_stream.h; sourceTree = "<group>"; };
B2C631081B383EA800127D1E /* test-ser.example.org.conf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "test-ser.example.org.conf"; sourceTree = "<group>"; };
B2C6310C1B393CA100127D1E /* httpd-alpn-v4-v5.patch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "httpd-alpn-v4-v5.patch"; sourceTree = "<group>"; };
B2C63B0E1B39421B00127D1E /* openssl-1.0.2-alpn.patch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "openssl-1.0.2-alpn.patch"; sourceTree = "<group>"; };
B2C63B101B3BF78C00127D1E /* mpm_worker.load */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = mpm_worker.load; sourceTree = "<group>"; };
B2C63B121B3BF7CC00127D1E /* mpm_event.load */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = mpm_event.load; sourceTree = "<group>"; };
B2C63B131B3BF7CC00127D1E /* mpm_prefork.load */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = mpm_prefork.load; sourceTree = "<group>"; };
B2CB610E1A88BB9F00D270A6 /* h2_conn.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = h2_conn.c; sourceTree = "<group>"; };
B2CB610F1A88BB9F00D270A6 /* h2_conn.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = h2_conn.h; sourceTree = "<group>"; };
B2CB61101A8A0FB400D270A6 /* h2_response.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = h2_response.c; sourceTree = "<group>"; };
B2CB61111A8A0FB400D270A6 /* h2_response.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = h2_response.h; sourceTree = "<group>"; };
B2CB61141A8B698A00D270A6 /* h2_worker.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = h2_worker.c; sourceTree = "<group>"; };
B2CB61151A8B698A00D270A6 /* h2_worker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = h2_worker.h; sourceTree = "<group>"; };
B2CB61161A8B699E00D270A6 /* h2_workers.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = h2_workers.c; sourceTree = "<group>"; };
B2CB61171A8B699E00D270A6 /* h2_workers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = h2_workers.h; sourceTree = "<group>"; };
B2E5D5081AADAD28001FD280 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
B2E5D7841AAEEF8C001FD280 /* configure.ac */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = configure.ac; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.sh; };
B2E5D7851AAF1D87001FD280 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
B2E5D7861AAF1F4D001FD280 /* AUTHORS */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = AUTHORS; sourceTree = "<group>"; };
B2E5D7871AAF1F4D001FD280 /* ChangeLog */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ChangeLog; sourceTree = "<group>"; };
B2E5D7881AAF1F4D001FD280 /* COPYING */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = COPYING; sourceTree = "<group>"; };
B2E5D7891AAF1F4D001FD280 /* NEWS */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = NEWS; sourceTree = "<group>"; };
B2E6DF771AC2E55800D557D8 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
B2E6DF781AC2E6A700D557D8 /* install-config.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "install-config.sh"; sourceTree = "<group>"; };
B2E6DF7B1AC2EF6E00D557D8 /* .gitignore */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = .gitignore; sourceTree = "<group>"; };
B2E6DF7C1AC2EF6E00D557D8 /* get-openssl-latest.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = "get-openssl-latest.sh"; sourceTree = "<group>"; };
B2E6DF7D1AC2EF6E00D557D8 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
B2E6DF9E1AC2EF6E00D557D8 /* pcre-8.36.tar.gz */ = {isa = PBXFileReference; lastKnownFileType = archive.gzip; path = "pcre-8.36.tar.gz"; sourceTree = "<group>"; };
B2E6DFA31AC2EF6E00D557D8 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
B2E6FDF81AC2EFA200D557D8 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
B2E6FDFA1AC2EFA200D557D8 /* httpd.conf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = httpd.conf; sourceTree = "<group>"; };
B2E6FDFB1AC2EFA200D557D8 /* modules.conf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = modules.conf; sourceTree = "<group>"; };
B2E6FDFD1AC2EFA200D557D8 /* mod-h2.greenbytes.de.conf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "mod-h2.greenbytes.de.conf"; sourceTree = "<group>"; };
B2E6FE001AC2EFA200D557D8 /* .gitignore */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = .gitignore; sourceTree = "<group>"; };
B2E6FE011AC2EFA200D557D8 /* ca.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ca.pem; sourceTree = "<group>"; };
B2E6FE021AC2EFA200D557D8 /* extensions.conf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = extensions.conf; sourceTree = "<group>"; };
B2E6FE031AC2EFA200D557D8 /* mod-h2.greenbytes.de.key */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "mod-h2.greenbytes.de.key"; sourceTree = "<group>"; };
B2E6FE041AC2EFA200D557D8 /* mod-h2.greenbytes.de.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "mod-h2.greenbytes.de.pem"; sourceTree = "<group>"; };
B2E6FE051AC2EFA200D557D8 /* test.example.org.x509.input */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = test.example.org.x509.input; sourceTree = "<group>"; };
B2E6FE091AC2EFA200D557D8 /* 001.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = 001.html; sourceTree = "<group>"; };
B2E6FE0A1AC2EFA200D557D8 /* 002.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 002.jpg; sourceTree = "<group>"; };
B2E6FE0C1AC2EFA200D557D8 /* 003_img.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = 003_img.jpg; sourceTree = "<group>"; };
B2E6FE0D1AC2EFA200D557D8 /* 003.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = 003.html; sourceTree = "<group>"; };
B2E6FE0F1AC2EFA200D557D8 /* gophertiles.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles.jpg; sourceTree = "<group>"; };
B2E6FE101AC2EFA200D557D8 /* gophertiles_002.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_002.jpg; sourceTree = "<group>"; };
B2E6FE111AC2EFA200D557D8 /* gophertiles_003.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_003.jpg; sourceTree = "<group>"; };
B2E6FE121AC2EFA200D557D8 /* gophertiles_004.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_004.jpg; sourceTree = "<group>"; };
B2E6FE131AC2EFA200D557D8 /* gophertiles_005.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_005.jpg; sourceTree = "<group>"; };
B2E6FE141AC2EFA200D557D8 /* gophertiles_006.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_006.jpg; sourceTree = "<group>"; };
B2E6FE151AC2EFA200D557D8 /* gophertiles_007.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_007.jpg; sourceTree = "<group>"; };
B2E6FE161AC2EFA200D557D8 /* gophertiles_008.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_008.jpg; sourceTree = "<group>"; };
B2E6FE171AC2EFA200D557D8 /* gophertiles_009.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_009.jpg; sourceTree = "<group>"; };
B2E6FE181AC2EFA200D557D8 /* gophertiles_010.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_010.jpg; sourceTree = "<group>"; };
B2E6FE191AC2EFA200D557D8 /* gophertiles_011.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_011.jpg; sourceTree = "<group>"; };
B2E6FE1A1AC2EFA200D557D8 /* gophertiles_012.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_012.jpg; sourceTree = "<group>"; };
B2E6FE1B1AC2EFA200D557D8 /* gophertiles_013.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_013.jpg; sourceTree = "<group>"; };
B2E6FE1C1AC2EFA200D557D8 /* gophertiles_014.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_014.jpg; sourceTree = "<group>"; };
B2E6FE1D1AC2EFA200D557D8 /* gophertiles_015.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_015.jpg; sourceTree = "<group>"; };
B2E6FE1E1AC2EFA200D557D8 /* gophertiles_016.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_016.jpg; sourceTree = "<group>"; };
B2E6FE1F1AC2EFA200D557D8 /* gophertiles_017.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_017.jpg; sourceTree = "<group>"; };
B2E6FE201AC2EFA200D557D8 /* gophertiles_018.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_018.jpg; sourceTree = "<group>"; };
B2E6FE211AC2EFA200D557D8 /* gophertiles_019.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_019.jpg; sourceTree = "<group>"; };
B2E6FE221AC2EFA200D557D8 /* gophertiles_020.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_020.jpg; sourceTree = "<group>"; };
B2E6FE231AC2EFA200D557D8 /* gophertiles_021.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_021.jpg; sourceTree = "<group>"; };
B2E6FE241AC2EFA200D557D8 /* gophertiles_022.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_022.jpg; sourceTree = "<group>"; };
B2E6FE251AC2EFA200D557D8 /* gophertiles_023.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_023.jpg; sourceTree = "<group>"; };
B2E6FE261AC2EFA200D557D8 /* gophertiles_024.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_024.jpg; sourceTree = "<group>"; };
B2E6FE271AC2EFA200D557D8 /* gophertiles_025.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_025.jpg; sourceTree = "<group>"; };
B2E6FE281AC2EFA200D557D8 /* gophertiles_026.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_026.jpg; sourceTree = "<group>"; };
B2E6FE291AC2EFA200D557D8 /* gophertiles_027.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_027.jpg; sourceTree = "<group>"; };
B2E6FE2A1AC2EFA200D557D8 /* gophertiles_028.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_028.jpg; sourceTree = "<group>"; };
B2E6FE2B1AC2EFA200D557D8 /* gophertiles_029.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_029.jpg; sourceTree = "<group>"; };
B2E6FE2C1AC2EFA200D557D8 /* gophertiles_030.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_030.jpg; sourceTree = "<group>"; };
B2E6FE2D1AC2EFA200D557D8 /* gophertiles_031.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_031.jpg; sourceTree = "<group>"; };
B2E6FE2E1AC2EFA200D557D8 /* gophertiles_032.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_032.jpg; sourceTree = "<group>"; };
B2E6FE2F1AC2EFA200D557D8 /* gophertiles_033.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_033.jpg; sourceTree = "<group>"; };
B2E6FE301AC2EFA200D557D8 /* gophertiles_034.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_034.jpg; sourceTree = "<group>"; };
B2E6FE311AC2EFA200D557D8 /* gophertiles_035.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_035.jpg; sourceTree = "<group>"; };
B2E6FE321AC2EFA200D557D8 /* gophertiles_036.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_036.jpg; sourceTree = "<group>"; };
B2E6FE331AC2EFA200D557D8 /* gophertiles_037.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_037.jpg; sourceTree = "<group>"; };
B2E6FE341AC2EFA200D557D8 /* gophertiles_038.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_038.jpg; sourceTree = "<group>"; };
B2E6FE351AC2EFA200D557D8 /* gophertiles_039.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_039.jpg; sourceTree = "<group>"; };
B2E6FE361AC2EFA200D557D8 /* gophertiles_040.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_040.jpg; sourceTree = "<group>"; };
B2E6FE371AC2EFA200D557D8 /* gophertiles_041.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_041.jpg; sourceTree = "<group>"; };
B2E6FE381AC2EFA200D557D8 /* gophertiles_042.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_042.jpg; sourceTree = "<group>"; };
B2E6FE391AC2EFA200D557D8 /* gophertiles_043.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_043.jpg; sourceTree = "<group>"; };
B2E6FE3A1AC2EFA200D557D8 /* gophertiles_044.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_044.jpg; sourceTree = "<group>"; };
B2E6FE3B1AC2EFA200D557D8 /* gophertiles_045.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_045.jpg; sourceTree = "<group>"; };
B2E6FE3C1AC2EFA200D557D8 /* gophertiles_046.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_046.jpg; sourceTree = "<group>"; };
B2E6FE3D1AC2EFA200D557D8 /* gophertiles_047.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_047.jpg; sourceTree = "<group>"; };
B2E6FE3E1AC2EFA200D557D8 /* gophertiles_048.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_048.jpg; sourceTree = "<group>"; };
B2E6FE3F1AC2EFA200D557D8 /* gophertiles_049.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_049.jpg; sourceTree = "<group>"; };
B2E6FE401AC2EFA200D557D8 /* gophertiles_050.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_050.jpg; sourceTree = "<group>"; };
B2E6FE411AC2EFA200D557D8 /* gophertiles_051.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_051.jpg; sourceTree = "<group>"; };
B2E6FE421AC2EFA200D557D8 /* gophertiles_052.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_052.jpg; sourceTree = "<group>"; };
B2E6FE431AC2EFA200D557D8 /* gophertiles_053.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_053.jpg; sourceTree = "<group>"; };
B2E6FE441AC2EFA200D557D8 /* gophertiles_054.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_054.jpg; sourceTree = "<group>"; };
B2E6FE451AC2EFA200D557D8 /* gophertiles_055.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_055.jpg; sourceTree = "<group>"; };
B2E6FE461AC2EFA200D557D8 /* gophertiles_056.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_056.jpg; sourceTree = "<group>"; };
B2E6FE471AC2EFA200D557D8 /* gophertiles_057.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_057.jpg; sourceTree = "<group>"; };
B2E6FE481AC2EFA200D557D8 /* gophertiles_058.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_058.jpg; sourceTree = "<group>"; };
B2E6FE491AC2EFA200D557D8 /* gophertiles_059.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_059.jpg; sourceTree = "<group>"; };
B2E6FE4A1AC2EFA200D557D8 /* gophertiles_060.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_060.jpg; sourceTree = "<group>"; };
B2E6FE4B1AC2EFA200D557D8 /* gophertiles_061.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_061.jpg; sourceTree = "<group>"; };
B2E6FE4C1AC2EFA200D557D8 /* gophertiles_062.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_062.jpg; sourceTree = "<group>"; };
B2E6FE4D1AC2EFA200D557D8 /* gophertiles_063.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_063.jpg; sourceTree = "<group>"; };
B2E6FE4E1AC2EFA200D557D8 /* gophertiles_064.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_064.jpg; sourceTree = "<group>"; };
B2E6FE4F1AC2EFA200D557D8 /* gophertiles_065.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_065.jpg; sourceTree = "<group>"; };
B2E6FE501AC2EFA200D557D8 /* gophertiles_066.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_066.jpg; sourceTree = "<group>"; };
B2E6FE511AC2EFA200D557D8 /* gophertiles_067.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_067.jpg; sourceTree = "<group>"; };
B2E6FE521AC2EFA200D557D8 /* gophertiles_068.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_068.jpg; sourceTree = "<group>"; };
B2E6FE531AC2EFA200D557D8 /* gophertiles_069.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_069.jpg; sourceTree = "<group>"; };
B2E6FE541AC2EFA200D557D8 /* gophertiles_070.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_070.jpg; sourceTree = "<group>"; };
B2E6FE551AC2EFA200D557D8 /* gophertiles_071.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_071.jpg; sourceTree = "<group>"; };
B2E6FE561AC2EFA200D557D8 /* gophertiles_072.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_072.jpg; sourceTree = "<group>"; };
B2E6FE571AC2EFA200D557D8 /* gophertiles_073.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_073.jpg; sourceTree = "<group>"; };
B2E6FE581AC2EFA200D557D8 /* gophertiles_074.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_074.jpg; sourceTree = "<group>"; };
B2E6FE591AC2EFA200D557D8 /* gophertiles_075.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_075.jpg; sourceTree = "<group>"; };
B2E6FE5A1AC2EFA200D557D8 /* gophertiles_076.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_076.jpg; sourceTree = "<group>"; };
B2E6FE5B1AC2EFA200D557D8 /* gophertiles_077.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_077.jpg; sourceTree = "<group>"; };
B2E6FE5C1AC2EFA200D557D8 /* gophertiles_078.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_078.jpg; sourceTree = "<group>"; };
B2E6FE5D1AC2EFA200D557D8 /* gophertiles_079.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_079.jpg; sourceTree = "<group>"; };
B2E6FE5E1AC2EFA200D557D8 /* gophertiles_080.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_080.jpg; sourceTree = "<group>"; };
B2E6FE5F1AC2EFA200D557D8 /* gophertiles_081.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_081.jpg; sourceTree = "<group>"; };
B2E6FE601AC2EFA200D557D8 /* gophertiles_082.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_082.jpg; sourceTree = "<group>"; };
B2E6FE611AC2EFA200D557D8 /* gophertiles_083.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_083.jpg; sourceTree = "<group>"; };
B2E6FE621AC2EFA200D557D8 /* gophertiles_084.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_084.jpg; sourceTree = "<group>"; };
B2E6FE631AC2EFA200D557D8 /* gophertiles_085.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_085.jpg; sourceTree = "<group>"; };
B2E6FE641AC2EFA200D557D8 /* gophertiles_086.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_086.jpg; sourceTree = "<group>"; };
B2E6FE651AC2EFA200D557D8 /* gophertiles_087.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_087.jpg; sourceTree = "<group>"; };
B2E6FE661AC2EFA200D557D8 /* gophertiles_088.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_088.jpg; sourceTree = "<group>"; };
B2E6FE671AC2EFA200D557D8 /* gophertiles_089.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_089.jpg; sourceTree = "<group>"; };
B2E6FE681AC2EFA200D557D8 /* gophertiles_090.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_090.jpg; sourceTree = "<group>"; };
B2E6FE691AC2EFA200D557D8 /* gophertiles_091.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_091.jpg; sourceTree = "<group>"; };
B2E6FE6A1AC2EFA200D557D8 /* gophertiles_092.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_092.jpg; sourceTree = "<group>"; };
B2E6FE6B1AC2EFA200D557D8 /* gophertiles_093.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_093.jpg; sourceTree = "<group>"; };
B2E6FE6C1AC2EFA200D557D8 /* gophertiles_094.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_094.jpg; sourceTree = "<group>"; };
B2E6FE6D1AC2EFA200D557D8 /* gophertiles_095.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_095.jpg; sourceTree = "<group>"; };
B2E6FE6E1AC2EFA200D557D8 /* gophertiles_096.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_096.jpg; sourceTree = "<group>"; };
B2E6FE6F1AC2EFA200D557D8 /* gophertiles_097.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_097.jpg; sourceTree = "<group>"; };
B2E6FE701AC2EFA200D557D8 /* gophertiles_098.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_098.jpg; sourceTree = "<group>"; };
B2E6FE711AC2EFA200D557D8 /* gophertiles_099.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_099.jpg; sourceTree = "<group>"; };
B2E6FE721AC2EFA200D557D8 /* gophertiles_100.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_100.jpg; sourceTree = "<group>"; };
B2E6FE731AC2EFA200D557D8 /* gophertiles_101.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_101.jpg; sourceTree = "<group>"; };
B2E6FE741AC2EFA200D557D8 /* gophertiles_102.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_102.jpg; sourceTree = "<group>"; };
B2E6FE751AC2EFA200D557D8 /* gophertiles_103.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_103.jpg; sourceTree = "<group>"; };
B2E6FE761AC2EFA200D557D8 /* gophertiles_104.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_104.jpg; sourceTree = "<group>"; };
B2E6FE771AC2EFA200D557D8 /* gophertiles_105.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_105.jpg; sourceTree = "<group>"; };
B2E6FE781AC2EFA200D557D8 /* gophertiles_106.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_106.jpg; sourceTree = "<group>"; };
B2E6FE791AC2EFA200D557D8 /* gophertiles_107.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_107.jpg; sourceTree = "<group>"; };
B2E6FE7A1AC2EFA200D557D8 /* gophertiles_108.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_108.jpg; sourceTree = "<group>"; };
B2E6FE7B1AC2EFA200D557D8 /* gophertiles_109.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_109.jpg; sourceTree = "<group>"; };
B2E6FE7C1AC2EFA200D557D8 /* gophertiles_110.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_110.jpg; sourceTree = "<group>"; };
B2E6FE7D1AC2EFA200D557D8 /* gophertiles_111.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_111.jpg; sourceTree = "<group>"; };
B2E6FE7E1AC2EFA200D557D8 /* gophertiles_112.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_112.jpg; sourceTree = "<group>"; };
B2E6FE7F1AC2EFA200D557D8 /* gophertiles_113.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_113.jpg; sourceTree = "<group>"; };
B2E6FE801AC2EFA200D557D8 /* gophertiles_114.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_114.jpg; sourceTree = "<group>"; };
B2E6FE811AC2EFA200D557D8 /* gophertiles_115.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_115.jpg; sourceTree = "<group>"; };
B2E6FE821AC2EFA200D557D8 /* gophertiles_116.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_116.jpg; sourceTree = "<group>"; };
B2E6FE831AC2EFA200D557D8 /* gophertiles_117.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_117.jpg; sourceTree = "<group>"; };
B2E6FE841AC2EFA200D557D8 /* gophertiles_118.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_118.jpg; sourceTree = "<group>"; };
B2E6FE851AC2EFA200D557D8 /* gophertiles_119.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_119.jpg; sourceTree = "<group>"; };
B2E6FE861AC2EFA200D557D8 /* gophertiles_120.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_120.jpg; sourceTree = "<group>"; };
B2E6FE871AC2EFA200D557D8 /* gophertiles_121.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_121.jpg; sourceTree = "<group>"; };
B2E6FE881AC2EFA200D557D8 /* gophertiles_122.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_122.jpg; sourceTree = "<group>"; };
B2E6FE891AC2EFA200D557D8 /* gophertiles_123.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_123.jpg; sourceTree = "<group>"; };
B2E6FE8A1AC2EFA200D557D8 /* gophertiles_124.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_124.jpg; sourceTree = "<group>"; };
B2E6FE8B1AC2EFA200D557D8 /* gophertiles_125.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_125.jpg; sourceTree = "<group>"; };
B2E6FE8C1AC2EFA200D557D8 /* gophertiles_126.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_126.jpg; sourceTree = "<group>"; };
B2E6FE8D1AC2EFA200D557D8 /* gophertiles_127.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_127.jpg; sourceTree = "<group>"; };
B2E6FE8E1AC2EFA200D557D8 /* gophertiles_128.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_128.jpg; sourceTree = "<group>"; };
B2E6FE8F1AC2EFA200D557D8 /* gophertiles_129.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_129.jpg; sourceTree = "<group>"; };
B2E6FE901AC2EFA200D557D8 /* gophertiles_130.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_130.jpg; sourceTree = "<group>"; };
B2E6FE911AC2EFA200D557D8 /* gophertiles_131.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_131.jpg; sourceTree = "<group>"; };
B2E6FE921AC2EFA200D557D8 /* gophertiles_132.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_132.jpg; sourceTree = "<group>"; };
B2E6FE931AC2EFA200D557D8 /* gophertiles_133.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_133.jpg; sourceTree = "<group>"; };
B2E6FE941AC2EFA200D557D8 /* gophertiles_134.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_134.jpg; sourceTree = "<group>"; };
B2E6FE951AC2EFA200D557D8 /* gophertiles_135.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_135.jpg; sourceTree = "<group>"; };
B2E6FE961AC2EFA200D557D8 /* gophertiles_136.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_136.jpg; sourceTree = "<group>"; };
B2E6FE971AC2EFA200D557D8 /* gophertiles_137.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_137.jpg; sourceTree = "<group>"; };
B2E6FE981AC2EFA200D557D8 /* gophertiles_138.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_138.jpg; sourceTree = "<group>"; };
B2E6FE991AC2EFA200D557D8 /* gophertiles_139.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_139.jpg; sourceTree = "<group>"; };
B2E6FE9A1AC2EFA200D557D8 /* gophertiles_140.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_140.jpg; sourceTree = "<group>"; };
B2E6FE9B1AC2EFA200D557D8 /* gophertiles_141.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_141.jpg; sourceTree = "<group>"; };
B2E6FE9C1AC2EFA200D557D8 /* gophertiles_142.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_142.jpg; sourceTree = "<group>"; };
B2E6FE9D1AC2EFA200D557D8 /* gophertiles_143.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_143.jpg; sourceTree = "<group>"; };
B2E6FE9E1AC2EFA200D557D8 /* gophertiles_144.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_144.jpg; sourceTree = "<group>"; };
B2E6FE9F1AC2EFA200D557D8 /* gophertiles_145.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_145.jpg; sourceTree = "<group>"; };
B2E6FEA01AC2EFA200D557D8 /* gophertiles_146.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_146.jpg; sourceTree = "<group>"; };
B2E6FEA11AC2EFA200D557D8 /* gophertiles_147.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_147.jpg; sourceTree = "<group>"; };
B2E6FEA21AC2EFA200D557D8 /* gophertiles_148.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_148.jpg; sourceTree = "<group>"; };
B2E6FEA31AC2EFA200D557D8 /* gophertiles_149.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_149.jpg; sourceTree = "<group>"; };
B2E6FEA41AC2EFA200D557D8 /* gophertiles_150.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_150.jpg; sourceTree = "<group>"; };
B2E6FEA51AC2EFA200D557D8 /* gophertiles_151.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_151.jpg; sourceTree = "<group>"; };
B2E6FEA61AC2EFA200D557D8 /* gophertiles_152.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_152.jpg; sourceTree = "<group>"; };
B2E6FEA71AC2EFA200D557D8 /* gophertiles_153.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_153.jpg; sourceTree = "<group>"; };
B2E6FEA81AC2EFA200D557D8 /* gophertiles_154.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_154.jpg; sourceTree = "<group>"; };
B2E6FEA91AC2EFA200D557D8 /* gophertiles_155.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_155.jpg; sourceTree = "<group>"; };
B2E6FEAA1AC2EFA200D557D8 /* gophertiles_156.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_156.jpg; sourceTree = "<group>"; };
B2E6FEAB1AC2EFA200D557D8 /* gophertiles_157.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_157.jpg; sourceTree = "<group>"; };
B2E6FEAC1AC2EFA200D557D8 /* gophertiles_158.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_158.jpg; sourceTree = "<group>"; };
B2E6FEAD1AC2EFA200D557D8 /* gophertiles_159.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_159.jpg; sourceTree = "<group>"; };
B2E6FEAE1AC2EFA200D557D8 /* gophertiles_160.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_160.jpg; sourceTree = "<group>"; };
B2E6FEAF1AC2EFA200D557D8 /* gophertiles_161.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_161.jpg; sourceTree = "<group>"; };
B2E6FEB01AC2EFA200D557D8 /* gophertiles_162.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_162.jpg; sourceTree = "<group>"; };
B2E6FEB11AC2EFA200D557D8 /* gophertiles_163.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_163.jpg; sourceTree = "<group>"; };
B2E6FEB21AC2EFA200D557D8 /* gophertiles_164.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_164.jpg; sourceTree = "<group>"; };
B2E6FEB31AC2EFA200D557D8 /* gophertiles_165.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_165.jpg; sourceTree = "<group>"; };
B2E6FEB41AC2EFA200D557D8 /* gophertiles_166.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_166.jpg; sourceTree = "<group>"; };
B2E6FEB51AC2EFA300D557D8 /* gophertiles_167.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_167.jpg; sourceTree = "<group>"; };
B2E6FEB61AC2EFA300D557D8 /* gophertiles_168.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_168.jpg; sourceTree = "<group>"; };
B2E6FEB71AC2EFA300D557D8 /* gophertiles_169.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_169.jpg; sourceTree = "<group>"; };
B2E6FEB81AC2EFA300D557D8 /* gophertiles_170.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_170.jpg; sourceTree = "<group>"; };
B2E6FEB91AC2EFA300D557D8 /* gophertiles_171.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_171.jpg; sourceTree = "<group>"; };
B2E6FEBA1AC2EFA300D557D8 /* gophertiles_172.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_172.jpg; sourceTree = "<group>"; };
B2E6FEBB1AC2EFA300D557D8 /* gophertiles_173.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_173.jpg; sourceTree = "<group>"; };
B2E6FEBC1AC2EFA300D557D8 /* gophertiles_174.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_174.jpg; sourceTree = "<group>"; };
B2E6FEBD1AC2EFA300D557D8 /* gophertiles_175.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_175.jpg; sourceTree = "<group>"; };
B2E6FEBE1AC2EFA300D557D8 /* gophertiles_176.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_176.jpg; sourceTree = "<group>"; };
B2E6FEBF1AC2EFA300D557D8 /* gophertiles_177.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_177.jpg; sourceTree = "<group>"; };
B2E6FEC01AC2EFA300D557D8 /* gophertiles_178.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_178.jpg; sourceTree = "<group>"; };
B2E6FEC11AC2EFA300D557D8 /* gophertiles_179.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_179.jpg; sourceTree = "<group>"; };
B2E6FEC21AC2EFA300D557D8 /* gophertiles_180.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = gophertiles_180.jpg; sourceTree = "<group>"; };
B2E6FEC31AC2EFA300D557D8 /* 004.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = 004.html; sourceTree = "<group>"; };
B2E6FEC41AC2EFA300D557D8 /* 005.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 005.txt; sourceTree = "<group>"; };
B2E6FEC61AC2EFA300D557D8 /* 006.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = 006.css; sourceTree = "<group>"; };
B2E6FEC71AC2EFA300D557D8 /* 006.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = 006.js; sourceTree = "<group>"; };
B2E6FEC81AC2EFA300D557D8 /* 006.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = 006.html; sourceTree = "<group>"; };
B2E6FECA1AC2EFA300D557D8 /* 007.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = 007.py; sourceTree = "<group>"; };
B2E6FECB1AC2EFA300D557D8 /* 007.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = 007.html; sourceTree = "<group>"; };
B2E6FECF1AC2EFA300D557D8 /* 009.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = 009.py; sourceTree = "<group>"; };
B2E6FED11AC2EFA300D557D8 /* empty.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = empty.txt; sourceTree = "<group>"; };
B2E6FED21AC2EFA300D557D8 /* hello.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = hello.py; sourceTree = "<group>"; };
B2E6FED31AC2EFA300D557D8 /* index.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = index.html; sourceTree = "<group>"; };
B2E6FED41AC2EFA300D557D8 /* necho.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = necho.py; sourceTree = "<group>"; };
B2E6FED51AC2EFA300D557D8 /* upload.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = upload.py; sourceTree = "<group>"; };
B2E6FED61AC2EFA300D557D8 /* xxx-1.0.2a.tar.gz */ = {isa = PBXFileReference; lastKnownFileType = archive.gzip; path = "xxx-1.0.2a.tar.gz"; sourceTree = "<group>"; };
B2E6FED71AC2EFA300D557D8 /* load-urls-1.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "load-urls-1.txt"; sourceTree = "<group>"; };
B2E6FED81AC2EFA300D557D8 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
B2E6FED91AC2EFA300D557D8 /* test_nghttp_get.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = test_nghttp_get.sh; sourceTree = "<group>"; };
B2E6FEDA1AC2EFA300D557D8 /* test_nghttp_post.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = test_nghttp_post.sh; sourceTree = "<group>"; };
B2E6FEDB1AC2EFA300D557D8 /* test_common.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = test_common.sh; sourceTree = "<group>"; };
B2E6FEDC1AC2F01F00D557D8 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
B2E6FEDD1AC2F20400D557D8 /* h2.conf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = h2.conf; sourceTree = "<group>"; };
B2E6FEDE1AC2F20400D557D8 /* h2.load */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = h2.load; sourceTree = "<group>"; };
B2E708C81AE64AC00009EDAF /* php-wrapper */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = "php-wrapper"; sourceTree = "<group>"; };
B2E708C91AE64B470009EDAF /* info.php */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.php; path = info.php; sourceTree = "<group>"; };
B2FE998E1AA7496B00A5CE5A /* h2_to_h1.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = h2_to_h1.c; sourceTree = "<group>"; };
B2FE998F1AA7496B00A5CE5A /* h2_to_h1.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = h2_to_h1.h; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXGroup section */
B225490A1A6EAAA3004BDEC9 /* mod_h2 */ = {
isa = PBXGroup;
children = (
B20946CC1B2865BB0041992F /* h2_alpn.c */,
B20946CD1B2865BB0041992F /* h2_alpn.h */,
B24CB1221AC94D6A0057413B /* h2_alt_svc.c */,
B24CB1231AC94D6A0057413B /* h2_alt_svc.h */,
B225490D1A6EAE9F004BDEC9 /* h2_config.c */,
B225490E1A6EAE9F004BDEC9 /* h2_config.h */,
B225493A1A711985004BDEC9 /* h2_conn_io.c */,
B225493B1A711985004BDEC9 /* h2_conn_io.h */,
B2CB610E1A88BB9F00D270A6 /* h2_conn.c */,
B2CB610F1A88BB9F00D270A6 /* h2_conn.h */,
B22549331A6FBEF1004BDEC9 /* h2_ctx.c */,
B22549341A6FBEF1004BDEC9 /* h2_ctx.h */,
B2546D971A7FC2A60033A875 /* h2_from_h1.c */,
B2546D981A7FC2A60033A875 /* h2_from_h1.h */,
B225491E1A6FB8DF004BDEC9 /* h2_h2.c */,
B225491F1A6FB8DF004BDEC9 /* h2_h2.h */,
B271425E1AB9DD59004EF82E /* h2_io_set.c */,
B271425F1AB9DD59004EF82E /* h2_io_set.h */,
B27142601AB9DD76004EF82E /* h2_io.c */,
B27142611AB9DD76004EF82E /* h2_io.h */,
B27D32E81A9487B4003DBAF4 /* h2_mplx.c */,
B27D32E91A9487B4003DBAF4 /* h2_mplx.h */,
B22549371A6FCE13004BDEC9 /* h2_private.h */,
B2A6EF171A9B598B005DFC5B /* h2_request.c */,
B2A6EF181A9B598B005DFC5B /* h2_request.h */,
B2CB61101A8A0FB400D270A6 /* h2_response.c */,
B2CB61111A8A0FB400D270A6 /* h2_response.h */,
B22549381A710329004BDEC9 /* h2_session.c */,
B22549391A710329004BDEC9 /* h2_session.h */,
B2546D991A81079D0033A875 /* h2_stream_set.c */,
B2546D9A1A81079D0033A875 /* h2_stream_set.h */,
B2C16D251A779C55000B2297 /* h2_stream.c */,
B2C16D261A779C55000B2297 /* h2_stream.h */,
B284ACC91A7B9DF900C35863 /* h2_task_input.c */,
B284ACCA1A7B9DF900C35863 /* h2_task_input.h */,
B2546D8E1A7FA7D70033A875 /* h2_task_output.c */,
B2546D8F1A7FA7D70033A875 /* h2_task_output.h */,
B21BFCF91B023B840031EBCD /* h2_task_queue.c */,
B21BFCFA1B023B840031EBCD /* h2_task_queue.h */,
B2546D881A7F71F80033A875 /* h2_task.c */,
B2546D891A7F71F80033A875 /* h2_task.h */,
B2FE998E1AA7496B00A5CE5A /* h2_to_h1.c */,
B2FE998F1AA7496B00A5CE5A /* h2_to_h1.h */,
B2A6EF281A9C79A6005DFC5B /* h2_upgrade.c */,
B2A6EF291A9C79A6005DFC5B /* h2_upgrade.h */,
B225493C1A713D18004BDEC9 /* h2_util.c */,
B225493D1A713D18004BDEC9 /* h2_util.h */,
B2AABE611AC5A9B400A90B72 /* h2_version.h.in */,
B2CB61141A8B698A00D270A6 /* h2_worker.c */,
B2CB61151A8B698A00D270A6 /* h2_worker.h */,
B2CB61161A8B699E00D270A6 /* h2_workers.c */,
B2CB61171A8B699E00D270A6 /* h2_workers.h */,
B2E5D5081AADAD28001FD280 /* Makefile.am */,
B225490C1A6EAC37004BDEC9 /* mod_h2.c */,
B22549361A6FCCAA004BDEC9 /* mod_h2.h */,
);
path = mod_h2;
sourceTree = "<group>";
};
B27BBD1F1A65757700C58A41 = {
isa = PBXGroup;
children = (
B2E5D7861AAF1F4D001FD280 /* AUTHORS */,
B2E5D7871AAF1F4D001FD280 /* ChangeLog */,
B2E5D7841AAEEF8C001FD280 /* configure.ac */,
B2E5D7881AAF1F4D001FD280 /* COPYING */,
B2A6EF2C1A9F2452005DFC5B /* DISCUSS */,
B2A6EF2A1A9E3A93005DFC5B /* INSTALL */,
B22D25281AA89A0B0041D8E5 /* LICENSE */,
B2E5D7851AAF1D87001FD280 /* Makefile.am */,
B225490A1A6EAAA3004BDEC9 /* mod_h2 */,
B2E5D7891AAF1F4D001FD280 /* NEWS */,
B27BBD2D1A6575C200C58A41 /* README */,
B256C4BA1ADD5FF10042C760 /* README.md */,
B2E6DF791AC2EF6E00D557D8 /* sandbox */,
B2E6DF761AC2E55700D557D8 /* setup */,
);
sourceTree = "<group>";
};
B2C63B0F1B3BF76B00127D1E /* mods-available */ = {
isa = PBXGroup;
children = (
B2C63B121B3BF7CC00127D1E /* mpm_event.load */,
B2C63B131B3BF7CC00127D1E /* mpm_prefork.load */,
B2C63B101B3BF78C00127D1E /* mpm_worker.load */,
);
path = "mods-available";
sourceTree = "<group>";
};
B2E6DF761AC2E55700D557D8 /* setup */ = {
isa = PBXGroup;
children = (
B2E6FEDD1AC2F20400D557D8 /* h2.conf */,
B2E6FEDE1AC2F20400D557D8 /* h2.load */,
B2E6DF771AC2E55800D557D8 /* Makefile.am */,
B2E6DF781AC2E6A700D557D8 /* install-config.sh */,
);
path = setup;
sourceTree = "<group>";
};
B2E6DF791AC2EF6E00D557D8 /* sandbox */ = {
isa = PBXGroup;
children = (
B2E6DF7A1AC2EF6E00D557D8 /* httpd */,
B2E6FEDC1AC2F01F00D557D8 /* Makefile.am */,
B2E6DFA21AC2EF6E00D557D8 /* nghttp2 */,
B2E6DFA61AC2EF6E00D557D8 /* test */,
);
path = sandbox;
sourceTree = "<group>";
};
B2E6DF7A1AC2EF6E00D557D8 /* httpd */ = {
isa = PBXGroup;
children = (
B2E6DF7B1AC2EF6E00D557D8 /* .gitignore */,
B2E6DF7C1AC2EF6E00D557D8 /* get-openssl-latest.sh */,
B2E6DF7D1AC2EF6E00D557D8 /* Makefile */,
B2E6DF9C1AC2EF6E00D557D8 /* packages */,
B2E6DF9F1AC2EF6E00D557D8 /* patches */,
);
path = httpd;
sourceTree = "<group>";
};
B2E6DF9C1AC2EF6E00D557D8 /* packages */ = {
isa = PBXGroup;
children = (
B2E6DF9E1AC2EF6E00D557D8 /* pcre-8.36.tar.gz */,
);
path = packages;
sourceTree = "<group>";
};
B2E6DF9F1AC2EF6E00D557D8 /* patches */ = {
isa = PBXGroup;
children = (
B2B170B91B31BF7000EDC007 /* httpd-2.4.12-alpn-v5.patch */,
B272F2311B1E13D8007A20A5 /* httpd-2.4.x-alpn-v4.patch */,
B2C6310C1B393CA100127D1E /* httpd-alpn-v4-v5.patch */,
B227966E1AEE93B000376B40 /* httpd-npn.unified.diff.patch */,
B2C63B0E1B39421B00127D1E /* openssl-1.0.2-alpn.patch */,
B20946CE1B29D8C30041992F /* sni_misdirect.patch */,
);
path = patches;
sourceTree = "<group>";
};
B2E6DFA21AC2EF6E00D557D8 /* nghttp2 */ = {
isa = PBXGroup;
children = (
B2E6DFA31AC2EF6E00D557D8 /* Makefile */,
B2E6DFA41AC2EF6E00D557D8 /* patches */,
);
path = nghttp2;
sourceTree = "<group>";
};
B2E6DFA41AC2EF6E00D557D8 /* patches */ = {
isa = PBXGroup;
children = (
);
path = patches;
sourceTree = "<group>";
};
B2E6DFA61AC2EF6E00D557D8 /* test */ = {
isa = PBXGroup;
children = (
B2E708C71AE64AC00009EDAF /* bin */,
B2E6DFA71AC2EF6E00D557D8 /* clients */,
B2E6FDF91AC2EFA200D557D8 /* conf */,
B2E6FE071AC2EFA200D557D8 /* htdocs */,
B2E6FED71AC2EFA300D557D8 /* load-urls-1.txt */,
B2E6FED81AC2EFA300D557D8 /* Makefile */,
B2E6FEDB1AC2EFA300D557D8 /* test_common.sh */,
B24CB1241AC96BFE0057413B /* test_curl_altsvc.sh */,
B20E441F1ACC07E8003D21AE /* test_curl_get.sh */,
B20E44201ACC088E003D21AE /* test_curl_post.sh */,
B2E6FED91AC2EFA300D557D8 /* test_nghttp_get.sh */,
B2E6FEDA1AC2EFA300D557D8 /* test_nghttp_post.sh */,
B20946CA1B25D4430041992F /* test_alt_host.sh */,
);
path = test;
sourceTree = "<group>";
};
B2E6DFA71AC2EF6E00D557D8 /* clients */ = {
isa = PBXGroup;
children = (
B2E6FDF81AC2EFA200D557D8 /* Makefile */,
);
path = clients;
sourceTree = "<group>";
};
B2E6FDF91AC2EFA200D557D8 /* conf */ = {
isa = PBXGroup;
children = (
B2E6FDFA1AC2EFA200D557D8 /* httpd.conf */,
B2C63B0F1B3BF76B00127D1E /* mods-available */,
B2E6FDFB1AC2EFA200D557D8 /* modules.conf */,
B2E6FDFC1AC2EFA200D557D8 /* sites */,
B2E6FDFF1AC2EFA200D557D8 /* ssl */,
);
path = conf;
sourceTree = "<group>";
};
B2E6FDFC1AC2EFA200D557D8 /* sites */ = {
isa = PBXGroup;
children = (
B2B170B81B316FB100EDC007 /* aaa-noh2.example.org.conf */,
B2B170B31B2EC73400EDC007 /* test.example.org.conf */,
B2E6FDFD1AC2EFA200D557D8 /* mod-h2.greenbytes.de.conf */,
B2C631081B383EA800127D1E /* test-ser.example.org.conf */,
);
path = sites;
sourceTree = "<group>";
};
B2E6FDFF1AC2EFA200D557D8 /* ssl */ = {
isa = PBXGroup;
children = (
B2E6FE001AC2EFA200D557D8 /* .gitignore */,
B2E6FE011AC2EFA200D557D8 /* ca.pem */,
B2E6FE021AC2EFA200D557D8 /* extensions.conf */,
B2E6FE031AC2EFA200D557D8 /* mod-h2.greenbytes.de.key */,
B2E6FE041AC2EFA200D557D8 /* mod-h2.greenbytes.de.pem */,
B2E6FE051AC2EFA200D557D8 /* test.example.org.x509.input */,
B2B170B61B303B0C00EDC007 /* noh2.example.org.x509.input */,
);
path = ssl;
sourceTree = "<group>";
};
B2E6FE071AC2EFA200D557D8 /* htdocs */ = {
isa = PBXGroup;
children = (
B2E6FE081AC2EFA200D557D8 /* test.example.org */,
);
path = htdocs;
sourceTree = "<group>";
};
B2E6FE081AC2EFA200D557D8 /* test.example.org */ = {
isa = PBXGroup;
children = (
B2E6FE091AC2EFA200D557D8 /* 001.html */,
B2E6FE0A1AC2EFA200D557D8 /* 002.jpg */,
B2E6FE0B1AC2EFA200D557D8 /* 003 */,
B2E6FE0D1AC2EFA200D557D8 /* 003.html */,
B2E6FE0E1AC2EFA200D557D8 /* 004 */,
B2E6FEC31AC2EFA300D557D8 /* 004.html */,
B2E6FEC41AC2EFA300D557D8 /* 005.txt */,
B2E6FEC51AC2EFA300D557D8 /* 006 */,
B2E6FEC81AC2EFA300D557D8 /* 006.html */,
B2E6FEC91AC2EFA300D557D8 /* 007 */,
B2E6FECB1AC2EFA300D557D8 /* 007.html */,
B2E6FECF1AC2EFA300D557D8 /* 009.py */,
B2E6FED01AC2EFA300D557D8 /* files */,
B2E6FED21AC2EFA300D557D8 /* hello.py */,
B2E6FED31AC2EFA300D557D8 /* index.html */,
B2E708C91AE64B470009EDAF /* info.php */,
B2E6FED41AC2EFA300D557D8 /* necho.py */,
B2E6FED51AC2EFA300D557D8 /* upload.py */,
B2E6FED61AC2EFA300D557D8 /* xxx-1.0.2a.tar.gz */,
);
path = test.example.org;
sourceTree = "<group>";
};
B2E6FE0B1AC2EFA200D557D8 /* 003 */ = {
isa = PBXGroup;
children = (
B2E6FE0C1AC2EFA200D557D8 /* 003_img.jpg */,
);
path = 003;
sourceTree = "<group>";
};
B2E6FE0E1AC2EFA200D557D8 /* 004 */ = {
isa = PBXGroup;
children = (
B2E6FE0F1AC2EFA200D557D8 /* gophertiles.jpg */,
B2E6FE101AC2EFA200D557D8 /* gophertiles_002.jpg */,
B2E6FE111AC2EFA200D557D8 /* gophertiles_003.jpg */,
B2E6FE121AC2EFA200D557D8 /* gophertiles_004.jpg */,
B2E6FE131AC2EFA200D557D8 /* gophertiles_005.jpg */,
B2E6FE141AC2EFA200D557D8 /* gophertiles_006.jpg */,
B2E6FE151AC2EFA200D557D8 /* gophertiles_007.jpg */,
B2E6FE161AC2EFA200D557D8 /* gophertiles_008.jpg */,
B2E6FE171AC2EFA200D557D8 /* gophertiles_009.jpg */,
B2E6FE181AC2EFA200D557D8 /* gophertiles_010.jpg */,
B2E6FE191AC2EFA200D557D8 /* gophertiles_011.jpg */,
B2E6FE1A1AC2EFA200D557D8 /* gophertiles_012.jpg */,
B2E6FE1B1AC2EFA200D557D8 /* gophertiles_013.jpg */,
B2E6FE1C1AC2EFA200D557D8 /* gophertiles_014.jpg */,
B2E6FE1D1AC2EFA200D557D8 /* gophertiles_015.jpg */,
B2E6FE1E1AC2EFA200D557D8 /* gophertiles_016.jpg */,
B2E6FE1F1AC2EFA200D557D8 /* gophertiles_017.jpg */,
B2E6FE201AC2EFA200D557D8 /* gophertiles_018.jpg */,
B2E6FE211AC2EFA200D557D8 /* gophertiles_019.jpg */,
B2E6FE221AC2EFA200D557D8 /* gophertiles_020.jpg */,
B2E6FE231AC2EFA200D557D8 /* gophertiles_021.jpg */,
B2E6FE241AC2EFA200D557D8 /* gophertiles_022.jpg */,
B2E6FE251AC2EFA200D557D8 /* gophertiles_023.jpg */,
B2E6FE261AC2EFA200D557D8 /* gophertiles_024.jpg */,
B2E6FE271AC2EFA200D557D8 /* gophertiles_025.jpg */,
B2E6FE281AC2EFA200D557D8 /* gophertiles_026.jpg */,
B2E6FE291AC2EFA200D557D8 /* gophertiles_027.jpg */,
B2E6FE2A1AC2EFA200D557D8 /* gophertiles_028.jpg */,
B2E6FE2B1AC2EFA200D557D8 /* gophertiles_029.jpg */,
B2E6FE2C1AC2EFA200D557D8 /* gophertiles_030.jpg */,
B2E6FE2D1AC2EFA200D557D8 /* gophertiles_031.jpg */,
B2E6FE2E1AC2EFA200D557D8 /* gophertiles_032.jpg */,
B2E6FE2F1AC2EFA200D557D8 /* gophertiles_033.jpg */,
B2E6FE301AC2EFA200D557D8 /* gophertiles_034.jpg */,
B2E6FE311AC2EFA200D557D8 /* gophertiles_035.jpg */,
B2E6FE321AC2EFA200D557D8 /* gophertiles_036.jpg */,
B2E6FE331AC2EFA200D557D8 /* gophertiles_037.jpg */,
B2E6FE341AC2EFA200D557D8 /* gophertiles_038.jpg */,
B2E6FE351AC2EFA200D557D8 /* gophertiles_039.jpg */,
B2E6FE361AC2EFA200D557D8 /* gophertiles_040.jpg */,
B2E6FE371AC2EFA200D557D8 /* gophertiles_041.jpg */,
B2E6FE381AC2EFA200D557D8 /* gophertiles_042.jpg */,
B2E6FE391AC2EFA200D557D8 /* gophertiles_043.jpg */,
B2E6FE3A1AC2EFA200D557D8 /* gophertiles_044.jpg */,
B2E6FE3B1AC2EFA200D557D8 /* gophertiles_045.jpg */,
B2E6FE3C1AC2EFA200D557D8 /* gophertiles_046.jpg */,
B2E6FE3D1AC2EFA200D557D8 /* gophertiles_047.jpg */,
B2E6FE3E1AC2EFA200D557D8 /* gophertiles_048.jpg */,
B2E6FE3F1AC2EFA200D557D8 /* gophertiles_049.jpg */,
B2E6FE401AC2EFA200D557D8 /* gophertiles_050.jpg */,
B2E6FE411AC2EFA200D557D8 /* gophertiles_051.jpg */,
B2E6FE421AC2EFA200D557D8 /* gophertiles_052.jpg */,
B2E6FE431AC2EFA200D557D8 /* gophertiles_053.jpg */,
B2E6FE441AC2EFA200D557D8 /* gophertiles_054.jpg */,
B2E6FE451AC2EFA200D557D8 /* gophertiles_055.jpg */,
B2E6FE461AC2EFA200D557D8 /* gophertiles_056.jpg */,
B2E6FE471AC2EFA200D557D8 /* gophertiles_057.jpg */,
B2E6FE481AC2EFA200D557D8 /* gophertiles_058.jpg */,
B2E6FE491AC2EFA200D557D8 /* gophertiles_059.jpg */,
B2E6FE4A1AC2EFA200D557D8 /* gophertiles_060.jpg */,
B2E6FE4B1AC2EFA200D557D8 /* gophertiles_061.jpg */,
B2E6FE4C1AC2EFA200D557D8 /* gophertiles_062.jpg */,
B2E6FE4D1AC2EFA200D557D8 /* gophertiles_063.jpg */,
B2E6FE4E1AC2EFA200D557D8 /* gophertiles_064.jpg */,
B2E6FE4F1AC2EFA200D557D8 /* gophertiles_065.jpg */,
B2E6FE501AC2EFA200D557D8 /* gophertiles_066.jpg */,
B2E6FE511AC2EFA200D557D8 /* gophertiles_067.jpg */,
B2E6FE521AC2EFA200D557D8 /* gophertiles_068.jpg */,
B2E6FE531AC2EFA200D557D8 /* gophertiles_069.jpg */,
B2E6FE541AC2EFA200D557D8 /* gophertiles_070.jpg */,
B2E6FE551AC2EFA200D557D8 /* gophertiles_071.jpg */,
B2E6FE561AC2EFA200D557D8 /* gophertiles_072.jpg */,
B2E6FE571AC2EFA200D557D8 /* gophertiles_073.jpg */,
B2E6FE581AC2EFA200D557D8 /* gophertiles_074.jpg */,
B2E6FE591AC2EFA200D557D8 /* gophertiles_075.jpg */,
B2E6FE5A1AC2EFA200D557D8 /* gophertiles_076.jpg */,
B2E6FE5B1AC2EFA200D557D8 /* gophertiles_077.jpg */,
B2E6FE5C1AC2EFA200D557D8 /* gophertiles_078.jpg */,
B2E6FE5D1AC2EFA200D557D8 /* gophertiles_079.jpg */,
B2E6FE5E1AC2EFA200D557D8 /* gophertiles_080.jpg */,
B2E6FE5F1AC2EFA200D557D8 /* gophertiles_081.jpg */,
B2E6FE601AC2EFA200D557D8 /* gophertiles_082.jpg */,
B2E6FE611AC2EFA200D557D8 /* gophertiles_083.jpg */,
B2E6FE621AC2EFA200D557D8 /* gophertiles_084.jpg */,
B2E6FE631AC2EFA200D557D8 /* gophertiles_085.jpg */,
B2E6FE641AC2EFA200D557D8 /* gophertiles_086.jpg */,
B2E6FE651AC2EFA200D557D8 /* gophertiles_087.jpg */,
B2E6FE661AC2EFA200D557D8 /* gophertiles_088.jpg */,
B2E6FE671AC2EFA200D557D8 /* gophertiles_089.jpg */,
B2E6FE681AC2EFA200D557D8 /* gophertiles_090.jpg */,
B2E6FE691AC2EFA200D557D8 /* gophertiles_091.jpg */,
B2E6FE6A1AC2EFA200D557D8 /* gophertiles_092.jpg */,
B2E6FE6B1AC2EFA200D557D8 /* gophertiles_093.jpg */,
B2E6FE6C1AC2EFA200D557D8 /* gophertiles_094.jpg */,
B2E6FE6D1AC2EFA200D557D8 /* gophertiles_095.jpg */,
B2E6FE6E1AC2EFA200D557D8 /* gophertiles_096.jpg */,
B2E6FE6F1AC2EFA200D557D8 /* gophertiles_097.jpg */,
B2E6FE701AC2EFA200D557D8 /* gophertiles_098.jpg */,
B2E6FE711AC2EFA200D557D8 /* gophertiles_099.jpg */,
B2E6FE721AC2EFA200D557D8 /* gophertiles_100.jpg */,
B2E6FE731AC2EFA200D557D8 /* gophertiles_101.jpg */,
B2E6FE741AC2EFA200D557D8 /* gophertiles_102.jpg */,
B2E6FE751AC2EFA200D557D8 /* gophertiles_103.jpg */,
B2E6FE761AC2EFA200D557D8 /* gophertiles_104.jpg */,
B2E6FE771AC2EFA200D557D8 /* gophertiles_105.jpg */,
B2E6FE781AC2EFA200D557D8 /* gophertiles_106.jpg */,
B2E6FE791AC2EFA200D557D8 /* gophertiles_107.jpg */,
B2E6FE7A1AC2EFA200D557D8 /* gophertiles_108.jpg */,
B2E6FE7B1AC2EFA200D557D8 /* gophertiles_109.jpg */,
B2E6FE7C1AC2EFA200D557D8 /* gophertiles_110.jpg */,
B2E6FE7D1AC2EFA200D557D8 /* gophertiles_111.jpg */,
B2E6FE7E1AC2EFA200D557D8 /* gophertiles_112.jpg */,
B2E6FE7F1AC2EFA200D557D8 /* gophertiles_113.jpg */,
B2E6FE801AC2EFA200D557D8 /* gophertiles_114.jpg */,
B2E6FE811AC2EFA200D557D8 /* gophertiles_115.jpg */,
B2E6FE821AC2EFA200D557D8 /* gophertiles_116.jpg */,
B2E6FE831AC2EFA200D557D8 /* gophertiles_117.jpg */,
B2E6FE841AC2EFA200D557D8 /* gophertiles_118.jpg */,
B2E6FE851AC2EFA200D557D8 /* gophertiles_119.jpg */,
B2E6FE861AC2EFA200D557D8 /* gophertiles_120.jpg */,
B2E6FE871AC2EFA200D557D8 /* gophertiles_121.jpg */,
B2E6FE881AC2EFA200D557D8 /* gophertiles_122.jpg */,
B2E6FE891AC2EFA200D557D8 /* gophertiles_123.jpg */,
B2E6FE8A1AC2EFA200D557D8 /* gophertiles_124.jpg */,
B2E6FE8B1AC2EFA200D557D8 /* gophertiles_125.jpg */,
B2E6FE8C1AC2EFA200D557D8 /* gophertiles_126.jpg */,
B2E6FE8D1AC2EFA200D557D8 /* gophertiles_127.jpg */,
B2E6FE8E1AC2EFA200D557D8 /* gophertiles_128.jpg */,
B2E6FE8F1AC2EFA200D557D8 /* gophertiles_129.jpg */,
B2E6FE901AC2EFA200D557D8 /* gophertiles_130.jpg */,
B2E6FE911AC2EFA200D557D8 /* gophertiles_131.jpg */,
B2E6FE921AC2EFA200D557D8 /* gophertiles_132.jpg */,
B2E6FE931AC2EFA200D557D8 /* gophertiles_133.jpg */,
B2E6FE941AC2EFA200D557D8 /* gophertiles_134.jpg */,
B2E6FE951AC2EFA200D557D8 /* gophertiles_135.jpg */,
B2E6FE961AC2EFA200D557D8 /* gophertiles_136.jpg */,
B2E6FE971AC2EFA200D557D8 /* gophertiles_137.jpg */,
B2E6FE981AC2EFA200D557D8 /* gophertiles_138.jpg */,
B2E6FE991AC2EFA200D557D8 /* gophertiles_139.jpg */,
B2E6FE9A1AC2EFA200D557D8 /* gophertiles_140.jpg */,
B2E6FE9B1AC2EFA200D557D8 /* gophertiles_141.jpg */,
B2E6FE9C1AC2EFA200D557D8 /* gophertiles_142.jpg */,
B2E6FE9D1AC2EFA200D557D8 /* gophertiles_143.jpg */,
B2E6FE9E1AC2EFA200D557D8 /* gophertiles_144.jpg */,
B2E6FE9F1AC2EFA200D557D8 /* gophertiles_145.jpg */,
B2E6FEA01AC2EFA200D557D8 /* gophertiles_146.jpg */,
B2E6FEA11AC2EFA200D557D8 /* gophertiles_147.jpg */,
B2E6FEA21AC2EFA200D557D8 /* gophertiles_148.jpg */,
B2E6FEA31AC2EFA200D557D8 /* gophertiles_149.jpg */,
B2E6FEA41AC2EFA200D557D8 /* gophertiles_150.jpg */,
B2E6FEA51AC2EFA200D557D8 /* gophertiles_151.jpg */,
B2E6FEA61AC2EFA200D557D8 /* gophertiles_152.jpg */,
B2E6FEA71AC2EFA200D557D8 /* gophertiles_153.jpg */,
B2E6FEA81AC2EFA200D557D8 /* gophertiles_154.jpg */,
B2E6FEA91AC2EFA200D557D8 /* gophertiles_155.jpg */,
B2E6FEAA1AC2EFA200D557D8 /* gophertiles_156.jpg */,
B2E6FEAB1AC2EFA200D557D8 /* gophertiles_157.jpg */,
B2E6FEAC1AC2EFA200D557D8 /* gophertiles_158.jpg */,
B2E6FEAD1AC2EFA200D557D8 /* gophertiles_159.jpg */,
B2E6FEAE1AC2EFA200D557D8 /* gophertiles_160.jpg */,
B2E6FEAF1AC2EFA200D557D8 /* gophertiles_161.jpg */,
B2E6FEB01AC2EFA200D557D8 /* gophertiles_162.jpg */,
B2E6FEB11AC2EFA200D557D8 /* gophertiles_163.jpg */,
B2E6FEB21AC2EFA200D557D8 /* gophertiles_164.jpg */,
B2E6FEB31AC2EFA200D557D8 /* gophertiles_165.jpg */,
B2E6FEB41AC2EFA200D557D8 /* gophertiles_166.jpg */,
B2E6FEB51AC2EFA300D557D8 /* gophertiles_167.jpg */,
B2E6FEB61AC2EFA300D557D8 /* gophertiles_168.jpg */,
B2E6FEB71AC2EFA300D557D8 /* gophertiles_169.jpg */,
B2E6FEB81AC2EFA300D557D8 /* gophertiles_170.jpg */,
B2E6FEB91AC2EFA300D557D8 /* gophertiles_171.jpg */,
B2E6FEBA1AC2EFA300D557D8 /* gophertiles_172.jpg */,
B2E6FEBB1AC2EFA300D557D8 /* gophertiles_173.jpg */,
B2E6FEBC1AC2EFA300D557D8 /* gophertiles_174.jpg */,
B2E6FEBD1AC2EFA300D557D8 /* gophertiles_175.jpg */,
B2E6FEBE1AC2EFA300D557D8 /* gophertiles_176.jpg */,
B2E6FEBF1AC2EFA300D557D8 /* gophertiles_177.jpg */,
B2E6FEC01AC2EFA300D557D8 /* gophertiles_178.jpg */,
B2E6FEC11AC2EFA300D557D8 /* gophertiles_179.jpg */,
B2E6FEC21AC2EFA300D557D8 /* gophertiles_180.jpg */,
);
path = 004;
sourceTree = "<group>";
};
B2E6FEC51AC2EFA300D557D8 /* 006 */ = {
isa = PBXGroup;
children = (
B2E6FEC61AC2EFA300D557D8 /* 006.css */,
B2E6FEC71AC2EFA300D557D8 /* 006.js */,
);
path = 006;
sourceTree = "<group>";
};
B2E6FEC91AC2EFA300D557D8 /* 007 */ = {
isa = PBXGroup;
children = (
B2E6FECA1AC2EFA300D557D8 /* 007.py */,
);
path = 007;
sourceTree = "<group>";
};
B2E6FED01AC2EFA300D557D8 /* files */ = {
isa = PBXGroup;
children = (
B2E6FED11AC2EFA300D557D8 /* empty.txt */,
);
path = files;
sourceTree = "<group>";
};
B2E708C71AE64AC00009EDAF /* bin */ = {
isa = PBXGroup;
children = (
B2E708C81AE64AC00009EDAF /* php-wrapper */,
B2B170B41B2F02C100EDC007 /* testrun */,
);
path = bin;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXLegacyTarget section */
B2546D8A1A7F76FA0033A875 /* mod_h2 make */ = {
isa = PBXLegacyTarget;
buildArgumentsString = "$(ACTION) APXS=../gen/install/bin/apxs";
buildConfigurationList = B2546D8B1A7F76FA0033A875 /* Build configuration list for PBXLegacyTarget "mod_h2 make" */;
buildPhases = (
);
buildToolPath = /usr/bin/make;
buildWorkingDirectory = "/Users/sei/projects/mod-h2/mod_h2";
dependencies = (
);
name = "mod_h2 make";
passBuildSettingsInEnvironment = 1;
productName = "mod_h2 make";
};
/* End PBXLegacyTarget section */
/* Begin PBXProject section */
B27BBD201A65757700C58A41 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0600;
TargetAttributes = {
B2546D8A1A7F76FA0033A875 = {
CreatedOnToolsVersion = 6.0;
};
};
};
buildConfigurationList = B27BBD231A65757700C58A41 /* Build configuration list for PBXProject "mod-h2" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
en,
);
mainGroup = B27BBD1F1A65757700C58A41;
projectDirPath = "";
projectRoot = "";
targets = (
B2546D8A1A7F76FA0033A875 /* mod_h2 make */,
);
};
/* End PBXProject section */
/* Begin XCBuildConfiguration section */
B2546D8C1A7F76FA0033A875 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUGGING_SYMBOLS = YES;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.9;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = "";
OTHER_LDFLAGS = "";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = macosx;
};
name = Debug;
};
B2546D8D1A7F76FA0033A875 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.9;
MTL_ENABLE_DEBUG_INFO = NO;
OTHER_CFLAGS = "";
OTHER_LDFLAGS = "";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = macosx;
};
name = Release;
};
B27BBD241A65757700C58A41 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
BuildMake = "";
MACOSX_DEPLOYMENT_TARGET = 10.9;
};
name = Debug;
};
B27BBD251A65757700C58A41 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
BuildMake = "";
MACOSX_DEPLOYMENT_TARGET = 10.9;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
B2546D8B1A7F76FA0033A875 /* Build configuration list for PBXLegacyTarget "mod_h2 make" */ = {
isa = XCConfigurationList;
buildConfigurations = (
B2546D8C1A7F76FA0033A875 /* Debug */,
B2546D8D1A7F76FA0033A875 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
B27BBD231A65757700C58A41 /* Build configuration list for PBXProject "mod-h2" */ = {
isa = XCConfigurationList;
buildConfigurations = (
B27BBD241A65757700C58A41 /* Debug */,
B27BBD251A65757700C58A41 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = B27BBD201A65757700C58A41 /* Project object */;
}

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:mod-h2.xcodeproj">
</FileRef>
</Workspace>

View File

@@ -1,53 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDESourceControlProjectFavoriteDictionaryKey</key>
<false/>
<key>IDESourceControlProjectIdentifier</key>
<string>0BBB75AC-83C1-4A66-A178-3C70F4067182</string>
<key>IDESourceControlProjectName</key>
<string>mod-h2</string>
<key>IDESourceControlProjectOriginsDictionary</key>
<dict>
<key>7A6D7B037166029D8EB565F124690A553EB43BAF</key>
<string>https://www.greenbytes.de/projects/mod-h2/mod-h2.git</string>
<key>ED37D202B9691A75DA1E927834B45B38A4B3B6A5</key>
<string>github.com:tatsuhiro-t/nghttp2.git</string>
</dict>
<key>IDESourceControlProjectPath</key>
<string>mod-h2/mod-h2.xcodeproj</string>
<key>IDESourceControlProjectRelativeInstallPathDictionary</key>
<dict>
<key>7A6D7B037166029D8EB565F124690A553EB43BAF</key>
<string>../../..</string>
<key>ED37D202B9691A75DA1E927834B45B38A4B3B6A5</key>
<string>../../../nghttp2/gen/nghttp2-master</string>
</dict>
<key>IDESourceControlProjectURL</key>
<string>https://www.greenbytes.de/projects/mod-h2/mod-h2.git</string>
<key>IDESourceControlProjectVersion</key>
<integer>111</integer>
<key>IDESourceControlProjectWCCIdentifier</key>
<string>7A6D7B037166029D8EB565F124690A553EB43BAF</string>
<key>IDESourceControlProjectWCConfigurations</key>
<array>
<dict>
<key>IDESourceControlRepositoryExtensionIdentifierKey</key>
<string>public.vcs.git</string>
<key>IDESourceControlWCCIdentifierKey</key>
<string>7A6D7B037166029D8EB565F124690A553EB43BAF</string>
<key>IDESourceControlWCCName</key>
<string>mod-h2</string>
</dict>
<dict>
<key>IDESourceControlRepositoryExtensionIdentifierKey</key>
<string>public.vcs.git</string>
<key>IDESourceControlWCCIdentifierKey</key>
<string>ED37D202B9691A75DA1E927834B45B38A4B3B6A5</string>
<key>IDESourceControlWCCName</key>
<string>nghttp2-master</string>
</dict>
</array>
</dict>
</plist>

View File

@@ -1,77 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0600"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "B2546D8A1A7F76FA0033A875"
BuildableName = "mod_h2 make"
BlueprintName = "mod_h2 make"
ReferencedContainer = "container:mod-h2.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<Testables>
</Testables>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
buildConfiguration = "Debug"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
allowLocationSimulation = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "B2546D8A1A7F76FA0033A875"
BuildableName = "mod_h2 make"
BlueprintName = "mod_h2 make"
ReferencedContainer = "container:mod-h2.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "B2546D8A1A7F76FA0033A875"
BuildableName = "mod_h2 make"
BlueprintName = "mod_h2 make"
ReferencedContainer = "container:mod-h2.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@@ -1,22 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SchemeUserState</key>
<dict>
<key>mod_h2 make.xcscheme</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>
<dict>
<key>B2546D8A1A7F76FA0033A875</key>
<dict>
<key>primary</key>
<true/>
</dict>
</dict>
</dict>
</plist>

View File

@@ -1,7 +0,0 @@
*.o
*.slo
*.lo
*.la
.libs
Makefile.in
Makefile

View File

@@ -1,94 +0,0 @@
# Copyright 2015 greenbytes GmbH (https://www.greenbytes.de)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
SUBDIRS =
ACLOCAL_AMFLAGS = -I m4
lib_LTLIBRARIES = mod_h2.la
mod_h2_la_CPPFLAGS = -std=c99 -D_GNU_SOURCE -Werror
mod_h2_la_LDFLAGS = -module
OBJECTS = \
h2_alpn.c \
h2_alt_svc.c \
h2_config.c \
h2_conn.c \
h2_conn_io.c \
h2_ctx.c \
h2_from_h1.c \
h2_h2.c \
h2_io.c \
h2_io_set.c \
h2_mplx.c \
h2_request.c \
h2_response.c \
h2_session.c \
h2_stream.c \
h2_stream_set.c \
h2_task.c \
h2_task_input.c \
h2_task_output.c \
h2_task_queue.c \
h2_to_h1.c \
h2_upgrade.c \
h2_util.c \
h2_worker.c \
h2_workers.c \
mod_h2.c
HFILES = \
h2_alpn.h \
h2_alt_svc.h \
h2_config.h \
h2_conn.h \
h2_conn_io.h \
h2_ctx.h \
h2_from_h1.h \
h2_h2.h \
h2_io.h \
h2_io_set.h \
h2_mplx.h \
h2_private.h \
h2_request.h \
h2_response.h \
h2_session.h \
h2_stream.h \
h2_stream_set.h \
h2_task.h \
h2_task_input.h \
h2_task_output.h \
h2_task_queue.h \
h2_to_h1.h \
h2_upgrade.h \
h2_util.h \
h2_version.h \
h2_worker.h \
h2_workers.h \
mod_h2.h
mod_h2_la_SOURCES = $(HFILES) $(OBJECTS)
all: mod_h2.la
install-libLTLIBRARIES:
@: # override
install-exec-local: mod_h2.la
$(MKDIR_P) $(DESTDIR)/@LIBEXEC_DIR@
$(APXS) -i -S LIBEXECDIR=$(DESTDIR)/@LIBEXEC_DIR@ -n h2 mod_h2.la

View File

@@ -1 +0,0 @@
# just so it is not empty

View File

@@ -1,2 +0,0 @@
install
gen

View File

@@ -1,58 +0,0 @@
# Copyright 2015 greenbytes GmbH (https://www.greenbytes.de)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
SUBDIRS = httpd nghttp2 test
DIST_SUBDIRS = httpd nghttp2 test
INSTALL_DIR = install
EXTRA_DIST = \
httpd/Makefile \
httpd/*.sh \
httpd/patches/* \
httpd/packages/* \
nghttp2/Makefile \
test/Makefile \
test/*.sh \
test/*.txt \
test/htdocs \
test/conf \
test/clients/Makefile
.PHONY: test loadtest start stop restart
start:
make -C test start
restart:
make -C test restart
stop:
make -C test stop
test:
make -C test test
loadtest:
make -C test loadtest
mpm_worker:
make -C test mpm_worker
mpm_event:
make -C test mpm_event
mpm_prefork:
make -C test mpm_prefork

View File

@@ -1 +0,0 @@
gen

View File

@@ -1,319 +0,0 @@
# Copyright 2015 greenbytes GmbH (https://www.greenbytes.de)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
OS = $(shell uname -s)
MACHINE = $(shell uname -m)
APR_VERSION = 1.5.2
APR_DIR = apr-$(APR_VERSION)
APR_TAR = $(APR_DIR).tar.gz
APR_URL = http://archive.apache.org/dist/apr/$(APR_TAR)
APR-UTIL_VERSION = 1.5.4
APR-UTIL_DIR = apr-util-$(APR-UTIL_VERSION)
APR-UTIL_TAR = $(APR-UTIL_DIR).tar.gz
APR-UTIL_URL = http://archive.apache.org/dist/apr/$(APR-UTIL_TAR)
HTTPD_VERSION = 2.4.12
HTTPD_DIR = httpd-$(HTTPD_VERSION)
HTTPD_TAR = httpd-$(HTTPD_VERSION).tar.gz
HTTPD_URL = https://archive.apache.org/dist/httpd/$(HTTPD_TAR)
HTTPD_CONF = --enable-mpms-shared=all --with-included-apr
HTTPD_DEPS = $(GEN)/$(HTTPD_DIR)/.apr-extracted
PCRE_VERSION = 8.36
PCRE_DIR = pcre-$(PCRE_VERSION)
PCRE_TAR = $(PCRE_DIR).tar.gz
PCRE_URL = http://sourceforge.net/projects/pcre/files/pcre/$(PCRE_VERSION)/$(PCRE_TAR)
OPENSSL_BASE = http://www.openssl.org
OPENSSL_DIR = openssl-latest
OPENSSL_TAR = $(OPENSSL_DIR).tar.gz
OPENSSL_URL = $(OPENSSL_BASE)/source/latest.tar.gz
OPENSSL_CONF_CMD = ./config
OPENSSL_CONF = shared -fPIC
FCGI_VERSION = 2.3.9
FCGI_DIR = mod_fcgid-$(FCGI_VERSION)
FCGI_TAR = $(FCGI_DIR).tar.gz
FCGI_URL = https://archive.apache.org/dist/httpd/mod_fcgid/$(FCGI_TAR)
GEN = gen
INST_DIR = ../install
BLD_PREFIX = $(shell dirname $$PWD)/install
CURL_OPTS = --progress-bar
# For OS X, we drag our own PCRE lib in as the one installed is not
# recognized by the httpd configure (and pbly rightly so).
# On other OS, we expect a proper pcre installation
#
ifeq ($(OS),Darwin)
# we need our own apr + apr-util
HTTPD_CONF += --with-crypto
# we need our own pcre
HTTPD_DEPS += $(INST_DIR)/.pcre-installed
HTTPD_CONF += --with-pcre=$(BLD_PREFIX)
endif
OPENSSL_VERSION = $(shell openssl version -v | sed -e 's/OpenSSL *//g' -e 's/[a-z]* .*//g')
ifeq ($(OPENSSL_VERSION), $(filter $(OPENSSL_VERSION),0.9.7 0.9.8 1.0.0 1.0.1))
# Very old openssl without alpn support installed, need a newer one
HTTPD_DEPS += $(INST_DIR)/.openssl-installed
HTTPD_CONF += --enable-ssl --with-ssl=$(BLD_PREFIX)
ifeq ($(OS),Darwin)
OPENSSL_CONF_CMD = ./Configure
OPENSSL_CONF = darwin64-x86_64-cc
HTTPD_CONF += --enable-ssl-staticlib-deps
endif
endif
HTTP_PORT = 12345
HTTPS_PORT = 12346
all: install
distdir:
dirs:
@mkdir -p $(GEN)/build
clean:
@rm -rf $(GEN)/$(PCRE_DIR) $(GEN)/$(OPENSSL_DIR) $(GEN)/$(HTTPD_DIR) \
$(GEN)/build $(INST_DIR)/.httpd-installed
distclean:
@rm -rf $(GEN)
install: \
$(INST_DIR)/.httpd-installed \
$(INST_DIR)/.modules-installed
setup: $(INST_DIR)/.httpd-setup
copy-mod_ssl:
@cp mod_ssl-alpn/*.[ch] $(GEN)/$(HTTPD_DIR)/modules/ssl
@rm -f $(GEN)/$(HTTPD_DIR)/.httpd-built
################################################################################
# Install the local httpd
#
$(INST_DIR)/.httpd-installed: $(GEN)/$(HTTPD_DIR)/.httpd-built
@mkdir -p $(INST_DIR)
@echo -n installing httpd locally...
@cd $(GEN)/$(HTTPD_DIR)/ && make install
@echo done.
@touch $(INST_DIR)/.httpd-installed
################################################################################
# Build the local, patched httpd
#
$(GEN)/$(HTTPD_DIR)/.httpd-built: \
$(GEN)/$(HTTPD_DIR)/.httpd-configured
@echo -n building httpd...
@cd $(GEN)/$(HTTPD_DIR)/ && make
@echo done.
@touch $(GEN)/$(HTTPD_DIR)/.httpd-built
################################################################################
# Configure the local httpd sources
#
$(GEN)/$(HTTPD_DIR)/configure:
cd $(GEN)/$(HTTPD_DIR)/ && ./buildconf
$(GEN)/$(HTTPD_DIR)/.httpd-configured: \
$(HTTPD_DEPS) \
$(GEN)/$(HTTPD_DIR)/configure \
$(GEN)/$(HTTPD_DIR)/.httpd-patched
@echo -n configuring httpd...
cd $(GEN)/$(HTTPD_DIR)/ && \
./configure --prefix=$(BLD_PREFIX) $(HTTPD_CONF)
@echo done.
@touch $(GEN)/$(HTTPD_DIR)/.httpd-configured
################################################################################
# Patch the local httpd sources
#
$(GEN)/$(HTTPD_DIR)/.httpd-patched: \
$(GEN)/$(HTTPD_DIR)/.httpd-extracted
@echo applying patches...
@cd gen/$(HTTPD_DIR) && patch -p0 < ../../patches/httpd-2.4.12-alpn-v5.patch
@cd gen/$(HTTPD_DIR) && patch -p0 < ../../patches/sni_misdirect.patch
@echo httpd patched.
@touch $(GEN)/$(HTTPD_DIR)/.httpd-patched
#@cd gen/$(HTTPD_DIR) && patch -p0 < ../../patches/alpn-2.4.x.unified.diff.patch
################################################################################
# Extract apache source tree
#
$(GEN)/$(HTTPD_DIR)/.httpd-extracted: \
$(GEN)/$(HTTPD_TAR)
@rm -rf $(GEN)/$(HTTPD_DIR)
@echo -n extracting httpd packages...
@cd $(GEN) && tar xfz $(HTTPD_TAR)
@echo done.
@touch $(GEN)/$(HTTPD_DIR)/.httpd-extracted
################################################################################
# Extract apr + apr-util into apache source tree (if needed)
#
$(GEN)/$(HTTPD_DIR)/.apr-extracted: \
$(GEN)/$(HTTPD_DIR)/.httpd-extracted \
$(GEN)/$(APR_TAR) $(GEN)/$(APR-UTIL_TAR)
@rm -rf $(GEN)/$(HTTPD_DIR)/srclib/apr $(GEN)/$(HTTPD_DIR)/srclib/apr-util
@echo -n extracting apr packages...
@cd gen/$(HTTPD_DIR)/srclib; tar xfz ../../$(APR_TAR) && mv $(APR_DIR) apr
@cd gen/$(HTTPD_DIR)/srclib; tar xfz ../../$(APR-UTIL_TAR) && mv $(APR-UTIL_DIR) apr-util
@echo done.
@touch $(GEN)/$(HTTPD_DIR)/.apr-extracted
################################################################################
# Retrieve apache sources (and apr + apr-util if needed)
#
$(GEN)/$(HTTPD_TAR):
@mkdir -p $(GEN)
curl $(CURL_OPTS) $(HTTPD_URL) > $(GEN)/$(HTTPD_TAR)
$(GEN)/$(APR_TAR):
@mkdir -p $(GEN)
curl $(CURL_OPTS) $(APR_URL) > $(GEN)/$(APR_TAR)
$(GEN)/$(APR-UTIL_TAR):
@mkdir -p $(GEN)
curl $(CURL_OPTS) $(APR-UTIL_URL) > $(GEN)/$(APR-UTIL_TAR)
################################################################################
# Build + install additional modules
#
$(INST_DIR)/.modules-installed: \
$(INST_DIR)/.httpd-installed \
$(INST_DIR)/.mod_fcgid-installed
@touch $(INST_DIR)/.modules-installed
################################################################################
# Build + install mod_fcgid
#
$(INST_DIR)/.mod_fcgid-installed: \
$(INST_DIR)/.httpd-installed \
$(GEN)/$(FCGI_DIR)/.mod_fcgid-built
@echo -n installing mod_fcgid locally...
@cd $(GEN)/$(FCGI_DIR) && make install
@echo done.
@touch $(INST_DIR)/.mod_fcgid-installed
$(GEN)/$(FCGI_DIR)/.mod_fcgid-built: \
$(GEN)/$(FCGI_DIR)/.mod_fcgid-configured
@echo -n building mod_fcgid...
@cd $(GEN)/$(FCGI_DIR) && make
@echo done.
@touch $(GEN)/$(FCGI_DIR)/.mod_fcgid-built
$(GEN)/$(FCGI_DIR)/.mod_fcgid-configured: \
$(GEN)/$(FCGI_DIR)/.mod_fcgid-extracted
@echo -n configuring mod_fcgid...
@cd $(GEN)/$(FCGI_DIR) && APXS=../../$(INST_DIR)/bin/apxs ./configure.apxs
@echo done.
@touch $(GEN)/$(FCGI_DIR)/.mod_fcgid-configured
$(GEN)/$(FCGI_DIR)/.mod_fcgid-extracted: \
$(GEN)/$(FCGI_TAR)
@rm -rf $(GEN)/$(FCGI_DIR)
@echo -n downloading and extracting mod_fcgid...
@cd gen; tar xfz $(FCGI_TAR)
@echo done.
@touch $(GEN)/$(FCGI_DIR)/.mod_fcgid-extracted
$(GEN)/$(FCGI_TAR):
@mkdir -p $(GEN)
curl $(CURL_OPTS) $(FCGI_URL) > $(GEN)/$(FCGI_TAR)
################################################################################
# Build + install a local opensll library (if needed)
#
$(INST_DIR)/.openssl-installed: \
$(GEN)/$(OPENSSL_DIR)/.built
@mkdir -p $(INST_DIR)
@echo -n installing openssl locally, may take some time...
@cd $(GEN)/$(OPENSSL_DIR) && make install_sw >> ../build.log
@echo done.
@touch $(INST_DIR)/.openssl-installed
$(GEN)/$(OPENSSL_DIR)/.built: \
$(GEN)/$(OPENSSL_DIR)/.configured
@echo -n building openssl locally...
@cd $(GEN)/$(OPENSSL_DIR) && make
@echo done.
@touch $(GEN)/$(OPENSSL_DIR)/.built
$(GEN)/$(OPENSSL_DIR)/.configured: \
$(GEN)/$(OPENSSL_DIR)/.patched
@echo -n configuring openssl...
cd $(GEN)/$(OPENSSL_DIR) && $(OPENSSL_CONF_CMD) --openssldir=$(BLD_PREFIX) $(OPENSSL_CONF)
@echo done.
@touch $(GEN)/$(OPENSSL_DIR)/.configured
$(GEN)/$(OPENSSL_DIR)/.patched: \
$(GEN)/$(OPENSSL_DIR)/.extracted
@echo applying patches...
# experimental patch to solve SNI+ALPN callback ordering in openssl
# not vital with latest httpd-alpn patch. We leave this out of our sandbox
# to have it running against an unpatched ssl for better test coverage.
#@cd gen/$(OPENSSL_DIR) && patch -p1 < ../../patches/openssl-1.0.2-alpn.patch
@echo openssl patched.
@touch $(GEN)/$(OPENSSL_DIR)/.patched
$(GEN)/$(OPENSSL_DIR)/.extracted:
@echo -n downloading and extracting openssl...
@mkdir -p $(GEN)
@bash get-openssl-latest.sh $(OPENSSL_URL) $(GEN)/$(OPENSSL_DIR)
@echo done.
@touch $(GEN)/$(OPENSSL_DIR)/.extracted
################################################################################
# Build + install a local pcre library (if needed)
#
$(INST_DIR)/.pcre-installed: \
$(GEN)/$(PCRE_DIR)/.pcre-built
@mkdir -p $(INST_DIR)
@echo -n installing pcre locally...
@cd $(GEN)/$(PCRE_DIR) && make install >> ../build.log
@echo done.
@touch $(INST_DIR)/.pcre-installed
$(GEN)/$(PCRE_DIR)/.pcre-built: \
$(GEN)/$(PCRE_DIR)/.pcre-configured
@echo -n building pcre locally...
@cd $(GEN)/$(PCRE_DIR) && make >> ../build.log
@echo done.
@touch $(GEN)/$(PCRE_DIR)/.pcre-built
$(GEN)/$(PCRE_DIR)/.pcre-configured: $(GEN)/$(PCRE_TAR)
@rm -rf $(GEN)/$(PCRE_DIR)
@cd $(GEN) && tar xfz $(PCRE_TAR)
@echo -n configuring pcre...
@cd $(GEN)/$(PCRE_DIR) && ./configure --prefix=$(BLD_PREFIX) >> ../build.log
@echo done.
@touch $(GEN)/$(PCRE_DIR)/.pcre-configured
$(GEN)/$(PCRE_TAR): packages/$(PCRE_TAR)
@mkdir -p $(GEN)
@cp packages/$(PCRE_TAR) $(GEN)

View File

@@ -1,55 +0,0 @@
#!/bin/sh
# get-openssl-latest.sh
# mod-h2
#
# Created by Stefan Eissing on 24.03.15.
# Inspects the given URL for redirects and downloads tar file
# to real name. Symlinks given tar name to real name
URL=$1
DESTDIR=$2
usage() {
echo "$@"
echo "usage: $(basename $0) url dir"
echo " download and extract latest openssl url to given directory,"
echo " using real version name and symlinks"
exit 2
}
fail() {
echo "$@"
exit 1
}
[ -z "$URL" ] && usage "url parameter missing"
[ -z "$DESTDIR" ] && usage "dir parameter missing"
GEN=$(dirname "$DESTDIR")
[ -d "$GEN" ] || fail "destination dir $GEN does not exist"
curl -s -D "$GEN"/xxx-header $URL > "$GEN"/xxx-content || fail "error downloading $URL"
REAL_URL=$( fgrep -i location: < "$GEN"/xxx-header | sed s',.*: ,,' | tr -d '\r\n' )
case "$REAL_URL" in
*/var/www/*)
# currently openssl returns the wrong path - yet the correct tar name
REAL_TAR=$(basename $REAL_URL)
REAL_URL=$(dirname $URL)/$REAL_TAR
;;
*)
REAL_TAR=$(basename $REAL_URL)
;;
esac
echo "downloading latest openssl from $REAL_URL"
REAL_DIR=$(basename $REAL_TAR .tar.gz)
rm -f "$GEN/$REAL_TAR" "$DESTDIR" "$GEN"/xxx-header "$GEN"/xxx-content
curl -'#' "$REAL_URL" > "$GEN/$REAL_TAR" || fail "error downloading $REAL_URL"
(cd "$GEN" && tar xfz "$REAL_TAR") || fail "error extracting $GEN/$REAL_TAR"
[ -d "$GEN/$REAL_DIR" ] || fail "expected directory $GEN/$REAL_DIR"
(cd $GEN && ln -s "$REAL_DIR" $(basename $DESTDIR))

View File

@@ -1,25 +0,0 @@
top_srcdir = /Users/sei/projects/mod-h2/httpd/gen/httpd-2.4.10
top_builddir = /Users/sei/projects/mod-h2/httpd/gen/httpd-2.4.10
srcdir = /Users/sei/projects/mod-h2/httpd/gen/httpd-2.4.10/modules/ssl
builddir = /Users/sei/projects/mod-h2/httpd/gen/httpd-2.4.10/modules/ssl
VPATH = /Users/sei/projects/mod-h2/httpd/gen/httpd-2.4.10/modules/ssl
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# standard stuff
#
include $(top_srcdir)/build/special.mk

View File

@@ -1,327 +0,0 @@
#
# This Makefile requires the environment var OSSLSDK
# pointing to the base directory of your OpenSSL SDK.
# If you want to use the Novell NTLS SDK instead then
# define NTLSSDK pointing to the base directory of the
# SDK, and also set USE_NTLS=1
#
#
# Declare the sub-directories to be built here
#
SUBDIRS = \
$(EOLIST)
#
# Get the 'head' of the build environment. This includes default targets and
# paths to tools
#
include $(AP_WORK)/build/NWGNUhead.inc
#
# build this level's files
#
# Make sure all needed macro's are defined
#
ifeq "$(USE_NTLS)" "1"
SSL_INC = $(NTLSSDK)/inc
SSL_LIB = $(NTLSSDK)/imp
SSL_BIN = $(NTLSSDK)/bin
SSL_APP = $(NTLSSDK)/apps
ifneq "$(wildcard $(SSL_INC)/openssl/opensslv.h)" "$(SSL_INC)/openssl/opensslv.h"
$(error '$(NTLSSDK)' does NOT point to a valid NTLS SDK!)
endif
else
SSL_INC = $(OSSLSDK)/outinc_nw_libc
SSL_LIB = $(OSSLSDK)/out_nw_libc
SSL_BIN = $(OSSLSDK)/out_nw_libc
SSL_APP = $(OSSLSDK)/apps
ifneq "$(wildcard $(SSL_INC)/openssl/opensslv.h)" "$(SSL_INC)/openssl/opensslv.h"
$(error '$(OSSLSDK)' does NOT point to a valid OpenSSL SDK!)
endif
endif
#
# These directories will be at the beginning of the include list, followed by
# INCDIRS
#
XINCDIRS += \
$(SSL_INC) \
$(APR)/include \
$(APRUTIL)/include \
$(AP_WORK)/include \
$(AP_WORK)/modules/cache \
$(AP_WORK)/modules/generators \
$(AP_WORK)/server/mpm/NetWare \
$(NWOS) \
$(EOLIST)
#
# These flags will come after CFLAGS
#
XCFLAGS += \
$(EOLIST)
#
# These defines will come after DEFINES
#
XDEFINES += \
-DHAVE_OPENSSL \
$(EOLIST)
#
# These flags will be added to the link.opt file
#
XLFLAGS += \
-l $(SSL_LIB) \
$(EOLIST)
#
# These values will be appended to the correct variables based on the value of
# RELEASE
#
ifeq "$(RELEASE)" "debug"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
ifeq "$(RELEASE)" "noopt"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
ifeq "$(RELEASE)" "release"
XINCDIRS += \
$(EOLIST)
XCFLAGS += \
$(EOLIST)
XDEFINES += \
$(EOLIST)
XLFLAGS += \
$(EOLIST)
endif
#
# These are used by the link target if an NLM is being generated
# This is used by the link 'name' directive to name the nlm. If left blank
# TARGET_nlm (see below) will be used.
#
NLM_NAME = mod_ssl
#
# This is used by the link '-desc ' directive.
# If left blank, NLM_NAME will be used.
#
ifeq "$(USE_NTLS)" "1"
NLM_DESCRIPTION = Apache $(VERSION_STR) SSL module (NTLS)
else
NLM_DESCRIPTION = Apache $(VERSION_STR) SSL module (OpenSSL)
endif
#
# This is used by the '-threadname' directive. If left blank,
# NLM_NAME Thread will be used.
#
NLM_THREAD_NAME = $(NLM_NAME)
#
# If this is specified, it will override VERSION value in
# $(AP_WORK)/build/NWGNUenvironment.inc
#
NLM_VERSION =
#
# If this is specified, it will override the default of 64K
#
NLM_STACK_SIZE = 8192
#
# If this is specified it will be used by the link '-entry' directive
#
NLM_ENTRY_SYM =
#
# If this is specified it will be used by the link '-exit' directive
#
NLM_EXIT_SYM =
#
# If this is specified it will be used by the link '-check' directive
#
NLM_CHECK_SYM =
#
# If this is specified it will be used by the link '-flags' directive
#
NLM_FLAGS =
#
# If this is specified it will be linked in with the XDCData option in the def
# file instead of the default of $(NWOS)/apache.xdc. XDCData can be disabled
# by setting APACHE_UNIPROC in the environment
#
XDCDATA =
#
# Declare all target files (you must add your files here)
#
#
# If there is an NLM target, put it here
#
TARGET_nlm = \
$(OBJDIR)/$(NLM_NAME).nlm \
$(EOLIST)
#
# If there is an LIB target, put it here
#
TARGET_lib = \
$(EOLIST)
#
# These are the OBJ files needed to create the NLM target above.
# Paths must all use the '/' character
#
FILES_nlm_objs := $(patsubst %.c,$(OBJDIR)/%.o,$(wildcard *.c))
#
# These are the LIB files needed to create the NLM target above.
# These will be added as a library command in the link.opt file.
#
FILES_nlm_libs = \
$(PRELUDE) \
$(EOLIST)
ifneq "$(USE_NTLS)" "1"
FILES_nlm_libs += \
$(SSL_LIB)/crypto.lib \
$(SSL_LIB)/ssl.lib \
$(EOLIST)
endif
#
# These are the modules that the above NLM target depends on to load.
# These will be added as a module command in the link.opt file.
#
FILES_nlm_modules = \
Apache2 \
Libc \
$(EOLIST)
ifeq "$(USE_NTLS)" "1"
FILES_nlm_modules += ntls \
$(EOLIST)
endif
#
# If the nlm has a msg file, put it's path here
#
FILE_nlm_msg =
#
# If the nlm has a hlp file put it's path here
#
FILE_nlm_hlp =
#
# If this is specified, it will override $(NWOS)\copyright.txt.
#
FILE_nlm_copyright =
#
# Any additional imports go here
#
FILES_nlm_Ximports = \
@libc.imp \
@aprlib.imp \
@httpd.imp \
$(EOLIST)
# Don't link with Winsock if standard sockets are being used
ifneq "$(USE_STDSOCKETS)" "1"
FILES_nlm_Ximports += @ws2nlm.imp \
$(EOLIST)
endif
ifeq "$(USE_NTLS)" "1"
FILES_nlm_Ximports += @ntls.imp \
$(EOLIST)
else
FILES_nlm_Ximports += \
GetProcessSwitchCount \
RunningProcess \
GetSuperHighResolutionTimer \
$(EOLIST)
endif
#
# Any symbols exported to here
#
FILES_nlm_exports = \
ssl_module \
$(EOLIST)
#
# These are the OBJ files needed to create the LIB target above.
# Paths must all use the '/' character
#
FILES_lib_objs = \
$(EOLIST)
#
# implement targets and dependancies (leave this section alone)
#
libs :: $(OBJDIR) $(TARGET_lib)
nlms :: libs $(TARGET_nlm)
#
# Updated this target to create necessary directories and copy files to the
# correct place. (See $(AP_WORK)/build/NWGNUhead.inc for examples)
#
install :: nlms FORCE
$(call COPY,$(OBJDIR)/*.nlm, $(INSTALLBASE)/modules/)
$(call COPY,$(SSL_BIN)/openssl.nlm, $(INSTALLBASE)/bin/)
$(call COPY,$(SSL_APP)/openssl.cnf, $(INSTALLBASE)/bin/)
#
# Any specialized rules here
#
vpath %.c $(AP_WORK)/modules/arch/netware
#
# Include the 'tail' makefile that has targets that depend on variables defined
# in this makefile
#
include $(APBUILD)/NWGNUtail.inc

View File

@@ -1,106 +0,0 @@
SYNOPSIS
This Apache module provides strong cryptography for the Apache 2 webserver
via the Secure Sockets Layer (SSL v2/v3) and Transport Layer Security (TLS
v1) protocols by the help of the SSL/TLS implementation library OpenSSL which
is based on SSLeay from Eric A. Young and Tim J. Hudson.
The mod_ssl package was created in April 1998 by Ralf S. Engelschall
and was originally derived from software developed by Ben Laurie for
use in the Apache-SSL HTTP server project. The mod_ssl implementation
for Apache 1.3 continues to be supported by the modssl project
<http://www.modssl.org/>.
SOURCES
See the top-level LAYOUT file for file descriptions.
The source files are written in clean ANSI C and pass the ``gcc -O -g
-ggdb3 -Wall -Wshadow -Wpointer-arith -Wcast-align -Wmissing-prototypes
-Wmissing-declarations -Wnested-externs -Winline'' compiler test
(assuming `gcc' is GCC 2.95.2 or newer) without any complains. When
you make changes or additions make sure the source still passes this
compiler test.
FUNCTIONS
Inside the source code you will be confronted with the following types of
functions which can be identified by their prefixes:
ap_xxxx() ............... Apache API function
ssl_xxxx() .............. mod_ssl function
SSL_xxxx() .............. OpenSSL function (SSL library)
OpenSSL_xxxx() .......... OpenSSL function (SSL library)
X509_xxxx() ............. OpenSSL function (Crypto library)
PEM_xxxx() .............. OpenSSL function (Crypto library)
EVP_xxxx() .............. OpenSSL function (Crypto library)
RSA_xxxx() .............. OpenSSL function (Crypto library)
DATA STRUCTURES
Inside the source code you will be confronted with the following
data structures:
server_rec .............. Apache (Virtual) Server
conn_rec ................ Apache Connection
request_rec ............. Apache Request
SSLModConfig ............ mod_ssl (Global) Module Configuration
SSLSrvConfig ............ mod_ssl (Virtual) Server Configuration
SSLDirConfig ............ mod_ssl Directory Configuration
SSLConnConfig ........... mod_ssl Connection Configuration
SSLFilterRec ............ mod_ssl Filter Context
SSL_CTX ................. OpenSSL Context
SSL_METHOD .............. OpenSSL Protocol Method
SSL_CIPHER .............. OpenSSL Cipher
SSL_SESSION ............. OpenSSL Session
SSL ..................... OpenSSL Connection
BIO ..................... OpenSSL Connection Buffer
For an overview how these are related and chained together have a look at the
page in README.dsov.{fig,ps}. It contains overview diagrams for those data
structures. It's designed for DIN A4 paper size, but you can easily generate
a smaller version inside XFig by specifing a magnification on the Export
panel.
INCOMPATIBILITIES
The following intentional incompatibilities exist between mod_ssl 2.x
from Apache 1.3 and this mod_ssl version for Apache 2:
o The complete EAPI-based SSL_VENDOR stuff was removed.
o The complete EAPI-based SSL_COMPAT stuff was removed.
o The <IfDefine> variable MOD_SSL is no longer provided automatically
MAJOR CHANGES
For a complete history of changes for Apache 2 mod_ssl, see the
CHANGES file in the top-level directory. The following
is a condensed summary of the major changes were made between
mod_ssl 2.x from Apache 1.3 and this mod_ssl version for Apache 2:
o The DBM based session cache is now based on APR's DBM API only.
o The shared memory based session cache is now based on APR's APIs.
o SSL I/O is now implemented in terms of filters rather than BUFF
o Eliminated ap_global_ctx. Storing Persistant information in
process_rec->pool->user_data. The ssl_pphrase_Handle_CB() and
ssl_config_global_* () functions have an extra parameter now -
"server_rec *" - which is used to retrieve the SSLModConfigRec.
o Properly support restarts, allowing mod_ssl to be added to a server
that is already running and to change server certs/keys on restart
o Various performance enhancements
o proxy support is no longer an "extension", much of the mod_ssl core
was re-written (ssl_engine_{init,kernel,config}.c) to be generic so
it could be re-used in proxy mode.
- the optional function ssl_proxy_enable is provide for mod_proxy
to enable proxy support
- proxy support now requires 'SSLProxyEngine on' to be configured
- proxy now supports SSLProxyCARevocation{Path,File} in addition to
the original SSLProxy* directives
o per-directory SSLCACertificate{File,Path} is now thread-safe but
requires SSL_set_cert_store patch to OpenSSL
o the ssl_engine_{ds,ext}.c source files are obsolete and no longer
exist
TODO
See the top-level STATUS file for current efforts and goals.

View File

@@ -1,346 +0,0 @@
#FIG 3.2
Landscape
Center
Metric
Letter
100.00
Single
-2
1200 2
0 32 #616561
0 33 #b6b2b6
0 34 #f7f3f7
0 35 #cfcfcf
0 36 #ffffff
6 6345 2835 7155 3150
6 6345 2970 7110 3150
4 0 0 200 0 20 8 0.0000 4 120 585 6345 3105 "ssl_module")\001
-6
4 0 0 200 0 20 8 0.0000 4 120 660 6345 2970 ap_ctx_get(...,\001
-6
6 10800 2610 12240 3060
4 0 0 200 0 20 8 0.0000 4 120 1170 10800 2745 ap_get_module_config(...\001
4 0 0 200 0 20 8 0.0000 4 120 795 10800 2880 ->per_dir_config,\001
4 0 0 200 0 20 8 0.0000 4 120 585 10800 3015 &ssl_module)\001
-6
6 7920 4770 9135 4995
2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5
9135 4995 7920 4995 7920 4770 9135 4770 9135 4995
4 0 0 100 0 18 12 0.0000 4 180 1065 8010 4950 request_rec\001
-6
2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
6975 3330 7425 2520
2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
7200 4230 9450 2520
2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
7875 4905 7200 5220
2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
6750 5130 6750 4545
2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
6705 5445 7155 6120
2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
7875 4815 7200 4590
2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
9585 2565 11475 4230
2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
10170 5130 11835 4545
2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
7920 6075 9855 5400
2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
9990 5445 10935 5625
2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
10215 5310 10935 5310
2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
11925 4590 11925 5085
2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
9810 5490 9810 6840
2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
9945 5445 10935 6030
2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
8865 4725 10800 2565
2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2
675 6075 5850 6075
2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
675 6525 675 6075
2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2
1 0 1.00 60.00 120.00
5850 6075 5850 6525
2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2
900 5625 5625 5625
2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2
1125 5175 5400 5175
2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2
1350 4725 5175 4725
2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2
1575 4275 4950 4275
2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2
1800 3825 4725 3825
2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2
2025 3375 4500 3375
2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2
2250 2925 4275 2925
2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2
2475 2475 4050 2475
2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2
2700 2025 3825 2025
2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2
2925 1575 3600 1575
2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
900 6075 900 5625
2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
1125 6525 1125 5175
2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
1350 5175 1350 4725
2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
1575 4725 1575 4275
2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
1800 6525 1800 3825
2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
2025 3825 2025 3375
2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
2250 3375 2250 2925
2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
2475 2925 2475 2475
2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2
1 0 1.00 60.00 120.00
5625 5625 5625 6075
2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2
1 0 1.00 60.00 120.00
5400 5175 5400 6525
2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2
1 0 1.00 60.00 120.00
5175 4725 5175 5175
2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2
1 0 1.00 60.00 120.00
4950 4275 4950 4725
2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2
1 0 1.00 60.00 120.00
4725 3825 4725 6525
2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2
1 0 1.00 60.00 120.00
4500 3375 4500 3825
2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2
1 0 1.00 60.00 120.00
4275 2925 4275 3375
2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2
1 0 1.00 60.00 120.00
4050 2475 4050 2925
2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
2700 6525 2700 2025
2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2
1 0 1.00 60.00 120.00
3825 2025 3825 6525
2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2
1 0 1.00 60.00 120.00
3600 1575 3600 2025
2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
2925 2025 2925 1575
2 1 0 4 0 0 200 0 20 0.000 0 0 -1 1 0 2
1 1 4.00 60.00 120.00
540 6525 6300 6525
2 3 0 1 7 7 800 0 20 0.000 0 0 -1 0 0 9
675 6525 5850 6525 5850 6075 5625 6075 5625 5625 900 5625
900 6075 675 6075 675 6525
2 3 0 1 34 34 700 0 20 0.000 0 0 -1 0 0 13
1125 6525 5355 6525 5400 5175 5175 5175 5175 4725 4950 4725
4950 4275 1575 4275 1575 4725 1350 4725 1350 5175 1125 5175
1125 6525
2 3 0 1 35 35 500 0 20 0.000 0 0 -1 0 0 17
1800 6525 4725 6525 4725 3825 4500 3825 4500 3375 4275 3375
4275 2925 4050 2925 4050 2475 2475 2475 2475 2925 2250 2925
2250 3375 2025 3375 2025 3825 1800 3825 1800 6525
2 3 0 1 33 33 400 0 20 0.000 0 0 -1 0 0 9
2700 6525 3825 6525 3825 2025 3600 2025 3600 1575 2925 1575
2925 2025 2700 2025 2700 6525
2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 1 2
2 0 1.00 60.00 120.00
2 0 1.00 60.00 120.00
2700 6750 3825 6750
2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 1 2
2 0 1.00 60.00 120.00
2 0 1.00 60.00 120.00
1125 7200 5400 7200
2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 1 2
2 0 1.00 60.00 120.00
2 0 1.00 60.00 120.00
1800 6975 4725 6975
2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 1 2
2 0 1.00 60.00 120.00
2 0 1.00 60.00 120.00
675 7425 5850 7425
2 1 2 1 0 34 200 0 20 3.000 0 1 -1 0 0 2
675 6570 675 7650
2 1 2 1 0 34 200 0 20 3.000 0 1 -1 0 0 2
1125 6570 1125 7650
2 1 2 1 0 34 200 0 20 3.000 0 1 -1 0 0 2
1800 6570 1800 7650
2 1 2 1 0 34 200 0 20 3.000 0 1 -1 0 0 2
2700 6570 2700 7650
2 1 2 1 0 34 200 0 20 3.000 0 1 -1 0 0 2
3825 6570 3825 7650
2 1 2 1 0 34 200 0 20 3.000 0 1 -1 0 0 2
4725 6570 4725 7650
2 1 2 1 0 34 200 0 20 3.000 0 1 -1 0 0 2
5400 6570 5400 7650
2 1 2 1 0 34 200 0 20 3.000 0 1 -1 0 0 2
5850 6570 5850 7650
2 4 0 2 0 7 100 0 -1 0.000 0 0 20 0 0 5
12600 8550 450 8550 450 225 12600 225 12600 8550
2 4 0 1 0 34 200 0 20 0.000 0 0 20 0 0 5
12600 1350 450 1350 450 225 12600 225 12600 1350
2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5
10170 2475 8775 2475 8775 2250 10170 2250 10170 2475
2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5
11925 2475 10575 2475 10575 2250 11925 2250 11925 2475
2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5
12375 4500 11430 4500 11430 4275 12375 4275 12375 4500
2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5
12375 5400 10980 5400 10980 5175 12375 5175 12375 5400
2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5
10170 5400 9675 5400 9675 5175 10170 5175 10170 5400
2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5
7875 6300 7200 6300 7200 6075 7875 6075 7875 6300
2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5
8190 2475 6750 2475 6750 2250 8190 2250 8190 2475
2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5
7605 3600 6300 3600 6300 3375 7605 3375 7605 3600
2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5
7335 4500 6300 4500 6300 4275 7335 4275 7335 4500
2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5
7200 5400 6300 5400 6300 5175 7200 5175 7200 5400
2 1 0 6 7 7 600 0 -1 0.000 0 0 -1 0 0 2
9450 4500 6075 1935
2 1 0 6 7 7 600 0 -1 0.000 0 0 4 0 0 2
9450 4500 12465 2205
2 1 0 6 7 7 600 0 -1 0.000 0 0 4 0 0 2
9450 4500 9450 7785
2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
9630 5310 7245 5310
2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
11385 4365 7380 4365
2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5
12240 5805 10980 5805 10980 5580 12240 5580 12240 5805
2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5
12375 6210 10980 6210 10980 5985 12375 5985 12375 6210
2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
11205 6885 9900 5445
2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5
12285 7155 10530 7155 10530 6930 12285 6930 12285 7155
2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5
10170 7155 9630 7155 9630 6930 10170 6930 10170 7155
2 1 0 6 7 7 600 0 -1 0.000 0 0 4 0 0 2
12510 6435 9450 6435
2 1 0 1 0 34 300 0 20 0.000 0 0 7 1 0 4
1 1 1.00 60.00 120.00
12375 4455 12510 4635 12510 6210 11970 6885
2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
9850 5143 9175 4918
3 1 0 1 34 34 800 0 20 0.000 0 0 0 41
7380 1710 6390 2115 5535 2115 6075 3015 5670 3465 6165 3915
5715 4410 6030 5040 6030 5310 6480 5715 6390 6255 6975 6300
7065 6975 7965 6750 8100 7560 8955 7290 9360 7740 9720 7560
10755 8145 12060 8280 12375 7650 12420 7200 12510 7065 12330 6660
12510 6390 12420 5940 12375 5400 12510 5220 12510 4725 12600 4275
12375 3645 12105 3240 12150 2745 12375 2700 12330 1980 11790 1575
11250 1935 10125 1485 8955 2070 7785 1620 7695 1575
1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000
1.000
4 0 0 100 0 0 12 0.0000 4 180 1440 10575 675 Ralf S. Engelschall\001
4 0 0 100 0 18 20 0.0000 4 270 3840 4275 675 Apache+mod_ssl+OpenSSL\001
4 0 0 100 0 0 10 0.0000 4 135 1320 10575 855 rse@engelschall.com\001
4 0 0 100 0 0 10 0.0000 4 135 1410 10575 1035 www.engelschall.com\001
4 0 0 100 0 0 12 0.0000 4 135 870 900 675 Version 1.3\001
4 0 0 100 0 0 12 0.0000 4 180 1035 900 855 12-Apr-1999\001
4 0 0 200 0 20 8 0.0000 4 60 390 6210 4680 ->server\001
4 0 0 200 0 20 8 0.0000 4 120 855 8280 6120 ap_ctx_get(...,"ssl")\001
4 0 0 200 0 20 8 0.0000 4 120 1170 7740 2700 ap_get_module_config(...\001
4 0 0 200 0 20 8 0.0000 4 120 810 7740 2835 ->module_config,\001
4 0 0 200 0 20 8 0.0000 4 120 585 7740 2970 &ssl_module)\001
4 0 0 100 0 18 20 0.0000 4 270 1200 9000 8100 Chaining\001
4 0 0 100 0 18 20 0.0000 4 210 1095 2745 8100 Lifetime\001
4 0 0 100 0 18 12 0.0000 4 180 1215 810 6255 ap_global_ctx\001
4 0 0 100 0 18 12 0.0000 4 180 1305 990 5805 SSLModConfig\001
4 0 0 100 0 18 12 0.0000 4 180 840 4050 4455 SSL_CTX\001
4 0 0 100 0 18 12 0.0000 4 150 975 4455 5355 server_rec\001
4 0 0 100 0 18 12 0.0000 4 180 1260 3870 4905 SSLSrvConfig\001
4 0 0 100 0 18 12 0.0000 4 135 480 1845 4005 BUFF\001
4 0 0 100 0 18 12 0.0000 4 150 810 2070 3555 conn_rec\001
4 0 0 100 0 18 12 0.0000 4 135 345 2295 3105 BIO\001
4 0 0 100 0 18 12 0.0000 4 135 375 2565 2655 SSL\001
4 0 0 100 0 18 12 0.0000 4 180 1185 3645 1620 SSLDirConfig\001
4 0 0 100 0 18 12 0.0000 4 180 1065 3915 2070 request_rec\001
4 0 0 200 0 0 8 0.0000 4 120 1440 900 7560 Startup, Runtime, Shutdown\001
4 0 0 200 0 0 8 0.0000 4 105 975 1350 7335 Configuration Time\001
4 0 0 200 0 0 8 0.0000 4 90 1050 2025 7110 Connection Duration\001
4 0 0 200 0 0 8 0.0000 4 120 885 2835 6885 Request Duration\001
4 0 0 200 0 18 20 0.0000 4 195 90 6345 6795 t\001
4 0 0 200 0 20 8 0.0000 4 90 345 7110 5985 ->client\001
4 0 0 100 0 18 12 0.0000 4 180 1305 6795 2430 SSLModConfig\001
4 0 0 100 0 18 12 0.0000 4 180 1260 8865 2430 SSLSrvConfig\001
4 0 0 100 0 18 12 0.0000 4 180 1215 6345 3555 ap_global_ctx\001
4 0 0 100 0 18 12 0.0000 4 150 975 6345 4455 server_rec\001
4 0 0 100 0 18 12 0.0000 4 150 810 6345 5355 conn_rec\001
4 0 0 100 0 18 12 0.0000 4 135 375 9720 5355 SSL\001
4 0 0 100 0 18 12 0.0000 4 180 1185 10665 2430 SSLDirConfig\001
4 0 0 100 0 18 12 0.0000 4 135 480 7290 6255 BUFF\001
4 0 0 100 0 18 12 0.0000 4 180 1305 11025 5355 SSL_METHOD\001
4 0 0 100 0 18 12 0.0000 4 180 840 11475 4455 SSL_CTX\001
4 0 0 100 0 18 24 0.0000 4 285 4365 3915 1080 Data Structure Overview\001
4 0 0 200 0 20 8 0.0000 4 90 615 7065 5085 ->connection\001
4 0 0 200 0 20 8 0.0000 4 60 390 7065 4770 ->server\001
4 0 0 200 0 20 8 0.0000 4 120 960 8010 5445 SSL_get_app_data()\001
4 0 0 200 0 20 8 0.0000 4 120 510 10530 4050 ->pSSLCtx\001
4 0 0 200 0 20 8 0.0000 4 120 1215 7875 4275 SSL_CTX_get_app_data()\001
4 0 0 200 0 20 8 0.0000 4 120 1155 10305 5535 SSL_get_current_cipher()\001
4 0 0 100 0 18 12 0.0000 4 180 1170 11025 5760 SSL_CIPHER\001
4 0 0 100 0 18 12 0.0000 4 180 1350 10980 6165 SSL_SESSION\001
4 0 0 200 0 20 8 0.0000 4 120 840 10440 5940 SSL_get_session()\001
4 0 0 100 0 18 12 0.0000 4 180 1665 10575 7110 X509_STORE_CTX\001
4 0 0 100 0 18 12 0.0000 4 135 345 9720 7110 BIO\001
4 0 0 200 0 20 8 0.0000 4 120 840 9540 7335 SSL_get_{r,w}bio()\001
4 0 0 100 0 18 20 0.0000 4 270 1170 8730 3465 mod_ssl\001
4 0 0 100 0 18 20 0.0000 4 270 1050 8145 6750 Apache\001
4 0 0 200 0 20 8 0.0000 4 120 945 10125 4680 SSL_get_SSL_CTX()\001
4 0 0 200 0 20 8 0.0000 4 120 1170 10350 5175 SSL_get_SSL_METHOD()\001
4 0 0 200 0 20 8 0.0000 4 90 465 11745 4770 ->method\001
4 0 0 200 0 20 8 0.0000 4 120 1665 9945 6480 X509_STORE_CTX_get_app_data()\001
4 0 0 200 0 20 8 0.0000 4 120 1215 10980 6705 SSL_CTX_get_cert_store()\001
4 0 0 200 0 20 8 0.0000 4 120 1020 8280 5130 SSL_get_app_data2()\001
4 0 0 100 0 18 20 0.0000 4 270 1290 10710 7605 OpenSSL\001
4 0 0 100 0 18 12 0.0000 4 180 720 10710 7785 [Crypto]\001
4 0 0 100 0 18 20 0.0000 4 270 1290 10935 3645 OpenSSL\001
4 0 0 100 0 18 12 0.0000 4 180 495 10935 3825 [SSL]\001

File diff suppressed because it is too large Load Diff

View File

@@ -1,641 +0,0 @@
/* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* _ _
* _ __ ___ ___ __| | ___ ___| | mod_ssl
* | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL
* | | | | | | (_) | (_| | \__ \__ \ |
* |_| |_| |_|\___/ \__,_|___|___/___/_|
* |_____|
* mod_ssl.c
* Apache API interface structures
*/
#include "ssl_private.h"
#include "mod_ssl.h"
#include "util_md5.h"
#include "util_mutex.h"
#include "ap_provider.h"
#include <assert.h>
/*
* the table of configuration directives we provide
*/
#define SSL_CMD_ALL(name, args, desc) \
AP_INIT_##args("SSL"#name, ssl_cmd_SSL##name, \
NULL, RSRC_CONF|OR_AUTHCFG, desc),
#define SSL_CMD_SRV(name, args, desc) \
AP_INIT_##args("SSL"#name, ssl_cmd_SSL##name, \
NULL, RSRC_CONF, desc),
#define SSL_CMD_DIR(name, type, args, desc) \
AP_INIT_##args("SSL"#name, ssl_cmd_SSL##name, \
NULL, OR_##type, desc),
#define AP_END_CMD { NULL }
static const command_rec ssl_config_cmds[] = {
/*
* Global (main-server) context configuration directives
*/
SSL_CMD_SRV(PassPhraseDialog, TAKE1,
"SSL dialog mechanism for the pass phrase query "
"('builtin', '|/path/to/pipe_program', "
"or 'exec:/path/to/cgi_program')")
SSL_CMD_SRV(SessionCache, TAKE1,
"SSL Session Cache storage "
"('none', 'nonenotnull', 'dbm:/path/to/file')")
#if defined(HAVE_OPENSSL_ENGINE_H) && defined(HAVE_ENGINE_INIT)
SSL_CMD_SRV(CryptoDevice, TAKE1,
"SSL external Crypto Device usage "
"('builtin', '...')")
#endif
SSL_CMD_SRV(RandomSeed, TAKE23,
"SSL Pseudo Random Number Generator (PRNG) seeding source "
"('startup|connect builtin|file:/path|exec:/path [bytes]')")
/*
* Per-server context configuration directives
*/
SSL_CMD_SRV(Engine, TAKE1,
"SSL switch for the protocol engine "
"('on', 'off')")
SSL_CMD_SRV(FIPS, FLAG,
"Enable FIPS-140 mode "
"(`on', `off')")
SSL_CMD_ALL(CipherSuite, TAKE1,
"Colon-delimited list of permitted SSL Ciphers "
"('XXX:...:XXX' - see manual)")
SSL_CMD_SRV(CertificateFile, TAKE1,
"SSL Server Certificate file "
"('/path/to/file' - PEM or DER encoded)")
SSL_CMD_SRV(CertificateKeyFile, TAKE1,
"SSL Server Private Key file "
"('/path/to/file' - PEM or DER encoded)")
SSL_CMD_SRV(CertificateChainFile, TAKE1,
"SSL Server CA Certificate Chain file "
"('/path/to/file' - PEM encoded)")
#ifdef HAVE_TLS_SESSION_TICKETS
SSL_CMD_SRV(SessionTicketKeyFile, TAKE1,
"TLS session ticket encryption/decryption key file (RFC 5077) "
"('/path/to/file' - file with 48 bytes of random data)")
#endif
SSL_CMD_ALL(CACertificatePath, TAKE1,
"SSL CA Certificate path "
"('/path/to/dir' - contains PEM encoded files)")
SSL_CMD_ALL(CACertificateFile, TAKE1,
"SSL CA Certificate file "
"('/path/to/file' - PEM encoded)")
SSL_CMD_SRV(CADNRequestPath, TAKE1,
"SSL CA Distinguished Name path "
"('/path/to/dir' - symlink hashes to PEM of acceptable CA names to request)")
SSL_CMD_SRV(CADNRequestFile, TAKE1,
"SSL CA Distinguished Name file "
"('/path/to/file' - PEM encoded to derive acceptable CA names to request)")
SSL_CMD_SRV(CARevocationPath, TAKE1,
"SSL CA Certificate Revocation List (CRL) path "
"('/path/to/dir' - contains PEM encoded files)")
SSL_CMD_SRV(CARevocationFile, TAKE1,
"SSL CA Certificate Revocation List (CRL) file "
"('/path/to/file' - PEM encoded)")
SSL_CMD_SRV(CARevocationCheck, TAKE1,
"SSL CA Certificate Revocation List (CRL) checking mode")
SSL_CMD_ALL(VerifyClient, TAKE1,
"SSL Client verify type "
"('none', 'optional', 'require', 'optional_no_ca')")
SSL_CMD_ALL(VerifyDepth, TAKE1,
"SSL Client verify depth "
"('N' - number of intermediate certificates)")
SSL_CMD_SRV(SessionCacheTimeout, TAKE1,
"SSL Session Cache object lifetime "
"('N' - number of seconds)")
#ifdef HAVE_TLSV1_X
#define SSL_PROTOCOLS "SSLv3|TLSv1|TLSv1.1|TLSv1.2"
#else
#define SSL_PROTOCOLS "SSLv3|TLSv1"
#endif
SSL_CMD_SRV(Protocol, RAW_ARGS,
"Enable or disable various SSL protocols "
"('[+-][" SSL_PROTOCOLS "] ...' - see manual)")
SSL_CMD_SRV(HonorCipherOrder, FLAG,
"Use the server's cipher ordering preference")
SSL_CMD_SRV(Compression, FLAG,
"Enable SSL level compression "
"(`on', `off')")
SSL_CMD_SRV(InsecureRenegotiation, FLAG,
"Enable support for insecure renegotiation")
SSL_CMD_ALL(UserName, TAKE1,
"Set user name to SSL variable value")
SSL_CMD_SRV(StrictSNIVHostCheck, FLAG,
"Strict SNI virtual host checking")
#ifdef HAVE_SRP
SSL_CMD_SRV(SRPVerifierFile, TAKE1,
"SRP verifier file "
"('/path/to/file' - created by srptool)")
SSL_CMD_SRV(SRPUnknownUserSeed, TAKE1,
"SRP seed for unknown users (to avoid leaking a user's existence) "
"('some secret text')")
#endif
/*
* Proxy configuration for remote SSL connections
*/
SSL_CMD_SRV(ProxyEngine, FLAG,
"SSL switch for the proxy protocol engine "
"('on', 'off')")
SSL_CMD_SRV(ProxyProtocol, RAW_ARGS,
"SSL Proxy: enable or disable SSL protocol flavors "
"('[+-][" SSL_PROTOCOLS "] ...' - see manual)")
SSL_CMD_SRV(ProxyCipherSuite, TAKE1,
"SSL Proxy: colon-delimited list of permitted SSL ciphers "
"('XXX:...:XXX' - see manual)")
SSL_CMD_SRV(ProxyVerify, TAKE1,
"SSL Proxy: whether to verify the remote certificate "
"('on' or 'off')")
SSL_CMD_SRV(ProxyVerifyDepth, TAKE1,
"SSL Proxy: maximum certificate verification depth "
"('N' - number of intermediate certificates)")
SSL_CMD_SRV(ProxyCACertificateFile, TAKE1,
"SSL Proxy: file containing server certificates "
"('/path/to/file' - PEM encoded certificates)")
SSL_CMD_SRV(ProxyCACertificatePath, TAKE1,
"SSL Proxy: directory containing server certificates "
"('/path/to/dir' - contains PEM encoded certificates)")
SSL_CMD_SRV(ProxyCARevocationPath, TAKE1,
"SSL Proxy: CA Certificate Revocation List (CRL) path "
"('/path/to/dir' - contains PEM encoded files)")
SSL_CMD_SRV(ProxyCARevocationFile, TAKE1,
"SSL Proxy: CA Certificate Revocation List (CRL) file "
"('/path/to/file' - PEM encoded)")
SSL_CMD_SRV(ProxyCARevocationCheck, TAKE1,
"SSL Proxy: CA Certificate Revocation List (CRL) checking mode")
SSL_CMD_SRV(ProxyMachineCertificateFile, TAKE1,
"SSL Proxy: file containing client certificates "
"('/path/to/file' - PEM encoded certificates)")
SSL_CMD_SRV(ProxyMachineCertificatePath, TAKE1,
"SSL Proxy: directory containing client certificates "
"('/path/to/dir' - contains PEM encoded certificates)")
SSL_CMD_SRV(ProxyMachineCertificateChainFile, TAKE1,
"SSL Proxy: file containing issuing certificates "
"of the client certificate "
"(`/path/to/file' - PEM encoded certificates)")
SSL_CMD_SRV(ProxyCheckPeerExpire, FLAG,
"SSL Proxy: check the peer certificate's expiration date")
SSL_CMD_SRV(ProxyCheckPeerCN, FLAG,
"SSL Proxy: check the peer certificate's CN")
SSL_CMD_SRV(ProxyCheckPeerName, FLAG,
"SSL Proxy: check the peer certificate's name "
"(must be present in subjectAltName extension or CN")
/*
* Per-directory context configuration directives
*/
SSL_CMD_DIR(Options, OPTIONS, RAW_ARGS,
"Set one or more options to configure the SSL engine"
"('[+-]option[=value] ...' - see manual)")
SSL_CMD_DIR(RequireSSL, AUTHCFG, NO_ARGS,
"Require the SSL protocol for the per-directory context "
"(no arguments)")
SSL_CMD_DIR(Require, AUTHCFG, RAW_ARGS,
"Require a boolean expression to evaluate to true for granting access"
"(arbitrary complex boolean expression - see manual)")
SSL_CMD_DIR(RenegBufferSize, AUTHCFG, TAKE1,
"Configure the amount of memory that will be used for buffering the "
"request body if a per-location SSL renegotiation is required due to "
"changed access control requirements")
SSL_CMD_SRV(OCSPEnable, FLAG,
"Enable use of OCSP to verify certificate revocation ('on', 'off')")
SSL_CMD_SRV(OCSPDefaultResponder, TAKE1,
"URL of the default OCSP Responder")
SSL_CMD_SRV(OCSPOverrideResponder, FLAG,
"Force use of the default responder URL ('on', 'off')")
SSL_CMD_SRV(OCSPResponseTimeSkew, TAKE1,
"Maximum time difference in OCSP responses")
SSL_CMD_SRV(OCSPResponseMaxAge, TAKE1,
"Maximum age of OCSP responses")
SSL_CMD_SRV(OCSPResponderTimeout, TAKE1,
"OCSP responder query timeout")
SSL_CMD_SRV(OCSPUseRequestNonce, FLAG,
"Whether OCSP queries use a nonce or not ('on', 'off')")
#ifdef HAVE_OCSP_STAPLING
/*
* OCSP Stapling options
*/
SSL_CMD_SRV(StaplingCache, TAKE1,
"SSL Stapling Response Cache storage "
"(`dbm:/path/to/file')")
SSL_CMD_SRV(UseStapling, FLAG,
"SSL switch for the OCSP Stapling protocol " "(`on', `off')")
SSL_CMD_SRV(StaplingResponseTimeSkew, TAKE1,
"SSL stapling option for maximum time difference in OCSP responses")
SSL_CMD_SRV(StaplingResponderTimeout, TAKE1,
"SSL stapling option for OCSP responder timeout")
SSL_CMD_SRV(StaplingResponseMaxAge, TAKE1,
"SSL stapling option for maximum age of OCSP responses")
SSL_CMD_SRV(StaplingStandardCacheTimeout, TAKE1,
"SSL stapling option for normal OCSP Response Cache Lifetime")
SSL_CMD_SRV(StaplingReturnResponderErrors, FLAG,
"SSL stapling switch to return Status Errors Back to Client"
"(`on', `off')")
SSL_CMD_SRV(StaplingFakeTryLater, FLAG,
"SSL stapling switch to send tryLater response to client on error "
"(`on', `off')")
SSL_CMD_SRV(StaplingErrorCacheTimeout, TAKE1,
"SSL stapling option for OCSP Response Error Cache Lifetime")
SSL_CMD_SRV(StaplingForceURL, TAKE1,
"SSL stapling option to Force the OCSP Stapling URL")
#endif
#ifdef HAVE_SSL_CONF_CMD
SSL_CMD_SRV(OpenSSLConfCmd, TAKE2,
"OpenSSL configuration command")
#endif
#if defined(HAVE_ALPN_NPN) || defined(HAVE_TLS_NPN)
SSL_CMD_SRV(AlpnPreference, ITERATE,
"Preference in Application-Layer Protocol Negotiation (ALPN), "
"protocols are chosed in the specified order")
#endif
/* Deprecated directives. */
AP_INIT_RAW_ARGS("SSLLog", ap_set_deprecated, NULL, OR_ALL,
"SSLLog directive is no longer supported - use ErrorLog."),
AP_INIT_RAW_ARGS("SSLLogLevel", ap_set_deprecated, NULL, OR_ALL,
"SSLLogLevel directive is no longer supported - use LogLevel."),
AP_END_CMD
};
/*
* the various processing hooks
*/
static apr_status_t ssl_cleanup_pre_config(void *data)
{
/*
* Try to kill the internals of the SSL library.
*/
/* Corresponds to OPENSSL_load_builtin_modules():
* XXX: borrowed from apps.h, but why not CONF_modules_free()
* which also invokes CONF_modules_finish()?
*/
CONF_modules_unload(1);
/* Corresponds to SSL_library_init: */
EVP_cleanup();
#if HAVE_ENGINE_LOAD_BUILTIN_ENGINES
ENGINE_cleanup();
#endif
ERR_remove_state(0);
/* Don't call ERR_free_strings here; ERR_load_*_strings only
* actually load the error strings once per process due to static
* variable abuse in OpenSSL. */
/* Also don't call CRYPTO_cleanup_all_ex_data here; any registered
* ex_data indices may have been cached in static variables in
* OpenSSL; removing them may cause havoc. Notably, with OpenSSL
* versions >= 0.9.8f, COMP_CTX cleanups would not be run, which
* could result in a per-connection memory leak (!). */
/*
* TODO: determine somewhere we can safely shove out diagnostics
* (when enabled) at this late stage in the game:
* CRYPTO_mem_leaks_fp(stderr);
*/
return APR_SUCCESS;
}
static int ssl_hook_pre_config(apr_pool_t *pconf,
apr_pool_t *plog,
apr_pool_t *ptemp)
{
/* We must register the library in full, to ensure our configuration
* code can successfully test the SSL environment.
*/
CRYPTO_malloc_init();
ERR_load_crypto_strings();
SSL_load_error_strings();
SSL_library_init();
#if HAVE_ENGINE_LOAD_BUILTIN_ENGINES
ENGINE_load_builtin_engines();
#endif
OpenSSL_add_all_algorithms();
OPENSSL_load_builtin_modules();
/*
* Let us cleanup the ssl library when the module is unloaded
*/
apr_pool_cleanup_register(pconf, NULL, ssl_cleanup_pre_config,
apr_pool_cleanup_null);
/* Register us to handle mod_log_config %c/%x variables */
ssl_var_log_config_register(pconf);
/* Register to handle mod_status status page generation */
ssl_scache_status_register(pconf);
/* Register mutex type names so they can be configured with Mutex */
ap_mutex_register(pconf, SSL_CACHE_MUTEX_TYPE, NULL, APR_LOCK_DEFAULT, 0);
#ifdef HAVE_OCSP_STAPLING
ap_mutex_register(pconf, SSL_STAPLING_MUTEX_TYPE, NULL, APR_LOCK_DEFAULT, 0);
#endif
return OK;
}
static SSLConnRec *ssl_init_connection_ctx(conn_rec *c)
{
SSLConnRec *sslconn = myConnConfig(c);
if (sslconn) {
return sslconn;
}
sslconn = apr_pcalloc(c->pool, sizeof(*sslconn));
sslconn->server = c->base_server;
sslconn->verify_depth = UNSET;
myConnConfigSet(c, sslconn);
return sslconn;
}
int ssl_proxy_enable(conn_rec *c)
{
SSLSrvConfigRec *sc;
SSLConnRec *sslconn = ssl_init_connection_ctx(c);
sc = mySrvConfig(sslconn->server);
if (!sc->proxy_enabled) {
ap_log_cerror(APLOG_MARK, APLOG_ERR, 0, c, APLOGNO(01961)
"SSL Proxy requested for %s but not enabled "
"[Hint: SSLProxyEngine]", sc->vhost_id);
return 0;
}
sslconn->is_proxy = 1;
sslconn->disabled = 0;
return 1;
}
int ssl_engine_disable(conn_rec *c)
{
SSLSrvConfigRec *sc;
SSLConnRec *sslconn = myConnConfig(c);
if (sslconn) {
sc = mySrvConfig(sslconn->server);
}
else {
sc = mySrvConfig(c->base_server);
}
if (sc->enabled == SSL_ENABLED_FALSE) {
return 0;
}
sslconn = ssl_init_connection_ctx(c);
sslconn->disabled = 1;
return 1;
}
static int modssl_register_alpn(conn_rec *c,
ssl_alpn_propose_protos advertisefn,
ssl_alpn_proto_negotiated negotiatedfn)
{
#if defined(HAVE_ALPN_NPN) || defined(HAVE_TLS_NPN)
SSLConnRec *sslconn = myConnConfig(c);
if (!sslconn) {
return DECLINED;
}
if (!sslconn->alpn_proposefns) {
sslconn->alpn_proposefns =
apr_array_make(c->pool, 5, sizeof(ssl_alpn_propose_protos));
sslconn->alpn_negofns =
apr_array_make(c->pool, 5, sizeof(ssl_alpn_proto_negotiated));
}
if (advertisefn)
APR_ARRAY_PUSH(sslconn->alpn_proposefns, ssl_alpn_propose_protos) =
advertisefn;
if (negotiatedfn)
APR_ARRAY_PUSH(sslconn->alpn_negofns, ssl_alpn_proto_negotiated) =
negotiatedfn;
return OK;
#else
return DECLINED;
#endif
}
int ssl_init_ssl_connection(conn_rec *c, request_rec *r)
{
SSLSrvConfigRec *sc;
SSL *ssl;
SSLConnRec *sslconn = myConnConfig(c);
char *vhost_md5;
modssl_ctx_t *mctx;
server_rec *server;
if (!sslconn) {
sslconn = ssl_init_connection_ctx(c);
}
server = sslconn->server;
sc = mySrvConfig(server);
/*
* Seed the Pseudo Random Number Generator (PRNG)
*/
ssl_rand_seed(server, c->pool, SSL_RSCTX_CONNECT, "");
mctx = sslconn->is_proxy ? sc->proxy : sc->server;
/*
* Create a new SSL connection with the configured server SSL context and
* attach this to the socket. Additionally we register this attachment
* so we can detach later.
*/
if (!(ssl = SSL_new(mctx->ssl_ctx))) {
ap_log_cerror(APLOG_MARK, APLOG_ERR, 0, c, APLOGNO(01962)
"Unable to create a new SSL connection from the SSL "
"context");
ssl_log_ssl_error(SSLLOG_MARK, APLOG_ERR, server);
c->aborted = 1;
return DECLINED; /* XXX */
}
vhost_md5 = ap_md5_binary(c->pool, (unsigned char *)sc->vhost_id,
sc->vhost_id_len);
if (!SSL_set_session_id_context(ssl, (unsigned char *)vhost_md5,
APR_MD5_DIGESTSIZE*2))
{
ap_log_cerror(APLOG_MARK, APLOG_ERR, 0, c, APLOGNO(01963)
"Unable to set session id context to '%s'", vhost_md5);
ssl_log_ssl_error(SSLLOG_MARK, APLOG_ERR, server);
c->aborted = 1;
return DECLINED; /* XXX */
}
SSL_set_app_data(ssl, c);
SSL_set_app_data2(ssl, NULL); /* will be request_rec */
sslconn->ssl = ssl;
SSL_set_verify_result(ssl, X509_V_OK);
ssl_io_filter_init(c, r, ssl);
return APR_SUCCESS;
}
static const char *ssl_hook_http_scheme(const request_rec *r)
{
SSLSrvConfigRec *sc = mySrvConfig(r->server);
if (sc->enabled == SSL_ENABLED_FALSE || sc->enabled == SSL_ENABLED_OPTIONAL) {
return NULL;
}
return "https";
}
static apr_port_t ssl_hook_default_port(const request_rec *r)
{
SSLSrvConfigRec *sc = mySrvConfig(r->server);
if (sc->enabled == SSL_ENABLED_FALSE || sc->enabled == SSL_ENABLED_OPTIONAL) {
return 0;
}
return 443;
}
static int ssl_hook_pre_connection(conn_rec *c, void *csd)
{
SSLSrvConfigRec *sc;
SSLConnRec *sslconn = myConnConfig(c);
if (sslconn) {
sc = mySrvConfig(sslconn->server);
}
else {
sc = mySrvConfig(c->base_server);
}
/*
* Immediately stop processing if SSL is disabled for this connection
*/
if (!(sc && (sc->enabled == SSL_ENABLED_TRUE ||
(sslconn && sslconn->is_proxy))))
{
return DECLINED;
}
/*
* Create SSL context
*/
if (!sslconn) {
sslconn = ssl_init_connection_ctx(c);
}
if (sslconn->disabled) {
return DECLINED;
}
/*
* Remember the connection information for
* later access inside callback functions
*/
ap_log_cerror(APLOG_MARK, APLOG_INFO, 0, c, APLOGNO(01964)
"Connection to child %ld established "
"(server %s)", c->id, sc->vhost_id);
return ssl_init_ssl_connection(c, NULL);
}
/*
* the module registration phase
*/
static void ssl_register_hooks(apr_pool_t *p)
{
/* ssl_hook_ReadReq needs to use the BrowserMatch settings so must
* run after mod_setenvif's post_read_request hook. */
static const char *pre_prr[] = { "mod_setenvif.c", NULL };
ssl_io_filter_register(p);
ap_hook_pre_connection(ssl_hook_pre_connection,NULL,NULL, APR_HOOK_MIDDLE);
ap_hook_test_config (ssl_hook_ConfigTest, NULL,NULL, APR_HOOK_MIDDLE);
ap_hook_post_config (ssl_init_Module, NULL,NULL, APR_HOOK_MIDDLE);
ap_hook_http_scheme (ssl_hook_http_scheme, NULL,NULL, APR_HOOK_MIDDLE);
ap_hook_default_port (ssl_hook_default_port, NULL,NULL, APR_HOOK_MIDDLE);
ap_hook_pre_config (ssl_hook_pre_config, NULL,NULL, APR_HOOK_MIDDLE);
ap_hook_child_init (ssl_init_Child, NULL,NULL, APR_HOOK_MIDDLE);
ap_hook_check_authn (ssl_hook_UserCheck, NULL,NULL, APR_HOOK_FIRST,
AP_AUTH_INTERNAL_PER_CONF);
ap_hook_fixups (ssl_hook_Fixup, NULL,NULL, APR_HOOK_MIDDLE);
ap_hook_check_access (ssl_hook_Access, NULL,NULL, APR_HOOK_MIDDLE,
AP_AUTH_INTERNAL_PER_CONF);
ap_hook_check_authz (ssl_hook_Auth, NULL,NULL, APR_HOOK_MIDDLE,
AP_AUTH_INTERNAL_PER_CONF);
ap_hook_post_read_request(ssl_hook_ReadReq, pre_prr,NULL, APR_HOOK_MIDDLE);
ssl_var_register(p);
APR_REGISTER_OPTIONAL_FN(ssl_proxy_enable);
APR_REGISTER_OPTIONAL_FN(ssl_engine_disable);
APR_REGISTER_OPTIONAL_FN(modssl_register_alpn);
ap_register_auth_provider(p, AUTHZ_PROVIDER_GROUP, "ssl",
AUTHZ_PROVIDER_VERSION,
&ssl_authz_provider_require_ssl,
AP_AUTH_INTERNAL_PER_CONF);
ap_register_auth_provider(p, AUTHZ_PROVIDER_GROUP, "ssl-verify-client",
AUTHZ_PROVIDER_VERSION,
&ssl_authz_provider_verify_client,
AP_AUTH_INTERNAL_PER_CONF);
}
module AP_MODULE_DECLARE_DATA ssl_module = {
STANDARD20_MODULE_STUFF,
ssl_config_perdir_create, /* create per-dir config structures */
ssl_config_perdir_merge, /* merge per-dir config structures */
ssl_config_server_create, /* create per-server config structures */
ssl_config_server_merge, /* merge per-server config structures */
ssl_config_cmds, /* table of configuration directives */
ssl_register_hooks /* register hooks */
};

View File

@@ -1,195 +0,0 @@
# Microsoft Developer Studio Project File - Name="mod_ssl" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=mod_ssl - Win32 Release
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "mod_ssl.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "mod_ssl.mak" CFG="mod_ssl - Win32 Release"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "mod_ssl - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "mod_ssl - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe
!IF "$(CFG)" == "mod_ssl - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MD /W3 /O2 /Oy- /Zi /I "../../include" /I "../generators" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /I "../../srclib/openssl/inc32" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "NO_IDEA" /D "NO_RC5" /D "NO_MDC2" /D "OPENSSL_NO_IDEA" /D "OPENSSL_NO_RC5" /D "OPENSSL_NO_MDC2" /D "HAVE_OPENSSL" /D "HAVE_SSL_SET_STATE" /D "HAVE_OPENSSL_ENGINE_H" /D "HAVE_ENGINE_INIT" /D "HAVE_ENGINE_LOAD_BUILTIN_ENGINES" /Fd"Release\mod_ssl_src" /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /fo"Release/mod_ssl.res" /i "../../include" /i "../../srclib/apr/include" /d "NDEBUG" /d BIN_NAME="mod_ssl.so" /d LONG_NAME="proxy_ssl_module for Apache"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:".\Release\mod_ssl.so" /base:@..\..\os\win32\BaseAddr.ref,mod_ssl.so
# ADD LINK32 kernel32.lib user32.lib wsock32.lib ws2_32.lib advapi32.lib gdi32.lib libeay32.lib ssleay32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:".\Release\mod_ssl.so" /libpath:"../../srclib/openssl/out32dll" /libpath:"../../srclib/openssl/out32" /base:@..\..\os\win32\BaseAddr.ref,mod_ssl.so /opt:ref
# Begin Special Build Tool
TargetPath=.\Release\mod_ssl.so
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ELSEIF "$(CFG)" == "mod_ssl - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c
# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../generators" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /I "../../srclib/openssl/inc32" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "NO_IDEA" /D "NO_RC5" /D "NO_MDC2" /D "OPENSSL_NO_IDEA" /D "OPENSSL_NO_RC5" /D "OPENSSL_NO_MDC2" /D "HAVE_OPENSSL" /D "HAVE_SSL_SET_STATE" /D "HAVE_OPENSSL_ENGINE_H" /D "HAVE_ENGINE_INIT" /D "HAVE_ENGINE_LOAD_BUILTIN_ENGINES" /Fd"Debug\mod_ssl_src" /FD /c
# ADD BASE MTL /nologo /D "_DEBUG" /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /fo"Debug/mod_ssl.res" /i "../../include" /i "../../srclib/apr/include" /d "_DEBUG" /d BIN_NAME="mod_ssl.so" /d LONG_NAME="proxy_ssl_module for Apache"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:".\Debug\mod_ssl.so" /base:@..\..\os\win32\BaseAddr.ref,mod_ssl.so
# ADD LINK32 kernel32.lib user32.lib wsock32.lib ws2_32.lib advapi32.lib gdi32.lib libeay32.lib ssleay32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:".\Debug\mod_ssl.so" /libpath:"../../srclib/openssl/out32dll.dbg" /libpath:"../../srclib/openssl/out32.dbg" /libpath:"../../srclib/openssl/out32dll" /libpath:"../../srclib/openssl/out32" /base:@..\..\os\win32\BaseAddr.ref,mod_ssl.so
# Begin Special Build Tool
TargetPath=.\Debug\mod_ssl.so
SOURCE="$(InputPath)"
PostBuild_Desc=Embed .manifest
PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2
# End Special Build Tool
!ENDIF
# Begin Target
# Name "mod_ssl - Win32 Release"
# Name "mod_ssl - Win32 Debug"
# Begin Group "Source Files"
# PROP Default_Filter "*.c"
# Begin Source File
SOURCE=.\mod_ssl.c
# End Source File
# Begin Source File
SOURCE=.\ssl_engine_config.c
# End Source File
# Begin Source File
SOURCE=.\ssl_engine_init.c
# End Source File
# Begin Source File
SOURCE=.\ssl_engine_io.c
# End Source File
# Begin Source File
SOURCE=.\ssl_engine_kernel.c
# End Source File
# Begin Source File
SOURCE=.\ssl_engine_log.c
# End Source File
# Begin Source File
SOURCE=.\ssl_engine_mutex.c
# End Source File
# Begin Source File
SOURCE=.\ssl_engine_pphrase.c
# End Source File
# Begin Source File
SOURCE=.\ssl_engine_rand.c
# End Source File
# Begin Source File
SOURCE=.\ssl_engine_vars.c
# End Source File
# Begin Source File
SOURCE=.\ssl_engine_ocsp.c
# End Source File
# Begin Source File
SOURCE=.\ssl_util_ocsp.c
# End Source File
# Begin Source File
SOURCE=.\ssl_scache.c
# End Source File
# Begin Source File
SOURCE=.\ssl_util_stapling.c
# End Source File
# Begin Source File
SOURCE=.\ssl_util.c
# End Source File
# Begin Source File
SOURCE=.\ssl_util_ssl.c
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "*.h"
# Begin Source File
SOURCE=.\mod_ssl.h
# End Source File
# Begin Source File
SOURCE=.\ssl_private.h
# End Source File
# Begin Source File
SOURCE=.\ssl_util_ssl.h
# End Source File
# Begin Source File
SOURCE=.\ssl_util_table.h
# End Source File
# End Group
# Begin Source File
SOURCE=..\..\build\win32\httpd.rc
# End Source File
# End Target
# End Project

Some files were not shown because too many files have changed in this diff Show More