You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by ic...@apache.org on 2015/07/10 13:45:47 UTC

svn commit: r1690248 [1/2] - in /httpd/httpd/trunk: ./ docs/conf/ docs/conf/extra/ docs/manual/mod/ modules/ modules/http2/ modules/http2/m4/ modules/http2/mod-h2.xcodeproj/ modules/http2/mod_h2/ modules/http2/sandbox/ modules/http2/setup/

Author: icing
Date: Fri Jul 10 11:45:46 2015
New Revision: 1690248

URL: http://svn.apache.org/r1690248
Log:
reworked mod_h2 donation checkin into build system, added documentation

Added:
    httpd/httpd/trunk/docs/conf/extra/httpd-h2.conf.in
    httpd/httpd/trunk/docs/manual/mod/mod_h2.html
    httpd/httpd/trunk/docs/manual/mod/mod_h2.html.en
    httpd/httpd/trunk/docs/manual/mod/mod_h2.xml
    httpd/httpd/trunk/docs/manual/mod/mod_h2.xml.meta
    httpd/httpd/trunk/modules/http2/Makefile.in
    httpd/httpd/trunk/modules/http2/README.h2
    httpd/httpd/trunk/modules/http2/config.m4
    httpd/httpd/trunk/modules/http2/h2_alpn.c
      - copied unchanged from r1690246, httpd/httpd/trunk/modules/http2/mod_h2/h2_alpn.c
    httpd/httpd/trunk/modules/http2/h2_alpn.h
      - copied unchanged from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_alpn.h
    httpd/httpd/trunk/modules/http2/h2_alt_svc.c
      - copied unchanged from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_alt_svc.c
    httpd/httpd/trunk/modules/http2/h2_alt_svc.h
      - copied unchanged from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_alt_svc.h
    httpd/httpd/trunk/modules/http2/h2_config.c
      - copied unchanged from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_config.c
    httpd/httpd/trunk/modules/http2/h2_config.h
      - copied, changed from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_config.h
    httpd/httpd/trunk/modules/http2/h2_conn.c
      - copied, changed from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_conn.c
    httpd/httpd/trunk/modules/http2/h2_conn.h
      - copied unchanged from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_conn.h
    httpd/httpd/trunk/modules/http2/h2_conn_io.c
      - copied unchanged from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_conn_io.c
    httpd/httpd/trunk/modules/http2/h2_conn_io.h
      - copied unchanged from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_conn_io.h
    httpd/httpd/trunk/modules/http2/h2_ctx.c
      - copied unchanged from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_ctx.c
    httpd/httpd/trunk/modules/http2/h2_ctx.h
      - copied unchanged from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_ctx.h
    httpd/httpd/trunk/modules/http2/h2_from_h1.c
      - copied, changed from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_from_h1.c
    httpd/httpd/trunk/modules/http2/h2_from_h1.h
      - copied unchanged from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_from_h1.h
    httpd/httpd/trunk/modules/http2/h2_h2.c
      - copied, changed from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_h2.c
    httpd/httpd/trunk/modules/http2/h2_h2.h
      - copied unchanged from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_h2.h
    httpd/httpd/trunk/modules/http2/h2_io.c
      - copied unchanged from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_io.c
    httpd/httpd/trunk/modules/http2/h2_io.h
      - copied unchanged from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_io.h
    httpd/httpd/trunk/modules/http2/h2_io_set.c
      - copied unchanged from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_io_set.c
    httpd/httpd/trunk/modules/http2/h2_io_set.h
      - copied unchanged from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_io_set.h
    httpd/httpd/trunk/modules/http2/h2_mplx.c
      - copied, changed from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_mplx.c
    httpd/httpd/trunk/modules/http2/h2_mplx.h
      - copied, changed from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_mplx.h
    httpd/httpd/trunk/modules/http2/h2_private.h
      - copied unchanged from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_private.h
    httpd/httpd/trunk/modules/http2/h2_request.c
      - copied unchanged from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_request.c
    httpd/httpd/trunk/modules/http2/h2_request.h
      - copied unchanged from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_request.h
    httpd/httpd/trunk/modules/http2/h2_response.c
      - copied unchanged from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_response.c
    httpd/httpd/trunk/modules/http2/h2_response.h
      - copied unchanged from r1689604, httpd/httpd/trunk/modules/http2/mod_h2/h2_response.h
    httpd/httpd/trunk/modules/http2/h2_session.c
      - copied unchanged from r1690246, httpd/httpd/trunk/modules/http2/mod_h2/h2_session.c
    httpd/httpd/trunk/modules/http2/h2_session.h
      - copied unchanged from r1690246, httpd/httpd/trunk/modules/http2/mod_h2/h2_session.h
    httpd/httpd/trunk/modules/http2/h2_stream.c
      - copied, changed from r1690246, httpd/httpd/trunk/modules/http2/mod_h2/h2_stream.c
    httpd/httpd/trunk/modules/http2/h2_stream.h
      - copied unchanged from r1690246, httpd/httpd/trunk/modules/http2/mod_h2/h2_stream.h
    httpd/httpd/trunk/modules/http2/h2_stream_set.c
      - copied unchanged from r1690246, httpd/httpd/trunk/modules/http2/mod_h2/h2_stream_set.c
    httpd/httpd/trunk/modules/http2/h2_stream_set.h
      - copied unchanged from r1690246, httpd/httpd/trunk/modules/http2/mod_h2/h2_stream_set.h
    httpd/httpd/trunk/modules/http2/h2_task.c
      - copied, changed from r1690246, httpd/httpd/trunk/modules/http2/mod_h2/h2_task.c
    httpd/httpd/trunk/modules/http2/h2_task.h
      - copied unchanged from r1690246, httpd/httpd/trunk/modules/http2/mod_h2/h2_task.h
    httpd/httpd/trunk/modules/http2/h2_task_input.c
      - copied unchanged from r1690246, httpd/httpd/trunk/modules/http2/mod_h2/h2_task_input.c
    httpd/httpd/trunk/modules/http2/h2_task_input.h
      - copied unchanged from r1690246, httpd/httpd/trunk/modules/http2/mod_h2/h2_task_input.h
    httpd/httpd/trunk/modules/http2/h2_task_output.c
      - copied unchanged from r1690246, httpd/httpd/trunk/modules/http2/mod_h2/h2_task_output.c
    httpd/httpd/trunk/modules/http2/h2_task_output.h
      - copied unchanged from r1690246, httpd/httpd/trunk/modules/http2/mod_h2/h2_task_output.h
    httpd/httpd/trunk/modules/http2/h2_task_queue.c
      - copied unchanged from r1690246, httpd/httpd/trunk/modules/http2/mod_h2/h2_task_queue.c
    httpd/httpd/trunk/modules/http2/h2_task_queue.h
      - copied unchanged from r1690246, httpd/httpd/trunk/modules/http2/mod_h2/h2_task_queue.h
    httpd/httpd/trunk/modules/http2/h2_to_h1.c
      - copied unchanged from r1690246, httpd/httpd/trunk/modules/http2/mod_h2/h2_to_h1.c
    httpd/httpd/trunk/modules/http2/h2_to_h1.h
      - copied unchanged from r1690246, httpd/httpd/trunk/modules/http2/mod_h2/h2_to_h1.h
    httpd/httpd/trunk/modules/http2/h2_upgrade.c
      - copied unchanged from r1690246, httpd/httpd/trunk/modules/http2/mod_h2/h2_upgrade.c
    httpd/httpd/trunk/modules/http2/h2_upgrade.h
      - copied unchanged from r1690246, httpd/httpd/trunk/modules/http2/mod_h2/h2_upgrade.h
    httpd/httpd/trunk/modules/http2/h2_util.c
      - copied unchanged from r1690246, httpd/httpd/trunk/modules/http2/mod_h2/h2_util.c
    httpd/httpd/trunk/modules/http2/h2_util.h
      - copied unchanged from r1690246, httpd/httpd/trunk/modules/http2/mod_h2/h2_util.h
    httpd/httpd/trunk/modules/http2/h2_version.h
      - copied, changed from r1690246, httpd/httpd/trunk/modules/http2/mod_h2/h2_version.h.in
    httpd/httpd/trunk/modules/http2/h2_worker.c
      - copied unchanged from r1690246, httpd/httpd/trunk/modules/http2/mod_h2/h2_worker.c
    httpd/httpd/trunk/modules/http2/h2_worker.h
      - copied unchanged from r1690246, httpd/httpd/trunk/modules/http2/mod_h2/h2_worker.h
    httpd/httpd/trunk/modules/http2/h2_workers.c
      - copied unchanged from r1690246, httpd/httpd/trunk/modules/http2/mod_h2/h2_workers.c
    httpd/httpd/trunk/modules/http2/h2_workers.h
      - copied unchanged from r1690246, httpd/httpd/trunk/modules/http2/mod_h2/h2_workers.h
    httpd/httpd/trunk/modules/http2/mod_h2.c
      - copied unchanged from r1690246, httpd/httpd/trunk/modules/http2/mod_h2/mod_h2.c
    httpd/httpd/trunk/modules/http2/mod_h2.h
      - copied unchanged from r1690246, httpd/httpd/trunk/modules/http2/mod_h2/mod_h2.h
Removed:
    httpd/httpd/trunk/modules/http2/AUTHORS
    httpd/httpd/trunk/modules/http2/ChangeLog
    httpd/httpd/trunk/modules/http2/DISCUSS
    httpd/httpd/trunk/modules/http2/INSTALL
    httpd/httpd/trunk/modules/http2/LICENSE
    httpd/httpd/trunk/modules/http2/Makefile.am
    httpd/httpd/trunk/modules/http2/NEWS
    httpd/httpd/trunk/modules/http2/README
    httpd/httpd/trunk/modules/http2/README.md
    httpd/httpd/trunk/modules/http2/configure.ac
    httpd/httpd/trunk/modules/http2/m4/
    httpd/httpd/trunk/modules/http2/mod-h2.xcodeproj/
    httpd/httpd/trunk/modules/http2/mod_h2/
    httpd/httpd/trunk/modules/http2/sandbox/
    httpd/httpd/trunk/modules/http2/setup/
Modified:
    httpd/httpd/trunk/CHANGES
    httpd/httpd/trunk/acinclude.m4
    httpd/httpd/trunk/docs/conf/httpd.conf.in
    httpd/httpd/trunk/docs/manual/mod/allmodules.xml
    httpd/httpd/trunk/docs/manual/mod/quickreference.html.en
    httpd/httpd/trunk/modules/README
    httpd/httpd/trunk/modules/http2/   (props changed)

Modified: httpd/httpd/trunk/CHANGES
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/CHANGES?rev=1690248&r1=1690247&r2=1690248&view=diff
==============================================================================
--- httpd/httpd/trunk/CHANGES [utf-8] (original)
+++ httpd/httpd/trunk/CHANGES [utf-8] Fri Jul 10 11:45:46 2015
@@ -1,6 +1,9 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache 2.5.0
 
+  *) mod_h2: added donated http/2 implementation to build system. Similar
+     configuration options to mod_ssl. [Stefan Eissing]
+
   *) mod_reqtimeout: Don't let pipelining checks and keep-alive times interfere
      with the timeouts computed for subsequent requests.  PR 56729.
      [Eric Covener, Yann Ylavic]

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

Added: httpd/httpd/trunk/docs/conf/extra/httpd-h2.conf.in
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/docs/conf/extra/httpd-h2.conf.in?rev=1690248&view=auto
==============================================================================
--- httpd/httpd/trunk/docs/conf/extra/httpd-h2.conf.in (added)
+++ httpd/httpd/trunk/docs/conf/extra/httpd-h2.conf.in Fri Jul 10 11:45:46 2015
@@ -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>

Modified: httpd/httpd/trunk/docs/conf/httpd.conf.in
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/docs/conf/httpd.conf.in?rev=1690248&r1=1690247&r2=1690248&view=diff
==============================================================================
--- httpd/httpd/trunk/docs/conf/httpd.conf.in (original)
+++ httpd/httpd/trunk/docs/conf/httpd.conf.in Fri Jul 10 11:45:46 2015
@@ -426,3 +426,6 @@ SSLRandomSeed connect builtin
 #RequestHeader unset DNT env=bad_DNT
 #</IfModule>
 
+# h2/h2c (HTTP/2) connections
+#Include @rel_sysconfdir@/extra/httpd-h2.conf
+

Modified: httpd/httpd/trunk/docs/manual/mod/allmodules.xml
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/docs/manual/mod/allmodules.xml?rev=1690248&r1=1690247&r2=1690248&view=diff
==============================================================================
--- httpd/httpd/trunk/docs/manual/mod/allmodules.xml (original)
+++ httpd/httpd/trunk/docs/manual/mod/allmodules.xml Fri Jul 10 11:45:46 2015
@@ -53,6 +53,7 @@
   <modulefile>mod_file_cache.xml</modulefile>
   <modulefile>mod_filter.xml</modulefile>
   <modulefile>mod_firehose.xml</modulefile>
+  <modulefile>mod_h2.xml</modulefile>
   <modulefile>mod_headers.xml</modulefile>
   <modulefile>mod_heartbeat.xml</modulefile>
   <modulefile>mod_heartmonitor.xml</modulefile>

Added: httpd/httpd/trunk/docs/manual/mod/mod_h2.html
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/docs/manual/mod/mod_h2.html?rev=1690248&view=auto
==============================================================================
--- httpd/httpd/trunk/docs/manual/mod/mod_h2.html (added)
+++ httpd/httpd/trunk/docs/manual/mod/mod_h2.html Fri Jul 10 11:45:46 2015
@@ -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

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

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

Added: httpd/httpd/trunk/docs/manual/mod/mod_h2.xml.meta
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/docs/manual/mod/mod_h2.xml.meta?rev=1690248&view=auto
==============================================================================
--- httpd/httpd/trunk/docs/manual/mod/mod_h2.xml.meta (added)
+++ httpd/httpd/trunk/docs/manual/mod/mod_h2.xml.meta Fri Jul 10 11:45:46 2015
@@ -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>

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

Modified: httpd/httpd/trunk/modules/README
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/README?rev=1690248&r1=1690247&r2=1690248&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/README (original)
+++ httpd/httpd/trunk/modules/README Fri Jul 10 11:45:46 2015
@@ -41,6 +41,9 @@ generators/
 http/
   This directory houses modules that basic HTTP protocol implementation.
 
+http2/
+  This directory houses modules that provide HTTP/2 protocol implementation.
+
 loggers/
   This directory houses modules that handle logging functions.
 

Propchange: httpd/httpd/trunk/modules/http2/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Fri Jul 10 11:45:46 2015
@@ -0,0 +1,23 @@
+.deps
+.libs
+*.la
+modules.mk
+Makefile
+*.lo
+*.slo
+*.so
+*.x
+Debug
+Release
+*.plg
+*.aps
+*.dep
+*.mak
+*.rc
+BuildLog.htm
+*.stc
+*.stt
+*.sto
+*.vcproj
+*.vcproj.*
+

Added: httpd/httpd/trunk/modules/http2/Makefile.in
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/Makefile.in?rev=1690248&view=auto
==============================================================================
--- httpd/httpd/trunk/modules/http2/Makefile.in (added)
+++ httpd/httpd/trunk/modules/http2/Makefile.in Fri Jul 10 11:45:46 2015
@@ -0,0 +1,20 @@
+# 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

Added: httpd/httpd/trunk/modules/http2/README.h2
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/README.h2?rev=1690248&view=auto
==============================================================================
--- httpd/httpd/trunk/modules/http2/README.h2 (added)
+++ httpd/httpd/trunk/modules/http2/README.h2 Fri Jul 10 11:45:46 2015
@@ -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
+

Added: httpd/httpd/trunk/modules/http2/config.m4
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/config.m4?rev=1690248&view=auto
==============================================================================
--- httpd/httpd/trunk/modules/http2/config.m4 (added)
+++ httpd/httpd/trunk/modules/http2/config.m4 Fri Jul 10 11:45:46 2015
@@ -0,0 +1,65 @@
+dnl Licensed to the Apache Software Foundation (ASF) under one or more
+dnl contributor license agreements.  See the NOTICE file distributed with
+dnl this work for additional information regarding copyright ownership.
+dnl The ASF licenses this file to You under the Apache License, Version 2.0
+dnl (the "License"); you may not use this file except in compliance with
+dnl the License.  You may obtain a copy of the License at
+dnl
+dnl      http://www.apache.org/licenses/LICENSE-2.0
+dnl
+dnl Unless required by applicable law or agreed to in writing, software
+dnl distributed under the License is distributed on an "AS IS" BASIS,
+dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+dnl See the License for the specific language governing permissions and
+dnl limitations under the License.
+
+dnl #  start of module specific part
+APACHE_MODPATH_INIT(http2)
+
+dnl #  list of module object files
+h2_objs="dnl
+mod_h2.lo dnl
+h2_alpn.lo dnl
+h2_alt_svc.lo dnl
+h2_config.lo dnl
+h2_conn.lo dnl
+h2_conn_io.lo dnl
+h2_ctx.lo dnl
+h2_from_h1.lo dnl
+h2_h2.lo dnl
+h2_io.lo dnl
+h2_io_set.lo dnl
+h2_mplx.lo dnl
+h2_request.lo dnl
+h2_response.lo dnl
+h2_session.lo dnl
+h2_stream.lo dnl
+h2_stream_set.lo dnl
+h2_task.lo dnl
+h2_task_input.lo dnl
+h2_task_output.lo dnl
+h2_task_queue.lo dnl
+h2_to_h1.lo dnl
+h2_upgrade.lo dnl
+h2_util.lo dnl
+h2_worker.lo dnl
+h2_workers.lo dnl
+"
+
+dnl #  hook module into the Autoconf mechanism (--enable-h2 option)
+APACHE_MODULE(h2, [HTTP/2 support (mod_h2)], $h2_objs, , most, [
+    APACHE_CHECK_NGHTTP2
+    if test "$ac_cv_nghttp2" = "yes" ; then
+        if test "x$enable_ssl" = "xshared"; then
+           # The only symbol which needs to be exported is the module
+           # structure, so ask libtool to hide everything else:
+           APR_ADDTO(MOD_H2_LDADD, [-export-symbols-regex h2_module])
+        fi
+    else
+        enable_h2=no
+    fi
+])
+
+dnl #  end of module specific part
+APACHE_MODPATH_FINISH
+

Copied: httpd/httpd/trunk/modules/http2/h2_config.h (from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_config.h)
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/h2_config.h?p2=httpd/httpd/trunk/modules/http2/h2_config.h&p1=httpd/httpd/trunk/modules/http2/mod_h2/h2_config.h&r1=1690244&r2=1690248&rev=1690248&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/http2/mod_h2/h2_config.h (original)
+++ httpd/httpd/trunk/modules/http2/h2_config.h Fri Jul 10 11:45:46 2015
@@ -21,7 +21,6 @@
 #undef PACKAGE_STRING
 #undef PACKAGE_NAME
 #undef PACKAGE_BUGREPORT
-#include "config.h"
 
 typedef enum {
     H2_CONF_ENABLED,

Copied: httpd/httpd/trunk/modules/http2/h2_conn.c (from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_conn.c)
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/h2_conn.c?p2=httpd/httpd/trunk/modules/http2/h2_conn.c&p1=httpd/httpd/trunk/modules/http2/mod_h2/h2_conn.c&r1=1690244&r2=1690248&rev=1690248&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/http2/mod_h2/h2_conn.c (original)
+++ httpd/httpd/trunk/modules/http2/h2_conn.c Fri Jul 10 11:45:46 2015
@@ -293,8 +293,9 @@ apr_status_t h2_session_process(h2_sessi
                 break;
         }
         
-        if (!have_read && !have_written) {
-            /* Nothing to read or write, we may have sessions, but
+        if (!have_read && !have_written
+            && !h2_stream_set_is_empty(session->streams)) {
+            /* Nothing to read or write, we have streams, but
              * the have no data yet ready to be delivered. Slowly
              * back off to give others a chance to do their work.
              */
@@ -349,6 +350,13 @@ conn_rec *h2_conn_create(conn_rec *maste
                       "h2_task: creating conn");
         return NULL;
     }
+    /* TODO: we simulate that we had already a request on this connection.
+     * This keeps the mod_ssl SNI vs. Host name matcher from answering 
+     * 400 Bad Request
+     * when names do not match. We prefer a predictable 421 status.
+     */
+    c->keepalives = 1;
+
     return c;
 }
 
@@ -371,7 +379,7 @@ apr_status_t h2_conn_prep(h2_task_env *e
     
     env->c.conn_config = ap_create_conn_config(env->pool);
     env->c.notes = apr_table_make(env->pool, 5);
-
+    
     ap_set_module_config(env->c.conn_config, &core_module, 
                          h2_worker_get_socket(worker));
     

Copied: httpd/httpd/trunk/modules/http2/h2_from_h1.c (from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_from_h1.c)
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/h2_from_h1.c?p2=httpd/httpd/trunk/modules/http2/h2_from_h1.c&p1=httpd/httpd/trunk/modules/http2/mod_h2/h2_from_h1.c&r1=1690244&r2=1690248&rev=1690248&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/http2/mod_h2/h2_from_h1.c (original)
+++ httpd/httpd/trunk/modules/http2/h2_from_h1.c Fri Jul 10 11:45:46 2015
@@ -341,6 +341,55 @@ static apr_status_t validate_status_line
     return APR_EGENERAL;
 }
 
+/*
+ * Determine the protocol to use for the response. Potentially downgrade
+ * to HTTP/1.0 in some situations and/or turn off keepalives.
+ *
+ * also prepare r->status_line.
+ */
+static void basic_http_header_check(request_rec *r,
+                                    const char **protocol)
+{
+    apr_status_t rv;
+    
+    if (r->assbackwards) {
+        /* no such thing as a response protocol */
+        return;
+    }
+    
+    rv = validate_status_line(r);
+    
+    if (!r->status_line) {
+        r->status_line = ap_get_status_line(r->status);
+    } else if (rv != APR_SUCCESS) {
+        /* Status line is OK but our own reason phrase
+         * would be preferred if defined
+         */
+        const char *tmp = ap_get_status_line(r->status);
+        if (!strncmp(tmp, r->status_line, 3)) {
+            r->status_line = tmp;
+        }
+    }
+    
+    /* Note that we must downgrade before checking for force responses. */
+    if (r->proto_num > HTTP_VERSION(1,0)
+        && apr_table_get(r->subprocess_env, "downgrade-1.0")) {
+        r->proto_num = HTTP_VERSION(1,0);
+    }
+    
+    /* kludge around broken browsers when indicated by force-response-1.0
+     */
+    if (r->proto_num == HTTP_VERSION(1,0)
+        && apr_table_get(r->subprocess_env, "force-response-1.0")) {
+        *protocol = "HTTP/1.0";
+        r->connection->keepalive = AP_CONN_CLOSE;
+    }
+    else {
+        *protocol = AP_SERVER_PROTOCOL;
+    }
+    
+}
+
 static void set_basic_http_header(request_rec *r, apr_table_t *headers)
 {
     char *date = NULL;
@@ -428,19 +477,7 @@ static h2_response *create_response(h2_f
     }
     
     /* determine the protocol and whether we should use keepalives. */
-    status = validate_status_line(r);
-    if (!r->status_line) {
-        r->status_line = ap_get_status_line(r->status);
-    } 
-    else if (status != APR_SUCCESS) {
-        /* Status line is OK but our own reason phrase
-         * would be preferred if defined
-         */
-        const char *tmp = ap_get_status_line(r->status);
-        if (!strncmp(tmp, r->status_line, 3)) {
-            r->status_line = tmp;
-        }
-    }
+    ap_set_keepalive(r);
     
     if (r->chunked) {
         apr_table_unset(r->headers_out, "Content-Length");

Copied: httpd/httpd/trunk/modules/http2/h2_h2.c (from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_h2.c)
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/h2_h2.c?p2=httpd/httpd/trunk/modules/http2/h2_h2.c&p1=httpd/httpd/trunk/modules/http2/mod_h2/h2_h2.c&r1=1690244&r2=1690248&rev=1690248&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/http2/mod_h2/h2_h2.c (original)
+++ httpd/httpd/trunk/modules/http2/h2_h2.c Fri Jul 10 11:45:46 2015
@@ -37,13 +37,13 @@
 #include "h2_h2.h"
 
 const char *h2_alpn_protos[] = {
-    "h2", "h2-16", "h2-14"
+    "h2",
 };
 apr_size_t h2_alpn_protos_len = (sizeof(h2_alpn_protos)
                                  / sizeof(h2_alpn_protos[0]));
 
 const char *h2_upgrade_protos[] = {
-    "h2c", "h2c-16", "h2c-14",
+    "h2c",
 };
 apr_size_t h2_upgrade_protos_len = (sizeof(h2_upgrade_protos)
                                     / sizeof(h2_upgrade_protos[0]));

Copied: httpd/httpd/trunk/modules/http2/h2_mplx.c (from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_mplx.c)
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/h2_mplx.c?p2=httpd/httpd/trunk/modules/http2/h2_mplx.c&p1=httpd/httpd/trunk/modules/http2/mod_h2/h2_mplx.c&r1=1690244&r2=1690248&rev=1690248&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/http2/mod_h2/h2_mplx.c (original)
+++ httpd/httpd/trunk/modules/http2/h2_mplx.c Fri Jul 10 11:45:46 2015
@@ -33,6 +33,7 @@
 #include "h2_io_set.h"
 #include "h2_response.h"
 #include "h2_mplx.h"
+#include "h2_request.h"
 #include "h2_stream.h"
 #include "h2_stream_set.h"
 #include "h2_task.h"
@@ -693,9 +694,11 @@ apr_status_t h2_mplx_out_trywait(h2_mplx
     if (APR_SUCCESS == status) {
         m->added_output = iowait;
         status = apr_thread_cond_timedwait(m->added_output, m->lock, timeout);
-        ap_log_cerror(APLOG_MARK, APLOG_TRACE2, 0, m->c,
-                      "h2_mplx(%ld): trywait on data for %f ms)",
-                      m->id, timeout/1000.0);
+        if (APLOGctrace2(m->c)) {
+            ap_log_cerror(APLOG_MARK, APLOG_TRACE2, 0, m->c,
+                          "h2_mplx(%ld): trywait on data for %f ms)",
+                          m->id, timeout/1000.0);
+        }
         m->added_output = NULL;
         apr_thread_mutex_unlock(m->lock);
     }
@@ -749,3 +752,27 @@ h2_task *h2_mplx_pop_task(h2_mplx *m, in
     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;
+}
+

Copied: httpd/httpd/trunk/modules/http2/h2_mplx.h (from r1690244, httpd/httpd/trunk/modules/http2/mod_h2/h2_mplx.h)
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/h2_mplx.h?p2=httpd/httpd/trunk/modules/http2/h2_mplx.h&p1=httpd/httpd/trunk/modules/http2/mod_h2/h2_mplx.h&r1=1690244&r2=1690248&rev=1690248&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/http2/mod_h2/h2_mplx.h (original)
+++ httpd/httpd/trunk/modules/http2/h2_mplx.h Fri Jul 10 11:45:46 2015
@@ -149,6 +149,8 @@ apr_status_t h2_mplx_do_task(h2_mplx *mp
 
 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.
  ******************************************************************************/

Copied: httpd/httpd/trunk/modules/http2/h2_stream.c (from r1690246, httpd/httpd/trunk/modules/http2/mod_h2/h2_stream.c)
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/h2_stream.c?p2=httpd/httpd/trunk/modules/http2/h2_stream.c&p1=httpd/httpd/trunk/modules/http2/mod_h2/h2_stream.c&r1=1690246&r2=1690248&rev=1690248&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/http2/mod_h2/h2_stream.c (original)
+++ httpd/httpd/trunk/modules/http2/h2_stream.c Fri Jul 10 11:45:46 2015
@@ -147,34 +147,29 @@ apr_status_t h2_stream_rwrite(h2_stream
 
 apr_status_t h2_stream_write_eoh(h2_stream *stream, int eos)
 {
+    apr_status_t status;
     AP_DEBUG_ASSERT(stream);
+    
     /* Seeing the end-of-headers, we have everything we need to 
      * start processing it.
      */
-    conn_rec *c = h2_conn_create(stream->m->c, stream->pool);
-    if (c == NULL) {
-        ap_log_cerror(APLOG_MARK, APLOG_ERR, APR_ENOMEM, stream->m->c,
-                      "h2_stream(%ld-%d): create connection",
-                      stream->m->id, stream->id);
-        return APR_ENOMEM;
-    }
-    stream->task = h2_task_create(stream->m->id, stream->id, 
-                                  stream->pool, stream->m, c);
-    
-    apr_status_t status = h2_request_end_headers(stream->request, 
-                                                 stream->m, stream->task, eos);
+    status = h2_mplx_create_task(stream->m, stream);
     if (status == APR_SUCCESS) {
-        status = h2_mplx_do_task(stream->m, stream->task);
+        status = h2_request_end_headers(stream->request, 
+                                        stream->m, stream->task, eos);
+        if (status == APR_SUCCESS) {
+            status = h2_mplx_do_task(stream->m, stream->task);
+        }
+        if (eos) {
+            status = h2_stream_write_eos(stream);
+        }
+        ap_log_cerror(APLOG_MARK, APLOG_DEBUG, status, stream->m->c,
+                      "h2_mplx(%ld-%d): start stream, task %s %s (%s)",
+                      stream->m->id, stream->id,
+                      stream->request->method, stream->request->path,
+                      stream->request->authority);
+        
     }
-    if (eos) {
-        status = h2_stream_write_eos(stream);
-    }
-    ap_log_cerror(APLOG_MARK, APLOG_DEBUG, status, stream->m->c,
-                  "h2_stream(%ld-%d): end header, task %s %s (%s)",
-                  stream->m->id, stream->id,
-                  stream->request->method, stream->request->path,
-                  stream->request->authority);
-    
     return status;
 }