Compare commits

..

8 Commits

Author SHA1 Message Date
Tatsuhiro Tsujikawa
f770831811 cache-digest: Truncate hash from MSB 2016-07-21 23:32:20 +09:00
Tatsuhiro Tsujikawa
24edc961fb Merge branch 'master' into cache-digest 2016-07-21 23:14:20 +09:00
Tatsuhiro Tsujikawa
4bfd9b182e Merge branch 'master' into cache-digest 2016-07-09 11:59:28 +09:00
Tatsuhiro Tsujikawa
6e15e2bd26 src: Cast to uint64_t explicitly 2016-07-09 11:58:36 +09:00
Tatsuhiro Tsujikawa
0ae11c74ba src: Avoid n, p calculation if possible 2016-07-09 11:57:50 +09:00
Tatsuhiro Tsujikawa
536e40aeaa src: Fix hash calculation because of signed integer promotion 2016-07-06 23:50:48 +09:00
Tatsuhiro Tsujikawa
42ea5abdcb src: Fix compile error with gcc 2016-07-03 12:57:21 +09:00
Tatsuhiro Tsujikawa
bcc97b8699 Implement CACHE_DIGEST frame for nghttp and nghttpd
We use https://tools.ietf.org/html/draft-kazuho-h2-cache-digest-01 as
specification.  We haven't implemented flags handling yet.
2016-07-03 11:33:07 +09:00
461 changed files with 17287 additions and 30218 deletions

View File

@@ -1,117 +1,57 @@
--- ---
Language: Cpp Language: Cpp
# BasedOnStyle: LLVM
AccessModifierOffset: -2 AccessModifierOffset: -2
AlignAfterOpenBracket: Align ConstructorInitializerIndentWidth: 4
AlignConsecutiveAssignments: false AlignEscapedNewlinesLeft: false
AlignConsecutiveDeclarations: false
AlignEscapedNewlines: Right
AlignOperands: true
AlignTrailingComments: true AlignTrailingComments: true
AllowAllParametersOfDeclarationOnNextLine: true AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: false AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: All
AllowShortIfStatementsOnASingleLine: false AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None AllowShortFunctionsOnASingleLine: All
AlwaysBreakAfterReturnType: None AlwaysBreakTemplateDeclarations: false
AlwaysBreakBeforeMultilineStrings: false AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: MultiLine BreakBeforeBinaryOperators: false
BinPackArguments: true
BinPackParameters: true
BraceWrapping:
AfterClass: false
AfterControlStatement: false
AfterEnum: false
AfterFunction: false
AfterNamespace: false
AfterObjCDeclaration: false
AfterStruct: false
AfterUnion: false
AfterExternBlock: false
BeforeCatch: false
BeforeElse: false
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Attach
BreakBeforeInheritanceComma: false
BreakInheritanceList: BeforeColon
BreakBeforeTernaryOperators: true BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: false BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: BeforeColon BinPackParameters: true
BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: true
ColumnLimit: 80 ColumnLimit: 80
CommentPragmas: '^ IWYU pragma:'
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: true ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DerivePointerAlignment: false DerivePointerAlignment: false
DisableFormat: false
ExperimentalAutoDetectBinPacking: false ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: true
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
IncludeBlocks: Preserve
IncludeCategories:
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
Priority: 2
- Regex: '^(<|"(gtest|isl|json)/)'
Priority: 3
- Regex: '.*'
Priority: 1
IncludeIsMainRegex: '$'
IndentCaseLabels: false IndentCaseLabels: false
IndentPPDirectives: AfterHash
IndentWidth: 2
IndentWrappedFunctionNames: false IndentWrappedFunctionNames: false
JavaScriptQuotes: Leave IndentFunctionDeclarationAfterType: false
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: true
MacroBlockBegin: ''
MacroBlockEnd: ''
MaxEmptyLinesToKeep: 1 MaxEmptyLinesToKeep: 1
KeepEmptyLinesAtTheStartOfBlocks: true
NamespaceIndentation: None NamespaceIndentation: None
ObjCBinPackProtocolList: Auto
ObjCBlockIndentWidth: 2
ObjCSpaceAfterProperty: false ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true ObjCSpaceBeforeProtocolList: true
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 19 PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300 PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000 PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10 PenaltyBreakFirstLessLess: 120
PenaltyExcessCharacter: 1000000 PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 60 PenaltyReturnTypeOnItsOwnLine: 60
PointerAlignment: Right PointerAlignment: Right
ReflowComments: true
SortIncludes: false
SortUsingDeclarations: true
SpaceAfterCStyleCast: false
SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1 SpacesBeforeTrailingComments: 1
SpacesInAngles: false Cpp11BracedListStyle: true
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: Cpp11 Standard: Cpp11
IndentWidth: 2
TabWidth: 8 TabWidth: 8
UseTab: Never UseTab: Never
BreakBeforeBraces: Attach
SpacesInParentheses: false
SpacesInAngles: false
SpaceInEmptyParentheses: false
SpacesInCStyleCastParentheses: false
SpacesInContainerLiterals: true
SpaceBeforeAssignmentOperators: true
ContinuationIndentWidth: 4
CommentPragmas: '^ IWYU pragma:'
ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ]
SpaceBeforeParens: ControlStatements
DisableFormat: false
... ...

3
.gitmodules vendored
View File

@@ -3,5 +3,4 @@
url = https://github.com/mruby/mruby url = https://github.com/mruby/mruby
[submodule "third-party/neverbleed"] [submodule "third-party/neverbleed"]
path = third-party/neverbleed path = third-party/neverbleed
url = https://github.com/tatsuhiro-t/neverbleed.git url = https://github.com/h2o/neverbleed.git
branch = openssl111fix

View File

@@ -1,4 +1,3 @@
dist: xenial
env: env:
matrix: matrix:
- CI_BUILD=cmake - CI_BUILD=cmake
@@ -7,13 +6,15 @@ language: cpp
compiler: compiler:
- clang - clang
- gcc - gcc
sudo: required sudo: false
addons: addons:
apt: apt:
sources: sources:
- ubuntu-toolchain-r-test - ubuntu-toolchain-r-test
- george-edison55-precise-backports
packages: packages:
- g++-8 - g++-4.9
- libstdc++-4.9-dev
- autoconf - autoconf
- automake - automake
- autotools-dev - autotools-dev
@@ -27,27 +28,37 @@ addons:
- libevent-dev - libevent-dev
- libjansson-dev - libjansson-dev
- libjemalloc-dev - libjemalloc-dev
- libc-ares-dev
- cmake - cmake
- cmake-data - cmake-data
before_install: before_install:
- $CC --version - $CC --version
- if [ "$CXX" = "g++" ]; then export CXX="g++-8" CC="gcc-8"; fi - if [ "$CXX" = "g++" ]; then export CXX="g++-4.9" CC="gcc-4.9"; fi
- $CC --version - $CC --version
- go version - go version
- cmake --version - cmake --version
before_script: before_script:
# First build spdylay, since integration tests require it.
# spdylay is going to be built under third-party/spdylay
- cd third-party
- git clone https://github.com/tatsuhiro-t/spdylay.git
- cd spdylay
- autoreconf -i
- ./configure --disable-src --disable-examples
- make check
- export SPDYLAY_HOME=$PWD
- cd ../..
# Now build nghttp2 # Now build nghttp2
- if [ "$CI_BUILD" = "autotools" ]; then autoreconf -i; fi - if [ "$CI_BUILD" = "autotools" ]; then autoreconf -i; fi
- git submodule update --init - git submodule update --init
- if [ "$CI_BUILD" = "autotools" ]; then ./configure --with-mruby; fi - if [ "$CI_BUILD" = "autotools" ]; then ./configure --enable-werror --with-mruby --with-neverbleed LIBSPDYLAY_CFLAGS="-I$SPDYLAY_HOME/lib/includes" LIBSPDYLAY_LIBS="-L$SPDYLAY_HOME/lib/.libs -lspdylay"; fi
- if [ "$CI_BUILD" = "cmake" ]; then cmake -DENABLE_WERROR=1 -DWITH_MRUBY=1 -DWITH_NEVERBLEED=1; fi - if [ "$CI_BUILD" = "cmake" ]; then cmake -DENABLE_WERROR=1 -DWITH_MRUBY=1 -DWITH_NEVERBLEED=1 -DSPDYLAY_INCLUDE_DIR="$SPDYLAY_HOME/lib/includes" -DSPDYLAY_LIBRARY="$SPDYLAY_HOME/lib/.libs/libspdylay.so"; fi
script: script:
- if [ "$CI_BUILD" = "autotools" ]; then make distcheck DISTCHECK_CONFIGURE_FLAGS="--with-mruby --with-neverbleed --enable-werror CPPFLAGS=-fsanitize=address LDFLAGS=\"-fsanitize=address -fuse-ld=gold\""; fi - make
- if [ "$CI_BUILD" = "cmake" ]; then make check; fi - make check
- cd integration-tests
# As of April, 23, 2016, golang http2 build fails, probably because # As of April, 23, 2016, golang http2 build fails, probably because
# the default go version is too old. # the default go version is too old.
# - cd integration-tests
# - export GOPATH="$PWD/integration-tests/golang" # - export GOPATH="$PWD/integration-tests/golang"
# - make itprep # - make itprep
# - make it # - make it

36
AUTHORS
View File

@@ -16,43 +16,28 @@ github issues [2].
187j3x1 187j3x1
Alek Storm Alek Storm
Alex Nalivko Alex Nalivko
Alexandros Konstantinakis-Karmis
Alexis La Goutte Alexis La Goutte
Amir Pakdel
Anders Bakken Anders Bakken
Andreas Pohl Andreas Pohl
Andy Davies Andy Davies
Angus Gratton
Anna Henningsen
Ant Bryan Ant Bryan
Benedikt Christoph Wolters
Benjamin Peterson
Bernard Spil Bernard Spil
Brendan Heinonen
Brian Card Brian Card
Brian Suh Brian Suh
Daniel Evers
Daniel Stenberg Daniel Stenberg
Dave Reisner Dave Reisner
David Beitey David Beitey
David Weekly David Weekly
Dmitriy Vetutnev
Don
Dylan Plecki
Etienne Cimon Etienne Cimon
Fabian Möller Fabian Möller
Fabian Wiesel Fabian Wiesel
Gabi Davar Gabi Davar
Gitai
Google Inc.
Jacob Champion Jacob Champion
Jan Kundrát
Jan-E Jan-E
Janusz Dziemidowicz Janusz Dziemidowicz
Jay Satiro Jay Satiro
Jianqing Wang Jianqing Wang
Jim Morrison Jim Morrison
Josh Braegger
José F. Calcerrada José F. Calcerrada
Kamil Dudka Kamil Dudka
Kazuho Oku Kazuho Oku
@@ -60,61 +45,40 @@ Kenny (kang-yen) Peng
Kenny Peng Kenny Peng
Kit Chan Kit Chan
Kyle Schomp Kyle Schomp
LazyHamster
Lucas Pardue Lucas Pardue
MATSUMOTO Ryosuke MATSUMOTO Ryosuke
Marc Bachmann
Matt Rudary
Matt Way
Mike Conlen Mike Conlen
Mike Frysinger Mike Frysinger
Mike Lothian
Nicholas Hurley Nicholas Hurley
Nora Shoemaker Nora Shoemaker
Pedro Santos
Peeyush Aggarwal Peeyush Aggarwal
Peter Wu Peter Wu
Piotr Sikora Piotr Sikora
Raul Gutierrez Segales Raul Gutierrez Segales
Remo E Remo E
Reza Tavakoli Reza Tavakoli
Rick Lei
Ross Smith II Ross Smith II
Scott Mitchell Scott Mitchell
Sebastiaan Deckers
Simone Basso
Soham Sinha
Stefan Eissing Stefan Eissing
Stephen Ludin Stephen Ludin
Sunpoet Po-Chuan Hsieh Sunpoet Po-Chuan Hsieh
Svante Signell Svante Signell
Syohei YOSHIDA Syohei YOSHIDA
Tapanito
Tatsuhiko Kubo Tatsuhiko Kubo
Tatsuhiro Tsujikawa Tatsuhiro Tsujikawa
Tobias Geerinckx-Rice
Tom Harwood Tom Harwood
Tomasz Buchert Tomasz Buchert
Tomasz Torcz
Vernon Tang Vernon Tang
Viacheslav Biriukov Viacheslav Biriukov
Viktor Szakats
Viktor Szépe Viktor Szépe
Wenfeng Liu
Xiaoguang Sun Xiaoguang Sun
Zhuoyun Wei Zhuoyun Wei
acesso acesso
ayanamist ayanamist
bxshi bxshi
clemahieu
dalf
dawg
es es
fangdingjun fangdingjun
jwchoi
kumagi kumagi
lstefani
makovich
mod-h2-dev mod-h2-dev
moparisthebest moparisthebest
snnn snnn

View File

@@ -24,15 +24,15 @@
cmake_minimum_required(VERSION 3.0) cmake_minimum_required(VERSION 3.0)
# XXX using 1.8.90 instead of 1.9.0-DEV # XXX using 1.8.90 instead of 1.9.0-DEV
project(nghttp2 VERSION 1.36.0) project(nghttp2 VERSION 1.13.90)
# See versioning rule: # See versioning rule:
# http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html # http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
set(LT_CURRENT 31) set(LT_CURRENT 23)
set(LT_REVISION 1) set(LT_REVISION 0)
set(LT_AGE 17) set(LT_AGE 9)
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH}) set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
include(Version) include(Version)
math(EXPR LT_SOVERSION "${LT_CURRENT} - ${LT_AGE}") math(EXPR LT_SOVERSION "${LT_CURRENT} - ${LT_AGE}")
@@ -59,7 +59,6 @@ find_package(PythonInterp)
# Auto-detection of features that can be toggled # Auto-detection of features that can be toggled
find_package(OpenSSL 1.0.1) find_package(OpenSSL 1.0.1)
find_package(Libev 4.11) find_package(Libev 4.11)
find_package(Libcares 1.7.5)
find_package(ZLIB 1.2.3) find_package(ZLIB 1.2.3)
if(OPENSSL_FOUND AND LIBEV_FOUND AND ZLIB_FOUND) if(OPENSSL_FOUND AND LIBEV_FOUND AND ZLIB_FOUND)
set(ENABLE_APP_DEFAULT ON) set(ENABLE_APP_DEFAULT ON)
@@ -79,7 +78,7 @@ else()
set(ENABLE_PYTHON_BINDINGS_DEFAULT OFF) set(ENABLE_PYTHON_BINDINGS_DEFAULT OFF)
endif() endif()
find_package(LibXml2 2.6.26) find_package(LibXml2 2.7.7)
set(WITH_LIBXML2_DEFAULT ${LIBXML2_FOUND}) set(WITH_LIBXML2_DEFAULT ${LIBXML2_FOUND})
find_package(Jemalloc) find_package(Jemalloc)
set(WITH_JEMALLOC_DEFAULT ${JEMALLOC_FOUND}) set(WITH_JEMALLOC_DEFAULT ${JEMALLOC_FOUND})
@@ -110,14 +109,24 @@ foreach(_build_type "Release" "MinSizeRel" "RelWithDebInfo")
endforeach() endforeach()
endforeach() endforeach()
#
# If we're running GCC or clang define _U_ to be "__attribute__((unused))"
# so we can use _U_ to flag unused function parameters and not get warnings
# about them. Otherwise, define _U_ to be an empty string so that _U_ used
# to flag an unused function parameters will compile with other compilers.
#
# XXX - similar hints for other compilers?
#
if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang") if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang")
set(HINT_UNUSED_PARAM "__attribute__((unused))")
set(HINT_NORETURN "__attribute__((noreturn))") set(HINT_NORETURN "__attribute__((noreturn))")
else() else()
set(HINT_UNUSED_PARAM)
set(HINT_NORETURN) set(HINT_NORETURN)
endif() endif()
include(ExtractValidFlags) include(ExtractValidFlags)
foreach(_cxx1x_flag -std=c++14) foreach(_cxx1x_flag -std=c++11 -std=c++0x)
extract_valid_cxx_flags(_cxx1x_flag_supported ${_cxx1x_flag}) extract_valid_cxx_flags(_cxx1x_flag_supported ${_cxx1x_flag})
if(_cxx1x_flag_supported) if(_cxx1x_flag_supported)
set(CXX1XCXXFLAGS ${_cxx1x_flag}) set(CXX1XCXXFLAGS ${_cxx1x_flag})
@@ -198,14 +207,6 @@ if(LIBEVENT_FOUND)
# Must both link the core and openssl libraries. # Must both link the core and openssl libraries.
set(LIBEVENT_OPENSSL_LIBRARIES ${LIBEVENT_LIBRARIES}) set(LIBEVENT_OPENSSL_LIBRARIES ${LIBEVENT_LIBRARIES})
endif() endif()
# libc-ares (for src)
set(HAVE_LIBCARES ${LIBCARES_FOUND})
if(LIBCARES_FOUND)
set(LIBCARES_INCLUDE_DIRS ${LIBCARES_INCLUDE_DIR})
else()
set(LIBCARES_INCLUDE_DIRS "")
set(LIBCARES_LIBRARIES "")
endif()
# jansson (for src/nghttp, src/deflatehd and src/inflatehd) # jansson (for src/nghttp, src/deflatehd and src/inflatehd)
set(HAVE_JANSSON ${JANSSON_FOUND}) set(HAVE_JANSSON ${JANSSON_FOUND})
# libxml2 (for src/nghttp) # libxml2 (for src/nghttp)
@@ -302,8 +303,8 @@ check_type_size("time_t" SIZEOF_TIME_T)
include(CheckFunctionExists) include(CheckFunctionExists)
check_function_exists(_Exit HAVE__EXIT) check_function_exists(_Exit HAVE__EXIT)
check_function_exists(accept4 HAVE_ACCEPT4) check_function_exists(accept4 HAVE_ACCEPT4)
check_function_exists(mkostemp HAVE_MKOSTEMP)
# timerfd_create was added in linux kernel 2.6.25
include(CheckSymbolExists) include(CheckSymbolExists)
# XXX does this correctly detect initgroups (un)availability on cygwin? # XXX does this correctly detect initgroups (un)availability on cygwin?
check_symbol_exists(initgroups grp.h HAVE_DECL_INITGROUPS) check_symbol_exists(initgroups grp.h HAVE_DECL_INITGROUPS)
@@ -315,6 +316,13 @@ if(NOT HAVE_DECL_INITGROUPS AND HAVE_UNISTD_H)
endif() endif()
endif() endif()
check_function_exists(timerfd_create HAVE_TIMERFD_CREATE)
# Checks for epoll availability, primarily for examples/tiny-nghttpd
check_symbol_exists(epoll_create sys/epoll.h HAVE_EPOLL)
if(HAVE_EPOLL AND HAVE_TIMERFD_CREATE)
set(ENABLE_TINY_NGHTTPD 1)
endif()
set(WARNCFLAGS) set(WARNCFLAGS)
set(WARNCXXFLAGS) set(WARNCXXFLAGS)
if(CMAKE_C_COMPILER_ID MATCHES "MSVC") if(CMAKE_C_COMPILER_ID MATCHES "MSVC")
@@ -400,10 +408,10 @@ configure_file(cmakeconfig.h.in config.h)
# autotools-compatible names # autotools-compatible names
# Sphinx expects relative paths in the .rst files. Use the fact that the files # Sphinx expects relative paths in the .rst files. Use the fact that the files
# below are all one directory level deep. # below are all one directory level deep.
file(RELATIVE_PATH top_srcdir "${CMAKE_CURRENT_BINARY_DIR}/dir" "${CMAKE_CURRENT_SOURCE_DIR}") file(RELATIVE_PATH top_srcdir "${CMAKE_BINARY_DIR}/dir" "${CMAKE_SOURCE_DIR}")
file(RELATIVE_PATH top_builddir "${CMAKE_CURRENT_BINARY_DIR}/dir" "${CMAKE_CURRENT_BINARY_DIR}") file(RELATIVE_PATH top_builddir "${CMAKE_BINARY_DIR}/dir" "${CMAKE_BINARY_DIR}")
set(abs_top_srcdir "${CMAKE_CURRENT_SOURCE_DIR}") set(abs_top_srcdir "${CMAKE_SOURCE_DIR}")
set(abs_top_builddir "${CMAKE_CURRENT_BINARY_DIR}") set(abs_top_builddir "${CMAKE_BINARY_DIR}")
# libnghttp2.pc (pkg-config file) # libnghttp2.pc (pkg-config file)
set(prefix "${CMAKE_INSTALL_PREFIX}") set(prefix "${CMAKE_INSTALL_PREFIX}")
set(exec_prefix "${CMAKE_INSTALL_PREFIX}") set(exec_prefix "${CMAKE_INSTALL_PREFIX}")
@@ -442,7 +450,7 @@ foreach(name
endforeach() endforeach()
include_directories( include_directories(
"${CMAKE_CURRENT_BINARY_DIR}" # for config.h "${CMAKE_BINARY_DIR}" # for config.h
) )
# For use in src/CMakeLists.txt # For use in src/CMakeLists.txt
set(PKGDATADIR "${CMAKE_INSTALL_FULL_DATADIR}/${CMAKE_PROJECT_NAME}") set(PKGDATADIR "${CMAKE_INSTALL_FULL_DATADIR}/${CMAKE_PROJECT_NAME}")
@@ -491,7 +499,6 @@ message(STATUS "summary of build options:
OpenSSL: ${HAVE_OPENSSL} (LIBS='${OPENSSL_LIBRARIES}') OpenSSL: ${HAVE_OPENSSL} (LIBS='${OPENSSL_LIBRARIES}')
Libxml2: ${HAVE_LIBXML2} (LIBS='${LIBXML2_LIBRARIES}') Libxml2: ${HAVE_LIBXML2} (LIBS='${LIBXML2_LIBRARIES}')
Libev: ${HAVE_LIBEV} (LIBS='${LIBEV_LIBRARIES}') Libev: ${HAVE_LIBEV} (LIBS='${LIBEV_LIBRARIES}')
Libc-ares: ${HAVE_LIBCARES} (LIBS='${LIBCARES_LIBRARIES}')
Libevent(SSL): ${HAVE_LIBEVENT_OPENSSL} (LIBS='${LIBEVENT_OPENSSL_LIBRARIES}') Libevent(SSL): ${HAVE_LIBEVENT_OPENSSL} (LIBS='${LIBEVENT_OPENSSL_LIBRARIES}')
Spdylay: ${HAVE_SPDYLAY} (LIBS='${SPDYLAY_LIBRARIES}') Spdylay: ${HAVE_SPDYLAY} (LIBS='${SPDYLAY_LIBRARIES}')
Jansson: ${HAVE_JANSSON} (LIBS='${JANSSON_LIBRARIES}') Jansson: ${HAVE_JANSSON} (LIBS='${JANSSON_LIBRARIES}')

View File

@@ -14,8 +14,6 @@ option(ENABLE_PYTHON_BINDINGS "Build Python bindings"
${ENABLE_PYTHON_BINDINGS_DEFAULT}) ${ENABLE_PYTHON_BINDINGS_DEFAULT})
option(ENABLE_FAILMALLOC "Build failmalloc test program" ON) option(ENABLE_FAILMALLOC "Build failmalloc test program" ON)
option(ENABLE_LIB_ONLY "Build libnghttp2 only. This is a short hand for -DENABLE_APP=0 -DENABLE_EXAMPLES=0 -DENABLE_HPACK_TOOLS=0 -DENABLE_PYTHON_BINDINGS=0") option(ENABLE_LIB_ONLY "Build libnghttp2 only. This is a short hand for -DENABLE_APP=0 -DENABLE_EXAMPLES=0 -DENABLE_HPACK_TOOLS=0 -DENABLE_PYTHON_BINDINGS=0")
option(ENABLE_STATIC_LIB "Build libnghttp2 in static mode also")
option(ENABLE_SHARED_LIB "Build libnghttp2 as a shared library" ON)
option(WITH_LIBXML2 "Use libxml2" option(WITH_LIBXML2 "Use libxml2"
${WITH_LIBXML2_DEFAULT}) ${WITH_LIBXML2_DEFAULT})

View File

@@ -10,47 +10,39 @@
# #
# $ sudo docker run -v /path/to/dest:/out nghttp2-android cp /root/build/nghttp2/src/nghttpx /out # $ sudo docker run -v /path/to/dest:/out nghttp2-android cp /root/build/nghttp2/src/nghttpx /out
FROM ubuntu:vivid
# Only use standalone-toolchain for reduce size
FROM ubuntu:xenial
MAINTAINER Tatsuhiro Tsujikawa MAINTAINER Tatsuhiro Tsujikawa
ENV ANDROID_HOME /root
ENV ANDROID_HOME /root/android
ENV PREFIX $ANDROID_HOME/usr/local
ENV TOOLCHAIN $ANDROID_HOME/toolchain ENV TOOLCHAIN $ANDROID_HOME/toolchain
ENV PATH $TOOLCHAIN/bin:$PATH ENV PATH $TOOLCHAIN/bin:$PATH
ENV NDK_VERSION r14b # It would be better to use nearest ubuntu archive mirror for faster
# downloads.
# RUN sed -ie 's/archive\.ubuntu/jp.archive.ubuntu/g' /etc/apt/sources.list
WORKDIR /root RUN apt-get update
RUN apt-get update && \ # genisoimage, libc6-i386 and lib32stdc++6 are required to decompress ndk.
apt-get install -y unzip make binutils autoconf \ RUN apt-get install -y make binutils autoconf automake autotools-dev libtool \
automake autotools-dev libtool pkg-config git \ pkg-config git curl dpkg-dev libxml2-dev \
curl dpkg-dev libxml2-dev genisoimage libc6-i386 \ genisoimage libc6-i386 lib32stdc++6
lib32stdc++6 python&& \
rm -rf /var/cache/apk/*
# Install toolchain
RUN curl -L -O https://dl.google.com/android/repository/android-ndk-$NDK_VERSION-linux-x86_64.zip && \
unzip -q android-ndk-$NDK_VERSION-linux-x86_64.zip && \
rm android-ndk-$NDK_VERSION-linux-x86_64.zip && \
mkdir -p $ANDROID_HOME/toolchain && \
$ANDROID_HOME/android-ndk-$NDK_VERSION/build/tools/make-standalone-toolchain.sh \
--install-dir=$ANDROID_HOME/toolchain \
--toolchain=arm-linux-androideabi-4.9 \
--force && \
rm -r android-ndk-$NDK_VERSION
ENV PREFIX /root/usr/local
# Setup version of libraries
ENV OPENSSL_VERSION 1.0.2d
ENV SPDYLAY_VERSION v1.4.0
ENV LIBEV_VERSION 4.19
ENV ZLIB_VERSION 1.2.8
ENV CARES_VERSION 1.13.0
ENV NGHTTP2_VERSION v1.24.0
WORKDIR /root/build WORKDIR /root/build
RUN git clone https://github.com/tatsuhiro-t/spdylay -b $SPDYLAY_VERSION --depth 1 RUN curl -L -O http://dl.google.com/android/ndk/android-ndk-r10d-linux-x86_64.bin && \
chmod a+x android-ndk-r10d-linux-x86_64.bin && \
./android-ndk-r10d-linux-x86_64.bin && \
rm android-ndk-r10d-linux-x86_64.bin
WORKDIR /root/build/android-ndk-r10d
RUN /bin/bash build/tools/make-standalone-toolchain.sh \
--install-dir=$ANDROID_HOME/toolchain \
--toolchain=arm-linux-androideabi-4.9 --llvm-version=3.5 \
--system=linux-x86_64
WORKDIR /root/build
RUN git clone https://github.com/tatsuhiro-t/spdylay
WORKDIR /root/build/spdylay WORKDIR /root/build/spdylay
RUN autoreconf -i && \ RUN autoreconf -i && \
./configure \ ./configure \
@@ -67,22 +59,22 @@ RUN autoreconf -i && \
make install make install
WORKDIR /root/build WORKDIR /root/build
RUN curl -L -O https://www.openssl.org/source/openssl-$OPENSSL_VERSION.tar.gz && \ RUN curl -L -O https://www.openssl.org/source/openssl-1.0.2d.tar.gz && \
tar xf openssl-$OPENSSL_VERSION.tar.gz && \ tar xf openssl-1.0.2d.tar.gz && \
rm openssl-$OPENSSL_VERSION.tar.gz rm openssl-1.0.2d.tar.gz
WORKDIR /root/build/openssl-$OPENSSL_VERSION WORKDIR /root/build/openssl-1.0.2d
RUN export CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi- && \ RUN export CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi- && \
./Configure --prefix=$PREFIX android && \ ./Configure --prefix=$PREFIX android && \
make && make install_sw make && make install_sw
WORKDIR /root/build WORKDIR /root/build
RUN curl -L -O http://dist.schmorp.de/libev/Attic/libev-$LIBEV_VERSION.tar.gz && \ RUN curl -L -O http://dist.schmorp.de/libev/libev-4.19.tar.gz && \
curl -L -O https://gist.github.com/tatsuhiro-t/48c45f08950f587180ed/raw/80a8f003b5d1091eae497c5995bbaa68096e739b/libev-4.19-android.patch && \ curl -L -O https://gist.github.com/tatsuhiro-t/48c45f08950f587180ed/raw/80a8f003b5d1091eae497c5995bbaa68096e739b/libev-4.19-android.patch && \
tar xf libev-$LIBEV_VERSION.tar.gz && \ tar xf libev-4.19.tar.gz && \
rm libev-$LIBEV_VERSION.tar.gz rm libev-4.19.tar.gz
WORKDIR /root/build/libev-$LIBEV_VERSION WORKDIR /root/build/libev-4.19
RUN patch -p1 < ../libev-4.19-android.patch && \ RUN patch -p1 < ../libev-4.19-android.patch && \
./configure \ ./configure \
--host=arm-linux-androideabi \ --host=arm-linux-androideabi \
@@ -95,11 +87,11 @@ RUN patch -p1 < ../libev-4.19-android.patch && \
make install make install
WORKDIR /root/build WORKDIR /root/build
RUN curl -L -O https://downloads.sourceforge.net/project/libpng/zlib/$ZLIB_VERSION/zlib-$ZLIB_VERSION.tar.gz && \ RUN curl -L -O http://zlib.net/zlib-1.2.8.tar.gz && \
tar xf zlib-$ZLIB_VERSION.tar.gz && \ tar xf zlib-1.2.8.tar.gz && \
rm zlib-$ZLIB_VERSION.tar.gz rm zlib-1.2.8.tar.gz
WORKDIR /root/build/zlib-$ZLIB_VERSION WORKDIR /root/build/zlib-1.2.8
RUN HOST=arm-linux-androideabi \ RUN HOST=arm-linux-androideabi \
CC=$HOST-gcc \ CC=$HOST-gcc \
AR=$HOST-ar \ AR=$HOST-ar \
@@ -113,26 +105,11 @@ RUN HOST=arm-linux-androideabi \
--static && \ --static && \
make install make install
WORKDIR /root/build WORKDIR /root/build
RUN curl -L -O https://c-ares.haxx.se/download/c-ares-$CARES_VERSION.tar.gz && \ RUN git clone https://github.com/nghttp2/nghttp2
tar xf c-ares-$CARES_VERSION.tar.gz && \
rm c-ares-$CARES_VERSION.tar.gz
WORKDIR /root/build/c-ares-$CARES_VERSION
RUN ./configure \
--host=arm-linux-androideabi \
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
--prefix=$PREFIX \
--disable-shared && \
make install
WORKDIR /root/build
RUN git clone https://github.com/nghttp2/nghttp2 -b $NGHTTP2_VERSION --depth 1
WORKDIR /root/build/nghttp2 WORKDIR /root/build/nghttp2
RUN autoreconf -i && \ RUN autoreconf -i && \
./configure \ ./configure \
--enable-app \
--disable-shared \ --disable-shared \
--host=arm-linux-androideabi \ --host=arm-linux-androideabi \
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \ --build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
@@ -141,9 +118,10 @@ RUN autoreconf -i && \
--disable-python-bindings \ --disable-python-bindings \
--disable-examples \ --disable-examples \
--disable-threads \ --disable-threads \
CC="$TOOLCHAIN"/bin/arm-linux-androideabi-clang \ LIBSPDYLAY_CFLAGS=-I$PREFIX/usr/local/include \
CXX="$TOOLCHAIN"/bin/arm-linux-androideabi-clang++ \ LIBSPDYLAY_LIBS="-L$PREFIX/usr/local/lib -lspdylay" \
CPPFLAGS="-fPIE -I$PREFIX/include" \ CPPFLAGS="-fPIE -I$PREFIX/include" \
CXXFLAGS="-fno-strict-aliasing" \
PKG_CONFIG_LIBDIR="$PREFIX/lib/pkgconfig" \ PKG_CONFIG_LIBDIR="$PREFIX/lib/pkgconfig" \
LDFLAGS="-fPIE -pie -L$PREFIX/lib" && \ LDFLAGS="-fPIE -pie -L$PREFIX/lib" && \
make && \ make && \

View File

@@ -45,8 +45,7 @@ EXTRA_DIST = nghttpx.conf.sample proxy.pac.sample android-config android-make \
cmake/Version.cmake \ cmake/Version.cmake \
cmake/FindCython.cmake \ cmake/FindCython.cmake \
cmake/FindLibevent.cmake \ cmake/FindLibevent.cmake \
cmake/FindJansson.cmake \ cmake/FindJansson.cmake
cmake/FindLibcares.cmake
.PHONY: clang-format .PHONY: clang-format

View File

@@ -4,10 +4,10 @@ nghttp2 - HTTP/2 C Library
This is an implementation of the Hypertext Transfer Protocol version 2 This is an implementation of the Hypertext Transfer Protocol version 2
in C. in C.
The framing layer of HTTP/2 is implemented as a reusable C library. The framing layer of HTTP/2 is implemented as a reusable C
On top of that, we have implemented an HTTP/2 client, server and library. On top of that, we have implemented an HTTP/2 client, server
proxy. We have also developed load test and benchmarking tools for and proxy. We have also developed load test and benchmarking tools for
HTTP/2. HTTP/2 and SPDY.
An HPACK encoder and decoder are available as a public API. An HPACK encoder and decoder are available as a public API.
@@ -34,8 +34,8 @@ implementation.
* https://nghttp2.org/ (TLS + ALPN/NPN) * https://nghttp2.org/ (TLS + ALPN/NPN)
This endpoint supports ``h2``, ``h2-16``, ``h2-14``, and This endpoint supports ``h2``, ``h2-16``, ``h2-14``, ``spdy/3.1``
``http/1.1`` via ALPN/NPN and requires TLSv1.2 for HTTP/2 and ``http/1.1`` via ALPN/NPN and requires TLSv1.2 for HTTP/2
connection. connection.
* http://nghttp2.org/ (HTTP Upgrade and HTTP/2 Direct) * http://nghttp2.org/ (HTTP Upgrade and HTTP/2 Direct)
@@ -58,11 +58,6 @@ To build the documentation, you need to install:
* sphinx (http://sphinx-doc.org/) * sphinx (http://sphinx-doc.org/)
If you need libnghttp2 (C library) only, then the above packages are
all you need. Use ``--enable-lib-only`` to ensure that only
libnghttp2 is built. This avoids potential build error related to
building bundled applications.
To build and run the application programs (``nghttp``, ``nghttpd``, To build and run the application programs (``nghttp``, ``nghttpd``,
``nghttpx`` and ``h2load``) in the ``src`` directory, the following packages ``nghttpx`` and ``h2load``) in the ``src`` directory, the following packages
are required: are required:
@@ -70,21 +65,20 @@ are required:
* OpenSSL >= 1.0.1 * OpenSSL >= 1.0.1
* libev >= 4.11 * libev >= 4.11
* zlib >= 1.2.3 * zlib >= 1.2.3
* libc-ares >= 1.7.5
ALPN support requires OpenSSL >= 1.0.2 (released 22 January 2015). ALPN support requires OpenSSL >= 1.0.2 (released 22 January 2015).
LibreSSL >= 2.2.0 can be used instead of OpenSSL, but OpenSSL has more LibreSSL >= 2.2.0 can be used instead of OpenSSL, but OpenSSL has more
features than LibreSSL at the time of this writing. features than LibreSSL at the time of this writing.
To enable the SPDY protocol in the application program ``nghttpx`` and
``h2load``, the following package is required:
* spdylay >= 1.3.2
To enable ``-a`` option (getting linked assets from the downloaded To enable ``-a`` option (getting linked assets from the downloaded
resource) in ``nghttp``, the following package is required: resource) in ``nghttp``, the following package is required:
* libxml2 >= 2.6.26 * libxml2 >= 2.7.7
To enable systemd support in nghttpx, the following package is
required:
* libsystemd-dev >= 209
The HPACK tools require the following package: The HPACK tools require the following package:
@@ -99,11 +93,6 @@ To mitigate heap fragmentation in long running server programs
* jemalloc * jemalloc
.. note::
Alpine Linux currently does not support malloc replacement
due to musl limitations. See details in issue `#762 <https://github.com/nghttp2/nghttp2/issues/762>`_.
libnghttp2_asio C++ library requires the following packages: libnghttp2_asio C++ library requires the following packages:
* libboost-dev >= 1.54.0 * libboost-dev >= 1.54.0
@@ -115,15 +104,17 @@ The Python bindings require the following packages:
* python >= 2.7 * python >= 2.7
* python-setuptools * python-setuptools
If you are using Ubuntu 16.04 LTS (Xenial Xerus) or Debian 8 (jessie) If you are using Ubuntu 14.04 LTS (trusty) or Debian 7.0 (wheezy) and above run the following to install the needed packages:
and above, run the following to install the required packages:
.. code-block:: text .. code-block:: text
sudo apt-get install g++ make binutils autoconf automake autotools-dev libtool pkg-config \ sudo apt-get install g++ make binutils autoconf automake autotools-dev libtool pkg-config \
zlib1g-dev libcunit1-dev libssl-dev libxml2-dev libev-dev libevent-dev libjansson-dev \ zlib1g-dev libcunit1-dev libssl-dev libxml2-dev libev-dev libevent-dev libjansson-dev \
libc-ares-dev libjemalloc-dev libsystemd-dev \ libjemalloc-dev cython python3-dev python-setuptools
cython python3-dev python-setuptools
From Ubuntu 15.10, spdylay has been available as a package named
`libspdylay-dev`. For the earlier Ubuntu release, you need to build
it yourself: http://tatsuhiro-t.github.io/spdylay/
To enable mruby support for nghttpx, `mruby To enable mruby support for nghttpx, `mruby
<https://github.com/mruby/mruby>`_ is required. We need to build <https://github.com/mruby/mruby>`_ is required. We need to build
@@ -145,12 +136,26 @@ minimizes the risk of private key leakage when serious bug like
Heartbleed is exploited. The neverbleed is disabled by default. To Heartbleed is exploited. The neverbleed is disabled by default. To
enable it, use ``--with-neverbleed`` configure option. enable it, use ``--with-neverbleed`` configure option.
In order to compile the source code, gcc >= 6.0 or clang >= 6.0 is Building from git
required. C++ source code requires C++14 language features. -----------------
Building from git is easy, but please be sure that at least autoconf 2.68 is
used:
.. code-block:: text
$ autoreconf -i
$ automake
$ autoconf
$ ./configure
$ make
To compile the source code, gcc >= 4.8.3 or clang >= 3.4 is required.
.. note:: .. note::
To enable mruby support in nghttpx, and use ``--with-mruby`` To enable mruby support in nghttpx, run ``git submodule update
--init`` before running configure script, and use ``--with-mruby``
configure option. configure option.
.. note:: .. note::
@@ -171,62 +176,6 @@ required. C++ source code requires C++14 language features.
applications were not built, then using ``--enable-app`` may find applications were not built, then using ``--enable-app`` may find
that cause, such as the missing dependency. that cause, such as the missing dependency.
.. note::
In order to detect third party libraries, pkg-config is used
(however we don't use pkg-config for some libraries (e.g., libev)).
By default, pkg-config searches ``*.pc`` file in the standard
locations (e.g., /usr/lib/pkgconfig). If it is necessary to use
``*.pc`` file in the custom location, specify paths to
``PKG_CONFIG_PATH`` environment variable, and pass it to configure
script, like so:
.. code-block:: text
$ ./configure PKG_CONFIG_PATH=/path/to/pkgconfig
For pkg-config managed libraries, ``*_CFLAG`` and ``*_LIBS``
environment variables are defined (e.g., ``OPENSSL_CFLAGS``,
``OPENSSL_LIBS``). Specifying non-empty string to these variables
completely overrides pkg-config. In other words, if they are
specified, pkg-config is not used for detection, and user is
responsible to specify the correct values to these variables. For
complete list of these variables, run ``./configure -h``.
Building nghttp2 from release tar archive
-----------------------------------------
The nghttp2 project regularly releases tar archives which includes
nghttp2 source code, and generated build files. They can be
downloaded from `Releases
<https://github.com/nghttp2/nghttp2/releases>`_ page.
Building nghttp2 from git requires autotools development packages.
Building from tar archives does not require them, and thus it is much
easier. The usual build step is as follows:
.. code-block:: text
$ tar xf nghttp2-X.Y.Z.tar.bz2
$ cd nghttp2-X.Y.Z
$ ./configure
$ make
Building from git
-----------------
Building from git is easy, but please be sure that at least autoconf 2.68 is
used:
.. code-block:: text
$ git submodule update --init
$ autoreconf -i
$ automake
$ autoconf
$ ./configure
$ make
Notes for building on Windows (MSVC) Notes for building on Windows (MSVC)
------------------------------------ ------------------------------------
@@ -273,18 +222,6 @@ If you want to compile the applications under ``examples/``, you need
to remove or rename the ``event.h`` from libev's installation, because to remove or rename the ``event.h`` from libev's installation, because
it conflicts with libevent's installation. it conflicts with libevent's installation.
Notes for installation on Linux systems
--------------------------------------------
After installing nghttp2 tool suite with ``make install`` one might experience a similar error:
.. code-block:: text
nghttpx: error while loading shared libraries: libnghttp2.so.14: cannot open shared object file: No such file or directory
This means that the tool is unable to locate the ``libnghttp2.so`` shared library.
To update the shared library cache run ``sudo ldconfig``.
Building the documentation Building the documentation
-------------------------- --------------------------
@@ -320,6 +257,7 @@ its testing framework. We depend on the following libraries:
* golang.org/x/net/http2 * golang.org/x/net/http2
* golang.org/x/net/websocket * golang.org/x/net/websocket
* https://github.com/tatsuhiro-t/go-nghttp2 * https://github.com/tatsuhiro-t/go-nghttp2
* https://github.com/tatsuhiro-t/spdy
To download the above packages, after settings ``GOPATH``, run the To download the above packages, after settings ``GOPATH``, run the
following command under ``integration-tests`` directory: following command under ``integration-tests`` directory:
@@ -337,6 +275,11 @@ To run the tests, run the following command under
Inside the tests, we use port 3009 to run the test subject server. Inside the tests, we use port 3009 to run the test subject server.
.. note::
github.com/tatsuhiro-t/spdy is a copy used to be available at
golang.org/x/net/spdy, but it is now gone.
Migration from v0.7.15 or earlier Migration from v0.7.15 or earlier
--------------------------------- ---------------------------------
@@ -737,7 +680,7 @@ information. Here is sample output from ``nghttpd``:
nghttpx - proxy nghttpx - proxy
+++++++++++++++ +++++++++++++++
``nghttpx`` is a multi-threaded reverse proxy for HTTP/2, and ``nghttpx`` is a multi-threaded reverse proxy for HTTP/2, SPDY and
HTTP/1.1, and powers http://nghttp2.org and supports HTTP/2 server HTTP/1.1, and powers http://nghttp2.org and supports HTTP/2 server
push. push.
@@ -752,30 +695,31 @@ to know how to migrate from earlier releases.
``nghttpx`` implements `important performance-oriented features ``nghttpx`` implements `important performance-oriented features
<https://istlsfastyet.com/#server-performance>`_ in TLS, such as <https://istlsfastyet.com/#server-performance>`_ in TLS, such as
session IDs, session tickets (with automatic key rotation), OCSP session IDs, session tickets (with automatic key rotation), OCSP
stapling, dynamic record sizing, ALPN/NPN, forward secrecy and HTTP/2. stapling, dynamic record sizing, ALPN/NPN, forward secrecy and SPDY &
``nghttpx`` also offers the functionality to share session cache and HTTP/2. ``nghttpx`` also offers the functionality to share session
ticket keys among multiple ``nghttpx`` instances via memcached. cache and ticket keys among multiple ``nghttpx`` instances via
memcached.
``nghttpx`` has 2 operation modes: ``nghttpx`` has 2 operation modes:
================== ================ ================ ============= ================== ====================== ================ =============
Mode option Frontend Backend Note Mode option Frontend Backend Note
================== ================ ================ ============= ================== ====================== ================ =============
default mode HTTP/2, HTTP/1.1 HTTP/1.1, HTTP/2 Reverse proxy default mode HTTP/2, SPDY, HTTP/1.1 HTTP/1.1, HTTP/2 Reverse proxy
``--http2-proxy`` HTTP/2, HTTP/1.1 HTTP/1.1, HTTP/2 Forward proxy ``--http2-proxy`` HTTP/2, SPDY, HTTP/1.1 HTTP/1.1, HTTP/2 Forward proxy
================== ================ ================ ============= ================== ====================== ================ =============
The interesting mode at the moment is the default mode. It works like The interesting mode at the moment is the default mode. It works like
a reverse proxy and listens for HTTP/2, and HTTP/1.1 and can be a reverse proxy and listens for HTTP/2, SPDY and HTTP/1.1 and can be
deployed as a SSL/TLS terminator for existing web server. deployed as a SSL/TLS terminator for existing web server.
In all modes, the frontend connections are encrypted by SSL/TLS by In all modes, the frontend connections are encrypted by SSL/TLS by
default. To disable encryption, use the ``no-tls`` keyword in default. To disable encryption, use the ``no-tls`` keyword in
``--frontend`` option. If encryption is disabled, incoming HTTP/1.1 ``--frontend`` option. If encryption is disabled, SPDY is disabled in
connections can be upgraded to HTTP/2 through HTTP Upgrade. On the the frontend and incoming HTTP/1.1 connections can be upgraded to
other hard, backend connections are not encrypted by default. To HTTP/2 through HTTP Upgrade. On the other hard, backend connections
encrypt backend connections, use ``tls`` keyword in ``--backend`` are not encrypted by default. To encrypt backend connections, use
option. ``tls`` keyword in ``--backend`` option.
``nghttpx`` supports a configuration file. See the ``--conf`` option and ``nghttpx`` supports a configuration file. See the ``--conf`` option and
sample configuration file ``nghttpx.conf.sample``. sample configuration file ``nghttpx.conf.sample``.
@@ -785,15 +729,15 @@ server:
.. code-block:: text .. code-block:: text
Client <-- (HTTP/2, HTTP/1.1) --> nghttpx <-- (HTTP/1.1, HTTP/2) --> Web Server Client <-- (HTTP/2, SPDY, HTTP/1.1) --> nghttpx <-- (HTTP/1.1, HTTP/2) --> Web Server
[reverse proxy] [reverse proxy]
With the ``--http2-proxy`` option, it works as forward proxy, and it With the ``--http2-proxy`` option, it works as forward proxy, and it
is so called secure HTTP/2 proxy: is so called secure HTTP/2 proxy (aka SPDY proxy):
.. code-block:: text .. code-block:: text
Client <-- (HTTP/2, HTTP/1.1) --> nghttpx <-- (HTTP/1.1) --> Proxy Client <-- (HTTP/2, SPDY, HTTP/1.1) --> nghttpx <-- (HTTP/1.1) --> Proxy
[secure proxy] (e.g., Squid, ATS) [secure proxy] (e.g., Squid, ATS)
The ``Client`` in the above example needs to be configured to use The ``Client`` in the above example needs to be configured to use
@@ -826,7 +770,7 @@ proxy through an HTTP proxy:
.. code-block:: text .. code-block:: text
Client <-- (HTTP/2, HTTP/1.1) --> nghttpx <-- (HTTP/2) -- Client <-- (HTTP/2, SPDY, HTTP/1.1) --> nghttpx <-- (HTTP/2) --
--===================---> HTTP/2 Proxy --===================---> HTTP/2 Proxy
(HTTP proxy tunnel) (e.g., nghttpx -s) (HTTP proxy tunnel) (e.g., nghttpx -s)
@@ -834,8 +778,9 @@ proxy through an HTTP proxy:
Benchmarking tool Benchmarking tool
----------------- -----------------
The ``h2load`` program is a benchmarking tool for HTTP/2. The UI of The ``h2load`` program is a benchmarking tool for HTTP/2 and SPDY.
``h2load`` is heavily inspired by ``weighttp`` The SPDY support is enabled if the program was built with the spdylay
library. The UI of ``h2load`` is heavily inspired by ``weighttp``
(https://github.com/lighttpd/weighttp). The typical usage is as (https://github.com/lighttpd/weighttp). The typical usage is as
follows: follows:
@@ -951,7 +896,7 @@ output_length
The length of the compressed header block. The length of the compressed header block.
percentage_of_original_size percentage_of_original_size
``output_length`` / ``input_length`` * 100 ``input_length`` / ``output_length`` * 100
wire wire
The compressed header block as a hex string. The compressed header block as a hex string.
@@ -1332,7 +1277,7 @@ are:
* Boost::Thread * Boost::Thread
The server API is designed to build an HTTP/2 server very easily to utilize The server API is designed to build an HTTP/2 server very easily to utilize
C++14 anonymous functions and closures. The bare minimum example of C++11 anonymous functions and closures. The bare minimum example of
an HTTP/2 server looks like this: an HTTP/2 server looks like this:
.. code-block:: cpp .. code-block:: cpp
@@ -1425,7 +1370,7 @@ The extension module is called ``nghttp2``.
determined by the ``configure`` script. If the detected Python version is not determined by the ``configure`` script. If the detected Python version is not
what you expect, specify a path to Python executable in a ``PYTHON`` what you expect, specify a path to Python executable in a ``PYTHON``
variable as an argument to configure script (e.g., ``./configure variable as an argument to configure script (e.g., ``./configure
PYTHON=/usr/bin/python3.5``). PYTHON=/usr/bin/python3.4``).
The following example code illustrates basic usage of the HPACK compressor The following example code illustrates basic usage of the HPACK compressor
and decompressor in Python: and decompressor in Python:
@@ -1555,17 +1500,6 @@ See `Contribution Guidelines
<https://nghttp2.org/documentation/contribute.html>`_ for more <https://nghttp2.org/documentation/contribute.html>`_ for more
details. details.
Reporting vulnerability
-----------------------
If you find a vulnerability in our software, please send the email to
"tatsuhiro.t at gmail dot com" about its details instead of submitting
issues on github issue page. It is a standard practice not to
disclose vulnerability information publicly until a fixed version is
released, or mitigation is worked out.
In the future, we may setup a dedicated mail address for this purpose.
Release schedule Release schedule
---------------- ----------------
@@ -1578,8 +1512,3 @@ severe security bug fixes.
We have no plan to break API compatibility changes involving soname We have no plan to break API compatibility changes involving soname
bump, so MAJOR version will stay 1 for the foreseeable future. bump, so MAJOR version will stay 1 for the foreseeable future.
License
-------
The MIT License

View File

@@ -39,9 +39,8 @@ PATH="$TOOLCHAIN"/bin:"$PATH"
--without-libxml2 \ --without-libxml2 \
--disable-python-bindings \ --disable-python-bindings \
--disable-examples \ --disable-examples \
--disable-threads \ CC="$TOOLCHAIN"/bin/arm-linux-androideabi-gcc \
CC="$TOOLCHAIN"/bin/arm-linux-androideabi-clang \ CXX="$TOOLCHAIN"/bin/arm-linux-androideabi-g++ \
CXX="$TOOLCHAIN"/bin/arm-linux-androideabi-clang++ \
CPPFLAGS="-fPIE -I$PREFIX/include" \ CPPFLAGS="-fPIE -I$PREFIX/include" \
PKG_CONFIG_LIBDIR="$PREFIX/lib/pkgconfig" \ PKG_CONFIG_LIBDIR="$PREFIX/lib/pkgconfig" \
LDFLAGS="-fPIE -pie -L$PREFIX/lib" LDFLAGS="-fPIE -pie -L$PREFIX/lib"

View File

@@ -1,53 +0,0 @@
# Notes:
# - Minimal appveyor.yml file is an empty file. All sections are optional.
# - Indent each level of configuration with 2 spaces. Do not use tabs!
# - All section names are case-sensitive.
# - Section names should be unique on each level.
#---------------------------------#
# general configuration #
#---------------------------------#
# version format
#version: 0.10.{build}
# branches to build
branches:
# blacklist
except:
- gh-pages
# Do not build on tags (GitHub only)
skip_tags: true
#---------------------------------#
# environment configuration #
#---------------------------------#
os: Windows Server 2012
# scripts that run after cloning repository
install:
# install Win-Flex-Bison
#- cmd: cinst winflexbison -y
#---------------------------------#
# build configuration #
#---------------------------------#
# scripts to run before build
before_build:
- cmd: cmake .
# scripts to run *after* solution is built and *before* automatic packaging occurs (web apps, NuGet packages, Azure Cloud Services)
# before_package:
# scripts to run after build
# after_build:
# to run your custom scripts instead of automatic MSBuild
build_script:
- cmd: cmake --build .
# to disable automatic builds
# build: off

View File

@@ -1,52 +0,0 @@
#!/usr/bin/env python
# script to extract commit author's name from standard input. The
# input should be <AUTHOR>:<EMAIL>, one per line.
# This script expects the input is created by git-log command:
#
# git log --format=%aN:%aE
#
# This script removes duplicates based on email address, breaking a
# tie with longer author name. Among the all author names extract the
# previous step, we remove duplicate by case-insensitive match.
#
# So we can do this in one line:
#
# git log --format=%aN:%aE | sort | uniq | ./author.py > authors
import sys
edict = {}
for line in sys.stdin:
author, email = line.strip().split(':', 1)
if email in edict:
an = edict[email]
if len(an) < len(author) or an > author:
sys.stderr.write(
'eliminated {} in favor of {}\n'.format(an, author))
edict[email] = author
else:
sys.stderr.write(
'eliminated {} in favor of {}\n'.format(author, an))
else:
edict[email] = author
names = list(sorted(edict.values()))
ndict = {}
for name in names:
lowname = name.lower()
if lowname in ndict:
an = ndict[lowname]
if an > name:
sys.stderr.write('eliminated {} in favor of {}\n'.format(an, name))
ndict[lowname] = name
else:
sys.stderr.write('eliminated {} in favor of {}\n'.format(name, an))
else:
ndict[lowname] = name
for name in sorted(ndict.values()):
print name

View File

@@ -1,40 +0,0 @@
# - Try to find libcares
# Once done this will define
# LIBCARES_FOUND - System has libcares
# LIBCARES_INCLUDE_DIRS - The libcares include directories
# LIBCARES_LIBRARIES - The libraries needed to use libcares
find_package(PkgConfig QUIET)
pkg_check_modules(PC_LIBCARES QUIET libcares)
find_path(LIBCARES_INCLUDE_DIR
NAMES ares.h
HINTS ${PC_LIBCARES_INCLUDE_DIRS}
)
find_library(LIBCARES_LIBRARY
NAMES cares
HINTS ${PC_LIBCARES_LIBRARY_DIRS}
)
if(LIBCARES_INCLUDE_DIR)
set(_version_regex "^#define[ \t]+ARES_VERSION_STR[ \t]+\"([^\"]+)\".*")
file(STRINGS "${LIBCARES_INCLUDE_DIR}/ares_version.h"
LIBCARES_VERSION REGEX "${_version_regex}")
string(REGEX REPLACE "${_version_regex}" "\\1"
LIBCARES_VERSION "${LIBCARES_VERSION}")
unset(_version_regex)
endif()
include(FindPackageHandleStandardArgs)
# handle the QUIETLY and REQUIRED arguments and set LIBCARES_FOUND to TRUE
# if all listed variables are TRUE and the requested version matches.
find_package_handle_standard_args(Libcares REQUIRED_VARS
LIBCARES_LIBRARY LIBCARES_INCLUDE_DIR
VERSION_VAR LIBCARES_VERSION)
if(LIBCARES_FOUND)
set(LIBCARES_LIBRARIES ${LIBCARES_LIBRARY})
set(LIBCARES_INCLUDE_DIRS ${LIBCARES_INCLUDE_DIR})
endif()
mark_as_advanced(LIBCARES_INCLUDE_DIR LIBCARES_LIBRARY)

View File

@@ -40,9 +40,6 @@ if(LIBEVENT_INCLUDE_DIR)
# Libevent 2.0 # Libevent 2.0
file(STRINGS "${LIBEVENT_INCLUDE_DIR}/event2/event-config.h" file(STRINGS "${LIBEVENT_INCLUDE_DIR}/event2/event-config.h"
LIBEVENT_VERSION REGEX "${_version_regex}") LIBEVENT_VERSION REGEX "${_version_regex}")
if("${LIBEVENT_VERSION}" STREQUAL "")
set(LIBEVENT_VERSION ${PC_LIBEVENT_VERSION})
endif()
else() else()
# Libevent 1.4 # Libevent 1.4
file(STRINGS "${LIBEVENT_INCLUDE_DIR}/event-config.h" file(STRINGS "${LIBEVENT_INCLUDE_DIR}/event-config.h"

View File

@@ -1,3 +1,7 @@
/* Hint to the compiler that a function parameter is not used */
#define _U_ @HINT_UNUSED_PARAM@
/* Hint to the compiler that a function never returns */ /* Hint to the compiler that a function never returns */
#define NGHTTP2_NORETURN @HINT_NORETURN@ #define NGHTTP2_NORETURN @HINT_NORETURN@
@@ -34,9 +38,6 @@
/* Define to 1 if you have the `accept4` function. */ /* Define to 1 if you have the `accept4` function. */
#cmakedefine HAVE_ACCEPT4 1 #cmakedefine HAVE_ACCEPT4 1
/* Define to 1 if you have the `mkostemp` function. */
#cmakedefine HAVE_MKOSTEMP 1
/* Define to 1 if you have the `initgroups` function. */ /* Define to 1 if you have the `initgroups` function. */
#cmakedefine01 HAVE_DECL_INITGROUPS #cmakedefine01 HAVE_DECL_INITGROUPS

View File

@@ -25,7 +25,7 @@ dnl Do not change user variables!
dnl http://www.gnu.org/software/automake/manual/html_node/Flag-Variables-Ordering.html dnl http://www.gnu.org/software/automake/manual/html_node/Flag-Variables-Ordering.html
AC_PREREQ(2.61) AC_PREREQ(2.61)
AC_INIT([nghttp2], [1.36.0], [t-tujikawa@users.sourceforge.net]) AC_INIT([nghttp2], [1.14.0-DEV], [t-tujikawa@users.sourceforge.net])
AC_CONFIG_AUX_DIR([.]) AC_CONFIG_AUX_DIR([.])
AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_HEADERS([config.h]) AC_CONFIG_HEADERS([config.h])
@@ -44,9 +44,9 @@ m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
dnl See versioning rule: dnl See versioning rule:
dnl http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html dnl http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
AC_SUBST(LT_CURRENT, 31) AC_SUBST(LT_CURRENT, 23)
AC_SUBST(LT_REVISION, 1) AC_SUBST(LT_REVISION, 0)
AC_SUBST(LT_AGE, 17) AC_SUBST(LT_AGE, 9)
major=`echo $PACKAGE_VERSION |cut -d. -f1 | sed -e "s/[^0-9]//g"` 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"` minor=`echo $PACKAGE_VERSION |cut -d. -f2 | sed -e "s/[^0-9]//g"`
@@ -117,10 +117,10 @@ AC_ARG_WITH([jemalloc],
[Use jemalloc [default=check]])], [Use jemalloc [default=check]])],
[request_jemalloc=$withval], [request_jemalloc=check]) [request_jemalloc=$withval], [request_jemalloc=check])
AC_ARG_WITH([systemd], AC_ARG_WITH([spdylay],
[AS_HELP_STRING([--with-systemd], [AS_HELP_STRING([--with-spdylay],
[Enable systemd support in nghttpx [default=check]])], [Use spdylay [default=check]])],
[request_systemd=$withval], [request_systemd=check]) [request_spdylay=$withval], [request_spdylay=check])
AC_ARG_WITH([mruby], AC_ARG_WITH([mruby],
[AS_HELP_STRING([--with-mruby], [AS_HELP_STRING([--with-mruby],
@@ -171,16 +171,26 @@ else
AC_SUBST([CYTHON]) AC_SUBST([CYTHON])
fi fi
#
# If we're running GCC or clang define _U_ to be "__attribute__((unused))"
# so we can use _U_ to flag unused function parameters and not get warnings
# about them. Otherwise, define _U_ to be an empty string so that _U_ used
# to flag an unused function parameters will compile with other compilers.
#
# XXX - similar hints for other compilers?
#
if test "x$GCC" = "xyes" -o "x$CC" = "xclang" ; then if test "x$GCC" = "xyes" -o "x$CC" = "xclang" ; then
AC_DEFINE([_U_], [__attribute__((unused))], [Hint to the compiler that a function parameters is not used])
AC_DEFINE([NGHTTP2_NORETURN], [__attribute__((noreturn))], [Hint to the compiler that a function never return]) AC_DEFINE([NGHTTP2_NORETURN], [__attribute__((noreturn))], [Hint to the compiler that a function never return])
else else
AC_DEFINE([_U_], , [Hint to the compiler that a function parameter is not used])
AC_DEFINE([NGHTTP2_NORETURN], , [Hint to the compiler that a function never return]) AC_DEFINE([NGHTTP2_NORETURN], , [Hint to the compiler that a function never return])
fi fi
save_CXXFLAGS="$CXXFLAGS" save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS= CXXFLAGS=
AX_CXX_COMPILE_STDCXX([14], [noext], [optional]) AX_CXX_COMPILE_STDCXX_11([noext], [optional])
CXX1XCXXFLAGS="$CXXFLAGS" CXX1XCXXFLAGS="$CXXFLAGS"
CXXFLAGS="$save_CXXFLAGS" CXXFLAGS="$save_CXXFLAGS"
@@ -224,41 +234,6 @@ std::map<int, int>().emplace(1, 2);
[have_std_map_emplace=no [have_std_map_emplace=no
AC_MSG_RESULT([no])]) AC_MSG_RESULT([no])])
# Check that std::atomic_* overloads for std::shared_ptr are
# available.
AC_MSG_CHECKING([whether std::atomic_* overloads for std::shared_ptr are available])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
[[
#include <memory>
]],
[[
auto a = std::make_shared<int>(1000000007);
auto p = std::atomic_load(&a);
++*p;
std::atomic_store(&a, p);
]])],
[AC_DEFINE([HAVE_ATOMIC_STD_SHARED_PTR], [1],
[Define to 1 if you have the std::atomic_* overloads for std::shared_ptr.])
have_atomic_std_shared_ptr=yes
AC_MSG_RESULT([yes])],
[have_atomic_std_shared_ptr=no
AC_MSG_RESULT([no])])
# Check that thread_local storage specifier is available
AC_MSG_CHECKING([whether thread_local storage class specifier is available.])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
,
[[
thread_local int a = 0;
(void)a;
]])],
[AC_DEFINE([HAVE_THREAD_LOCAL], [1],
[Define to 1 if you have thread_local storage specifier.])
have_thread_local=yes
AC_MSG_RESULT([yes])],
[have_Thread_local=no
AC_MSG_RESULT([no])])
CXXFLAGS=$save_CXXFLAGS CXXFLAGS=$save_CXXFLAGS
AC_LANG_POP() AC_LANG_POP()
@@ -271,7 +246,7 @@ TESTLDADD=
# Additional libraries required for programs under src directory. # Additional libraries required for programs under src directory.
APPLDFLAGS= APPLDFLAGS=
case "$host_os" in case "$host" in
*android*) *android*)
android_build=yes android_build=yes
# android does not need -pthread, but needs followng 3 libs for C++ # android does not need -pthread, but needs followng 3 libs for C++
@@ -283,12 +258,6 @@ case "$host_os" in
;; ;;
esac esac
case "$host_os" in
*solaris*)
APPLDFLAGS="$APPLDFLAGS -lsocket -lnsl"
;;
esac
# zlib # zlib
PKG_CHECK_MODULES([ZLIB], [zlib >= 1.2.3], [have_zlib=yes], [have_zlib=no]) PKG_CHECK_MODULES([ZLIB], [zlib >= 1.2.3], [have_zlib=yes], [have_zlib=no])
@@ -360,13 +329,6 @@ if test "x${have_openssl}" = "xno"; then
AC_MSG_NOTICE($OPENSSL_PKG_ERRORS) AC_MSG_NOTICE($OPENSSL_PKG_ERRORS)
fi fi
# c-ares (for src)
PKG_CHECK_MODULES([LIBCARES], [libcares >= 1.7.5], [have_libcares=yes],
[have_libcares=no])
if test "x${have_libcares}" = "xno"; then
AC_MSG_NOTICE($LIBCARES_PKG_ERRORS)
fi
# libevent_openssl (for examples) # libevent_openssl (for examples)
# 2.0.8 is required because we use evconnlistener_set_error_cb() # 2.0.8 is required because we use evconnlistener_set_error_cb()
PKG_CHECK_MODULES([LIBEVENT_OPENSSL], [libevent_openssl >= 2.0.8], PKG_CHECK_MODULES([LIBEVENT_OPENSSL], [libevent_openssl >= 2.0.8],
@@ -385,32 +347,16 @@ else
AC_MSG_NOTICE($JANSSON_PKG_ERRORS) AC_MSG_NOTICE($JANSSON_PKG_ERRORS)
fi fi
# libsystemd (for src/nghttpx)
have_libsystemd=no
if test "x${request_systemd}" != "xno"; then
PKG_CHECK_MODULES([SYSTEMD], [libsystemd >= 209], [have_libsystemd=yes],
[have_libsystemd=no])
if test "x${have_libsystemd}" = "xyes"; then
AC_DEFINE([HAVE_LIBSYSTEMD], [1],
[Define to 1 if you have `libsystemd` library.])
else
AC_MSG_NOTICE($SYSTEMD_PKG_ERRORS)
fi
fi
if test "x${request_systemd}" = "xyes" &&
test "x${have_libsystemd}" != "xyes"; then
AC_MSG_ERROR([systemd was requested (--with-systemd) but not found])
fi
# libxml2 (for src/nghttp) # libxml2 (for src/nghttp)
PKG_CHECK_MODULES([LIBXML2], [libxml-2.0 >= 2.6.26], have_libxml2=no
[have_libxml2=yes], [have_libxml2=no]) if test "x${request_libxml2}" != "xno"; then
m4_ifdef([AM_PATH_XML2],
[AM_PATH_XML2(2.7.7, [have_libxml2=yes], [have_libxml2=no])],
[AC_MSG_WARN([configure was created without libxml2 detection macro; libxml2 detection is disabled])])
if test "x${have_libxml2}" = "xyes"; then if test "x${have_libxml2}" = "xyes"; then
AC_DEFINE([HAVE_LIBXML2], [1], [Define to 1 if you have `libxml2` library.]) AC_DEFINE([HAVE_LIBXML2], [1], [Define to 1 if you have `libxml2` library.])
else fi
AC_MSG_NOTICE($LIBXML2_PKG_ERRORS)
fi fi
if test "x${request_libxml2}" = "xyes" && if test "x${request_libxml2}" = "xyes" &&
@@ -453,6 +399,26 @@ if test "x${request_jemalloc}" = "xyes" &&
AC_MSG_ERROR([jemalloc was requested (--with-jemalloc) but not found]) AC_MSG_ERROR([jemalloc was requested (--with-jemalloc) but not found])
fi fi
# spdylay (for src/nghttpx and src/h2load)
have_spdylay=no
if test "x${request_spdylay}" != "xno"; then
PKG_CHECK_MODULES([LIBSPDYLAY], [libspdylay >= 1.3.2],
[have_spdylay=yes], [have_spdylay=no])
if test "x${have_spdylay}" = "xyes"; then
AC_DEFINE([HAVE_SPDYLAY], [1], [Define to 1 if you have `spdylay` library.])
else
AC_MSG_NOTICE($LIBSPDYLAY_PKG_ERRORS)
AC_MSG_NOTICE([The SPDY support in nghttpx and h2load will be disabled.])
fi
fi
if test "x${request_spdylay}" = "xyes" &&
test "x${have_spdylay}" != "xyes"; then
AC_MSG_ERROR([spdylay was requested (--with-spdylay) but not found])
fi
AM_CONDITIONAL([HAVE_SPDYLAY], [ test "x${have_spdylay}" = "xyes" ])
# Check Boost Asio library # Check Boost Asio library
have_asio_lib=no have_asio_lib=no
@@ -472,14 +438,13 @@ if test "x${request_asio_lib}" = "xyes"; then
fi fi
fi fi
# The nghttp, nghttpd and nghttpx under src depend on zlib, OpenSSL, # The nghttp, nghttpd and nghttpx under src depend on zlib, OpenSSL
# libev, and libc-ares. # and libev
enable_app=no enable_app=no
if test "x${request_app}" != "xno" && if test "x${request_app}" != "xno" &&
test "x${have_zlib}" = "xyes" && test "x${have_zlib}" = "xyes" &&
test "x${have_openssl}" = "xyes" && test "x${have_openssl}" = "xyes" &&
test "x${have_libev}" = "xyes" && test "x${have_libev}" = "xyes"; then
test "x${have_libcares}" = "xyes"; then
enable_app=yes enable_app=yes
fi fi
@@ -634,26 +599,6 @@ AC_SYS_LARGEFILE
AC_CHECK_MEMBER([struct tm.tm_gmtoff], [have_struct_tm_tm_gmtoff=yes], AC_CHECK_MEMBER([struct tm.tm_gmtoff], [have_struct_tm_tm_gmtoff=yes],
[have_struct_tm_tm_gmtoff=no], [[#include <time.h>]]) [have_struct_tm_tm_gmtoff=no], [[#include <time.h>]])
AC_CHECK_MEMBER([struct sockaddr_in.sin_len],
[AC_DEFINE([HAVE_SOCKADDR_IN_SIN_LEN],[1],
[Define to 1 if struct sockaddr_in has sin_len member.])],
[],
[[
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
]])
AC_CHECK_MEMBER([struct sockaddr_in6.sin6_len],
[AC_DEFINE([HAVE_SOCKADDR_IN6_SIN6_LEN],[1],
[Define to 1 if struct sockaddr_in6 has sin6_len member.])],
[],
[[
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
]])
if test "x$have_struct_tm_tm_gmtoff" = "xyes"; then if test "x$have_struct_tm_tm_gmtoff" = "xyes"; then
AC_DEFINE([HAVE_STRUCT_TM_TM_GMTOFF], [1], AC_DEFINE([HAVE_STRUCT_TM_TM_GMTOFF], [1],
[Define to 1 if you have `struct tm.tm_gmtoff` member.]) [Define to 1 if you have `struct tm.tm_gmtoff` member.])
@@ -688,7 +633,6 @@ AC_CHECK_FUNCS([ \
memchr \ memchr \
memmove \ memmove \
memset \ memset \
mkostemp \
socket \ socket \
sqrt \ sqrt \
strchr \ strchr \
@@ -716,6 +660,13 @@ AC_CHECK_DECLS([initgroups], [], [], [[
#include <grp.h> #include <grp.h>
]]) ]])
# Checks for epoll availability, primarily for examples/tiny-nghttpd
AX_HAVE_EPOLL([have_epoll=yes], [have_epoll=no])
AM_CONDITIONAL([ENABLE_TINY_NGHTTPD],
[ test "x${have_epoll}" = "xyes" &&
test "x${have_timerfd_create}" = "xyes"])
save_CFLAGS=$CFLAGS save_CFLAGS=$CFLAGS
save_CXXFLAGS=$CXXFLAGS save_CXXFLAGS=$CXXFLAGS
@@ -769,7 +720,6 @@ if test "x$werror" != "xno"; then
AX_CHECK_COMPILE_FLAG([-Wredundant-decls], [CFLAGS="$CFLAGS -Wredundant-decls"]) AX_CHECK_COMPILE_FLAG([-Wredundant-decls], [CFLAGS="$CFLAGS -Wredundant-decls"])
# Only work with Clang for the moment # Only work with Clang for the moment
AX_CHECK_COMPILE_FLAG([-Wheader-guard], [CFLAGS="$CFLAGS -Wheader-guard"]) AX_CHECK_COMPILE_FLAG([-Wheader-guard], [CFLAGS="$CFLAGS -Wheader-guard"])
AX_CHECK_COMPILE_FLAG([-Wsometimes-uninitialized], [CFLAGS="$CFLAGS -Wsometimes-uninitialized"])
# This is required because we pass format string as "const char*. # This is required because we pass format string as "const char*.
AX_CHECK_COMPILE_FLAG([-Wno-format-nonliteral], [CFLAGS="$CFLAGS -Wno-format-nonliteral"]) AX_CHECK_COMPILE_FLAG([-Wno-format-nonliteral], [CFLAGS="$CFLAGS -Wno-format-nonliteral"])
@@ -779,10 +729,6 @@ if test "x$werror" != "xno"; then
AX_CHECK_COMPILE_FLAG([-Wall], [CXXFLAGS="$CXXFLAGS -Wall"]) AX_CHECK_COMPILE_FLAG([-Wall], [CXXFLAGS="$CXXFLAGS -Wall"])
AX_CHECK_COMPILE_FLAG([-Werror], [CXXFLAGS="$CXXFLAGS -Werror"]) AX_CHECK_COMPILE_FLAG([-Werror], [CXXFLAGS="$CXXFLAGS -Werror"])
AX_CHECK_COMPILE_FLAG([-Wformat-security], [CXXFLAGS="$CXXFLAGS -Wformat-security"]) AX_CHECK_COMPILE_FLAG([-Wformat-security], [CXXFLAGS="$CXXFLAGS -Wformat-security"])
AX_CHECK_COMPILE_FLAG([-Wsometimes-uninitialized], [CXXFLAGS="$CXXFLAGS -Wsometimes-uninitialized"])
# Disable noexcept-type warning of g++-7. This is not harmful as
# long as all source files are compiled with the same compiler.
AX_CHECK_COMPILE_FLAG([-Wno-noexcept-type], [CXXFLAGS="$CXXFLAGS -Wno-noexcept-type"])
AC_LANG_POP() AC_LANG_POP()
fi fi
@@ -879,7 +825,6 @@ AC_MSG_NOTICE([summary of build options:
C preprocessor: ${CPP} C preprocessor: ${CPP}
CPPFLAGS: ${CPPFLAGS} CPPFLAGS: ${CPPFLAGS}
WARNCFLAGS: ${WARNCFLAGS} WARNCFLAGS: ${WARNCFLAGS}
WARNCXXFLAGS: ${WARNCXXFLAGS}
CXX1XCXXFLAGS: ${CXX1XCXXFLAGS} CXX1XCXXFLAGS: ${CXX1XCXXFLAGS}
EXTRACFLAG: ${EXTRACFLAG} EXTRACFLAG: ${EXTRACFLAG}
LIBS: ${LIBS} LIBS: ${LIBS}
@@ -899,14 +844,13 @@ AC_MSG_NOTICE([summary of build options:
Failmalloc: ${enable_failmalloc} Failmalloc: ${enable_failmalloc}
Libs: Libs:
OpenSSL: ${have_openssl} (CFLAGS='${OPENSSL_CFLAGS}' LIBS='${OPENSSL_LIBS}') OpenSSL: ${have_openssl} (CFLAGS='${OPENSSL_CFLAGS}' LIBS='${OPENSSL_LIBS}')
Libxml2: ${have_libxml2} (CFLAGS='${LIBXML2_CPPFLAGS}' LIBS='${LIBXML2_LIBS}') Libxml2: ${have_libxml2} (CFLAGS='${XML_CPPFLAGS}' LIBS='${XML_LIBS}')
Libev: ${have_libev} (CFLAGS='${LIBEV_CFLAGS}' LIBS='${LIBEV_LIBS}') Libev: ${have_libev} (CFLAGS='${LIBEV_CFLAGS}' LIBS='${LIBEV_LIBS}')
Libc-ares ${have_libcares} (CFLAGS='${LIBCARES_CFLAGS}' LIBS='${LIBCARES_LIBS}')
Libevent(SSL): ${have_libevent_openssl} (CFLAGS='${LIBEVENT_OPENSSL_CFLAGS}' LIBS='${LIBEVENT_OPENSSL_LIBS}') Libevent(SSL): ${have_libevent_openssl} (CFLAGS='${LIBEVENT_OPENSSL_CFLAGS}' LIBS='${LIBEVENT_OPENSSL_LIBS}')
Spdylay: ${have_spdylay} (CFLAGS='${LIBSPDYLAY_CFLAGS}' LIBS='${LIBSPDYLAY_LIBS}')
Jansson: ${have_jansson} (CFLAGS='${JANSSON_CFLAGS}' LIBS='${JANSSON_LIBS}') Jansson: ${have_jansson} (CFLAGS='${JANSSON_CFLAGS}' LIBS='${JANSSON_LIBS}')
Jemalloc: ${have_jemalloc} (LIBS='${JEMALLOC_LIBS}') Jemalloc: ${have_jemalloc} (LIBS='${JEMALLOC_LIBS}')
Zlib: ${have_zlib} (CFLAGS='${ZLIB_CFLAGS}' LIBS='${ZLIB_LIBS}') Zlib: ${have_zlib} (CFLAGS='${ZLIB_CFLAGS}' LIBS='${ZLIB_LIBS}')
Systemd: ${have_libsystemd} (CFLAGS='${SYSTEMD_CFLAGS}' LIBS='${SYSTEMD_LIBS}')
Boost CPPFLAGS: ${BOOST_CPPFLAGS} Boost CPPFLAGS: ${BOOST_CPPFLAGS}
Boost LDFLAGS: ${BOOST_LDFLAGS} Boost LDFLAGS: ${BOOST_LDFLAGS}
Boost::ASIO: ${BOOST_ASIO_LIB} Boost::ASIO: ${BOOST_ASIO_LIB}

View File

@@ -1,17 +1,10 @@
[Unit] [Unit]
Description=HTTP/2 proxy Description=HTTP/2 proxy
Documentation=man:nghttpx
After=network.target After=network.target
[Service] [Service]
Type=notify Type=forking
ExecStart=@bindir@/nghttpx --conf=/etc/nghttpx/nghttpx.conf ExecStart=@bindir@/nghttpx --conf=/etc/nghttpx/nghttpx.conf --pid-file=/run/nghttpx.pid --daemon
ExecReload=/bin/kill --signal HUP $MAINPID
KillSignal=SIGQUIT
PrivateTmp=yes
ProtectHome=yes
ProtectSystem=full
Restart=always
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target

View File

@@ -13,7 +13,6 @@ set(APIDOCS
nghttp2_hd_deflate_get_num_table_entries.rst nghttp2_hd_deflate_get_num_table_entries.rst
nghttp2_hd_deflate_get_table_entry.rst nghttp2_hd_deflate_get_table_entry.rst
nghttp2_hd_deflate_hd.rst nghttp2_hd_deflate_hd.rst
nghttp2_hd_deflate_hd_vec.rst
nghttp2_hd_deflate_new.rst nghttp2_hd_deflate_new.rst
nghttp2_hd_deflate_new2.rst nghttp2_hd_deflate_new2.rst
nghttp2_hd_inflate_change_table_size.rst nghttp2_hd_inflate_change_table_size.rst
@@ -24,7 +23,6 @@ set(APIDOCS
nghttp2_hd_inflate_get_num_table_entries.rst nghttp2_hd_inflate_get_num_table_entries.rst
nghttp2_hd_inflate_get_table_entry.rst nghttp2_hd_inflate_get_table_entry.rst
nghttp2_hd_inflate_hd.rst nghttp2_hd_inflate_hd.rst
nghttp2_hd_inflate_hd2.rst
nghttp2_hd_inflate_new.rst nghttp2_hd_inflate_new.rst
nghttp2_hd_inflate_new2.rst nghttp2_hd_inflate_new2.rst
nghttp2_http2_strerror.rst nghttp2_http2_strerror.rst
@@ -33,9 +31,7 @@ set(APIDOCS
nghttp2_option_del.rst nghttp2_option_del.rst
nghttp2_option_new.rst nghttp2_option_new.rst
nghttp2_option_set_builtin_recv_extension_type.rst nghttp2_option_set_builtin_recv_extension_type.rst
nghttp2_option_set_max_deflate_dynamic_table_size.rst
nghttp2_option_set_max_reserved_remote_streams.rst nghttp2_option_set_max_reserved_remote_streams.rst
nghttp2_option_set_max_send_header_block_length.rst
nghttp2_option_set_no_auto_ping_ack.rst nghttp2_option_set_no_auto_ping_ack.rst
nghttp2_option_set_no_auto_window_update.rst nghttp2_option_set_no_auto_window_update.rst
nghttp2_option_set_no_http_messaging.rst nghttp2_option_set_no_http_messaging.rst
@@ -49,7 +45,6 @@ set(APIDOCS
nghttp2_rcbuf_decref.rst nghttp2_rcbuf_decref.rst
nghttp2_rcbuf_get_buf.rst nghttp2_rcbuf_get_buf.rst
nghttp2_rcbuf_incref.rst nghttp2_rcbuf_incref.rst
nghttp2_rcbuf_is_static.rst
nghttp2_select_next_protocol.rst nghttp2_select_next_protocol.rst
nghttp2_session_callbacks_del.rst nghttp2_session_callbacks_del.rst
nghttp2_session_callbacks_new.rst nghttp2_session_callbacks_new.rst
@@ -59,15 +54,13 @@ set(APIDOCS
nghttp2_session_callbacks_set_on_begin_frame_callback.rst nghttp2_session_callbacks_set_on_begin_frame_callback.rst
nghttp2_session_callbacks_set_on_begin_headers_callback.rst nghttp2_session_callbacks_set_on_begin_headers_callback.rst
nghttp2_session_callbacks_set_on_data_chunk_recv_callback.rst nghttp2_session_callbacks_set_on_data_chunk_recv_callback.rst
nghttp2_session_callbacks_set_on_extension_chunk_recv_callback.rst
nghttp2_session_callbacks_set_on_frame_not_send_callback.rst nghttp2_session_callbacks_set_on_frame_not_send_callback.rst
nghttp2_session_callbacks_set_on_frame_recv_callback.rst nghttp2_session_callbacks_set_on_frame_recv_callback.rst
nghttp2_session_callbacks_set_on_extension_chunk_recv_callback.rst
nghttp2_session_callbacks_set_on_frame_send_callback.rst nghttp2_session_callbacks_set_on_frame_send_callback.rst
nghttp2_session_callbacks_set_on_header_callback.rst nghttp2_session_callbacks_set_on_header_callback.rst
nghttp2_session_callbacks_set_on_header_callback2.rst nghttp2_session_callbacks_set_on_header_callback2.rst
nghttp2_session_callbacks_set_on_invalid_frame_recv_callback.rst nghttp2_session_callbacks_set_on_invalid_frame_recv_callback.rst
nghttp2_session_callbacks_set_on_invalid_header_callback.rst
nghttp2_session_callbacks_set_on_invalid_header_callback2.rst
nghttp2_session_callbacks_set_on_stream_close_callback.rst nghttp2_session_callbacks_set_on_stream_close_callback.rst
nghttp2_session_callbacks_set_pack_extension_callback.rst nghttp2_session_callbacks_set_pack_extension_callback.rst
nghttp2_session_callbacks_set_recv_callback.rst nghttp2_session_callbacks_set_recv_callback.rst
@@ -75,9 +68,6 @@ set(APIDOCS
nghttp2_session_callbacks_set_send_callback.rst nghttp2_session_callbacks_set_send_callback.rst
nghttp2_session_callbacks_set_send_data_callback.rst nghttp2_session_callbacks_set_send_data_callback.rst
nghttp2_session_callbacks_set_unpack_extension_callback.rst nghttp2_session_callbacks_set_unpack_extension_callback.rst
nghttp2_session_change_stream_priority.rst
nghttp2_session_check_request_allowed.rst
nghttp2_session_check_server_session.rst
nghttp2_session_client_new.rst nghttp2_session_client_new.rst
nghttp2_session_client_new2.rst nghttp2_session_client_new2.rst
nghttp2_session_client_new3.rst nghttp2_session_client_new3.rst
@@ -89,11 +79,7 @@ set(APIDOCS
nghttp2_session_find_stream.rst nghttp2_session_find_stream.rst
nghttp2_session_get_effective_local_window_size.rst nghttp2_session_get_effective_local_window_size.rst
nghttp2_session_get_effective_recv_data_length.rst nghttp2_session_get_effective_recv_data_length.rst
nghttp2_session_get_hd_deflate_dynamic_table_size.rst
nghttp2_session_get_hd_inflate_dynamic_table_size.rst
nghttp2_session_get_last_proc_stream_id.rst nghttp2_session_get_last_proc_stream_id.rst
nghttp2_session_get_local_settings.rst
nghttp2_session_get_local_window_size.rst
nghttp2_session_get_next_stream_id.rst nghttp2_session_get_next_stream_id.rst
nghttp2_session_get_outbound_queue_size.rst nghttp2_session_get_outbound_queue_size.rst
nghttp2_session_get_remote_settings.rst nghttp2_session_get_remote_settings.rst
@@ -102,19 +88,20 @@ set(APIDOCS
nghttp2_session_get_stream_effective_local_window_size.rst nghttp2_session_get_stream_effective_local_window_size.rst
nghttp2_session_get_stream_effective_recv_data_length.rst nghttp2_session_get_stream_effective_recv_data_length.rst
nghttp2_session_get_stream_local_close.rst nghttp2_session_get_stream_local_close.rst
nghttp2_session_get_stream_local_window_size.rst
nghttp2_session_get_stream_remote_close.rst nghttp2_session_get_stream_remote_close.rst
nghttp2_session_get_stream_remote_window_size.rst nghttp2_session_get_stream_remote_window_size.rst
nghttp2_session_get_stream_user_data.rst nghttp2_session_get_stream_user_data.rst
nghttp2_session_mem_recv.rst nghttp2_session_mem_recv.rst
nghttp2_session_mem_send.rst nghttp2_session_mem_send.rst
nghttp2_session_recv.rst nghttp2_session_recv.rst
nghttp2_session_change_stream_priority.rst
nghttp2_session_check_request_allowed.rst
nghttp2_session_check_server_session.rst
nghttp2_session_resume_data.rst nghttp2_session_resume_data.rst
nghttp2_session_send.rst nghttp2_session_send.rst
nghttp2_session_server_new.rst nghttp2_session_server_new.rst
nghttp2_session_server_new2.rst nghttp2_session_server_new2.rst
nghttp2_session_server_new3.rst nghttp2_session_server_new3.rst
nghttp2_session_set_local_window_size.rst
nghttp2_session_set_next_stream_id.rst nghttp2_session_set_next_stream_id.rst
nghttp2_session_set_stream_user_data.rst nghttp2_session_set_stream_user_data.rst
nghttp2_session_terminate_session.rst nghttp2_session_terminate_session.rst
@@ -123,7 +110,6 @@ set(APIDOCS
nghttp2_session_upgrade2.rst nghttp2_session_upgrade2.rst
nghttp2_session_want_read.rst nghttp2_session_want_read.rst
nghttp2_session_want_write.rst nghttp2_session_want_write.rst
nghttp2_set_debug_vprintf_callback.rst
nghttp2_stream_get_first_child.rst nghttp2_stream_get_first_child.rst
nghttp2_stream_get_next_sibling.rst nghttp2_stream_get_next_sibling.rst
nghttp2_stream_get_parent.rst nghttp2_stream_get_parent.rst

View File

@@ -37,7 +37,6 @@ APIDOCS= \
nghttp2_hd_deflate_get_num_table_entries.rst \ nghttp2_hd_deflate_get_num_table_entries.rst \
nghttp2_hd_deflate_get_table_entry.rst \ nghttp2_hd_deflate_get_table_entry.rst \
nghttp2_hd_deflate_hd.rst \ nghttp2_hd_deflate_hd.rst \
nghttp2_hd_deflate_hd_vec.rst \
nghttp2_hd_deflate_new.rst \ nghttp2_hd_deflate_new.rst \
nghttp2_hd_deflate_new2.rst \ nghttp2_hd_deflate_new2.rst \
nghttp2_hd_inflate_change_table_size.rst \ nghttp2_hd_inflate_change_table_size.rst \
@@ -57,12 +56,10 @@ APIDOCS= \
nghttp2_option_del.rst \ nghttp2_option_del.rst \
nghttp2_option_new.rst \ nghttp2_option_new.rst \
nghttp2_option_set_builtin_recv_extension_type.rst \ nghttp2_option_set_builtin_recv_extension_type.rst \
nghttp2_option_set_max_deflate_dynamic_table_size.rst \
nghttp2_option_set_max_reserved_remote_streams.rst \ nghttp2_option_set_max_reserved_remote_streams.rst \
nghttp2_option_set_max_send_header_block_length.rst \ nghttp2_option_set_max_send_header_block_length.rst \
nghttp2_option_set_no_auto_ping_ack.rst \ nghttp2_option_set_no_auto_ping_ack.rst \
nghttp2_option_set_no_auto_window_update.rst \ nghttp2_option_set_no_auto_window_update.rst \
nghttp2_option_set_no_closed_streams.rst \
nghttp2_option_set_no_http_messaging.rst \ nghttp2_option_set_no_http_messaging.rst \
nghttp2_option_set_no_recv_client_magic.rst \ nghttp2_option_set_no_recv_client_magic.rst \
nghttp2_option_set_peer_max_concurrent_streams.rst \ nghttp2_option_set_peer_max_concurrent_streams.rst \
@@ -74,14 +71,12 @@ APIDOCS= \
nghttp2_rcbuf_decref.rst \ nghttp2_rcbuf_decref.rst \
nghttp2_rcbuf_get_buf.rst \ nghttp2_rcbuf_get_buf.rst \
nghttp2_rcbuf_incref.rst \ nghttp2_rcbuf_incref.rst \
nghttp2_rcbuf_is_static.rst \
nghttp2_select_next_protocol.rst \ nghttp2_select_next_protocol.rst \
nghttp2_session_callbacks_del.rst \ nghttp2_session_callbacks_del.rst \
nghttp2_session_callbacks_new.rst \ nghttp2_session_callbacks_new.rst \
nghttp2_session_callbacks_set_before_frame_send_callback.rst \ nghttp2_session_callbacks_set_before_frame_send_callback.rst \
nghttp2_session_callbacks_set_data_source_read_length_callback.rst \ nghttp2_session_callbacks_set_data_source_read_length_callback.rst \
nghttp2_session_callbacks_set_error_callback.rst \ nghttp2_session_callbacks_set_error_callback.rst \
nghttp2_session_callbacks_set_error_callback2.rst \
nghttp2_session_callbacks_set_on_begin_frame_callback.rst \ nghttp2_session_callbacks_set_on_begin_frame_callback.rst \
nghttp2_session_callbacks_set_on_begin_headers_callback.rst \ nghttp2_session_callbacks_set_on_begin_headers_callback.rst \
nghttp2_session_callbacks_set_on_data_chunk_recv_callback.rst \ nghttp2_session_callbacks_set_on_data_chunk_recv_callback.rst \
@@ -92,8 +87,6 @@ APIDOCS= \
nghttp2_session_callbacks_set_on_header_callback.rst \ nghttp2_session_callbacks_set_on_header_callback.rst \
nghttp2_session_callbacks_set_on_header_callback2.rst \ nghttp2_session_callbacks_set_on_header_callback2.rst \
nghttp2_session_callbacks_set_on_invalid_frame_recv_callback.rst \ nghttp2_session_callbacks_set_on_invalid_frame_recv_callback.rst \
nghttp2_session_callbacks_set_on_invalid_header_callback.rst \
nghttp2_session_callbacks_set_on_invalid_header_callback2.rst \
nghttp2_session_callbacks_set_on_stream_close_callback.rst \ nghttp2_session_callbacks_set_on_stream_close_callback.rst \
nghttp2_session_callbacks_set_pack_extension_callback.rst \ nghttp2_session_callbacks_set_pack_extension_callback.rst \
nghttp2_session_callbacks_set_recv_callback.rst \ nghttp2_session_callbacks_set_recv_callback.rst \
@@ -101,9 +94,6 @@ APIDOCS= \
nghttp2_session_callbacks_set_send_callback.rst \ nghttp2_session_callbacks_set_send_callback.rst \
nghttp2_session_callbacks_set_send_data_callback.rst \ nghttp2_session_callbacks_set_send_data_callback.rst \
nghttp2_session_callbacks_set_unpack_extension_callback.rst \ nghttp2_session_callbacks_set_unpack_extension_callback.rst \
nghttp2_session_change_stream_priority.rst \
nghttp2_session_check_request_allowed.rst \
nghttp2_session_check_server_session.rst \
nghttp2_session_client_new.rst \ nghttp2_session_client_new.rst \
nghttp2_session_client_new2.rst \ nghttp2_session_client_new2.rst \
nghttp2_session_client_new3.rst \ nghttp2_session_client_new3.rst \
@@ -115,11 +105,7 @@ APIDOCS= \
nghttp2_session_find_stream.rst \ nghttp2_session_find_stream.rst \
nghttp2_session_get_effective_local_window_size.rst \ nghttp2_session_get_effective_local_window_size.rst \
nghttp2_session_get_effective_recv_data_length.rst \ nghttp2_session_get_effective_recv_data_length.rst \
nghttp2_session_get_hd_deflate_dynamic_table_size.rst \
nghttp2_session_get_hd_inflate_dynamic_table_size.rst \
nghttp2_session_get_last_proc_stream_id.rst \ nghttp2_session_get_last_proc_stream_id.rst \
nghttp2_session_get_local_settings.rst \
nghttp2_session_get_local_window_size.rst \
nghttp2_session_get_next_stream_id.rst \ nghttp2_session_get_next_stream_id.rst \
nghttp2_session_get_outbound_queue_size.rst \ nghttp2_session_get_outbound_queue_size.rst \
nghttp2_session_get_remote_settings.rst \ nghttp2_session_get_remote_settings.rst \
@@ -128,13 +114,15 @@ APIDOCS= \
nghttp2_session_get_stream_effective_local_window_size.rst \ nghttp2_session_get_stream_effective_local_window_size.rst \
nghttp2_session_get_stream_effective_recv_data_length.rst \ nghttp2_session_get_stream_effective_recv_data_length.rst \
nghttp2_session_get_stream_local_close.rst \ nghttp2_session_get_stream_local_close.rst \
nghttp2_session_get_stream_local_window_size.rst \
nghttp2_session_get_stream_remote_close.rst \ nghttp2_session_get_stream_remote_close.rst \
nghttp2_session_get_stream_remote_window_size.rst \ nghttp2_session_get_stream_remote_window_size.rst \
nghttp2_session_get_stream_user_data.rst \ nghttp2_session_get_stream_user_data.rst \
nghttp2_session_mem_recv.rst \ nghttp2_session_mem_recv.rst \
nghttp2_session_mem_send.rst \ nghttp2_session_mem_send.rst \
nghttp2_session_recv.rst \ nghttp2_session_recv.rst \
nghttp2_session_change_stream_priority.rst \
nghttp2_session_check_request_allowed.rst \
nghttp2_session_check_server_session.rst \
nghttp2_session_resume_data.rst \ nghttp2_session_resume_data.rst \
nghttp2_session_send.rst \ nghttp2_session_send.rst \
nghttp2_session_server_new.rst \ nghttp2_session_server_new.rst \
@@ -143,14 +131,12 @@ APIDOCS= \
nghttp2_session_set_local_window_size.rst \ nghttp2_session_set_local_window_size.rst \
nghttp2_session_set_next_stream_id.rst \ nghttp2_session_set_next_stream_id.rst \
nghttp2_session_set_stream_user_data.rst \ nghttp2_session_set_stream_user_data.rst \
nghttp2_session_set_user_data.rst \
nghttp2_session_terminate_session.rst \ nghttp2_session_terminate_session.rst \
nghttp2_session_terminate_session2.rst \ nghttp2_session_terminate_session2.rst \
nghttp2_session_upgrade.rst \ nghttp2_session_upgrade.rst \
nghttp2_session_upgrade2.rst \ nghttp2_session_upgrade2.rst \
nghttp2_session_want_read.rst \ nghttp2_session_want_read.rst \
nghttp2_session_want_write.rst \ nghttp2_session_want_write.rst \
nghttp2_set_debug_vprintf_callback.rst \
nghttp2_stream_get_first_child.rst \ nghttp2_stream_get_first_child.rst \
nghttp2_stream_get_next_sibling.rst \ nghttp2_stream_get_next_sibling.rst \
nghttp2_stream_get_parent.rst \ nghttp2_stream_get_parent.rst \
@@ -164,7 +150,6 @@ APIDOCS= \
nghttp2_submit_extension.rst \ nghttp2_submit_extension.rst \
nghttp2_submit_goaway.rst \ nghttp2_submit_goaway.rst \
nghttp2_submit_headers.rst \ nghttp2_submit_headers.rst \
nghttp2_submit_origin.rst \
nghttp2_submit_ping.rst \ nghttp2_submit_ping.rst \
nghttp2_submit_priority.rst \ nghttp2_submit_priority.rst \
nghttp2_submit_push_promise.rst \ nghttp2_submit_push_promise.rst \
@@ -271,7 +256,7 @@ apiref.rst: \
$(APIDOCS): apiref.rst $(APIDOCS): apiref.rst
clean-local: clean-local:
if [ $(srcdir) != $(builddir) ]; then for i in $(RST_FILES); do rm -f $(builddir)/$$i; done fi [ $(srcdir) = $(builddir) ] || for i in $(RST_FILES); do [ -e $(builddir)/$$i ] && rm $(builddir)/$$i; done
-rm -f apiref.rst -rm -f apiref.rst
-rm -f $(APIDOCS) -rm -f $(APIDOCS)
-rm -rf $(BUILDDIR)/* -rm -rf $(BUILDDIR)/*

View File

@@ -13,7 +13,6 @@ import re
from docutils import nodes from docutils import nodes
from docutils.parsers.rst import directives from docutils.parsers.rst import directives
from docutils.parsers.rst import Directive
from sphinx import addnodes from sphinx import addnodes
from sphinx import version_info from sphinx import version_info
@@ -22,8 +21,10 @@ from sphinx.locale import l_, _
from sphinx.domains import Domain, ObjType, Index from sphinx.domains import Domain, ObjType, Index
from sphinx.directives import ObjectDescription from sphinx.directives import ObjectDescription
from sphinx.util.nodes import make_refnode from sphinx.util.nodes import make_refnode
from sphinx.util.compat import Directive
from sphinx.util.docfields import Field, GroupedField, TypedField from sphinx.util.docfields import Field, GroupedField, TypedField
# REs for Ruby signatures # REs for Ruby signatures
rb_sig_re = re.compile( rb_sig_re = re.compile(
r'''^ ([\w.]*\.)? # class name(s) r'''^ ([\w.]*\.)? # class name(s)

View File

@@ -8,7 +8,7 @@ _h2load()
_get_comp_words_by_ref cur prev _get_comp_words_by_ref cur prev
case $cur in case $cur in
-*) -*)
COMPREPLY=( $( compgen -W '--connection-window-bits --clients --verbose --ciphers --rate --no-tls-proto --header-table-size --requests --log-file --base-uri --h1 --threads --npn-list --rate-period --data --version --connection-inactivity-timeout --timing-script-file --encoder-header-table-size --max-concurrent-streams --connection-active-timeout --input-file --help --window-bits --warm-up-time --duration --header ' -- "$cur" ) ) COMPREPLY=( $( compgen -W '--connection-window-bits --clients --verbose --ciphers --rate --no-tls-proto --requests --base-uri --h1 --threads --npn-list --rate-period --data --version --connection-inactivity-timeout --timing-script-file --max-concurrent-streams --connection-active-timeout --input-file --header --window-bits --help ' -- "$cur" ) )
;; ;;
*) *)
_filedir _filedir

View File

@@ -8,7 +8,7 @@ _nghttp()
_get_comp_words_by_ref cur prev _get_comp_words_by_ref cur prev
case $cur in case $cur in
-*) -*)
COMPREPLY=( $( compgen -W '--no-push --verbose --no-dep --get-assets --har --header-table-size --multiply --encoder-header-table-size --padding --hexdump --max-concurrent-streams --continuation --connection-window-bits --peer-max-concurrent-streams --timeout --data --no-content-length --version --color --cert --upgrade --remote-name --trailer --weight --help --key --null-out --window-bits --expect-continue --stat --no-verify-peer --header ' -- "$cur" ) ) COMPREPLY=( $( compgen -W '--no-push --verbose --no-dep --get-assets --har --header-table-size --multiply --padding --hexdump --max-concurrent-streams --continuation --connection-window-bits --peer-max-concurrent-streams --timeout --data --no-content-length --version --color --cert --upgrade --remote-name --trailer --weight --help --key --null-out --window-bits --expect-continue --stat --header ' -- "$cur" ) )
;; ;;
*) *)
_filedir _filedir

View File

@@ -8,7 +8,7 @@ _nghttpd()
_get_comp_words_by_ref cur prev _get_comp_words_by_ref cur prev
case $cur in case $cur in
-*) -*)
COMPREPLY=( $( compgen -W '--htdocs --verbose --daemon --echo-upload --error-gzip --push --header-table-size --encoder-header-table-size --padding --hexdump --max-concurrent-streams --no-tls --connection-window-bits --mime-types-file --no-content-length --workers --version --color --early-response --dh-param-file --trailer --address --window-bits --verify-client --help ' -- "$cur" ) ) COMPREPLY=( $( compgen -W '--htdocs --verbose --daemon --echo-upload --error-gzip --push --header-table-size --padding --hexdump --max-concurrent-streams --no-tls --connection-window-bits --mime-types-file --no-content-length --workers --version --color --early-response --dh-param-file --trailer --address --window-bits --verify-client --help ' -- "$cur" ) )
;; ;;
*) *)
_filedir _filedir

View File

@@ -8,7 +8,7 @@ _nghttpx()
_get_comp_words_by_ref cur prev _get_comp_words_by_ref cur prev
case $cur in case $cur in
-*) -*)
COMPREPLY=( $( compgen -W '--worker-read-rate --include --frontend-http2-dump-response-header --tls-ticket-key-file --verify-client-cacert --max-response-header-fields --backend-http2-window-size --tls13-client-ciphers --frontend-keep-alive-timeout --backend-request-buffer --max-request-header-fields --backend-connect-timeout --tls-max-proto-version --conf --dns-lookup-timeout --backend-http2-max-concurrent-streams --worker-write-burst --npn-list --dns-max-try --fetch-ocsp-response-file --no-via --tls-session-cache-memcached-cert-file --no-http2-cipher-black-list --mruby-file --add-forwarded --client-no-http2-cipher-black-list --stream-read-timeout --client-ciphers --ocsp-update-interval --forwarded-for --accesslog-syslog --dns-cache-timeout --frontend-http2-read-timeout --listener-disable-timeout --ciphers --client-psk-secrets --strip-incoming-x-forwarded-for --no-server-rewrite --private-key-passwd-file --backend-keep-alive-timeout --backend-http-proxy-uri --frontend-max-requests --tls-no-postpone-early-data --rlimit-nofile --no-strip-incoming-x-forwarded-proto --tls-ticket-key-memcached-cert-file --no-verify-ocsp --forwarded-by --tls-session-cache-memcached-private-key-file --error-page --ocsp-startup --backend-write-timeout --tls-dyn-rec-warmup-threshold --tls-ticket-key-memcached-max-retry --frontend-http2-window-size --http2-no-cookie-crumbling --worker-read-burst --dh-param-file --accesslog-format --errorlog-syslog --redirect-https-port --request-header-field-buffer --api-max-request-body --frontend-http2-decoder-dynamic-table-size --errorlog-file --frontend-http2-max-concurrent-streams --psk-secrets --frontend-write-timeout --tls-ticket-key-cipher --read-burst --no-add-x-forwarded-proto --backend --server-name --insecure --backend-max-backoff --log-level --host-rewrite --tls-ticket-key-memcached-interval --frontend-http2-setting-timeout --frontend-http2-connection-window-size --worker-frontend-connections --syslog-facility --fastopen --no-location-rewrite --single-thread --tls-session-cache-memcached --no-ocsp --backend-response-buffer --tls-min-proto-version --workers --add-x-forwarded-for --no-server-push --worker-write-rate --add-request-header --backend-http2-settings-timeout --subcert --ignore-per-pattern-mruby-error --ecdh-curves --no-kqueue --help --frontend-frame-debug --tls-sct-dir --pid-file --frontend-http2-dump-request-header --daemon --write-rate --altsvc --backend-http2-decoder-dynamic-table-size --no-strip-incoming-early-data --user --verify-client-tolerate-expired --frontend-read-timeout --tls-ticket-key-memcached-max-fail --backlog --write-burst --backend-connections-per-host --tls-max-early-data --response-header-field-buffer --tls-ticket-key-memcached-address-family --padding --tls-session-cache-memcached-address-family --stream-write-timeout --cacert --tls-ticket-key-memcached-private-key-file --accesslog-write-early --backend-address-family --backend-http2-connection-window-size --tls13-ciphers --version --add-response-header --backend-read-timeout --frontend-http2-optimize-window-size --frontend --accesslog-file --http2-proxy --backend-http2-encoder-dynamic-table-size --client-private-key-file --single-process --client-cert-file --tls-ticket-key-memcached --tls-dyn-rec-idle-timeout --frontend-http2-optimize-write-buffer-size --verify-client --frontend-http2-encoder-dynamic-table-size --read-rate --backend-connections-per-frontend --strip-incoming-forwarded ' -- "$cur" ) ) COMPREPLY=( $( compgen -W '--worker-read-rate --include --frontend-http2-dump-response-header --tls-ticket-key-file --verify-client-cacert --max-response-header-fields --backend-request-buffer --max-request-header-fields --backend-http2-connection-window-bits --conf --backend-http2-max-concurrent-streams --worker-write-burst --npn-list --fetch-ocsp-response-file --no-via --tls-session-cache-memcached-cert-file --no-http2-cipher-black-list --mruby-file --no-server-push --stream-read-timeout --tls-ticket-key-memcached --forwarded-for --accesslog-syslog --frontend-http2-read-timeout --listener-disable-timeout --frontend-http2-connection-window-bits --ciphers --strip-incoming-x-forwarded-for --private-key-passwd-file --backend-keep-alive-timeout --backend-http-proxy-uri --rlimit-nofile --tls-ticket-key-memcached-cert-file --ocsp-update-interval --forwarded-by --tls-session-cache-memcached-private-key-file --error-page --backend-write-timeout --tls-dyn-rec-warmup-threshold --tls-ticket-key-memcached-max-retry --http2-no-cookie-crumbling --worker-read-burst --dh-param-file --accesslog-format --errorlog-syslog --request-header-field-buffer --api-max-request-body --errorlog-file --frontend-http2-max-concurrent-streams --frontend-write-timeout --tls-ticket-key-cipher --read-burst --backend --insecure --backend-max-backoff --log-level --host-rewrite --tls-proto-list --tls-ticket-key-memcached-interval --frontend-http2-setting-timeout --worker-frontend-connections --syslog-facility --fastopen --no-location-rewrite --tls-session-cache-memcached --no-ocsp --backend-response-buffer --workers --add-forwarded --frontend-http2-window-bits --worker-write-rate --add-request-header --backend-http2-settings-timeout --subcert --no-kqueue --help --frontend-frame-debug --pid-file --frontend-http2-dump-request-header --daemon --write-rate --altsvc --user --add-x-forwarded-for --frontend-read-timeout --tls-ticket-key-memcached-max-fail --backlog --write-burst --backend-connections-per-host --backend-http2-window-bits --response-header-field-buffer --tls-ticket-key-memcached-address-family --padding --tls-session-cache-memcached-address-family --stream-write-timeout --cacert --tls-ticket-key-memcached-private-key-file --backend-address-family --version --add-response-header --backend-read-timeout --frontend --accesslog-file --http2-proxy --client-private-key-file --client-cert-file --accept-proxy-protocol --tls-dyn-rec-idle-timeout --verify-client --read-rate --backend-connections-per-frontend --strip-incoming-forwarded ' -- "$cur" ) )
;; ;;
*) *)
_filedir _filedir

View File

@@ -157,7 +157,7 @@ html_theme_path = ['@top_srcdir@/doc/_themes']
# If true, SmartyPants will be used to convert quotes and dashes to # If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities. # typographically correct entities.
#html_use_smartypants = False html_use_smartypants = False
# Custom sidebar templates, maps document names to template names. # Custom sidebar templates, maps document names to template names.
html_sidebars = { html_sidebars = {

View File

@@ -1,2 +0,0 @@
[parsers]
smart_quotes=no

View File

@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText. .\" Man page generated from reStructuredText.
. .
.TH "H2LOAD" "1" "Jan 18, 2019" "1.36.0" "nghttp2" .TH "H2LOAD" "1" "Jul 21, 2016" "1.13.0" "nghttp2"
.SH NAME .SH NAME
h2load \- HTTP/2 benchmarking tool h2load \- HTTP/2 benchmarking tool
. .
@@ -35,7 +35,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
\fBh2load\fP [OPTIONS]... [URI]... \fBh2load\fP [OPTIONS]... [URI]...
.SH DESCRIPTION .SH DESCRIPTION
.sp .sp
benchmarking tool for HTTP/2 server benchmarking tool for HTTP/2 and SPDY server
.INDENT 0.0 .INDENT 0.0
.TP .TP
.B <URI> .B <URI>
@@ -54,9 +54,7 @@ scheme, host or port values.
Number of requests across all clients. If it is used Number of requests across all clients. If it is used
with \fI\%\-\-timing\-script\-file\fP option, this option specifies with \fI\%\-\-timing\-script\-file\fP option, this option specifies
the number of requests each client performs rather than the number of requests each client performs rather than
the number of requests across all clients. This option the number of requests across all clients.
is ignored if timing\-based benchmarking is enabled (see
\fI\%\-\-duration\fP option).
.sp .sp
Default: \fB1\fP Default: \fB1\fP
.UNINDENT .UNINDENT
@@ -101,6 +99,7 @@ Default: \fB1\fP
.TP .TP
.B \-w, \-\-window\-bits=<N> .B \-w, \-\-window\-bits=<N>
Sets the stream level initial window size to (2**<N>)\-1. Sets the stream level initial window size to (2**<N>)\-1.
For SPDY, 2**<N> is used instead.
.sp .sp
Default: \fB30\fP Default: \fB30\fP
.UNINDENT .UNINDENT
@@ -108,7 +107,9 @@ Default: \fB30\fP
.TP .TP
.B \-W, \-\-connection\-window\-bits=<N> .B \-W, \-\-connection\-window\-bits=<N>
Sets the connection level initial window size to Sets the connection level initial window size to
(2**<N>)\-1. (2**<N>)\-1. For SPDY, if <N> is strictly less than 16,
this option is ignored. Otherwise 2**<N> is used for
SPDY.
.sp .sp
Default: \fB30\fP Default: \fB30\fP
.UNINDENT .UNINDENT
@@ -122,15 +123,14 @@ Add/Override a header to the requests.
.B \-\-ciphers=<SUITE> .B \-\-ciphers=<SUITE>
Set allowed cipher list. The format of the string is Set allowed cipher list. The format of the string is
described in OpenSSL ciphers(1). described in OpenSSL ciphers(1).
.sp
Default: \fBECDHE\-ECDSA\-AES256\-GCM\-SHA384:ECDHE\-RSA\-AES256\-GCM\-SHA384:ECDHE\-ECDSA\-CHACHA20\-POLY1305:ECDHE\-RSA\-CHACHA20\-POLY1305:ECDHE\-ECDSA\-AES128\-GCM\-SHA256:ECDHE\-RSA\-AES128\-GCM\-SHA256:ECDHE\-ECDSA\-AES256\-SHA384:ECDHE\-RSA\-AES256\-SHA384:ECDHE\-ECDSA\-AES128\-SHA256:ECDHE\-RSA\-AES128\-SHA256\fP
.UNINDENT .UNINDENT
.INDENT 0.0 .INDENT 0.0
.TP .TP
.B \-p, \-\-no\-tls\-proto=<PROTOID> .B \-p, \-\-no\-tls\-proto=<PROTOID>
Specify ALPN identifier of the protocol to be used when Specify ALPN identifier of the protocol to be used when
accessing http URI without SSL/TLS. accessing http URI without SSL/TLS.
Available protocols: h2c and http/1.1 Available protocols: spdy/2, spdy/3, spdy/3.1, h2c and
http/1.1
.sp .sp
Default: \fBh2c\fP Default: \fBh2c\fP
.UNINDENT .UNINDENT
@@ -155,7 +155,7 @@ example, with \fI\%\-t\fP2 and \fI\%\-r\fP4, each thread gets 2
connections per period. When the rate is 0, the program connections per period. When the rate is 0, the program
will run as it normally does, creating connections at will run as it normally does, creating connections at
whatever variable rate it wants. The default value for whatever variable rate it wants. The default value for
this option is 0. \fI\%\-r\fP and \fI\%\-D\fP are mutually exclusive. this option is 0.
.UNINDENT .UNINDENT
.INDENT 0.0 .INDENT 0.0
.TP .TP
@@ -168,20 +168,6 @@ option is 1s.
.UNINDENT .UNINDENT
.INDENT 0.0 .INDENT 0.0
.TP .TP
.B \-D, \-\-duration=<N>
Specifies the main duration for the measurements in case
of timing\-based benchmarking. \fI\%\-D\fP and \fI\%\-r\fP are mutually
exclusive.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-warm\-up\-time=<DURATION>
Specifies the time period before starting the actual
measurements, in case of timing\-based benchmarking.
Needs to provided along with \fI\%\-D\fP option.
.UNINDENT
.INDENT 0.0
.TP
.B \-T, \-\-connection\-active\-timeout=<DURATION> .B \-T, \-\-connection\-active\-timeout=<DURATION>
Specifies the maximum time that h2load is willing to Specifies the maximum time that h2load is willing to
keep a connection open, regardless of the activity on keep a connection open, regardless of the activity on
@@ -245,7 +231,7 @@ NPN. The parameter must be delimited by a single comma
only and any white spaces are treated as a part of only and any white spaces are treated as a part of
protocol string. protocol string.
.sp .sp
Default: \fBh2,h2\-16,h2\-14,http/1.1\fP Default: \fBh2,h2\-16,h2\-14,spdy/3.1,spdy/3,spdy/2,http/1.1\fP
.UNINDENT .UNINDENT
.INDENT 0.0 .INDENT 0.0
.TP .TP
@@ -256,34 +242,6 @@ http/1.1 for both http and https URI.
.UNINDENT .UNINDENT
.INDENT 0.0 .INDENT 0.0
.TP .TP
.B \-\-header\-table\-size=<SIZE>
Specify decoder header table size.
.sp
Default: \fB4K\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-encoder\-header\-table\-size=<SIZE>
Specify encoder header table size. The decoder (server)
specifies the maximum dynamic table size it accepts.
Then the negotiated dynamic table size is the minimum of
this option value and the value which server specified.
.sp
Default: \fB4K\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-log\-file=<PATH>
Write per\-request information to a file as tab\-separated
columns: start time as microseconds since epoch; HTTP
status code; microseconds until end of response. More
columns may be added later. Rows are ordered by end\-of\-
response time when using one worker thread, but may
appear slightly out of order with multiple threads due
to buffering. Status code is \-1 for failed streams.
.UNINDENT
.INDENT 0.0
.TP
.B \-v, \-\-verbose .B \-v, \-\-verbose
Output debug information. Output debug information.
.UNINDENT .UNINDENT
@@ -298,9 +256,6 @@ Display version information and exit.
Display this help and exit. Display this help and exit.
.UNINDENT .UNINDENT
.sp .sp
The <SIZE> argument is an integer and an optional unit (e.g., 10K is
10 * 1024). Units are K, M and G (powers of 1024).
.sp
The <DURATION> argument is an integer and an optional unit (e.g., 1s The <DURATION> argument is an integer and an optional unit (e.g., 1s
is 1 second and 500ms is 500 milliseconds). Units are h, m, s or ms is 1 second and 500ms is 500 milliseconds). Units are h, m, s or ms
(hours, minutes, seconds and milliseconds, respectively). If a unit (hours, minutes, seconds and milliseconds, respectively). If a unit
@@ -358,7 +313,8 @@ compression. Let \fBdecompressed(headers)\fP to the number of bytes
used for header fields after decompression. The \fBspace savings\fP used for header fields after decompression. The \fBspace savings\fP
is calculated by (1 \- \fBheaders\fP / \fBdecompressed(headers)\fP) * is calculated by (1 \- \fBheaders\fP / \fBdecompressed(headers)\fP) *
100. For HTTP/1.1, this is usually 0.00%, since it does not have 100. For HTTP/1.1, this is usually 0.00%, since it does not have
header compression. For HTTP/2, it shows some insightful numbers. header compression. For HTTP/2 and SPDY, it shows some insightful
numbers.
.TP .TP
.B data .B data
The number of response body bytes received from the server. The number of response body bytes received from the server.
@@ -388,16 +344,13 @@ range (mean +/\- sd) against total number of successful requests.
.INDENT 7.0 .INDENT 7.0
.TP .TP
.B min .B min
The minimum time taken to connect to a server including TLS The minimum time taken to connect to a server.
handshake.
.TP .TP
.B max .B max
The maximum time taken to connect to a server including TLS The maximum time taken to connect to a server.
handshake.
.TP .TP
.B mean .B mean
The mean time taken to connect to a server including TLS The mean time taken to connect to a server.
handshake.
.TP .TP
.B sd .B sd
The standard deviation of the time taken to connect to a server. The standard deviation of the time taken to connect to a server.
@@ -458,7 +411,7 @@ h2load sets large flow control window by default, and effectively
disables flow control to avoid under utilization of server disables flow control to avoid under utilization of server
performance. To set smaller flow control window, use \fI\%\-w\fP and performance. To set smaller flow control window, use \fI\%\-w\fP and
\fI\%\-W\fP options. For example, use \fB\-w16 \-W16\fP to set default \fI\%\-W\fP options. For example, use \fB\-w16 \-W16\fP to set default
window size described in HTTP/2 protocol specification. window size described in HTTP/2 and SPDY protocol specification.
.SH SEE ALSO .SH SEE ALSO
.sp .sp
\fBnghttp(1)\fP, \fBnghttpd(1)\fP, \fBnghttpx(1)\fP \fBnghttp(1)\fP, \fBnghttpd(1)\fP, \fBnghttpx(1)\fP

View File

@@ -14,7 +14,7 @@ SYNOPSIS
DESCRIPTION DESCRIPTION
----------- -----------
benchmarking tool for HTTP/2 server benchmarking tool for HTTP/2 and SPDY server
.. describe:: <URI> .. describe:: <URI>
@@ -34,9 +34,7 @@ OPTIONS
Number of requests across all clients. If it is used Number of requests across all clients. If it is used
with :option:`--timing-script-file` option, this option specifies with :option:`--timing-script-file` option, this option specifies
the number of requests each client performs rather than the number of requests each client performs rather than
the number of requests across all clients. This option the number of requests across all clients.
is ignored if timing-based benchmarking is enabled (see
:option:`--duration` option).
Default: ``1`` Default: ``1``
@@ -76,13 +74,16 @@ OPTIONS
.. option:: -w, --window-bits=<N> .. option:: -w, --window-bits=<N>
Sets the stream level initial window size to (2\*\*<N>)-1. Sets the stream level initial window size to (2\*\*<N>)-1.
For SPDY, 2**<N> is used instead.
Default: ``30`` Default: ``30``
.. option:: -W, --connection-window-bits=<N> .. option:: -W, --connection-window-bits=<N>
Sets the connection level initial window size to Sets the connection level initial window size to
(2\*\*<N>)-1. (2**<N>)-1. For SPDY, if <N> is strictly less than 16,
this option is ignored. Otherwise 2\*\*<N> is used for
SPDY.
Default: ``30`` Default: ``30``
@@ -95,13 +96,12 @@ OPTIONS
Set allowed cipher list. The format of the string is Set allowed cipher list. The format of the string is
described in OpenSSL ciphers(1). described in OpenSSL ciphers(1).
Default: ``ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256``
.. option:: -p, --no-tls-proto=<PROTOID> .. option:: -p, --no-tls-proto=<PROTOID>
Specify ALPN identifier of the protocol to be used when Specify ALPN identifier of the protocol to be used when
accessing http URI without SSL/TLS. accessing http URI without SSL/TLS.
Available protocols: h2c and http/1.1 Available protocols: spdy/2, spdy/3, spdy/3.1, h2c and
http/1.1
Default: ``h2c`` Default: ``h2c``
@@ -124,7 +124,7 @@ OPTIONS
connections per period. When the rate is 0, the program connections per period. When the rate is 0, the program
will run as it normally does, creating connections at will run as it normally does, creating connections at
whatever variable rate it wants. The default value for whatever variable rate it wants. The default value for
this option is 0. :option:`-r` and :option:`\-D` are mutually exclusive. this option is 0.
.. option:: --rate-period=<DURATION> .. option:: --rate-period=<DURATION>
@@ -134,18 +134,6 @@ OPTIONS
the rate option is not used. The default value for this the rate option is not used. The default value for this
option is 1s. option is 1s.
.. option:: -D, --duration=<N>
Specifies the main duration for the measurements in case
of timing-based benchmarking. :option:`-D` and :option:`\-r` are mutually
exclusive.
.. option:: --warm-up-time=<DURATION>
Specifies the time period before starting the actual
measurements, in case of timing-based benchmarking.
Needs to provided along with :option:`-D` option.
.. option:: -T, --connection-active-timeout=<DURATION> .. option:: -T, --connection-active-timeout=<DURATION>
Specifies the maximum time that h2load is willing to Specifies the maximum time that h2load is willing to
@@ -206,7 +194,7 @@ OPTIONS
only and any white spaces are treated as a part of only and any white spaces are treated as a part of
protocol string. protocol string.
Default: ``h2,h2-16,h2-14,http/1.1`` Default: ``h2,h2-16,h2-14,spdy/3.1,spdy/3,spdy/2,http/1.1``
.. option:: --h1 .. option:: --h1
@@ -214,31 +202,6 @@ OPTIONS
:option:`--no-tls-proto`\=http/1.1, which effectively force :option:`--no-tls-proto`\=http/1.1, which effectively force
http/1.1 for both http and https URI. http/1.1 for both http and https URI.
.. option:: --header-table-size=<SIZE>
Specify decoder header table size.
Default: ``4K``
.. option:: --encoder-header-table-size=<SIZE>
Specify encoder header table size. The decoder (server)
specifies the maximum dynamic table size it accepts.
Then the negotiated dynamic table size is the minimum of
this option value and the value which server specified.
Default: ``4K``
.. option:: --log-file=<PATH>
Write per-request information to a file as tab-separated
columns: start time as microseconds since epoch; HTTP
status code; microseconds until end of response. More
columns may be added later. Rows are ordered by end-of-
response time when using one worker thread, but may
appear slightly out of order with multiple threads due
to buffering. Status code is -1 for failed streams.
.. option:: -v, --verbose .. option:: -v, --verbose
Output debug information. Output debug information.
@@ -253,9 +216,6 @@ OPTIONS
The <SIZE> argument is an integer and an optional unit (e.g., 10K is
10 * 1024). Units are K, M and G (powers of 1024).
The <DURATION> argument is an integer and an optional unit (e.g., 1s The <DURATION> argument is an integer and an optional unit (e.g., 1s
is 1 second and 500ms is 500 milliseconds). Units are h, m, s or ms is 1 second and 500ms is 500 milliseconds). Units are h, m, s or ms
(hours, minutes, seconds and milliseconds, respectively). If a unit (hours, minutes, seconds and milliseconds, respectively). If a unit
@@ -304,7 +264,8 @@ traffic
used for header fields after decompression. The ``space savings`` used for header fields after decompression. The ``space savings``
is calculated by (1 - ``headers`` / ``decompressed(headers)``) * is calculated by (1 - ``headers`` / ``decompressed(headers)``) *
100. For HTTP/1.1, this is usually 0.00%, since it does not have 100. For HTTP/1.1, this is usually 0.00%, since it does not have
header compression. For HTTP/2, it shows some insightful numbers. header compression. For HTTP/2 and SPDY, it shows some insightful
numbers.
data data
The number of response body bytes received from the server. The number of response body bytes received from the server.
@@ -323,14 +284,11 @@ time for request
time for connect time for connect
min min
The minimum time taken to connect to a server including TLS The minimum time taken to connect to a server.
handshake.
max max
The maximum time taken to connect to a server including TLS The maximum time taken to connect to a server.
handshake.
mean mean
The mean time taken to connect to a server including TLS The mean time taken to connect to a server.
handshake.
sd sd
The standard deviation of the time taken to connect to a server. The standard deviation of the time taken to connect to a server.
+/- sd +/- sd
@@ -375,7 +333,7 @@ h2load sets large flow control window by default, and effectively
disables flow control to avoid under utilization of server disables flow control to avoid under utilization of server
performance. To set smaller flow control window, use :option:`-w` and performance. To set smaller flow control window, use :option:`-w` and
:option:`-W` options. For example, use ``-w16 -W16`` to set default :option:`-W` options. For example, use ``-w16 -W16`` to set default
window size described in HTTP/2 protocol specification. window size described in HTTP/2 and SPDY protocol specification.
SEE ALSO SEE ALSO
-------- --------

View File

@@ -41,7 +41,8 @@ traffic
used for header fields after decompression. The ``space savings`` used for header fields after decompression. The ``space savings``
is calculated by (1 - ``headers`` / ``decompressed(headers)``) * is calculated by (1 - ``headers`` / ``decompressed(headers)``) *
100. For HTTP/1.1, this is usually 0.00%, since it does not have 100. For HTTP/1.1, this is usually 0.00%, since it does not have
header compression. For HTTP/2, it shows some insightful numbers. header compression. For HTTP/2 and SPDY, it shows some insightful
numbers.
data data
The number of response body bytes received from the server. The number of response body bytes received from the server.
@@ -60,14 +61,11 @@ time for request
time for connect time for connect
min min
The minimum time taken to connect to a server including TLS The minimum time taken to connect to a server.
handshake.
max max
The maximum time taken to connect to a server including TLS The maximum time taken to connect to a server.
handshake.
mean mean
The mean time taken to connect to a server including TLS The mean time taken to connect to a server.
handshake.
sd sd
The standard deviation of the time taken to connect to a server. The standard deviation of the time taken to connect to a server.
+/- sd +/- sd
@@ -112,7 +110,7 @@ h2load sets large flow control window by default, and effectively
disables flow control to avoid under utilization of server disables flow control to avoid under utilization of server
performance. To set smaller flow control window, use :option:`-w` and performance. To set smaller flow control window, use :option:`-w` and
:option:`-W` options. For example, use ``-w16 -W16`` to set default :option:`-W` options. For example, use ``-w16 -W16`` to set default
window size described in HTTP/2 protocol specification. window size described in HTTP/2 and SPDY protocol specification.
SEE ALSO SEE ALSO
-------- --------

View File

@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText. .\" Man page generated from reStructuredText.
. .
.TH "NGHTTP" "1" "Jan 18, 2019" "1.36.0" "nghttp2" .TH "NGHTTP" "1" "Jul 21, 2016" "1.13.0" "nghttp2"
.SH NAME .SH NAME
nghttp \- HTTP/2 client nghttp \- HTTP/2 client
. .
@@ -142,13 +142,10 @@ HTTP upgrade request is performed with OPTIONS method.
.INDENT 0.0 .INDENT 0.0
.TP .TP
.B \-p, \-\-weight=<WEIGHT> .B \-p, \-\-weight=<WEIGHT>
Sets weight of given URI. This option can be used Sets priority group weight. The valid value range is
multiple times, and N\-th \fI\%\-p\fP option sets weight of N\-th
URI in the command line. If the number of \fI\%\-p\fP option is
less than the number of URI, the last \fI\%\-p\fP option value is
repeated. If there is no \fI\%\-p\fP option, default weight, 16,
is assumed. The valid value range is
[1, 256], inclusive. [1, 256], inclusive.
.sp
Default: \fB16\fP
.UNINDENT .UNINDENT
.INDENT 0.0 .INDENT 0.0
.TP .TP
@@ -170,14 +167,6 @@ multiple header table size change.
.UNINDENT .UNINDENT
.INDENT 0.0 .INDENT 0.0
.TP .TP
.B \-\-encoder\-header\-table\-size=<SIZE>
Specify encoder header table size. The decoder (server)
specifies the maximum dynamic table size it accepts.
Then the negotiated dynamic table size is the minimum of
this option value and the value which server specified.
.UNINDENT
.INDENT 0.0
.TP
.B \-b, \-\-padding=<N> .B \-b, \-\-padding=<N>
Add at most <N> bytes to a frame payload as padding. Add at most <N> bytes to a frame payload as padding.
Specify 0 to disable padding. Specify 0 to disable padding.
@@ -236,12 +225,6 @@ combined with the \fI\%\-d\fP option.
.UNINDENT .UNINDENT
.INDENT 0.0 .INDENT 0.0
.TP .TP
.B \-y, \-\-no\-verify\-peer
Suppress warning on server certificate verification
failure.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-version .B \-\-version
Display version information and exit. Display version information and exit.
.UNINDENT .UNINDENT

View File

@@ -107,14 +107,11 @@ OPTIONS
.. option:: -p, --weight=<WEIGHT> .. option:: -p, --weight=<WEIGHT>
Sets weight of given URI. This option can be used Sets priority group weight. The valid value range is
multiple times, and N-th :option:`-p` option sets weight of N-th
URI in the command line. If the number of :option:`-p` option is
less than the number of URI, the last :option:`-p` option value is
repeated. If there is no :option:`-p` option, default weight, 16,
is assumed. The valid value range is
[1, 256], inclusive. [1, 256], inclusive.
Default: ``16``
.. option:: -M, --peer-max-concurrent-streams=<N> .. option:: -M, --peer-max-concurrent-streams=<N>
Use <N> as SETTINGS_MAX_CONCURRENT_STREAMS value of Use <N> as SETTINGS_MAX_CONCURRENT_STREAMS value of
@@ -131,13 +128,6 @@ OPTIONS
frame payload before the last value, to simulate frame payload before the last value, to simulate
multiple header table size change. multiple header table size change.
.. option:: --encoder-header-table-size=<SIZE>
Specify encoder header table size. The decoder (server)
specifies the maximum dynamic table size it accepts.
Then the negotiated dynamic table size is the minimum of
this option value and the value which server specified.
.. option:: -b, --padding=<N> .. option:: -b, --padding=<N>
Add at most <N> bytes to a frame payload as padding. Add at most <N> bytes to a frame payload as padding.
@@ -186,11 +176,6 @@ OPTIONS
Continue interim response. This option is ignored unless Continue interim response. This option is ignored unless
combined with the :option:`-d` option. combined with the :option:`-d` option.
.. option:: -y, --no-verify-peer
Suppress warning on server certificate verification
failure.
.. option:: --version .. option:: --version
Display version information and exit. Display version information and exit.

View File

@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText. .\" Man page generated from reStructuredText.
. .
.TH "NGHTTPD" "1" "Jan 18, 2019" "1.36.0" "nghttp2" .TH "NGHTTPD" "1" "Jul 21, 2016" "1.13.0" "nghttp2"
.SH NAME .SH NAME
nghttpd \- HTTP/2 server nghttpd \- HTTP/2 server
. .
@@ -99,14 +99,6 @@ Specify decoder header table size.
.UNINDENT .UNINDENT
.INDENT 0.0 .INDENT 0.0
.TP .TP
.B \-\-encoder\-header\-table\-size=<SIZE>
Specify encoder header table size. The decoder (client)
specifies the maximum dynamic table size it accepts.
Then the negotiated dynamic table size is the minimum of
this option value and the value which client specified.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-color .B \-\-color
Force colored log output. Force colored log output.
.UNINDENT .UNINDENT

View File

@@ -70,13 +70,6 @@ OPTIONS
Specify decoder header table size. Specify decoder header table size.
.. option:: --encoder-header-table-size=<SIZE>
Specify encoder header table size. The decoder (client)
specifies the maximum dynamic table size it accepts.
Then the negotiated dynamic table size is the minimum of
this option value and the value which client specified.
.. option:: --color .. option:: --color
Force colored log output. Force colored log output.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -41,33 +41,6 @@ FILES
:option:`--conf` option cannot be used in the configuration file and :option:`--conf` option cannot be used in the configuration file and
will be ignored if specified. will be ignored if specified.
Error log
Error log is written to stderr by default. It can be configured
using :option:`--errorlog-file`. The format of log message is as
follows:
<datetime> <master-pid> <current-pid> <thread-id> <level> (<filename>:<line>) <msg>
<datetime>
It is a combination of date and time when the log is written. It
is in ISO 8601 format.
<master-pid>
It is a master process ID.
<current-pid>
It is a process ID which writes this log.
<thread-id>
It is a thread ID which writes this log. It would be unique
within <current-pid>.
<filename> and <line>
They are source file name, and line number which produce this log.
<msg>
It is a log message body.
SIGNALS SIGNALS
------- -------
@@ -76,25 +49,14 @@ SIGQUIT
accepting connection. After all connections are handled, nghttpx accepting connection. After all connections are handled, nghttpx
exits. exits.
SIGHUP
Reload configuration file given in :option:`--conf`.
SIGUSR1 SIGUSR1
Reopen log files. Reopen log files.
SIGUSR2 SIGUSR2
Fork and execute nghttpx. It will execute the binary in the same Fork and execute nghttpx. It will execute the binary in the same
path with same command-line arguments and environment variables. As path with same command-line arguments and environment variables.
of nghttpx version 1.20.0, the new master process sends SIGQUIT to After new process comes up, sending SIGQUIT to the original process
the original master process when it is ready to serve requests. For to perform hot swapping.
the earlier versions of nghttpx, user has to send SIGQUIT to the
original master process.
The difference between SIGUSR2 (+ SIGQUIT) and SIGHUP is that former
is usually used to execute new binary, and the master process is
newly spawned. On the other hand, the latter just reloads
configuration file, and the same master process continues to exist.
.. note:: .. note::
@@ -171,22 +133,6 @@ be customized using :option:`--fetch-ocsp-response-file` option.
If OCSP query is failed, previous OCSP response, if any, is continued If OCSP query is failed, previous OCSP response, if any, is continued
to be used. to be used.
:option:`--fetch-ocsp-response-file` option provides wide range of
possibility to manage OCSP response. It can take an arbitrary script
or executable. The requirement is that it supports the command-line
interface of ``fetch-ocsp-response`` script, and it must return a
valid DER encoded OCSP response on success. It must return exit code
0 on success, and 75 for temporary error, and the other error code for
generic failure. For large cluster of servers, it is not efficient
for each server to perform OCSP query using ``fetch-ocsp-response``.
Instead, you can retrieve OCSP response in some way, and store it in a
disk or a shared database. Then specify a program in
:option:`--fetch-ocsp-response-file` to fetch it from those stores.
This could provide a way to share the OCSP response between fleet of
servers, and also any OCSP query strategy can be applied which may be
beyond the ability of nghttpx itself or ``fetch-ocsp-response``
script.
TLS SESSION RESUMPTION TLS SESSION RESUMPTION
---------------------- ----------------------
@@ -200,7 +146,7 @@ By default, session ID is shared by all worker threads.
If :option:`--tls-session-cache-memcached` is given, nghttpx will If :option:`--tls-session-cache-memcached` is given, nghttpx will
insert serialized session data to memcached with insert serialized session data to memcached with
``nghttpx:tls-session-cache:`` + lowercase hex string of session ID ``nghttpx:tls-session-cache:`` + lowercased hex string of session ID
as a memcached entry key, with expiry time 12 hours. Session timeout as a memcached entry key, with expiry time 12 hours. Session timeout
is set to 12 hours. is set to 12 hours.
@@ -256,24 +202,6 @@ from the given file. In this case, nghttpx does not rotate key
automatically. To rotate key, one has to restart nghttpx (see automatically. To rotate key, one has to restart nghttpx (see
SIGNALS). SIGNALS).
CERTIFICATE TRANSPARENCY
------------------------
nghttpx supports TLS ``signed_certificate_timestamp`` extension (`RFC
6962 <https://tools.ietf.org/html/rfc6962>`_). The relevant options
are :option:`--tls-sct-dir` and ``sct-dir`` parameter in
:option:`--subcert`. They takes a directory, and nghttpx reads all
files whose extension is ``.sct`` under the directory. The ``*.sct``
files are encoded as ``SignedCertificateTimestamp`` struct described
in `section 3.2 of RFC 69662
<https://tools.ietf.org/html/rfc6962#section-3.2>`_. This format is
the same one used by `nginx-ct
<https://github.com/grahamedgecombe/nginx-ct>`_ and `mod_ssl_ct
<https://httpd.apache.org/docs/trunk/mod/mod_ssl_ct.html>`_.
`ct-submit <https://github.com/grahamedgecombe/ct-submit>`_ can be
used to submit certificates to log servers, and obtain the
``SignedCertificateTimestamp`` struct which can be used with nghttpx.
MRUBY SCRIPTING MRUBY SCRIPTING
--------------- ---------------
@@ -282,14 +210,6 @@ MRUBY SCRIPTING
The current mruby extension API is experimental and not frozen. The The current mruby extension API is experimental and not frozen. The
API is subject to change in the future release. API is subject to change in the future release.
.. warning::
Almost all string value returned from method, or attribute is a
fresh new mruby string, which involves memory allocation, and
copies. Therefore, it is strongly recommended to store a return
value in a local variable, and use it, instead of calling method or
accessing attribute repeatedly.
nghttpx allows users to extend its capability using mruby scripts. nghttpx allows users to extend its capability using mruby scripts.
nghttpx has 2 hook points to execute mruby script: request phase and nghttpx has 2 hook points to execute mruby script: request phase and
response phase. The request phase hook is invoked after all request response phase. The request phase hook is invoked after all request
@@ -299,28 +219,9 @@ server. These hooks allows users to modify header fields, or common
HTTP variables, like authority or request path, and even return custom HTTP variables, like authority or request path, and even return custom
response without forwarding request to backend servers. response without forwarding request to backend servers.
There are 2 levels of mruby script invocations: global and To specify mruby script file, use :option:`--mruby-file` option. The
per-pattern. The global mruby script is set by :option:`--mruby-file` script will be evaluated once per thread on startup, and it must
option and is called for all requests. The per-pattern mruby script instantiate object and evaluate it as the return value (e.g.,
is set by "mruby" parameter in :option:`-b` option. It is invoked for
a request which matches the particular pattern. The order of hook
invocation is: global request phase hook, per-pattern request phase
hook, per-pattern response phase hook, and finally global response
phase hook. If a hook returns a response, any later hooks are not
invoked. The global request hook is invoked before the pattern
matching is made and changing request path may affect the pattern
matching.
Please note that request and response hooks of per-pattern mruby
script for a single request might not come from the same script. This
might happen after a request hook is executed, backend failed for some
reason, and at the same time, backend configuration is replaced by API
request, and then the request uses new configuration on retry. The
response hook from new configuration, if it is specified, will be
invoked.
The all mruby script will be evaluated once per thread on startup, and
it must instantiate object and evaluate it as the return value (e.g.,
``App.new``). This object is called app object. If app object ``App.new``). This object is called app object. If app object
defines ``on_req`` method, it is called with :rb:class:`Nghttpx::Env` defines ``on_req`` method, it is called with :rb:class:`Nghttpx::Env`
object on request hook. Similarly, if app object defines ``on_resp`` object on request hook. Similarly, if app object defines ``on_resp``
@@ -355,7 +256,7 @@ respectively.
.. rb:attr_reader:: ctx .. rb:attr_reader:: ctx
Return Ruby hash object. It persists until request finishes. Return Ruby hash object. It persists until request finishes.
So values set in request phase hook can be retrieved in So values set in request phase hoo can be retrieved in
response phase hook. response phase hook.
.. rb:attr_reader:: phase .. rb:attr_reader:: phase
@@ -383,68 +284,6 @@ respectively.
Return true if TLS is used on the connection. Return true if TLS is used on the connection.
.. rb:attr_reader:: tls_sni
Return the TLS SNI value which client sent in this connection.
.. rb:attr_reader:: tls_client_fingerprint_sha256
Return the SHA-256 fingerprint of a client certificate.
.. rb:attr_reader:: tls_client_fingerprint_sha1
Return the SHA-1 fingerprint of a client certificate.
.. rb:attr_reader:: tls_client_issuer_name
Return the issuer name of a client certificate.
.. rb:attr_reader:: tls_client_subject_name
Return the subject name of a client certificate.
.. rb:attr_reader:: tls_client_serial
Return the serial number of a client certificate.
.. rb:attr_reader:: tls_client_not_before
Return the start date of a client certificate in seconds since
the epoch.
.. rb:attr_reader:: tls_client_not_after
Return the end date of a client certificate in seconds since
the epoch.
.. rb:attr_reader:: tls_cipher
Return a TLS cipher negotiated in this connection.
.. rb:attr_reader:: tls_protocol
Return a TLS protocol version negotiated in this connection.
.. rb:attr_reader:: tls_session_id
Return a session ID for this connection in hex string.
.. rb:attr_reader:: tls_session_reused
Return true if, and only if a SSL/TLS session is reused.
.. rb:attr_reader:: alpn
Return ALPN identifier negotiated in this connection.
.. rb:attr_reader:: tls_handshake_finished
Return true if SSL/TLS handshake has finished. If it returns
false in the request phase hook, the request is received in
TLSv1.3 early data (0-RTT) and might be vulnerable to the
replay attack. nghttpx will send Early-Data header field to
backend servers to indicate this.
.. rb:class:: Request .. rb:class:: Request
Object to represent request from client. The modification to Object to represent request from client. The modification to
@@ -575,10 +414,10 @@ respectively.
not be invoked. When this method is called in response phase not be invoked. When this method is called in response phase
hook, response from backend server is canceled and discarded. hook, response from backend server is canceled and discarded.
The status code and response header fields should be set The status code and response header fields should be set
before using this method. To set status code, use before using this method. To set status code, use :rb:meth To
set response header fields, use
:rb:attr:`Nghttpx::Response#status`. If status code is not :rb:attr:`Nghttpx::Response#status`. If status code is not
set, 200 is used. To set response header fields, set, 200 is used. :rb:meth:`Nghttpx::Response#add_header` and
:rb:meth:`Nghttpx::Response#add_header` and
:rb:meth:`Nghttpx::Response#set_header`. When this method is :rb:meth:`Nghttpx::Response#set_header`. When this method is
invoked in response phase hook, the response headers are invoked in response phase hook, the response headers are
filled with the ones received from backend server. To send filled with the ones received from backend server. To send
@@ -587,18 +426,6 @@ respectively.
existing header fields, and then add required header fields. existing header fields, and then add required header fields.
It is an error to call this method twice for a given request. It is an error to call this method twice for a given request.
.. rb:method:: send_info(status, headers)
Send non-final (informational) response to a client. *status*
must be in the range [100, 199], inclusive. *headers* is a
hash containing response header fields. Its key must be a
string, and the associated value must be either string or
array of strings. Since this is not a final response, even if
this method is invoked, request is still forwarded to a
backend unless :rb:meth:`Nghttpx::Response#return` is called.
This method can be called multiple times. It cannot be called
after :rb:meth:`Nghttpx::Response#return` is called.
MRUBY EXAMPLES MRUBY EXAMPLES
~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~
@@ -660,20 +487,17 @@ status
code code
HTTP status code HTTP status code
Additionally, depending on the API endpoint, ``data`` key may be
present, and its value contains the API endpoint specific data.
We wrote "normally", since nghttpx may return ordinal HTML response in We wrote "normally", since nghttpx may return ordinal HTML response in
some cases where the error has occurred before reaching API endpoint some cases where the error has occurred before reaching API endpoint
(e.g., header field is too large). (e.g., header field is too large).
The following section describes available API endpoints. The following section describes available API endpoints.
POST /api/v1beta1/backendconfig PUT /api/v1beta1/backendconfig
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This API replaces the current backend server settings with the This API replaces the current backend server settings with the
requested ones. The request method should be POST, but PUT is also requested ones. The request method should be PUT, but POST is also
acceptable. The request body must be nghttpx configuration file acceptable. The request body must be nghttpx configuration file
format. For configuration file format, see `FILES`_ section. The format. For configuration file format, see `FILES`_ section. The
line separator inside the request body must be single LF (0x0A). line separator inside the request body must be single LF (0x0A).
@@ -689,29 +513,10 @@ The replacement is done instantly without breaking existing
connections or requests. It also avoids any process creation as is connections or requests. It also avoids any process creation as is
the case with hot swapping with signals. the case with hot swapping with signals.
The one limitation is that only numeric IP address is allowed in The one limitation is that only numeric IP address is allowd in
:option:`backend <--backend>` in request body unless "dns" parameter :option:`backend <--backend>` in request body while non numeric
is used while non numeric hostname is allowed in command-line or hostname is allowed in command-line or configuration file is read
configuration file is read using :option:`--conf`. using :option:`--conf`.
GET /api/v1beta1/configrevision
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This API returns configuration revision of the current nghttpx. The
configuration revision is opaque string, and it changes after each
reloading by SIGHUP. With this API, an external application knows
that whether nghttpx has finished reloading its configuration by
comparing the configuration revisions between before and after
reloading. It is recommended to disable persistent (keep-alive)
connection for this purpose in order to avoid to send a request using
the reused connection which may bound to an old process.
This API returns response including ``data`` key. Its value is JSON
object, and it contains at least the following key:
configRevision
The configuration revision of the current nghttpx
SEE ALSO SEE ALSO
-------- --------

View File

@@ -36,7 +36,7 @@ functions, and it also interacts with it via many API function calls.
An application can create as many :type:`nghttp2_session` object as it An application can create as many :type:`nghttp2_session` object as it
wants. But single :type:`nghttp2_session` object must be used by a wants. But single :type:`nghttp2_session` object must be used by a
single thread at the same time. This is not so hard to enforce since single thread at the same time. This is not so hard to enforce since
most event-based architecture applications use is single thread per most event-based architecture applicatons use is single thread per
core, and handling one connection I/O is done by single thread. core, and handling one connection I/O is done by single thread.
To feed input to :type:`nghttp2_session` object, one can use To feed input to :type:`nghttp2_session` object, one can use
@@ -110,16 +110,13 @@ HTTP Messaging
By default, nghttp2 library checks HTTP messaging rules described in By default, nghttp2 library checks HTTP messaging rules described in
`HTTP/2 specification, section 8 `HTTP/2 specification, section 8
<https://tools.ietf.org/html/rfc7540#section-8>`_. Everything <https://tools.ietf.org/html/draft-ietf-httpbis-http2-17#section-8>`_.
described in that section is not validated however. We briefly Everything described in that section is not validated however. We
describe what the library does in this area. In the following briefly describe what the library does in this area. In the following
description, without loss of generality we omit CONTINUATION frame description, without loss of generality we omit CONTINUATION frame
since they must follow HEADERS frame and are processed atomically. In since they must follow HEADERS frame and are processed atomically. In
other words, they are just one big HEADERS frame. To disable these other words, they are just one big HEADERS frame. To disable these
validations, use `nghttp2_option_set_no_http_messaging()`. Please validations, use `nghttp2_option_set_no_http_messaging()`.
note that disabling this feature does not change the fundamental
client and server model of HTTP. That is, even if the validation is
disabled, only client can send requests.
For HTTP request, including those carried by PUSH_PROMISE, HTTP For HTTP request, including those carried by PUSH_PROMISE, HTTP
message starts with one HEADERS frame containing request headers. It message starts with one HEADERS frame containing request headers. It
@@ -152,11 +149,13 @@ header fields must not appear: "Connection", "Keep-Alive",
Each header field name and value must obey the field-name and Each header field name and value must obey the field-name and
field-value production rules described in `RFC 7230, section field-value production rules described in `RFC 7230, section
3.2. <https://tools.ietf.org/html/rfc7230#section-3.2>`_. 3.2. <https://tools.ietf.org/html/rfc7230#section-3.2>`_.
Additionally, all field name must be lower cased. The invalid header Additionally, all field name must be lower cased. While the pseudo
fields are treated as stream error, and that stream is reset. If header fields must satisfy these rules, we just ignore illegal regular
application wants to treat these headers in their own way, use headers (this means that these header fields are not passed to
`nghttp2_on_invalid_header_callback application callback). This is because these illegal header fields
<https://nghttp2.org/documentation/types.html#c.nghttp2_on_invalid_header_callback>`_. are floating around in existing internet and resetting stream just
because of this may break many web sites. This is especially true if
we forward to or translate from HTTP/1 traffic.
For "http" or "https" URIs, ":path" pseudo header fields must start For "http" or "https" URIs, ":path" pseudo header fields must start
with "/". The only exception is OPTIONS request, in that case, "*" is with "/". The only exception is OPTIONS request, in that case, "*" is
@@ -174,64 +173,10 @@ parsed as 64 bit signed integer. The sum of data length in the
following DATA frames must match with the number in "Content-Length" following DATA frames must match with the number in "Content-Length"
header field if it is present (this does not include padding bytes). header field if it is present (this does not include padding bytes).
RFC 7230 says that server must not send "Content-Length" in any
response with 1xx, and 204 status code. It also says that
"Content-Length" is not allowed in any response with 200 status code
to a CONNECT request. nghttp2 enforces them as well.
Any deviation results in stream error of type PROTOCOL_ERROR. If Any deviation results in stream error of type PROTOCOL_ERROR. If
error is found in PUSH_PROMISE frame, stream error is raised against error is found in PUSH_PROMISE frame, stream error is raised against
promised stream. promised stream.
The order of transmission of the HTTP/2 frames
----------------------------------------------
This section describes the internals of libnghttp2 about the
scheduling of transmission of HTTP/2 frames. This is pretty much
internal stuff, so the details could change in the future versions of
the library.
libnghttp2 categorizes HTTP/2 frames into 4 categories: urgent,
regular, syn_stream, and data in the order of higher priority.
The urgent category includes PING and SETTINGS. They are sent with
highest priority. The order inside the category is FIFO.
The regular category includes frames other than PING, SETTINGS, DATA,
and HEADERS which does not create stream (which counts toward
concurrent stream limit). The order inside the category is FIFO.
The syn_stream category includes HEADERS frame which creates stream,
that counts toward the concurrent stream limit.
The data category includes DATA frame, and the scheduling among DATA
frames are determined by HTTP/2 dependency tree.
If the application wants to send frames in the specific order, and the
default transmission order does not fit, it has to schedule frames by
itself using the callbacks (e.g.,
:type:`nghttp2_on_frame_send_callback`).
RST_STREAM has special side effect when it is submitted by
`nghttp2_submit_rst_stream()`. It cancels all pending HEADERS and
DATA frames whose stream ID matches the one in the RST_STREAM frame.
This may cause unexpected behaviour for the application in some cases.
For example, suppose that application wants to send RST_STREAM after
sending response HEADERS and DATA. Because of the reason we mentioned
above, the following code does not work:
.. code-block:: c
nghttp2_submit_response(...)
nghttp2_submit_rst_stream(...)
RST_STREAM cancels HEADERS (and DATA), and just RST_STREAM is sent.
The correct way is use :type:`nghttp2_on_frame_send_callback`, and
after HEADERS and DATA frames are sent, issue
`nghttp2_submit_rst_stream()`. FYI,
:type:`nghttp2_on_frame_not_send_callback` tells you why frames are
not sent.
Implement user defined HTTP/2 non-critical extensions Implement user defined HTTP/2 non-critical extensions
----------------------------------------------------- -----------------------------------------------------
@@ -249,7 +194,7 @@ set to :type:`nghttp2_session_callbacks` using
`nghttp2_session_callbacks_set_pack_extension_callback()`. `nghttp2_session_callbacks_set_pack_extension_callback()`.
For example, we will illustrate how to send `ALTSVC For example, we will illustrate how to send `ALTSVC
<https://tools.ietf.org/html/rfc7838>`_ frame. <https://tools.ietf.org/html/draft-ietf-httpbis-alt-svc-14>`_ frame.
.. code-block:: c .. code-block:: c

View File

@@ -2,7 +2,7 @@ Building Android binary
======================= =======================
In this article, we briefly describe how to build Android binary using In this article, we briefly describe how to build Android binary using
`Android NDK <https://developer.android.com/ndk/index.html>`_ `Android NDK <http://developer.android.com/tools/sdk/ndk/index.html>`_
cross-compiler on Debian Linux. cross-compiler on Debian Linux.
The easiest way to build android binary is use Dockerfile.android. The easiest way to build android binary is use Dockerfile.android.
@@ -22,22 +22,24 @@ unpacked:
.. code-block:: text .. code-block:: text
$ build/tools/make_standalone_toolchain.py \ $ build/tools/make_standalone_toolchain.py \
--arch arm --api 16 --stl gnustl \ --arch arm --api 16 --stl gnustl
--install-dir $ANDROID_HOME/toolchain --install-dir $ANDROID_HOME/toolchain
The API level (``--api``) is not important here because we don't use The API level (``--api``) is not important here because we don't use
Android specific C/C++ API. Android specific C/C++ API.
The dependent libraries, such as OpenSSL, libev, and c-ares should be The dependent libraries, such as OpenSSL and libev should be built
built with the toolchain and installed under with the toolchain and installed under ``$ANDROID_HOME/usr/local``.
``$ANDROID_HOME/usr/local``. We recommend to build these libraries as We recommend to build these libraries as static library to make the
static library to make the deployment easier. libxml2 support is deployment easier. libxml2 support is currently disabled.
currently disabled.
Although zlib comes with Android NDK, it seems not to be a part of Although zlib comes with Android NDK, it seems not to be a part of
public API, so we have to built it for our own. That also provides us public API, so we have to built it for our own. That also provides us
proper .pc file as a bonus. proper .pc file as a bonus.
If SPDY support is required for nghttpx and h2load, build and install
spdylay as well.
Before running ``android-config`` and ``android-make``, Before running ``android-config`` and ``android-make``,
``ANDROID_HOME`` environment variable must be set to point to the ``ANDROID_HOME`` environment variable must be set to point to the
correct path. Also add ``$ANDROID_HOME/toolchain/bin`` to ``PATH``: correct path. Also add ``$ANDROID_HOME/toolchain/bin`` to ``PATH``:
@@ -94,26 +96,6 @@ patch, to configure libev, use the following script:
And run ``make install`` to build and install. And run ``make install`` to build and install.
To configure c-ares, use the following script:
.. code-block:: sh
#!/bin/sh -e
if [ -z "$ANDROID_HOME" ]; then
echo 'No $ANDROID_HOME specified.'
exit 1
fi
PREFIX=$ANDROID_HOME/usr/local
TOOLCHAIN=$ANDROID_HOME/toolchain
PATH=$TOOLCHAIN/bin:$PATH
./configure \
--host=arm-linux-androideabi \
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
--prefix=$PREFIX \
--disable-shared
To configure zlib, use the following script: To configure zlib, use the following script:
.. code-block:: sh .. code-block:: sh
@@ -143,6 +125,34 @@ To configure zlib, use the following script:
And run ``make install`` to build and install. And run ``make install`` to build and install.
To configure spdylay, use the following script:
.. code-block:: sh
#!/bin/sh -e
if [ -z "$ANDROID_HOME" ]; then
echo 'No $ANDROID_HOME specified.'
exit 1
fi
PREFIX=$ANDROID_HOME/usr/local
TOOLCHAIN=$ANDROID_HOME/toolchain
PATH=$TOOLCHAIN/bin:$PATH
./configure \
--disable-shared \
--host=arm-linux-androideabi \
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
--prefix=$PREFIX \
--without-libxml2 \
--disable-src \
--disable-examples \
CPPFLAGS="-I$PREFIX/include" \
PKG_CONFIG_LIBDIR="$PREFIX/lib/pkgconfig" \
LDFLAGS="-L$PREFIX/lib"
And run ``make install`` to build and install.
After prerequisite libraries are prepared, run ``android-config`` and After prerequisite libraries are prepared, run ``android-config`` and
then ``android-make`` to compile nghttp2 source files. then ``android-make`` to compile nghttp2 source files.

View File

@@ -26,16 +26,17 @@ Coding style
We use clang-format to format source code consistently. The We use clang-format to format source code consistently. The
clang-format configuration file .clang-format is located at the root clang-format configuration file .clang-format is located at the root
directory. Since clang-format produces slightly different results directory. Since clang-format produces slightly different results
between versions, we currently use clang-format-7. between versions, we currently use clang-format which comes with
clang-3.6.
To detect any violation to the coding style, we recommend to setup git To detect any violation to the coding style, we recommend to setup git
pre-commit hook to check coding style of the changes you introduced. pre-commit hook to check coding style of the changes you introduced.
The pre-commit file is located at the root directory. Copy it under The pre-commit file is located at the root directory. Copy it under
.git/hooks and make sure that it is executable. The pre-commit script .git/hooks and make sure that it is executable. The pre-commit script
uses clang-format-diff.py to detect any style errors. If it is not in uses clang-format-diff.py to detect any style errors. If it is not in
your PATH or it exists under different name (e.g., clang-format-diff-7 your PATH or it exists under different name (e.g.,
in debian), either add it to PATH variable or add git option clang-format-diff-3.6 in debian), either add it to PATH variable or
``clangformatdiff.binary`` to point to the script. add git option ``clangformatdiff.binary`` to point to the script.
For emacs users, integrating clang-format to emacs is very easy. For emacs users, integrating clang-format to emacs is very easy.
clang-format.el should come with clang distribution. If it is not clang-format.el should come with clang distribution. If it is not

View File

@@ -3,14 +3,16 @@
h2load - HTTP/2 benchmarking tool - HOW-TO h2load - HTTP/2 benchmarking tool - HOW-TO
========================================== ==========================================
:doc:`h2load.1` is benchmarking tool for HTTP/2 and HTTP/1.1. It :doc:`h2load.1` is benchmarking tool for HTTP/2 and HTTP/1.1. If
supports SSL/TLS and clear text for all supported protocols. built with spdylay (http://tatsuhiro-t.github.io/spdylay/) library, it
also supports SPDY protocol. It supports SSL/TLS and clear text for
all supported protocols.
Compiling from source Compiling from source
--------------------- ---------------------
h2load is compiled alongside nghttp2 and requires that the h2load is compiled alongside nghttp2 and requires that the
``--enable-app`` flag is passed to ``./configure`` and `required ``--enable-apps`` flag is passed to ``./configure`` and `required
dependencies <https://github.com/nghttp2/nghttp2#requirements>`_ are dependencies <https://github.com/nghttp2/nghttp2#requirements>`_ are
available during compilation. For details on compiling, see `nghttp2: available during compilation. For details on compiling, see `nghttp2:
Building from Git Building from Git
@@ -62,40 +64,23 @@ The benchmarking result looks like this:
See the h2load manual page :ref:`h2load-1-output` section for the See the h2load manual page :ref:`h2load-1-output` section for the
explanation of the above numbers. explanation of the above numbers.
Timing-based load-testing
-------------------------
As of v1.26.0, h2load supports timing-based load-testing. This method
performs load-testing in terms of a given duration instead of a
pre-defined number of requests. The new option :option:`--duration`
specifies how long the load-testing takes. For example,
``--duration=10`` makes h2load perform load-testing against a server
for 10 seconds. You can also specify a “warming-up” period with
:option:`--warm-up-time`. If :option:`--duration` is used,
:option:`-n` option is ignored.
The following command performs load-testing for 10 seconds after 5
seconds warming up period:
.. code-block:: text
$ h2load -c100 -m100 --duration=10 --warm-up-time=5 https://localhost
Flow Control Flow Control
------------ ------------
HTTP/2 has flow control and it may affect benchmarking results. By HTTP/2 and SPDY/3 or later employ flow control and it may affect
default, h2load uses large enough flow control window, which benchmarking results. By default, h2load uses large enough flow
effectively disables flow control. To adjust receiver flow control control window, which effectively disables flow control. To adjust
window size, there are following options: receiver flow control window size, there are following options:
:option:`-w` :option:`-w`
Sets the stream level initial window size to Sets the stream level initial window size to
(2**<N>)-1. (2**<N>)-1. For SPDY, 2**<N> is used instead.
:option:`-W` :option:`-W`
Sets the connection level initial window size to Sets the connection level initial window size to
(2**<N>)-1. (2**<N>)-1. For SPDY, if <N> is strictly less
than 16, this option is ignored. Otherwise
2**<N> is used for SPDY.
Multi-Threading Multi-Threading
--------------- ---------------

View File

@@ -290,7 +290,7 @@ Normally, client does not stop even after all requests are done unless
connection is lost. To stop client, call connection is lost. To stop client, call
``nghttp2::asio_http2::server::session::shutdown()``. ``nghttp2::asio_http2::server::session::shutdown()``.
Receive server push and enable SSL/TLS Recieve server push and enable SSL/TLS
++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++
.. code-block:: cpp .. code-block:: cpp

View File

@@ -4,10 +4,10 @@ nghttpx - HTTP/2 proxy - HOW-TO
=============================== ===============================
:doc:`nghttpx.1` is a proxy translating protocols between HTTP/2 and :doc:`nghttpx.1` is a proxy translating protocols between HTTP/2 and
other protocols (e.g., HTTP/1). It operates in several modes and each other protocols (e.g., HTTP/1, SPDY). It operates in several modes
mode may require additional programs to work with. This article and each mode may require additional programs to work with. This
describes each operation mode and explains the intended use-cases. It article describes each operation mode and explains the intended
also covers some useful options later. use-cases. It also covers some useful options later.
Default mode Default mode
------------ ------------
@@ -15,7 +15,9 @@ Default mode
If nghttpx is invoked without :option:`--http2-proxy`, it operates in If nghttpx is invoked without :option:`--http2-proxy`, it operates in
default mode. In this mode, it works as reverse proxy (gateway) for default mode. In this mode, it works as reverse proxy (gateway) for
both HTTP/2 and HTTP/1 clients to backend servers. This is also known both HTTP/2 and HTTP/1 clients to backend servers. This is also known
as "HTTP/2 router". as "HTTP/2 router". If nghttpx is linked with spdylay library and
frontend connection is SSL/TLS, the frontend also supports SPDY
protocol.
By default, frontend connection is encrypted using SSL/TLS. So By default, frontend connection is encrypted using SSL/TLS. So
server's private key and certificate must be supplied to the command server's private key and certificate must be supplied to the command
@@ -23,10 +25,11 @@ line (or through configuration file). In this case, the frontend
protocol selection will be done via ALPN or NPN. protocol selection will be done via ALPN or NPN.
To turn off encryption on frontend connection, use ``no-tls`` keyword To turn off encryption on frontend connection, use ``no-tls`` keyword
in :option:`--frontend` option. HTTP/2 and HTTP/1 are available on in :option:`--frontend` option. In this case, SPDY protocol is not
the frontend, and an HTTP/1 connection can be upgraded to HTTP/2 using available even if spdylay library is liked to nghttpx. HTTP/2 and
HTTP Upgrade. Starting HTTP/2 connection by sending HTTP/2 connection HTTP/1 are available on the frontend, and an HTTP/1 connection can be
preface is also supported. upgraded to HTTP/2 using HTTP Upgrade. Starting HTTP/2 connection by
sending HTTP/2 connection preface is also supported.
nghttpx can listen on multiple frontend addresses. This is achieved nghttpx can listen on multiple frontend addresses. This is achieved
by using multiple :option:`--frontend` options. For each frontend by using multiple :option:`--frontend` options. For each frontend
@@ -42,17 +45,17 @@ that default backend protocol is HTTP/1.1. To use HTTP/2 in backend,
you have to specify ``h2`` in ``proto`` keyword in :option:`--backend` you have to specify ``h2`` in ``proto`` keyword in :option:`--backend`
explicitly. explicitly.
The backend is supposed to be a Web server. For example, to make The backend is supposed to be Web server. For example, to make
nghttpx listen to encrypted HTTP/2 requests at port 8443, and a nghttpx listen to encrypted HTTP/2 requests at port 8443, and a
backend Web server is configured to listen to HTTP requests at port backend Web server is configured to listen to HTTP request at port
8080 on the same host, run nghttpx command-line like this: 8080 in the same host, run nghttpx command-line like this:
.. code-block:: text .. code-block:: text
$ nghttpx -f0.0.0.0,8443 -b127.0.0.1,8080 /path/to/server.key /path/to/server.crt $ nghttpx -f0.0.0.0,8443 -b127.0.0.1,8080 /path/to/server.key /path/to/server.crt
Then an HTTP/2 enabled client can access the nghttpx server using HTTP/2. For Then HTTP/2 enabled client can access to the nghttpx in HTTP/2. For
example, you can send a GET request using nghttp: example, you can send GET request to the server using nghttp:
.. code-block:: text .. code-block:: text
@@ -63,18 +66,19 @@ HTTP/2 proxy mode
If nghttpx is invoked with :option:`--http2-proxy` (or its shorthand If nghttpx is invoked with :option:`--http2-proxy` (or its shorthand
:option:`-s`) option, it operates in HTTP/2 proxy mode. The supported :option:`-s`) option, it operates in HTTP/2 proxy mode. The supported
protocols in frontend and backend connections are the same as in `default protocols in frontend and backend connections are the same in `default
mode`_. The difference is that this mode acts like a forward proxy and mode`_. The difference is that this mode acts like forward proxy and
assumes the backend is an HTTP proxy server (e.g., Squid, Apache Traffic assumes the backend is HTTP proxy server (e.g., Squid, Apache Traffic
Server). HTTP/1 requests must include an absolute URI in request line. Server). HTTP/1 request must include absolute URI in request line.
By default, the frontend connection is encrypted. So this mode is By default, frontend connection is encrypted. So this mode is also
also called secure proxy. called secure proxy. If nghttpx is linked with spdylay, it supports
SPDY protocols and it works as so called SPDY proxy.
To turn off encryption on the frontend connection, use ``no-tls`` keyword To turn off encryption on frontend connection, use ``no-tls`` keyword
in :option:`--frontend` option. in :option:`--frontend` option.
The backend must be an HTTP proxy server. nghttpx supports multiple The backend must be HTTP proxy server. nghttpx supports multiple
backend server addresses. It translates incoming requests to HTTP backend server addresses. It translates incoming requests to HTTP
request to backend server. The backend server performs real proxy request to backend server. The backend server performs real proxy
work for each request, for example, dispatching requests to the origin work for each request, for example, dispatching requests to the origin
@@ -88,7 +92,7 @@ connection, use :option:`--backend` option, and specify ``h2`` in
For example, to make nghttpx listen to encrypted HTTP/2 requests at For example, to make nghttpx listen to encrypted HTTP/2 requests at
port 8443, and a backend HTTP proxy server is configured to listen to port 8443, and a backend HTTP proxy server is configured to listen to
HTTP/1 requests at port 8080 on the same host, run nghttpx command-line HTTP/1 request at port 8080 in the same host, run nghttpx command-line
like this: like this:
.. code-block:: text .. code-block:: text
@@ -98,8 +102,8 @@ like this:
At the time of this writing, Firefox 41 and Chromium v46 can use At the time of this writing, Firefox 41 and Chromium v46 can use
nghttpx as HTTP/2 proxy. nghttpx as HTTP/2 proxy.
To make Firefox or Chromium use nghttpx as HTTP/2 proxy, user has to To make Firefox or Chromium use nghttpx as HTTP/2 or SPDY proxy, user
create proxy.pac script file like this: has to create proxy.pac script file like this:
.. code-block:: javascript .. code-block:: javascript
@@ -140,11 +144,6 @@ Consult Traffic server `documentation
to know how to configure traffic server as forward proxy and its to know how to configure traffic server as forward proxy and its
security implications. security implications.
ALPN support
------------
ALPN support requires OpenSSL >= 1.0.2.
Disable frontend SSL/TLS Disable frontend SSL/TLS
------------------------ ------------------------
@@ -207,17 +206,17 @@ Rewriting location header field
nghttpx automatically rewrites location response header field if the nghttpx automatically rewrites location response header field if the
following all conditions satisfy: following all conditions satisfy:
* In the default mode (:option:`--http2-proxy` is not used) * URI in location header field is not absolute URI or is not https URI.
* :option:`--no-location-rewrite` is not used
* URI in location header field is an absolute URI
* URI in location header field includes non empty host component. * URI in location header field includes non empty host component.
* host (without port) in URI in location header field must match the * host (without port) in URI in location header field must match the
host appearing in ``:authority`` or ``host`` header field. host appearing in :authority or host header field.
When rewrite happens, URI scheme is replaced with the ones used in When rewrite happens, URI scheme and port are replaced with the ones
frontend, and authority is replaced with which appears in used in frontend, and host is replaced with which appears in
``:authority``, or ``host`` request header field. ``:authority`` :authority or host request header field. :authority header field has
header field has precedence over ``host``. precedence. If the above conditions are not met with the host value
in :authority header field, rewrite is retried with the value in host
header field.
Hot swapping Hot swapping
------------ ------------
@@ -225,21 +224,12 @@ Hot swapping
nghttpx supports hot swapping using signals. The hot swapping in nghttpx supports hot swapping using signals. The hot swapping in
nghttpx is multi step process. First send USR2 signal to nghttpx nghttpx is multi step process. First send USR2 signal to nghttpx
process. It will do fork and execute new executable, using same process. It will do fork and execute new executable, using same
command-line arguments and environment variables. command-line arguments and environment variables. At this point, both
current and new processes can accept requests. To gracefully shutdown
As of nghttpx version 1.20.0, that is all you have to do. The new current process, send QUIT signal to current nghttpx process. When
master process sends QUIT signal to the original process, when it is all existing frontend connections are done, the current process will
ready to serve requests, to shut it down gracefully. exit. At this point, only new nghttpx process exists and serves
incoming requests.
For earlier versions of nghttpx, you have to do one more thing. At
this point, both current and new processes can accept requests. To
gracefully shutdown current process, send QUIT signal to current
nghttpx process. When all existing frontend connections are done, the
current process will exit. At this point, only new nghttpx process
exists and serves incoming requests.
If you want to just reload configuration file without executing new
binary, send SIGHUP to nghttpx master process.
Re-opening log files Re-opening log files
-------------------- --------------------
@@ -293,31 +283,13 @@ When you write this option in command-line, you should enclose
argument with single or double quotes, since the character ``;`` has a argument with single or double quotes, since the character ``;`` has a
special meaning in shell. special meaning in shell.
To route, request to request path ``/foo`` to backend server To route, request to request path whose prefix is ``/foo`` to backend
``[::1]:8080``, you can write like so: server ``[::1]:8080``, you can write like so:
.. code-block:: text .. code-block:: text
backend=::1,8080;/foo backend=::1,8080;/foo
If the last character of path pattern is ``/``, all request paths
which start with that pattern match:
.. code-block:: text
backend=::1,8080;/bar/
The request path ``/bar/buzz`` matches the ``/bar/``.
You can use ``*`` at the end of the path pattern to make it wildcard
pattern. ``*`` must match at least one character:
.. code-block:: text
backend=::1,8080;/sample*
The request path ``/sample1/foo`` matches the ``/sample*`` pattern.
Of course, you can specify both host and request path at the same Of course, you can specify both host and request path at the same
time: time:
@@ -363,9 +335,10 @@ requests, do this:
backend=serv1,3000;/;proto=h2 backend=serv1,3000;/;proto=h2
backend=serv1,3000;/ws/;proto=http/1.1 backend=serv1,3000;/ws/;proto=http/1.1
The default backend protocol is HTTP/1.1. Note that the backends share the same pattern must have the same
backend protocol. The default backend protocol is HTTP/1.1.
TLS can be enabled per pattern basis: TLS can be enabed per pattern basis:
.. code-block:: text .. code-block:: text
@@ -375,145 +348,6 @@ TLS can be enabled per pattern basis:
In the above case, connection to serv1 will be encrypted by TLS. On In the above case, connection to serv1 will be encrypted by TLS. On
the other hand, connection to serv2 will not be encrypted by TLS. the other hand, connection to serv2 will not be encrypted by TLS.
Dynamic hostname lookup
-----------------------
By default, nghttpx performs backend hostname lookup at start up, or
configuration reload, and keeps using them in its entire session. To
make nghttpx perform hostname lookup dynamically, use ``dns``
parameter in :option:`--backend` option, like so:
.. code-block:: text
backend=foo.example.com,80;;dns
nghttpx will cache resolved addresses for certain period of time. To
change this cache period, use :option:`--dns-cache-timeout`.
Enable PROXY protocol
---------------------
PROXY protocol can be enabled per frontend. In order to enable PROXY
protocol, use ``proxyproto`` parameter in :option:`--frontend` option,
like so:
.. code-block:: text
frontend=*,443;proxyproto
Session affinity
----------------
Two kinds of session affinity are available: client IP, and HTTP
Cookie.
To enable client IP based affinity, specify ``affinity=ip`` parameter
in :option:`--backend` option. If PROXY protocol is enabled, then an
address obtained from PROXY protocol is taken into consideration.
To enable HTTP Cookie based affinity, specify ``affinity=cookie``
parameter, and specify a name of cookie in ``affinity-cookie-name``
parameter. Optionally, a Path attribute can be specified in
``affinity-cookie-path`` parameter:
.. code-block:: text
backend=127.0.0.1,3000;;affinity=cookie;affinity-cookie-name=nghttpxlb;affinity-cookie-path=/
Secure attribute of cookie is set if client connection is protected by
TLS.
PSK cipher suites
-----------------
nghttpx supports pre-shared key (PSK) cipher suites for both frontend
and backend TLS connections. For frontend connection, use
:option:`--psk-secrets` option to specify a file which contains PSK
identity and secrets. The format of the file is
``<identity>:<hex-secret>``, where ``<identity>`` is PSK identity, and
``<hex-secret>`` is PSK secret in hex, like so:
.. code-block:: text
client1:9567800e065e078085c241d54a01c6c3f24b3bab71a606600f4c6ad2c134f3b9
client2:b1376c3f8f6dcf7c886c5bdcceecd1e6f1d708622b6ddd21bda26ebd0c0bca99
nghttpx server accepts any of the identity and secret pairs in the
file. The default cipher suite list does not contain PSK cipher
suites. In order to use PSK, PSK cipher suite must be enabled by
using :option:`--ciphers` option. The desired PSK cipher suite may be
listed in `HTTP/2 cipher black list
<https://tools.ietf.org/html/rfc7540#appendix-A>`_. In order to use
such PSK cipher suite with HTTP/2, disable HTTP/2 cipher black list by
using :option:`--no-http2-cipher-black-list` option. But you should
understand its implications.
At the time of writing, even if only PSK cipher suites are specified
in :option:`--ciphers` option, certificate and private key are still
required.
For backend connection, use :option:`--client-psk-secrets` option to
specify a file which contains single PSK identity and secret. The
format is the same as the file used by :option:`--psk-secrets`
described above, but only first identity and secret pair is solely
used, like so:
.. code-block:: text
client2:b1376c3f8f6dcf7c886c5bdcceecd1e6f1d708622b6ddd21bda26ebd0c0bca99
The default cipher suite list does not contain PSK cipher suites. In
order to use PSK, PSK cipher suite must be enabled by using
:option:`--client-ciphers` option. The desired PSK cipher suite may
be listed in `HTTP/2 cipher black list
<https://tools.ietf.org/html/rfc7540#appendix-A>`_. In order to use
such PSK cipher suite with HTTP/2, disable HTTP/2 cipher black list by
using :option:`--client-no-http2-cipher-black-list` option. But you
should understand its implications.
TLSv1.3
-------
As of nghttpx v1.34.0, if it is built with OpenSSL 1.1.1 or later, it
supports TLSv1.3. 0-RTT data is supported, but by default its
processing is postponed until TLS handshake completes to mitigate
replay attack. This costs extra round trip and reduces effectiveness
of 0-RTT data. :option:`--tls-no-postpone-early-data` makes nghttpx
not wait for handshake to complete before forwarding request included
in 0-RTT to get full potential of 0-RTT data. In this case, nghttpx
adds ``Early-Data: 1`` header field when forwarding a request to a
backend server. All backend servers should recognize this header
field and understand that there is a risk for replay attack. See `RFC
8470 <https://tools.ietf.org/html/rfc8470>`_ for ``Early-Data`` header
field.
nghttpx disables anti replay protection provided by OpenSSL. The anti
replay protection of OpenSSL requires that a resumed request must hit
the same server which generates the session ticket. Therefore it
might not work nicely in a deployment where there are multiple nghttpx
instances sharing ticket encryption keys via memcached.
Because TLSv1.3 completely changes the semantics of cipher suite
naming scheme and structure, nghttpx provides the new option
:option:`--tls13-ciphers` and :option:`--tls13-client-ciphers` to
change preferred cipher list for TLSv1.3.
Migration from nghttpx v1.18.x or earlier
-----------------------------------------
As of nghttpx v1.19.0, :option:`--ciphers` option only changes cipher
list for frontend TLS connection. In order to change cipher list for
backend connection, use :option:`--client-ciphers` option.
Similarly, :option:`--no-http2-cipher-black-list` option only disables
HTTP/2 cipher black list for frontend connection. In order to disable
HTTP/2 cipher black list for backend connection, use
:option:`--client-no-http2-cipher-black-list` option.
``--accept-proxy-protocol`` option was deprecated. Instead, use
``proxyproto`` parameter in :option:`--frontend` option to enable
PROXY protocol support per frontend.
Migration from nghttpx v1.8.0 or earlier Migration from nghttpx v1.8.0 or earlier
---------------------------------------- ----------------------------------------

View File

@@ -13,7 +13,7 @@ The extension module is called ``nghttp2``.
determined by configure script. If the detected Python version is not determined by configure script. If the detected Python version is not
what you expect, specify a path to Python executable in ``PYTHON`` what you expect, specify a path to Python executable in ``PYTHON``
variable as an argument to configure script (e.g., ``./configure variable as an argument to configure script (e.g., ``./configure
PYTHON=/usr/bin/python3.5``). PYTHON=/usr/bin/python3.4``).
HPACK API HPACK API
--------- ---------
@@ -136,15 +136,15 @@ HTTP/2 servers
.. note:: .. note::
We use :py:mod:`asyncio` for HTTP/2 server classes, and ALPN. We use :py:mod:`asyncio` for HTTP/2 server classes. Therefore,
Therefore, Python 3.5 or later is required to use these objects. Python 3.4 or later is required to use these objects. To
To explicitly configure nghttp2 build to use Python 3.5, specify explicitly configure nghttp2 build to use Python 3.4, specify the
the ``PYTHON`` variable to the path to Python 3.5 executable when ``PYTHON`` variable to the path to Python 3.4 executable when
invoking configure script like this: invoking configure script like this:
.. code-block:: text .. code-block:: text
$ ./configure PYTHON=/usr/bin/python3.5 $ ./configure PYTHON=/usr/bin/python3.4
.. py:class:: HTTP2Server(address, RequestHandlerClass, ssl=None) .. py:class:: HTTP2Server(address, RequestHandlerClass, ssl=None)

View File

@@ -124,7 +124,6 @@ remote server. It's defined as::
bev = bufferevent_openssl_socket_new( bev = bufferevent_openssl_socket_new(
evbase, -1, ssl, BUFFEREVENT_SSL_CONNECTING, evbase, -1, ssl, BUFFEREVENT_SSL_CONNECTING,
BEV_OPT_DEFER_CALLBACKS | BEV_OPT_CLOSE_ON_FREE); BEV_OPT_DEFER_CALLBACKS | BEV_OPT_CLOSE_ON_FREE);
bufferevent_enable(bev, EV_READ | EV_WRITE);
bufferevent_setcb(bev, readcb, writecb, eventcb, session_data); bufferevent_setcb(bev, readcb, writecb, eventcb, session_data);
rv = bufferevent_socket_connect_hostname(bev, session_data->dnsbase, rv = bufferevent_socket_connect_hostname(bev, session_data->dnsbase,
AF_UNSPEC, host, port); AF_UNSPEC, host, port);

View File

@@ -78,16 +78,15 @@ header data. To initialize the object, use
int nghttp2_hd_inflate_new(nghttp2_hd_inflater **inflater_ptr); int nghttp2_hd_inflate_new(nghttp2_hd_inflater **inflater_ptr);
To inflate header data, use `nghttp2_hd_inflate_hd2()`:: To inflate header data, use `nghttp2_hd_inflate_hd()`::
ssize_t nghttp2_hd_inflate_hd2(nghttp2_hd_inflater *inflater, ssize_t nghttp2_hd_inflate_hd(nghttp2_hd_inflater *inflater,
nghttp2_nv *nv_out, int *inflate_flags, nghttp2_nv *nv_out, int *inflate_flags,
const uint8_t *in, size_t inlen, uint8_t *in, size_t inlen, int in_final);
int in_final);
`nghttp2_hd_inflate_hd2()` reads a stream of bytes and outputs a `nghttp2_hd_inflate_hd()` reads a stream of bytes and outputs a single
single header field at a time. Multiple calls are normally required to header field at a time. Multiple calls are normally required to read a
read a full stream of bytes and output all of the header fields. full stream of bytes and output all of the header fields.
The *inflater* is the inflater object initialized above. The *nv_out* The *inflater* is the inflater object initialized above. The *nv_out*
is a pointer to a :type:`nghttp2_nv` into which one header field may is a pointer to a :type:`nghttp2_nv` into which one header field may
@@ -119,7 +118,11 @@ If *in_final* is zero and the :macro:`NGHTTP2_HD_INFLATE_EMIT` flag is
not set, it indicates that all given data was processed. The caller not set, it indicates that all given data was processed. The caller
is required to pass additional data. is required to pass additional data.
Example usage of `nghttp2_hd_inflate_hd2()` is shown in the It is important to note that the function may produce one or more
header fields even if *inlen* is 0 when *in_final* is nonzero, due to
differential encoding.
Example usage of `nghttp2_hd_inflate_hd()` is shown in the
`inflate_header_block()` function in `deflate.c`_. `inflate_header_block()` function in `deflate.c`_.
Finally, to delete a :type:`nghttp2_hd_inflater` object, use Finally, to delete a :type:`nghttp2_hd_inflater` object, use

View File

@@ -7,8 +7,11 @@ if(ENABLE_EXAMPLES)
COMPILE_FLAGS "${WARNCXXFLAGS} ${CXX1XCXXFLAGS}") COMPILE_FLAGS "${WARNCXXFLAGS} ${CXX1XCXXFLAGS}")
include_directories( include_directories(
${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SOURCE_DIR}
"${CMAKE_CURRENT_SOURCE_DIR}/../third-party" ${CMAKE_SOURCE_DIR}/lib/includes
${CMAKE_BINARY_DIR}/lib/includes
${CMAKE_SOURCE_DIR}/src/includes
${CMAKE_SOURCE_DIR}/third-party
${LIBEVENT_INCLUDE_DIRS} ${LIBEVENT_INCLUDE_DIRS}
${OPENSSL_INCLUDE_DIRS} ${OPENSSL_INCLUDE_DIRS}
@@ -26,6 +29,10 @@ if(ENABLE_EXAMPLES)
add_executable(libevent-server libevent-server.c $<TARGET_OBJECTS:http-parser>) add_executable(libevent-server libevent-server.c $<TARGET_OBJECTS:http-parser>)
add_executable(deflate deflate.c $<TARGET_OBJECTS:http-parser>) add_executable(deflate deflate.c $<TARGET_OBJECTS:http-parser>)
if(ENABLE_TINY_NGHTTPD)
add_executable(tiny-nghttpd tiny-nghttpd.c $<TARGET_OBJECTS:http-parser>)
endif()
if(ENABLE_ASIO_LIB) if(ENABLE_ASIO_LIB)
foreach(name asio-sv asio-sv2 asio-cl asio-cl2) foreach(name asio-sv asio-sv2 asio-cl asio-cl2)
add_executable(${name} ${name}.cc $<TARGET_OBJECTS:http-parser>) add_executable(${name} ${name}.cc $<TARGET_OBJECTS:http-parser>)

View File

@@ -51,6 +51,14 @@ libevent_server_SOURCES = libevent-server.c
deflate_SOURCES = deflate.c deflate_SOURCES = deflate.c
if ENABLE_TINY_NGHTTPD
noinst_PROGRAMS += tiny-nghttpd
tiny_nghttpd_SOURCES = tiny-nghttpd.c
endif # ENABLE_TINY_NGHTTPD
if ENABLE_ASIO_LIB if ENABLE_ASIO_LIB
noinst_PROGRAMS += asio-sv asio-sv2 asio-cl asio-cl2 noinst_PROGRAMS += asio-sv asio-sv2 asio-cl asio-cl2
@@ -62,11 +70,11 @@ ASIOCPPFLAGS = ${AM_CPPFLAGS} ${BOOST_CPPFLAGS}
ASIOLDADD = $(top_builddir)/lib/libnghttp2.la \ ASIOLDADD = $(top_builddir)/lib/libnghttp2.la \
$(top_builddir)/src/libnghttp2_asio.la @JEMALLOC_LIBS@ \ $(top_builddir)/src/libnghttp2_asio.la @JEMALLOC_LIBS@ \
$(top_builddir)/third-party/libhttp-parser.la \ $(top_builddir)/third-party/libhttp-parser.la \
@OPENSSL_LIBS@ \
${BOOST_LDFLAGS} \ ${BOOST_LDFLAGS} \
${BOOST_ASIO_LIB} \ ${BOOST_ASIO_LIB} \
${BOOST_THREAD_LIB} \ ${BOOST_THREAD_LIB} \
${BOOST_SYSTEM_LIB} \ ${BOOST_SYSTEM_LIB} \
@OPENSSL_LIBS@ \
@APPLDFLAGS@ @APPLDFLAGS@
asio_sv_SOURCES = asio-sv.cc asio_sv_SOURCES = asio-sv.cc

View File

@@ -67,14 +67,14 @@ int main(int argc, char *argv[]) {
return; return;
} }
req->on_response([](const response &res) { req->on_response([&sess](const response &res) {
std::cerr << "HTTP/2 " << res.status_code() << std::endl; std::cerr << "HTTP/2 " << res.status_code() << std::endl;
for (auto &kv : res.header()) { for (auto &kv : res.header()) {
std::cerr << kv.first << ": " << kv.second.value << "\n"; std::cerr << kv.first << ": " << kv.second.value << "\n";
} }
std::cerr << std::endl; std::cerr << std::endl;
res.on_data([](const uint8_t *data, std::size_t len) { res.on_data([&sess](const uint8_t *data, std::size_t len) {
std::cerr.write(reinterpret_cast<const char *>(data), len); std::cerr.write(reinterpret_cast<const char *>(data), len);
std::cerr << std::endl; std::cerr << std::endl;
}); });

View File

@@ -91,17 +91,17 @@ int main(int argc, char *argv[]) {
return; return;
} }
req->on_response([](const response &res) { req->on_response([&sess, req](const response &res) {
std::cerr << "response header was received" << std::endl; std::cerr << "response header was received" << std::endl;
print_header(res); print_header(res);
res.on_data([](const uint8_t *data, std::size_t len) { res.on_data([&sess](const uint8_t *data, std::size_t len) {
std::cerr.write(reinterpret_cast<const char *>(data), len); std::cerr.write(reinterpret_cast<const char *>(data), len);
std::cerr << std::endl; std::cerr << std::endl;
}); });
}); });
req->on_close([](uint32_t error_code) { req->on_close([&sess](uint32_t error_code) {
std::cerr << "request done with error_code=" << error_code << std::endl; std::cerr << "request done with error_code=" << error_code << std::endl;
}); });

View File

@@ -159,13 +159,10 @@ static void diec(const char *func, int error_code) {
* bytes actually written. See the documentation of * bytes actually written. See the documentation of
* nghttp2_send_callback for the details. * nghttp2_send_callback for the details.
*/ */
static ssize_t send_callback(nghttp2_session *session, const uint8_t *data, static ssize_t send_callback(nghttp2_session *session _U_, const uint8_t *data,
size_t length, int flags, void *user_data) { size_t length, int flags _U_, void *user_data) {
struct Connection *connection; struct Connection *connection;
int rv; int rv;
(void)session;
(void)flags;
connection = (struct Connection *)user_data; connection = (struct Connection *)user_data;
connection->want_io = IO_NONE; connection->want_io = IO_NONE;
ERR_clear_error(); ERR_clear_error();
@@ -189,13 +186,10 @@ static ssize_t send_callback(nghttp2_session *session, const uint8_t *data,
* |length| bytes. Returns the number of bytes stored in |buf|. See * |length| bytes. Returns the number of bytes stored in |buf|. See
* the documentation of nghttp2_recv_callback for the details. * the documentation of nghttp2_recv_callback for the details.
*/ */
static ssize_t recv_callback(nghttp2_session *session, uint8_t *buf, static ssize_t recv_callback(nghttp2_session *session _U_, uint8_t *buf,
size_t length, int flags, void *user_data) { size_t length, int flags _U_, void *user_data) {
struct Connection *connection; struct Connection *connection;
int rv; int rv;
(void)session;
(void)flags;
connection = (struct Connection *)user_data; connection = (struct Connection *)user_data;
connection->want_io = IO_NONE; connection->want_io = IO_NONE;
ERR_clear_error(); ERR_clear_error();
@@ -216,10 +210,9 @@ static ssize_t recv_callback(nghttp2_session *session, uint8_t *buf,
} }
static int on_frame_send_callback(nghttp2_session *session, static int on_frame_send_callback(nghttp2_session *session,
const nghttp2_frame *frame, void *user_data) { const nghttp2_frame *frame,
void *user_data _U_) {
size_t i; size_t i;
(void)user_data;
switch (frame->hd.type) { switch (frame->hd.type) {
case NGHTTP2_HEADERS: case NGHTTP2_HEADERS:
if (nghttp2_session_get_stream_user_data(session, frame->hd.stream_id)) { if (nghttp2_session_get_stream_user_data(session, frame->hd.stream_id)) {
@@ -244,10 +237,9 @@ static int on_frame_send_callback(nghttp2_session *session,
} }
static int on_frame_recv_callback(nghttp2_session *session, static int on_frame_recv_callback(nghttp2_session *session,
const nghttp2_frame *frame, void *user_data) { const nghttp2_frame *frame,
void *user_data _U_) {
size_t i; size_t i;
(void)user_data;
switch (frame->hd.type) { switch (frame->hd.type) {
case NGHTTP2_HEADERS: case NGHTTP2_HEADERS:
if (frame->headers.cat == NGHTTP2_HCAT_RESPONSE) { if (frame->headers.cat == NGHTTP2_HCAT_RESPONSE) {
@@ -282,11 +274,9 @@ static int on_frame_recv_callback(nghttp2_session *session,
* we submit GOAWAY and close the session. * we submit GOAWAY and close the session.
*/ */
static int on_stream_close_callback(nghttp2_session *session, int32_t stream_id, static int on_stream_close_callback(nghttp2_session *session, int32_t stream_id,
uint32_t error_code, void *user_data) { uint32_t error_code _U_,
void *user_data _U_) {
struct Request *req; struct Request *req;
(void)error_code;
(void)user_data;
req = nghttp2_session_get_stream_user_data(session, stream_id); req = nghttp2_session_get_stream_user_data(session, stream_id);
if (req) { if (req) {
int rv; int rv;
@@ -303,13 +293,11 @@ static int on_stream_close_callback(nghttp2_session *session, int32_t stream_id,
* The implementation of nghttp2_on_data_chunk_recv_callback type. We * The implementation of nghttp2_on_data_chunk_recv_callback type. We
* use this function to print the received response body. * use this function to print the received response body.
*/ */
static int on_data_chunk_recv_callback(nghttp2_session *session, uint8_t flags, static int on_data_chunk_recv_callback(nghttp2_session *session,
int32_t stream_id, const uint8_t *data, uint8_t flags _U_, int32_t stream_id,
size_t len, void *user_data) { const uint8_t *data, size_t len,
void *user_data _U_) {
struct Request *req; struct Request *req;
(void)flags;
(void)user_data;
req = nghttp2_session_get_stream_user_data(session, stream_id); req = nghttp2_session_get_stream_user_data(session, stream_id);
if (req) { if (req) {
printf("[INFO] C <---------------------------- S (DATA chunk)\n" printf("[INFO] C <---------------------------- S (DATA chunk)\n"
@@ -345,19 +333,15 @@ static void setup_nghttp2_callbacks(nghttp2_session_callbacks *callbacks) {
callbacks, on_data_chunk_recv_callback); callbacks, on_data_chunk_recv_callback);
} }
#ifndef OPENSSL_NO_NEXTPROTONEG
/* /*
* Callback function for TLS NPN. Since this program only supports * Callback function for TLS NPN. Since this program only supports
* HTTP/2 protocol, if server does not offer HTTP/2 the nghttp2 * HTTP/2 protocol, if server does not offer HTTP/2 the nghttp2
* library supports, we terminate program. * library supports, we terminate program.
*/ */
static int select_next_proto_cb(SSL *ssl, unsigned char **out, static int select_next_proto_cb(SSL *ssl _U_, unsigned char **out,
unsigned char *outlen, const unsigned char *in, unsigned char *outlen, const unsigned char *in,
unsigned int inlen, void *arg) { unsigned int inlen, void *arg _U_) {
int rv; int rv;
(void)ssl;
(void)arg;
/* nghttp2_select_next_protocol() selects HTTP/2 protocol the /* nghttp2_select_next_protocol() selects HTTP/2 protocol the
nghttp2 library supports. */ nghttp2 library supports. */
rv = nghttp2_select_next_protocol(out, outlen, in, inlen); rv = nghttp2_select_next_protocol(out, outlen, in, inlen);
@@ -366,7 +350,6 @@ static int select_next_proto_cb(SSL *ssl, unsigned char **out,
} }
return SSL_TLSEXT_ERR_OK; return SSL_TLSEXT_ERR_OK;
} }
#endif /* !OPENSSL_NO_NEXTPROTONEG */
/* /*
* Setup SSL/TLS context. * Setup SSL/TLS context.
@@ -377,9 +360,7 @@ static void init_ssl_ctx(SSL_CTX *ssl_ctx) {
SSL_CTX_set_mode(ssl_ctx, SSL_MODE_AUTO_RETRY); SSL_CTX_set_mode(ssl_ctx, SSL_MODE_AUTO_RETRY);
SSL_CTX_set_mode(ssl_ctx, SSL_MODE_RELEASE_BUFFERS); SSL_CTX_set_mode(ssl_ctx, SSL_MODE_RELEASE_BUFFERS);
/* Set NPN callback */ /* Set NPN callback */
#ifndef OPENSSL_NO_NEXTPROTONEG
SSL_CTX_set_next_proto_select_cb(ssl_ctx, select_next_proto_cb, NULL); SSL_CTX_set_next_proto_select_cb(ssl_ctx, select_next_proto_cb, NULL);
#endif /* !OPENSSL_NO_NEXTPROTONEG */
} }
static void ssl_handshake(SSL *ssl, int fd) { static void ssl_handshake(SSL *ssl, int fd) {
@@ -476,10 +457,9 @@ static void ctl_poll(struct pollfd *pollfd, struct Connection *connection) {
static void submit_request(struct Connection *connection, struct Request *req) { static void submit_request(struct Connection *connection, struct Request *req) {
int32_t stream_id; int32_t stream_id;
/* Make sure that the last item is NULL */ /* Make sure that the last item is NULL */
const nghttp2_nv nva[] = {MAKE_NV(":method", "GET"), const nghttp2_nv nva[] = {
MAKE_NV_CS(":path", req->path), MAKE_NV(":method", "GET"), MAKE_NV_CS(":path", req->path),
MAKE_NV(":scheme", "https"), MAKE_NV(":scheme", "https"), MAKE_NV_CS(":authority", req->hostport),
MAKE_NV_CS(":authority", req->hostport),
MAKE_NV("accept", "*/*"), MAKE_NV("accept", "*/*"),
MAKE_NV("user-agent", "nghttp2/" NGHTTP2_VERSION)}; MAKE_NV("user-agent", "nghttp2/" NGHTTP2_VERSION)};

View File

@@ -44,7 +44,7 @@ static void deflate(nghttp2_hd_deflater *deflater,
static int inflate_header_block(nghttp2_hd_inflater *inflater, uint8_t *in, static int inflate_header_block(nghttp2_hd_inflater *inflater, uint8_t *in,
size_t inlen, int final); size_t inlen, int final);
int main() { int main(int argc _U_, char **argv _U_) {
int rv; int rv;
nghttp2_hd_deflater *deflater; nghttp2_hd_deflater *deflater;
nghttp2_hd_inflater *inflater; nghttp2_hd_inflater *inflater;

View File

@@ -199,27 +199,22 @@ static void print_headers(FILE *f, nghttp2_nv *nva, size_t nvlen) {
/* nghttp2_send_callback. Here we transmit the |data|, |length| bytes, /* nghttp2_send_callback. Here we transmit the |data|, |length| bytes,
to the network. Because we are using libevent bufferevent, we just to the network. Because we are using libevent bufferevent, we just
write those bytes into bufferevent buffer. */ write those bytes into bufferevent buffer. */
static ssize_t send_callback(nghttp2_session *session, const uint8_t *data, static ssize_t send_callback(nghttp2_session *session _U_, const uint8_t *data,
size_t length, int flags, void *user_data) { size_t length, int flags _U_, void *user_data) {
http2_session_data *session_data = (http2_session_data *)user_data; http2_session_data *session_data = (http2_session_data *)user_data;
struct bufferevent *bev = session_data->bev; struct bufferevent *bev = session_data->bev;
(void)session;
(void)flags;
bufferevent_write(bev, data, length); bufferevent_write(bev, data, length);
return (ssize_t)length; return (ssize_t)length;
} }
/* nghttp2_on_header_callback: Called when nghttp2 library emits /* nghttp2_on_header_callback: Called when nghttp2 library emits
single header name/value pair. */ single header name/value pair. */
static int on_header_callback(nghttp2_session *session, static int on_header_callback(nghttp2_session *session _U_,
const nghttp2_frame *frame, const uint8_t *name, const nghttp2_frame *frame, const uint8_t *name,
size_t namelen, const uint8_t *value, size_t namelen, const uint8_t *value,
size_t valuelen, uint8_t flags, void *user_data) { size_t valuelen, uint8_t flags _U_,
void *user_data) {
http2_session_data *session_data = (http2_session_data *)user_data; http2_session_data *session_data = (http2_session_data *)user_data;
(void)session;
(void)flags;
switch (frame->hd.type) { switch (frame->hd.type) {
case NGHTTP2_HEADERS: case NGHTTP2_HEADERS:
if (frame->headers.cat == NGHTTP2_HCAT_RESPONSE && if (frame->headers.cat == NGHTTP2_HCAT_RESPONSE &&
@@ -234,12 +229,10 @@ static int on_header_callback(nghttp2_session *session,
/* nghttp2_on_begin_headers_callback: Called when nghttp2 library gets /* nghttp2_on_begin_headers_callback: Called when nghttp2 library gets
started to receive header block. */ started to receive header block. */
static int on_begin_headers_callback(nghttp2_session *session, static int on_begin_headers_callback(nghttp2_session *session _U_,
const nghttp2_frame *frame, const nghttp2_frame *frame,
void *user_data) { void *user_data) {
http2_session_data *session_data = (http2_session_data *)user_data; http2_session_data *session_data = (http2_session_data *)user_data;
(void)session;
switch (frame->hd.type) { switch (frame->hd.type) {
case NGHTTP2_HEADERS: case NGHTTP2_HEADERS:
if (frame->headers.cat == NGHTTP2_HCAT_RESPONSE && if (frame->headers.cat == NGHTTP2_HCAT_RESPONSE &&
@@ -254,11 +247,9 @@ static int on_begin_headers_callback(nghttp2_session *session,
/* nghttp2_on_frame_recv_callback: Called when nghttp2 library /* nghttp2_on_frame_recv_callback: Called when nghttp2 library
received a complete frame from the remote peer. */ received a complete frame from the remote peer. */
static int on_frame_recv_callback(nghttp2_session *session, static int on_frame_recv_callback(nghttp2_session *session _U_,
const nghttp2_frame *frame, void *user_data) { const nghttp2_frame *frame, void *user_data) {
http2_session_data *session_data = (http2_session_data *)user_data; http2_session_data *session_data = (http2_session_data *)user_data;
(void)session;
switch (frame->hd.type) { switch (frame->hd.type) {
case NGHTTP2_HEADERS: case NGHTTP2_HEADERS:
if (frame->headers.cat == NGHTTP2_HCAT_RESPONSE && if (frame->headers.cat == NGHTTP2_HCAT_RESPONSE &&
@@ -275,13 +266,11 @@ static int on_frame_recv_callback(nghttp2_session *session,
is meant to the stream we initiated, print the received data in is meant to the stream we initiated, print the received data in
stdout, so that the user can redirect its output to the file stdout, so that the user can redirect its output to the file
easily. */ easily. */
static int on_data_chunk_recv_callback(nghttp2_session *session, uint8_t flags, static int on_data_chunk_recv_callback(nghttp2_session *session _U_,
int32_t stream_id, const uint8_t *data, uint8_t flags _U_, int32_t stream_id,
size_t len, void *user_data) { const uint8_t *data, size_t len,
void *user_data) {
http2_session_data *session_data = (http2_session_data *)user_data; http2_session_data *session_data = (http2_session_data *)user_data;
(void)session;
(void)flags;
if (session_data->stream_data->stream_id == stream_id) { if (session_data->stream_data->stream_id == stream_id) {
fwrite(data, 1, len, stdout); fwrite(data, 1, len, stdout);
} }
@@ -298,7 +287,7 @@ static int on_stream_close_callback(nghttp2_session *session, int32_t stream_id,
int rv; int rv;
if (session_data->stream_data->stream_id == stream_id) { if (session_data->stream_data->stream_id == stream_id) {
fprintf(stderr, "Stream %d closed with error_code=%u\n", stream_id, fprintf(stderr, "Stream %d closed with error_code=%d\n", stream_id,
error_code); error_code);
rv = nghttp2_session_terminate_session(session, NGHTTP2_NO_ERROR); rv = nghttp2_session_terminate_session(session, NGHTTP2_NO_ERROR);
if (rv != 0) { if (rv != 0) {
@@ -308,22 +297,17 @@ static int on_stream_close_callback(nghttp2_session *session, int32_t stream_id,
return 0; return 0;
} }
#ifndef OPENSSL_NO_NEXTPROTONEG
/* NPN TLS extension client callback. We check that server advertised /* NPN TLS extension client callback. We check that server advertised
the HTTP/2 protocol the nghttp2 library supports. If not, exit the HTTP/2 protocol the nghttp2 library supports. If not, exit
the program. */ the program. */
static int select_next_proto_cb(SSL *ssl, unsigned char **out, static int select_next_proto_cb(SSL *ssl _U_, unsigned char **out,
unsigned char *outlen, const unsigned char *in, unsigned char *outlen, const unsigned char *in,
unsigned int inlen, void *arg) { unsigned int inlen, void *arg _U_) {
(void)ssl;
(void)arg;
if (nghttp2_select_next_protocol(out, outlen, in, inlen) <= 0) { if (nghttp2_select_next_protocol(out, outlen, in, inlen) <= 0) {
errx(1, "Server did not advertise " NGHTTP2_PROTO_VERSION_ID); errx(1, "Server did not advertise " NGHTTP2_PROTO_VERSION_ID);
} }
return SSL_TLSEXT_ERR_OK; return SSL_TLSEXT_ERR_OK;
} }
#endif /* !OPENSSL_NO_NEXTPROTONEG */
/* Create SSL_CTX. */ /* Create SSL_CTX. */
static SSL_CTX *create_ssl_ctx(void) { static SSL_CTX *create_ssl_ctx(void) {
@@ -337,13 +321,11 @@ static SSL_CTX *create_ssl_ctx(void) {
SSL_OP_ALL | SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_ALL | SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 |
SSL_OP_NO_COMPRESSION | SSL_OP_NO_COMPRESSION |
SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION); SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION);
#ifndef OPENSSL_NO_NEXTPROTONEG
SSL_CTX_set_next_proto_select_cb(ssl_ctx, select_next_proto_cb, NULL); SSL_CTX_set_next_proto_select_cb(ssl_ctx, select_next_proto_cb, NULL);
#endif /* !OPENSSL_NO_NEXTPROTONEG */
#if OPENSSL_VERSION_NUMBER >= 0x10002000L #if OPENSSL_VERSION_NUMBER >= 0x10002000L
SSL_CTX_set_alpn_protos(ssl_ctx, (const unsigned char *)"\x02h2", 3); SSL_CTX_set_alpn_protos(ssl_ctx, (const unsigned char *)"\x02h2", 3);
#endif /* OPENSSL_VERSION_NUMBER >= 0x10002000L */ #endif // OPENSSL_VERSION_NUMBER >= 0x10002000L
return ssl_ctx; return ssl_ctx;
} }
@@ -479,10 +461,8 @@ static void readcb(struct bufferevent *bev, void *ptr) {
receiving GOAWAY, we check the some conditions on the nghttp2 receiving GOAWAY, we check the some conditions on the nghttp2
library and output buffer of bufferevent. If it indicates we have library and output buffer of bufferevent. If it indicates we have
no business to this session, tear down the connection. */ no business to this session, tear down the connection. */
static void writecb(struct bufferevent *bev, void *ptr) { static void writecb(struct bufferevent *bev _U_, void *ptr) {
http2_session_data *session_data = (http2_session_data *)ptr; http2_session_data *session_data = (http2_session_data *)ptr;
(void)bev;
if (nghttp2_session_want_read(session_data->session) == 0 && if (nghttp2_session_want_read(session_data->session) == 0 &&
nghttp2_session_want_write(session_data->session) == 0 && nghttp2_session_want_write(session_data->session) == 0 &&
evbuffer_get_length(bufferevent_get_output(session_data->bev)) == 0) { evbuffer_get_length(bufferevent_get_output(session_data->bev)) == 0) {
@@ -508,14 +488,12 @@ static void eventcb(struct bufferevent *bev, short events, void *ptr) {
ssl = bufferevent_openssl_get_ssl(session_data->bev); ssl = bufferevent_openssl_get_ssl(session_data->bev);
#ifndef OPENSSL_NO_NEXTPROTONEG
SSL_get0_next_proto_negotiated(ssl, &alpn, &alpnlen); SSL_get0_next_proto_negotiated(ssl, &alpn, &alpnlen);
#endif /* !OPENSSL_NO_NEXTPROTONEG */
#if OPENSSL_VERSION_NUMBER >= 0x10002000L #if OPENSSL_VERSION_NUMBER >= 0x10002000L
if (alpn == NULL) { if (alpn == NULL) {
SSL_get0_alpn_selected(ssl, &alpn, &alpnlen); SSL_get0_alpn_selected(ssl, &alpn, &alpnlen);
} }
#endif /* OPENSSL_VERSION_NUMBER >= 0x10002000L */ #endif // OPENSSL_VERSION_NUMBER >= 0x10002000L
if (alpn == NULL || alpnlen != 2 || memcmp("h2", alpn, 2) != 0) { if (alpn == NULL || alpnlen != 2 || memcmp("h2", alpn, 2) != 0) {
fprintf(stderr, "h2 is not negotiated\n"); fprintf(stderr, "h2 is not negotiated\n");
@@ -554,7 +532,6 @@ static void initiate_connection(struct event_base *evbase, SSL_CTX *ssl_ctx,
bev = bufferevent_openssl_socket_new( bev = bufferevent_openssl_socket_new(
evbase, -1, ssl, BUFFEREVENT_SSL_CONNECTING, evbase, -1, ssl, BUFFEREVENT_SSL_CONNECTING,
BEV_OPT_DEFER_CALLBACKS | BEV_OPT_CLOSE_ON_FREE); BEV_OPT_DEFER_CALLBACKS | BEV_OPT_CLOSE_ON_FREE);
bufferevent_enable(bev, EV_READ | EV_WRITE);
bufferevent_setcb(bev, readcb, writecb, eventcb, session_data); bufferevent_setcb(bev, readcb, writecb, eventcb, session_data);
rv = bufferevent_socket_connect_hostname(bev, session_data->dnsbase, rv = bufferevent_socket_connect_hostname(bev, session_data->dnsbase,
AF_UNSPEC, host, port); AF_UNSPEC, host, port);

View File

@@ -109,25 +109,18 @@ struct app_context {
static unsigned char next_proto_list[256]; static unsigned char next_proto_list[256];
static size_t next_proto_list_len; static size_t next_proto_list_len;
#ifndef OPENSSL_NO_NEXTPROTONEG static int next_proto_cb(SSL *s _U_, const unsigned char **data,
static int next_proto_cb(SSL *ssl, const unsigned char **data, unsigned int *len, void *arg _U_) {
unsigned int *len, void *arg) {
(void)ssl;
(void)arg;
*data = next_proto_list; *data = next_proto_list;
*len = (unsigned int)next_proto_list_len; *len = (unsigned int)next_proto_list_len;
return SSL_TLSEXT_ERR_OK; return SSL_TLSEXT_ERR_OK;
} }
#endif /* !OPENSSL_NO_NEXTPROTONEG */
#if OPENSSL_VERSION_NUMBER >= 0x10002000L #if OPENSSL_VERSION_NUMBER >= 0x10002000L
static int alpn_select_proto_cb(SSL *ssl, const unsigned char **out, static int alpn_select_proto_cb(SSL *ssl _U_, const unsigned char **out,
unsigned char *outlen, const unsigned char *in, unsigned char *outlen, const unsigned char *in,
unsigned int inlen, void *arg) { unsigned int inlen, void *arg _U_) {
int rv; int rv;
(void)ssl;
(void)arg;
rv = nghttp2_select_next_protocol((unsigned char **)out, outlen, in, inlen); rv = nghttp2_select_next_protocol((unsigned char **)out, outlen, in, inlen);
@@ -137,7 +130,7 @@ static int alpn_select_proto_cb(SSL *ssl, const unsigned char **out,
return SSL_TLSEXT_ERR_OK; return SSL_TLSEXT_ERR_OK;
} }
#endif /* OPENSSL_VERSION_NUMBER >= 0x10002000L */ #endif // OPENSSL_VERSION_NUMBER >= 0x10002000L
/* Create SSL_CTX. */ /* Create SSL_CTX. */
static SSL_CTX *create_ssl_ctx(const char *key_file, const char *cert_file) { static SSL_CTX *create_ssl_ctx(const char *key_file, const char *cert_file) {
@@ -174,13 +167,11 @@ static SSL_CTX *create_ssl_ctx(const char *key_file, const char *cert_file) {
NGHTTP2_PROTO_VERSION_ID_LEN); NGHTTP2_PROTO_VERSION_ID_LEN);
next_proto_list_len = 1 + NGHTTP2_PROTO_VERSION_ID_LEN; next_proto_list_len = 1 + NGHTTP2_PROTO_VERSION_ID_LEN;
#ifndef OPENSSL_NO_NEXTPROTONEG
SSL_CTX_set_next_protos_advertised_cb(ssl_ctx, next_proto_cb, NULL); SSL_CTX_set_next_protos_advertised_cb(ssl_ctx, next_proto_cb, NULL);
#endif /* !OPENSSL_NO_NEXTPROTONEG */
#if OPENSSL_VERSION_NUMBER >= 0x10002000L #if OPENSSL_VERSION_NUMBER >= 0x10002000L
SSL_CTX_set_alpn_select_cb(ssl_ctx, alpn_select_proto_cb, NULL); SSL_CTX_set_alpn_select_cb(ssl_ctx, alpn_select_proto_cb, NULL);
#endif /* OPENSSL_VERSION_NUMBER >= 0x10002000L */ #endif // OPENSSL_VERSION_NUMBER >= 0x10002000L
return ssl_ctx; return ssl_ctx;
} }
@@ -206,10 +197,8 @@ static void add_stream(http2_session_data *session_data,
} }
} }
static void remove_stream(http2_session_data *session_data, static void remove_stream(http2_session_data *session_data _U_,
http2_stream_data *stream_data) { http2_stream_data *stream_data) {
(void)session_data;
stream_data->prev->next = stream_data->next; stream_data->prev->next = stream_data->next;
if (stream_data->next) { if (stream_data->next) {
stream_data->next->prev = stream_data->prev; stream_data->next->prev = stream_data->prev;
@@ -254,7 +243,6 @@ static http2_session_data *create_http2_session_data(app_context *app_ctx,
session_data->bev = bufferevent_openssl_socket_new( session_data->bev = bufferevent_openssl_socket_new(
app_ctx->evbase, fd, ssl, BUFFEREVENT_SSL_ACCEPTING, app_ctx->evbase, fd, ssl, BUFFEREVENT_SSL_ACCEPTING,
BEV_OPT_CLOSE_ON_FREE | BEV_OPT_DEFER_CALLBACKS); BEV_OPT_CLOSE_ON_FREE | BEV_OPT_DEFER_CALLBACKS);
bufferevent_enable(session_data->bev, EV_READ | EV_WRITE);
rv = getnameinfo(addr, (socklen_t)addrlen, host, sizeof(host), NULL, 0, rv = getnameinfo(addr, (socklen_t)addrlen, host, sizeof(host), NULL, 0,
NI_NUMERICHOST); NI_NUMERICHOST);
if (rv != 0) { if (rv != 0) {
@@ -321,13 +309,10 @@ static int session_recv(http2_session_data *session_data) {
return 0; return 0;
} }
static ssize_t send_callback(nghttp2_session *session, const uint8_t *data, static ssize_t send_callback(nghttp2_session *session _U_, const uint8_t *data,
size_t length, int flags, void *user_data) { size_t length, int flags _U_, void *user_data) {
http2_session_data *session_data = (http2_session_data *)user_data; http2_session_data *session_data = (http2_session_data *)user_data;
struct bufferevent *bev = session_data->bev; struct bufferevent *bev = session_data->bev;
(void)session;
(void)flags;
/* Avoid excessive buffering in server side. */ /* Avoid excessive buffering in server side. */
if (evbuffer_get_length(bufferevent_get_output(session_data->bev)) >= if (evbuffer_get_length(bufferevent_get_output(session_data->bev)) >=
OUTPUT_WOULDBLOCK_THRESHOLD) { OUTPUT_WOULDBLOCK_THRESHOLD) {
@@ -390,17 +375,13 @@ static char *percent_decode(const uint8_t *value, size_t valuelen) {
return res; return res;
} }
static ssize_t file_read_callback(nghttp2_session *session, int32_t stream_id, static ssize_t file_read_callback(nghttp2_session *session _U_,
uint8_t *buf, size_t length, int32_t stream_id _U_, uint8_t *buf,
uint32_t *data_flags, size_t length, uint32_t *data_flags,
nghttp2_data_source *source, nghttp2_data_source *source,
void *user_data) { void *user_data _U_) {
int fd = source->fd; int fd = source->fd;
ssize_t r; ssize_t r;
(void)session;
(void)stream_id;
(void)user_data;
while ((r = read(fd, buf, length)) == -1 && errno == EINTR) while ((r = read(fd, buf, length)) == -1 && errno == EINTR)
; ;
if (r == -1) { if (r == -1) {
@@ -473,12 +454,10 @@ static int error_reply(nghttp2_session *session,
static int on_header_callback(nghttp2_session *session, static int on_header_callback(nghttp2_session *session,
const nghttp2_frame *frame, const uint8_t *name, const nghttp2_frame *frame, const uint8_t *name,
size_t namelen, const uint8_t *value, size_t namelen, const uint8_t *value,
size_t valuelen, uint8_t flags, void *user_data) { size_t valuelen, uint8_t flags _U_,
void *user_data _U_) {
http2_stream_data *stream_data; http2_stream_data *stream_data;
const char PATH[] = ":path"; const char PATH[] = ":path";
(void)flags;
(void)user_data;
switch (frame->hd.type) { switch (frame->hd.type) {
case NGHTTP2_HEADERS: case NGHTTP2_HEADERS:
if (frame->headers.cat != NGHTTP2_HCAT_REQUEST) { if (frame->headers.cat != NGHTTP2_HCAT_REQUEST) {
@@ -591,10 +570,9 @@ static int on_frame_recv_callback(nghttp2_session *session,
} }
static int on_stream_close_callback(nghttp2_session *session, int32_t stream_id, static int on_stream_close_callback(nghttp2_session *session, int32_t stream_id,
uint32_t error_code, void *user_data) { uint32_t error_code _U_, void *user_data) {
http2_session_data *session_data = (http2_session_data *)user_data; http2_session_data *session_data = (http2_session_data *)user_data;
http2_stream_data *stream_data; http2_stream_data *stream_data;
(void)error_code;
stream_data = nghttp2_session_get_stream_user_data(session, stream_id); stream_data = nghttp2_session_get_stream_user_data(session, stream_id);
if (!stream_data) { if (!stream_data) {
@@ -647,10 +625,8 @@ static int send_server_connection_header(http2_session_data *session_data) {
/* readcb for bufferevent after client connection header was /* readcb for bufferevent after client connection header was
checked. */ checked. */
static void readcb(struct bufferevent *bev, void *ptr) { static void readcb(struct bufferevent *bev _U_, void *ptr) {
http2_session_data *session_data = (http2_session_data *)ptr; http2_session_data *session_data = (http2_session_data *)ptr;
(void)bev;
if (session_recv(session_data) != 0) { if (session_recv(session_data) != 0) {
delete_http2_session_data(session_data); delete_http2_session_data(session_data);
return; return;
@@ -682,26 +658,23 @@ static void writecb(struct bufferevent *bev, void *ptr) {
} }
/* eventcb for bufferevent */ /* eventcb for bufferevent */
static void eventcb(struct bufferevent *bev, short events, void *ptr) { static void eventcb(struct bufferevent *bev _U_, short events, void *ptr) {
http2_session_data *session_data = (http2_session_data *)ptr; http2_session_data *session_data = (http2_session_data *)ptr;
if (events & BEV_EVENT_CONNECTED) { if (events & BEV_EVENT_CONNECTED) {
const unsigned char *alpn = NULL; const unsigned char *alpn = NULL;
unsigned int alpnlen = 0; unsigned int alpnlen = 0;
SSL *ssl; SSL *ssl;
(void)bev;
fprintf(stderr, "%s connected\n", session_data->client_addr); fprintf(stderr, "%s connected\n", session_data->client_addr);
ssl = bufferevent_openssl_get_ssl(session_data->bev); ssl = bufferevent_openssl_get_ssl(session_data->bev);
#ifndef OPENSSL_NO_NEXTPROTONEG
SSL_get0_next_proto_negotiated(ssl, &alpn, &alpnlen); SSL_get0_next_proto_negotiated(ssl, &alpn, &alpnlen);
#endif /* !OPENSSL_NO_NEXTPROTONEG */
#if OPENSSL_VERSION_NUMBER >= 0x10002000L #if OPENSSL_VERSION_NUMBER >= 0x10002000L
if (alpn == NULL) { if (alpn == NULL) {
SSL_get0_alpn_selected(ssl, &alpn, &alpnlen); SSL_get0_alpn_selected(ssl, &alpn, &alpnlen);
} }
#endif /* OPENSSL_VERSION_NUMBER >= 0x10002000L */ #endif // OPENSSL_VERSION_NUMBER >= 0x10002000L
if (alpn == NULL || alpnlen != 2 || memcmp("h2", alpn, 2) != 0) { if (alpn == NULL || alpnlen != 2 || memcmp("h2", alpn, 2) != 0) {
fprintf(stderr, "%s h2 is not negotiated\n", session_data->client_addr); fprintf(stderr, "%s h2 is not negotiated\n", session_data->client_addr);
@@ -730,11 +703,10 @@ static void eventcb(struct bufferevent *bev, short events, void *ptr) {
} }
/* callback for evconnlistener */ /* callback for evconnlistener */
static void acceptcb(struct evconnlistener *listener, int fd, static void acceptcb(struct evconnlistener *listener _U_, int fd,
struct sockaddr *addr, int addrlen, void *arg) { struct sockaddr *addr, int addrlen, void *arg) {
app_context *app_ctx = (app_context *)arg; app_context *app_ctx = (app_context *)arg;
http2_session_data *session_data; http2_session_data *session_data;
(void)listener;
session_data = create_http2_session_data(app_ctx, fd, addr, addrlen); session_data = create_http2_session_data(app_ctx, fd, addr, addrlen);

1344
examples/tiny-nghttpd.c Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,33 +0,0 @@
Fuzzer
======
This directory contains fuzzer target mainly written to integrate
nghttp2 into `oss-fuzz <https://github.com/google/oss-fuzz>`_.
fuzz_target.cc contains an entry point of fuzzer. corpus directory
contains initial data for fuzzer.
The file name of initial data under corpus is the lower-cased hex
string of SHA-256 hash of its own content.
corpus/h2spec contains input data which was recorded when we ran
`h2spec <https://github.com/summerwind/h2spec>`_ against nghttpd.
corpus/nghttp contains input data which was recorded when we ran
nghttp against nghttpd with some varying command line options of
nghttp.
To build fuzz_target.cc, make sure that libnghttp2 is built with
following compiler/linker flags:
.. code-block:: text
CPPFLAGS="-fsanitize-coverage=edge -fsanitize=address"
LDFLAGS="-fsanitize-coverage=edge -fsanitize=address"
Then, fuzz_target.cc can be built using the following command:
.. code-block:: text
$ clang++ -fsanitize-coverage=edge -fsanitize=address -I../lib/includes -std=c++11 fuzz_target.cc ../lib/.libs/libnghttp2.a /usr/lib/llvm-3.9/lib/libFuzzer.a -o nghttp2_fuzzer

View File

@@ -1,2 +0,0 @@
INVALID CONNECTION PREFACE

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