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:
3
CHANGES
3
CHANGES
@@ -1,6 +1,9 @@
|
|||||||
-*- coding: utf-8 -*-
|
-*- coding: utf-8 -*-
|
||||||
Changes with Apache 2.5.0
|
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
|
*) mod_reqtimeout: Don't let pipelining checks and keep-alive times interfere
|
||||||
with the timeouts computed for subsequent requests. PR 56729.
|
with the timeouts computed for subsequent requests. PR 56729.
|
||||||
[Eric Covener, Yann Ylavic]
|
[Eric Covener, Yann Ylavic]
|
||||||
|
121
acinclude.m4
121
acinclude.m4
@@ -678,6 +678,127 @@ case $host in
|
|||||||
esac
|
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
|
||||||
dnl APACHE_EXPORT_ARGUMENTS
|
dnl APACHE_EXPORT_ARGUMENTS
|
||||||
dnl Export (via APACHE_SUBST) the various path-related variables that
|
dnl Export (via APACHE_SUBST) the various path-related variables that
|
||||||
|
12
docs/conf/extra/httpd-h2.conf.in
Normal file
12
docs/conf/extra/httpd-h2.conf.in
Normal 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>
|
@@ -426,3 +426,6 @@ SSLRandomSeed connect builtin
|
|||||||
#RequestHeader unset DNT env=bad_DNT
|
#RequestHeader unset DNT env=bad_DNT
|
||||||
#</IfModule>
|
#</IfModule>
|
||||||
|
|
||||||
|
# h2/h2c (HTTP/2) connections
|
||||||
|
#Include @rel_sysconfdir@/extra/httpd-h2.conf
|
||||||
|
|
||||||
|
@@ -53,6 +53,7 @@
|
|||||||
<modulefile>mod_file_cache.xml</modulefile>
|
<modulefile>mod_file_cache.xml</modulefile>
|
||||||
<modulefile>mod_filter.xml</modulefile>
|
<modulefile>mod_filter.xml</modulefile>
|
||||||
<modulefile>mod_firehose.xml</modulefile>
|
<modulefile>mod_firehose.xml</modulefile>
|
||||||
|
<modulefile>mod_h2.xml</modulefile>
|
||||||
<modulefile>mod_headers.xml</modulefile>
|
<modulefile>mod_headers.xml</modulefile>
|
||||||
<modulefile>mod_heartbeat.xml</modulefile>
|
<modulefile>mod_heartbeat.xml</modulefile>
|
||||||
<modulefile>mod_heartmonitor.xml</modulefile>
|
<modulefile>mod_heartmonitor.xml</modulefile>
|
||||||
|
5
docs/manual/mod/mod_h2.html
Normal file
5
docs/manual/mod/mod_h2.html
Normal 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
|
409
docs/manual/mod/mod_h2.html.en
Normal file
409
docs/manual/mod/mod_h2.html.en
Normal 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="<-" alt="<-" src="../images/left.gif" /></a></div>
|
||||||
|
<div id="path">
|
||||||
|
<a href="http://www.apache.org/">Apache</a> > <a href="http://httpd.apache.org/">HTTP Server</a> > <a href="http://httpd.apache.org/docs/">Documentation</a> > <a href="../">Version 2.5</a> > <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"> en </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"><VirtualHost></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"><VirtualHost></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"><VirtualHost _default_:443>
|
||||||
|
H2Engine on
|
||||||
|
#...
|
||||||
|
</VirtualHost></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"> en </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&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
416
docs/manual/mod/mod_h2.xml
Normal 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">
|
||||||
|
<VirtualHost _default_:443>
|
||||||
|
H2Engine on
|
||||||
|
#...
|
||||||
|
</VirtualHost>
|
||||||
|
</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>
|
12
docs/manual/mod/mod_h2.xml.meta
Normal file
12
docs/manual/mod/mod_h2.xml.meta
Normal 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>
|
@@ -497,7 +497,21 @@ media type in the HTTP Content-Type header field</td></tr>
|
|||||||
will exit.</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
|
<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>
|
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>]
|
<var>header</var> [[expr=]<var>value</var> [<var>replacement</var>]
|
||||||
[early|env=[!]<var>varname</var>|expr=<var>expression</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>
|
</a></td><td></td><td>svdh</td><td>E</td></tr><tr><td class="descr" colspan="4">Configure HTTP response headers</td></tr>
|
||||||
|
@@ -41,6 +41,9 @@ generators/
|
|||||||
http/
|
http/
|
||||||
This directory houses modules that basic HTTP protocol implementation.
|
This directory houses modules that basic HTTP protocol implementation.
|
||||||
|
|
||||||
|
http2/
|
||||||
|
This directory houses modules that provide HTTP/2 protocol implementation.
|
||||||
|
|
||||||
loggers/
|
loggers/
|
||||||
This directory houses modules that handle logging functions.
|
This directory houses modules that handle logging functions.
|
||||||
|
|
||||||
|
@@ -1 +0,0 @@
|
|||||||
Stefan Eissing <stefan.eissing at greenbytes.de>
|
|
@@ -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
|
|
@@ -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.
|
|
||||||
|
|
||||||
|
|
@@ -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.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@@ -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.
|
|
@@ -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
|
|
@@ -1 +0,0 @@
|
|||||||
See README.md
|
|
57
modules/http2/README.h2
Normal file
57
modules/http2/README.h2
Normal 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
|
||||||
|
|
@@ -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
|
|
@@ -14,44 +14,52 @@ dnl See the License for the specific language governing permissions and
|
|||||||
dnl limitations under the License.
|
dnl limitations under the License.
|
||||||
|
|
||||||
dnl # start of module specific part
|
dnl # start of module specific part
|
||||||
APACHE_MODPATH_INIT(ssl)
|
APACHE_MODPATH_INIT(http2)
|
||||||
|
|
||||||
dnl # list of module object files
|
dnl # list of module object files
|
||||||
ssl_objs="dnl
|
h2_objs="dnl
|
||||||
mod_ssl.lo dnl
|
mod_h2.lo dnl
|
||||||
ssl_engine_config.lo dnl
|
h2_alpn.lo dnl
|
||||||
ssl_engine_init.lo dnl
|
h2_alt_svc.lo dnl
|
||||||
ssl_engine_io.lo dnl
|
h2_config.lo dnl
|
||||||
ssl_engine_kernel.lo dnl
|
h2_conn.lo dnl
|
||||||
ssl_engine_log.lo dnl
|
h2_conn_io.lo dnl
|
||||||
ssl_engine_mutex.lo dnl
|
h2_ctx.lo dnl
|
||||||
ssl_engine_pphrase.lo dnl
|
h2_from_h1.lo dnl
|
||||||
ssl_engine_rand.lo dnl
|
h2_h2.lo dnl
|
||||||
ssl_engine_vars.lo dnl
|
h2_io.lo dnl
|
||||||
ssl_scache.lo dnl
|
h2_io_set.lo dnl
|
||||||
ssl_util_stapling.lo dnl
|
h2_mplx.lo dnl
|
||||||
ssl_util.lo dnl
|
h2_request.lo dnl
|
||||||
ssl_util_ssl.lo dnl
|
h2_response.lo dnl
|
||||||
ssl_engine_ocsp.lo dnl
|
h2_session.lo dnl
|
||||||
ssl_util_ocsp.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, [
|
dnl # hook module into the Autoconf mechanism (--enable-h2 option)
|
||||||
APACHE_CHECK_OPENSSL
|
APACHE_MODULE(h2, [HTTP/2 support (mod_h2)], $h2_objs, , most, [
|
||||||
if test "$ac_cv_openssl" = "yes" ; then
|
APACHE_CHECK_NGHTTP2
|
||||||
|
if test "$ac_cv_nghttp2" = "yes" ; then
|
||||||
if test "x$enable_ssl" = "xshared"; then
|
if test "x$enable_ssl" = "xshared"; then
|
||||||
# The only symbol which needs to be exported is the module
|
# The only symbol which needs to be exported is the module
|
||||||
# structure, so ask libtool to hide everything else:
|
# 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
|
fi
|
||||||
else
|
else
|
||||||
enable_ssl=no
|
enable_h2=no
|
||||||
fi
|
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
|
dnl # end of module specific part
|
||||||
APACHE_MODPATH_FINISH
|
APACHE_MODPATH_FINISH
|
||||||
|
|
@@ -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:--}
|
|
||||||
])
|
|
@@ -21,7 +21,6 @@
|
|||||||
#undef PACKAGE_STRING
|
#undef PACKAGE_STRING
|
||||||
#undef PACKAGE_NAME
|
#undef PACKAGE_NAME
|
||||||
#undef PACKAGE_BUGREPORT
|
#undef PACKAGE_BUGREPORT
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
H2_CONF_ENABLED,
|
H2_CONF_ENABLED,
|
@@ -293,8 +293,9 @@ apr_status_t h2_session_process(h2_session *session)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!have_read && !have_written) {
|
if (!have_read && !have_written
|
||||||
/* Nothing to read or write, we may have sessions, but
|
&& !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
|
* the have no data yet ready to be delivered. Slowly
|
||||||
* back off to give others a chance to do their work.
|
* 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");
|
"h2_task: creating conn");
|
||||||
return NULL;
|
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;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
@@ -341,6 +341,55 @@ static apr_status_t validate_status_line(request_rec *r)
|
|||||||
return APR_EGENERAL;
|
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)
|
static void set_basic_http_header(request_rec *r, apr_table_t *headers)
|
||||||
{
|
{
|
||||||
char *date = NULL;
|
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. */
|
/* determine the protocol and whether we should use keepalives. */
|
||||||
status = validate_status_line(r);
|
ap_set_keepalive(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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (r->chunked) {
|
if (r->chunked) {
|
||||||
apr_table_unset(r->headers_out, "Content-Length");
|
apr_table_unset(r->headers_out, "Content-Length");
|
@@ -37,13 +37,13 @@
|
|||||||
#include "h2_h2.h"
|
#include "h2_h2.h"
|
||||||
|
|
||||||
const char *h2_alpn_protos[] = {
|
const char *h2_alpn_protos[] = {
|
||||||
"h2", "h2-16", "h2-14"
|
"h2",
|
||||||
};
|
};
|
||||||
apr_size_t h2_alpn_protos_len = (sizeof(h2_alpn_protos)
|
apr_size_t h2_alpn_protos_len = (sizeof(h2_alpn_protos)
|
||||||
/ sizeof(h2_alpn_protos[0]));
|
/ sizeof(h2_alpn_protos[0]));
|
||||||
|
|
||||||
const char *h2_upgrade_protos[] = {
|
const char *h2_upgrade_protos[] = {
|
||||||
"h2c", "h2c-16", "h2c-14",
|
"h2c",
|
||||||
};
|
};
|
||||||
apr_size_t h2_upgrade_protos_len = (sizeof(h2_upgrade_protos)
|
apr_size_t h2_upgrade_protos_len = (sizeof(h2_upgrade_protos)
|
||||||
/ sizeof(h2_upgrade_protos[0]));
|
/ sizeof(h2_upgrade_protos[0]));
|
@@ -33,6 +33,7 @@
|
|||||||
#include "h2_io_set.h"
|
#include "h2_io_set.h"
|
||||||
#include "h2_response.h"
|
#include "h2_response.h"
|
||||||
#include "h2_mplx.h"
|
#include "h2_mplx.h"
|
||||||
|
#include "h2_request.h"
|
||||||
#include "h2_stream.h"
|
#include "h2_stream.h"
|
||||||
#include "h2_stream_set.h"
|
#include "h2_stream_set.h"
|
||||||
#include "h2_task.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) {
|
if (APR_SUCCESS == status) {
|
||||||
m->added_output = iowait;
|
m->added_output = iowait;
|
||||||
status = apr_thread_cond_timedwait(m->added_output, m->lock, timeout);
|
status = apr_thread_cond_timedwait(m->added_output, m->lock, timeout);
|
||||||
ap_log_cerror(APLOG_MARK, APLOG_TRACE2, 0, m->c,
|
if (APLOGctrace2(m->c)) {
|
||||||
"h2_mplx(%ld): trywait on data for %f ms)",
|
ap_log_cerror(APLOG_MARK, APLOG_TRACE2, 0, m->c,
|
||||||
m->id, timeout/1000.0);
|
"h2_mplx(%ld): trywait on data for %f ms)",
|
||||||
|
m->id, timeout/1000.0);
|
||||||
|
}
|
||||||
m->added_output = NULL;
|
m->added_output = NULL;
|
||||||
apr_thread_mutex_unlock(m->lock);
|
apr_thread_mutex_unlock(m->lock);
|
||||||
}
|
}
|
||||||
@@ -749,3 +752,27 @@ h2_task *h2_mplx_pop_task(h2_mplx *m, int *has_more)
|
|||||||
return task;
|
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;
|
||||||
|
}
|
||||||
|
|
@@ -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);
|
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.
|
* Input handling of streams.
|
||||||
******************************************************************************/
|
******************************************************************************/
|
@@ -16,7 +16,7 @@
|
|||||||
#ifndef __mod_h2__h2_response__
|
#ifndef __mod_h2__h2_response__
|
||||||
#define __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.
|
* suitable prepared to be fed to nghttp2 for response submit.
|
||||||
*/
|
*/
|
||||||
typedef struct h2_headers {
|
typedef struct h2_headers {
|
@@ -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 h2_stream_write_eoh(h2_stream *stream, int eos)
|
||||||
{
|
{
|
||||||
|
apr_status_t status;
|
||||||
AP_DEBUG_ASSERT(stream);
|
AP_DEBUG_ASSERT(stream);
|
||||||
|
|
||||||
/* Seeing the end-of-headers, we have everything we need to
|
/* Seeing the end-of-headers, we have everything we need to
|
||||||
* start processing it.
|
* start processing it.
|
||||||
*/
|
*/
|
||||||
conn_rec *c = h2_conn_create(stream->m->c, stream->pool);
|
status = h2_mplx_create_task(stream->m, stream);
|
||||||
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);
|
|
||||||
if (status == APR_SUCCESS) {
|
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 (eos) {
|
if (status == APR_SUCCESS) {
|
||||||
status = h2_stream_write_eos(stream);
|
status = h2_mplx_do_task(stream->m, stream->task);
|
||||||
}
|
}
|
||||||
ap_log_cerror(APLOG_MARK, APLOG_DEBUG, status, stream->m->c,
|
if (eos) {
|
||||||
"h2_stream(%ld-%d): end header, task %s %s (%s)",
|
status = h2_stream_write_eos(stream);
|
||||||
stream->m->id, stream->id,
|
}
|
||||||
stream->request->method, stream->request->path,
|
ap_log_cerror(APLOG_MARK, APLOG_DEBUG, status, stream->m->c,
|
||||||
stream->request->authority);
|
"h2_mplx(%ld-%d): start stream, task %s %s (%s)",
|
||||||
|
stream->m->id, stream->id,
|
||||||
|
stream->request->method, stream->request->path,
|
||||||
|
stream->request->authority);
|
||||||
|
|
||||||
|
}
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
@@ -390,11 +390,12 @@ static request_rec *h2_task_create_request(h2_task_env *env)
|
|||||||
r->protocol = (char*)"HTTP/1.1";
|
r->protocol = (char*)"HTTP/1.1";
|
||||||
r->proto_num = HTTP_VERSION(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
|
/* update what we think the virtual host is based on the headers we've
|
||||||
* now read. may update status.
|
* 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);
|
ap_update_vhost_from_headers(r);
|
||||||
|
|
||||||
/* we may have switched to another server */
|
/* we may have switched to another server */
|
@@ -20,7 +20,7 @@
|
|||||||
* @macro
|
* @macro
|
||||||
* Version number of the h2 module as c string
|
* Version number of the h2 module as c string
|
||||||
*/
|
*/
|
||||||
#define MOD_H2_VERSION "@PACKAGE_VERSION@"
|
#define MOD_H2_VERSION "0.8.1"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @macro
|
* @macro
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
* release. This is a 24 bit number with 8 bits for major number, 8 bits
|
* 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.
|
* 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 */
|
#endif /* mod_h2_h2_version_h */
|
@@ -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
|
|
@@ -1 +0,0 @@
|
|||||||
# just so it is not empty
|
|
@@ -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 */;
|
|
||||||
}
|
|
@@ -1,7 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<Workspace
|
|
||||||
version = "1.0">
|
|
||||||
<FileRef
|
|
||||||
location = "self:mod-h2.xcodeproj">
|
|
||||||
</FileRef>
|
|
||||||
</Workspace>
|
|
@@ -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>
|
|
@@ -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>
|
|
@@ -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>
|
|
7
modules/http2/mod_h2/.gitignore
vendored
7
modules/http2/mod_h2/.gitignore
vendored
@@ -1,7 +0,0 @@
|
|||||||
*.o
|
|
||||||
*.slo
|
|
||||||
*.lo
|
|
||||||
*.la
|
|
||||||
.libs
|
|
||||||
Makefile.in
|
|
||||||
Makefile
|
|
@@ -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
|
|
||||||
|
|
||||||
|
|
@@ -1 +0,0 @@
|
|||||||
# just so it is not empty
|
|
2
modules/http2/sandbox/.gitignore
vendored
2
modules/http2/sandbox/.gitignore
vendored
@@ -1,2 +0,0 @@
|
|||||||
install
|
|
||||||
gen
|
|
@@ -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
|
|
1
modules/http2/sandbox/httpd/.gitignore
vendored
1
modules/http2/sandbox/httpd/.gitignore
vendored
@@ -1 +0,0 @@
|
|||||||
gen
|
|
@@ -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)
|
|
@@ -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))
|
|
||||||
|
|
@@ -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
|
|
@@ -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
|
|
||||||
|
|
||||||
|
|
@@ -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.
|
|
@@ -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
@@ -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 */
|
|
||||||
};
|
|
@@ -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
Reference in New Issue
Block a user