Compare commits

..

2 Commits

Author SHA1 Message Date
Tatsuhiro Tsujikawa 3accecd661 fixup! [WIP] GH actions 2020-11-16 21:11:59 +09:00
Tatsuhiro Tsujikawa edb0bf1f36 [WIP] GH actions 2020-11-16 21:07:38 +09:00
354 changed files with 18365 additions and 32692 deletions

View File

@ -2,18 +2,16 @@
Language: Cpp Language: Cpp
AccessModifierOffset: -2 AccessModifierOffset: -2
AlignAfterOpenBracket: Align AlignAfterOpenBracket: Align
AlignArrayOfStructures: None AlignConsecutiveMacros: false
AlignConsecutiveMacros: None AlignConsecutiveAssignments: false
AlignConsecutiveAssignments: None AlignConsecutiveDeclarations: false
AlignConsecutiveBitFields: None
AlignConsecutiveDeclarations: None
AlignEscapedNewlines: Right AlignEscapedNewlines: Right
AlignOperands: Align AlignOperands: true
AlignTrailingComments: true AlignTrailingComments: true
AllowAllArgumentsOnNextLine: true AllowAllArgumentsOnNextLine: true
AllowAllConstructorInitializersOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: true AllowAllParametersOfDeclarationOnNextLine: true
AllowShortEnumsOnASingleLine: true AllowShortBlocksOnASingleLine: false
AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: false AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: All AllowShortFunctionsOnASingleLine: All
AllowShortLambdasOnASingleLine: All AllowShortLambdasOnASingleLine: All
@ -23,14 +21,12 @@ AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: false AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: MultiLine AlwaysBreakTemplateDeclarations: MultiLine
AttributeMacros:
- __capability
BinPackArguments: true BinPackArguments: true
BinPackParameters: true BinPackParameters: true
BraceWrapping: BraceWrapping:
AfterCaseLabel: false AfterCaseLabel: false
AfterClass: false AfterClass: false
AfterControlStatement: Never AfterControlStatement: false
AfterEnum: false AfterEnum: false
AfterFunction: false AfterFunction: false
AfterNamespace: false AfterNamespace: false
@ -40,14 +36,11 @@ BraceWrapping:
AfterExternBlock: false AfterExternBlock: false
BeforeCatch: false BeforeCatch: false
BeforeElse: false BeforeElse: false
BeforeLambdaBody: false
BeforeWhile: false
IndentBraces: false IndentBraces: false
SplitEmptyFunction: true SplitEmptyFunction: true
SplitEmptyRecord: true SplitEmptyRecord: true
SplitEmptyNamespace: true SplitEmptyNamespace: true
BreakBeforeBinaryOperators: None BreakBeforeBinaryOperators: None
BreakBeforeConceptDeclarations: true
BreakBeforeBraces: Attach BreakBeforeBraces: Attach
BreakBeforeInheritanceComma: false BreakBeforeInheritanceComma: false
BreakInheritanceList: BeforeColon BreakInheritanceList: BeforeColon
@ -58,134 +51,76 @@ BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: true BreakStringLiterals: true
ColumnLimit: 80 ColumnLimit: 80
CommentPragmas: '^ IWYU pragma:' CommentPragmas: '^ IWYU pragma:'
QualifierAlignment: Leave
CompactNamespaces: false CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 4 ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4 ContinuationIndentWidth: 4
Cpp11BracedListStyle: true Cpp11BracedListStyle: true
DeriveLineEnding: true
DerivePointerAlignment: false DerivePointerAlignment: false
DisableFormat: false DisableFormat: false
EmptyLineAfterAccessModifier: Never
EmptyLineBeforeAccessModifier: LogicalBlock
ExperimentalAutoDetectBinPacking: false ExperimentalAutoDetectBinPacking: false
PackConstructorInitializers: NextLine
BasedOnStyle: ''
ConstructorInitializerAllOnOneLineOrOnePerLine: false
AllowAllConstructorInitializersOnNextLine: true
FixNamespaceComments: true FixNamespaceComments: true
ForEachMacros: ForEachMacros:
- foreach - foreach
- Q_FOREACH - Q_FOREACH
- BOOST_FOREACH - BOOST_FOREACH
IfMacros:
- KJ_IF_MAYBE
IncludeBlocks: Preserve IncludeBlocks: Preserve
IncludeCategories: IncludeCategories:
- Regex: '^"(llvm|llvm-c|clang|clang-c)/' - Regex: '^"(llvm|llvm-c|clang|clang-c)/'
Priority: 2 Priority: 2
SortPriority: 0
CaseSensitive: false
- Regex: '^(<|"(gtest|isl|json)/)' - Regex: '^(<|"(gtest|isl|json)/)'
Priority: 3 Priority: 3
SortPriority: 0
CaseSensitive: false
- Regex: '.*' - Regex: '.*'
Priority: 1 Priority: 1
SortPriority: 0
CaseSensitive: false
IncludeIsMainRegex: '$' IncludeIsMainRegex: '$'
IncludeIsMainSourceRegex: ''
IndentAccessModifiers: false
IndentCaseLabels: false IndentCaseLabels: false
IndentCaseBlocks: false
IndentGotoLabels: true
IndentPPDirectives: AfterHash IndentPPDirectives: AfterHash
IndentExternBlock: AfterExternBlock
IndentRequires: false
IndentWidth: 2 IndentWidth: 2
IndentWrappedFunctionNames: false IndentWrappedFunctionNames: false
InsertTrailingCommas: None
JavaScriptQuotes: Leave JavaScriptQuotes: Leave
JavaScriptWrapImports: true JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: true KeepEmptyLinesAtTheStartOfBlocks: true
LambdaBodyIndentation: Signature
MacroBlockBegin: '' MacroBlockBegin: ''
MacroBlockEnd: '' MacroBlockEnd: ''
MaxEmptyLinesToKeep: 1 MaxEmptyLinesToKeep: 1
NamespaceIndentation: None NamespaceIndentation: None
ObjCBinPackProtocolList: Auto ObjCBinPackProtocolList: Auto
ObjCBlockIndentWidth: 2 ObjCBlockIndentWidth: 2
ObjCBreakBeforeNestedBlockParam: true
ObjCSpaceAfterProperty: false ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true ObjCSpaceBeforeProtocolList: true
PenaltyBreakAssignment: 2 PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 19 PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300 PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120 PenaltyBreakFirstLessLess: 120
PenaltyBreakOpenParenthesis: 0
PenaltyBreakString: 1000 PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10 PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000 PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 60 PenaltyReturnTypeOnItsOwnLine: 60
PenaltyIndentedWhitespace: 0
PointerAlignment: Right PointerAlignment: Right
PPIndentWidth: -1
ReferenceAlignment: Pointer
ReflowComments: true ReflowComments: true
RemoveBracesLLVM: false SortIncludes: false
SeparateDefinitionBlocks: Leave
ShortNamespaceLines: 1
SortIncludes: Never
SortJavaStaticImport: Before
SortUsingDeclarations: true SortUsingDeclarations: true
SpaceAfterCStyleCast: false SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true SpaceBeforeAssignmentOperators: true
SpaceBeforeCaseColon: false
SpaceBeforeCpp11BracedList: false SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements SpaceBeforeParens: ControlStatements
SpaceBeforeParensOptions:
AfterControlStatements: true
AfterForeachMacros: true
AfterFunctionDefinitionName: false
AfterFunctionDeclarationName: false
AfterIfMacros: true
AfterOverloadedOperator: false
BeforeNonEmptyParentheses: false
SpaceAroundPointerQualifiers: Default
SpaceBeforeRangeBasedForLoopColon: true SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyBlock: false
SpaceInEmptyParentheses: false SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1 SpacesBeforeTrailingComments: 1
SpacesInAngles: Never SpacesInAngles: false
SpacesInConditionalStatement: false
SpacesInContainerLiterals: true SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false SpacesInCStyleCastParentheses: false
SpacesInLineCommentPrefix:
Minimum: 1
Maximum: -1
SpacesInParentheses: false SpacesInParentheses: false
SpacesInSquareBrackets: false SpacesInSquareBrackets: false
SpaceBeforeSquareBrackets: false Standard: Cpp11
BitFieldColonSpacing: Both
Standard: Latest
StatementAttributeLikeMacros:
- Q_EMIT
StatementMacros: StatementMacros:
- Q_UNUSED - Q_UNUSED
- QT_REQUIRE_VERSION - QT_REQUIRE_VERSION
TabWidth: 8 TabWidth: 8
UseCRLF: false
UseTab: Never UseTab: Never
WhitespaceSensitiveMacros:
- STRINGIZE
- PP_STRINGIZE
- BOOST_PP_STRINGIZE
- NS_SWIFT_NAME
- CF_SWIFT_NAME
... ...

View File

@ -1,43 +1,25 @@
name: build name: build
on: [push, pull_request] on: push
jobs: jobs:
build: build:
strategy:
matrix:
os: [ubuntu-22.04, macos-11]
compiler: [gcc, clang]
buildtool: [autotools, cmake]
http3: [http3, no-http3]
openssl: [openssl1, openssl3, boringssl]
exclude:
- os: macos-11
openssl: openssl3
- http3: no-http3
openssl: openssl3
- os: macos-11
compiler: gcc
- # disable macos cmake because of include path issue
os: macos-11
buildtool: cmake
- os: macos-11
openssl: boringssl
- openssl: boringssl
buildtool: cmake
- openssl: boringssl
compiler: gcc
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-18.04, macos-10.15]
compiler: [gcc, clang]
buildtool: [autotools, cmake]
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Linux setup - name: Linux setup
if: runner.os == 'Linux' if: runner.os == 'Linux'
run: | run: |
sudo apt-get install \ sudo apt-get install \
g++-12 \ g++-8 \
clang-14 \ clang-10 \
autoconf \ autoconf \
automake \ automake \
autotools-dev \ autotools-dev \
@ -52,11 +34,10 @@ jobs:
libjansson-dev \ libjansson-dev \
libjemalloc-dev \ libjemalloc-dev \
libc-ares-dev \ libc-ares-dev \
libelf-dev \
cmake \ cmake \
cmake-data cmake-data
echo 'CPPFLAGS=-fsanitize=address,undefined -fno-sanitize-recover=undefined -g' >> $GITHUB_ENV echo 'CPPFLAGS=-fsanitize=address' >> $GITHUB_ENV
echo 'LDFLAGS=-fsanitize=address,undefined -fno-sanitize-recover=undefined' >> $GITHUB_ENV echo 'LDFLAGS=-fsanitize=address' >> $GITHUB_ENV
- name: MacOS setup - name: MacOS setup
if: runner.os == 'macOS' if: runner.os == 'macOS'
run: | run: |
@ -71,11 +52,13 @@ jobs:
pkg-config \ pkg-config \
libtool libtool
echo 'PKG_CONFIG_PATH=/usr/local/opt/libressl/lib/pkgconfig:/usr/local/opt/libxml2/lib/pkgconfig' >> $GITHUB_ENV echo 'PKG_CONFIG_PATH=/usr/local/opt/libressl/lib/pkgconfig:/usr/local/opt/libxml2/lib/pkgconfig' >> $GITHUB_ENV
# This fixes infamous 'stdio.h not found' error.
echo 'SDKROOT='"$(xcrun --sdk macosx --show-sdk-path)" >> $GITHUB_ENV
- name: Setup clang (Linux) - name: Setup clang (Linux)
if: runner.os == 'Linux' && matrix.compiler == 'clang' if: runner.os == 'Linux' && matrix.compiler == 'clang'
run: | run: |
echo 'CC=clang-14' >> $GITHUB_ENV echo 'CC=clang-10' >> $GITHUB_ENV
echo 'CXX=clang++-14' >> $GITHUB_ENV echo 'CXX=clang++-10' >> $GITHUB_ENV
- name: Setup clang (MacOS) - name: Setup clang (MacOS)
if: runner.os == 'macOS' && matrix.compiler == 'clang' if: runner.os == 'macOS' && matrix.compiler == 'clang'
run: | run: |
@ -84,208 +67,39 @@ jobs:
- name: Setup gcc (Linux) - name: Setup gcc (Linux)
if: runner.os == 'Linux' && matrix.compiler == 'gcc' if: runner.os == 'Linux' && matrix.compiler == 'gcc'
run: | run: |
echo 'CC=gcc-12' >> $GITHUB_ENV echo 'CC=gcc-8' >> $GITHUB_ENV
echo 'CXX=g++-12' >> $GITHUB_ENV echo 'CXX=g++-8' >> $GITHUB_ENV
- name: Setup gcc (MacOS) - name: Setup gcc (MacOS)
if: runner.os == 'macOS' && matrix.compiler == 'gcc' if: runner.os == 'macOS' && matrix.compiler == 'gcc'
run: | run: |
echo 'CC=gcc' >> $GITHUB_ENV echo 'CC=gcc' >> $GITHUB_ENV
echo 'CXX=g++' >> $GITHUB_ENV echo 'CXX=g++' >> $GITHUB_ENV
- name: Build libbpf
if: matrix.http3 == 'http3' && matrix.compiler == 'clang' && runner.os == 'Linux'
run: |
git clone -b v1.0.1 https://github.com/libbpf/libbpf
cd libbpf
PREFIX=$PWD/build make -C src install
EXTRA_AUTOTOOLS_OPTS="--with-libbpf"
EXTRA_CMAKE_OPTS="-DWITH_LIBBPF=1"
echo 'EXTRA_AUTOTOOLS_OPTS='"$EXTRA_AUTOTOOLS_OPTS" >> $GITHUB_ENV
echo 'EXTRA_CMAKE_OPTS='"$EXTRA_CMAKE_OPTS" >> $GITHUB_ENV
- name: Build quictls/openssl v1.1.1
if: matrix.http3 == 'http3' && matrix.openssl == 'openssl1'
run: |
git clone --depth 1 -b OpenSSL_1_1_1s+quic https://github.com/quictls/openssl
cd openssl
./config --prefix=$PWD/build
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)"
make install_sw
- name: Build quictls/openssl v3.0.x
if: matrix.http3 == 'http3' && matrix.openssl == 'openssl3'
run: |
unset CPPFLAGS
unset LDFLAGS
git clone --depth 1 -b openssl-3.0.7+quic https://github.com/quictls/openssl
cd openssl
./config enable-ktls --prefix=$PWD/build --libdir=$PWD/build/lib
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)"
make install_sw
- name: Build BoringSSL
if: matrix.openssl == 'boringssl'
run: |
git clone https://boringssl.googlesource.com/boringssl
cd boringssl
git checkout 31bad2514d21f6207f3925ba56754611c462a873
mkdir build
cd build
cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON ..
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)"
cd ..
OPENSSL_CFLAGS="-I$PWD/include/"
OPENSSL_LIBS="-L$PWD/build/ssl -lssl -L$PWD/build/crypto -lcrypto -pthread"
EXTRA_NGTCP2_OPTS="$EXTRA_NGTCP2_OPTS --without-openssl --with-boringssl"
EXTRA_AUTOTOOLS_OPTS="$EXTRA_AUTOTOOLS_OPTS --without-neverbleed --without-jemalloc"
echo 'OPENSSL_CFLAGS='"$OPENSSL_CFLAGS" >> $GITHUB_ENV
echo 'OPENSSL_LIBS='"$OPENSSL_LIBS" >> $GITHUB_ENV
echo 'BORINGSSL_CFLAGS='"$OPENSSL_CFLAGS" >> $GITHUB_ENV
echo 'BORINGSSL_LIBS='"$OPENSSL_LIBS" >> $GITHUB_ENV
echo 'EXTRA_NGTCP2_OPTS='"$EXTRA_NGTCP2_OPTS" >> "$GITHUB_ENV"
echo 'EXTRA_AUTOTOOLS_OPTS='"$EXTRA_AUTOTOOLS_OPTS" >> $GITHUB_ENV
- name: Build nghttp3
if: matrix.http3 == 'http3'
run: |
git clone --depth 1 -b v0.8.0 https://github.com/ngtcp2/nghttp3
cd nghttp3
autoreconf -i
./configure --prefix=$PWD/build --enable-lib-only
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)" check
make install
- name: Build ngtcp2
if: matrix.http3 == 'http3'
run: |
git clone --depth 1 -b v0.12.0 https://github.com/ngtcp2/ngtcp2
cd ngtcp2
autoreconf -i
./configure --prefix=$PWD/build --enable-lib-only PKG_CONFIG_PATH="../openssl/build/lib/pkgconfig" $EXTRA_NGTCP2_OPTS
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)" check
make install
- name: Setup extra environment variables for HTTP/3
if: matrix.http3 == 'http3'
run: |
PKG_CONFIG_PATH="$PWD/openssl/build/lib/pkgconfig:$PWD/nghttp3/build/lib/pkgconfig:$PWD/ngtcp2/build/lib/pkgconfig:$PWD/libbpf/build/lib64/pkgconfig:$PKG_CONFIG_PATH"
LDFLAGS="$LDFLAGS -Wl,-rpath,$PWD/openssl/build/lib -Wl,-rpath,$PWD/libbpf/build/lib64"
EXTRA_AUTOTOOLS_OPTS="--enable-http3 $EXTRA_AUTOTOOLS_OPTS"
EXTRA_CMAKE_OPTS="-DENABLE_HTTP3=1 $EXTRA_CMAKE_OPTS"
echo 'PKG_CONFIG_PATH='"$PKG_CONFIG_PATH" >> $GITHUB_ENV
echo 'LDFLAGS='"$LDFLAGS" >> $GITHUB_ENV
echo 'EXTRA_AUTOTOOLS_OPTS='"$EXTRA_AUTOTOOLS_OPTS" >> $GITHUB_ENV
echo 'EXTRA_CMAKE_OPTS='"$EXTRA_CMAKE_OPTS" >> $GITHUB_ENV
- name: Setup git submodules - name: Setup git submodules
run: | run: |
git submodule update --init git submodule update --init
- name: Configure autotools - name: Configure autotools
if: matrix.buildtool == 'autotools'
run: | run: |
autoreconf -i autoreconf -i
./configure ./configure --enable-werror --with-mruby
- name: Configure cmake (Linux) - name: Configure cmake
if: matrix.buildtool == 'cmake' && runner.os == 'Linux' if: matrix.buildtool == 'cmake'
run: | run: |
make dist cmake -DENABLE_WERROR=1 -DWITH_MRUBY=1 -DWITH_NEVERBLEED=1 -DCPPFLAGS="$CPPFLAGS" -DLDFLAGS="$LDFLAGS" .
VERSION=$(grep PACKAGE_VERSION config.h | cut -d' ' -f3 | tr -d '"') - name: Build nghttp2 with autotools
tar xf nghttp2-$VERSION.tar.gz if: matrix.buildtool == 'autotools'
cd nghttp2-$VERSION
echo 'NGHTTP2_CMAKE_DIR='"$PWD" >> $GITHUB_ENV
cmake -DENABLE_WERROR=1 -DWITH_MRUBY=1 -DWITH_NEVERBLEED=1 -DENABLE_APP=1 $EXTRA_CMAKE_OPTS -DCPPFLAGS="$CPPFLAGS" -DLDFLAGS="$LDFLAGS" .
- name: Configure cmake (MacOS)
if: matrix.buildtool == 'cmake' && runner.os == 'macOS'
run: | run: |
make dist make distcheck \
VERSION=$(grep PACKAGE_VERSION config.h | cut -d' ' -f3 | tr -d '"') DISTCHECK_CONFIGURE_FLAGS="--with-mruby --with-neverbleed --enable-werror CPPFLAGS=\"$CPPFLAGS\" LDFLAGS=\"$LDFLAGS\""
tar xf nghttp2-$VERSION.tar.gz
cd nghttp2-$VERSION
echo 'NGHTTP2_CMAKE_DIR='"$PWD" >> $GITHUB_ENV
# This fixes infamous 'stdio.h not found' error.
echo 'SDKROOT='"$(xcrun --sdk macosx --show-sdk-path)" >> $GITHUB_ENV
cmake -DENABLE_WERROR=1 -DWITH_MRUBY=1 -DENABLE_APP=1 $EXTRA_CMAKE_OPTS -DCPPFLAGS="$CPPFLAGS" -DLDFLAGS="$LDFLAGS" .
- name: Build nghttp2 with autotools (Linux)
if: matrix.buildtool == 'autotools' && runner.os == 'Linux'
run: |
make -j"$(nproc)" distcheck \
DISTCHECK_CONFIGURE_FLAGS="--with-mruby --with-neverbleed --with-libev --enable-werror $EXTRA_AUTOTOOLS_OPTS CPPFLAGS=\"$CPPFLAGS\" LDFLAGS=\"$LDFLAGS\""
- name: Build nghttp2 with autotools (MacOS)
if: matrix.buildtool == 'autotools' && runner.os == 'macOS'
run: |
make -j"$(sysctl -n hw.ncpu)" distcheck \
DISTCHECK_CONFIGURE_FLAGS="--with-mruby --with-libev --enable-werror $EXTRA_AUTOTOOLS_OPTS CPPFLAGS=\"$CPPFLAGS\" LDFLAGS=\"$LDFLAGS\""
- name: Build nghttp2 with cmake - name: Build nghttp2 with cmake
if: matrix.buildtool == 'cmake' if: matrix.buildtool == 'cmake'
run: | run: |
cd $NGHTTP2_CMAKE_DIR make
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)" make check
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)" check
- name: Integration test - name: Integration test
# Integration tests for nghttpx; autotools erases build # Integration tests for nghttpx; autotools erases build
# artifacts. # artifacts.
if: matrix.buildtool == 'cmake' if: matrix.buildtool == 'cmake'
run: | run: |
cd $NGHTTP2_CMAKE_DIR/integration-tests cd integration-tests
make itprep it make itprep it
build-cross:
strategy:
matrix:
host: [x86_64-w64-mingw32, i686-w64-mingw32]
runs-on: ubuntu-22.04
env:
HOST: ${{ matrix.host }}
steps:
- uses: actions/checkout@v3
- name: Linux setup
run: |
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install \
gcc-mingw-w64 \
autoconf \
automake \
autotools-dev \
libtool \
pkg-config \
wine
- name: Build CUnit
run: |
curl -LO https://jaist.dl.sourceforge.net/project/cunit/CUnit/2.1-3/CUnit-2.1-3.tar.bz2
tar xf CUnit-2.1-3.tar.bz2
cd CUnit-2.1-3
./bootstrap
./configure --disable-shared --host="$HOST" --prefix="$PWD/build"
make -j$(nproc) install
- name: Configure autotools
run: |
autoreconf -i && \
./configure --enable-werror --enable-lib-only --with-cunit \
--host="$HOST" PKG_CONFIG_PATH="$PWD/CUnit-2.1-3/build/lib/pkgconfig"
- name: Build nghttp2
run: |
make -j$(nproc)
make -j$(nproc) check TESTS=""
- name: Run tests
if: matrix.host == 'x86_64-w64-mingw32'
run: |
cd tests
wine main.exe
build-windows:
runs-on: windows-latest
steps:
- uses: actions/checkout@v3
- name: Configure cmake
run: |
mkdir build
cd build
cmake ..
- name: Build nghttp2
run: |
cmake --build build

4
.gitignore vendored
View File

@ -54,6 +54,4 @@ _VC_ROOT/
.depend.MSVC .depend.MSVC
*.pyd *.pyd
*.egg-info/ *.egg-info/
python/nghttp2.c
release
libnghttp2.lha

89
.travis.yml Normal file
View File

@ -0,0 +1,89 @@
dist: xenial
os:
- linux
compiler:
- clang
- gcc
env:
matrix:
- CI_BUILD=cmake
- CI_BUILD=autotools
matrix:
include:
- os: osx
compiler: clang
osx_image: xcode10.2
env: CI_BUILD=autotools
language: cpp
sudo: required
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- g++-8
- autoconf
- automake
- autotools-dev
- libtool
- pkg-config
- zlib1g-dev
- libcunit1-dev
- libssl-dev
- libxml2-dev
- libev-dev
- libevent-dev
- libjansson-dev
- libjemalloc-dev
- libc-ares-dev
- cmake
- cmake-data
homebrew:
packages:
- libev
- libevent
- c-ares
- cunit
- libressl
before_install:
- $CC --version
- if [ "$CXX" = "g++" ]; then export CXX="g++-8" CC="gcc-8"; fi
- $CC --version
- go version
- cmake --version
before_script:
- |
if [ "$TRAVIS_OS_NAME" = "linux" ]; then
CPPFLAGS="-fsanitize=address" LDFLAGS="-fsanitize=address -fuse-ld=gold"
fi
- |
if [ "$TRAVIS_OS_NAME" = "osx" ]; then
PKG_CONFIG_PATH="/usr/local/opt/libressl/lib/pkgconfig:/usr/local/opt/libxml2/lib/pkgconfig"
fi
# Now build nghttp2
- git submodule update --init
- |
if [ "$CI_BUILD" = "autotools" ]; then
autoreconf -i && ./configure --with-mruby PKG_CONFIG_PATH=$PKG_CONFIG_PATH
fi
- |
if [ "$CI_BUILD" = "cmake" ]; then
cmake -DENABLE_WERROR=1 -DWITH_MRUBY=1 -DWITH_NEVERBLEED=1
fi
script:
- |
if [ "$CI_BUILD" = "autotools" ]; then
make distcheck DISTCHECK_CONFIGURE_FLAGS="--with-mruby --with-neverbleed --enable-werror CPPFLAGS=$CPPFLAGS LDFLAGS=\"$LDFLAGS\" PKG_CONFIG_PATH=$PKG_CONFIG_PATH"
fi
- |
if [ "$CI_BUILD" = "cmake" ]; then
make && make check
fi
- |
if [ "$CI_BUILD" = "cmake" ]; then
# Integration tests for nghttpx; autotools build erases build
# for packaging test.
cd integration-tests
export GO111MODULE=on
make it
fi

21
AUTHORS
View File

@ -19,7 +19,6 @@ Alek Storm
Alex Nalivko Alex Nalivko
Alexandros Konstantinakis-Karmis Alexandros Konstantinakis-Karmis
Alexis La Goutte Alexis La Goutte
Amir Livneh
Amir Pakdel Amir Pakdel
Anders Bakken Anders Bakken
Andreas Pohl Andreas Pohl
@ -28,22 +27,17 @@ Andy Davies
Angus Gratton Angus Gratton
Anna Henningsen Anna Henningsen
Ant Bryan Ant Bryan
Asra Ali
Benedikt Christoph Wolters Benedikt Christoph Wolters
Benjamin Peterson Benjamin Peterson
Bernard Spil Bernard Spil
Brendan Heinonen Brendan Heinonen
Brian Card Brian Card
Brian Suh Brian Suh
Daniel Bevenius
Daniel Evers Daniel Evers
Daniel Stenberg Daniel Stenberg
Dave Reisner Dave Reisner
David Beitey David Beitey
David Korczynski
David Weekly David Weekly
Dimitris Apostolou
Dmitri Tikhonov
Dmitriy Vetutnev Dmitriy Vetutnev
Don Don
Dylan Plecki Dylan Plecki
@ -53,12 +47,9 @@ Fabian Wiesel
Gabi Davar Gabi Davar
Gaël PORTAY Gaël PORTAY
Geoff Hill Geoff Hill
George Liu
Gitai Gitai
Google Inc. Google Inc.
Hajime Fujita
Jacky Tian Jacky Tian
Jacky_Yin
Jacob Champion Jacob Champion
James M Snell James M Snell
Jan Kundrát Jan Kundrát
@ -78,37 +69,28 @@ Kit Chan
Kyle Schomp Kyle Schomp
LazyHamster LazyHamster
Leo Neat Leo Neat
Lorenz Nickel
Lucas Pardue Lucas Pardue
MATSUMOTO Ryosuke MATSUMOTO Ryosuke
Marc Bachmann Marc Bachmann
Marcelo Trylesinski
Matt Rudary Matt Rudary
Matt Way Matt Way
Michael Kaufmann
Mike Conlen Mike Conlen
Mike Frysinger Mike Frysinger
Mike Lothian Mike Lothian
Nicholas Hurley Nicholas Hurley
Nora Shoemaker Nora Shoemaker
Paweł Wegner
Pedro Santos Pedro Santos
Peeyush Aggarwal Peeyush Aggarwal
Peter Wu Peter Wu
Piotr Sikora Piotr Sikora
PufferOverflow
Raul Gutierrez Segales Raul Gutierrez Segales
Remo E Remo E
Renaud
Reza Tavakoli Reza Tavakoli
Richard Wolfert Richard Wolfert
Rick Lei Rick Lei
Ross Smith II Ross Smith II
Rudi Heitbaum
Ryo Ota
Scott Mitchell Scott Mitchell
Sebastiaan Deckers Sebastiaan Deckers
Shelley Vohr
Simon Frankenberger Simon Frankenberger
Simone Basso Simone Basso
Soham Sinha Soham Sinha
@ -122,7 +104,6 @@ Tatsuhiko Kubo
Tatsuhiro Tsujikawa Tatsuhiro Tsujikawa
Tobias Geerinckx-Rice Tobias Geerinckx-Rice
Tom Harwood Tom Harwood
Tomas Krizek
Tomasz Buchert Tomasz Buchert
Tomasz Torcz Tomasz Torcz
Vernon Tang Vernon Tang
@ -143,11 +124,9 @@ es
fangdingjun fangdingjun
jwchoi jwchoi
kumagi kumagi
lhuang04
lstefani lstefani
makovich makovich
mod-h2-dev mod-h2-dev
moparisthebest moparisthebest
robaho
snnn snnn
yuuki-kodama yuuki-kodama

View File

@ -24,13 +24,13 @@
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.51.90) project(nghttp2 VERSION 1.41.90)
# See versioning rule: # See versioning rule:
# https://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 38) set(LT_CURRENT 34)
set(LT_REVISION 1) set(LT_REVISION 0)
set(LT_AGE 24) set(LT_AGE 20)
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH}) set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
include(Version) include(Version)
@ -52,26 +52,15 @@ endif()
include(GNUInstallDirs) include(GNUInstallDirs)
# For documentation # For Python bindings and documentation
find_package(Python3 COMPONENTS Interpreter) # (Must be called before PythonLibs for matching versions.)
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(Libcares 1.7.5)
find_package(ZLIB 1.2.3) find_package(ZLIB 1.2.3)
find_package(Libngtcp2 0.0.0)
find_package(Libngtcp2_crypto_openssl 0.0.0)
if(LIBNGTCP2_CRYPTO_OPENSSL_FOUND)
set(HAVE_LIBNGTCP2_CRYPTO_OPENSSL 1)
endif()
find_package(Libnghttp3 0.0.0)
if(WITH_LIBBPF)
find_package(Libbpf 0.4.0)
if(NOT LIBBPF_FOUND)
message(FATAL_ERROR "libbpf was requested (WITH_LIBBPF=1) but not found.")
endif()
endif()
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)
else() else()
@ -81,8 +70,15 @@ find_package(Systemd 209)
find_package(Jansson 2.5) find_package(Jansson 2.5)
set(ENABLE_HPACK_TOOLS_DEFAULT ${JANSSON_FOUND}) set(ENABLE_HPACK_TOOLS_DEFAULT ${JANSSON_FOUND})
# 2.0.8 is required because we use evconnlistener_set_error_cb() # 2.0.8 is required because we use evconnlistener_set_error_cb()
find_package(Libevent 2.0.8 COMPONENTS core extra openssl) find_package(Libevent 2.0.8 COMPONENTS libevent openssl)
set(ENABLE_EXAMPLES_DEFAULT ${LIBEVENT_OPENSSL_FOUND}) set(ENABLE_EXAMPLES_DEFAULT ${LIBEVENT_OPENSSL_FOUND})
find_package(Cython)
find_package(PythonLibs)
if(CYTHON_FOUND AND PYTHONLIBS_FOUND)
set(ENABLE_PYTHON_BINDINGS_DEFAULT ON)
else()
set(ENABLE_PYTHON_BINDINGS_DEFAULT OFF)
endif()
find_package(LibXml2 2.6.26) find_package(LibXml2 2.6.26)
set(WITH_LIBXML2_DEFAULT ${LIBXML2_FOUND}) set(WITH_LIBXML2_DEFAULT ${LIBXML2_FOUND})
@ -91,7 +87,8 @@ set(WITH_JEMALLOC_DEFAULT ${JEMALLOC_FOUND})
include(CMakeOptions.txt) include(CMakeOptions.txt)
if(ENABLE_LIB_ONLY AND (ENABLE_APP OR ENABLE_HPACK_TOOLS OR ENABLE_EXAMPLES)) if(ENABLE_LIB_ONLY AND (ENABLE_APP OR ENABLE_HPACK_TOOLS OR ENABLE_EXAMPLES OR
ENABLE_PYTHON_BINDINGS))
# Remember when disabled options are disabled for later diagnostics. # Remember when disabled options are disabled for later diagnostics.
set(ENABLE_LIB_ONLY_DISABLED_OTHERS 1) set(ENABLE_LIB_ONLY_DISABLED_OTHERS 1)
else() else()
@ -101,6 +98,7 @@ if(ENABLE_LIB_ONLY)
set(ENABLE_APP OFF) set(ENABLE_APP OFF)
set(ENABLE_HPACK_TOOLS OFF) set(ENABLE_HPACK_TOOLS OFF)
set(ENABLE_EXAMPLES OFF) set(ENABLE_EXAMPLES OFF)
set(ENABLE_PYTHON_BINDINGS OFF)
endif() endif()
# Do not disable assertions based on CMAKE_BUILD_TYPE. # Do not disable assertions based on CMAKE_BUILD_TYPE.
@ -146,6 +144,20 @@ cmake_pop_check_state()
# Additional libraries required for programs under src directory. # Additional libraries required for programs under src directory.
set(APP_LIBRARIES) set(APP_LIBRARIES)
if(ENABLE_PYTHON_BINDINGS)
if(NOT (CYTHON_FOUND AND PYTHONLIBS_FOUND))
message(FATAL_ERROR "python bindings were requested "
"(ENABLE_PYTHON_BINDINGS=1) but dependencies are not met.")
endif()
if(NOT PYTHON_VERSION_STRING STREQUAL PYTHONLIBS_VERSION_STRING)
message(FATAL_ERROR
"Python executable and library must have the same version!"
" Found Python ${PYTHON_VERSION_STRING} and"
" PythonLibs ${PYTHONLIBS_VERSION_STRING}"
)
endif()
endif()
set(CMAKE_THREAD_PREFER_PTHREAD 1) set(CMAKE_THREAD_PREFER_PTHREAD 1)
find_package(Threads) find_package(Threads)
if(CMAKE_USE_PTHREADS_INIT) if(CMAKE_USE_PTHREADS_INIT)
@ -155,7 +167,7 @@ endif()
# case "$host" in # case "$host" in
# *android*) # *android*)
# android_build=yes # android_build=yes
# # android does not need -pthread, but needs following 3 libs for C++ # # android does not need -pthread, but needs followng 3 libs for C++
# APPLDFLAGS="$APPLDFLAGS -lstdc++ -latomic -lsupc++" # APPLDFLAGS="$APPLDFLAGS -lstdc++ -latomic -lsupc++"
# dl: openssl requires libdl when it is statically linked. # dl: openssl requires libdl when it is statically linked.
@ -170,21 +182,9 @@ if(HAVE_CUNIT)
endif() endif()
# openssl (for src) # openssl (for src)
include(CheckSymbolExists)
set(HAVE_OPENSSL ${OPENSSL_FOUND}) set(HAVE_OPENSSL ${OPENSSL_FOUND})
if(OPENSSL_FOUND) if(OPENSSL_FOUND)
set(OPENSSL_INCLUDE_DIRS ${OPENSSL_INCLUDE_DIR}) set(OPENSSL_INCLUDE_DIRS ${OPENSSL_INCLUDE_DIR})
cmake_push_check_state()
set(CMAKE_REQUIRED_INCLUDES "${OPENSSL_INCLUDE_DIR}")
set(CMAKE_REQUIRED_LIBRARIES "${OPENSSL_LIBRARIES}")
if(WIN32)
set(CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}" "ws2_32" "bcrypt")
endif()
check_symbol_exists(SSL_is_quic "openssl/ssl.h" HAVE_SSL_IS_QUIC)
if(NOT HAVE_SSL_IS_QUIC)
message(WARNING "OpenSSL in ${OPENSSL_LIBRARIES} does not have SSL_is_quic. HTTP/3 support cannot be enabled")
endif()
cmake_pop_check_state()
else() else()
set(OPENSSL_INCLUDE_DIRS "") set(OPENSSL_INCLUDE_DIRS "")
set(OPENSSL_LIBRARIES "") set(OPENSSL_LIBRARIES "")
@ -219,18 +219,8 @@ endif()
# jemalloc # jemalloc
set(HAVE_JEMALLOC ${JEMALLOC_FOUND}) set(HAVE_JEMALLOC ${JEMALLOC_FOUND})
# libbpf (for bpf) if(ENABLE_ASIO_LIB)
set(HAVE_LIBBPF ${LIBBPF_FOUND}) find_package(Boost 1.54.0 REQUIRED system thread)
if(LIBBPF_FOUND)
set(BPFCFLAGS -Wall -O2 -g)
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
# For Debian/Ubuntu
set(EXTRABPFCFLAGS -I/usr/include/${CMAKE_SYSTEM_PROCESSOR}-linux-gnu)
endif()
check_c_source_compiles("
#include <linux/bpf.h>
int main() { enum bpf_stats_type foo; (void)foo; }" HAVE_BPF_STATS_TYPE)
endif() endif()
# The nghttp, nghttpd and nghttpx under src depend on zlib, OpenSSL and libev # The nghttp, nghttpd and nghttpx under src depend on zlib, OpenSSL and libev
@ -238,24 +228,18 @@ if(ENABLE_APP AND NOT (ZLIB_FOUND AND OPENSSL_FOUND AND LIBEV_FOUND))
message(FATAL_ERROR "Applications were requested (ENABLE_APP=1) but dependencies are not met.") message(FATAL_ERROR "Applications were requested (ENABLE_APP=1) but dependencies are not met.")
endif() endif()
# HTTP/3 requires quictls/openssl, libngtcp2, libngtcp2_crypto_openssl
# and libnghttp3.
if(ENABLE_HTTP3 AND NOT (HAVE_SSL_IS_QUIC AND LIBNGTCP2_FOUND AND LIBNGTCP2_CRYPTO_OPENSSL_FOUND AND LIBNGHTTP3_FOUND))
message(FATAL_ERROR "HTTP/3 was requested (ENABLE_HTTP3=1) but dependencies are not met.")
endif()
# HPACK tools requires jansson # HPACK tools requires jansson
if(ENABLE_HPACK_TOOLS AND NOT HAVE_JANSSON) if(ENABLE_HPACK_TOOLS AND NOT HAVE_JANSSON)
message(FATAL_ERROR "HPACK tools were requested (ENABLE_HPACK_TOOLS=1) but dependencies are not met.") message(FATAL_ERROR "HPACK tools were requested (ENABLE_HPACK_TOOLS=1) but dependencies are not met.")
endif() endif()
# examples # C++ library libnghttp2_asio
if(ENABLE_EXAMPLES AND NOT (OPENSSL_FOUND AND LIBEVENT_OPENSSL_FOUND)) if(ENABLE_EXAMPLES AND NOT (OPENSSL_FOUND AND LIBEVENT_OPENSSL_FOUND))
message(FATAL_ERROR "examples were requested (ENABLE_EXAMPLES=1) but dependencies are not met.") message(FATAL_ERROR "examples were requested (ENABLE_EXAMPLES=1) but dependencies are not met.")
endif() endif()
# third-party http-parser only be built when needed # third-party http-parser only be built when needed
if(ENABLE_EXAMPLES OR ENABLE_APP OR ENABLE_HPACK_TOOLS) if(ENABLE_EXAMPLES OR ENABLE_APP OR ENABLE_HPACK_TOOLS OR ENABLE_ASIO_LIB)
set(ENABLE_THIRD_PARTY 1) set(ENABLE_THIRD_PARTY 1)
# mruby (for src/nghttpx) # mruby (for src/nghttpx)
set(HAVE_MRUBY ${WITH_MRUBY}) set(HAVE_MRUBY ${WITH_MRUBY})
@ -439,6 +423,8 @@ set(sbindir "${CMAKE_INSTALL_FULL_SBINDIR}")
foreach(name foreach(name
lib/libnghttp2.pc lib/libnghttp2.pc
lib/includes/nghttp2/nghttp2ver.h lib/includes/nghttp2/nghttp2ver.h
src/libnghttp2_asio.pc
python/setup.py
integration-tests/config.go integration-tests/config.go
integration-tests/setenv integration-tests/setenv
doc/conf.py doc/conf.py
@ -449,24 +435,24 @@ foreach(name
doc/tutorial-hpack.rst doc/tutorial-hpack.rst
doc/nghttpx-howto.rst doc/nghttpx-howto.rst
doc/h2load-howto.rst doc/h2load-howto.rst
doc/libnghttp2_asio.rst
doc/python-apiref.rst
doc/building-android-binary.rst doc/building-android-binary.rst
doc/nghttp2.h.rst doc/nghttp2.h.rst
doc/nghttp2ver.h.rst doc/nghttp2ver.h.rst
doc/asio_http2.h.rst
doc/asio_http2_server.h.rst
doc/asio_http2_client.h.rst
doc/contribute.rst doc/contribute.rst
) )
configure_file("${name}.in" "${name}" @ONLY) configure_file("${name}.in" "${name}" @ONLY)
endforeach() endforeach()
if(APPLE)
add_definitions(-D__APPLE_USE_RFC_3542)
endif()
include_directories( include_directories(
"${CMAKE_CURRENT_BINARY_DIR}" # for config.h "${CMAKE_CURRENT_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}")
set(PKGLIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}/${CMAKE_PROJECT_NAME}")
install(FILES README.rst DESTINATION "${CMAKE_INSTALL_DOCDIR}") install(FILES README.rst DESTINATION "${CMAKE_INSTALL_DOCDIR}")
@ -474,16 +460,15 @@ add_subdirectory(lib)
#add_subdirectory(lib/includes) #add_subdirectory(lib/includes)
add_subdirectory(third-party) add_subdirectory(third-party)
add_subdirectory(src) add_subdirectory(src)
#add_subdirectory(src/includes)
add_subdirectory(examples) add_subdirectory(examples)
add_subdirectory(python)
add_subdirectory(tests) add_subdirectory(tests)
#add_subdirectory(tests/testdata) #add_subdirectory(tests/testdata)
add_subdirectory(integration-tests) add_subdirectory(integration-tests)
if(ENABLE_DOC) add_subdirectory(doc)
add_subdirectory(doc)
endif()
add_subdirectory(contrib) add_subdirectory(contrib)
add_subdirectory(script) add_subdirectory(script)
add_subdirectory(bpf)
string(TOUPPER "${CMAKE_BUILD_TYPE}" _build_type) string(TOUPPER "${CMAKE_BUILD_TYPE}" _build_type)
@ -502,8 +487,10 @@ message(STATUS "summary of build options:
WARNCFLAGS: ${WARNCFLAGS} WARNCFLAGS: ${WARNCFLAGS}
CXX1XCXXFLAGS: ${CXX1XCXXFLAGS} CXX1XCXXFLAGS: ${CXX1XCXXFLAGS}
Python: Python:
Python: ${Python3_EXECUTABLE} Python: ${PYTHON_EXECUTABLE}
Python3_VERSION: ${Python3_VERSION} PYTHON_VERSION: ${PYTHON_VERSION_STRING}
Library version:${PYTHONLIBS_VERSION_STRING}
Cython: ${CYTHON_EXECUTABLE}
Test: Test:
CUnit: ${HAVE_CUNIT} (LIBS='${CUNIT_LIBRARIES}') CUnit: ${HAVE_CUNIT} (LIBS='${CUNIT_LIBRARIES}')
Failmalloc: ${ENABLE_FAILMALLOC} Failmalloc: ${ENABLE_FAILMALLOC}
@ -512,15 +499,13 @@ message(STATUS "summary of build options:
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}') Libc-ares: ${HAVE_LIBCARES} (LIBS='${LIBCARES_LIBRARIES}')
Libngtcp2: ${HAVE_LIBNGTCP2} (LIBS='${LIBNGTCP2_LIBRARIES}')
Libngtcp2_crypto_openssl: ${HAVE_LIBNGTCP2_CRYPTO_OPENSSL} (LIBS='${LIBNGTCP2_CRYPTO_OPENSSL_LIBRARIES}')
Libnghttp3: ${HAVE_LIBNGHTTP3} (LIBS='${LIBNGHTTP3_LIBRARIES}')
Libbpf: ${HAVE_LIBBPF} (LIBS='${LIBBPF_LIBRARIES}')
Libevent(SSL): ${HAVE_LIBEVENT_OPENSSL} (LIBS='${LIBEVENT_OPENSSL_LIBRARIES}') Libevent(SSL): ${HAVE_LIBEVENT_OPENSSL} (LIBS='${LIBEVENT_OPENSSL_LIBRARIES}')
Jansson: ${HAVE_JANSSON} (LIBS='${JANSSON_LIBRARIES}') Jansson: ${HAVE_JANSSON} (LIBS='${JANSSON_LIBRARIES}')
Jemalloc: ${HAVE_JEMALLOC} (LIBS='${JEMALLOC_LIBRARIES}') Jemalloc: ${HAVE_JEMALLOC} (LIBS='${JEMALLOC_LIBRARIES}')
Zlib: ${HAVE_ZLIB} (LIBS='${ZLIB_LIBRARIES}') Zlib: ${HAVE_ZLIB} (LIBS='${ZLIB_LIBRARIES}')
Systemd: ${HAVE_SYSTEMD} (LIBS='${SYSTEMD_LIBRARIES}') Systemd: ${HAVE_SYSTEMD} (LIBS='${SYSTEMD_LIBRARIES}')
Boost::System: ${Boost_SYSTEM_LIBRARY}
Boost::Thread: ${Boost_THREAD_LIBRARY}
Third-party: Third-party:
http-parser: ${ENABLE_THIRD_PARTY} http-parser: ${ENABLE_THIRD_PARTY}
MRuby: ${HAVE_MRUBY} MRuby: ${HAVE_MRUBY}
@ -528,9 +513,10 @@ message(STATUS "summary of build options:
Features: Features:
Applications: ${ENABLE_APP} Applications: ${ENABLE_APP}
HPACK tools: ${ENABLE_HPACK_TOOLS} HPACK tools: ${ENABLE_HPACK_TOOLS}
Libnghttp2_asio:${ENABLE_ASIO_LIB}
Examples: ${ENABLE_EXAMPLES} Examples: ${ENABLE_EXAMPLES}
Python bindings:${ENABLE_PYTHON_BINDINGS}
Threading: ${ENABLE_THREADS} Threading: ${ENABLE_THREADS}
HTTP/3(EXPERIMENTAL): ${ENABLE_HTTP3}
") ")
if(ENABLE_LIB_ONLY_DISABLED_OTHERS) if(ENABLE_LIB_ONLY_DISABLED_OTHERS)
message("Only the library will be built. To build other components " message("Only the library will be built. To build other components "

View File

@ -7,22 +7,24 @@ option(ENABLE_APP "Build applications (nghttp, nghttpd, nghttpx and h2load
${ENABLE_APP_DEFAULT}) ${ENABLE_APP_DEFAULT})
option(ENABLE_HPACK_TOOLS "Build HPACK tools" option(ENABLE_HPACK_TOOLS "Build HPACK tools"
${ENABLE_HPACK_TOOLS_DEFAULT}) ${ENABLE_HPACK_TOOLS_DEFAULT})
option(ENABLE_ASIO_LIB "Build C++ libnghttp2_asio library")
option(ENABLE_EXAMPLES "Build examples" option(ENABLE_EXAMPLES "Build examples"
${ENABLE_EXAMPLES_DEFAULT}) ${ENABLE_EXAMPLES_DEFAULT})
option(ENABLE_PYTHON_BINDINGS "Build Python bindings"
${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") 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_STATIC_LIB "Build libnghttp2 in static mode also")
option(ENABLE_SHARED_LIB "Build libnghttp2 as a shared library" ON) option(ENABLE_SHARED_LIB "Build libnghttp2 as a shared library" ON)
option(ENABLE_STATIC_CRT "Build libnghttp2 against the MS LIBCMT[d]") option(ENABLE_STATIC_CRT "Build libnghttp2 against the MS LIBCMT[d]")
option(ENABLE_HTTP3 "Enable HTTP/3 support" OFF)
option(ENABLE_DOC "Build documentation" ON)
option(WITH_LIBXML2 "Use libxml2" option(WITH_LIBXML2 "Use libxml2"
${WITH_LIBXML2_DEFAULT}) ${WITH_LIBXML2_DEFAULT})
option(WITH_JEMALLOC "Use jemalloc" option(WITH_JEMALLOC "Use jemalloc"
${WITH_JEMALLOC_DEFAULT}) ${WITH_JEMALLOC_DEFAULT})
option(WITH_SPDYLAY "Use spdylay"
${WITH_SPDYLAY_DEFAULT})
option(WITH_MRUBY "Use mruby") option(WITH_MRUBY "Use mruby")
option(WITH_NEVERBLEED "Use neverbleed") option(WITH_NEVERBLEED "Use neverbleed")
option(WITH_LIBBPF "Use libbpf")
# vim: ft=cmake: # vim: ft=cmake:

View File

@ -12,41 +12,59 @@
# Only use standalone-toolchain for reduce size # Only use standalone-toolchain for reduce size
FROM ubuntu:22.04 FROM ubuntu:xenial
MAINTAINER Tatsuhiro Tsujikawa MAINTAINER Tatsuhiro Tsujikawa
ENV ANDROID_HOME /root
ENV TOOLCHAIN $ANDROID_HOME/toolchain
ENV PATH $TOOLCHAIN/bin:$PATH
ENV NDK_VERSION r25b ENV NDK_VERSION r14b
ENV NDK /root/android-ndk-$NDK_VERSION
ENV TOOLCHAIN $NDK/toolchains/llvm/prebuilt/linux-x86_64
ENV TARGET aarch64-linux-android
ENV API 33
ENV AR $TOOLCHAIN/bin/llvm-ar
ENV CC $TOOLCHAIN/bin/$TARGET$API-clang
ENV CXX $TOOLCHAIN/bin/$TARGET$API-clang++
ENV LD $TOOLCHAIN/bin/ld
ENV RANDLIB $TOOLCHAIN/bin/llvm-ranlib
ENV STRIP $TOOLCHAIN/bin/llvm-strip
ENV PREFIX /root/usr/local
WORKDIR /root WORKDIR /root
RUN apt-get update && \ RUN apt-get update && \
apt-get install -y unzip make binutils autoconf \ apt-get install -y unzip make binutils autoconf \
automake autotools-dev libtool pkg-config git \ automake autotools-dev libtool pkg-config git \
curl dpkg-dev libxml2-dev genisoimage libc6-i386 \ curl dpkg-dev libxml2-dev genisoimage libc6-i386 \
lib32stdc++6 && \ lib32stdc++6 python&& \
rm -rf /var/cache/apt/* rm -rf /var/cache/apk/*
# Download NDK # Install toolchain
RUN curl -L -O https://dl.google.com/android/repository/android-ndk-$NDK_VERSION-linux.zip && \ 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.zip && \ unzip -q android-ndk-$NDK_VERSION-linux-x86_64.zip && \
rm android-ndk-$NDK_VERSION-linux.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 # Setup version of libraries
ENV OPENSSL_VERSION 1.1.1q ENV OPENSSL_VERSION 1.0.2d
ENV LIBEV_VERSION 4.33 ENV SPDYLAY_VERSION v1.4.0
ENV ZLIB_VERSION 1.2.13 ENV LIBEV_VERSION 4.19
ENV CARES_VERSION 1.18.1 ENV ZLIB_VERSION 1.2.8
ENV NGHTTP2_VERSION master ENV CARES_VERSION 1.13.0
ENV NGHTTP2_VERSION v1.24.0
WORKDIR /root/build
RUN git clone https://github.com/tatsuhiro-t/spdylay -b $SPDYLAY_VERSION --depth 1
WORKDIR /root/build/spdylay
RUN autoreconf -i && \
./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" && \
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-$OPENSSL_VERSION.tar.gz && \
@ -54,18 +72,20 @@ RUN curl -L -O https://www.openssl.org/source/openssl-$OPENSSL_VERSION.tar.gz &&
rm openssl-$OPENSSL_VERSION.tar.gz rm openssl-$OPENSSL_VERSION.tar.gz
WORKDIR /root/build/openssl-$OPENSSL_VERSION WORKDIR /root/build/openssl-$OPENSSL_VERSION
RUN export ANDROID_NDK_HOME=$NDK PATH=$TOOLCHAIN/bin:$PATH && \ RUN export CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi- && \
./Configure no-shared --prefix=$PREFIX android-arm64 && \ ./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/Attic/libev-$LIBEV_VERSION.tar.gz && \
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-$LIBEV_VERSION.tar.gz && \
rm libev-$LIBEV_VERSION.tar.gz rm libev-$LIBEV_VERSION.tar.gz
WORKDIR /root/build/libev-$LIBEV_VERSION WORKDIR /root/build/libev-$LIBEV_VERSION
RUN ./configure \ RUN patch -p1 < ../libev-4.19-android.patch && \
--host=$TARGET \ ./configure \
--host=arm-linux-androideabi \
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \ --build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
--prefix=$PREFIX \ --prefix=$PREFIX \
--disable-shared \ --disable-shared \
@ -75,12 +95,17 @@ RUN ./configure \
make install make install
WORKDIR /root/build WORKDIR /root/build
RUN curl -L -O https://zlib.net/zlib-$ZLIB_VERSION.tar.gz && \ RUN curl -L -O https://downloads.sourceforge.net/project/libpng/zlib/$ZLIB_VERSION/zlib-$ZLIB_VERSION.tar.gz && \
tar xf zlib-$ZLIB_VERSION.tar.gz && \ tar xf zlib-$ZLIB_VERSION.tar.gz && \
rm zlib-$ZLIB_VERSION.tar.gz rm zlib-$ZLIB_VERSION.tar.gz
WORKDIR /root/build/zlib-$ZLIB_VERSION WORKDIR /root/build/zlib-$ZLIB_VERSION
RUN HOST=$TARGET \ RUN HOST=arm-linux-androideabi \
CC=$HOST-gcc \
AR=$HOST-ar \
LD=$HOST-ld \
RANLIB=$HOST-ranlib \
STRIP=$HOST-strip \
./configure \ ./configure \
--prefix=$PREFIX \ --prefix=$PREFIX \
--libdir=$PREFIX/lib \ --libdir=$PREFIX/lib \
@ -96,7 +121,7 @@ RUN curl -L -O https://c-ares.haxx.se/download/c-ares-$CARES_VERSION.tar.gz && \
WORKDIR /root/build/c-ares-$CARES_VERSION WORKDIR /root/build/c-ares-$CARES_VERSION
RUN ./configure \ RUN ./configure \
--host=$TARGET \ --host=arm-linux-androideabi \
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \ --build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
--prefix=$PREFIX \ --prefix=$PREFIX \
--disable-shared && \ --disable-shared && \
@ -109,13 +134,17 @@ RUN autoreconf -i && \
./configure \ ./configure \
--enable-app \ --enable-app \
--disable-shared \ --disable-shared \
--host=$TARGET \ --host=arm-linux-androideabi \
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \ --build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
--with-xml-prefix="$PREFIX" \
--without-libxml2 \ --without-libxml2 \
--disable-python-bindings \
--disable-examples \ --disable-examples \
--disable-threads \ --disable-threads \
CC="$TOOLCHAIN"/bin/arm-linux-androideabi-clang \
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" && \
make && \ make && \
$STRIP src/nghttpx src/nghttpd src/nghttp arm-linux-androideabi-strip src/nghttpx src/nghttpd src/nghttp

View File

@ -20,14 +20,19 @@
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
SUBDIRS = lib third-party src bpf examples tests integration-tests \ SUBDIRS = lib third-party src examples python tests integration-tests \
doc contrib script doc contrib script
# Now with python setuptools, make uninstall will leave many files we
# cannot easily remove (e.g., easy-install.pth). Disable it for
# distcheck rule.
AM_DISTCHECK_CONFIGURE_FLAGS = --disable-python-bindings
ACLOCAL_AMFLAGS = -I m4 ACLOCAL_AMFLAGS = -I m4
dist_doc_DATA = README.rst dist_doc_DATA = README.rst
EXTRA_DIST = nghttpx.conf.sample proxy.pac.sample android-config android-env \ EXTRA_DIST = nghttpx.conf.sample proxy.pac.sample android-config android-make \
Dockerfile.android \ Dockerfile.android \
cmakeconfig.h.in \ cmakeconfig.h.in \
CMakeLists.txt \ CMakeLists.txt \
@ -37,23 +42,20 @@ EXTRA_DIST = nghttpx.conf.sample proxy.pac.sample android-config android-env \
cmake/FindLibev.cmake \ cmake/FindLibev.cmake \
cmake/FindCUnit.cmake \ cmake/FindCUnit.cmake \
cmake/Version.cmake \ cmake/Version.cmake \
cmake/FindCython.cmake \
cmake/FindLibevent.cmake \ cmake/FindLibevent.cmake \
cmake/FindJansson.cmake \ cmake/FindJansson.cmake \
cmake/FindLibcares.cmake \ cmake/FindLibcares.cmake \
cmake/FindSystemd.cmake \ cmake/FindSystemd.cmake
cmake/FindLibbpf.cmake \
cmake/FindLibnghttp3.cmake \
cmake/FindLibngtcp2.cmake \
cmake/FindLibngtcp2_crypto_openssl.cmake
.PHONY: clang-format .PHONY: clang-format
# Format source files using clang-format. Don't format source files # Format source files using clang-format. Don't format source files
# under third-party directory since we are not responsible for their # under third-party directory since we are not responsible for thier
# coding style. # coding style.
clang-format: clang-format:
CLANGFORMAT=`git config --get clangformat.binary`; \ CLANGFORMAT=`git config --get clangformat.binary`; \
test -z $${CLANGFORMAT} && CLANGFORMAT="clang-format"; \ test -z $${CLANGFORMAT} && CLANGFORMAT="clang-format"; \
$${CLANGFORMAT} -i lib/*.{c,h} lib/includes/nghttp2/*.h \ $${CLANGFORMAT} -i lib/*.{c,h} lib/includes/nghttp2/*.h \
src/*.{c,cc,h} examples/*.{c,cc} \ src/*.{c,cc,h} src/includes/nghttp2/*.h examples/*.{c,cc} \
tests/*.{c,h} bpf/*.c fuzz/*.cc tests/*.{c,h}

View File

@ -1,36 +0,0 @@
USE_CLIB2=YES
ifeq ($(USE_CLIB2), YES)
LIBC=clib2
else
LIBC=newlib
endif
all: build
init:
git submodule update --init
autoreconf -i
automake
autoconf
build: init
CC="ppc-amigaos-gcc" CFLAGS="-mcrt=${LIBC} -fPIC" LDFLAGS="-mcrt=${LIBC}" CXXFLAGS="-mcrt=${LIBC} -fPIC" ./configure --host=ppc-amigaos && \
make -j$(shell nproc)
clean:
make -f Makefile clean
rm -rf autom4te.cache
rm compile config.guess config.h config.h.in config.log config.status config.sub configure depcomp install-sh libtool ltmain.sh missing stamp-h1 test-driver INSTALL Makefile Makefile.in *.m4
release:
mkdir -p release/local/common/include/nghttp2
mkdir -p release/local/clib2/lib
mkdir -p release/local/newlib/lib
make -f Makefile.os4 USE_CLIB2=YES
cp ./lib/.libs/libnghttp2.a ./lib/.libs/libnghttp2.la release/local/clib2/lib/
cp ./lib/includes/nghttp2/* release/local/common/include/nghttp2/
make -f Makefile.os4 clean
make -f Makefile.os4 USE_CLIB2=NO
cp ./lib/.libs/libnghttp2.a ./lib/.libs/libnghttp2.la ./lib/.libs/libnghttp2.so release/local/newlib/lib/
lha -aeq libnghttp2.lha release/

View File

@ -11,14 +11,17 @@ HTTP/2.
An HPACK encoder and decoder are available as a public API. An HPACK encoder and decoder are available as a public API.
An experimental high level C++ library is also available.
We have Python bindings of this library, but we do not have full
code coverage yet.
Development Status Development Status
------------------ ------------------
nghttp2 was originally developed based on `RFC 7540 We have implemented `RFC 7540 <https://tools.ietf.org/html/rfc7540>`_
<https://tools.ietf.org/html/rfc7540>`_ HTTP/2 and `RFC 7541 HTTP/2 and `RFC 7541 <https://tools.ietf.org/html/rfc7541>`_ HPACK -
<https://tools.ietf.org/html/rfc7541>`_ HPACK - Header Compression for Header Compression for HTTP/2
HTTP/2. Now we are updating our code to implement `RFC 9113
<https://datatracker.ietf.org/doc/html/rfc9113>`_.
The nghttp2 code base was forked from the spdylay The nghttp2 code base was forked from the spdylay
(https://github.com/tatsuhiro-t/spdylay) project. (https://github.com/tatsuhiro-t/spdylay) project.
@ -29,14 +32,12 @@ Public Test Server
The following endpoints are available to try out our nghttp2 The following endpoints are available to try out our nghttp2
implementation. implementation.
* https://nghttp2.org/ (TLS + ALPN/NPN and HTTP/3) * https://nghttp2.org/ (TLS + ALPN/NPN)
This endpoint supports ``h2``, ``h2-16``, ``h2-14``, and This endpoint supports ``h2``, ``h2-16``, ``h2-14``, and
``http/1.1`` via ALPN/NPN and requires TLSv1.2 for HTTP/2 ``http/1.1`` via ALPN/NPN and requires TLSv1.2 for HTTP/2
connection. connection.
It also supports HTTP/3.
* http://nghttp2.org/ (HTTP Upgrade and HTTP/2 Direct) * http://nghttp2.org/ (HTTP Upgrade and HTTP/2 Direct)
``h2c`` and ``http/1.1``. ``h2c`` and ``http/1.1``.
@ -103,6 +104,27 @@ To mitigate heap fragmentation in long running server programs
Alpine Linux currently does not support malloc replacement Alpine Linux currently does not support malloc replacement
due to musl limitations. See details in issue `#762 <https://github.com/nghttp2/nghttp2/issues/762>`_. due to musl limitations. See details in issue `#762 <https://github.com/nghttp2/nghttp2/issues/762>`_.
libnghttp2_asio C++ library requires the following packages:
* libboost-dev >= 1.54.0
* libboost-thread-dev >= 1.54.0
The Python bindings require the following packages:
* cython >= 0.19
* python >= 2.7
* python-setuptools
If you are using Ubuntu 16.04 LTS (Xenial Xerus) or Debian 8 (jessie)
and above, run the following to install the required packages:
.. code-block:: text
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 \
libc-ares-dev libjemalloc-dev libsystemd-dev \
cython python3-dev python-setuptools
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
mruby with C++ ABI explicitly turned on, and probably need other mruby with C++ ABI explicitly turned on, and probably need other
@ -123,33 +145,6 @@ 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.
To enable the experimental HTTP/3 support for h2load and nghttpx, the
following libraries are required:
* `OpenSSL with QUIC support
<https://github.com/quictls/openssl/tree/OpenSSL_1_1_1s+quic>`_; or
`BoringSSL <https://boringssl.googlesource.com/boringssl/>`_ (commit
31bad2514d21f6207f3925ba56754611c462a873)
* `ngtcp2 <https://github.com/ngtcp2/ngtcp2>`_ >= 0.10.0
* `nghttp3 <https://github.com/ngtcp2/nghttp3>`_ >= 0.7.0
Use ``--enable-http3`` configure option to enable HTTP/3 feature for
h2load and nghttpx.
In order to build optional eBPF program to direct an incoming QUIC UDP
datagram to a correct socket for nghttpx, the following libraries are
required:
* libbpf-dev >= 0.7.0
Use ``--with-libbpf`` configure option to build eBPF program.
libelf-dev is needed to build libbpf.
For Ubuntu 20.04, you can build libbpf from `the source code
<https://github.com/libbpf/libbpf/releases/tag/v1.0.1>`_. nghttpx
requires eBPF program for reloading its configuration and hot swapping
its executable.
Compiling libnghttp2 C source code requires a C99 compiler. gcc 4.8 Compiling libnghttp2 C source code requires a C99 compiler. gcc 4.8
is known to be adequate. In order to compile the C++ source code, gcc is known to be adequate. In order to compile the C++ source code, gcc
>= 6.0 or clang >= 6.0 is required. C++ source code requires C++14 >= 6.0 or clang >= 6.0 is required. C++ source code requires C++14
@ -200,18 +195,6 @@ language features.
responsible to specify the correct values to these variables. For responsible to specify the correct values to these variables. For
complete list of these variables, run ``./configure -h``. complete list of these variables, run ``./configure -h``.
If you are using Ubuntu 22.04 LTS, run the following to install the
required packages:
.. code-block:: text
sudo apt-get install g++ clang make binutils autoconf automake \
autotools-dev libtool pkg-config \
zlib1g-dev libcunit1-dev libssl-dev libxml2-dev libev-dev \
libevent-dev libjansson-dev \
libc-ares-dev libjemalloc-dev libsystemd-dev \
ruby-dev bison libelf-dev
Building nghttp2 from release tar archive Building nghttp2 from release tar archive
----------------------------------------- -----------------------------------------
@ -324,87 +307,6 @@ The generated documents will not be installed with ``make install``.
The online documentation is available at The online documentation is available at
https://nghttp2.org/documentation/ https://nghttp2.org/documentation/
Build HTTP/3 enabled h2load and nghttpx
---------------------------------------
To build h2load and nghttpx with HTTP/3 feature enabled, run the
configure script with ``--enable-http3``.
For nghttpx to reload configurations and swapping its executable while
gracefully terminating old worker processes, eBPF is required. Run
the configure script with ``--enable-http3 --with-libbpf`` to build
eBPF program. The QUIC keying material must be set with
``--frontend-quic-secret-file`` in order to keep the existing
connections alive during reload.
The detailed steps to build HTTP/3 enabled h2load and nghttpx follow.
Build custom OpenSSL:
.. code-block:: text
$ git clone --depth 1 -b OpenSSL_1_1_1s+quic https://github.com/quictls/openssl
$ cd openssl
$ ./config --prefix=$PWD/build --openssldir=/etc/ssl
$ make -j$(nproc)
$ make install_sw
$ cd ..
Build nghttp3:
.. code-block:: text
$ git clone --depth 1 -b v0.8.0 https://github.com/ngtcp2/nghttp3
$ cd nghttp3
$ autoreconf -i
$ ./configure --prefix=$PWD/build --enable-lib-only
$ make -j$(nproc)
$ make install
$ cd ..
Build ngtcp2:
.. code-block:: text
$ git clone --depth 1 -b v0.12.0 https://github.com/ngtcp2/ngtcp2
$ cd ngtcp2
$ autoreconf -i
$ ./configure --prefix=$PWD/build --enable-lib-only \
PKG_CONFIG_PATH="$PWD/../openssl/build/lib/pkgconfig"
$ make -j$(nproc)
$ make install
$ cd ..
If your Linux distribution does not have libbpf-dev >= 0.7.0, build
from source:
.. code-block:: text
$ git clone --depth 1 -b v1.0.1 https://github.com/libbpf/libbpf
$ cd libbpf
$ PREFIX=$PWD/build make -C src install
$ cd ..
Build nghttp2:
.. code-block:: text
$ git clone https://github.com/nghttp2/nghttp2
$ cd nghttp2
$ git submodule update --init
$ autoreconf -i
$ ./configure --with-mruby --with-neverbleed --enable-http3 --with-libbpf \
CC=clang-14 CXX=clang++-14 \
PKG_CONFIG_PATH="$PWD/../openssl/build/lib/pkgconfig:$PWD/../nghttp3/build/lib/pkgconfig:$PWD/../ngtcp2/build/lib/pkgconfig:$PWD/../libbpf/build/lib64/pkgconfig" \
LDFLAGS="$LDFLAGS -Wl,-rpath,$PWD/../openssl/build/lib -Wl,-rpath,$PWD/../libbpf/build/lib64"
$ make -j$(nproc)
The eBPF program ``reuseport_kern.o`` should be found under bpf
directory. Pass ``--quic-bpf-program-file=bpf/reuseport_kern.o``
option to nghttpx to load it. See also `HTTP/3 section in nghttpx -
HTTP/2 proxy - HOW-TO
<https://nghttp2.org/documentation/nghttpx-howto.html#http-3>`_.
Unit tests Unit tests
---------- ----------
@ -832,7 +734,7 @@ information. Here is sample output from ``nghttpd``:
nghttpx - proxy nghttpx - proxy
+++++++++++++++ +++++++++++++++
``nghttpx`` is a multi-threaded reverse proxy for HTTP/3, HTTP/2, and ``nghttpx`` is a multi-threaded reverse proxy for HTTP/2, 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.
@ -853,16 +755,16 @@ 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/3, HTTP/2, HTTP/1.1 HTTP/1.1, HTTP/2 Reverse proxy default mode HTTP/2, HTTP/1.1 HTTP/1.1, HTTP/2 Reverse proxy
``--http2-proxy`` HTTP/3, HTTP/2, HTTP/1.1 HTTP/1.1, HTTP/2 Forward proxy ``--http2-proxy`` HTTP/2, 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/3, HTTP/2, and HTTP/1.1 and can a reverse proxy and listens for HTTP/2, and HTTP/1.1 and can be
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
@ -880,7 +782,7 @@ server:
.. code-block:: text .. code-block:: text
Client <-- (HTTP/3, HTTP/2, HTTP/1.1) --> nghttpx <-- (HTTP/1.1, HTTP/2) --> Web Server Client <-- (HTTP/2, 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
@ -888,7 +790,7 @@ is so called secure HTTP/2 proxy:
.. code-block:: text .. code-block:: text
Client <-- (HTTP/3, HTTP/2, HTTP/1.1) --> nghttpx <-- (HTTP/1.1) --> Proxy Client <-- (HTTP/2, 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
@ -921,7 +823,7 @@ proxy through an HTTP proxy:
.. code-block:: text .. code-block:: text
Client <-- (HTTP/3, HTTP/2, HTTP/1.1) --> nghttpx <-- (HTTP/2) -- Client <-- (HTTP/2, 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)
@ -929,8 +831,8 @@ proxy through an HTTP proxy:
Benchmarking tool Benchmarking tool
----------------- -----------------
The ``h2load`` program is a benchmarking tool for HTTP/3, HTTP/2, and The ``h2load`` program is a benchmarking tool for HTTP/2. The UI of
HTTP/1.1. The UI of ``h2load`` is heavily inspired by ``weighttp`` ``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:
@ -973,14 +875,6 @@ threads to avoid saturating a single core on client side.
considered a DOS attack. Please only use it against your private considered a DOS attack. Please only use it against your private
servers. servers.
If the experimental HTTP/3 is enabled, h2load can send requests to
HTTP/3 server. To do this, specify ``h3`` to ``--npn-list`` option
like so:
.. code-block:: text
$ h2load --npn-list h3 https://127.0.0.1:4433
HPACK tools HPACK tools
----------- -----------
@ -1418,6 +1312,219 @@ associated value includes the state of the dynamic header table after the
corresponding header set was processed. The format is the same as corresponding header set was processed. The format is the same as
``deflatehd``. ``deflatehd``.
libnghttp2_asio: High level HTTP/2 C++ library
----------------------------------------------
libnghttp2_asio is C++ library built on top of libnghttp2 and provides
high level abstraction API to build HTTP/2 applications. It depends
on the Boost::ASIO library and OpenSSL. Currently libnghttp2_asio
provides both client and server APIs.
libnghttp2_asio is not built by default. Use the ``--enable-asio-lib``
configure flag to build libnghttp2_asio. The required Boost libraries
are:
* Boost::Asio
* Boost::System
* Boost::Thread
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
an HTTP/2 server looks like this:
.. code-block:: cpp
#include <iostream>
#include <nghttp2/asio_http2_server.h>
using namespace nghttp2::asio_http2;
using namespace nghttp2::asio_http2::server;
int main(int argc, char *argv[]) {
boost::system::error_code ec;
http2 server;
server.handle("/", [](const request &req, const response &res) {
res.write_head(200);
res.end("hello, world\n");
});
if (server.listen_and_serve(ec, "localhost", "3000")) {
std::cerr << "error: " << ec.message() << std::endl;
}
}
Here is sample code to use the client API:
.. code-block:: cpp
#include <iostream>
#include <nghttp2/asio_http2_client.h>
using boost::asio::ip::tcp;
using namespace nghttp2::asio_http2;
using namespace nghttp2::asio_http2::client;
int main(int argc, char *argv[]) {
boost::system::error_code ec;
boost::asio::io_service io_service;
// connect to localhost:3000
session sess(io_service, "localhost", "3000");
sess.on_connect([&sess](tcp::resolver::iterator endpoint_it) {
boost::system::error_code ec;
auto req = sess.submit(ec, "GET", "http://localhost:3000/");
req->on_response([](const response &res) {
// print status code and response header fields.
std::cerr << "HTTP/2 " << res.status_code() << std::endl;
for (auto &kv : res.header()) {
std::cerr << kv.first << ": " << kv.second.value << "\n";
}
std::cerr << std::endl;
res.on_data([](const uint8_t *data, std::size_t len) {
std::cerr.write(reinterpret_cast<const char *>(data), len);
std::cerr << std::endl;
});
});
req->on_close([&sess](uint32_t error_code) {
// shutdown session after first request was done.
sess.shutdown();
});
});
sess.on_error([](const boost::system::error_code &ec) {
std::cerr << "error: " << ec.message() << std::endl;
});
io_service.run();
}
For more details, see the documentation of libnghttp2_asio.
Python bindings
---------------
The ``python`` directory contains nghttp2 Python bindings. The
bindings currently provide HPACK compressor and decompressor classes
and an HTTP/2 server.
The extension module is called ``nghttp2``.
``make`` will build the bindings and target Python version is
determined by the ``configure`` script. If the detected Python version is not
what you expect, specify a path to Python executable in a ``PYTHON``
variable as an argument to configure script (e.g., ``./configure
PYTHON=/usr/bin/python3.5``).
The following example code illustrates basic usage of the HPACK compressor
and decompressor in Python:
.. code-block:: python
import binascii
import nghttp2
deflater = nghttp2.HDDeflater()
inflater = nghttp2.HDInflater()
data = deflater.deflate([(b'foo', b'bar'),
(b'baz', b'buz')])
print(binascii.b2a_hex(data))
hdrs = inflater.inflate(data)
print(hdrs)
The ``nghttp2.HTTP2Server`` class builds on top of the asyncio event
loop. On construction, *RequestHandlerClass* must be given, which
must be a subclass of ``nghttp2.BaseRequestHandler`` class.
The ``BaseRequestHandler`` class is used to handle the HTTP/2 stream.
By default, it does nothing. It must be subclassed to handle each
event callback method.
The first callback method invoked is ``on_headers()``. It is called
when HEADERS frame, which includes the request header fields, has arrived.
If the request has a request body, ``on_data(data)`` is invoked for each
chunk of received data.
Once the entire request is received, ``on_request_done()`` is invoked.
When the stream is closed, ``on_close(error_code)`` is called.
The application can send a response using ``send_response()`` method.
It can be used in ``on_headers()``, ``on_data()`` or
``on_request_done()``.
The application can push resources using the ``push()`` method. It must be
used before the ``send_response()`` call.
The following instance variables are available:
client_address
Contains a tuple of the form (host, port) referring to the
client's address.
stream_id
Stream ID of this stream.
scheme
Scheme of the request URI. This is a value of :scheme header
field.
method
Method of this stream. This is a value of :method header field.
host
This is a value of :authority or host header field.
path
This is a value of :path header field.
The following example illustrates the HTTP2Server and
BaseRequestHandler usage:
.. code-block:: python
#!/usr/bin/env python
import io, ssl
import nghttp2
class Handler(nghttp2.BaseRequestHandler):
def on_headers(self):
self.push(path='/css/bootstrap.css',
request_headers = [('content-length', '3')],
status=200,
body='foo')
self.push(path='/js/bootstrap.js',
method='GET',
request_headers = [('content-length', '10')],
status=200,
body='foobarbuzz')
self.send_response(status=200,
headers = [('content-type', 'text/plain')],
body=io.BytesIO(b'nghttp2-python FTW'))
ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
ctx.options = ssl.OP_ALL | ssl.OP_NO_SSLv2
ctx.load_cert_chain('server.crt', 'server.key')
# give None to ssl to make the server non-SSL/TLS
server = nghttp2.HTTP2Server(('127.0.0.1', 8443), Handler, ssl=ctx)
server.serve_forever()
Contribution Contribution
------------ ------------

View File

@ -23,15 +23,25 @@
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
. ./android-env 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 \ ./configure \
--disable-shared \ --disable-shared \
--host=$TARGET \ --host=arm-linux-androideabi \
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \ --build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
--with-xml-prefix="$PREFIX" \
--without-libxml2 \ --without-libxml2 \
--disable-python-bindings \
--disable-examples \ --disable-examples \
--disable-threads \ --disable-threads \
CC="$TOOLCHAIN"/bin/arm-linux-androideabi-clang \
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

@ -2,7 +2,7 @@
# #
# nghttp2 - HTTP/2 C Library # nghttp2 - HTTP/2 C Library
# #
# Copyright (c) 2022 nghttp2 contributors # Copyright (c) 2013 Tatsuhiro Tsujikawa
# #
# Permission is hereby granted, free of charge, to any person obtaining # Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the # a copy of this software and associated documentation files (the
@ -23,18 +23,11 @@
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
if [ -z "$NDK" ]; then if [ -z "$ANDROID_HOME" ]; then
echo 'No $NDK specified.' echo 'No $ANDROID_HOME specified.'
exit 1 exit 1
fi fi
TOOLCHAIN=$ANDROID_HOME/toolchain
PATH=$TOOLCHAIN/bin:$PATH
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64 make "$@"
export TARGET=aarch64-linux-android
export API=33
export AR=$TOOLCHAIN/bin/llvm-ar
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
export LD=$TOOLCHAIN/bin/ld
export RANDLIB=$TOOLCHAIN/bin/llvm-ranlib
export STRIP=$TOOLCHAIN/bin/llvm-strip
export PREFIX=$NDK/usr/local

53
appveyor.yml Normal file
View File

@ -0,0 +1,53 @@
# 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,4 +1,4 @@
#!/usr/bin/env python3 #!/usr/bin/env python
# script to extract commit author's name from standard input. The # script to extract commit author's name from standard input. The
# input should be <AUTHOR>:<EMAIL>, one per line. # input should be <AUTHOR>:<EMAIL>, one per line.
@ -49,4 +49,4 @@ for name in names:
ndict[lowname] = name ndict[lowname] = name
for name in sorted(ndict.values()): for name in sorted(ndict.values()):
print(name) print name

View File

@ -1,13 +0,0 @@
if(LIBBPF_FOUND)
add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/reuseport_kern.o"
COMMAND ${CMAKE_C_COMPILER} ${BPFCFLAGS} ${EXTRABPFCFLAGS} -I${LIBBPF_INCLUDE_DIRS} -target bpf -c reuseport_kern.c -o "${CMAKE_CURRENT_BINARY_DIR}/reuseport_kern.o"
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
VERBATIM)
add_custom_target(bpf ALL
DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/reuseport_kern.o"
VERBATIM)
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/reuseport_kern.o"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/${CMAKE_PROJECT_NAME}")
endif()

View File

@ -1,663 +0,0 @@
/*
* nghttp2 - HTTP/2 C Library
*
* Copyright (c) 2021 Tatsuhiro Tsujikawa
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <linux/udp.h>
#include <linux/bpf.h>
#include <bpf/bpf_helpers.h>
/*
* How to compile:
*
* clang-12 -O2 -Wall -target bpf -g -c reuseport_kern.c -o reuseport_kern.o \
* -I/path/to/kernel/include
*
* See
* https://www.kernel.org/doc/Documentation/kbuild/headers_install.txt
* how to install kernel header files.
*/
/* AES_CBC_decrypt_buffer: https://github.com/kokke/tiny-AES-c
License is Public Domain. Commit hash:
12e7744b4919e9d55de75b7ab566326a1c8e7a67 */
#define AES_BLOCKLEN \
16 /* Block length in bytes - AES is 128b block \
only */
#define AES_KEYLEN 16 /* Key length in bytes */
#define AES_keyExpSize 176
struct AES_ctx {
__u8 RoundKey[AES_keyExpSize];
};
/* The number of columns comprising a state in AES. This is a constant
in AES. Value=4 */
#define Nb 4
#define Nk 4 /* The number of 32 bit words in a key. */
#define Nr 10 /* The number of rounds in AES Cipher. */
/* state - array holding the intermediate results during
decryption. */
typedef __u8 state_t[4][4];
/* The lookup-tables are marked const so they can be placed in
read-only storage instead of RAM The numbers below can be computed
dynamically trading ROM for RAM - This can be useful in (embedded)
bootloader applications, where ROM is often limited. */
static const __u8 sbox[256] = {
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b,
0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26,
0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2,
0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed,
0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f,
0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec,
0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14,
0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d,
0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f,
0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11,
0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f,
0xb0, 0x54, 0xbb, 0x16};
static const __u8 rsbox[256] = {
0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e,
0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,
0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32,
0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49,
0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,
0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50,
0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05,
0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,
0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41,
0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8,
0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,
0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b,
0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59,
0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,
0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d,
0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63,
0x55, 0x21, 0x0c, 0x7d};
/* The round constant word array, Rcon[i], contains the values given
by x to the power (i-1) being powers of x (x is denoted as {02}) in
the field GF(2^8) */
static const __u8 Rcon[11] = {0x8d, 0x01, 0x02, 0x04, 0x08, 0x10,
0x20, 0x40, 0x80, 0x1b, 0x36};
#define getSBoxValue(num) (sbox[(num)])
/* This function produces Nb(Nr+1) round keys. The round keys are used
in each round to decrypt the states. */
static void KeyExpansion(__u8 *RoundKey, const __u8 *Key) {
unsigned i, j, k;
__u8 tempa[4]; /* Used for the column/row operations */
/* The first round key is the key itself. */
for (i = 0; i < Nk; ++i) {
RoundKey[(i * 4) + 0] = Key[(i * 4) + 0];
RoundKey[(i * 4) + 1] = Key[(i * 4) + 1];
RoundKey[(i * 4) + 2] = Key[(i * 4) + 2];
RoundKey[(i * 4) + 3] = Key[(i * 4) + 3];
}
/* All other round keys are found from the previous round keys. */
for (i = Nk; i < Nb * (Nr + 1); ++i) {
{
k = (i - 1) * 4;
tempa[0] = RoundKey[k + 0];
tempa[1] = RoundKey[k + 1];
tempa[2] = RoundKey[k + 2];
tempa[3] = RoundKey[k + 3];
}
if (i % Nk == 0) {
/* This function shifts the 4 bytes in a word to the left once.
[a0,a1,a2,a3] becomes [a1,a2,a3,a0] */
/* Function RotWord() */
{
const __u8 u8tmp = tempa[0];
tempa[0] = tempa[1];
tempa[1] = tempa[2];
tempa[2] = tempa[3];
tempa[3] = u8tmp;
}
/* SubWord() is a function that takes a four-byte input word and
applies the S-box to each of the four bytes to produce an
output word. */
/* Function Subword() */
{
tempa[0] = getSBoxValue(tempa[0]);
tempa[1] = getSBoxValue(tempa[1]);
tempa[2] = getSBoxValue(tempa[2]);
tempa[3] = getSBoxValue(tempa[3]);
}
tempa[0] = tempa[0] ^ Rcon[i / Nk];
}
j = i * 4;
k = (i - Nk) * 4;
RoundKey[j + 0] = RoundKey[k + 0] ^ tempa[0];
RoundKey[j + 1] = RoundKey[k + 1] ^ tempa[1];
RoundKey[j + 2] = RoundKey[k + 2] ^ tempa[2];
RoundKey[j + 3] = RoundKey[k + 3] ^ tempa[3];
}
}
static void AES_init_ctx(struct AES_ctx *ctx, const __u8 *key) {
KeyExpansion(ctx->RoundKey, key);
}
/* This function adds the round key to state. The round key is added
to the state by an XOR function. */
static void AddRoundKey(__u8 round, state_t *state, const __u8 *RoundKey) {
__u8 i, j;
for (i = 0; i < 4; ++i) {
for (j = 0; j < 4; ++j) {
(*state)[i][j] ^= RoundKey[(round * Nb * 4) + (i * Nb) + j];
}
}
}
static __u8 xtime(__u8 x) { return ((x << 1) ^ (((x >> 7) & 1) * 0x1b)); }
#define Multiply(x, y) \
(((y & 1) * x) ^ ((y >> 1 & 1) * xtime(x)) ^ \
((y >> 2 & 1) * xtime(xtime(x))) ^ \
((y >> 3 & 1) * xtime(xtime(xtime(x)))) ^ \
((y >> 4 & 1) * xtime(xtime(xtime(xtime(x))))))
#define getSBoxInvert(num) (rsbox[(num)])
/* MixColumns function mixes the columns of the state matrix. The
method used to multiply may be difficult to understand for the
inexperienced. Please use the references to gain more
information. */
static void InvMixColumns(state_t *state) {
int i;
__u8 a, b, c, d;
for (i = 0; i < 4; ++i) {
a = (*state)[i][0];
b = (*state)[i][1];
c = (*state)[i][2];
d = (*state)[i][3];
(*state)[i][0] = Multiply(a, 0x0e) ^ Multiply(b, 0x0b) ^ Multiply(c, 0x0d) ^
Multiply(d, 0x09);
(*state)[i][1] = Multiply(a, 0x09) ^ Multiply(b, 0x0e) ^ Multiply(c, 0x0b) ^
Multiply(d, 0x0d);
(*state)[i][2] = Multiply(a, 0x0d) ^ Multiply(b, 0x09) ^ Multiply(c, 0x0e) ^
Multiply(d, 0x0b);
(*state)[i][3] = Multiply(a, 0x0b) ^ Multiply(b, 0x0d) ^ Multiply(c, 0x09) ^
Multiply(d, 0x0e);
}
}
extern __u32 LINUX_KERNEL_VERSION __kconfig;
/* The SubBytes Function Substitutes the values in the state matrix
with values in an S-box. */
static void InvSubBytes(state_t *state) {
__u8 i, j;
if (LINUX_KERNEL_VERSION < KERNEL_VERSION(5, 10, 0)) {
for (i = 0; i < 4; ++i) {
for (j = 0; j < 4; ++j) {
/* Ubuntu 20.04 LTS kernel 5.4.0 needs this workaround
otherwise "math between map_value pointer and register with
unbounded min value is not allowed". 5.10.0 is a kernel
version that works but it might not be the minimum
version. */
__u8 k = (*state)[j][i];
(*state)[j][i] = k ? getSBoxInvert(k) : getSBoxInvert(0);
}
}
} else {
for (i = 0; i < 4; ++i) {
for (j = 0; j < 4; ++j) {
(*state)[j][i] = getSBoxInvert((*state)[j][i]);
}
}
}
}
static void InvShiftRows(state_t *state) {
__u8 temp;
/* Rotate first row 1 columns to right */
temp = (*state)[3][1];
(*state)[3][1] = (*state)[2][1];
(*state)[2][1] = (*state)[1][1];
(*state)[1][1] = (*state)[0][1];
(*state)[0][1] = temp;
/* Rotate second row 2 columns to right */
temp = (*state)[0][2];
(*state)[0][2] = (*state)[2][2];
(*state)[2][2] = temp;
temp = (*state)[1][2];
(*state)[1][2] = (*state)[3][2];
(*state)[3][2] = temp;
/* Rotate third row 3 columns to right */
temp = (*state)[0][3];
(*state)[0][3] = (*state)[1][3];
(*state)[1][3] = (*state)[2][3];
(*state)[2][3] = (*state)[3][3];
(*state)[3][3] = temp;
}
static void InvCipher(state_t *state, const __u8 *RoundKey) {
/* Add the First round key to the state before starting the
rounds. */
AddRoundKey(Nr, state, RoundKey);
/* There will be Nr rounds. The first Nr-1 rounds are identical.
These Nr rounds are executed in the loop below. Last one without
InvMixColumn() */
InvShiftRows(state);
InvSubBytes(state);
AddRoundKey(Nr - 1, state, RoundKey);
InvMixColumns(state);
InvShiftRows(state);
InvSubBytes(state);
AddRoundKey(Nr - 2, state, RoundKey);
InvMixColumns(state);
InvShiftRows(state);
InvSubBytes(state);
AddRoundKey(Nr - 3, state, RoundKey);
InvMixColumns(state);
InvShiftRows(state);
InvSubBytes(state);
AddRoundKey(Nr - 4, state, RoundKey);
InvMixColumns(state);
InvShiftRows(state);
InvSubBytes(state);
AddRoundKey(Nr - 5, state, RoundKey);
InvMixColumns(state);
InvShiftRows(state);
InvSubBytes(state);
AddRoundKey(Nr - 6, state, RoundKey);
InvMixColumns(state);
InvShiftRows(state);
InvSubBytes(state);
AddRoundKey(Nr - 7, state, RoundKey);
InvMixColumns(state);
InvShiftRows(state);
InvSubBytes(state);
AddRoundKey(Nr - 8, state, RoundKey);
InvMixColumns(state);
InvShiftRows(state);
InvSubBytes(state);
AddRoundKey(Nr - 9, state, RoundKey);
InvMixColumns(state);
InvShiftRows(state);
InvSubBytes(state);
AddRoundKey(Nr - 10, state, RoundKey);
}
static void AES_ECB_decrypt(const struct AES_ctx *ctx, __u8 *buf) {
/* The next function call decrypts the PlainText with the Key using
AES algorithm. */
InvCipher((state_t *)buf, ctx->RoundKey);
}
/* rol32: From linux kernel source code */
/**
* rol32 - rotate a 32-bit value left
* @word: value to rotate
* @shift: bits to roll
*/
static inline __u32 rol32(__u32 word, unsigned int shift) {
return (word << shift) | (word >> ((-shift) & 31));
}
/* jhash.h: Jenkins hash support.
*
* Copyright (C) 2006. Bob Jenkins (bob_jenkins@burtleburtle.net)
*
* https://burtleburtle.net/bob/hash/
*
* These are the credits from Bob's sources:
*
* lookup3.c, by Bob Jenkins, May 2006, Public Domain.
*
* These are functions for producing 32-bit hashes for hash table lookup.
* hashword(), hashlittle(), hashlittle2(), hashbig(), mix(), and final()
* are externally useful functions. Routines to test the hash are included
* if SELF_TEST is defined. You can use this free for any purpose. It's in
* the public domain. It has no warranty.
*
* Copyright (C) 2009-2010 Jozsef Kadlecsik (kadlec@blackhole.kfki.hu)
*
* I've modified Bob's hash to be useful in the Linux kernel, and
* any bugs present are my fault.
* Jozsef
*/
/* __jhash_final - final mixing of 3 32-bit values (a,b,c) into c */
#define __jhash_final(a, b, c) \
{ \
c ^= b; \
c -= rol32(b, 14); \
a ^= c; \
a -= rol32(c, 11); \
b ^= a; \
b -= rol32(a, 25); \
c ^= b; \
c -= rol32(b, 16); \
a ^= c; \
a -= rol32(c, 4); \
b ^= a; \
b -= rol32(a, 14); \
c ^= b; \
c -= rol32(b, 24); \
}
/* __jhash_nwords - hash exactly 3, 2 or 1 word(s) */
static inline __u32 __jhash_nwords(__u32 a, __u32 b, __u32 c, __u32 initval) {
a += initval;
b += initval;
c += initval;
__jhash_final(a, b, c);
return c;
}
/* An arbitrary initial parameter */
#define JHASH_INITVAL 0xdeadbeef
static inline __u32 jhash_2words(__u32 a, __u32 b, __u32 initval) {
return __jhash_nwords(a, b, 0, initval + JHASH_INITVAL + (2 << 2));
}
struct {
__uint(type, BPF_MAP_TYPE_HASH);
__uint(max_entries, 255);
__type(key, __u64);
__type(value, __u32);
} cid_prefix_map SEC(".maps");
struct {
__uint(type, BPF_MAP_TYPE_REUSEPORT_SOCKARRAY);
__uint(max_entries, 255);
__type(key, __u32);
__type(value, __u32);
} reuseport_array SEC(".maps");
struct {
__uint(type, BPF_MAP_TYPE_ARRAY);
__uint(max_entries, 3);
__type(key, __u32);
__type(value, __u64);
} sk_info SEC(".maps");
typedef struct quic_hd {
__u8 *dcid;
__u32 dcidlen;
__u32 dcid_offset;
__u8 type;
} quic_hd;
#define SV_DCIDLEN 20
#define MAX_DCIDLEN 20
#define MIN_DCIDLEN 8
#define CID_PREFIXLEN 8
#define CID_PREFIX_OFFSET 1
enum {
NGTCP2_PKT_INITIAL = 0x0,
NGTCP2_PKT_0RTT = 0x1,
NGTCP2_PKT_HANDSHAKE = 0x2,
NGTCP2_PKT_SHORT = 0x40,
};
static inline int parse_quic(quic_hd *qhd, __u8 *data, __u8 *data_end) {
__u8 *p;
__u64 dcidlen;
if (*data & 0x80) {
p = data + 1 + 4;
/* Do not check the actual DCID length because we might not buffer
entire DCID here. */
dcidlen = *p;
if (dcidlen > MAX_DCIDLEN || dcidlen < MIN_DCIDLEN) {
return -1;
}
++p;
qhd->type = (*data & 0x30) >> 4;
qhd->dcid = p;
qhd->dcidlen = dcidlen;
qhd->dcid_offset = 6;
} else {
qhd->type = NGTCP2_PKT_SHORT;
qhd->dcid = data + 1;
qhd->dcidlen = SV_DCIDLEN;
qhd->dcid_offset = 1;
}
return 0;
}
static __u32 hash(const __u8 *data, __u32 datalen, __u32 initval) {
__u32 a, b;
a = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3];
b = (data[4] << 24) | (data[5] << 16) | (data[6] << 8) | data[7];
return jhash_2words(a, b, initval);
}
static __u32 sk_index_from_dcid(const quic_hd *qhd,
const struct sk_reuseport_md *reuse_md,
__u64 num_socks) {
__u32 len = qhd->dcidlen;
__u32 h = reuse_md->hash;
__u8 hbuf[8];
if (len > 16) {
__builtin_memset(hbuf, 0, sizeof(hbuf));
switch (len) {
case 20:
__builtin_memcpy(hbuf, qhd->dcid + 16, 4);
break;
case 19:
__builtin_memcpy(hbuf, qhd->dcid + 16, 3);
break;
case 18:
__builtin_memcpy(hbuf, qhd->dcid + 16, 2);
break;
case 17:
__builtin_memcpy(hbuf, qhd->dcid + 16, 1);
break;
}
h = hash(hbuf, sizeof(hbuf), h);
len = 16;
}
if (len > 8) {
__builtin_memset(hbuf, 0, sizeof(hbuf));
switch (len) {
case 16:
__builtin_memcpy(hbuf, qhd->dcid + 8, 8);
break;
case 15:
__builtin_memcpy(hbuf, qhd->dcid + 8, 7);
break;
case 14:
__builtin_memcpy(hbuf, qhd->dcid + 8, 6);
break;
case 13:
__builtin_memcpy(hbuf, qhd->dcid + 8, 5);
break;
case 12:
__builtin_memcpy(hbuf, qhd->dcid + 8, 4);
break;
case 11:
__builtin_memcpy(hbuf, qhd->dcid + 8, 3);
break;
case 10:
__builtin_memcpy(hbuf, qhd->dcid + 8, 2);
break;
case 9:
__builtin_memcpy(hbuf, qhd->dcid + 8, 1);
break;
}
h = hash(hbuf, sizeof(hbuf), h);
len = 8;
}
return hash(qhd->dcid, len, h) % num_socks;
}
SEC("sk_reuseport")
int select_reuseport(struct sk_reuseport_md *reuse_md) {
__u32 sk_index, *psk_index;
__u64 *pnum_socks, *pkey;
__u32 zero = 0, key_high_idx = 1, key_low_idx = 2;
int rv;
quic_hd qhd;
__u8 qpktbuf[6 + MAX_DCIDLEN];
struct AES_ctx aes_ctx;
__u8 key[AES_KEYLEN];
__u8 *cid_prefix;
if (bpf_skb_load_bytes(reuse_md, sizeof(struct udphdr), qpktbuf,
sizeof(qpktbuf)) != 0) {
return SK_DROP;
}
pnum_socks = bpf_map_lookup_elem(&sk_info, &zero);
if (pnum_socks == NULL) {
return SK_DROP;
}
pkey = bpf_map_lookup_elem(&sk_info, &key_high_idx);
if (pkey == NULL) {
return SK_DROP;
}
__builtin_memcpy(key, pkey, sizeof(*pkey));
pkey = bpf_map_lookup_elem(&sk_info, &key_low_idx);
if (pkey == NULL) {
return SK_DROP;
}
__builtin_memcpy(key + sizeof(*pkey), pkey, sizeof(*pkey));
rv = parse_quic(&qhd, qpktbuf, qpktbuf + sizeof(qpktbuf));
if (rv != 0) {
return SK_DROP;
}
AES_init_ctx(&aes_ctx, key);
switch (qhd.type) {
case NGTCP2_PKT_INITIAL:
case NGTCP2_PKT_0RTT:
if (qhd.dcidlen == SV_DCIDLEN) {
cid_prefix = qhd.dcid + CID_PREFIX_OFFSET;
AES_ECB_decrypt(&aes_ctx, cid_prefix);
psk_index = bpf_map_lookup_elem(&cid_prefix_map, cid_prefix);
if (psk_index != NULL) {
sk_index = *psk_index;
break;
}
}
sk_index = sk_index_from_dcid(&qhd, reuse_md, *pnum_socks);
break;
case NGTCP2_PKT_HANDSHAKE:
case NGTCP2_PKT_SHORT:
if (qhd.dcidlen != SV_DCIDLEN) {
return SK_DROP;
}
cid_prefix = qhd.dcid + CID_PREFIX_OFFSET;
AES_ECB_decrypt(&aes_ctx, cid_prefix);
psk_index = bpf_map_lookup_elem(&cid_prefix_map, cid_prefix);
if (psk_index == NULL) {
sk_index = sk_index_from_dcid(&qhd, reuse_md, *pnum_socks);
break;
}
sk_index = *psk_index;
break;
default:
return SK_DROP;
}
rv = bpf_sk_select_reuseport(reuse_md, &reuseport_array, &sk_index, 0);
if (rv != 0) {
return SK_DROP;
}
return SK_PASS;
}

44
cmake/FindCython.cmake Normal file
View File

@ -0,0 +1,44 @@
# Find the Cython compiler.
#
# This code sets the following variables:
#
# CYTHON_EXECUTABLE
#
# See also UseCython.cmake
#=============================================================================
# Copyright 2011 Kitware, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#=============================================================================
# Use the Cython executable that lives next to the Python executable
# if it is a local installation.
find_package( PythonInterp )
if( PYTHONINTERP_FOUND )
get_filename_component( _python_path ${PYTHON_EXECUTABLE} PATH )
find_program( CYTHON_EXECUTABLE
NAMES cython cython.bat cython3
HINTS ${_python_path}
)
else()
find_program( CYTHON_EXECUTABLE
NAMES cython cython.bat cython3
)
endif()
include( FindPackageHandleStandardArgs )
FIND_PACKAGE_HANDLE_STANDARD_ARGS( Cython REQUIRED_VARS CYTHON_EXECUTABLE )
mark_as_advanced( CYTHON_EXECUTABLE )

View File

@ -1,32 +0,0 @@
# - Try to find libbpf
# Once done this will define
# LIBBPF_FOUND - System has libbpf
# LIBBPF_INCLUDE_DIRS - The libbpf include directories
# LIBBPF_LIBRARIES - The libraries needed to use libbpf
find_package(PkgConfig QUIET)
pkg_check_modules(PC_LIBBPF QUIET libbpf)
find_path(LIBBPF_INCLUDE_DIR
NAMES bpf/bpf.h
HINTS ${PC_LIBBPF_INCLUDE_DIRS}
)
find_library(LIBBPF_LIBRARY
NAMES bpf
HINTS ${PC_LIBBPF_LIBRARY_DIRS}
)
include(FindPackageHandleStandardArgs)
# handle the QUIETLY and REQUIRED arguments and set LIBBPF_FOUND
# to TRUE if all listed variables are TRUE and the requested version
# matches.
find_package_handle_standard_args(Libbpf REQUIRED_VARS
LIBBPF_LIBRARY LIBBPF_INCLUDE_DIR
VERSION_VAR LIBBPF_VERSION)
if(LIBBPF_FOUND)
set(LIBBPF_LIBRARIES ${LIBBPF_LIBRARY})
set(LIBBPF_INCLUDE_DIRS ${LIBBPF_INCLUDE_DIR})
endif()
mark_as_advanced(LIBBPF_INCLUDE_DIR LIBBPF_LIBRARY)

View File

@ -1,41 +0,0 @@
# - Try to find libnghttp3
# Once done this will define
# LIBNGHTTP3_FOUND - System has libnghttp3
# LIBNGHTTP3_INCLUDE_DIRS - The libnghttp3 include directories
# LIBNGHTTP3_LIBRARIES - The libraries needed to use libnghttp3
find_package(PkgConfig QUIET)
pkg_check_modules(PC_LIBNGHTTP3 QUIET libnghttp3)
find_path(LIBNGHTTP3_INCLUDE_DIR
NAMES nghttp3/nghttp3.h
HINTS ${PC_LIBNGHTTP3_INCLUDE_DIRS}
)
find_library(LIBNGHTTP3_LIBRARY
NAMES nghttp3
HINTS ${PC_LIBNGHTTP3_LIBRARY_DIRS}
)
if(LIBNGHTTP3_INCLUDE_DIR)
set(_version_regex "^#define[ \t]+NGHTTP3_VERSION[ \t]+\"([^\"]+)\".*")
file(STRINGS "${LIBNGHTTP3_INCLUDE_DIR}/nghttp3/version.h"
LIBNGHTTP3_VERSION REGEX "${_version_regex}")
string(REGEX REPLACE "${_version_regex}" "\\1"
LIBNGHTTP3_VERSION "${LIBNGHTTP3_VERSION}")
unset(_version_regex)
endif()
include(FindPackageHandleStandardArgs)
# handle the QUIETLY and REQUIRED arguments and set LIBNGHTTP3_FOUND
# to TRUE if all listed variables are TRUE and the requested version
# matches.
find_package_handle_standard_args(Libnghttp3 REQUIRED_VARS
LIBNGHTTP3_LIBRARY LIBNGHTTP3_INCLUDE_DIR
VERSION_VAR LIBNGHTTP3_VERSION)
if(LIBNGHTTP3_FOUND)
set(LIBNGHTTP3_LIBRARIES ${LIBNGHTTP3_LIBRARY})
set(LIBNGHTTP3_INCLUDE_DIRS ${LIBNGHTTP3_INCLUDE_DIR})
endif()
mark_as_advanced(LIBNGHTTP3_INCLUDE_DIR LIBNGHTTP3_LIBRARY)

View File

@ -1,41 +0,0 @@
# - Try to find libngtcp2
# Once done this will define
# LIBNGTCP2_FOUND - System has libngtcp2
# LIBNGTCP2_INCLUDE_DIRS - The libngtcp2 include directories
# LIBNGTCP2_LIBRARIES - The libraries needed to use libngtcp2
find_package(PkgConfig QUIET)
pkg_check_modules(PC_LIBNGTCP2 QUIET libngtcp2)
find_path(LIBNGTCP2_INCLUDE_DIR
NAMES ngtcp2/ngtcp2.h
HINTS ${PC_LIBNGTCP2_INCLUDE_DIRS}
)
find_library(LIBNGTCP2_LIBRARY
NAMES ngtcp2
HINTS ${PC_LIBNGTCP2_LIBRARY_DIRS}
)
if(LIBNGTCP2_INCLUDE_DIR)
set(_version_regex "^#define[ \t]+NGTCP2_VERSION[ \t]+\"([^\"]+)\".*")
file(STRINGS "${LIBNGTCP2_INCLUDE_DIR}/ngtcp2/version.h"
LIBNGTCP2_VERSION REGEX "${_version_regex}")
string(REGEX REPLACE "${_version_regex}" "\\1"
LIBNGTCP2_VERSION "${LIBNGTCP2_VERSION}")
unset(_version_regex)
endif()
include(FindPackageHandleStandardArgs)
# handle the QUIETLY and REQUIRED arguments and set LIBNGTCP2_FOUND
# to TRUE if all listed variables are TRUE and the requested version
# matches.
find_package_handle_standard_args(Libngtcp2 REQUIRED_VARS
LIBNGTCP2_LIBRARY LIBNGTCP2_INCLUDE_DIR
VERSION_VAR LIBNGTCP2_VERSION)
if(LIBNGTCP2_FOUND)
set(LIBNGTCP2_LIBRARIES ${LIBNGTCP2_LIBRARY})
set(LIBNGTCP2_INCLUDE_DIRS ${LIBNGTCP2_INCLUDE_DIR})
endif()
mark_as_advanced(LIBNGTCP2_INCLUDE_DIR LIBNGTCP2_LIBRARY)

View File

@ -1,43 +0,0 @@
# - Try to find libngtcp2_crypto_openssl
# Once done this will define
# LIBNGTCP2_CRYPTO_OPENSSL_FOUND - System has libngtcp2_crypto_openssl
# LIBNGTCP2_CRYPTO_OPENSSL_INCLUDE_DIRS - The libngtcp2_crypto_openssl include directories
# LIBNGTCP2_CRYPTO_OPENSSL_LIBRARIES - The libraries needed to use libngtcp2_crypto_openssl
find_package(PkgConfig QUIET)
pkg_check_modules(PC_LIBNGTCP2_CRYPTO_OPENSSL QUIET libngtcp2_crypto_openssl)
find_path(LIBNGTCP2_CRYPTO_OPENSSL_INCLUDE_DIR
NAMES ngtcp2/ngtcp2_crypto_openssl.h
HINTS ${PC_LIBNGTCP2_CRYPTO_OPENSSL_INCLUDE_DIRS}
)
find_library(LIBNGTCP2_CRYPTO_OPENSSL_LIBRARY
NAMES ngtcp2_crypto_openssl
HINTS ${PC_LIBNGTCP2_CRYPTO_OPENSSL_LIBRARY_DIRS}
)
if(LIBNGTCP2_CRYPTO_OPENSSL_INCLUDE_DIR)
set(_version_regex "^#define[ \t]+NGTCP2_VERSION[ \t]+\"([^\"]+)\".*")
file(STRINGS "${LIBNGTCP2_CRYPTO_OPENSSL_INCLUDE_DIR}/ngtcp2/version.h"
LIBNGTCP2_CRYPTO_OPENSSL_VERSION REGEX "${_version_regex}")
string(REGEX REPLACE "${_version_regex}" "\\1"
LIBNGTCP2_CRYPTO_OPENSSL_VERSION "${LIBNGTCP2_CRYPTO_OPENSSL_VERSION}")
unset(_version_regex)
endif()
include(FindPackageHandleStandardArgs)
# handle the QUIETLY and REQUIRED arguments and set
# LIBNGTCP2_CRYPTO_OPENSSL_FOUND to TRUE if all listed variables are
# TRUE and the requested version matches.
find_package_handle_standard_args(Libngtcp2_crypto_openssl REQUIRED_VARS
LIBNGTCP2_CRYPTO_OPENSSL_LIBRARY
LIBNGTCP2_CRYPTO_OPENSSL_INCLUDE_DIR
VERSION_VAR LIBNGTCP2_CRYPTO_OPENSSL_VERSION)
if(LIBNGTCP2_CRYPTO_OPENSSL_FOUND)
set(LIBNGTCP2_CRYPTO_OPENSSL_LIBRARIES ${LIBNGTCP2_CRYPTO_OPENSSL_LIBRARY})
set(LIBNGTCP2_CRYPTO_OPENSSL_INCLUDE_DIRS ${LIBNGTCP2_CRYPTO_OPENSSL_INCLUDE_DIR})
endif()
mark_as_advanced(LIBNGTCP2_CRYPTO_OPENSSL_INCLUDE_DIR
LIBNGTCP2_CRYPTO_OPENSSL_LIBRARY)

View File

@ -15,5 +15,5 @@ find_library(SYSTEMD_LIBRARIES NAMES systemd ${PC_SYSTEMD_LIBRARY_DIRS})
find_path(SYSTEMD_INCLUDE_DIRS systemd/sd-login.h HINTS ${PC_SYSTEMD_INCLUDE_DIRS}) find_path(SYSTEMD_INCLUDE_DIRS systemd/sd-login.h HINTS ${PC_SYSTEMD_INCLUDE_DIRS})
include(FindPackageHandleStandardArgs) include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Systemd DEFAULT_MSG SYSTEMD_INCLUDE_DIRS SYSTEMD_LIBRARIES) find_package_handle_standard_args(SYSTEMD DEFAULT_MSG SYSTEMD_INCLUDE_DIRS SYSTEMD_LIBRARIES)
mark_as_advanced(SYSTEMD_INCLUDE_DIRS SYSTEMD_LIBRARIES) mark_as_advanced(SYSTEMD_INCLUDE_DIRS SYSTEMD_LIBRARIES)

View File

@ -78,15 +78,3 @@
/* Define to 1 if you have the <unistd.h> header file. */ /* Define to 1 if you have the <unistd.h> header file. */
#cmakedefine HAVE_UNISTD_H 1 #cmakedefine HAVE_UNISTD_H 1
/* Define to 1 if HTTP/3 is enabled. */
#cmakedefine ENABLE_HTTP3 1
/* Define to 1 if you have `libbpf` library. */
#cmakedefine HAVE_LIBBPF 1
/* Define to 1 if you have enum bpf_stats_type in linux/bpf.h. */
#cmakedefine HAVE_BPF_STATS_TYPE 1
/* Define to 1 if you have `libngtcp2_crypto_openssl` library. */
#cmakedefine HAVE_LIBNGTCP2_CRYPTO_OPENSSL

View File

@ -22,10 +22,10 @@ dnl OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
dnl WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. dnl WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
dnl Do not change user variables! dnl Do not change user variables!
dnl https://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.52.0-DEV], [t-tujikawa@users.sourceforge.net]) AC_INIT([nghttp2], [1.42.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])
@ -43,10 +43,10 @@ AM_INIT_AUTOMAKE([subdir-objects])
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
dnl See versioning rule: dnl See versioning rule:
dnl https://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, 38) AC_SUBST(LT_CURRENT, 34)
AC_SUBST(LT_REVISION, 1) AC_SUBST(LT_REVISION, 0)
AC_SUBST(LT_AGE, 24) AC_SUBST(LT_AGE, 20)
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"`
@ -82,11 +82,21 @@ AC_ARG_ENABLE([hpack-tools],
[Build HPACK tools [default=check]])], [Build HPACK tools [default=check]])],
[request_hpack_tools=$enableval], [request_hpack_tools=check]) [request_hpack_tools=$enableval], [request_hpack_tools=check])
AC_ARG_ENABLE([asio-lib],
[AS_HELP_STRING([--enable-asio-lib],
[Build C++ libnghttp2_asio library [default=no]])],
[request_asio_lib=$enableval], [request_asio_lib=no])
AC_ARG_ENABLE([examples], AC_ARG_ENABLE([examples],
[AS_HELP_STRING([--enable-examples], [AS_HELP_STRING([--enable-examples],
[Build examples [default=check]])], [Build examples [default=check]])],
[request_examples=$enableval], [request_examples=check]) [request_examples=$enableval], [request_examples=check])
AC_ARG_ENABLE([python-bindings],
[AS_HELP_STRING([--enable-python-bindings],
[Build Python bindings [default=check]])],
[request_python_bindings=$enableval], [request_python_bindings=check])
AC_ARG_ENABLE([failmalloc], AC_ARG_ENABLE([failmalloc],
[AS_HELP_STRING([--disable-failmalloc], [AS_HELP_STRING([--disable-failmalloc],
[Do not build failmalloc test program])], [Do not build failmalloc test program])],
@ -94,54 +104,14 @@ AC_ARG_ENABLE([failmalloc],
AC_ARG_ENABLE([lib-only], AC_ARG_ENABLE([lib-only],
[AS_HELP_STRING([--enable-lib-only], [AS_HELP_STRING([--enable-lib-only],
[Build libnghttp2 only. This is a short hand for --disable-app --disable-examples --disable-hpack-tools])], [Build libnghttp2 only. This is a short hand for --disable-app --disable-examples --disable-hpack-tools --disable-python-bindings])],
[request_lib_only=$enableval], [request_lib_only=no]) [request_lib_only=$enableval], [request_lib_only=no])
AC_ARG_ENABLE([http3],
[AS_HELP_STRING([--enable-http3],
[(EXPERIMENTAL) Enable HTTP/3. This requires ngtcp2, nghttp3, and a custom OpenSSL.])],
[request_http3=$enableval], [request_http3=no])
AC_ARG_WITH([libxml2], AC_ARG_WITH([libxml2],
[AS_HELP_STRING([--with-libxml2], [AS_HELP_STRING([--with-libxml2],
[Use libxml2 [default=check]])], [Use libxml2 [default=check]])],
[request_libxml2=$withval], [request_libxml2=check]) [request_libxml2=$withval], [request_libxml2=check])
AC_ARG_WITH([jansson],
[AS_HELP_STRING([--with-jansson],
[Use jansson [default=check]])],
[request_jansson=$withval], [request_jansson=check])
AC_ARG_WITH([zlib],
[AS_HELP_STRING([--with-zlib],
[Use zlib [default=check]])],
[request_zlib=$withval], [request_zlib=check])
AC_ARG_WITH([libevent-openssl],
[AS_HELP_STRING([--with-libevent-openssl],
[Use libevent_openssl [default=check]])],
[request_libevent_openssl=$withval], [request_libevent_openssl=check])
AC_ARG_WITH([libcares],
[AS_HELP_STRING([--with-libcares],
[Use libc-ares [default=check]])],
[request_libcares=$withval], [request_libcares=check])
AC_ARG_WITH([openssl],
[AS_HELP_STRING([--with-openssl],
[Use openssl [default=check]])],
[request_openssl=$withval], [request_openssl=check])
AC_ARG_WITH([libev],
[AS_HELP_STRING([--with-libev],
[Use libev [default=check]])],
[request_libev=$withval], [request_libev=check])
AC_ARG_WITH([cunit],
[AS_HELP_STRING([--with-cunit],
[Use cunit [default=check]])],
[request_cunit=$withval], [request_cunit=check])
AC_ARG_WITH([jemalloc], AC_ARG_WITH([jemalloc],
[AS_HELP_STRING([--with-jemalloc], [AS_HELP_STRING([--with-jemalloc],
[Use jemalloc [default=check]])], [Use jemalloc [default=check]])],
@ -162,33 +132,13 @@ AC_ARG_WITH([neverbleed],
[Use neverbleed [default=no]])], [Use neverbleed [default=no]])],
[request_neverbleed=$withval], [request_neverbleed=no]) [request_neverbleed=$withval], [request_neverbleed=no])
AC_ARG_WITH([libngtcp2], AC_ARG_WITH([cython],
[AS_HELP_STRING([--with-libngtcp2], [AS_HELP_STRING([--with-cython=PATH],
[Use libngtcp2 [default=check]])], [Use cython in given PATH])],
[request_libngtcp2=$withval], [request_libngtcp2=check]) [cython_path=$withval], [])
AC_ARG_WITH([libnghttp3],
[AS_HELP_STRING([--with-libnghttp3],
[Use libnghttp3 [default=check]])],
[request_libnghttp3=$withval], [request_libnghttp3=check])
AC_ARG_WITH([libbpf],
[AS_HELP_STRING([--with-libbpf],
[Use libbpf [default=no]])],
[request_libbpf=$withval], [request_libbpf=no])
dnl Define variables dnl Define variables
AC_ARG_VAR([LIBEV_CFLAGS], [C compiler flags for libev, skipping any checks]) AC_ARG_VAR([CYTHON], [the Cython executable])
AC_ARG_VAR([LIBEV_LIBS], [linker flags for libev, skipping any checks])
AC_ARG_VAR([JEMALLOC_CFLAGS],
[C compiler flags for jemalloc, skipping any checks])
AC_ARG_VAR([JEMALLOC_LIBS], [linker flags for jemalloc, skipping any checks])
AC_ARG_VAR([LIBTOOL_LDFLAGS],
[libtool specific flags (e.g., -static-libtool-libs)])
AC_ARG_VAR([BPFCFLAGS], [C compiler flags for bpf program])
dnl Checks for programs dnl Checks for programs
AC_PROG_CC AC_PROG_CC
@ -201,27 +151,24 @@ AC_PROG_MKDIR_P
PKG_PROG_PKG_CONFIG([0.20]) PKG_PROG_PKG_CONFIG([0.20])
AM_PATH_PYTHON([3.8],, [:]) AM_PATH_PYTHON([2.7],, [:])
if [test "x$request_lib_only" = "xyes"]; then if [test "x$request_lib_only" = "xyes"]; then
request_app=no request_app=no
request_hpack_tools=no request_hpack_tools=no
request_examples=no request_examples=no
request_http3=no request_python_bindings=no
request_libxml2=no fi
request_jansson=no
request_zlib=no if [test "x$request_python_bindings" != "xno"]; then
request_libevent_openssl=no AX_PYTHON_DEVEL([>= '2.7'])
request_libcares=no fi
request_openssl=no
request_libev=no if test "x${cython_path}" = "x"; then
request_jemalloc=no AC_CHECK_PROGS([CYTHON], [cython.py cython])
request_systemd=no else
request_mruby=no CYTHON=${cython_path}
request_neverbleed=no AC_SUBST([CYTHON])
request_libngtcp2=no
request_libnghttp3=no
request_libbpf=no
fi fi
if test "x$GCC" = "xyes" -o "x$CC" = "xclang" ; then if test "x$GCC" = "xyes" -o "x$CC" = "xclang" ; then
@ -253,7 +200,6 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
]], ]],
[[ [[
std::vector<std::future<int>> v; std::vector<std::future<int>> v;
(void)v;
]])], ]])],
[AC_DEFINE([HAVE_STD_FUTURE], [1], [AC_DEFINE([HAVE_STD_FUTURE], [1],
[Define to 1 if you have the `std::future`.]) [Define to 1 if you have the `std::future`.])
@ -328,8 +274,8 @@ APPLDFLAGS=
case "$host_os" in case "$host_os" in
*android*) *android*)
android_build=yes android_build=yes
# android does not need -pthread, but needs following 2 libs for C++ # android does not need -pthread, but needs followng 3 libs for C++
APPLDFLAGS="$APPLDFLAGS -lstdc++ -latomic" APPLDFLAGS="$APPLDFLAGS -lstdc++ -latomic -lsupc++"
;; ;;
*) *)
PTHREAD_LDFLAGS="-pthread" PTHREAD_LDFLAGS="-pthread"
@ -343,26 +289,11 @@ case "$host_os" in
;; ;;
esac esac
case "${build}" in
*-apple-darwin*)
EXTRA_DEFS="-D__APPLE_USE_RFC_3542"
AC_SUBST([EXTRA_DEFS])
;;
esac
# zlib # zlib
have_zlib=no PKG_CHECK_MODULES([ZLIB], [zlib >= 1.2.3], [have_zlib=yes], [have_zlib=no])
if test "x${request_zlib}" != "xno"; then
PKG_CHECK_MODULES([ZLIB], [zlib >= 1.2.3], [have_zlib=yes], [have_zlib=no])
if test "x${have_zlib}" = "xno"; then if test "x${have_zlib}" = "xno"; then
AC_MSG_NOTICE($ZLIB_PKG_ERRORS) AC_MSG_NOTICE($ZLIB_PKG_ERRORS)
fi
fi
if test "x${request_zlib}" = "xyes" &&
test "x${have_zlib}" != "xyes"; then
AC_MSG_ERROR([zlib was requested (--with-zlib) but not found])
fi fi
# dl: openssl requires libdl when it is statically linked. # dl: openssl requires libdl when it is statically linked.
@ -378,12 +309,10 @@ case "${host_os}" in
esac esac
# cunit # cunit
have_cunit=no PKG_CHECK_MODULES([CUNIT], [cunit >= 2.1], [have_cunit=yes], [have_cunit=no])
if test "x${request_cunit}" != "xno"; then # If pkg-config does not find cunit, check it using AC_CHECK_LIB. We
PKG_CHECK_MODULES([CUNIT], [cunit >= 2.1], [have_cunit=yes], [have_cunit=no]) # do this because Debian (Ubuntu) lacks pkg-config file for cunit.
# If pkg-config does not find cunit, check it using AC_CHECK_LIB. We if test "x${have_cunit}" = "xno"; then
# do this because Debian (Ubuntu) lacks pkg-config file for cunit.
if test "x${have_cunit}" = "xno"; then
AC_MSG_WARN([${CUNIT_PKG_ERRORS}]) AC_MSG_WARN([${CUNIT_PKG_ERRORS}])
AC_CHECK_LIB([cunit], [CU_initialize_registry], AC_CHECK_LIB([cunit], [CU_initialize_registry],
[have_cunit=yes], [have_cunit=no]) [have_cunit=yes], [have_cunit=no])
@ -393,8 +322,8 @@ if test "x${request_cunit}" != "xno"; then
AC_SUBST([CUNIT_LIBS]) AC_SUBST([CUNIT_LIBS])
AC_SUBST([CUNIT_CFLAGS]) AC_SUBST([CUNIT_CFLAGS])
fi fi
fi fi
if test "x${have_cunit}" = "xyes"; then if test "x${have_cunit}" = "xyes"; then
# cunit in Mac OS X requires ncurses. Note that in Mac OS X, test # cunit in Mac OS X requires ncurses. Note that in Mac OS X, test
# program can be built without -lncurses, but it emits runtime # program can be built without -lncurses, but it emits runtime
# error. # error.
@ -404,255 +333,58 @@ if test "x${request_cunit}" != "xno"; then
AC_SUBST([CUNIT_LIBS]) AC_SUBST([CUNIT_LIBS])
;; ;;
esac esac
fi
fi
if test "x${request_cunit}" = "xyes" &&
test "x${have_cunit}" != "xyes"; then
AC_MSG_ERROR([cunit was requested (--with-cunit) but not found])
fi fi
AM_CONDITIONAL([HAVE_CUNIT], [ test "x${have_cunit}" = "xyes" ]) AM_CONDITIONAL([HAVE_CUNIT], [ test "x${have_cunit}" = "xyes" ])
# libev (for src) # libev (for src)
have_libev=no # libev does not have pkg-config file. Check it in an old way.
if test "x${request_libev}" != "xno"; then save_LIBS=$LIBS
if test "x${LIBEV_LIBS}" = "x" && test "x${LIBEV_CFLAGS}" = "x"; then # android requires -lm for floor
# libev does not have pkg-config file. Check it in an old way. AC_CHECK_LIB([ev], [ev_time], [have_libev=yes], [have_libev=no], [-lm])
save_LIBS=$LIBS if test "x${have_libev}" = "xyes"; then
# android requires -lm for floor
AC_CHECK_LIB([ev], [ev_time], [have_libev=yes], [have_libev=no], [-lm])
if test "x${have_libev}" = "xyes"; then
AC_CHECK_HEADER([ev.h], [have_libev=yes], [have_libev=no]) AC_CHECK_HEADER([ev.h], [have_libev=yes], [have_libev=no])
if test "x${have_libev}" = "xyes"; then if test "x${have_libev}" = "xyes"; then
LIBEV_LIBS=-lev LIBEV_LIBS=-lev
LIBEV_CFLAGS= LIBEV_CFLAGS=
fi AC_SUBST([LIBEV_LIBS])
fi AC_SUBST([LIBEV_CFLAGS])
LIBS=$save_LIBS
else
have_libev=yes
fi fi
fi fi
LIBS=$save_LIBS
if test "x${request_libev}" = "xyes" &&
test "x${have_libev}" != "xyes"; then
AC_MSG_ERROR([libev was requested (--with-libev) but not found])
fi
# openssl (for src) # openssl (for src)
have_openssl=no PKG_CHECK_MODULES([OPENSSL], [openssl >= 1.0.1],
if test "x${request_openssl}" != "xno"; then
PKG_CHECK_MODULES([OPENSSL], [openssl >= 1.0.1],
[have_openssl=yes], [have_openssl=no]) [have_openssl=yes], [have_openssl=no])
if test "x${have_openssl}" = "xno"; then if test "x${have_openssl}" = "xno"; then
AC_MSG_NOTICE($OPENSSL_PKG_ERRORS) AC_MSG_NOTICE($OPENSSL_PKG_ERRORS)
else
save_CFLAGS="$CFLAGS"
save_LIBS="$LIBS"
CFLAGS="$OPENSSL_CFLAGS $CFLAGS"
LIBS="$OPENSSL_LIBS $LIBS"
# quictls/openssl has SSL_is_quic.
have_ssl_is_quic=no
AC_MSG_CHECKING([for SSL_is_quic])
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <openssl/ssl.h>
]], [[
SSL *ssl = NULL;
SSL_is_quic(ssl);
]])],
[AC_MSG_RESULT([yes]); have_ssl_is_quic=yes],
[AC_MSG_RESULT([no]); have_ssl_is_quic=no])
# boringssl has SSL_set_quic_early_data_context.
AC_MSG_CHECKING([for SSL_set_quic_early_data_context])
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <openssl/ssl.h>
]], [[
SSL *ssl = NULL;
SSL_set_quic_early_data_context(ssl, NULL, 0);
]])],
[AC_MSG_RESULT([yes]); have_boringssl_quic=yes],
[AC_MSG_RESULT([no]); have_boringssl_quic=no])
CFLAGS="$save_CFLAGS"
LIBS="$save_LIBS"
fi
fi
if test "x${request_openssl}" = "xyes" &&
test "x${have_openssl}" != "xyes"; then
AC_MSG_ERROR([openssl was requested (--with-openssl) but not found])
fi fi
# c-ares (for src) # c-ares (for src)
have_libcares=no PKG_CHECK_MODULES([LIBCARES], [libcares >= 1.7.5], [have_libcares=yes],
if test "x${request_libcares}" != "xno"; then
PKG_CHECK_MODULES([LIBCARES], [libcares >= 1.7.5], [have_libcares=yes],
[have_libcares=no]) [have_libcares=no])
if test "x${have_libcares}" = "xno"; then if test "x${have_libcares}" = "xno"; then
AC_MSG_NOTICE($LIBCARES_PKG_ERRORS) AC_MSG_NOTICE($LIBCARES_PKG_ERRORS)
fi
fi fi
if test "x${request_libcares}" = "xyes" &&
test "x${have_libcares}" != "xyes"; then
AC_MSG_ERROR([libcares was requested (--with-libcares) but not found])
fi
# ngtcp2 (for src)
have_libngtcp2=no
if test "x${request_libngtcp2}" != "xno"; then
PKG_CHECK_MODULES([LIBNGTCP2], [libngtcp2 >= 0.10.0], [have_libngtcp2=yes],
[have_libngtcp2=no])
if test "x${have_libngtcp2}" = "xno"; then
AC_MSG_NOTICE($LIBNGTCP2_PKG_ERRORS)
fi
fi
if test "x${request_libngtcp2}" = "xyes" &&
test "x${have_libngtcp2}" != "xyes"; then
AC_MSG_ERROR([libngtcp2 was requested (--with-libngtcp2) but not found])
fi
# ngtcp2_crypto_openssl (for src)
have_libngtcp2_crypto_openssl=no
if test "x${have_ssl_is_quic}" = "xyes" &&
test "x${request_libngtcp2}" != "xno"; then
PKG_CHECK_MODULES([LIBNGTCP2_CRYPTO_OPENSSL],
[libngtcp2_crypto_openssl >= 0.10.0],
[have_libngtcp2_crypto_openssl=yes],
[have_libngtcp2_crypto_openssl=no])
if test "x${have_libngtcp2_crypto_openssl}" = "xno"; then
AC_MSG_NOTICE($LIBNGTCP2_CRYPTO_OPENSSL_PKG_ERRORS)
else
AC_DEFINE([HAVE_LIBNGTCP2_CRYPTO_OPENSSL], [1],
[Define to 1 if you have `libngtcp2_crypto_openssl` library.])
fi
fi
if test "x${have_ssl_is_quic}" = "xyes" &&
test "x${request_libngtcp2}" = "xyes" &&
test "x${have_libngtcp2_crypto_openssl}" != "xyes"; then
AC_MSG_ERROR([libngtcp2_crypto_openssl was requested (--with-libngtcp2) but not found])
fi
# ngtcp2_crypto_boringssl (for src)
have_libngtcp2_crypto_boringssl=no
if test "x${have_boringssl_quic}" = "xyes" &&
test "x${request_libngtcp2}" != "xno"; then
PKG_CHECK_MODULES([LIBNGTCP2_CRYPTO_BORINGSSL],
[libngtcp2_crypto_boringssl >= 0.0.0],
[have_libngtcp2_crypto_boringssl=yes],
[have_libngtcp2_crypto_boringssl=no])
if test "x${have_libngtcp2_crypto_boringssl}" = "xno"; then
AC_MSG_NOTICE($LIBNGTCP2_CRYPTO_BORINGSSL_PKG_ERRORS)
else
AC_DEFINE([HAVE_LIBNGTCP2_CRYPTO_BORINGSSL], [1],
[Define to 1 if you have `libngtcp2_crypto_boringssl` library.])
fi
fi
if test "x${have_boringssl_quic}" = "xyes" &&
test "x${request_libngtcp2}" = "xyes" &&
test "x${have_libngtcp2_crypto_boringssl}" != "xyes"; then
AC_MSG_ERROR([libngtcp2_crypto_boringssl was requested (--with-libngtcp2) but not found])
fi
# nghttp3 (for src)
have_libnghttp3=no
if test "x${request_libnghttp3}" != "xno"; then
PKG_CHECK_MODULES([LIBNGHTTP3], [libnghttp3 >= 0.7.0], [have_libnghttp3=yes],
[have_libnghttp3=no])
if test "x${have_libnghttp3}" = "xno"; then
AC_MSG_NOTICE($LIBNGHTTP3_PKG_ERRORS)
fi
fi
if test "x${request_libnghttp3}" = "xyes" &&
test "x${have_libnghttp3}" != "xyes"; then
AC_MSG_ERROR([libnghttp3 was requested (--with-libnghttp3) but not found])
fi
# libbpf (for src)
have_libbpf=no
if test "x${request_libbpf}" != "xno"; then
PKG_CHECK_MODULES([LIBBPF], [libbpf >= 0.7.0], [have_libbpf=yes],
[have_libbpf=no])
if test "x${have_libbpf}" = "xyes"; then
AC_DEFINE([HAVE_LIBBPF], [1], [Define to 1 if you have `libbpf` library.])
if test "x${BPFCFLAGS}" = "x"; then
BPFCFLAGS="-Wall -O2 -g"
fi
# Add the include path for Debian
EXTRABPFCFLAGS="-I/usr/include/$host_cpu-$host_os"
AC_SUBST([EXTRABPFCFLAGS])
AC_MSG_CHECKING([whether enum bpf_stats_type is defined in linux/bpf.h])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
[[
#include <linux/bpf.h>
]],
[[
enum bpf_stats_type foo;
(void)foo;
]])],
[have_bpf_stats_type=yes],
[have_bpf_stats_type=no])
if test "x${have_bpf_stats_type}" = "xyes"; then
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_BPF_STATS_TYPE], [1],
[Define to 1 if you have enum bpf_stats_type in linux/bpf.h.])
else
AC_MSG_RESULT([no])
fi
else
AC_MSG_NOTICE($LIBBPF_PKG_ERRORS)
fi
fi
if test "x${request_libbpf}" = "xyes" &&
test "x${have_libbpf}" != "xyes"; then
AC_MSG_ERROR([libbpf was requested (--with-libbpf) but not found])
fi
AM_CONDITIONAL([HAVE_LIBBPF], [ test "x${have_libbpf}" = "xyes" ])
# 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()
have_libevent_openssl=no PKG_CHECK_MODULES([LIBEVENT_OPENSSL], [libevent_openssl >= 2.0.8],
if test "x${request_libevent_openssl}" != "xno"; then
PKG_CHECK_MODULES([LIBEVENT_OPENSSL], [libevent_openssl >= 2.0.8],
[have_libevent_openssl=yes], [have_libevent_openssl=no]) [have_libevent_openssl=yes], [have_libevent_openssl=no])
if test "x${have_libevent_openssl}" = "xno"; then if test "x${have_libevent_openssl}" = "xno"; then
AC_MSG_NOTICE($LIBEVENT_OPENSSL_PKG_ERRORS) AC_MSG_NOTICE($LIBEVENT_OPENSSL_PKG_ERRORS)
fi
fi
if test "x${request_libevent_openssl}" = "xyes" &&
test "x${have_libevent_openssl}" != "xyes"; then
AC_MSG_ERROR([libevent_openssl was requested (--with-libevent) but not found])
fi fi
# jansson (for src/nghttp, src/deflatehd and src/inflatehd) # jansson (for src/nghttp, src/deflatehd and src/inflatehd)
have_jansson=no PKG_CHECK_MODULES([JANSSON], [jansson >= 2.5],
if test "x${request_jansson}" != "xno"; then
PKG_CHECK_MODULES([JANSSON], [jansson >= 2.5],
[have_jansson=yes], [have_jansson=no]) [have_jansson=yes], [have_jansson=no])
if test "x${have_jansson}" = "xyes"; then if test "x${have_jansson}" = "xyes"; then
AC_DEFINE([HAVE_JANSSON], [1], AC_DEFINE([HAVE_JANSSON], [1],
[Define to 1 if you have `libjansson` library.]) [Define to 1 if you have `libjansson` library.])
else else
AC_MSG_NOTICE($JANSSON_PKG_ERRORS) AC_MSG_NOTICE($JANSSON_PKG_ERRORS)
fi
fi fi
if test "x${request_jansson}" = "xyes" &&
test "x${have_jansson}" != "xyes"; then
AC_MSG_ERROR([jansson was requested (--with-jansson) but not found])
fi
# libsystemd (for src/nghttpx) # libsystemd (for src/nghttpx)
have_libsystemd=no have_libsystemd=no
@ -673,15 +405,12 @@ if test "x${request_systemd}" = "xyes" &&
fi fi
# libxml2 (for src/nghttp) # libxml2 (for src/nghttp)
have_libxml2=no PKG_CHECK_MODULES([LIBXML2], [libxml-2.0 >= 2.6.26],
if test "x${request_libxml2}" != "xno"; then
PKG_CHECK_MODULES([LIBXML2], [libxml-2.0 >= 2.6.26],
[have_libxml2=yes], [have_libxml2=no]) [have_libxml2=yes], [have_libxml2=no])
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 else
AC_MSG_NOTICE($LIBXML2_PKG_ERRORS) AC_MSG_NOTICE($LIBXML2_PKG_ERRORS)
fi
fi fi
if test "x${request_libxml2}" = "xyes" && if test "x${request_libxml2}" = "xyes" &&
@ -694,7 +423,6 @@ AM_CONDITIONAL([HAVE_LIBXML2], [ test "x${have_libxml2}" = "xyes" ])
# jemalloc # jemalloc
have_jemalloc=no have_jemalloc=no
if test "x${request_jemalloc}" != "xno"; then if test "x${request_jemalloc}" != "xno"; then
if test "x${JEMALLOC_LIBS}" = "x" && test "x${JEMALLOC_CFLAGS}" = "x"; then
save_LIBS=$LIBS save_LIBS=$LIBS
AC_SEARCH_LIBS([malloc_stats_print], [jemalloc], [have_jemalloc=yes], [], AC_SEARCH_LIBS([malloc_stats_print], [jemalloc], [have_jemalloc=yes], [],
[$PTHREAD_LDFLAGS]) [$PTHREAD_LDFLAGS])
@ -716,9 +444,7 @@ if test "x${request_jemalloc}" != "xno"; then
if test "x${have_jemalloc}" = "xyes" && if test "x${have_jemalloc}" = "xyes" &&
test "x${jemalloc_libs}" != "xnone required"; then test "x${jemalloc_libs}" != "xnone required"; then
JEMALLOC_LIBS=${jemalloc_libs} JEMALLOC_LIBS=${jemalloc_libs}
fi AC_SUBST([JEMALLOC_LIBS])
else
have_jemalloc=yes
fi fi
fi fi
@ -727,6 +453,25 @@ 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
# Check Boost Asio library
have_asio_lib=no
if test "x${request_asio_lib}" = "xyes"; then
AX_BOOST_BASE([1.54.0], [have_boost_base=yes], [have_boost_base=no])
if test "x${have_boost_base}" = "xyes"; then
AX_BOOST_ASIO()
AX_BOOST_SYSTEM()
AX_BOOST_THREAD()
if test "x${ax_cv_boost_asio}" = "xyes" &&
test "x${ax_cv_boost_system}" = "xyes" &&
test "x${ax_cv_boost_thread}" = "xyes"; then
have_asio_lib=yes
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. # libev, and libc-ares.
enable_app=no enable_app=no
@ -745,26 +490,6 @@ fi
AM_CONDITIONAL([ENABLE_APP], [ test "x${enable_app}" = "xyes" ]) AM_CONDITIONAL([ENABLE_APP], [ test "x${enable_app}" = "xyes" ])
# Check HTTP/3 support
enable_http3=no
if test "x${request_http3}" != "xno" &&
(test "x${have_ssl_is_quic}" = "xyes" ||
test "x${have_boringssl_quic}" = "xyes") &&
test "x${have_libngtcp2}" = "xyes" &&
(test "x${have_libngtcp2_crypto_openssl}" = "xyes" ||
test "x${have_libngtcp2_crypto_boringssl}" = "xyes") &&
test "x${have_libnghttp3}" = "xyes"; then
enable_http3=yes
AC_DEFINE([ENABLE_HTTP3], [1], [Define to 1 if HTTP/3 is enabled.])
fi
if test "x${request_http3}" = "xyes" &&
test "x${enable_http3}" != "xyes"; then
AC_MSG_ERROR([HTTP/3 was requested (--enable-http3) but dependencies are not met.])
fi
AM_CONDITIONAL([ENABLE_HTTP3], [ test "x${enable_http3}" = "xyes" ])
enable_hpack_tools=no enable_hpack_tools=no
# HPACK tools requires jansson # HPACK tools requires jansson
if test "x${request_hpack_tools}" != "xno" && if test "x${request_hpack_tools}" != "xno" &&
@ -779,6 +504,16 @@ fi
AM_CONDITIONAL([ENABLE_HPACK_TOOLS], [ test "x${enable_hpack_tools}" = "xyes" ]) AM_CONDITIONAL([ENABLE_HPACK_TOOLS], [ test "x${enable_hpack_tools}" = "xyes" ])
# C++ library libnghttp2_asio
enable_asio_lib=no
if test "x${request_asio_lib}" != "xno" &&
test "x${have_asio_lib}" = "xyes"; then
enable_asio_lib=yes
fi
AM_CONDITIONAL([ENABLE_ASIO_LIB], [ test "x${enable_asio_lib}" = "xyes" ])
# The example programs depend on OpenSSL and libevent_openssl # The example programs depend on OpenSSL and libevent_openssl
enable_examples=no enable_examples=no
if test "x${request_examples}" != "xno" && if test "x${request_examples}" != "xno" &&
@ -801,7 +536,8 @@ have_mruby=no
have_neverbleed=no have_neverbleed=no
if test "x${enable_examples}" = "xyes" || if test "x${enable_examples}" = "xyes" ||
test "x${enable_app}" = "xyes" || test "x${enable_app}" = "xyes" ||
test "x${enable_hpack_tools}" = "xyes"; then test "x${enable_hpack_tools}" = "xyes" ||
test "x${enable_asio_lib}" = "xyes"; then
enable_third_party=yes enable_third_party=yes
# mruby (for src/nghttpx) # mruby (for src/nghttpx)
@ -826,6 +562,27 @@ AM_CONDITIONAL([ENABLE_THIRD_PARTY], [ test "x${enable_third_party}" = "xyes" ])
AM_CONDITIONAL([HAVE_MRUBY], [test "x${have_mruby}" = "xyes"]) AM_CONDITIONAL([HAVE_MRUBY], [test "x${have_mruby}" = "xyes"])
AM_CONDITIONAL([HAVE_NEVERBLEED], [test "x${have_neverbleed}" = "xyes"]) AM_CONDITIONAL([HAVE_NEVERBLEED], [test "x${have_neverbleed}" = "xyes"])
# Python bindings
enable_python_bindings=no
if test "x${request_python_bindings}" != "xno" &&
test "x${CYTHON}" != "x" &&
test "x${PYTHON}" != "x:" &&
test "x${have_python_dev}" = "xyes"; then
enable_python_bindings=yes
fi
if test "x${request_python_bindings}" = "xyes" &&
test "x${enable_python_bindings}" != "xyes"; then
AC_MSG_ERROR([python bindings were requested (--enable-python-bindings) but dependencies are not met.])
fi
AM_CONDITIONAL([ENABLE_PYTHON_BINDINGS],
[test "x${enable_python_bindings}" = "xyes"])
# Produce cython conditional, so that we can distribute generated C
# source
AM_CONDITIONAL([HAVE_CYTHON], [test "x${CYTHON}" != "x"])
# failmalloc tests # failmalloc tests
enable_failmalloc=no enable_failmalloc=no
if test "x${request_failmalloc}" = "xyes"; then if test "x${request_failmalloc}" = "xyes"; then
@ -1072,8 +829,11 @@ AC_CONFIG_FILES([
tests/testdata/Makefile tests/testdata/Makefile
third-party/Makefile third-party/Makefile
src/Makefile src/Makefile
bpf/Makefile src/includes/Makefile
src/libnghttp2_asio.pc
examples/Makefile examples/Makefile
python/Makefile
python/setup.py
integration-tests/Makefile integration-tests/Makefile
integration-tests/config.go integration-tests/config.go
integration-tests/setenv integration-tests/setenv
@ -1086,9 +846,14 @@ AC_CONFIG_FILES([
doc/tutorial-hpack.rst doc/tutorial-hpack.rst
doc/nghttpx-howto.rst doc/nghttpx-howto.rst
doc/h2load-howto.rst doc/h2load-howto.rst
doc/libnghttp2_asio.rst
doc/python-apiref.rst
doc/building-android-binary.rst doc/building-android-binary.rst
doc/nghttp2.h.rst doc/nghttp2.h.rst
doc/nghttp2ver.h.rst doc/nghttp2ver.h.rst
doc/asio_http2.h.rst
doc/asio_http2_server.h.rst
doc/asio_http2_client.h.rst
doc/contribute.rst doc/contribute.rst
contrib/Makefile contrib/Makefile
script/Makefile script/Makefile
@ -1117,19 +882,18 @@ AC_MSG_NOTICE([summary of build options:
WARNCXXFLAGS: ${WARNCXXFLAGS} WARNCXXFLAGS: ${WARNCXXFLAGS}
CXX1XCXXFLAGS: ${CXX1XCXXFLAGS} CXX1XCXXFLAGS: ${CXX1XCXXFLAGS}
EXTRACFLAG: ${EXTRACFLAG} EXTRACFLAG: ${EXTRACFLAG}
BPFCFLAGS: ${BPFCFLAGS}
EXTRABPFCFLAGS: ${EXTRABPFCFLAGS}
LIBS: ${LIBS} LIBS: ${LIBS}
DEFS: ${DEFS}
EXTRA_DEFS: ${EXTRA_DEFS}
Library: Library:
Shared: ${enable_shared} Shared: ${enable_shared}
Static: ${enable_static} Static: ${enable_static}
Libtool:
LIBTOOL_LDFLAGS: ${LIBTOOL_LDFLAGS}
Python: Python:
Python: ${PYTHON} Python: ${PYTHON}
PYTHON_VERSION: ${PYTHON_VERSION} PYTHON_VERSION: ${PYTHON_VERSION}
pyexecdir: ${pyexecdir}
Python-dev: ${have_python_dev}
PYTHON_CPPFLAGS:${PYTHON_CPPFLAGS}
PYTHON_LDFLAGS: ${PYTHON_LDFLAGS}
Cython: ${CYTHON}
Test: Test:
CUnit: ${have_cunit} (CFLAGS='${CUNIT_CFLAGS}' LIBS='${CUNIT_LIBS}') CUnit: ${have_cunit} (CFLAGS='${CUNIT_CFLAGS}' LIBS='${CUNIT_LIBS}')
Failmalloc: ${enable_failmalloc} Failmalloc: ${enable_failmalloc}
@ -1138,16 +902,16 @@ AC_MSG_NOTICE([summary of build options:
Libxml2: ${have_libxml2} (CFLAGS='${LIBXML2_CFLAGS}' LIBS='${LIBXML2_LIBS}') Libxml2: ${have_libxml2} (CFLAGS='${LIBXML2_CFLAGS}' LIBS='${LIBXML2_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}') Libc-ares: ${have_libcares} (CFLAGS='${LIBCARES_CFLAGS}' LIBS='${LIBCARES_LIBS}')
libngtcp2: ${have_libngtcp2} (CFLAGS='${LIBNGTCP2_CFLAGS}' LIBS='${LIBNGTCP2_LIBS}')
libngtcp2_crypto_openssl: ${have_libngtcp2_crypto_openssl} (CFLAGS='${LIBNGTCP2_CRYPTO_OPENSSL_CFLAGS}' LIBS='${LIBNGTCP2_CRYPTO_OPENSSL_LIBS}')
libngtcp2_crypto_boringssl: ${have_libngtcp2_crypto_boringssl} (CFLAGS='${LIBNGTCP2_CRYPTO_BORINGSSL_CFLAGS}' LIBS='${LIBNGTCP2_CRYPTO_BORINGSSL_LIBS}')
libnghttp3: ${have_libnghttp3} (CFLAGS='${LIBNGHTTP3_CFLAGS}' LIBS='${LIBNGHTTP3_LIBS}')
libbpf: ${have_libbpf} (CFLAGS='${LIBBPF_CFLAGS}' LIBS='${LIBBPF_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}')
Jansson: ${have_jansson} (CFLAGS='${JANSSON_CFLAGS}' LIBS='${JANSSON_LIBS}') Jansson: ${have_jansson} (CFLAGS='${JANSSON_CFLAGS}' LIBS='${JANSSON_LIBS}')
Jemalloc: ${have_jemalloc} (CFLAGS='${JEMALLOC_CFLAGS}' 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}') Systemd: ${have_libsystemd} (CFLAGS='${SYSTEMD_CFLAGS}' LIBS='${SYSTEMD_LIBS}')
Boost CPPFLAGS: ${BOOST_CPPFLAGS}
Boost LDFLAGS: ${BOOST_LDFLAGS}
Boost::ASIO: ${BOOST_ASIO_LIB}
Boost::System: ${BOOST_SYSTEM_LIB}
Boost::Thread: ${BOOST_THREAD_LIB}
Third-party: Third-party:
http-parser: ${enable_third_party} http-parser: ${enable_third_party}
MRuby: ${have_mruby} (CFLAGS='${LIBMRUBY_CFLAGS}' LIBS='${LIBMRUBY_LIBS}') MRuby: ${have_mruby} (CFLAGS='${LIBMRUBY_CFLAGS}' LIBS='${LIBMRUBY_LIBS}')
@ -1155,7 +919,8 @@ AC_MSG_NOTICE([summary of build options:
Features: Features:
Applications: ${enable_app} Applications: ${enable_app}
HPACK tools: ${enable_hpack_tools} HPACK tools: ${enable_hpack_tools}
Libnghttp2_asio:${enable_asio_lib}
Examples: ${enable_examples} Examples: ${enable_examples}
Python bindings:${enable_python_bindings}
Threading: ${enable_threads} Threading: ${enable_threads}
HTTP/3 (EXPERIMENTAL): ${enable_http3}
]) ])

View File

@ -30,10 +30,9 @@ import (
"encoding/binary" "encoding/binary"
"flag" "flag"
"fmt" "fmt"
"github.com/bradfitz/gomemcache/memcache"
"log" "log"
"time" "time"
"github.com/bradfitz/gomemcache/memcache"
) )
func makeKey(len int) []byte { func makeKey(len int) []byte {
@ -90,7 +89,9 @@ func main() {
Expiration: int32((*interval) + 300), Expiration: int32((*interval) + 300),
}) })
<-time.After(time.Duration(*interval) * time.Second) select {
case <-time.After(time.Duration(*interval) * time.Second):
}
// rotate keys. the last key is now encryption key. // rotate keys. the last key is now encryption key.
// generate new key and append it to the last, so that // generate new key and append it to the last, so that

5
doc/.gitignore vendored
View File

@ -1,11 +1,15 @@
# generated files # generated files
apiref.rst apiref.rst
asio_http2.h.rst
asio_http2_client.h.rst
asio_http2_server.h.rst
building-android-binary.rst building-android-binary.rst
conf.py conf.py
contribute.rst contribute.rst
enums.rst enums.rst
h2load-howto.rst h2load-howto.rst
index.rst index.rst
libnghttp2_asio.rst
macros.rst macros.rst
manual/ manual/
nghttp2.h.rst nghttp2.h.rst
@ -13,6 +17,7 @@ nghttp2_*.rst
nghttp2ver.h.rst nghttp2ver.h.rst
nghttpx-howto.rst nghttpx-howto.rst
package_README.rst package_README.rst
python-apiref.rst
tutorial-client.rst tutorial-client.rst
tutorial-hpack.rst tutorial-hpack.rst
tutorial-server.rst tutorial-server.rst

View File

@ -180,11 +180,13 @@ set(EXTRA_DIST
sources/tutorial-hpack.rst sources/tutorial-hpack.rst
sources/nghttpx-howto.rst sources/nghttpx-howto.rst
sources/h2load-howto.rst sources/h2load-howto.rst
sources/libnghttp2_asio.rst
sources/python-apiref.rst
sources/building-android-binary.rst sources/building-android-binary.rst
sources/contribute.rst sources/contribute.rst
_exts/rubydomain/LICENSE.rubydomain _exts/sphinxcontrib/LICENSE.rubydomain
_exts/rubydomain/__init__.py _exts/sphinxcontrib/__init__.py
_exts/rubydomain/rubydomain.py _exts/sphinxcontrib/rubydomain.py
_themes/sphinx_rtd_theme/__init__.py _themes/sphinx_rtd_theme/__init__.py
_themes/sphinx_rtd_theme/breadcrumbs.html _themes/sphinx_rtd_theme/breadcrumbs.html
_themes/sphinx_rtd_theme/footer.html _themes/sphinx_rtd_theme/footer.html
@ -267,7 +269,7 @@ add_custom_command(
apiref.rst apiref.rst
${APIDOCS} ${APIDOCS}
COMMAND COMMAND
"${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/mkapiref.py" "${PYTHON_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/mkapiref.py"
apiref.rst macros.rst enums.rst types.rst . apiref.rst macros.rst enums.rst types.rst .
${apiref_SOURCES} ${apiref_SOURCES}
DEPENDS DEPENDS

View File

@ -30,9 +30,6 @@ APIDOCS= \
nghttp2_check_authority.rst \ nghttp2_check_authority.rst \
nghttp2_check_header_name.rst \ nghttp2_check_header_name.rst \
nghttp2_check_header_value.rst \ nghttp2_check_header_value.rst \
nghttp2_check_header_value_rfc9113.rst \
nghttp2_check_method.rst \
nghttp2_check_path.rst \
nghttp2_hd_deflate_bound.rst \ nghttp2_hd_deflate_bound.rst \
nghttp2_hd_deflate_change_table_size.rst \ nghttp2_hd_deflate_change_table_size.rst \
nghttp2_hd_deflate_del.rst \ nghttp2_hd_deflate_del.rst \
@ -69,9 +66,7 @@ APIDOCS= \
nghttp2_option_set_no_closed_streams.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_no_rfc9113_leading_and_trailing_ws_validation.rst \
nghttp2_option_set_peer_max_concurrent_streams.rst \ nghttp2_option_set_peer_max_concurrent_streams.rst \
nghttp2_option_set_server_fallback_rfc7540_priorities.rst \
nghttp2_option_set_user_recv_extension_type.rst \ nghttp2_option_set_user_recv_extension_type.rst \
nghttp2_option_set_max_outbound_ack.rst \ nghttp2_option_set_max_outbound_ack.rst \
nghttp2_option_set_max_settings.rst \ nghttp2_option_set_max_settings.rst \
@ -109,7 +104,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_extpri_stream_priority.rst \
nghttp2_session_change_stream_priority.rst \ nghttp2_session_change_stream_priority.rst \
nghttp2_session_check_request_allowed.rst \ nghttp2_session_check_request_allowed.rst \
nghttp2_session_check_server_session.rst \ nghttp2_session_check_server_session.rst \
@ -176,7 +170,6 @@ APIDOCS= \
nghttp2_submit_origin.rst \ nghttp2_submit_origin.rst \
nghttp2_submit_ping.rst \ nghttp2_submit_ping.rst \
nghttp2_submit_priority.rst \ nghttp2_submit_priority.rst \
nghttp2_submit_priority_update.rst \
nghttp2_submit_push_promise.rst \ nghttp2_submit_push_promise.rst \
nghttp2_submit_request.rst \ nghttp2_submit_request.rst \
nghttp2_submit_response.rst \ nghttp2_submit_response.rst \
@ -206,12 +199,14 @@ EXTRA_DIST = \
sources/tutorial-hpack.rst \ sources/tutorial-hpack.rst \
sources/nghttpx-howto.rst \ sources/nghttpx-howto.rst \
sources/h2load-howto.rst \ sources/h2load-howto.rst \
sources/libnghttp2_asio.rst \
sources/python-apiref.rst \
sources/building-android-binary.rst \ sources/building-android-binary.rst \
sources/contribute.rst \ sources/contribute.rst \
sources/security.rst \ sources/security.rst \
_exts/rubydomain/LICENSE.rubydomain \ _exts/sphinxcontrib/LICENSE.rubydomain \
_exts/rubydomain/__init__.py \ _exts/sphinxcontrib/__init__.py \
_exts/rubydomain/rubydomain.py \ _exts/sphinxcontrib/rubydomain.py \
_themes/sphinx_rtd_theme/__init__.py \ _themes/sphinx_rtd_theme/__init__.py \
_themes/sphinx_rtd_theme/breadcrumbs.html \ _themes/sphinx_rtd_theme/breadcrumbs.html \
_themes/sphinx_rtd_theme/footer.html \ _themes/sphinx_rtd_theme/footer.html \
@ -275,7 +270,7 @@ EXTRA_DIST = \
# You can set these variables from the command line. # You can set these variables from the command line.
SPHINXOPTS = SPHINXOPTS =
SPHINXBUILD ?= sphinx-build SPHINXBUILD = sphinx-build
PAPER = PAPER =
BUILDDIR = manual BUILDDIR = manual

View File

@ -18,7 +18,7 @@ from docutils.parsers.rst import Directive
from sphinx import addnodes from sphinx import addnodes
from sphinx import version_info from sphinx import version_info
from sphinx.roles import XRefRole from sphinx.roles import XRefRole
from sphinx.locale import _ 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
@ -493,7 +493,7 @@ class RubyModuleIndex(Index):
# list of all modules, sorted by module name # list of all modules, sorted by module name
modules = sorted(_iteritems(self.domain.data['modules']), modules = sorted(_iteritems(self.domain.data['modules']),
key=lambda x: x[0].lower()) key=lambda x: x[0].lower())
# sort out collapsible modules # sort out collapsable modules
prev_modname = '' prev_modname = ''
num_toplevels = 0 num_toplevels = 0
for modname, (docname, synopsis, platforms, deprecated) in modules: for modname, (docname, synopsis, platforms, deprecated) in modules:

View File

@ -5,18 +5,13 @@ From https://github.com/ryan-roemer/sphinx-bootstrap-theme.
""" """
from os import path from os import path
from sys import version_info as python_version
from sphinx import version_info as sphinx_version import sphinx
from sphinx.locale import _
from sphinx.util.logging import getLogger
__version__ = '1.0.1alpha1' __version__ = '0.5.0'
__version_full__ = __version__ __version_full__ = __version__
logger = getLogger(__name__)
def get_html_theme_path(): def get_html_theme_path():
"""Return list of HTML theme paths.""" """Return list of HTML theme paths."""
@ -24,40 +19,16 @@ def get_html_theme_path():
return cur_dir return cur_dir
def config_initiated(app, config):
theme_options = config.html_theme_options or {}
if theme_options.get('canonical_url'):
logger.warning(
_('The canonical_url option is deprecated, use the html_baseurl option from Sphinx instead.')
)
# See http://www.sphinx-doc.org/en/stable/theming.html#distribute-your-theme-as-a-python-package # See http://www.sphinx-doc.org/en/stable/theming.html#distribute-your-theme-as-a-python-package
def setup(app): def setup(app):
if python_version[0] < 3: if sphinx.version_info >= (1, 6, 0):
logger.warning("Python 2 is deprecated with sphinx_rtd_theme, update to Python 3")
app.require_sphinx('1.6')
if sphinx_version <= (2, 0, 0):
logger.warning("Sphinx 1.x is deprecated with sphinx_rtd_theme, update to Sphinx 2.x or greater")
if not app.config.html_experimental_html5_writer:
logger.warning("'html4_writer' is deprecated with sphinx_rtd_theme")
else:
if app.config.html4_writer:
logger.warning("'html4_writer' is deprecated with sphinx_rtd_theme")
# Register the theme that can be referenced without adding a theme path # Register the theme that can be referenced without adding a theme path
app.add_html_theme('sphinx_rtd_theme', path.abspath(path.dirname(__file__))) app.add_html_theme('sphinx_rtd_theme', path.abspath(path.dirname(__file__)))
if sphinx_version >= (1, 8, 0): if sphinx.version_info >= (1, 8, 0):
# Add Sphinx message catalog for newer versions of Sphinx # Add Sphinx message catalog for newer versions of Sphinx
# See http://www.sphinx-doc.org/en/master/extdev/appapi.html#sphinx.application.Sphinx.add_message_catalog # See http://www.sphinx-doc.org/en/master/extdev/appapi.html#sphinx.application.Sphinx.add_message_catalog
rtd_locale_path = path.join(path.abspath(path.dirname(__file__)), 'locale') rtd_locale_path = path.join(path.abspath(path.dirname(__file__)), 'locale')
app.add_message_catalog('sphinx', rtd_locale_path) app.add_message_catalog('sphinx', rtd_locale_path)
app.connect('config-inited', config_initiated)
# sphinx emits the permalink icon for headers, so choose one more in keeping with our theme
if sphinx_version >= (3, 5, 0):
app.config.html_permalinks_icon = "\uf0c1"
else:
app.config.html_add_permalinks = "\uf0c1"
return {'parallel_read_safe': True, 'parallel_write_safe': True} return {'parallel_read_safe': True, 'parallel_write_safe': True}

View File

@ -1,77 +1,84 @@
{%- if meta is defined and meta is not none %} {# Support for Sphinx 1.3+ page_source_suffix, but don't break old builds. #}
{%- set check_meta = True %}
{%- else %}
{%- set check_meta = False %}
{%- endif %}
{%- if check_meta and 'github_url' in meta %} {% if page_source_suffix %}
{%- set display_github = True %} {% set suffix = page_source_suffix %}
{%- endif %} {% else %}
{% set suffix = source_suffix %}
{% endif %}
{%- if check_meta and 'bitbucket_url' in meta %} {% if meta is defined and meta is not none %}
{%- set display_bitbucket = True %} {% set check_meta = True %}
{%- endif %} {% else %}
{% set check_meta = False %}
{% endif %}
{%- if check_meta and 'gitlab_url' in meta %} {% if check_meta and 'github_url' in meta %}
{%- set display_gitlab = True %} {% set display_github = True %}
{%- endif %} {% endif %}
{%- set display_vcs_links = display_vcs_links if display_vcs_links is defined else True %} {% if check_meta and 'bitbucket_url' in meta %}
{% set display_bitbucket = True %}
{% endif %}
{% if check_meta and 'gitlab_url' in meta %}
{% set display_gitlab = True %}
{% endif %}
{% set display_vcs_links = display_vcs_links if display_vcs_links is defined else True %}
<div role="navigation" aria-label="breadcrumbs navigation">
{#- Translators: This is an ARIA section label for page links, including previous/next page link and links to GitHub/GitLab/etc. -#}
<div role="navigation" aria-label="{{ _('Page navigation') }}">
<ul class="wy-breadcrumbs"> <ul class="wy-breadcrumbs">
{%- block breadcrumbs %} {% block breadcrumbs %}
<li><a href="{{ pathto(master_doc) }}" class="icon icon-home"></a> &raquo;</li> <li><a href="{{ pathto(master_doc) }}" class="icon icon-home"></a> &raquo;</li>
{%- for doc in parents %} {% for doc in parents %}
<li><a href="{{ doc.link|e }}">{{ doc.title }}</a> &raquo;</li> <li><a href="{{ doc.link|e }}">{{ doc.title }}</a> &raquo;</li>
{%- endfor %} {% endfor %}
<li>{{ title }}</li> <li>{{ title }}</li>
{%- endblock %} {% endblock %}
{%- block breadcrumbs_aside %} {% block breadcrumbs_aside %}
<li class="wy-breadcrumbs-aside"> <li class="wy-breadcrumbs-aside">
{%- if hasdoc(pagename) and display_vcs_links %} {% if hasdoc(pagename) and display_vcs_links %}
{%- if display_github %} {% if display_github %}
{%- if check_meta and 'github_url' in meta %} {% if check_meta and 'github_url' in meta %}
<!-- User defined GitHub URL --> <!-- User defined GitHub URL -->
<a href="{{ meta['github_url'] }}" class="fa fa-github"> {{ _('Edit on GitHub') }}</a> <a href="{{ meta['github_url'] }}" class="fa fa-github"> {{ _('Edit on GitHub') }}</a>
{%- else %} {% else %}
<a href="https://{{ github_host|default("github.com") }}/{{ github_user }}/{{ github_repo }}/{{ theme_vcs_pageview_mode or "blob" }}/{{ github_version }}{{ conf_py_path }}{{ pagename }}{{ page_source_suffix }}" class="fa fa-github"> {{ _('Edit on GitHub') }}</a> <a href="https://{{ github_host|default("github.com") }}/{{ github_user }}/{{ github_repo }}/{{ theme_vcs_pageview_mode|default("blob") }}/{{ github_version }}{{ conf_py_path }}{{ pagename }}{{ suffix }}" class="fa fa-github"> {{ _('Edit on GitHub') }}</a>
{%- endif %} {% endif %}
{%- elif display_bitbucket %} {% elif display_bitbucket %}
{%- if check_meta and 'bitbucket_url' in meta %} {% if check_meta and 'bitbucket_url' in meta %}
<!-- User defined Bitbucket URL --> <!-- User defined Bitbucket URL -->
<a href="{{ meta['bitbucket_url'] }}" class="fa fa-bitbucket"> {{ _('Edit on Bitbucket') }}</a> <a href="{{ meta['bitbucket_url'] }}" class="fa fa-bitbucket"> {{ _('Edit on Bitbucket') }}</a>
{%- else %} {% else %}
<a href="https://bitbucket.org/{{ bitbucket_user }}/{{ bitbucket_repo }}/src/{{ bitbucket_version}}{{ conf_py_path }}{{ pagename }}{{ page_source_suffix }}?mode={{ theme_vcs_pageview_mode or "view" }}" class="fa fa-bitbucket"> {{ _('Edit on Bitbucket') }}</a> <a href="https://bitbucket.org/{{ bitbucket_user }}/{{ bitbucket_repo }}/src/{{ bitbucket_version}}{{ conf_py_path }}{{ pagename }}{{ suffix }}?mode={{ theme_vcs_pageview_mode|default("view") }}" class="fa fa-bitbucket"> {{ _('Edit on Bitbucket') }}</a>
{%- endif %} {% endif %}
{%- elif display_gitlab %} {% elif display_gitlab %}
{%- if check_meta and 'gitlab_url' in meta %} {% if check_meta and 'gitlab_url' in meta %}
<!-- User defined GitLab URL --> <!-- User defined GitLab URL -->
<a href="{{ meta['gitlab_url'] }}" class="fa fa-gitlab"> {{ _('Edit on GitLab') }}</a> <a href="{{ meta['gitlab_url'] }}" class="fa fa-gitlab"> {{ _('Edit on GitLab') }}</a>
{%- else %} {% else %}
<a href="https://{{ gitlab_host|default("gitlab.com") }}/{{ gitlab_user }}/{{ gitlab_repo }}/{{ theme_vcs_pageview_mode or "blob" }}/{{ gitlab_version }}{{ conf_py_path }}{{ pagename }}{{ page_source_suffix }}" class="fa fa-gitlab"> {{ _('Edit on GitLab') }}</a> <a href="https://{{ gitlab_host|default("gitlab.com") }}/{{ gitlab_user }}/{{ gitlab_repo }}/{{ theme_vcs_pageview_mode|default("blob") }}/{{ gitlab_version }}{{ conf_py_path }}{{ pagename }}{{ suffix }}" class="fa fa-gitlab"> {{ _('Edit on GitLab') }}</a>
{%- endif %} {% endif %}
{%- elif show_source and source_url_prefix %} {% elif show_source and source_url_prefix %}
<a href="{{ source_url_prefix }}{{ pagename }}{{ page_source_suffix }}">{{ _('View page source') }}</a> <a href="{{ source_url_prefix }}{{ pagename }}{{ suffix }}">{{ _('View page source') }}</a>
{%- elif show_source and has_source and sourcename %} {% elif show_source and has_source and sourcename %}
<a href="{{ pathto('_sources/' + sourcename, true)|e }}" rel="nofollow"> {{ _('View page source') }}</a> <a href="{{ pathto('_sources/' + sourcename, true)|e }}" rel="nofollow"> {{ _('View page source') }}</a>
{%- endif %} {% endif %}
{%- endif %} {% endif %}
</li> </li>
{%- endblock %} {% endblock %}
</ul> </ul>
{%- if (theme_prev_next_buttons_location == 'top' or theme_prev_next_buttons_location == 'both') and (next or prev) %} {% if (theme_prev_next_buttons_location == 'top' or theme_prev_next_buttons_location == 'both') and (next or prev) %}
{#- Translators: This is an ARIA section label for sequential page links, such as previous and next page links. -#} <div class="rst-breadcrumbs-buttons" role="navigation" aria-label="breadcrumb navigation">
<div class="rst-breadcrumbs-buttons" role="navigation" aria-label="{{ _('Sequential page navigation') }}"> {% if next %}
{%- if prev %} <a href="{{ next.link|e }}" class="btn btn-neutral float-right" title="{{ next.title|striptags|e }}" accesskey="n">{{ _('Next') }} <span class="fa fa-arrow-circle-right"></span></a>
<a href="{{ prev.link|e }}" class="btn btn-neutral float-left" title="{{ prev.title|striptags|e }}" accesskey="p"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> {{ _('Previous') }}</a> {% endif %}
{%- endif %} {% if prev %}
{%- if next %} <a href="{{ prev.link|e }}" class="btn btn-neutral float-left" title="{{ prev.title|striptags|e }}" accesskey="p"><span class="fa fa-arrow-circle-left"></span> {{ _('Previous') }}</a>
<a href="{{ next.link|e }}" class="btn btn-neutral float-right" title="{{ next.title|striptags|e }}" accesskey="n">{{ _('Next') }} <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a> {% endif %}
{%- endif %}
</div> </div>
{%- endif %} {% endif %}
<hr/> <hr/>
</div> </div>

View File

@ -1,62 +1,63 @@
<footer> <footer>
{%- if (theme_prev_next_buttons_location == 'bottom' or theme_prev_next_buttons_location == 'both') and (next or prev) %} {% if (theme_prev_next_buttons_location == 'bottom' or theme_prev_next_buttons_location == 'both') and (next or prev) %}
{#- Translators: This is an ARIA section label for the footer section of the page. -#} <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<div class="rst-footer-buttons" role="navigation" aria-label="{{ _('Footer') }}"> {% if next %}
{%- if prev %} <a href="{{ next.link|e }}" class="btn btn-neutral float-right" title="{{ next.title|striptags|e }}" accesskey="n" rel="next">{{ _('Next') }} <span class="fa fa-arrow-circle-right"></span></a>
<a href="{{ prev.link|e }}" class="btn btn-neutral float-left" title="{{ prev.title|striptags|e }}" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> {{ _('Previous') }}</a> {% endif %}
{%- endif %} {% if prev %}
{%- if next %} <a href="{{ prev.link|e }}" class="btn btn-neutral float-left" title="{{ prev.title|striptags|e }}" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> {{ _('Previous') }}</a>
<a href="{{ next.link|e }}" class="btn btn-neutral float-right" title="{{ next.title|striptags|e }}" accesskey="n" rel="next">{{ _('Next') }} <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a> {% endif %}
{%- endif %}
</div> </div>
{%- endif %} {% endif %}
<hr/> <hr/>
<div role="contentinfo"> <div role="contentinfo">
{%- block contentinfo %}
<p> <p>
{%- if show_copyright %} {%- if show_copyright %}
{%- if hasdoc('copyright') %} {%- if hasdoc('copyright') %}
{%- trans path=pathto('copyright'), copyright=copyright|e %}&#169; <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %} {% set path = pathto('copyright') %}
{% set copyright = copyright|e %}
&copy; <a href="{{ path }}">{% trans %}Copyright{% endtrans %}</a> {{ copyright }}
{%- else %} {%- else %}
{%- trans copyright=copyright|e %}&#169; Copyright {{ copyright }}.{% endtrans %} {% set copyright = copyright|e %}
&copy; {% trans %}Copyright{% endtrans %} {{ copyright }}
{%- endif %} {%- endif %}
{%- endif %} {%- endif %}
{%- if build_id and build_url %} {%- if build_id and build_url %}
<span class="build"> <span class="build">
{#- Translators: Build is a noun, not a verb -#} {# Translators: Build is a noun, not a verb #}
{%- trans %}Build{% endtrans -%} {% trans %}Build{% endtrans %}
<a href="{{ build_url }}">{{ build_id }}</a>. <a href="{{ build_url }}">{{ build_id }}</a>.
</span> </span>
{%- elif commit %} {%- elif commit %}
<span class="commit"> <span class="commit">
{#- Translators: the phrase "revision" comes from Git, referring to a commit #} {# Translators: the phrase "revision" comes from Git, referring to a commit #}
{%- trans %}Revision{% endtrans %} <code>{{ commit }}</code>. {% trans %}Revision{% endtrans %} <code>{{ commit }}</code>.
</span> </span>
{%- endif %} {%- endif %}
{%- if last_updated %} {%- if last_updated %}
<span class="lastupdated"> <span class="lastupdated">
{%- trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %} {% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
</span> </span>
{%- endif -%} {%- endif %}
</p> </p>
{%- endblock %}
</div> </div>
{% if show_sphinx %} {%- if show_sphinx %}
{%- set sphinx_web = '<a href="https://www.sphinx-doc.org/">Sphinx</a>' %} {% set sphinx_web = '<a href="https://www.sphinx-doc.org/">Sphinx</a>' %}
{%- set readthedocs_web = '<a href="https://readthedocs.org">Read the Docs</a>' %} {% set readthedocs_web = '<a href="https://readthedocs.org">Read the Docs</a>' %}
{#- Translators: the variable "sphinx_web" is a link to the Sphinx project documentation with the text "Sphinx" #} {# Translators: the variable "sphinx_web" is a link to the Sphinx project documentation with the text "Sphinx" #}
{%- trans sphinx_web=sphinx_web, readthedocs_web=readthedocs_web %}Built with {{ sphinx_web }} using a{% endtrans %} {% trans sphinx_web=sphinx_web, readthedocs_web=readthedocs_web %}Built with {{ sphinx_web }} using a{% endtrans %}
{#- Translators: "theme" refers to a theme for Sphinx, which alters the appearance of the generated documentation #} {# Translators: "theme" refers to a theme for Sphinx, which alters the appearance of the generated documenation #}
<a href="https://github.com/readthedocs/sphinx_rtd_theme">{% trans %}theme{% endtrans %}</a> <a href="https://github.com/readthedocs/sphinx_rtd_theme">{% trans %}theme{% endtrans %}</a>
{#- Translators: this is always used as "provided by Read the Docs", and should not imply Read the Docs is an author of the generated documentation. #} {# Translators: this is always used as "provided by Read the Docs", and should not imply Read the Docs is an author of the generated documentation. #}
{% trans %}provided by {{ readthedocs_web }}{% endtrans %}. {% trans %}provided by {{ readthedocs_web }}{% endtrans %}.
{% endif %} {%- endif %}
{%- block extrafooter %} {% endblock %} {%- block extrafooter %} {% endblock %}
</footer> </footer>

View File

@ -7,27 +7,21 @@
{%- set titlesuffix = "" %} {%- set titlesuffix = "" %}
{%- endif %} {%- endif %}
{%- set lang_attr = 'en' if language == None else (language | replace('_', '-')) %} {%- set lang_attr = 'en' if language == None else (language | replace('_', '-')) %}
{%- set sphinx_writer = 'writer-html5' if html5_doctype else 'writer-html4' -%} {%- set sphinx_writer = 'writer-html5' if html5_doctype else 'writer-html4' %}
{# Build sphinx_version_info tuple from sphinx_version string in pure Jinja #}
{%- set (_ver_major, _ver_minor, _ver_bugfix) = sphinx_version.split('.') | map('int') -%}
{%- set sphinx_version_info = (_ver_major, _ver_minor, _ver_bugfix) -%}
<!DOCTYPE html> <!DOCTYPE html>
<html class="{{ sphinx_writer }}" lang="{{ lang_attr }}" > <html class="{{ sphinx_writer }}" lang="{{ lang_attr }}" >
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8">
{{- metatags }} {{ metatags }}
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0">
{%- block htmltitle %} {% block htmltitle %}
<title>{{ title|striptags|e }}{{ titlesuffix }}</title> <title>{{ title|striptags|e }}{{ titlesuffix }}</title>
{%- endblock -%} {% endblock %}
{#- CSS #} {# CSS #}
{%- if sphinx_version_info < (4, 0) -%}
<link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" /> <link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
<link rel="stylesheet" href="{{ pathto('_static/pygments.css', 1) }}" type="text/css" /> <link rel="stylesheet" href="{{ pathto('_static/pygments.css', 1) }}" type="text/css" />
{%- endif %}
{%- for css in css_files %} {%- for css in css_files %}
{%- if css|attr("rel") %} {%- if css|attr("rel") %}
<link rel="{{ css.rel }}" href="{{ pathto(css.filename, 1) }}" type="text/css"{% if css.title is not none %} title="{{ css.title }}"{% endif %} /> <link rel="{{ css.rel }}" href="{{ pathto(css.filename, 1) }}" type="text/css"{% if css.title is not none %} title="{{ css.title }}"{% endif %} />
@ -38,43 +32,31 @@
{%- for cssfile in extra_css_files %} {%- for cssfile in extra_css_files %}
<link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" /> <link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
{%- endfor -%} {%- endfor %}
{#- FAVICON #} {# FAVICON #}
{%- if favicon %} {% if favicon %}
{%- if sphinx_version_info < (4, 0) -%}
<link rel="shortcut icon" href="{{ pathto('_static/' + favicon, 1) }}"/> <link rel="shortcut icon" href="{{ pathto('_static/' + favicon, 1) }}"/>
{%- else %} {% endif %}
<link rel="shortcut icon" href="{{ favicon_url }}"/> {# CANONICAL URL #}
{%- endif %} {% if theme_canonical_url %}
{%- endif -%}
{#- CANONICAL URL (deprecated) #}
{%- if theme_canonical_url and not pageurl %}
<link rel="canonical" href="{{ theme_canonical_url }}{{ pagename }}.html"/> <link rel="canonical" href="{{ theme_canonical_url }}{{ pagename }}.html"/>
{%- endif -%} {% endif %}
{#- CANONICAL URL #} {# JAVASCRIPTS #}
{%- if pageurl %}
<link rel="canonical" href="{{ pageurl|e }}" />
{%- endif -%}
{#- JAVASCRIPTS #}
{%- block scripts %} {%- block scripts %}
<!--[if lt IE 9]> <!--[if lt IE 9]>
<script src="{{ pathto('_static/js/html5shiv.min.js', 1) }}"></script> <script src="{{ pathto('_static/js/html5shiv.min.js', 1) }}"></script>
<![endif]--> <![endif]-->
{%- if not embedded %} {%- if not embedded %}
{# XXX Sphinx 1.8.0 made this an external js-file, quick fix until we refactor the template to inherert more blocks directly from sphinx #} {# XXX Sphinx 1.8.0 made this an external js-file, quick fix until we refactor the template to inherert more blocks directly from sphinx #}
{%- if sphinx_version_info >= (1, 8) -%} {% if sphinx_version >= "1.8.0" %}
{%- if sphinx_version_info < (4, 0) -%} <script type="text/javascript" id="documentation_options" data-url_root="{{ pathto('', 1) }}" src="{{ pathto('_static/documentation_options.js', 1) }}"></script>
<script id="documentation_options" data-url_root="{{ url_root }}" src="{{ pathto('_static/documentation_options.js', 1) }}"></script>
{%- endif -%}
{%- for scriptfile in script_files %} {%- for scriptfile in script_files %}
{{ js_tag(scriptfile) }} {{ js_tag(scriptfile) }}
{%- endfor %} {%- endfor %}
{%- else %} {% else %}
<script> <script type="text/javascript">
var DOCUMENTATION_OPTIONS = { var DOCUMENTATION_OPTIONS = {
URL_ROOT:'{{ url_root }}', URL_ROOT:'{{ url_root }}',
VERSION:'{{ release|e }}', VERSION:'{{ release|e }}',
@ -86,12 +68,12 @@
}; };
</script> </script>
{%- for scriptfile in script_files %} {%- for scriptfile in script_files %}
<script src="{{ pathto(scriptfile, 1) }}"></script> <script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
{%- endfor %} {%- endfor %}
{%- endif %} {% endif %}
<script src="{{ pathto('_static/js/theme.js', 1) }}"></script> <script type="text/javascript" src="{{ pathto('_static/js/theme.js', 1) }}"></script>
{#- OPENSEARCH #} {# OPENSEARCH #}
{%- if use_opensearch %} {%- if use_opensearch %}
<link rel="search" type="application/opensearchdescription+xml" <link rel="search" type="application/opensearchdescription+xml"
title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}" title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}"
@ -125,131 +107,133 @@
<body class="wy-body-for-nav"> <body class="wy-body-for-nav">
{%- block extrabody %} {% endblock %} {% block extrabody %} {% endblock %}
<div class="wy-grid-for-nav"> <div class="wy-grid-for-nav">
{#- SIDE NAV, TOGGLES ON MOBILE #} {# SIDE NAV, TOGGLES ON MOBILE #}
<nav data-toggle="wy-nav-shift" class="wy-nav-side"> <nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll"> <div class="wy-side-scroll">
<div class="wy-side-nav-search" {% if theme_style_nav_header_background %} style="background: {{theme_style_nav_header_background}}" {% endif %}> <div class="wy-side-nav-search" {% if theme_style_nav_header_background %} style="background: {{theme_style_nav_header_background}}" {% endif %}>
{%- block sidebartitle %} {% block sidebartitle %}
{%- if logo and theme_logo_only %} {% if logo and theme_logo_only %}
<a href="{{ pathto(master_doc) }}"> <a href="{{ pathto(master_doc) }}">
{%- else %} {% else %}
<a href="{{ pathto(master_doc) }}" class="icon icon-home"> {{ project }} <a href="{{ pathto(master_doc) }}" class="icon icon-home"> {{ project }}
{%- endif %} {% endif %}
{%- if logo %} {% if logo %}
{#- Not strictly valid HTML, but it's the only way to display/scale {# Not strictly valid HTML, but it's the only way to display/scale
it properly, without weird scripting or heaps of work it properly, without weird scripting or heaps of work
#} #}
{%- if sphinx_version_info < (4, 0) -%}
<img src="{{ pathto('_static/' + logo, 1) }}" class="logo" alt="{{ _('Logo') }}"/> <img src="{{ pathto('_static/' + logo, 1) }}" class="logo" alt="{{ _('Logo') }}"/>
{%- else %} {% endif %}
<img src="{{ logo_url }}" class="logo" alt="{{ _('Logo') }}"/>
{%- endif %}
{%- endif %}
</a> </a>
{%- if theme_display_version %} {% if theme_display_version %}
{%- set nav_version = version %} {%- set nav_version = version %}
{%- if READTHEDOCS and current_version %} {% if READTHEDOCS and current_version %}
{%- set nav_version = current_version %} {%- set nav_version = current_version %}
{%- endif %} {% endif %}
{%- if nav_version %} {% if nav_version %}
<div class="version"> <div class="version">
{{ nav_version }} {{ nav_version }}
</div> </div>
{%- endif %} {% endif %}
{%- endif %} {% endif %}
{%- include "searchbox.html" %} {% include "searchbox.html" %}
{%- endblock %} {% endblock %}
</div> </div>
{%- block navigation %} {% block navigation %}
{#- Translators: This is an ARIA section label for the main navigation menu -#} <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="{{ _('Navigation menu') }}"> {% block menu %}
{%- block menu %} {#
{%- set toctree = toctree(maxdepth=theme_navigation_depth|int, The singlehtml builder doesn't handle this toctree call when the
toctree is empty. Skip building this for now.
#}
{% if 'singlehtml' not in builder %}
{% set global_toc = toctree(maxdepth=theme_navigation_depth|int,
collapse=theme_collapse_navigation|tobool, collapse=theme_collapse_navigation|tobool,
includehidden=theme_includehidden|tobool, includehidden=theme_includehidden|tobool,
titles_only=theme_titles_only|tobool) %} titles_only=theme_titles_only|tobool) %}
{%- if toctree %} {% endif %}
{{ toctree }} {% if global_toc %}
{%- else %} {{ global_toc }}
{% else %}
<!-- Local TOC --> <!-- Local TOC -->
<div class="local-toc">{{ toc }}</div> <div class="local-toc">{{ toc }}</div>
{%- endif %} {% endif %}
{%- endblock %} {% endblock %}
</div> </div>
{%- endblock %} {% endblock %}
</div> </div>
</nav> </nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
{#- MOBILE NAV, TRIGGLES SIDE NAV ON TOGGLE #} {# MOBILE NAV, TRIGGLES SIDE NAV ON TOGGLE #}
{#- Translators: This is an ARIA section label for the navigation menu that is visible when viewing the page on mobile devices -#} <nav class="wy-nav-top" aria-label="top navigation">
<nav class="wy-nav-top" aria-label="{{ _('Mobile navigation menu') }}" {% if theme_style_nav_header_background %} style="background: {{theme_style_nav_header_background}}" {% endif %}> {% block mobile_nav %}
{%- block mobile_nav %}
<i data-toggle="wy-nav-top" class="fa fa-bars"></i> <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="{{ pathto(master_doc) }}">{{ project }}</a> <a href="{{ pathto(master_doc) }}">{{ project }}</a>
{%- endblock %} {% endblock %}
</nav> </nav>
<div class="wy-nav-content"> <div class="wy-nav-content">
{%- block content %} {%- block content %}
{%- if theme_style_external_links|tobool %} {% if theme_style_external_links|tobool %}
<div class="rst-content style-external-links"> <div class="rst-content style-external-links">
{%- else %} {% else %}
<div class="rst-content"> <div class="rst-content">
{%- endif %} {% endif %}
{% include "breadcrumbs.html" %} {% include "breadcrumbs.html" %}
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
{%- block document %} {%- block document %}
<div itemprop="articleBody"> <div itemprop="articleBody">
{% block body %}{% endblock %} {% block body %}{% endblock %}
</div> </div>
{%- if self.comments()|trim %} {% if self.comments()|trim %}
<div class="articleComments"> <div class="articleComments">
{%- block comments %}{% endblock %} {% block comments %}{% endblock %}
</div> </div>
{%- endif%} {% endif%}
</div> </div>
{%- endblock %} {%- endblock %}
{% include "footer.html" %} {% include "footer.html" %}
</div> </div>
{%- endblock %} {%- endblock %}
</div> </div>
</section>
</div>
{% include "versions.html" -%}
<script> </section>
</div>
{% include "versions.html" %}
<script type="text/javascript">
jQuery(function () { jQuery(function () {
SphinxRtdTheme.Navigation.enable({{ 'true' if theme_sticky_navigation|tobool else 'false' }}); SphinxRtdTheme.Navigation.enable({{ 'true' if theme_sticky_navigation|tobool else 'false' }});
}); });
</script> </script>
{#- Do not conflict with RTD insertion of analytics script #} {# Do not conflict with RTD insertion of analytics script #}
{%- if not READTHEDOCS %} {% if not READTHEDOCS %}
{%- if theme_analytics_id %} {% if theme_analytics_id %}
<!-- Theme Analytics --> <!-- Theme Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id={{ theme_analytics_id }}"></script>
<script> <script>
window.dataLayer = window.dataLayer || []; (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
function gtag(){dataLayer.push(arguments);} (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
gtag('js', new Date()); m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
gtag('config', '{{ theme_analytics_id }}', { ga('create', '{{ theme_analytics_id }}', 'auto');
'anonymize_ip': {{ 'true' if theme_analytics_anonymize_ip|tobool else 'false' }}, ga('send', 'pageview');
});
</script> </script>
{%- endif %} {% endif %}
{%- endif %} {% endif %}
{%- block footer %} {% endblock %} {%- block footer %} {% endblock %}

View File

@ -11,7 +11,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n" "Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-09-13 13:35-0600\n" "POT-Creation-Date: 2020-05-06 13:38-0600\n"
"PO-Revision-Date: 2019-07-16 21:44+0000\n" "PO-Revision-Date: 2019-07-16 21:44+0000\n"
"Last-Translator: Tom Kunze <transifex.com@tomabrafix.de>, 2019\n" "Last-Translator: Tom Kunze <transifex.com@tomabrafix.de>, 2019\n"
"Language-Team: German (https://www.transifex.com/readthedocs/teams/101354/de/)\n" "Language-Team: German (https://www.transifex.com/readthedocs/teams/101354/de/)\n"
@ -22,32 +22,37 @@ msgstr ""
"Language: de\n" "Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39 #: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
msgid "Edit on GitHub" msgid "Edit on GitHub"
msgstr "Auf GitHub bearbeiten" msgstr "Auf GitHub bearbeiten"
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46 #: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
msgid "Edit on Bitbucket" msgid "Edit on Bitbucket"
msgstr "Auf Bitbucket bearbeiten" msgstr "Auf Bitbucket bearbeiten"
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53 #: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
msgid "Edit on GitLab" msgid "Edit on GitLab"
msgstr "Auf GitLab bearbeiten" msgstr "Auf GitLab bearbeiten"
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58 #: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
msgid "View page source" msgid "View page source"
msgstr "Quelltext anzeigen" msgstr "Quelltext anzeigen"
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6 #: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
msgid "Previous"
msgstr "Zurück"
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
msgid "Next" msgid "Next"
msgstr "Weiter" msgstr "Weiter"
#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
msgid "Previous"
msgstr "Zurück"
#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
#: sphinx_rtd_theme/layout.html:96
msgid "Copyright"
msgstr "Copyright"
#. Build is a noun, not a verb #. Build is a noun, not a verb
#: sphinx_rtd_theme/footer.html:30 #: sphinx_rtd_theme/footer.html:31
msgid "Build" msgid "Build"
msgstr "Build" msgstr "Build"
@ -59,53 +64,49 @@ msgstr "Zuletzt aktualisiert am %(last_updated)s."
#. the variable "sphinx_web" is a link to the Sphinx project documentation #. the variable "sphinx_web" is a link to the Sphinx project documentation
#. with #. with
#. the text "Sphinx" #. the text "Sphinx"
#: sphinx_rtd_theme/footer.html:53 #: sphinx_rtd_theme/footer.html:52
#, python-format #, python-format
msgid "Built with %(sphinx_web)s using a" msgid "Built with %(sphinx_web)s using a"
msgstr "Erstellt mit %(sphinx_web)s mit einem" msgstr "Erstellt mit %(sphinx_web)s mit einem"
#. this is always used as "provided by Read the Docs", and should not imply #. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation. #. Read the Docs is an author of the generated documentation.
#: sphinx_rtd_theme/footer.html:57 #: sphinx_rtd_theme/footer.html:56
#, python-format #, python-format
msgid "provided by %(readthedocs_web)s" msgid "provided by %(readthedocs_web)s"
msgstr "bereitgestellt von %(readthedocs_web)s" msgstr "bereitgestellt von %(readthedocs_web)s"
#: sphinx_rtd_theme/layout.html:97 #: sphinx_rtd_theme/layout.html:79
#, python-format #, python-format
msgid "Search within %(docstitle)s" msgid "Search within %(docstitle)s"
msgstr "%(docstitle)s durchsuchen" msgstr "%(docstitle)s durchsuchen"
#: sphinx_rtd_theme/layout.html:105 #: sphinx_rtd_theme/layout.html:87
msgid "About these documents" msgid "About these documents"
msgstr "Über diese Dokumentation" msgstr "Über diese Dokumentation"
#: sphinx_rtd_theme/layout.html:108 #: sphinx_rtd_theme/layout.html:90
msgid "Index" msgid "Index"
msgstr "Index" msgstr "Index"
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11 #: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
msgid "Search" msgid "Search"
msgstr "Suche" msgstr "Suche"
#: sphinx_rtd_theme/layout.html:114 #: sphinx_rtd_theme/layout.html:128
msgid "Copyright"
msgstr "Copyright"
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
msgid "Logo" msgid "Logo"
msgstr "Logo" msgstr "Logo"
#: sphinx_rtd_theme/search.html:31 #: sphinx_rtd_theme/search.html:29
msgid "Please activate JavaScript to enable the search functionality." msgid "Please activate JavaScript to enable the search functionality."
msgstr "Bitte aktiviere JavaScript, um die Suchfunktion zu nutzen." msgstr "Bitte aktiviere JavaScript, um die Suchfunktion zu nutzen."
#. Search is a noun, not a verb #. Search is a noun, not a verb
#: sphinx_rtd_theme/search.html:39 #: sphinx_rtd_theme/search.html:37
msgid "Search Results" msgid "Search Results"
msgstr "Suchergebnisse" msgstr "Suchergebnisse"
#: sphinx_rtd_theme/search.html:41 #: sphinx_rtd_theme/search.html:39
msgid "" msgid ""
"Your search did not match any documents. Please make sure that all words are" "Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories." " spelled correctly and that you've selected enough categories."
@ -118,7 +119,7 @@ msgstr ""
msgid "Search docs" msgid "Search docs"
msgstr "Dokumentation durchsuchen" msgstr "Dokumentation durchsuchen"
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11 #: sphinx_rtd_theme/versions.html:11
msgid "Versions" msgid "Versions"
msgstr "Versionen" msgstr "Versionen"
@ -134,3 +135,9 @@ msgstr "Projektübersicht"
#: sphinx_rtd_theme/versions.html:29 #: sphinx_rtd_theme/versions.html:29
msgid "Builds" msgid "Builds"
msgstr "Builds" msgstr "Builds"
#~ msgid "Docs"
#~ msgstr "Dokumentation"
#~ msgid "Free document hosting provided by"
#~ msgstr "Kostenloses Dokumentationen-Hosting zur Verfügung gestellt von"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n" "Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-09-13 13:35-0600\n" "POT-Creation-Date: 2020-05-06 13:38-0600\n"
"PO-Revision-Date: 2019-07-16 15:43-0600\n" "PO-Revision-Date: 2019-07-16 15:43-0600\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: en\n" "Language: en\n"
@ -19,64 +19,42 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.8.0\n" "Generated-By: Babel 2.8.0\n"
#. This is an ARIA section label for page links, including previous/next page #: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
#. link and links to GitHub/GitLab/etc.
#: sphinx_rtd_theme/breadcrumbs.html:22
msgid "Page navigation"
msgstr ""
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
msgid "Edit on GitHub" msgid "Edit on GitHub"
msgstr "" msgstr ""
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46 #: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
msgid "Edit on Bitbucket" msgid "Edit on Bitbucket"
msgstr "" msgstr ""
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53 #: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
msgid "Edit on GitLab" msgid "Edit on GitLab"
msgstr "" msgstr ""
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58 #: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
msgid "View page source" msgid "View page source"
msgstr "" msgstr ""
#. This is an ARIA section label for sequential page links, such as previous #: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
#. and next page links.
#: sphinx_rtd_theme/breadcrumbs.html:67
msgid "Sequential page navigation"
msgstr ""
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
msgid "Previous"
msgstr ""
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
msgid "Next" msgid "Next"
msgstr "" msgstr ""
#. This is an ARIA section label for the footer section of the page. #: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
#: sphinx_rtd_theme/footer.html:4 msgid "Previous"
msgid "Footer"
msgstr "" msgstr ""
#: sphinx_rtd_theme/footer.html:21 #: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
#, python-format #: sphinx_rtd_theme/layout.html:96
msgid "&#169; <a href=\"%(path)s\">Copyright</a> %(copyright)s." msgid "Copyright"
msgstr ""
#: sphinx_rtd_theme/footer.html:23
#, python-format
msgid "&#169; Copyright %(copyright)s."
msgstr "" msgstr ""
#. Build is a noun, not a verb #. Build is a noun, not a verb
#: sphinx_rtd_theme/footer.html:30 #: sphinx_rtd_theme/footer.html:31
msgid "Build" msgid "Build"
msgstr "" msgstr ""
#. the phrase "revision" comes from Git, referring to a commit #. the phrase "revision" comes from Git, referring to a commit
#: sphinx_rtd_theme/footer.html:36 #: sphinx_rtd_theme/footer.html:37
msgid "Revision" msgid "Revision"
msgstr "" msgstr ""
@ -87,70 +65,59 @@ msgstr ""
#. the variable "sphinx_web" is a link to the Sphinx project documentation with #. the variable "sphinx_web" is a link to the Sphinx project documentation with
#. the text "Sphinx" #. the text "Sphinx"
#: sphinx_rtd_theme/footer.html:53 #: sphinx_rtd_theme/footer.html:52
#, python-format #, python-format
msgid "Built with %(sphinx_web)s using a" msgid "Built with %(sphinx_web)s using a"
msgstr "" msgstr ""
#. "theme" refers to a theme for Sphinx, which alters the appearance of the #. "theme" refers to a theme for Sphinx, which alters the appearance of the
#. generated documentation #. generated documenation
#: sphinx_rtd_theme/footer.html:55 #: sphinx_rtd_theme/footer.html:54
msgid "theme" msgid "theme"
msgstr "" msgstr ""
#. this is always used as "provided by Read the Docs", and should not imply #. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation. #. Read the Docs is an author of the generated documentation.
#: sphinx_rtd_theme/footer.html:57 #: sphinx_rtd_theme/footer.html:56
#, python-format #, python-format
msgid "provided by %(readthedocs_web)s" msgid "provided by %(readthedocs_web)s"
msgstr "" msgstr ""
#: sphinx_rtd_theme/layout.html:97 #: sphinx_rtd_theme/layout.html:79
#, python-format #, python-format
msgid "Search within %(docstitle)s" msgid "Search within %(docstitle)s"
msgstr "" msgstr ""
#: sphinx_rtd_theme/layout.html:105 #: sphinx_rtd_theme/layout.html:87
msgid "About these documents" msgid "About these documents"
msgstr "" msgstr ""
#: sphinx_rtd_theme/layout.html:108 #: sphinx_rtd_theme/layout.html:90
msgid "Index" msgid "Index"
msgstr "" msgstr ""
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11 #: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
msgid "Search" msgid "Search"
msgstr "" msgstr ""
#: sphinx_rtd_theme/layout.html:114 #: sphinx_rtd_theme/layout.html:121
msgid "Copyright" msgid "Documentation Home"
msgstr "" msgstr ""
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149 #: sphinx_rtd_theme/layout.html:128
msgid "Logo" msgid "Logo"
msgstr "" msgstr ""
#. This is an ARIA section label for the main navigation menu #: sphinx_rtd_theme/search.html:29
#: sphinx_rtd_theme/layout.html:173
msgid "Navigation menu"
msgstr ""
#. This is an ARIA section label for the navigation menu that is visible when
#. viewing the page on mobile devices
#: sphinx_rtd_theme/layout.html:195
msgid "Mobile navigation menu"
msgstr ""
#: sphinx_rtd_theme/search.html:31
msgid "Please activate JavaScript to enable the search functionality." msgid "Please activate JavaScript to enable the search functionality."
msgstr "" msgstr ""
#. Search is a noun, not a verb #. Search is a noun, not a verb
#: sphinx_rtd_theme/search.html:39 #: sphinx_rtd_theme/search.html:37
msgid "Search Results" msgid "Search Results"
msgstr "" msgstr ""
#: sphinx_rtd_theme/search.html:41 #: sphinx_rtd_theme/search.html:39
msgid "" msgid ""
"Your search did not match any documents. Please make sure that all words " "Your search did not match any documents. Please make sure that all words "
"are spelled correctly and that you've selected enough categories." "are spelled correctly and that you've selected enough categories."
@ -160,7 +127,7 @@ msgstr ""
msgid "Search docs" msgid "Search docs"
msgstr "" msgstr ""
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11 #: sphinx_rtd_theme/versions.html:11
msgid "Versions" msgid "Versions"
msgstr "" msgstr ""
@ -187,15 +154,3 @@ msgstr ""
#~ msgid "Free document hosting provided by" #~ msgid "Free document hosting provided by"
#~ msgstr "" #~ msgstr ""
#~ msgid "Documentation Home"
#~ msgstr ""
#~ msgid "Breadcrumbs"
#~ msgstr ""
#~ msgid "Main"
#~ msgstr ""
#~ msgid "Top"
#~ msgstr ""

View File

@ -6,15 +6,15 @@
# #
# Translators: # Translators:
# Anthony <aj@ohess.org>, 2019 # Anthony <aj@ohess.org>, 2019
# Radina Matic <radina.matic@gmail.com>, 2021 # Leonardo J. Caballero G. <leonardocaballero@gmail.com>, 2020
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n" "Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-09-13 13:35-0600\n" "POT-Creation-Date: 2020-05-06 13:38-0600\n"
"PO-Revision-Date: 2019-07-16 21:44+0000\n" "PO-Revision-Date: 2019-07-16 21:44+0000\n"
"Last-Translator: Radina Matic <radina.matic@gmail.com>, 2021\n" "Last-Translator: Leonardo J. Caballero G. <leonardocaballero@gmail.com>, 2020\n"
"Language-Team: Spanish (https://www.transifex.com/readthedocs/teams/101354/es/)\n" "Language-Team: Spanish (https://www.transifex.com/readthedocs/teams/101354/es/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -23,117 +23,107 @@ msgstr ""
"Language: es\n" "Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39 #: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
msgid "Edit on GitHub" msgid "Edit on GitHub"
msgstr "Editar en GitHub" msgstr "Editar en GitHub"
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46 #: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
msgid "Edit on Bitbucket" msgid "Edit on Bitbucket"
msgstr "Editar en Bitbucket" msgstr "Editar en Bitbucket"
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53 #: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
msgid "Edit on GitLab" msgid "Edit on GitLab"
msgstr "Editar en GitLab" msgstr "Editar en GitLab"
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58 #: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
msgid "View page source" msgid "View page source"
msgstr "Ver código fuente de la página" msgstr "Ver código fuente de la página"
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6 #: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
msgid "Previous"
msgstr "Anterior"
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
msgid "Next" msgid "Next"
msgstr "Siguiente" msgstr "Siguiente"
#. This is an ARIA section label for the footer section of the page. #: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
#: sphinx_rtd_theme/footer.html:4 msgid "Previous"
msgid "Footer" msgstr "Anterior"
msgstr "Pie de página"
#: sphinx_rtd_theme/footer.html:21 #: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
#, python-format #: sphinx_rtd_theme/layout.html:96
msgid "&#169; <a href=\"%(path)s\">Copyright</a> %(copyright)s." msgid "Copyright"
msgstr "&#169; <a href=\"%(path)s\">Derechos de autor</a> %(copyright)s." msgstr "Derechos de autor"
#: sphinx_rtd_theme/footer.html:23
#, python-format
msgid "&#169; Copyright %(copyright)s."
msgstr "&#169; Derechos de autor %(copyright)s."
#. Build is a noun, not a verb #. Build is a noun, not a verb
#: sphinx_rtd_theme/footer.html:30 #: sphinx_rtd_theme/footer.html:31
msgid "Build" msgid "Build"
msgstr "Compilación" msgstr "Construido"
#. the phrase "revision" comes from Git, referring to a commit #. the phrase "revision" comes from Git, referring to a commit
#: sphinx_rtd_theme/footer.html:36 #: sphinx_rtd_theme/footer.html:37
msgid "Revision" msgid "Revision"
msgstr "Revisión" msgstr "Revisión"
#: sphinx_rtd_theme/footer.html:41 #: sphinx_rtd_theme/footer.html:41
#, python-format #, python-format
msgid "Last updated on %(last_updated)s." msgid "Last updated on %(last_updated)s."
msgstr "Actualizado por última vez el %(last_updated)s." msgstr "Actualizado por última vez en %(last_updated)s."
#. the variable "sphinx_web" is a link to the Sphinx project documentation #. the variable "sphinx_web" is a link to the Sphinx project documentation
#. with #. with
#. the text "Sphinx" #. the text "Sphinx"
#: sphinx_rtd_theme/footer.html:53 #: sphinx_rtd_theme/footer.html:52
#, python-format #, python-format
msgid "Built with %(sphinx_web)s using a" msgid "Built with %(sphinx_web)s using a"
msgstr "Compilado con %(sphinx_web)s usando un" msgstr "Construido con %(sphinx_web)s usando un"
#. "theme" refers to a theme for Sphinx, which alters the appearance of the #. "theme" refers to a theme for Sphinx, which alters the appearance of the
#. generated documentation #. generated documenation
#: sphinx_rtd_theme/footer.html:55 #: sphinx_rtd_theme/footer.html:54
msgid "theme" msgid "theme"
msgstr "tema" msgstr "tema"
#. this is always used as "provided by Read the Docs", and should not imply #. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation. #. Read the Docs is an author of the generated documentation.
#: sphinx_rtd_theme/footer.html:57 #: sphinx_rtd_theme/footer.html:56
#, python-format #, python-format
msgid "provided by %(readthedocs_web)s" msgid "provided by %(readthedocs_web)s"
msgstr "proporcionado por %(readthedocs_web)s" msgstr "proporcionado por %(readthedocs_web)s"
#: sphinx_rtd_theme/layout.html:97 #: sphinx_rtd_theme/layout.html:79
#, python-format #, python-format
msgid "Search within %(docstitle)s" msgid "Search within %(docstitle)s"
msgstr "Buscar en %(docstitle)s" msgstr "Buscar en %(docstitle)s"
#: sphinx_rtd_theme/layout.html:105 #: sphinx_rtd_theme/layout.html:87
msgid "About these documents" msgid "About these documents"
msgstr "Sobre esta documentación" msgstr "Sobre esta documentación"
#: sphinx_rtd_theme/layout.html:108 #: sphinx_rtd_theme/layout.html:90
msgid "Index" msgid "Index"
msgstr "Índice" msgstr "Índice"
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11 #: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
msgid "Search" msgid "Search"
msgstr "Búsqueda" msgstr "Búsqueda"
#: sphinx_rtd_theme/layout.html:114 #: sphinx_rtd_theme/layout.html:121
msgid "Copyright" msgid "Documentation Home"
msgstr "Derechos de autor" msgstr "Inicio de Documentación"
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149 #: sphinx_rtd_theme/layout.html:128
msgid "Logo" msgid "Logo"
msgstr "Logotipo" msgstr "Logotipo"
#: sphinx_rtd_theme/search.html:31 #: sphinx_rtd_theme/search.html:29
msgid "Please activate JavaScript to enable the search functionality." msgid "Please activate JavaScript to enable the search functionality."
msgstr "" msgstr ""
"Por favor, active JavaScript para habilitar la funcionalidad de búsqueda." "Por favor, active JavaScript para habilitar la funcionalidad de búsqueda."
#. Search is a noun, not a verb #. Search is a noun, not a verb
#: sphinx_rtd_theme/search.html:39 #: sphinx_rtd_theme/search.html:37
msgid "Search Results" msgid "Search Results"
msgstr "Resultados de la búsqueda" msgstr "Resultados de la búsqueda"
#: sphinx_rtd_theme/search.html:41 #: sphinx_rtd_theme/search.html:39
msgid "" msgid ""
"Your search did not match any documents. Please make sure that all words are" "Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories." " spelled correctly and that you've selected enough categories."
@ -146,7 +136,7 @@ msgstr ""
msgid "Search docs" msgid "Search docs"
msgstr "Buscar documentos" msgstr "Buscar documentos"
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11 #: sphinx_rtd_theme/versions.html:11
msgid "Versions" msgid "Versions"
msgstr "Versiones" msgstr "Versiones"
@ -165,4 +155,10 @@ msgstr "Página de Proyecto"
#: sphinx_rtd_theme/versions.html:29 #: sphinx_rtd_theme/versions.html:29
msgid "Builds" msgid "Builds"
msgstr "Compilaciones" msgstr "Construcciones"
#~ msgid "Docs"
#~ msgstr "Documentos"
#~ msgid "Free document hosting provided by"
#~ msgstr "Alojamiento gratuito de documentos proporcionado por"

View File

@ -6,15 +6,15 @@
# #
# Translators: # Translators:
# Anthony <aj@ohess.org>, 2020 # Anthony <aj@ohess.org>, 2020
# Ivar Smolin <okul@linux.ee>, 2021 # Ivar Smolin <okul@linux.ee>, 2020
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n" "Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-09-13 13:35-0600\n" "POT-Creation-Date: 2020-05-06 13:38-0600\n"
"PO-Revision-Date: 2019-07-16 21:44+0000\n" "PO-Revision-Date: 2019-07-16 21:44+0000\n"
"Last-Translator: Ivar Smolin <okul@linux.ee>, 2021\n" "Last-Translator: Ivar Smolin <okul@linux.ee>, 2020\n"
"Language-Team: Estonian (https://www.transifex.com/readthedocs/teams/101354/et/)\n" "Language-Team: Estonian (https://www.transifex.com/readthedocs/teams/101354/et/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -23,52 +23,42 @@ msgstr ""
"Language: et\n" "Language: et\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39 #: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
msgid "Edit on GitHub" msgid "Edit on GitHub"
msgstr "Muuda GitHubis" msgstr "Muuda GitHubis"
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46 #: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
msgid "Edit on Bitbucket" msgid "Edit on Bitbucket"
msgstr "Muuda Bitbucketis" msgstr "Muuda Bitbucketis"
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53 #: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
msgid "Edit on GitLab" msgid "Edit on GitLab"
msgstr "Muuda GitLabis" msgstr "Muuda GitLabis"
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58 #: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
msgid "View page source" msgid "View page source"
msgstr "Vaata lehe lähtekoodi" msgstr "Vaata lehe lähtekoodi"
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6 #: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
msgid "Previous"
msgstr "Eelmine"
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
msgid "Next" msgid "Next"
msgstr "Järgmine" msgstr "Järgmine"
#. This is an ARIA section label for the footer section of the page. #: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
#: sphinx_rtd_theme/footer.html:4 msgid "Previous"
msgid "Footer" msgstr "Eelmine"
msgstr "Jalus"
#: sphinx_rtd_theme/footer.html:21 #: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
#, python-format #: sphinx_rtd_theme/layout.html:96
msgid "&#169; <a href=\"%(path)s\">Copyright</a> %(copyright)s." msgid "Copyright"
msgstr "&#169; <a href=\"%(path)s\">Autoriõigus</a> %(copyright)s." msgstr "Autoriõigus"
#: sphinx_rtd_theme/footer.html:23
#, python-format
msgid "&#169; Copyright %(copyright)s."
msgstr "&#169; Autoriõigus %(copyright)s."
#. Build is a noun, not a verb #. Build is a noun, not a verb
#: sphinx_rtd_theme/footer.html:30 #: sphinx_rtd_theme/footer.html:31
msgid "Build" msgid "Build"
msgstr "Ehitus" msgstr "Ehitus"
#. the phrase "revision" comes from Git, referring to a commit #. the phrase "revision" comes from Git, referring to a commit
#: sphinx_rtd_theme/footer.html:36 #: sphinx_rtd_theme/footer.html:37
msgid "Revision" msgid "Revision"
msgstr "Redaktsioon" msgstr "Redaktsioon"
@ -80,59 +70,52 @@ msgstr "Viimati uuendatud %(last_updated)s."
#. the variable "sphinx_web" is a link to the Sphinx project documentation #. the variable "sphinx_web" is a link to the Sphinx project documentation
#. with #. with
#. the text "Sphinx" #. the text "Sphinx"
#: sphinx_rtd_theme/footer.html:53 #: sphinx_rtd_theme/footer.html:52
#, python-format #, python-format
msgid "Built with %(sphinx_web)s using a" msgid "Built with %(sphinx_web)s using a"
msgstr "Ehitatud %(sphinx_web)s'iga," msgstr "Ehitatud %(sphinx_web)s'iga,"
#. "theme" refers to a theme for Sphinx, which alters the appearance of the #. "theme" refers to a theme for Sphinx, which alters the appearance of the
#. generated documenation #. generated documenation
#: sphinx_rtd_theme/footer.html:55 #: sphinx_rtd_theme/footer.html:54
msgid "theme" msgid "theme"
msgstr "kujundusteema" msgstr "kujundusteema"
#. this is always used as "provided by Read the Docs", and should not imply #: sphinx_rtd_theme/layout.html:79
#. Read the Docs is an author of the generated documentation.
#: sphinx_rtd_theme/footer.html:57
#, python-format
msgid "provided by %(readthedocs_web)s"
msgstr "on loonud %(readthedocs_web)s"
#: sphinx_rtd_theme/layout.html:97
#, python-format #, python-format
msgid "Search within %(docstitle)s" msgid "Search within %(docstitle)s"
msgstr "Otsi dokumendist %(docstitle)s" msgstr "Otsi dokumendist %(docstitle)s"
#: sphinx_rtd_theme/layout.html:105 #: sphinx_rtd_theme/layout.html:87
msgid "About these documents" msgid "About these documents"
msgstr "Nende dokumentide kirjeldused" msgstr "Nende dokumentide kirjeldused"
#: sphinx_rtd_theme/layout.html:108 #: sphinx_rtd_theme/layout.html:90
msgid "Index" msgid "Index"
msgstr "Indeks" msgstr "Indeks"
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11 #: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
msgid "Search" msgid "Search"
msgstr "Otsing" msgstr "Otsing"
#: sphinx_rtd_theme/layout.html:114 #: sphinx_rtd_theme/layout.html:121
msgid "Copyright" msgid "Documentation Home"
msgstr "Autoriõigus" msgstr "Dokumentatsiooni kodu"
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149 #: sphinx_rtd_theme/layout.html:128
msgid "Logo" msgid "Logo"
msgstr "Logo" msgstr "Logo"
#: sphinx_rtd_theme/search.html:31 #: sphinx_rtd_theme/search.html:29
msgid "Please activate JavaScript to enable the search functionality." msgid "Please activate JavaScript to enable the search functionality."
msgstr "Otsimisfunktsiooni lubamiseks aktiveeri palun JavaScript" msgstr "Otsimisfunktsiooni lubamiseks aktiveeri palun JavaScript"
#. Search is a noun, not a verb #. Search is a noun, not a verb
#: sphinx_rtd_theme/search.html:39 #: sphinx_rtd_theme/search.html:37
msgid "Search Results" msgid "Search Results"
msgstr "Otsingu tulemused" msgstr "Otsingu tulemused"
#: sphinx_rtd_theme/search.html:41 #: sphinx_rtd_theme/search.html:39
msgid "" msgid ""
"Your search did not match any documents. Please make sure that all words are" "Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories." " spelled correctly and that you've selected enough categories."
@ -144,7 +127,7 @@ msgstr ""
msgid "Search docs" msgid "Search docs"
msgstr "Otsi dokumente" msgstr "Otsi dokumente"
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11 #: sphinx_rtd_theme/versions.html:11
msgid "Versions" msgid "Versions"
msgstr "Versioonid" msgstr "Versioonid"
@ -164,3 +147,9 @@ msgstr "Projekti kodu"
#: sphinx_rtd_theme/versions.html:29 #: sphinx_rtd_theme/versions.html:29
msgid "Builds" msgid "Builds"
msgstr "Ehitused" msgstr "Ehitused"
#~ msgid "Docs"
#~ msgstr "Dokumendid"
#~ msgid "Free document hosting provided by"
#~ msgstr "Dokumentatsiooni majutab tasuta"

View File

@ -1,160 +0,0 @@
# English translations for sphinx_rtd_theme.
# Copyright (C) 2019 ORGANIZATION
# This file is distributed under the same license as the sphinx_rtd_theme
# project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
#
# Translators:
# Anthony <aj@ohess.org>, 2021
#
msgid ""
msgstr ""
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-09-13 13:35-0600\n"
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
"Last-Translator: Anthony <aj@ohess.org>, 2021\n"
"Language-Team: Persian (Iran) (https://www.transifex.com/readthedocs/teams/101354/fa_IR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.8.0\n"
"Language: fa_IR\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
msgid "Edit on GitHub"
msgstr "ویرایش در GitHub"
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
msgid "Edit on Bitbucket"
msgstr "ویرایش در Bitbucket"
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
msgid "Edit on GitLab"
msgstr "ویرایش در GitLab"
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
msgid "View page source"
msgstr "نمایش متن منبع صفحه"
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
msgid "Previous"
msgstr "پیشین"
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
msgid "Next"
msgstr "بعدی"
#: sphinx_rtd_theme/footer.html:21
#, python-format
msgid "&#169; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
msgstr "&#169; <a href=\"%(path)s\">حق انتشار</a> %(copyright)s."
#: sphinx_rtd_theme/footer.html:23
#, python-format
msgid "&#169; Copyright %(copyright)s."
msgstr "&#169; حق انتشار%(copyright)s."
#. Build is a noun, not a verb
#: sphinx_rtd_theme/footer.html:30
msgid "Build"
msgstr "ساخت"
#. the phrase "revision" comes from Git, referring to a commit
#: sphinx_rtd_theme/footer.html:36
msgid "Revision"
msgstr "بازبینی"
#: sphinx_rtd_theme/footer.html:41
#, python-format
msgid "Last updated on %(last_updated)s."
msgstr "آخرین بروز رسانی در %(last_updated)s ."
#. the variable "sphinx_web" is a link to the Sphinx project documentation
#. with
#. the text "Sphinx"
#: sphinx_rtd_theme/footer.html:53
#, python-format
msgid "Built with %(sphinx_web)s using a"
msgstr "ساخته شده با %(sphinx_web)s"
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
#. generated documentation
#: sphinx_rtd_theme/footer.html:55
msgid "theme"
msgstr "پوسته"
#. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation.
#: sphinx_rtd_theme/footer.html:57
#, python-format
msgid "provided by %(readthedocs_web)s"
msgstr "تهیّه شده با %(readthedocs_web)s"
#: sphinx_rtd_theme/layout.html:97
#, python-format
msgid "Search within %(docstitle)s"
msgstr "جستجو در %(docstitle)s"
#: sphinx_rtd_theme/layout.html:105
msgid "About these documents"
msgstr "درباره این مستندات"
#: sphinx_rtd_theme/layout.html:108
msgid "Index"
msgstr "فهرست"
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
msgid "Search"
msgstr "جستجوی"
#: sphinx_rtd_theme/layout.html:114
msgid "Copyright"
msgstr "کپی رایت"
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
msgid "Logo"
msgstr "آرم"
#: sphinx_rtd_theme/search.html:31
msgid "Please activate JavaScript to enable the search functionality."
msgstr "لطفاً جاوا اسکریپت را فعّال کنید تا قابلیّت جستجو فعّال شود."
#. Search is a noun, not a verb
#: sphinx_rtd_theme/search.html:39
msgid "Search Results"
msgstr "نتایج جستجو"
#: sphinx_rtd_theme/search.html:41
msgid ""
"Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories."
msgstr ""
"جستجوی شما با هیچ سندی مطابقت نداشت. لطفاً از درستی املای واژگان مطمئن شوید."
" هم‌چنین بررسی کنید آیا به اندازه کافی دسته بندی انتخاب کرده‌اید."
#: sphinx_rtd_theme/searchbox.html:4
msgid "Search docs"
msgstr "جستجوی مستندات"
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
msgid "Versions"
msgstr "نگارش‌ها"
#: sphinx_rtd_theme/versions.html:17
msgid "Downloads"
msgstr "بارگیری‌ها"
#. The phrase "Read the Docs" is not translated
#: sphinx_rtd_theme/versions.html:24
msgid "On Read the Docs"
msgstr "درباره‌ی خواندن مستندات"
#: sphinx_rtd_theme/versions.html:26
msgid "Project Home"
msgstr "صفحه خانگی پروژه"
#: sphinx_rtd_theme/versions.html:29
msgid "Builds"
msgstr "ساخت‌ها"

View File

@ -5,16 +5,16 @@
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. # FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
# #
# Translators: # Translators:
# Radina Matic <radina.matic@gmail.com>, 2020
# Anthony <aj@ohess.org>, 2020 # Anthony <aj@ohess.org>, 2020
# Radina Matic <radina.matic@gmail.com>, 2021
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n" "Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-09-13 13:35-0600\n" "POT-Creation-Date: 2020-05-06 13:38-0600\n"
"PO-Revision-Date: 2019-07-16 21:44+0000\n" "PO-Revision-Date: 2019-07-16 21:44+0000\n"
"Last-Translator: Radina Matic <radina.matic@gmail.com>, 2021\n" "Last-Translator: Anthony <aj@ohess.org>, 2020\n"
"Language-Team: French (https://www.transifex.com/readthedocs/teams/101354/fr/)\n" "Language-Team: French (https://www.transifex.com/readthedocs/teams/101354/fr/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -23,52 +23,42 @@ msgstr ""
"Language: fr\n" "Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39 #: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
msgid "Edit on GitHub" msgid "Edit on GitHub"
msgstr "Éditer sur GitHub" msgstr "Éditer sur GitHub"
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46 #: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
msgid "Edit on Bitbucket" msgid "Edit on Bitbucket"
msgstr "Éditer sur Bitbucket" msgstr "Éditer sur Bitbucket"
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53 #: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
msgid "Edit on GitLab" msgid "Edit on GitLab"
msgstr "Éditer sur GitLab" msgstr "Éditer sur GitLab"
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58 #: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
msgid "View page source" msgid "View page source"
msgstr "Afficher la source de la page" msgstr "Afficher la source de la page"
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6 #: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
msgid "Previous"
msgstr "Précédent"
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
msgid "Next" msgid "Next"
msgstr "Suivant" msgstr "Suivant"
#. This is an ARIA section label for the footer section of the page. #: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
#: sphinx_rtd_theme/footer.html:4 msgid "Previous"
msgid "Footer" msgstr "Précédent"
msgstr "Pied de page"
#: sphinx_rtd_theme/footer.html:21 #: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
#, python-format #: sphinx_rtd_theme/layout.html:96
msgid "&#169; <a href=\"%(path)s\">Copyright</a> %(copyright)s." msgid "Copyright"
msgstr "&#169; <a href=\"%(path)s\">Droits d'auteur</a> %(copyright)s." msgstr "Droits d'auteur"
#: sphinx_rtd_theme/footer.html:23
#, python-format
msgid "&#169; Copyright %(copyright)s."
msgstr "&#169; Droits d'auteur %(copyright)s."
#. Build is a noun, not a verb #. Build is a noun, not a verb
#: sphinx_rtd_theme/footer.html:30 #: sphinx_rtd_theme/footer.html:31
msgid "Build" msgid "Build"
msgstr "Compilation" msgstr "Compilation"
#. the phrase "revision" comes from Git, referring to a commit #. the phrase "revision" comes from Git, referring to a commit
#: sphinx_rtd_theme/footer.html:36 #: sphinx_rtd_theme/footer.html:37
msgid "Revision" msgid "Revision"
msgstr "Révision" msgstr "Révision"
@ -80,59 +70,55 @@ msgstr "Dernière mise à jour le %(last_updated)s."
#. the variable "sphinx_web" is a link to the Sphinx project documentation #. the variable "sphinx_web" is a link to the Sphinx project documentation
#. with #. with
#. the text "Sphinx" #. the text "Sphinx"
#: sphinx_rtd_theme/footer.html:53 #: sphinx_rtd_theme/footer.html:52
#, python-format #, python-format
msgid "Built with %(sphinx_web)s using a" msgid "Built with %(sphinx_web)s using a"
msgstr "Compilé avec %(sphinx_web)s en utilisant un" msgstr "Compilé avec %(sphinx_web)s en utilisant un"
#. "theme" refers to a theme for Sphinx, which alters the appearance of the #. "theme" refers to a theme for Sphinx, which alters the appearance of the
#. generated documenation #. generated documenation
#: sphinx_rtd_theme/footer.html:55 #: sphinx_rtd_theme/footer.html:54
msgid "theme" msgid "theme"
msgstr "thème" msgstr "thème"
#. this is always used as "provided by Read the Docs", and should not imply #. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation. #. Read the Docs is an author of the generated documentation.
#: sphinx_rtd_theme/footer.html:57 #: sphinx_rtd_theme/footer.html:56
#, python-format #, python-format
msgid "provided by %(readthedocs_web)s" msgid "provided by %(readthedocs_web)s"
msgstr "fourni par %(readthedocs_web)s" msgstr "fourni par %(readthedocs_web)s"
#: sphinx_rtd_theme/layout.html:97 #: sphinx_rtd_theme/layout.html:79
#, python-format #, python-format
msgid "Search within %(docstitle)s" msgid "Search within %(docstitle)s"
msgstr "Rechercher dans %(docstitle)s" msgstr "Rechercher dans %(docstitle)s"
#: sphinx_rtd_theme/layout.html:105 #: sphinx_rtd_theme/layout.html:87
msgid "About these documents" msgid "About these documents"
msgstr "À propos de cette documentation" msgstr "À propos de cette documentation"
#: sphinx_rtd_theme/layout.html:108 #: sphinx_rtd_theme/layout.html:90
msgid "Index" msgid "Index"
msgstr "Index" msgstr "Index"
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11 #: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
msgid "Search" msgid "Search"
msgstr "Rechercher" msgstr "Rechercher"
#: sphinx_rtd_theme/layout.html:114 #: sphinx_rtd_theme/layout.html:128
msgid "Copyright"
msgstr "Droits d'auteur"
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
msgid "Logo" msgid "Logo"
msgstr "Logo" msgstr "Logo"
#: sphinx_rtd_theme/search.html:31 #: sphinx_rtd_theme/search.html:29
msgid "Please activate JavaScript to enable the search functionality." msgid "Please activate JavaScript to enable the search functionality."
msgstr "Activez JavaScript pour accéder à la fonction de recherche." msgstr "Activez JavaScript pour accéder à la fonction de recherche."
#. Search is a noun, not a verb #. Search is a noun, not a verb
#: sphinx_rtd_theme/search.html:39 #: sphinx_rtd_theme/search.html:37
msgid "Search Results" msgid "Search Results"
msgstr "Résultats de la recherche" msgstr "Résultats de la recherche"
#: sphinx_rtd_theme/search.html:41 #: sphinx_rtd_theme/search.html:39
msgid "" msgid ""
"Your search did not match any documents. Please make sure that all words are" "Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories." " spelled correctly and that you've selected enough categories."
@ -145,7 +131,7 @@ msgstr ""
msgid "Search docs" msgid "Search docs"
msgstr "Rechercher docs" msgstr "Rechercher docs"
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11 #: sphinx_rtd_theme/versions.html:11
msgid "Versions" msgid "Versions"
msgstr "Versions" msgstr "Versions"
@ -153,11 +139,6 @@ msgstr "Versions"
msgid "Downloads" msgid "Downloads"
msgstr "Téléchargements" msgstr "Téléchargements"
#. The phrase "Read the Docs" is not translated
#: sphinx_rtd_theme/versions.html:24
msgid "On Read the Docs"
msgstr "À propos de Read the Docs"
#: sphinx_rtd_theme/versions.html:26 #: sphinx_rtd_theme/versions.html:26
msgid "Project Home" msgid "Project Home"
msgstr "Accueil du projet" msgstr "Accueil du projet"
@ -165,3 +146,9 @@ msgstr "Accueil du projet"
#: sphinx_rtd_theme/versions.html:29 #: sphinx_rtd_theme/versions.html:29
msgid "Builds" msgid "Builds"
msgstr "Compilations" msgstr "Compilations"
#~ msgid "Docs"
#~ msgstr "Docs"
#~ msgid "Free document hosting provided by"
#~ msgstr "Hébergement gratuit de documents fourni par"

View File

@ -1,190 +0,0 @@
# English translations for sphinx_rtd_theme.
# Copyright (C) 2019 ORGANIZATION
# This file is distributed under the same license as the sphinx_rtd_theme
# project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
#
# Translators:
# Anthony <aj@ohess.org>, 2021
# Maurizio Paglia <mpaglia0@gmail.com>, 2021
#
msgid ""
msgstr ""
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-09-13 13:35-0600\n"
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
"Last-Translator: Maurizio Paglia <mpaglia0@gmail.com>, 2021\n"
"Language-Team: Italian (https://www.transifex.com/readthedocs/teams/101354/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.8.0\n"
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. This is an ARIA section label for page links, including previous/next page
#. link and links to GitHub/GitLab/etc.
#: sphinx_rtd_theme/breadcrumbs.html:22
msgid "Page navigation"
msgstr "Naviga tra le pagine"
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
msgid "Edit on GitHub"
msgstr "Modifica su GitHub"
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
msgid "Edit on Bitbucket"
msgstr "Modifica su Bitbucket"
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
msgid "Edit on GitLab"
msgstr "Modifica su GitLab"
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
msgid "View page source"
msgstr "Visualizza sorgente pagina"
#. This is an ARIA section label for sequential page links, such as previous
#. and next page links.
#: sphinx_rtd_theme/breadcrumbs.html:67
msgid "Sequential page navigation"
msgstr "Naviga sequenzialmente tra le pagine"
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
msgid "Previous"
msgstr "Precedente"
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
msgid "Next"
msgstr "Prossimo"
#. This is an ARIA section label for the footer section of the page.
#: sphinx_rtd_theme/footer.html:4
msgid "Footer"
msgstr "Piè di pagina"
#: sphinx_rtd_theme/footer.html:21
#, python-format
msgid "&#169; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
msgstr "&#169; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
#: sphinx_rtd_theme/footer.html:23
#, python-format
msgid "&#169; Copyright %(copyright)s."
msgstr "&#169; Copyright %(copyright)s."
#. Build is a noun, not a verb
#: sphinx_rtd_theme/footer.html:30
msgid "Build"
msgstr "Rev."
#. the phrase "revision" comes from Git, referring to a commit
#: sphinx_rtd_theme/footer.html:36
msgid "Revision"
msgstr "Revisione"
#: sphinx_rtd_theme/footer.html:41
#, python-format
msgid "Last updated on %(last_updated)s."
msgstr "Ultimo aggiornamento il %(last_updated)s."
#. the variable "sphinx_web" is a link to the Sphinx project documentation
#. with
#. the text "Sphinx"
#: sphinx_rtd_theme/footer.html:53
#, python-format
msgid "Built with %(sphinx_web)s using a"
msgstr "Realizzato con %(sphinx_web)s e il tema"
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
#. generated documentation
#: sphinx_rtd_theme/footer.html:55
msgid "theme"
msgstr "tema"
#. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation.
#: sphinx_rtd_theme/footer.html:57
#, python-format
msgid "provided by %(readthedocs_web)s"
msgstr "fornito da %(readthedocs_web)s"
#: sphinx_rtd_theme/layout.html:97
#, python-format
msgid "Search within %(docstitle)s"
msgstr "Cerca in %(docstitle)s"
#: sphinx_rtd_theme/layout.html:105
msgid "About these documents"
msgstr "Nota sulla documentazione"
#: sphinx_rtd_theme/layout.html:108
msgid "Index"
msgstr "Indice"
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
msgid "Search"
msgstr "Ricerca"
#: sphinx_rtd_theme/layout.html:114
msgid "Copyright"
msgstr "Copyright"
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
msgid "Logo"
msgstr "Logo"
#. This is an ARIA section label for the main navigation menu
#: sphinx_rtd_theme/layout.html:173
msgid "Navigation menu"
msgstr "Menu di navigazione"
#. This is an ARIA section label for the navigation menu that is visible when
#. viewing the page on mobile devices
#: sphinx_rtd_theme/layout.html:195
msgid "Mobile navigation menu"
msgstr "Menu navigazione dispositivi mobili"
#: sphinx_rtd_theme/search.html:31
msgid "Please activate JavaScript to enable the search functionality."
msgstr "Devi attivare JavaScript per attivare la funzione di ricerca."
#. Search is a noun, not a verb
#: sphinx_rtd_theme/search.html:39
msgid "Search Results"
msgstr "Risultati della ricerca"
#: sphinx_rtd_theme/search.html:41
msgid ""
"Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories."
msgstr ""
"La tua ricerca non ha prodotto nessun risultato. Assicurati di aver scritto "
"correttamente tutti i termini cercati e di aver selezionato sufficienti "
"categorie."
#: sphinx_rtd_theme/searchbox.html:4
msgid "Search docs"
msgstr "Cerca documenti"
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
msgid "Versions"
msgstr "Versioni"
#: sphinx_rtd_theme/versions.html:17
msgid "Downloads"
msgstr "Downloads"
#. The phrase "Read the Docs" is not translated
#: sphinx_rtd_theme/versions.html:24
msgid "On Read the Docs"
msgstr "Riguardo Read the Docs"
#: sphinx_rtd_theme/versions.html:26
msgid "Project Home"
msgstr "Home progetto"
#: sphinx_rtd_theme/versions.html:29
msgid "Builds"
msgstr "Rev."

View File

@ -1,188 +0,0 @@
# English translations for sphinx_rtd_theme.
# Copyright (C) 2019 ORGANIZATION
# This file is distributed under the same license as the sphinx_rtd_theme
# project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
#
# Translators:
# Tomas Straupis, 2021
#
msgid ""
msgstr ""
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-09-13 13:35-0600\n"
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
"Last-Translator: Tomas Straupis, 2021\n"
"Language-Team: Lithuanian (https://www.transifex.com/readthedocs/teams/101354/lt/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.8.0\n"
"Language: lt\n"
"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n"
#. This is an ARIA section label for page links, including previous/next page
#. link and links to GitHub/GitLab/etc.
#: sphinx_rtd_theme/breadcrumbs.html:22
msgid "Page navigation"
msgstr "Puslapių navigacija"
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
msgid "Edit on GitHub"
msgstr "Keisti GitHub'e"
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
msgid "Edit on Bitbucket"
msgstr "Keisti Bitbucket'e"
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
msgid "Edit on GitLab"
msgstr "Keisti GitLab'e"
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
msgid "View page source"
msgstr "Žiūrėti puslapio šaltinį"
#. This is an ARIA section label for sequential page links, such as previous
#. and next page links.
#: sphinx_rtd_theme/breadcrumbs.html:67
msgid "Sequential page navigation"
msgstr "Puslapių navigacija iš eilės"
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
msgid "Previous"
msgstr "Ankstesnis"
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
msgid "Next"
msgstr "Kitas"
#. This is an ARIA section label for the footer section of the page.
#: sphinx_rtd_theme/footer.html:4
msgid "Footer"
msgstr "Poraštė"
#: sphinx_rtd_theme/footer.html:21
#, python-format
msgid "&#169; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
msgstr "&#169; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
#: sphinx_rtd_theme/footer.html:23
#, python-format
msgid "&#169; Copyright %(copyright)s."
msgstr "&#169; Copyright %(copyright)s."
#. Build is a noun, not a verb
#: sphinx_rtd_theme/footer.html:30
msgid "Build"
msgstr "Surinkimas"
#. the phrase "revision" comes from Git, referring to a commit
#: sphinx_rtd_theme/footer.html:36
msgid "Revision"
msgstr "Versija"
#: sphinx_rtd_theme/footer.html:41
#, python-format
msgid "Last updated on %(last_updated)s."
msgstr "Atnaujinta %(last_updated)s."
#. the variable "sphinx_web" is a link to the Sphinx project documentation
#. with
#. the text "Sphinx"
#: sphinx_rtd_theme/footer.html:53
#, python-format
msgid "Built with %(sphinx_web)s using a"
msgstr "Surinkta su %(sphinx_web)s naudojant"
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
#. generated documentation
#: sphinx_rtd_theme/footer.html:55
msgid "theme"
msgstr "temą"
#. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation.
#: sphinx_rtd_theme/footer.html:57
#, python-format
msgid "provided by %(readthedocs_web)s"
msgstr "pateiktą %(readthedocs_web)s"
#: sphinx_rtd_theme/layout.html:97
#, python-format
msgid "Search within %(docstitle)s"
msgstr "Ieškoti %(docstitle)s"
#: sphinx_rtd_theme/layout.html:105
msgid "About these documents"
msgstr "Apie šiuos dokumentus"
#: sphinx_rtd_theme/layout.html:108
msgid "Index"
msgstr "Indeksas"
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
msgid "Search"
msgstr "Paieška"
#: sphinx_rtd_theme/layout.html:114
msgid "Copyright"
msgstr "Autorių teisės"
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
msgid "Logo"
msgstr "Logo"
#. This is an ARIA section label for the main navigation menu
#: sphinx_rtd_theme/layout.html:173
msgid "Navigation menu"
msgstr "Navigacijos meniu"
#. This is an ARIA section label for the navigation menu that is visible when
#. viewing the page on mobile devices
#: sphinx_rtd_theme/layout.html:195
msgid "Mobile navigation menu"
msgstr "Mobilios navigacijos meniu"
#: sphinx_rtd_theme/search.html:31
msgid "Please activate JavaScript to enable the search functionality."
msgstr "Prašome įjungti JavaScript, kad veiktų paieškos funkcionalumas."
#. Search is a noun, not a verb
#: sphinx_rtd_theme/search.html:39
msgid "Search Results"
msgstr "Paieškos rezultatai"
#: sphinx_rtd_theme/search.html:41
msgid ""
"Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories."
msgstr ""
"Jūsų paieškai neatitiko nei vienas dokumentas. Prašome įsitikinti, kad visi "
"žodžiai parašyti teisingai ir kad parinkote pakankamai kategorijų."
#: sphinx_rtd_theme/searchbox.html:4
msgid "Search docs"
msgstr "Ieškoti dokumentuose"
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
msgid "Versions"
msgstr "Versijos"
#: sphinx_rtd_theme/versions.html:17
msgid "Downloads"
msgstr "Atsisiuntimai"
#. The phrase "Read the Docs" is not translated
#: sphinx_rtd_theme/versions.html:24
msgid "On Read the Docs"
msgstr "Apie Read the Docs"
#: sphinx_rtd_theme/versions.html:26
msgid "Project Home"
msgstr "Projekto namai"
#: sphinx_rtd_theme/versions.html:29
msgid "Builds"
msgstr "Surinkimai"

View File

@ -5,15 +5,15 @@
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. # FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
# #
# Translators: # Translators:
# Jesse Tan, 2021 # Jesse Tan, 2019
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n" "Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-09-13 13:35-0600\n" "POT-Creation-Date: 2020-05-06 13:38-0600\n"
"PO-Revision-Date: 2019-07-16 21:44+0000\n" "PO-Revision-Date: 2019-07-16 21:44+0000\n"
"Last-Translator: Jesse Tan, 2021\n" "Last-Translator: Jesse Tan, 2019\n"
"Language-Team: Dutch (https://www.transifex.com/readthedocs/teams/101354/nl/)\n" "Language-Team: Dutch (https://www.transifex.com/readthedocs/teams/101354/nl/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -22,64 +22,42 @@ msgstr ""
"Language: nl\n" "Language: nl\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. This is an ARIA section label for page links, including previous/next page #: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
#. link and links to GitHub/GitLab/etc.
#: sphinx_rtd_theme/breadcrumbs.html:22
msgid "Page navigation"
msgstr "Paginanavigatie"
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
msgid "Edit on GitHub" msgid "Edit on GitHub"
msgstr "Bewerk op GitHub" msgstr "Bewerk op GitHub"
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46 #: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
msgid "Edit on Bitbucket" msgid "Edit on Bitbucket"
msgstr "Bewerk op BitBucket" msgstr "Bewerk op BitBucket"
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53 #: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
msgid "Edit on GitLab" msgid "Edit on GitLab"
msgstr "Bewerk op GitLab" msgstr "Bewerk op GitLab"
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58 #: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
msgid "View page source" msgid "View page source"
msgstr "Bekijk paginabron" msgstr "Bekijk paginabron"
#. This is an ARIA section label for sequential page links, such as previous #: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
#. and next page links.
#: sphinx_rtd_theme/breadcrumbs.html:67
msgid "Sequential page navigation"
msgstr "Navigatie voor gerelateerde pagina's"
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
msgid "Previous"
msgstr "Vorige"
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
msgid "Next" msgid "Next"
msgstr "Volgende" msgstr "Volgende"
#. This is an ARIA section label for the footer section of the page. #: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
#: sphinx_rtd_theme/footer.html:4 msgid "Previous"
msgid "Footer" msgstr "Vorige"
msgstr "Voettekst"
#: sphinx_rtd_theme/footer.html:21 #: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
#, python-format #: sphinx_rtd_theme/layout.html:96
msgid "&#169; <a href=\"%(path)s\">Copyright</a> %(copyright)s." msgid "Copyright"
msgstr "&#169; <a href=\"%(path)s\">Copyright</a> %(copyright)s." msgstr "Copyright"
#: sphinx_rtd_theme/footer.html:23
#, python-format
msgid "&#169; Copyright %(copyright)s."
msgstr "&#169; Copyright %(copyright)s."
#. Build is a noun, not a verb #. Build is a noun, not a verb
#: sphinx_rtd_theme/footer.html:30 #: sphinx_rtd_theme/footer.html:31
msgid "Build" msgid "Build"
msgstr "Bouwresultaat" msgstr "Bouwresultaat"
#. the phrase "revision" comes from Git, referring to a commit #. the phrase "revision" comes from Git, referring to a commit
#: sphinx_rtd_theme/footer.html:36 #: sphinx_rtd_theme/footer.html:37
msgid "Revision" msgid "Revision"
msgstr "Revisie" msgstr "Revisie"
@ -91,70 +69,55 @@ msgstr "Laatste update op %(last_updated)s."
#. the variable "sphinx_web" is a link to the Sphinx project documentation #. the variable "sphinx_web" is a link to the Sphinx project documentation
#. with #. with
#. the text "Sphinx" #. the text "Sphinx"
#: sphinx_rtd_theme/footer.html:53 #: sphinx_rtd_theme/footer.html:52
#, python-format #, python-format
msgid "Built with %(sphinx_web)s using a" msgid "Built with %(sphinx_web)s using a"
msgstr "Gebouwd met %(sphinx_web)s met een" msgstr "Gebouwd met %(sphinx_web)s met een"
#. "theme" refers to a theme for Sphinx, which alters the appearance of the #. "theme" refers to a theme for Sphinx, which alters the appearance of the
#. generated documentation #. generated documenation
#: sphinx_rtd_theme/footer.html:55 #: sphinx_rtd_theme/footer.html:54
msgid "theme" msgid "theme"
msgstr "thema" msgstr "thema"
#. this is always used as "provided by Read the Docs", and should not imply #. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation. #. Read the Docs is an author of the generated documentation.
#: sphinx_rtd_theme/footer.html:57 #: sphinx_rtd_theme/footer.html:56
#, python-format #, python-format
msgid "provided by %(readthedocs_web)s" msgid "provided by %(readthedocs_web)s"
msgstr "geleverd door %(readthedocs_web)s" msgstr "geleverd door %(readthedocs_web)s"
#: sphinx_rtd_theme/layout.html:97 #: sphinx_rtd_theme/layout.html:79
#, python-format #, python-format
msgid "Search within %(docstitle)s" msgid "Search within %(docstitle)s"
msgstr "Zoek binnen %(docstitle)s" msgstr "Zoek binnen %(docstitle)s"
#: sphinx_rtd_theme/layout.html:105 #: sphinx_rtd_theme/layout.html:87
msgid "About these documents" msgid "About these documents"
msgstr "Over deze documenten" msgstr "Over deze documenten"
#: sphinx_rtd_theme/layout.html:108 #: sphinx_rtd_theme/layout.html:90
msgid "Index" msgid "Index"
msgstr "Index" msgstr "Index"
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11 #: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
msgid "Search" msgid "Search"
msgstr "Zoek" msgstr "Zoek"
#: sphinx_rtd_theme/layout.html:114 #: sphinx_rtd_theme/layout.html:128
msgid "Copyright"
msgstr "Copyright"
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
msgid "Logo" msgid "Logo"
msgstr "Logo" msgstr "Logo"
#. This is an ARIA section label for the main navigation menu #: sphinx_rtd_theme/search.html:29
#: sphinx_rtd_theme/layout.html:173
msgid "Navigation menu"
msgstr "Navigatiemenu"
#. This is an ARIA section label for the navigation menu that is visible when
#. viewing the page on mobile devices
#: sphinx_rtd_theme/layout.html:195
msgid "Mobile navigation menu"
msgstr "Navigatiemenu voor mobiel"
#: sphinx_rtd_theme/search.html:31
msgid "Please activate JavaScript to enable the search functionality." msgid "Please activate JavaScript to enable the search functionality."
msgstr "Zet JavaScript aan om de zoekfunctie mogelijk te maken." msgstr "Zet JavaScript aan om de zoekfunctie mogelijk te maken."
#. Search is a noun, not a verb #. Search is a noun, not a verb
#: sphinx_rtd_theme/search.html:39 #: sphinx_rtd_theme/search.html:37
msgid "Search Results" msgid "Search Results"
msgstr "Zoekresultaten" msgstr "Zoekresultaten"
#: sphinx_rtd_theme/search.html:41 #: sphinx_rtd_theme/search.html:39
msgid "" msgid ""
"Your search did not match any documents. Please make sure that all words are" "Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories." " spelled correctly and that you've selected enough categories."
@ -166,7 +129,7 @@ msgstr ""
msgid "Search docs" msgid "Search docs"
msgstr "Zoek in documentatie" msgstr "Zoek in documentatie"
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11 #: sphinx_rtd_theme/versions.html:11
msgid "Versions" msgid "Versions"
msgstr "Versies" msgstr "Versies"
@ -186,3 +149,9 @@ msgstr "Project Home"
#: sphinx_rtd_theme/versions.html:29 #: sphinx_rtd_theme/versions.html:29
msgid "Builds" msgid "Builds"
msgstr "Bouwresultaten" msgstr "Bouwresultaten"
#~ msgid "Docs"
#~ msgstr "Documentatie"
#~ msgid "Free document hosting provided by"
#~ msgstr "Gratis hosting voor documentatie verzorgd door"

View File

@ -1,137 +0,0 @@
# English translations for sphinx_rtd_theme.
# Copyright (C) 2019 ORGANIZATION
# This file is distributed under the same license as the sphinx_rtd_theme
# project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
#
# Translators:
# Michal Sniatala, 2021
#
msgid ""
msgstr ""
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-09-13 13:35-0600\n"
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
"Last-Translator: Michal Sniatala, 2021\n"
"Language-Team: Polish (https://www.transifex.com/readthedocs/teams/101354/pl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.8.0\n"
"Language: pl\n"
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
msgid "Edit on GitHub"
msgstr "Edytuj na GitHub"
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
msgid "Edit on Bitbucket"
msgstr "Edytuj na Bitbucket"
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
msgid "Edit on GitLab"
msgstr "Edytuj na GitLab"
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
msgid "View page source"
msgstr "Zobacz źródło strony"
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
msgid "Previous"
msgstr "Poprzedni"
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
msgid "Next"
msgstr "Następny"
#: sphinx_rtd_theme/footer.html:21
#, python-format
msgid "&#169; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
msgstr "&#169; <a href=\"%(path)s\">Prawa zastrzeżone</a> %(copyright)s."
#: sphinx_rtd_theme/footer.html:23
#, python-format
msgid "&#169; Copyright %(copyright)s."
msgstr "&#169; Prawa zastrzeżone %(copyright)s."
#: sphinx_rtd_theme/footer.html:41
#, python-format
msgid "Last updated on %(last_updated)s."
msgstr "Ostatnia aktualizacja %(last_updated)s."
#. the variable "sphinx_web" is a link to the Sphinx project documentation
#. with
#. the text "Sphinx"
#: sphinx_rtd_theme/footer.html:53
#, python-format
msgid "Built with %(sphinx_web)s using a"
msgstr "Zbudowano w %(sphinx_web)s używając"
#. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation.
#: sphinx_rtd_theme/footer.html:57
#, python-format
msgid "provided by %(readthedocs_web)s"
msgstr "dostarczone przez %(readthedocs_web)s"
#: sphinx_rtd_theme/layout.html:97
#, python-format
msgid "Search within %(docstitle)s"
msgstr "Szukaj w %(docstitle)s"
#: sphinx_rtd_theme/layout.html:105
msgid "About these documents"
msgstr "O tych dokumentach"
#: sphinx_rtd_theme/layout.html:108
msgid "Index"
msgstr "Indeks"
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
msgid "Search"
msgstr "Szukaj"
#: sphinx_rtd_theme/layout.html:114
msgid "Copyright"
msgstr "Prawa zastrzeżone"
#: sphinx_rtd_theme/search.html:31
msgid "Please activate JavaScript to enable the search functionality."
msgstr ""
"Proszę aktywować obsługę JavaScript, aby włączyć funkcję wyszukiwania."
#. Search is a noun, not a verb
#: sphinx_rtd_theme/search.html:39
msgid "Search Results"
msgstr "Wyniki wyszukiwania"
#: sphinx_rtd_theme/search.html:41
msgid ""
"Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories."
msgstr ""
"Nie znaleziono szukanej frazy. Upewnij się, że wszystkie słowa są napisane "
"poprawnie i że wybrałeś wystarczającą liczbę kategorii."
#: sphinx_rtd_theme/searchbox.html:4
msgid "Search docs"
msgstr "Szukaj"
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
msgid "Versions"
msgstr "Wersje"
#: sphinx_rtd_theme/versions.html:17
msgid "Downloads"
msgstr "Pobrania"
#. The phrase "Read the Docs" is not translated
#: sphinx_rtd_theme/versions.html:24
msgid "On Read the Docs"
msgstr "Na Read the Docs"
#: sphinx_rtd_theme/versions.html:26
msgid "Project Home"
msgstr "Strona projektu"

View File

@ -1,161 +0,0 @@
# English translations for sphinx_rtd_theme.
# Copyright (C) 2019 ORGANIZATION
# This file is distributed under the same license as the sphinx_rtd_theme
# project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
#
# Translators:
# Ana Costa <anacosta.xl@gmail.com>, 2021
#
msgid ""
msgstr ""
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-09-13 13:35-0600\n"
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
"Last-Translator: Ana Costa <anacosta.xl@gmail.com>, 2021\n"
"Language-Team: Portuguese (https://www.transifex.com/readthedocs/teams/101354/pt/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.8.0\n"
"Language: pt\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. This is an ARIA section label for page links, including previous/next page
#. link and links to GitHub/GitLab/etc.
#: sphinx_rtd_theme/breadcrumbs.html:22
msgid "Page navigation"
msgstr "Navegação da página"
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
msgid "Edit on GitHub"
msgstr "Editar no GitHub"
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
msgid "Edit on Bitbucket"
msgstr "Editar no Bitbucket"
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
msgid "Edit on GitLab"
msgstr "Editar no GitLab"
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
msgid "View page source"
msgstr "Ver código-fonte da página"
#. This is an ARIA section label for sequential page links, such as previous
#. and next page links.
#: sphinx_rtd_theme/breadcrumbs.html:67
msgid "Sequential page navigation"
msgstr "Navegação sequencial da página"
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
msgid "Previous"
msgstr "Anterior"
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
msgid "Next"
msgstr "Seguinte"
#. This is an ARIA section label for the footer section of the page.
#: sphinx_rtd_theme/footer.html:4
msgid "Footer"
msgstr "Rodapé"
#. the phrase "revision" comes from Git, referring to a commit
#: sphinx_rtd_theme/footer.html:36
msgid "Revision"
msgstr "Revisão"
#: sphinx_rtd_theme/footer.html:41
#, python-format
msgid "Last updated on %(last_updated)s."
msgstr "Última actualização em %(last_updated)s."
#. the variable "sphinx_web" is a link to the Sphinx project documentation
#. with
#. the text "Sphinx"
#: sphinx_rtd_theme/footer.html:53
#, python-format
msgid "Built with %(sphinx_web)s using a"
msgstr "Compilado com %(sphinx_web)s usando um"
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
#. generated documentation
#: sphinx_rtd_theme/footer.html:55
msgid "theme"
msgstr "tema"
#. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation.
#: sphinx_rtd_theme/footer.html:57
#, python-format
msgid "provided by %(readthedocs_web)s"
msgstr "fornecido por %(readthedocs_web)s"
#: sphinx_rtd_theme/layout.html:97
#, python-format
msgid "Search within %(docstitle)s"
msgstr "Procurar em %(docstitle)s"
#: sphinx_rtd_theme/layout.html:105
msgid "About these documents"
msgstr "Sobre estes documentos"
#: sphinx_rtd_theme/layout.html:108
msgid "Index"
msgstr "Índice"
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
msgid "Search"
msgstr "Pesquisar"
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
msgid "Logo"
msgstr "Logo"
#. This is an ARIA section label for the main navigation menu
#: sphinx_rtd_theme/layout.html:173
msgid "Navigation menu"
msgstr "Menu de navegação"
#. This is an ARIA section label for the navigation menu that is visible when
#. viewing the page on mobile devices
#: sphinx_rtd_theme/layout.html:195
msgid "Mobile navigation menu"
msgstr "Menu de navegação móvel"
#: sphinx_rtd_theme/search.html:31
msgid "Please activate JavaScript to enable the search functionality."
msgstr "Por favor, active o JavaScript para permitir a função de pesquisa."
#. Search is a noun, not a verb
#: sphinx_rtd_theme/search.html:39
msgid "Search Results"
msgstr "Resultados de Pesquisa"
#: sphinx_rtd_theme/search.html:41
msgid ""
"Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories."
msgstr ""
"A sua pesquisa não encontrou nenhum documento. Por favor confirme que todas "
"as palavras estão bem escritas e que selecionou categorias suficientes."
#: sphinx_rtd_theme/searchbox.html:4
msgid "Search docs"
msgstr "Pesquisar docs"
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
msgid "Versions"
msgstr "Versões"
#: sphinx_rtd_theme/versions.html:17
msgid "Downloads"
msgstr "Transferências"
#. The phrase "Read the Docs" is not translated
#: sphinx_rtd_theme/versions.html:24
msgid "On Read the Docs"
msgstr "No Read the Docs"

View File

@ -5,16 +5,15 @@
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. # FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
# #
# Translators: # Translators:
# Rafael Fontenelle <rffontenelle@gmail.com>, 2021 # Rafael Fontenelle <rffontenelle@gmail.com>, 2020
# Wellington Uemura <wellingtonuemura@gmail.com>, 2021
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n" "Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-09-13 13:35-0600\n" "POT-Creation-Date: 2020-05-06 13:38-0600\n"
"PO-Revision-Date: 2019-07-16 21:44+0000\n" "PO-Revision-Date: 2019-07-16 21:44+0000\n"
"Last-Translator: Wellington Uemura <wellingtonuemura@gmail.com>, 2021\n" "Last-Translator: Rafael Fontenelle <rffontenelle@gmail.com>, 2020\n"
"Language-Team: Portuguese (Brazil) (https://www.transifex.com/readthedocs/teams/101354/pt_BR/)\n" "Language-Team: Portuguese (Brazil) (https://www.transifex.com/readthedocs/teams/101354/pt_BR/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -23,64 +22,42 @@ msgstr ""
"Language: pt_BR\n" "Language: pt_BR\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n"
#. This is an ARIA section label for page links, including previous/next page #: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
#. link and links to GitHub/GitLab/etc.
#: sphinx_rtd_theme/breadcrumbs.html:22
msgid "Page navigation"
msgstr "Navegação da página"
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
msgid "Edit on GitHub" msgid "Edit on GitHub"
msgstr "Editar no GitHub" msgstr "Editar no GitHub"
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46 #: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
msgid "Edit on Bitbucket" msgid "Edit on Bitbucket"
msgstr "Editar no Bitbucket" msgstr "Editar no Bitbucket"
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53 #: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
msgid "Edit on GitLab" msgid "Edit on GitLab"
msgstr "Editar no GitLab" msgstr "Editar no GitLab"
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58 #: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
msgid "View page source" msgid "View page source"
msgstr "Ver código-fonte da página" msgstr "Ver código-fonte da página"
#. This is an ARIA section label for sequential page links, such as previous #: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
#. and next page links.
#: sphinx_rtd_theme/breadcrumbs.html:67
msgid "Sequential page navigation"
msgstr "Navegação sequencial da página"
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
msgid "Previous"
msgstr "Anterior"
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
msgid "Next" msgid "Next"
msgstr "Próximo" msgstr "Próximo"
#. This is an ARIA section label for the footer section of the page. #: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
#: sphinx_rtd_theme/footer.html:4 msgid "Previous"
msgid "Footer" msgstr "Anterior"
msgstr "Rodapé"
#: sphinx_rtd_theme/footer.html:21 #: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
#, python-format #: sphinx_rtd_theme/layout.html:96
msgid "&#169; <a href=\"%(path)s\">Copyright</a> %(copyright)s." msgid "Copyright"
msgstr "&#169; <a href=\"%(path)s\">Direitos autorais</a> %(copyright)s." msgstr "Copyright"
#: sphinx_rtd_theme/footer.html:23
#, python-format
msgid "&#169; Copyright %(copyright)s."
msgstr "&#169; Direitos autorais %(copyright)s."
#. Build is a noun, not a verb #. Build is a noun, not a verb
#: sphinx_rtd_theme/footer.html:30 #: sphinx_rtd_theme/footer.html:31
msgid "Build" msgid "Build"
msgstr "Compilação" msgstr "Compilação"
#. the phrase "revision" comes from Git, referring to a commit #. the phrase "revision" comes from Git, referring to a commit
#: sphinx_rtd_theme/footer.html:36 #: sphinx_rtd_theme/footer.html:37
msgid "Revision" msgid "Revision"
msgstr "Revisão" msgstr "Revisão"
@ -92,71 +69,56 @@ msgstr "Última atualização em %(last_updated)s."
#. the variable "sphinx_web" is a link to the Sphinx project documentation #. the variable "sphinx_web" is a link to the Sphinx project documentation
#. with #. with
#. the text "Sphinx" #. the text "Sphinx"
#: sphinx_rtd_theme/footer.html:53 #: sphinx_rtd_theme/footer.html:52
#, python-format #, python-format
msgid "Built with %(sphinx_web)s using a" msgid "Built with %(sphinx_web)s using a"
msgstr "Compilado com %(sphinx_web)s usando um" msgstr "Compilado com %(sphinx_web)s usando um"
#. "theme" refers to a theme for Sphinx, which alters the appearance of the #. "theme" refers to a theme for Sphinx, which alters the appearance of the
#. generated documentation #. generated documenation
#: sphinx_rtd_theme/footer.html:55 #: sphinx_rtd_theme/footer.html:54
msgid "theme" msgid "theme"
msgstr "tema" msgstr "tema"
#. this is always used as "provided by Read the Docs", and should not imply #. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation. #. Read the Docs is an author of the generated documentation.
#: sphinx_rtd_theme/footer.html:57 #: sphinx_rtd_theme/footer.html:56
#, python-format #, python-format
msgid "provided by %(readthedocs_web)s" msgid "provided by %(readthedocs_web)s"
msgstr "fornecido por %(readthedocs_web)s" msgstr "fornecido por %(readthedocs_web)s"
#: sphinx_rtd_theme/layout.html:97 #: sphinx_rtd_theme/layout.html:79
#, python-format #, python-format
msgid "Search within %(docstitle)s" msgid "Search within %(docstitle)s"
msgstr "Pesquisar em %(docstitle)s" msgstr "Pesquisar em %(docstitle)s"
#: sphinx_rtd_theme/layout.html:105 #: sphinx_rtd_theme/layout.html:87
msgid "About these documents" msgid "About these documents"
msgstr "Sobre esses documentos" msgstr "Sobre esses documentos"
#: sphinx_rtd_theme/layout.html:108 #: sphinx_rtd_theme/layout.html:90
msgid "Index" msgid "Index"
msgstr "Índice" msgstr "Índice"
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11 #: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
msgid "Search" msgid "Search"
msgstr "Pesquisar" msgstr "Pesquisar"
#: sphinx_rtd_theme/layout.html:114 #: sphinx_rtd_theme/layout.html:128
msgid "Copyright"
msgstr "Copyright"
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
msgid "Logo" msgid "Logo"
msgstr "Logo" msgstr "Logo"
#. This is an ARIA section label for the main navigation menu #: sphinx_rtd_theme/search.html:29
#: sphinx_rtd_theme/layout.html:173
msgid "Navigation menu"
msgstr "Menu de navegação"
#. This is an ARIA section label for the navigation menu that is visible when
#. viewing the page on mobile devices
#: sphinx_rtd_theme/layout.html:195
msgid "Mobile navigation menu"
msgstr "Menu de navegação móvel"
#: sphinx_rtd_theme/search.html:31
msgid "Please activate JavaScript to enable the search functionality." msgid "Please activate JavaScript to enable the search functionality."
msgstr "" msgstr ""
"Por favor, ative JavaScript para habilitar a funcionalidade de pesquisa." "Por favor, ative JavaScript para habilitar a funcionalidade de pesquisa."
#. Search is a noun, not a verb #. Search is a noun, not a verb
#: sphinx_rtd_theme/search.html:39 #: sphinx_rtd_theme/search.html:37
msgid "Search Results" msgid "Search Results"
msgstr "Resultados da pesquisa" msgstr "Resultados da pesquisa"
#: sphinx_rtd_theme/search.html:41 #: sphinx_rtd_theme/search.html:39
msgid "" msgid ""
"Your search did not match any documents. Please make sure that all words are" "Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories." " spelled correctly and that you've selected enough categories."
@ -169,7 +131,7 @@ msgstr ""
msgid "Search docs" msgid "Search docs"
msgstr "Pesquisar documentos" msgstr "Pesquisar documentos"
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11 #: sphinx_rtd_theme/versions.html:11
msgid "Versions" msgid "Versions"
msgstr "Versões" msgstr "Versões"
@ -189,3 +151,9 @@ msgstr "Página inicial"
#: sphinx_rtd_theme/versions.html:29 #: sphinx_rtd_theme/versions.html:29
msgid "Builds" msgid "Builds"
msgstr "Compilações" msgstr "Compilações"
#~ msgid "Docs"
#~ msgstr "Docs"
#~ msgid "Free document hosting provided by"
#~ msgstr "Hospedagem de documentos livres fornecida por"

View File

@ -5,16 +5,16 @@
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019. # FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
# #
# Translators: # Translators:
# Dmitry Shachnev <mitya57@gmail.com>, 2019
# lvv83 <vlozhkin83@gmail.com>, 2019 # lvv83 <vlozhkin83@gmail.com>, 2019
# Dmitry Shachnev <mitya57@gmail.com>, 2021
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n" "Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-09-13 13:35-0600\n" "POT-Creation-Date: 2020-05-06 13:38-0600\n"
"PO-Revision-Date: 2019-07-16 21:44+0000\n" "PO-Revision-Date: 2019-07-16 21:44+0000\n"
"Last-Translator: Dmitry Shachnev <mitya57@gmail.com>, 2021\n" "Last-Translator: lvv83 <vlozhkin83@gmail.com>, 2019\n"
"Language-Team: Russian (https://www.transifex.com/readthedocs/teams/101354/ru/)\n" "Language-Team: Russian (https://www.transifex.com/readthedocs/teams/101354/ru/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -23,64 +23,42 @@ msgstr ""
"Language: ru\n" "Language: ru\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
#. This is an ARIA section label for page links, including previous/next page #: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
#. link and links to GitHub/GitLab/etc.
#: sphinx_rtd_theme/breadcrumbs.html:22
msgid "Page navigation"
msgstr "Навигация по страницам"
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
msgid "Edit on GitHub" msgid "Edit on GitHub"
msgstr "Редактировать на GitHub" msgstr "Редактировать на GitHub"
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46 #: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
msgid "Edit on Bitbucket" msgid "Edit on Bitbucket"
msgstr "Редактировать на BitBucket" msgstr "Редактировать на BitBucket"
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53 #: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
msgid "Edit on GitLab" msgid "Edit on GitLab"
msgstr "Редактировать на GitLab" msgstr "Редактировать на GitLab"
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58 #: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
msgid "View page source" msgid "View page source"
msgstr "Просмотреть исходный код страницы" msgstr "Просмотреть исходный код страницы"
#. This is an ARIA section label for sequential page links, such as previous #: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
#. and next page links.
#: sphinx_rtd_theme/breadcrumbs.html:67
msgid "Sequential page navigation"
msgstr "Навигация по соседним страницам"
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
msgid "Previous"
msgstr "Предыдущая"
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
msgid "Next" msgid "Next"
msgstr "Следующая" msgstr "Следующая"
#. This is an ARIA section label for the footer section of the page. #: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
#: sphinx_rtd_theme/footer.html:4 msgid "Previous"
msgid "Footer" msgstr "Предыдущая"
msgstr "Нижняя область"
#: sphinx_rtd_theme/footer.html:21 #: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
#, python-format #: sphinx_rtd_theme/layout.html:96
msgid "&#169; <a href=\"%(path)s\">Copyright</a> %(copyright)s." msgid "Copyright"
msgstr "&#169; <a href=\"%(path)s\">Авторские права</a> %(copyright)s. " msgstr "Авторские права"
#: sphinx_rtd_theme/footer.html:23
#, python-format
msgid "&#169; Copyright %(copyright)s."
msgstr "&#169; Авторские права %(copyright)s. "
#. Build is a noun, not a verb #. Build is a noun, not a verb
#: sphinx_rtd_theme/footer.html:30 #: sphinx_rtd_theme/footer.html:31
msgid "Build" msgid "Build"
msgstr "Сборка" msgstr "Сборка"
#. the phrase "revision" comes from Git, referring to a commit #. the phrase "revision" comes from Git, referring to a commit
#: sphinx_rtd_theme/footer.html:36 #: sphinx_rtd_theme/footer.html:37
msgid "Revision" msgid "Revision"
msgstr "Ревизия" msgstr "Ревизия"
@ -92,70 +70,55 @@ msgstr "Последний раз обновлено %(last_updated)s."
#. the variable "sphinx_web" is a link to the Sphinx project documentation #. the variable "sphinx_web" is a link to the Sphinx project documentation
#. with #. with
#. the text "Sphinx" #. the text "Sphinx"
#: sphinx_rtd_theme/footer.html:53 #: sphinx_rtd_theme/footer.html:52
#, python-format #, python-format
msgid "Built with %(sphinx_web)s using a" msgid "Built with %(sphinx_web)s using a"
msgstr "Собрано при помощи %(sphinx_web)s с использованием" msgstr "Собрано при помощи %(sphinx_web)s с использованием"
#. "theme" refers to a theme for Sphinx, which alters the appearance of the #. "theme" refers to a theme for Sphinx, which alters the appearance of the
#. generated documentation #. generated documenation
#: sphinx_rtd_theme/footer.html:55 #: sphinx_rtd_theme/footer.html:54
msgid "theme" msgid "theme"
msgstr "темы," msgstr "темы,"
#. this is always used as "provided by Read the Docs", and should not imply #. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation. #. Read the Docs is an author of the generated documentation.
#: sphinx_rtd_theme/footer.html:57 #: sphinx_rtd_theme/footer.html:56
#, python-format #, python-format
msgid "provided by %(readthedocs_web)s" msgid "provided by %(readthedocs_web)s"
msgstr "предоставленной %(readthedocs_web)s" msgstr "предоставленной %(readthedocs_web)s"
#: sphinx_rtd_theme/layout.html:97 #: sphinx_rtd_theme/layout.html:79
#, python-format #, python-format
msgid "Search within %(docstitle)s" msgid "Search within %(docstitle)s"
msgstr "Поиск в %(docstitle)s" msgstr "Поиск в %(docstitle)s"
#: sphinx_rtd_theme/layout.html:105 #: sphinx_rtd_theme/layout.html:87
msgid "About these documents" msgid "About these documents"
msgstr "Об этих документах" msgstr "Об этих документах"
#: sphinx_rtd_theme/layout.html:108 #: sphinx_rtd_theme/layout.html:90
msgid "Index" msgid "Index"
msgstr "Алфавитный указатель" msgstr "Алфавитный указатель"
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11 #: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
msgid "Search" msgid "Search"
msgstr "Поиск" msgstr "Поиск"
#: sphinx_rtd_theme/layout.html:114 #: sphinx_rtd_theme/layout.html:128
msgid "Copyright"
msgstr "Авторские права"
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
msgid "Logo" msgid "Logo"
msgstr "Логотип" msgstr "Логотип"
#. This is an ARIA section label for the main navigation menu #: sphinx_rtd_theme/search.html:29
#: sphinx_rtd_theme/layout.html:173
msgid "Navigation menu"
msgstr "Меню навигации"
#. This is an ARIA section label for the navigation menu that is visible when
#. viewing the page on mobile devices
#: sphinx_rtd_theme/layout.html:195
msgid "Mobile navigation menu"
msgstr "Меню навигации для мобильных устройств"
#: sphinx_rtd_theme/search.html:31
msgid "Please activate JavaScript to enable the search functionality." msgid "Please activate JavaScript to enable the search functionality."
msgstr "Активируйте JavaScript, чтобы использовать функционал поиска." msgstr "Активируйте JavaScript, чтобы использовать функционал поиска."
#. Search is a noun, not a verb #. Search is a noun, not a verb
#: sphinx_rtd_theme/search.html:39 #: sphinx_rtd_theme/search.html:37
msgid "Search Results" msgid "Search Results"
msgstr "Результаты поиска" msgstr "Результаты поиска"
#: sphinx_rtd_theme/search.html:41 #: sphinx_rtd_theme/search.html:39
msgid "" msgid ""
"Your search did not match any documents. Please make sure that all words are" "Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories." " spelled correctly and that you've selected enough categories."
@ -167,7 +130,7 @@ msgstr ""
msgid "Search docs" msgid "Search docs"
msgstr "Поиск в документации" msgstr "Поиск в документации"
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11 #: sphinx_rtd_theme/versions.html:11
msgid "Versions" msgid "Versions"
msgstr "Версии" msgstr "Версии"
@ -187,3 +150,9 @@ msgstr "Домашняя страница проекта"
#: sphinx_rtd_theme/versions.html:29 #: sphinx_rtd_theme/versions.html:29
msgid "Builds" msgid "Builds"
msgstr "Сборки" msgstr "Сборки"
#~ msgid "Docs"
#~ msgstr "Документация"
#~ msgid "Free document hosting provided by"
#~ msgstr "Бесплатный хостинг документов, предоставленный"

View File

@ -1,15 +1,15 @@
# Translations template for sphinx_rtd_theme. # Translations template for sphinx_rtd_theme.
# Copyright (C) 2021 ORGANIZATION # Copyright (C) 2020 ORGANIZATION
# This file is distributed under the same license as the sphinx_rtd_theme # This file is distributed under the same license as the sphinx_rtd_theme
# project. # project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2021. # FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
# #
#, fuzzy #, fuzzy
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: sphinx_rtd_theme 1.0.0\n" "Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-09-13 13:35-0600\n" "POT-Creation-Date: 2020-05-06 13:38-0600\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -18,64 +18,42 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.8.0\n" "Generated-By: Babel 2.8.0\n"
#. This is an ARIA section label for page links, including previous/next page #: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
#. link and links to GitHub/GitLab/etc.
#: sphinx_rtd_theme/breadcrumbs.html:22
msgid "Page navigation"
msgstr ""
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
msgid "Edit on GitHub" msgid "Edit on GitHub"
msgstr "" msgstr ""
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46 #: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
msgid "Edit on Bitbucket" msgid "Edit on Bitbucket"
msgstr "" msgstr ""
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53 #: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
msgid "Edit on GitLab" msgid "Edit on GitLab"
msgstr "" msgstr ""
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58 #: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
msgid "View page source" msgid "View page source"
msgstr "" msgstr ""
#. This is an ARIA section label for sequential page links, such as previous #: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
#. and next page links.
#: sphinx_rtd_theme/breadcrumbs.html:67
msgid "Sequential page navigation"
msgstr ""
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
msgid "Previous"
msgstr ""
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
msgid "Next" msgid "Next"
msgstr "" msgstr ""
#. This is an ARIA section label for the footer section of the page. #: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
#: sphinx_rtd_theme/footer.html:4 msgid "Previous"
msgid "Footer"
msgstr "" msgstr ""
#: sphinx_rtd_theme/footer.html:21 #: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
#, python-format #: sphinx_rtd_theme/layout.html:96
msgid "&#169; <a href=\"%(path)s\">Copyright</a> %(copyright)s." msgid "Copyright"
msgstr ""
#: sphinx_rtd_theme/footer.html:23
#, python-format
msgid "&#169; Copyright %(copyright)s."
msgstr "" msgstr ""
#. Build is a noun, not a verb #. Build is a noun, not a verb
#: sphinx_rtd_theme/footer.html:30 #: sphinx_rtd_theme/footer.html:31
msgid "Build" msgid "Build"
msgstr "" msgstr ""
#. the phrase "revision" comes from Git, referring to a commit #. the phrase "revision" comes from Git, referring to a commit
#: sphinx_rtd_theme/footer.html:36 #: sphinx_rtd_theme/footer.html:37
msgid "Revision" msgid "Revision"
msgstr "" msgstr ""
@ -86,70 +64,59 @@ msgstr ""
#. the variable "sphinx_web" is a link to the Sphinx project documentation with #. the variable "sphinx_web" is a link to the Sphinx project documentation with
#. the text "Sphinx" #. the text "Sphinx"
#: sphinx_rtd_theme/footer.html:53 #: sphinx_rtd_theme/footer.html:52
#, python-format #, python-format
msgid "Built with %(sphinx_web)s using a" msgid "Built with %(sphinx_web)s using a"
msgstr "" msgstr ""
#. "theme" refers to a theme for Sphinx, which alters the appearance of the #. "theme" refers to a theme for Sphinx, which alters the appearance of the
#. generated documentation #. generated documenation
#: sphinx_rtd_theme/footer.html:55 #: sphinx_rtd_theme/footer.html:54
msgid "theme" msgid "theme"
msgstr "" msgstr ""
#. this is always used as "provided by Read the Docs", and should not imply #. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation. #. Read the Docs is an author of the generated documentation.
#: sphinx_rtd_theme/footer.html:57 #: sphinx_rtd_theme/footer.html:56
#, python-format #, python-format
msgid "provided by %(readthedocs_web)s" msgid "provided by %(readthedocs_web)s"
msgstr "" msgstr ""
#: sphinx_rtd_theme/layout.html:97 #: sphinx_rtd_theme/layout.html:79
#, python-format #, python-format
msgid "Search within %(docstitle)s" msgid "Search within %(docstitle)s"
msgstr "" msgstr ""
#: sphinx_rtd_theme/layout.html:105 #: sphinx_rtd_theme/layout.html:87
msgid "About these documents" msgid "About these documents"
msgstr "" msgstr ""
#: sphinx_rtd_theme/layout.html:108 #: sphinx_rtd_theme/layout.html:90
msgid "Index" msgid "Index"
msgstr "" msgstr ""
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11 #: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
msgid "Search" msgid "Search"
msgstr "" msgstr ""
#: sphinx_rtd_theme/layout.html:114 #: sphinx_rtd_theme/layout.html:121
msgid "Copyright" msgid "Documentation Home"
msgstr "" msgstr ""
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149 #: sphinx_rtd_theme/layout.html:128
msgid "Logo" msgid "Logo"
msgstr "" msgstr ""
#. This is an ARIA section label for the main navigation menu #: sphinx_rtd_theme/search.html:29
#: sphinx_rtd_theme/layout.html:173
msgid "Navigation menu"
msgstr ""
#. This is an ARIA section label for the navigation menu that is visible when
#. viewing the page on mobile devices
#: sphinx_rtd_theme/layout.html:195
msgid "Mobile navigation menu"
msgstr ""
#: sphinx_rtd_theme/search.html:31
msgid "Please activate JavaScript to enable the search functionality." msgid "Please activate JavaScript to enable the search functionality."
msgstr "" msgstr ""
#. Search is a noun, not a verb #. Search is a noun, not a verb
#: sphinx_rtd_theme/search.html:39 #: sphinx_rtd_theme/search.html:37
msgid "Search Results" msgid "Search Results"
msgstr "" msgstr ""
#: sphinx_rtd_theme/search.html:41 #: sphinx_rtd_theme/search.html:39
msgid "" msgid ""
"Your search did not match any documents. Please make sure that all words " "Your search did not match any documents. Please make sure that all words "
"are spelled correctly and that you've selected enough categories." "are spelled correctly and that you've selected enough categories."
@ -159,7 +126,7 @@ msgstr ""
msgid "Search docs" msgid "Search docs"
msgstr "" msgstr ""
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11 #: sphinx_rtd_theme/versions.html:11
msgid "Versions" msgid "Versions"
msgstr "" msgstr ""

View File

@ -11,7 +11,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n" "Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-09-13 13:35-0600\n" "POT-Creation-Date: 2020-05-06 13:38-0600\n"
"PO-Revision-Date: 2019-07-16 21:44+0000\n" "PO-Revision-Date: 2019-07-16 21:44+0000\n"
"Last-Translator: Daniel Holmberg <daniel.holmberg97@gmail.com>, 2020\n" "Last-Translator: Daniel Holmberg <daniel.holmberg97@gmail.com>, 2020\n"
"Language-Team: Swedish (https://www.transifex.com/readthedocs/teams/101354/sv/)\n" "Language-Team: Swedish (https://www.transifex.com/readthedocs/teams/101354/sv/)\n"
@ -22,37 +22,42 @@ msgstr ""
"Language: sv\n" "Language: sv\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39 #: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
msgid "Edit on GitHub" msgid "Edit on GitHub"
msgstr "Editera på GitHub" msgstr "Editera på GitHub"
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46 #: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
msgid "Edit on Bitbucket" msgid "Edit on Bitbucket"
msgstr "Editera på Bitbucket" msgstr "Editera på Bitbucket"
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53 #: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
msgid "Edit on GitLab" msgid "Edit on GitLab"
msgstr "Editera på GitLab" msgstr "Editera på GitLab"
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58 #: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
msgid "View page source" msgid "View page source"
msgstr "Visa sidkälla" msgstr "Visa sidkälla"
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6 #: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
msgid "Previous"
msgstr "Tillbaka"
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
msgid "Next" msgid "Next"
msgstr "Nästa" msgstr "Nästa"
#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
msgid "Previous"
msgstr "Tillbaka"
#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
#: sphinx_rtd_theme/layout.html:96
msgid "Copyright"
msgstr "Upphovsrätt"
#. Build is a noun, not a verb #. Build is a noun, not a verb
#: sphinx_rtd_theme/footer.html:30 #: sphinx_rtd_theme/footer.html:31
msgid "Build" msgid "Build"
msgstr "Bygg" msgstr "Bygg"
#. the phrase "revision" comes from Git, referring to a commit #. the phrase "revision" comes from Git, referring to a commit
#: sphinx_rtd_theme/footer.html:36 #: sphinx_rtd_theme/footer.html:37
msgid "Revision" msgid "Revision"
msgstr "Ändra" msgstr "Ändra"
@ -64,60 +69,60 @@ msgstr "Senast uppdaterad %(last_updated)s."
#. the variable "sphinx_web" is a link to the Sphinx project documentation #. the variable "sphinx_web" is a link to the Sphinx project documentation
#. with #. with
#. the text "Sphinx" #. the text "Sphinx"
#: sphinx_rtd_theme/footer.html:53 #: sphinx_rtd_theme/footer.html:52
#, python-format #, python-format
msgid "Built with %(sphinx_web)s using a" msgid "Built with %(sphinx_web)s using a"
msgstr "Gjord med %(sphinx_web)s med hjälp av" msgstr "Gjord med %(sphinx_web)s med hjälp av"
#. "theme" refers to a theme for Sphinx, which alters the appearance of the #. "theme" refers to a theme for Sphinx, which alters the appearance of the
#. generated documenation #. generated documenation
#: sphinx_rtd_theme/footer.html:55 #: sphinx_rtd_theme/footer.html:54
msgid "theme" msgid "theme"
msgstr "tema" msgstr "tema"
#. this is always used as "provided by Read the Docs", and should not imply #. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation. #. Read the Docs is an author of the generated documentation.
#: sphinx_rtd_theme/footer.html:57 #: sphinx_rtd_theme/footer.html:56
#, python-format #, python-format
msgid "provided by %(readthedocs_web)s" msgid "provided by %(readthedocs_web)s"
msgstr "erhållet av %(readthedocs_web)s" msgstr "erhållet av %(readthedocs_web)s"
#: sphinx_rtd_theme/layout.html:97 #: sphinx_rtd_theme/layout.html:79
#, python-format #, python-format
msgid "Search within %(docstitle)s" msgid "Search within %(docstitle)s"
msgstr "Sök i %(docstitle)s" msgstr "Sök i %(docstitle)s"
#: sphinx_rtd_theme/layout.html:105 #: sphinx_rtd_theme/layout.html:87
msgid "About these documents" msgid "About these documents"
msgstr "Om dessa dokument" msgstr "Om dessa dokument"
#: sphinx_rtd_theme/layout.html:108 #: sphinx_rtd_theme/layout.html:90
msgid "Index" msgid "Index"
msgstr "Index" msgstr "Index"
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11 #: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
msgid "Search" msgid "Search"
msgstr "Sök" msgstr "Sök"
#: sphinx_rtd_theme/layout.html:114 #: sphinx_rtd_theme/layout.html:121
msgid "Copyright" msgid "Documentation Home"
msgstr "Upphovsrätt" msgstr "Dokumentation Hem"
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149 #: sphinx_rtd_theme/layout.html:128
msgid "Logo" msgid "Logo"
msgstr "Logo" msgstr "Logo"
#: sphinx_rtd_theme/search.html:31 #: sphinx_rtd_theme/search.html:29
msgid "Please activate JavaScript to enable the search functionality." msgid "Please activate JavaScript to enable the search functionality."
msgstr "" msgstr ""
"Var vänlig och aktivera JavaScript för att möjliggöra sökfunktionaliteten." "Var vänlig och aktivera JavaScript för att möjliggöra sökfunktionaliteten."
#. Search is a noun, not a verb #. Search is a noun, not a verb
#: sphinx_rtd_theme/search.html:39 #: sphinx_rtd_theme/search.html:37
msgid "Search Results" msgid "Search Results"
msgstr "Sökresultat" msgstr "Sökresultat"
#: sphinx_rtd_theme/search.html:41 #: sphinx_rtd_theme/search.html:39
msgid "" msgid ""
"Your search did not match any documents. Please make sure that all words are" "Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories." " spelled correctly and that you've selected enough categories."
@ -129,7 +134,7 @@ msgstr ""
msgid "Search docs" msgid "Search docs"
msgstr "Sök i dokumentationen" msgstr "Sök i dokumentationen"
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11 #: sphinx_rtd_theme/versions.html:11
msgid "Versions" msgid "Versions"
msgstr "Versioner" msgstr "Versioner"
@ -146,6 +151,8 @@ msgstr "På Read the Docs"
msgid "Project Home" msgid "Project Home"
msgstr "Projekt Hem" msgstr "Projekt Hem"
#: sphinx_rtd_theme/versions.html:29 #~ msgid "Docs"
msgid "Builds" #~ msgstr "Dokumentation"
msgstr "Versioner"
#~ msgid "Free document hosting provided by"
#~ msgstr "Gratis dokumentations hysning erhållen av"

View File

@ -11,7 +11,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n" "Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-09-13 13:35-0600\n" "POT-Creation-Date: 2020-05-06 13:38-0600\n"
"PO-Revision-Date: 2019-07-16 21:44+0000\n" "PO-Revision-Date: 2019-07-16 21:44+0000\n"
"Last-Translator: BouRock, 2020\n" "Last-Translator: BouRock, 2020\n"
"Language-Team: Turkish (https://www.transifex.com/readthedocs/teams/101354/tr/)\n" "Language-Team: Turkish (https://www.transifex.com/readthedocs/teams/101354/tr/)\n"
@ -22,37 +22,42 @@ msgstr ""
"Language: tr\n" "Language: tr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39 #: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
msgid "Edit on GitHub" msgid "Edit on GitHub"
msgstr "GitHub'da Düzenle" msgstr "GitHub'da Düzenle"
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46 #: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
msgid "Edit on Bitbucket" msgid "Edit on Bitbucket"
msgstr "Bitbucket'ta Düzenle" msgstr "Bitbucket'ta Düzenle"
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53 #: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
msgid "Edit on GitLab" msgid "Edit on GitLab"
msgstr "GitLab'ta Düzenle" msgstr "GitLab'ta Düzenle"
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58 #: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
msgid "View page source" msgid "View page source"
msgstr "Sayfa kaynağını görüntüle" msgstr "Sayfa kaynağını görüntüle"
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6 #: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
msgid "Previous"
msgstr "Önceki"
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
msgid "Next" msgid "Next"
msgstr "Sonraki" msgstr "Sonraki"
#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
msgid "Previous"
msgstr "Önceki"
#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
#: sphinx_rtd_theme/layout.html:96
msgid "Copyright"
msgstr "Telif hakkı"
#. Build is a noun, not a verb #. Build is a noun, not a verb
#: sphinx_rtd_theme/footer.html:30 #: sphinx_rtd_theme/footer.html:31
msgid "Build" msgid "Build"
msgstr "Oluşturma" msgstr "Oluşturma"
#. the phrase "revision" comes from Git, referring to a commit #. the phrase "revision" comes from Git, referring to a commit
#: sphinx_rtd_theme/footer.html:36 #: sphinx_rtd_theme/footer.html:37
msgid "Revision" msgid "Revision"
msgstr "Gözden geçirme" msgstr "Gözden geçirme"
@ -62,54 +67,50 @@ msgid "Last updated on %(last_updated)s."
msgstr "Son olarak %(last_updated)s tarihinde güncellendi." msgstr "Son olarak %(last_updated)s tarihinde güncellendi."
#. "theme" refers to a theme for Sphinx, which alters the appearance of the #. "theme" refers to a theme for Sphinx, which alters the appearance of the
#. generated documentation #. generated documenation
#: sphinx_rtd_theme/footer.html:55 #: sphinx_rtd_theme/footer.html:54
msgid "theme" msgid "theme"
msgstr "tema" msgstr "tema"
#. this is always used as "provided by Read the Docs", and should not imply #. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation. #. Read the Docs is an author of the generated documentation.
#: sphinx_rtd_theme/footer.html:57 #: sphinx_rtd_theme/footer.html:56
#, python-format #, python-format
msgid "provided by %(readthedocs_web)s" msgid "provided by %(readthedocs_web)s"
msgstr "kullanılarak %(readthedocs_web)s tarafından sağlanmasıyla oluşturuldu" msgstr "kullanılarak %(readthedocs_web)s tarafından sağlanmasıyla oluşturuldu"
#: sphinx_rtd_theme/layout.html:97 #: sphinx_rtd_theme/layout.html:79
#, python-format #, python-format
msgid "Search within %(docstitle)s" msgid "Search within %(docstitle)s"
msgstr "%(docstitle)s içinde ara" msgstr "%(docstitle)s içinde ara"
#: sphinx_rtd_theme/layout.html:105 #: sphinx_rtd_theme/layout.html:87
msgid "About these documents" msgid "About these documents"
msgstr "Bu belgeler hakkında" msgstr "Bu belgeler hakkında"
#: sphinx_rtd_theme/layout.html:108 #: sphinx_rtd_theme/layout.html:90
msgid "Index" msgid "Index"
msgstr "Dizin" msgstr "Dizin"
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11 #: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
msgid "Search" msgid "Search"
msgstr "Arama" msgstr "Arama"
#: sphinx_rtd_theme/layout.html:114 #: sphinx_rtd_theme/layout.html:128
msgid "Copyright"
msgstr "Telif hakkı"
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
msgid "Logo" msgid "Logo"
msgstr "Logo" msgstr "Logo"
#: sphinx_rtd_theme/search.html:31 #: sphinx_rtd_theme/search.html:29
msgid "Please activate JavaScript to enable the search functionality." msgid "Please activate JavaScript to enable the search functionality."
msgstr "" msgstr ""
"Arama işlevselliğini etkinleştirmek için lütfen JavaScript'i etkinleştirin." "Arama işlevselliğini etkinleştirmek için lütfen JavaScript'i etkinleştirin."
#. Search is a noun, not a verb #. Search is a noun, not a verb
#: sphinx_rtd_theme/search.html:39 #: sphinx_rtd_theme/search.html:37
msgid "Search Results" msgid "Search Results"
msgstr "Arama Sonuçları" msgstr "Arama Sonuçları"
#: sphinx_rtd_theme/search.html:41 #: sphinx_rtd_theme/search.html:39
msgid "" msgid ""
"Your search did not match any documents. Please make sure that all words are" "Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories." " spelled correctly and that you've selected enough categories."
@ -121,7 +122,7 @@ msgstr ""
msgid "Search docs" msgid "Search docs"
msgstr "Belgeleri arayın" msgstr "Belgeleri arayın"
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11 #: sphinx_rtd_theme/versions.html:11
msgid "Versions" msgid "Versions"
msgstr "Sürümler" msgstr "Sürümler"
@ -141,3 +142,6 @@ msgstr "Proje Ana Sayfa"
#: sphinx_rtd_theme/versions.html:29 #: sphinx_rtd_theme/versions.html:29
msgid "Builds" msgid "Builds"
msgstr "Oluşturmalar" msgstr "Oluşturmalar"
#~ msgid "Free document hosting provided by"
#~ msgstr "Ücretsiz belge barındırmayı sağlayan"

View File

@ -12,7 +12,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n" "Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2021-09-13 13:35-0600\n" "POT-Creation-Date: 2020-05-06 13:38-0600\n"
"PO-Revision-Date: 2019-07-16 21:44+0000\n" "PO-Revision-Date: 2019-07-16 21:44+0000\n"
"Last-Translator: Anthony <aj@ohess.org>, 2020\n" "Last-Translator: Anthony <aj@ohess.org>, 2020\n"
"Language-Team: Chinese (China) (https://www.transifex.com/readthedocs/teams/101354/zh_CN/)\n" "Language-Team: Chinese (China) (https://www.transifex.com/readthedocs/teams/101354/zh_CN/)\n"
@ -23,40 +23,40 @@ msgstr ""
"Language: zh_CN\n" "Language: zh_CN\n"
"Plural-Forms: nplurals=1; plural=0;\n" "Plural-Forms: nplurals=1; plural=0;\n"
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39 #: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
msgid "Edit on GitHub" msgid "Edit on GitHub"
msgstr "在 GitHub 上修改" msgstr "在 GitHub 上修改"
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46 #: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
msgid "Edit on Bitbucket" msgid "Edit on Bitbucket"
msgstr "在 Bitbucket 上修改" msgstr "在 Bitbucket 上修改"
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53 #: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
msgid "Edit on GitLab" msgid "Edit on GitLab"
msgstr "在 GitLab 上修改" msgstr "在 GitLab 上修改"
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58 #: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
msgid "View page source" msgid "View page source"
msgstr "查看页面源码" msgstr "查看页面源码"
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6 #: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
msgid "Previous"
msgstr "上一页"
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
msgid "Next" msgid "Next"
msgstr "下一页" msgstr "下一页"
#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
msgid "Previous"
msgstr "上一页"
#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
#: sphinx_rtd_theme/layout.html:96
msgid "Copyright"
msgstr "版权所有"
#. Build is a noun, not a verb #. Build is a noun, not a verb
#: sphinx_rtd_theme/footer.html:30 #: sphinx_rtd_theme/footer.html:31
msgid "Build" msgid "Build"
msgstr "构建" msgstr "构建"
#. the phrase "revision" comes from Git, referring to a commit
#: sphinx_rtd_theme/footer.html:36
msgid "Revision"
msgstr "修订"
#: sphinx_rtd_theme/footer.html:41 #: sphinx_rtd_theme/footer.html:41
#, python-format #, python-format
msgid "Last updated on %(last_updated)s." msgid "Last updated on %(last_updated)s."
@ -65,59 +65,55 @@ msgstr "最后更新时间 %(last_updated)s。"
#. the variable "sphinx_web" is a link to the Sphinx project documentation #. the variable "sphinx_web" is a link to the Sphinx project documentation
#. with #. with
#. the text "Sphinx" #. the text "Sphinx"
#: sphinx_rtd_theme/footer.html:53 #: sphinx_rtd_theme/footer.html:52
#, python-format #, python-format
msgid "Built with %(sphinx_web)s using a" msgid "Built with %(sphinx_web)s using a"
msgstr "利用 %(sphinx_web)s 构建,使用了 " msgstr "利用 %(sphinx_web)s 构建,使用了 "
#. "theme" refers to a theme for Sphinx, which alters the appearance of the #. "theme" refers to a theme for Sphinx, which alters the appearance of the
#. generated documentation #. generated documenation
#: sphinx_rtd_theme/footer.html:55 #: sphinx_rtd_theme/footer.html:54
msgid "theme" msgid "theme"
msgstr "主题" msgstr "主题"
#. this is always used as "provided by Read the Docs", and should not imply #. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation. #. Read the Docs is an author of the generated documentation.
#: sphinx_rtd_theme/footer.html:57 #: sphinx_rtd_theme/footer.html:56
#, python-format #, python-format
msgid "provided by %(readthedocs_web)s" msgid "provided by %(readthedocs_web)s"
msgstr "由 %(readthedocs_web)s开发" msgstr "由 %(readthedocs_web)s开发"
#: sphinx_rtd_theme/layout.html:97 #: sphinx_rtd_theme/layout.html:79
#, python-format #, python-format
msgid "Search within %(docstitle)s" msgid "Search within %(docstitle)s"
msgstr "在 %(docstitle)s中搜索" msgstr "在 %(docstitle)s中搜索"
#: sphinx_rtd_theme/layout.html:105 #: sphinx_rtd_theme/layout.html:87
msgid "About these documents" msgid "About these documents"
msgstr "关于此文档" msgstr "关于此文档"
#: sphinx_rtd_theme/layout.html:108 #: sphinx_rtd_theme/layout.html:90
msgid "Index" msgid "Index"
msgstr "索引" msgstr "索引"
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11 #: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
msgid "Search" msgid "Search"
msgstr "搜索" msgstr "搜索"
#: sphinx_rtd_theme/layout.html:114 #: sphinx_rtd_theme/layout.html:128
msgid "Copyright"
msgstr "版权所有"
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
msgid "Logo" msgid "Logo"
msgstr "Logo" msgstr "Logo"
#: sphinx_rtd_theme/search.html:31 #: sphinx_rtd_theme/search.html:29
msgid "Please activate JavaScript to enable the search functionality." msgid "Please activate JavaScript to enable the search functionality."
msgstr "请启用 JavaScript 以便使用搜索功能" msgstr "请启用 JavaScript 以便使用搜索功能"
#. Search is a noun, not a verb #. Search is a noun, not a verb
#: sphinx_rtd_theme/search.html:39 #: sphinx_rtd_theme/search.html:37
msgid "Search Results" msgid "Search Results"
msgstr "搜索结果" msgstr "搜索结果"
#: sphinx_rtd_theme/search.html:41 #: sphinx_rtd_theme/search.html:39
msgid "" msgid ""
"Your search did not match any documents. Please make sure that all words are" "Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories." " spelled correctly and that you've selected enough categories."
@ -127,7 +123,7 @@ msgstr "您的搜索没有匹配到任何文档。请确保所有单词拼写正
msgid "Search docs" msgid "Search docs"
msgstr "在文档中搜索" msgstr "在文档中搜索"
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11 #: sphinx_rtd_theme/versions.html:11
msgid "Versions" msgid "Versions"
msgstr "版本列表" msgstr "版本列表"
@ -147,3 +143,9 @@ msgstr "项目首页"
#: sphinx_rtd_theme/versions.html:29 #: sphinx_rtd_theme/versions.html:29
msgid "Builds" msgid "Builds"
msgstr "构建" msgstr "构建"
#~ msgid "Docs"
#~ msgstr "文档"
#~ msgid "Free document hosting provided by"
#~ msgstr "此文档免费托管于"

View File

@ -5,23 +5,22 @@
Template for the search page. Template for the search page.
:copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS. :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
:license: BSD, see https://github.com/sphinx-doc/sphinx/blob/master/LICENSE for details. :license: BSD, see LICENSE for details.
#} #}
{%- extends "layout.html" %} {%- extends "layout.html" %}
{% set title = _('Search') %} {% set title = _('Search') %}
{% set display_vcs_links = False %} {% set display_vcs_links = False %}
{%- block scripts %} {%- block scripts %}
{{ super() }} {{ super() }}
<script src="{{ pathto('_static/searchtools.js', 1) }}"></script> <script type="text/javascript" src="{{ pathto('_static/searchtools.js', 1) }}"></script>
<script src="{{ pathto('_static/language_data.js', 1) }}"></script>
{%- endblock %} {%- endblock %}
{% block footer %} {% block footer %}
<script> <script type="text/javascript">
jQuery(function() { Search.loadIndex("{{ pathto('searchindex.js', 1) }}"); }); jQuery(function() { Search.loadIndex("{{ pathto('searchindex.js', 1) }}"); });
</script> </script>
{# this is used when loading the search index using $.ajax fails, {# this is used when loading the search index using $.ajax fails,
such as on Chrome for documents on localhost #} such as on Chrome for documents on localhost #}
<script id="searchindexloader"></script> <script type="text/javascript" id="searchindexloader"></script>
{{ super() }} {{ super() }}
{% endblock %} {% endblock %}
{% block body %} {% block body %}

View File

@ -1,4 +1,4 @@
{%- if 'singlehtml' not in builder %} {%- if builder != 'singlehtml' %}
<div role="search"> <div role="search">
<form id="rtd-search-form" class="wy-form" action="{{ pathto('search') }}" method="get"> <form id="rtd-search-form" class="wy-form" action="{{ pathto('search') }}" method="get">
<input type="text" name="q" placeholder="{{ _('Search docs') }}" /> <input type="text" name="q" placeholder="{{ _('Search docs') }}" />

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -6,7 +6,6 @@ pygments_style = default
[options] [options]
canonical_url = canonical_url =
analytics_id = analytics_id =
analytics_anonymize_ip = False
collapse_navigation = True collapse_navigation = True
sticky_navigation = True sticky_navigation = True
navigation_depth = 4 navigation_depth = 4
@ -17,4 +16,3 @@ display_version = True
prev_next_buttons_location = bottom prev_next_buttons_location = bottom
style_external_links = False style_external_links = False
style_nav_header_background = style_nav_header_background =
vcs_pageview_mode =

View File

@ -1,6 +1,6 @@
{% if READTHEDOCS %} {% if READTHEDOCS %}
{# Add rst-badge after rst-versions for small badge style. #} {# Add rst-badge after rst-versions for small badge style. #}
<div class="rst-versions" data-toggle="rst-versions" role="note" aria-label="{{ _('Versions') }}"> <div class="rst-versions" data-toggle="rst-versions" role="note" aria-label="versions">
<span class="rst-current-version" data-toggle="rst-current-version"> <span class="rst-current-version" data-toggle="rst-current-version">
<span class="fa fa-book"> Read the Docs</span> <span class="fa fa-book"> Read the Docs</span>
v: {{ current_version }} v: {{ current_version }}

5
doc/asio_http2.h.rst.in Normal file
View File

@ -0,0 +1,5 @@
asio_http2.h
============
.. literalinclude:: @top_srcdir@/src/includes/nghttp2/asio_http2.h
:language: cpp

View File

@ -0,0 +1,5 @@
asio_http2_client.h
===================
.. literalinclude:: @top_srcdir@/src/includes/nghttp2/asio_http2_client.h
:language: cpp

View File

@ -0,0 +1,5 @@
asio_http2_server.h
===================
.. literalinclude:: @top_srcdir@/src/includes/nghttp2/asio_http2_server.h
:language: cpp

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 '--requests --clients --threads --input-file --max-concurrent-streams --max-frame-size --window-bits --connection-window-bits --header --ciphers --tls13-ciphers --no-tls-proto --data --rate --rate-period --duration --warm-up-time --connection-active-timeout --connection-inactivity-timeout --timing-script-file --base-uri --npn-list --h1 --header-table-size --encoder-header-table-size --log-file --qlog-file-base --connect-to --rps --groups --no-udp-gso --max-udp-payload-size --ktls --verbose --version --help ' -- "$cur" ) ) COMPREPLY=( $( compgen -W '--connection-window-bits --clients --verbose --ciphers --rate --no-tls-proto --connect-to --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" ) )
;; ;;
*) *)
_filedir _filedir

View File

@ -1,6 +1,8 @@
#!/usr/bin/env python3 #!/usr/bin/env python
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import unicode_literals
from __future__ import print_function
import subprocess import subprocess
import io import io
import re import re

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 '--verbose --null-out --remote-name --timeout --window-bits --connection-window-bits --get-assets --stat --header --trailer --cert --key --data --multiply --upgrade --weight --peer-max-concurrent-streams --header-table-size --encoder-header-table-size --padding --har --color --continuation --no-content-length --no-dep --hexdump --no-push --max-concurrent-streams --expect-continue --no-verify-peer --ktls --no-rfc7540-pri --version --help ' -- "$cur" ) ) 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" ) )
;; ;;
*) *)
_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 '--address --daemon --verify-client --htdocs --verbose --no-tls --header-table-size --encoder-header-table-size --color --push --padding --max-concurrent-streams --workers --error-gzip --window-bits --connection-window-bits --dh-param-file --early-response --trailer --hexdump --echo-upload --mime-types-file --no-content-length --ktls --no-rfc7540-pri --version --help ' -- "$cur" ) ) 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" ) )
;; ;;
*) *)
_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 '--backend --frontend --backlog --backend-address-family --backend-http-proxy-uri --workers --single-thread --read-rate --read-burst --write-rate --write-burst --worker-read-rate --worker-read-burst --worker-write-rate --worker-write-burst --worker-frontend-connections --backend-connections-per-host --backend-connections-per-frontend --rlimit-nofile --rlimit-memlock --backend-request-buffer --backend-response-buffer --fastopen --no-kqueue --frontend-http2-read-timeout --frontend-http3-read-timeout --frontend-read-timeout --frontend-write-timeout --frontend-keep-alive-timeout --stream-read-timeout --stream-write-timeout --backend-read-timeout --backend-write-timeout --backend-connect-timeout --backend-keep-alive-timeout --listener-disable-timeout --frontend-http2-setting-timeout --backend-http2-settings-timeout --backend-max-backoff --ciphers --tls13-ciphers --client-ciphers --tls13-client-ciphers --ecdh-curves --insecure --cacert --private-key-passwd-file --subcert --dh-param-file --npn-list --verify-client --verify-client-cacert --verify-client-tolerate-expired --client-private-key-file --client-cert-file --tls-min-proto-version --tls-max-proto-version --tls-ticket-key-file --tls-ticket-key-memcached --tls-ticket-key-memcached-address-family --tls-ticket-key-memcached-interval --tls-ticket-key-memcached-max-retry --tls-ticket-key-memcached-max-fail --tls-ticket-key-cipher --tls-ticket-key-memcached-cert-file --tls-ticket-key-memcached-private-key-file --fetch-ocsp-response-file --ocsp-update-interval --ocsp-startup --no-verify-ocsp --no-ocsp --tls-session-cache-memcached --tls-session-cache-memcached-address-family --tls-session-cache-memcached-cert-file --tls-session-cache-memcached-private-key-file --tls-dyn-rec-warmup-threshold --tls-dyn-rec-idle-timeout --no-http2-cipher-block-list --client-no-http2-cipher-block-list --tls-sct-dir --psk-secrets --client-psk-secrets --tls-no-postpone-early-data --tls-max-early-data --tls-ktls --frontend-http2-max-concurrent-streams --backend-http2-max-concurrent-streams --frontend-http2-window-size --frontend-http2-connection-window-size --backend-http2-window-size --backend-http2-connection-window-size --http2-no-cookie-crumbling --padding --no-server-push --frontend-http2-optimize-write-buffer-size --frontend-http2-optimize-window-size --frontend-http2-encoder-dynamic-table-size --frontend-http2-decoder-dynamic-table-size --backend-http2-encoder-dynamic-table-size --backend-http2-decoder-dynamic-table-size --http2-proxy --log-level --accesslog-file --accesslog-syslog --accesslog-format --accesslog-write-early --errorlog-file --errorlog-syslog --syslog-facility --add-x-forwarded-for --strip-incoming-x-forwarded-for --no-add-x-forwarded-proto --no-strip-incoming-x-forwarded-proto --add-forwarded --strip-incoming-forwarded --forwarded-by --forwarded-for --no-via --no-strip-incoming-early-data --no-location-rewrite --host-rewrite --altsvc --http2-altsvc --add-request-header --add-response-header --request-header-field-buffer --max-request-header-fields --response-header-field-buffer --max-response-header-fields --error-page --server-name --no-server-rewrite --redirect-https-port --require-http-scheme --api-max-request-body --dns-cache-timeout --dns-lookup-timeout --dns-max-try --frontend-max-requests --frontend-http2-dump-request-header --frontend-http2-dump-response-header --frontend-frame-debug --daemon --pid-file --user --single-process --max-worker-processes --worker-process-grace-shutdown-period --mruby-file --ignore-per-pattern-mruby-error --frontend-quic-idle-timeout --frontend-quic-debug-log --quic-bpf-program-file --frontend-quic-early-data --frontend-quic-qlog-dir --frontend-quic-require-token --frontend-quic-congestion-controller --frontend-quic-secret-file --quic-server-id --frontend-quic-initial-rtt --no-quic-bpf --frontend-http3-window-size --frontend-http3-connection-window-size --frontend-http3-max-window-size --frontend-http3-max-connection-window-size --frontend-http3-max-concurrent-streams --conf --include --version --help ' -- "$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-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" ) )
;; ;;
*) *)
_filedir _filedir

View File

@ -41,7 +41,7 @@ import sys, os
# documentation root, use os.path.abspath to make it absolute, like shown here. # documentation root, use os.path.abspath to make it absolute, like shown here.
#sys.path.insert(0, os.path.abspath('.')) #sys.path.insert(0, os.path.abspath('.'))
sys.path.insert(0, os.path.abspath('@top_srcdir@/doc/_exts')) sys.path.append(os.path.abspath('@top_srcdir@/doc/_exts'))
# -- General configuration ----------------------------------------------------- # -- General configuration -----------------------------------------------------
@ -50,7 +50,7 @@ sys.path.insert(0, os.path.abspath('@top_srcdir@/doc/_exts'))
# Add any Sphinx extension module names here, as strings. They can be extensions # Add any Sphinx extension module names here, as strings. They can be extensions
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. # coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
extensions = ['rubydomain.rubydomain'] extensions = ['sphinxcontrib.rubydomain']
# Add any paths that contain templates here, relative to this directory. # Add any paths that contain templates here, relative to this directory.
templates_path = ['@top_srcdir@/_templates'] templates_path = ['@top_srcdir@/_templates']

View File

@ -1,5 +1,8 @@
.\" Man page generated from reStructuredText. .\" Man page generated from reStructuredText.
. .
.TH "H2LOAD" "1" "Jun 02, 2020" "1.41.0" "nghttp2"
.SH NAME
h2load \- HTTP/2 benchmarking tool
. .
.nr rst2man-indent-level 0 .nr rst2man-indent-level 0
. .
@ -27,9 +30,6 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
.. ..
.TH "H2LOAD" "1" "Nov 13, 2022" "1.51.0" "nghttp2"
.SH NAME
h2load \- HTTP/2 benchmarking tool
.SH SYNOPSIS .SH SYNOPSIS
.sp .sp
\fBh2load\fP [OPTIONS]... [URI]... \fBh2load\fP [OPTIONS]... [URI]...
@ -99,17 +99,8 @@ Default: \fB1\fP
.UNINDENT .UNINDENT
.INDENT 0.0 .INDENT 0.0
.TP .TP
.B \-f, \-\-max\-frame\-size=<SIZE>
Maximum frame size that the local endpoint is willing to
receive.
.sp
Default: \fB16K\fP
.UNINDENT
.INDENT 0.0
.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 QUIC, <N> is capped to 26 (roughly 64MiB).
.sp .sp
Default: \fB30\fP Default: \fB30\fP
.UNINDENT .UNINDENT
@ -129,18 +120,10 @@ Add/Override a header to the requests.
.INDENT 0.0 .INDENT 0.0
.TP .TP
.B \-\-ciphers=<SUITE> .B \-\-ciphers=<SUITE>
Set allowed cipher list for TLSv1.2 or earlier. The Set allowed cipher list. The format of the string is
format of the string is described in OpenSSL ciphers(1). described in OpenSSL ciphers(1).
.sp .sp
Default: \fBECDHE\-ECDSA\-AES128\-GCM\-SHA256:ECDHE\-RSA\-AES128\-GCM\-SHA256:ECDHE\-ECDSA\-AES256\-GCM\-SHA384:ECDHE\-RSA\-AES256\-GCM\-SHA384:ECDHE\-ECDSA\-CHACHA20\-POLY1305:ECDHE\-RSA\-CHACHA20\-POLY1305:DHE\-RSA\-AES128\-GCM\-SHA256:DHE\-RSA\-AES256\-GCM\-SHA384\fP 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
.INDENT 0.0
.TP
.B \-\-tls13\-ciphers=<SUITE>
Set allowed cipher list for TLSv1.3. The format of the
string is described in OpenSSL ciphers(1).
.sp
Default: \fBTLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_CCM_SHA256\fP
.UNINDENT .UNINDENT
.INDENT 0.0 .INDENT 0.0
.TP .TP
@ -185,7 +168,7 @@ option is 1s.
.UNINDENT .UNINDENT
.INDENT 0.0 .INDENT 0.0
.TP .TP
.B \-D, \-\-duration=<DURATION> .B \-D, \-\-duration=<N>
Specifies the main duration for the measurements in case Specifies the main duration for the measurements in case
of timing\-based benchmarking. \fI\%\-D\fP and \fI\%\-r\fP are mutually of timing\-based benchmarking. \fI\%\-D\fP and \fI\%\-r\fP are mutually
exclusive. exclusive.
@ -237,8 +220,7 @@ to the number of script lines. The scheme, host and
port defined in the first URI are used solely. Values port defined in the first URI are used solely. Values
contained in other URIs, if present, are ignored. contained in other URIs, if present, are ignored.
Definition of a base URI overrides all scheme, host or Definition of a base URI overrides all scheme, host or
port values. \fI\%\-\-timing\-script\-file\fP and \fI\%\-\-rps\fP are port values.
mutually exclusive.
.UNINDENT .UNINDENT
.INDENT 0.0 .INDENT 0.0
.TP .TP
@ -302,49 +284,12 @@ to buffering. Status code is \-1 for failed streams.
.UNINDENT .UNINDENT
.INDENT 0.0 .INDENT 0.0
.TP .TP
.B \-\-qlog\-file\-base=<PATH>
Enable qlog output and specify base file name for qlogs.
Qlog is emitted for each connection. For a given base
name "base", each output file name becomes
"base.M.N.sqlog" where M is worker ID and N is client ID
(e.g. "base.0.3.sqlog"). Only effective in QUIC runs.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-connect\-to=<HOST>[:<PORT>] .B \-\-connect\-to=<HOST>[:<PORT>]
Host and port to connect instead of using the authority Host and port to connect instead of using the authority
in <URI>. in <URI>.
.UNINDENT .UNINDENT
.INDENT 0.0 .INDENT 0.0
.TP .TP
.B \-\-rps=<N>
Specify request per second for each client. \fI\%\-\-rps\fP and
\fI\%\-\-timing\-script\-file\fP are mutually exclusive.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-groups=<GROUPS>
Specify the supported groups.
.sp
Default: \fBX25519:P\-256:P\-384:P\-521\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-no\-udp\-gso
Disable UDP GSO.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-max\-udp\-payload\-size=<SIZE>
Specify the maximum outgoing UDP datagram payload size.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-ktls
Enable ktls.
.UNINDENT
.INDENT 0.0
.TP
.B \-v, \-\-verbose .B \-v, \-\-verbose
Output debug information. Output debug information.
.UNINDENT .UNINDENT

View File

@ -73,17 +73,9 @@ OPTIONS
Default: ``1`` Default: ``1``
.. option:: -f, --max-frame-size=<SIZE>
Maximum frame size that the local endpoint is willing to
receive.
Default: ``16K``
.. 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 QUIC, <N> is capped to 26 (roughly 64MiB).
Default: ``30`` Default: ``30``
@ -100,17 +92,10 @@ OPTIONS
.. option:: --ciphers=<SUITE> .. option:: --ciphers=<SUITE>
Set allowed cipher list for TLSv1.2 or earlier. The Set allowed cipher list. The format of the string is
format of the string is described in OpenSSL ciphers(1). described in OpenSSL ciphers(1).
Default: ``ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384`` 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:: --tls13-ciphers=<SUITE>
Set allowed cipher list for TLSv1.3. The format of the
string is described in OpenSSL ciphers(1).
Default: ``TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_CCM_SHA256``
.. option:: -p, --no-tls-proto=<PROTOID> .. option:: -p, --no-tls-proto=<PROTOID>
@ -149,7 +134,7 @@ 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=<DURATION> .. option:: -D, --duration=<N>
Specifies the main duration for the measurements in case Specifies the main duration for the measurements in case
of timing-based benchmarking. :option:`-D` and :option:`\-r` are mutually of timing-based benchmarking. :option:`-D` and :option:`\-r` are mutually
@ -198,8 +183,7 @@ OPTIONS
port defined in the first URI are used solely. Values port defined in the first URI are used solely. Values
contained in other URIs, if present, are ignored. contained in other URIs, if present, are ignored.
Definition of a base URI overrides all scheme, host or Definition of a base URI overrides all scheme, host or
port values. :option:`--timing-script-file` and :option:`\--rps` are port values.
mutually exclusive.
.. option:: -B, --base-uri=(<URI>|unix:<PATH>) .. option:: -B, --base-uri=(<URI>|unix:<PATH>)
@ -255,42 +239,11 @@ OPTIONS
appear slightly out of order with multiple threads due appear slightly out of order with multiple threads due
to buffering. Status code is -1 for failed streams. to buffering. Status code is -1 for failed streams.
.. option:: --qlog-file-base=<PATH>
Enable qlog output and specify base file name for qlogs.
Qlog is emitted for each connection. For a given base
name "base", each output file name becomes
"base.M.N.sqlog" where M is worker ID and N is client ID
(e.g. "base.0.3.sqlog"). Only effective in QUIC runs.
.. option:: --connect-to=<HOST>[:<PORT>] .. option:: --connect-to=<HOST>[:<PORT>]
Host and port to connect instead of using the authority Host and port to connect instead of using the authority
in <URI>. in <URI>.
.. option:: --rps=<N>
Specify request per second for each client. :option:`--rps` and
:option:`--timing-script-file` are mutually exclusive.
.. option:: --groups=<GROUPS>
Specify the supported groups.
Default: ``X25519:P-256:P-384:P-521``
.. option:: --no-udp-gso
Disable UDP GSO.
.. option:: --max-udp-payload-size=<SIZE>
Specify the maximum outgoing UDP datagram payload size.
.. option:: --ktls
Enable ktls.
.. option:: -v, --verbose .. option:: -v, --verbose
Output debug information. Output debug information.

View File

@ -0,0 +1 @@
.. include:: @top_srcdir@/doc/sources/libnghttp2_asio.rst

View File

@ -1,11 +1,9 @@
#!/usr/bin/env python3 #!/usr/bin/env python
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# nghttp2 - HTTP/2 C Library # nghttp2 - HTTP/2 C Library
#
# Copyright (c) 2020 nghttp2 contributors
# Copyright (c) 2020 ngtcp2 contributors
# Copyright (c) 2012 Tatsuhiro Tsujikawa # Copyright (c) 2012 Tatsuhiro Tsujikawa
#
# Permission is hereby granted, free of charge, to any person obtaining # Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the # a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including # "Software"), to deal in the Software without restriction, including
@ -27,16 +25,17 @@
# Generates API reference from C source code. # Generates API reference from C source code.
from __future__ import unicode_literals
from __future__ import print_function # At least python 2.6 is required
import re, sys, argparse, os.path import re, sys, argparse, os.path
class FunctionDoc: class FunctionDoc:
def __init__(self, name, content, domain, filename): def __init__(self, name, content, domain):
self.name = name self.name = name
self.content = content self.content = content
self.domain = domain self.domain = domain
if self.domain == 'function': if self.domain == 'function':
self.funcname = re.search(r'(nghttp2_[^ )]+)\(', self.name).group(1) self.funcname = re.search(r'(nghttp2_[^ )]+)\(', self.name).group(1)
self.filename = filename
def write(self, out): def write(self, out):
out.write('.. {}:: {}\n'.format(self.domain, self.name)) out.write('.. {}:: {}\n'.format(self.domain, self.name))
@ -65,26 +64,6 @@ class StructDoc:
out.write(' {}\n'.format(line)) out.write(' {}\n'.format(line))
out.write('\n') out.write('\n')
class EnumDoc:
def __init__(self, name, content, members):
self.name = name
self.content = content
self.members = members
def write(self, out):
if self.name:
out.write('.. type:: {}\n'.format(self.name))
out.write('\n')
for line in self.content:
out.write(' {}\n'.format(line))
out.write('\n')
for name, content in self.members:
out.write(' .. enum:: {}\n'.format(name))
out.write('\n')
for line in content:
out.write(' {}\n'.format(line))
out.write('\n')
class MacroDoc: class MacroDoc:
def __init__(self, name, content): def __init__(self, name, content):
self.name = name self.name = name
@ -96,34 +75,12 @@ class MacroDoc:
for line in self.content: for line in self.content:
out.write(' {}\n'.format(line)) out.write(' {}\n'.format(line))
class MacroSectionDoc: def make_api_ref(infiles):
def __init__(self, content):
self.content = content
def write(self, out):
out.write('\n')
c = ' '.join(self.content).strip()
out.write(c)
out.write('\n')
out.write('-' * len(c))
out.write('\n\n')
class TypedefDoc:
def __init__(self, name, content):
self.name = name
self.content = content
def write(self, out):
out.write('''.. type:: {}\n'''.format(self.name))
out.write('\n')
for line in self.content:
out.write(' {}\n'.format(line))
def make_api_ref(infile):
macros = [] macros = []
enums = [] enums = []
types = [] types = []
functions = [] functions = []
for infile in infiles:
while True: while True:
line = infile.readline() line = infile.readline()
if not line: if not line:
@ -141,31 +98,27 @@ def make_api_ref(infile):
enums.append(process_enum(infile)) enums.append(process_enum(infile))
elif doctype == '@macro': elif doctype == '@macro':
macros.append(process_macro(infile)) macros.append(process_macro(infile))
elif doctype == '@macrosection':
macros.append(process_macrosection(infile))
elif doctype == '@typedef':
types.append(process_typedef(infile))
return macros, enums, types, functions return macros, enums, types, functions
alldocs = [('Macros', macros),
('Enums', enums),
('Types (structs, unions and typedefs)', types),
('Functions', functions)]
def output( def output(
title, indexfile, macrosfile, enumsfile, typesfile, funcsdir, indexfile, macrosfile, enumsfile, typesfile, funcsdir,
macros, enums, types, functions): macros, enums, types, functions):
indexfile.write(''' indexfile.write('''
{title} API Reference
{titledecoration} =============
.. toctree:: .. toctree::
:maxdepth: 1 :maxdepth: 1
{macros} macros
{enums} enums
{types} types
'''.format( ''')
title=title, titledecoration='='*len(title),
macros=os.path.splitext(os.path.basename(macrosfile.name))[0],
enums=os.path.splitext(os.path.basename(enumsfile.name))[0],
types=os.path.splitext(os.path.basename(typesfile.name))[0],
))
for doc in functions: for doc in functions:
indexfile.write(' {}\n'.format(doc.funcname)) indexfile.write(' {}\n'.format(doc.funcname))
@ -200,10 +153,9 @@ Types (structs, unions and typedefs)
Synopsis Synopsis
-------- --------
*#include <nghttp2/{filename}>* *#include <nghttp2/nghttp2.h>*
'''.format(funcname=doc.funcname, secul='='*len(doc.funcname), '''.format(funcname=doc.funcname, secul='='*len(doc.funcname)))
filename=doc.filename))
doc.write(f) doc.write(f)
def process_macro(infile): def process_macro(infile):
@ -212,17 +164,6 @@ def process_macro(infile):
macro_name = line.split()[1] macro_name = line.split()[1]
return MacroDoc(macro_name, content) return MacroDoc(macro_name, content)
def process_macrosection(infile):
content = read_content(infile)
return MacroSectionDoc(content)
def process_typedef(infile):
content = read_content(infile)
typedef = infile.readline()
typedef = re.sub(r';\n$', '', typedef)
typedef = re.sub(r'typedef ', '', typedef)
return TypedefDoc(typedef, content)
def process_enum(infile): def process_enum(infile):
members = [] members = []
enum_name = None enum_name = None
@ -235,7 +176,7 @@ def process_enum(infile):
member_content = read_content(infile) member_content = read_content(infile)
line = infile.readline() line = infile.readline()
items = line.split() items = line.split()
member_name = items[0].rstrip(',') member_name = items[0]
if len(items) >= 3: if len(items) >= 3:
member_content.insert(0, '(``{}``) '\ member_content.insert(0, '(``{}``) '\
.format(' '.join(items[2:]).rstrip(','))) .format(' '.join(items[2:]).rstrip(',')))
@ -244,7 +185,7 @@ def process_enum(infile):
enum_name = line.rstrip().split()[1] enum_name = line.rstrip().split()[1]
enum_name = re.sub(r';$', '', enum_name) enum_name = re.sub(r';$', '', enum_name)
break break
return EnumDoc(enum_name, content, members) return StructDoc(enum_name, content, members, 'macro')
def process_struct(infile): def process_struct(infile):
members = [] members = []
@ -285,9 +226,7 @@ def process_function(domain, infile):
func_proto = re.sub(r';\n$', '', func_proto) func_proto = re.sub(r';\n$', '', func_proto)
func_proto = re.sub(r'\s+', ' ', func_proto) func_proto = re.sub(r'\s+', ' ', func_proto)
func_proto = re.sub(r'NGHTTP2_EXTERN ', '', func_proto) func_proto = re.sub(r'NGHTTP2_EXTERN ', '', func_proto)
func_proto = re.sub(r'typedef ', '', func_proto) return FunctionDoc(func_proto, content, domain)
filename = os.path.basename(infile.name)
return FunctionDoc(func_proto, content, domain, filename)
def read_content(infile): def read_content(infile):
content = [] content = []
@ -312,8 +251,6 @@ def transform_content(content):
if __name__ == '__main__': if __name__ == '__main__':
parser = argparse.ArgumentParser(description="Generate API reference") parser = argparse.ArgumentParser(description="Generate API reference")
parser.add_argument('--title', default='API Reference',
help='title of index page')
parser.add_argument('index', type=argparse.FileType('w'), parser.add_argument('index', type=argparse.FileType('w'),
help='index output file') help='index output file')
parser.add_argument('macros', type=argparse.FileType('w'), parser.add_argument('macros', type=argparse.FileType('w'),
@ -332,13 +269,12 @@ if __name__ == '__main__':
types = [] types = []
funcs = [] funcs = []
for infile in args.files: for infile in args.files:
m, e, t, f = make_api_ref(infile) m, e, t, f = make_api_ref(args.files)
macros.extend(m) macros.extend(m)
enums.extend(e) enums.extend(e)
types.extend(t) types.extend(t)
funcs.extend(f) funcs.extend(f)
funcs.sort(key=lambda x: x.funcname) funcs.sort(key=lambda x: x.funcname)
output( output(
args.title,
args.index, args.macros, args.enums, args.types, args.funcsdir, args.index, args.macros, args.enums, args.types, args.funcsdir,
macros, enums, types, funcs) macros, enums, types, funcs)

View File

@ -1,5 +1,8 @@
.\" Man page generated from reStructuredText. .\" Man page generated from reStructuredText.
. .
.TH "NGHTTP" "1" "Jun 02, 2020" "1.41.0" "nghttp2"
.SH NAME
nghttp \- HTTP/2 client
. .
.nr rst2man-indent-level 0 .nr rst2man-indent-level 0
. .
@ -27,9 +30,6 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
.. ..
.TH "NGHTTP" "1" "Nov 13, 2022" "1.51.0" "nghttp2"
.SH NAME
nghttp \- HTTP/2 client
.SH SYNOPSIS .SH SYNOPSIS
.sp .sp
\fBnghttp\fP [OPTIONS]... <URI>... \fBnghttp\fP [OPTIONS]... <URI>...
@ -242,16 +242,6 @@ failure.
.UNINDENT .UNINDENT
.INDENT 0.0 .INDENT 0.0
.TP .TP
.B \-\-ktls
Enable ktls.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-no\-rfc7540\-pri
Disable RFC7540 priorities.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-version .B \-\-version
Display version information and exit. Display version information and exit.
.UNINDENT .UNINDENT

View File

@ -191,14 +191,6 @@ OPTIONS
Suppress warning on server certificate verification Suppress warning on server certificate verification
failure. failure.
.. option:: --ktls
Enable ktls.
.. option:: --no-rfc7540-pri
Disable RFC7540 priorities.
.. option:: --version .. option:: --version
Display version information and exit. Display version information and exit.

View File

@ -1,5 +1,8 @@
.\" Man page generated from reStructuredText. .\" Man page generated from reStructuredText.
. .
.TH "NGHTTPD" "1" "Jun 02, 2020" "1.41.0" "nghttp2"
.SH NAME
nghttpd \- HTTP/2 server
. .
.nr rst2man-indent-level 0 .nr rst2man-indent-level 0
. .
@ -27,9 +30,6 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
.. ..
.TH "NGHTTPD" "1" "Nov 13, 2022" "1.51.0" "nghttp2"
.SH NAME
nghttpd \- HTTP/2 server
.SH SYNOPSIS .SH SYNOPSIS
.sp .sp
\fBnghttpd\fP [OPTION]... <PORT> [<PRIVATE_KEY> <CERT>] \fBnghttpd\fP [OPTION]... <PORT> [<PRIVATE_KEY> <CERT>]
@ -204,16 +204,6 @@ Don\(aqt send content\-length header field.
.UNINDENT .UNINDENT
.INDENT 0.0 .INDENT 0.0
.TP .TP
.B \-\-ktls
Enable ktls.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-no\-rfc7540\-pri
Disable RFC7540 priorities.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-version .B \-\-version
Display version information and exit. Display version information and exit.
.UNINDENT .UNINDENT

View File

@ -159,14 +159,6 @@ OPTIONS
Don't send content-length header field. Don't send content-length header field.
.. option:: --ktls
Enable ktls.
.. option:: --no-rfc7540-pri
Disable RFC7540 priorities.
.. option:: --version .. option:: --version
Display version information and exit. Display version information and exit.

View File

@ -1,5 +1,8 @@
.\" Man page generated from reStructuredText. .\" Man page generated from reStructuredText.
. .
.TH "NGHTTPX" "1" "Jun 02, 2020" "1.41.0" "nghttp2"
.SH NAME
nghttpx \- HTTP/2 proxy
. .
.nr rst2man-indent-level 0 .nr rst2man-indent-level 0
. .
@ -27,15 +30,12 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
.. ..
.TH "NGHTTPX" "1" "Nov 13, 2022" "1.51.0" "nghttp2"
.SH NAME
nghttpx \- HTTP/2 proxy
.SH SYNOPSIS .SH SYNOPSIS
.sp .sp
\fBnghttpx\fP [OPTIONS]... [<PRIVATE_KEY> <CERT>] \fBnghttpx\fP [OPTIONS]... [<PRIVATE_KEY> <CERT>]
.SH DESCRIPTION .SH DESCRIPTION
.sp .sp
A reverse proxy for HTTP/3, HTTP/2, and HTTP/1. A reverse proxy for HTTP/2, and HTTP/1.
.INDENT 0.0 .INDENT 0.0
.TP .TP
.B <PRIVATE_KEY> .B <PRIVATE_KEY>
@ -140,13 +140,12 @@ parameters are: "proto=<PROTO>", "tls",
"affinity=<METHOD>", "dns", "redirect\-if\-not\-tls", "affinity=<METHOD>", "dns", "redirect\-if\-not\-tls",
"upgrade\-scheme", "mruby=<PATH>", "upgrade\-scheme", "mruby=<PATH>",
"read\-timeout=<DURATION>", "write\-timeout=<DURATION>", "read\-timeout=<DURATION>", "write\-timeout=<DURATION>",
"group=<GROUP>", "group\-weight=<N>", "weight=<N>", and "group=<GROUP>", "group\-weight=<N>", and "weight=<N>".
"dnf". The parameter consists of keyword, and The parameter consists of keyword, and optionally
optionally followed by "=" and value. For example, the followed by "=" and value. For example, the parameter
parameter "proto=h2" consists of the keyword "proto" and "proto=h2" consists of the keyword "proto" and value
value "h2". The parameter "tls" consists of the keyword "h2". The parameter "tls" consists of the keyword "tls"
"tls" without value. Each parameter is described as without value. Each parameter is described as follows.
follows.
.sp .sp
The backend application protocol can be specified using The backend application protocol can be specified using
optional "proto" parameter, and in the form of optional "proto" parameter, and in the form of
@ -210,17 +209,6 @@ If a request scheme is "https", then Secure attribute is
set. Otherwise, it is not set. If <SECURE> is "yes", set. Otherwise, it is not set. If <SECURE> is "yes",
the Secure attribute is always set. If <SECURE> is the Secure attribute is always set. If <SECURE> is
"no", the Secure attribute is always omitted. "no", the Secure attribute is always omitted.
"affinity\-cookie\-stickiness=<STICKINESS>" controls
stickiness of this affinity. If <STICKINESS> is
"loose", removing or adding a backend server might break
the affinity and the request might be forwarded to a
different backend server. If <STICKINESS> is "strict",
removing the designated backend server breaks affinity,
but adding new backend server does not cause breakage.
If the designated backend server becomes unavailable,
new backend server is chosen as if the request does not
have an affinity cookie. <STICKINESS> defaults to
"loose".
.sp .sp
By default, name resolution of backend host name is done By default, name resolution of backend host name is done
at start up, or reloading configuration. If "dns" at start up, or reloading configuration. If "dns"
@ -288,19 +276,9 @@ weight than weight 2. If this parameter is omitted,
weight becomes 1. "weight" is ignored if session weight becomes 1. "weight" is ignored if session
affinity is enabled. affinity is enabled.
.sp .sp
If "dnf" parameter is specified, an incoming request is
not forwarded to a backend and just consumed along with
the request body (actually a backend server never be
contacted). It is expected that the HTTP response is
generated by mruby script (see "mruby=<PATH>" parameter
above). "dnf" is an abbreviation of "do not forward".
.sp
Since ";" and ":" are used as delimiter, <PATTERN> must Since ";" and ":" are used as delimiter, <PATTERN> must
not contain these characters. In order to include ":" not contain these characters. Since ";" has special
in <PATTERN>, one has to specify "%3A" (which is meaning in shell, the option value must be quoted.
percent\-encoded from of ":") instead. Since ";" has
special meaning in shell, the option value must be
quoted.
.sp .sp
Default: \fB127.0.0.1,80\fP Default: \fB127.0.0.1,80\fP
.UNINDENT .UNINDENT
@ -342,12 +320,6 @@ To accept PROXY protocol version 1 and 2 on frontend
connection, specify "proxyproto" parameter. This is connection, specify "proxyproto" parameter. This is
disabled by default. disabled by default.
.sp .sp
To receive HTTP/3 (QUIC) traffic, specify "quic"
parameter. It makes nghttpx listen on UDP port rather
than TCP port. UNIX domain socket, "api", and
"healthmon" parameters cannot be used with "quic"
parameter.
.sp
Default: \fB*,3000\fP Default: \fB*,3000\fP
.UNINDENT .UNINDENT
.INDENT 0.0 .INDENT 0.0
@ -514,15 +486,6 @@ Default: \fB0\fP
.UNINDENT .UNINDENT
.INDENT 0.0 .INDENT 0.0
.TP .TP
.B \-\-rlimit\-memlock=<N>
Set maximum number of bytes of memory that may be locked
into RAM. If 0 is given, nghttpx does not set the
limit.
.sp
Default: \fB0\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-backend\-request\-buffer=<SIZE> .B \-\-backend\-request\-buffer=<SIZE>
Set buffer size used to store backend request. Set buffer size used to store backend request.
.sp .sp
@ -562,13 +525,6 @@ Default: \fB3m\fP
.UNINDENT .UNINDENT
.INDENT 0.0 .INDENT 0.0
.TP .TP
.B \-\-frontend\-http3\-read\-timeout=<DURATION>
Specify read timeout for HTTP/3 frontend connection.
.sp
Default: \fB3m\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-read\-timeout=<DURATION> .B \-\-frontend\-read\-timeout=<DURATION>
Specify read timeout for HTTP/1.1 frontend connection. Specify read timeout for HTTP/1.1 frontend connection.
.sp .sp
@ -683,7 +639,7 @@ format of the string is described in OpenSSL ciphers(1).
This option sets cipher suites for TLSv1.2 or earlier. This option sets cipher suites for TLSv1.2 or earlier.
Use \fI\%\-\-tls13\-ciphers\fP for TLSv1.3. Use \fI\%\-\-tls13\-ciphers\fP for TLSv1.3.
.sp .sp
Default: \fBECDHE\-ECDSA\-AES128\-GCM\-SHA256:ECDHE\-RSA\-AES128\-GCM\-SHA256:ECDHE\-ECDSA\-AES256\-GCM\-SHA384:ECDHE\-RSA\-AES256\-GCM\-SHA384:ECDHE\-ECDSA\-CHACHA20\-POLY1305:ECDHE\-RSA\-CHACHA20\-POLY1305:DHE\-RSA\-AES128\-GCM\-SHA256:DHE\-RSA\-AES256\-GCM\-SHA384\fP 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
@ -693,7 +649,7 @@ format of the string is described in OpenSSL ciphers(1).
This option sets cipher suites for TLSv1.3. Use This option sets cipher suites for TLSv1.3. Use
\fI\%\-\-ciphers\fP for TLSv1.2 or earlier. \fI\%\-\-ciphers\fP for TLSv1.2 or earlier.
.sp .sp
Default: \fBTLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256\fP Default: \fBTLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256\fP
.UNINDENT .UNINDENT
.INDENT 0.0 .INDENT 0.0
.TP .TP
@ -703,7 +659,7 @@ format of the string is described in OpenSSL ciphers(1).
This option sets cipher suites for TLSv1.2 or earlier. This option sets cipher suites for TLSv1.2 or earlier.
Use \fI\%\-\-tls13\-client\-ciphers\fP for TLSv1.3. Use \fI\%\-\-tls13\-client\-ciphers\fP for TLSv1.3.
.sp .sp
Default: \fBECDHE\-ECDSA\-AES128\-GCM\-SHA256:ECDHE\-RSA\-AES128\-GCM\-SHA256:ECDHE\-ECDSA\-AES256\-GCM\-SHA384:ECDHE\-RSA\-AES256\-GCM\-SHA384:ECDHE\-ECDSA\-CHACHA20\-POLY1305:ECDHE\-RSA\-CHACHA20\-POLY1305:DHE\-RSA\-AES128\-GCM\-SHA256:DHE\-RSA\-AES256\-GCM\-SHA384\fP 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
@ -713,7 +669,7 @@ format of the string is described in OpenSSL ciphers(1).
This option sets cipher suites for TLSv1.3. Use This option sets cipher suites for TLSv1.3. Use
\fI\%\-\-tls13\-client\-ciphers\fP for TLSv1.2 or earlier. \fI\%\-\-tls13\-client\-ciphers\fP for TLSv1.2 or earlier.
.sp .sp
Default: \fBTLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256\fP Default: \fBTLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256\fP
.UNINDENT .UNINDENT
.INDENT 0.0 .INDENT 0.0
.TP .TP
@ -1047,19 +1003,19 @@ Default: \fB1s\fP
.UNINDENT .UNINDENT
.INDENT 0.0 .INDENT 0.0
.TP .TP
.B \-\-no\-http2\-cipher\-block\-list .B \-\-no\-http2\-cipher\-black\-list
Allow block listed cipher suite on frontend HTTP/2 Allow black listed cipher suite on frontend HTTP/2
connection. See connection. See
\fI\%https://tools.ietf.org/html/rfc7540#appendix\-A\fP for the \fI\%https://tools.ietf.org/html/rfc7540#appendix\-A\fP for the
complete HTTP/2 cipher suites block list. complete HTTP/2 cipher suites black list.
.UNINDENT .UNINDENT
.INDENT 0.0 .INDENT 0.0
.TP .TP
.B \-\-client\-no\-http2\-cipher\-block\-list .B \-\-client\-no\-http2\-cipher\-black\-list
Allow block listed cipher suite on backend HTTP/2 Allow black listed cipher suite on backend HTTP/2
connection. See connection. See
\fI\%https://tools.ietf.org/html/rfc7540#appendix\-A\fP for the \fI\%https://tools.ietf.org/html/rfc7540#appendix\-A\fP for the
complete HTTP/2 cipher suites block list. complete HTTP/2 cipher suites black list.
.UNINDENT .UNINDENT
.INDENT 0.0 .INDENT 0.0
.TP .TP
@ -1084,9 +1040,9 @@ in hex. An empty line, and line which starts with \(aq#\(aq
are skipped. The default enabled cipher list might not are skipped. The default enabled cipher list might not
contain any PSK cipher suite. In that case, desired PSK contain any PSK cipher suite. In that case, desired PSK
cipher suites must be enabled using \fI\%\-\-ciphers\fP option. cipher suites must be enabled using \fI\%\-\-ciphers\fP option.
The desired PSK cipher suite may be block listed by The desired PSK cipher suite may be black listed by
HTTP/2. To use those cipher suites with HTTP/2, HTTP/2. To use those cipher suites with HTTP/2,
consider to use \fI\%\-\-no\-http2\-cipher\-block\-list\fP option. consider to use \fI\%\-\-no\-http2\-cipher\-black\-list\fP option.
But be aware its implications. But be aware its implications.
.UNINDENT .UNINDENT
.INDENT 0.0 .INDENT 0.0
@ -1101,21 +1057,20 @@ The first identity and secret pair encountered is used.
The default enabled cipher list might not contain any The default enabled cipher list might not contain any
PSK cipher suite. In that case, desired PSK cipher PSK cipher suite. In that case, desired PSK cipher
suites must be enabled using \fI\%\-\-client\-ciphers\fP option. suites must be enabled using \fI\%\-\-client\-ciphers\fP option.
The desired PSK cipher suite may be block listed by The desired PSK cipher suite may be black listed by
HTTP/2. To use those cipher suites with HTTP/2, HTTP/2. To use those cipher suites with HTTP/2,
consider to use \fI\%\-\-client\-no\-http2\-cipher\-block\-list\fP consider to use \fI\%\-\-client\-no\-http2\-cipher\-black\-list\fP
option. But be aware its implications. option. But be aware its implications.
.UNINDENT .UNINDENT
.INDENT 0.0 .INDENT 0.0
.TP .TP
.B \-\-tls\-no\-postpone\-early\-data .B \-\-tls\-no\-postpone\-early\-data
By default, except for QUIC connections, nghttpx By default, nghttpx postpones forwarding HTTP requests
postpones forwarding HTTP requests sent in early data, sent in early data, including those sent in partially in
including those sent in partially in it, until TLS it, until TLS handshake finishes. If all backend server
handshake finishes. If all backend server recognizes recognizes "Early\-Data" header field, using this option
"Early\-Data" header field, using this option makes makes nghttpx not postpone forwarding request and get
nghttpx not postpone forwarding request and get full full potential of 0\-RTT data.
potential of 0\-RTT data.
.UNINDENT .UNINDENT
.INDENT 0.0 .INDENT 0.0
.TP .TP
@ -1125,12 +1080,6 @@ accepts.
.sp .sp
Default: \fB16K\fP Default: \fB16K\fP
.UNINDENT .UNINDENT
.INDENT 0.0
.TP
.B \-\-tls\-ktls
Enable ktls. For server, ktls is enable if
\fI\%\-\-tls\-session\-cache\-memcached\fP is not configured.
.UNINDENT
.SS HTTP/2 .SS HTTP/2
.INDENT 0.0 .INDENT 0.0
.TP .TP
@ -1375,18 +1324,6 @@ request. "\-" if backend host is not available.
.IP \(bu 2 .IP \(bu 2
$backend_port: backend port used to fulfill the $backend_port: backend port used to fulfill the
request. "\-" if backend host is not available. request. "\-" if backend host is not available.
.IP \(bu 2
$method: HTTP method
.IP \(bu 2
$path: Request path including query. For CONNECT
request, authority is recorded.
.IP \(bu 2
$path_without_query: $path up to the first \(aq?\(aq
character. For CONNECT request, authority is
recorded.
.IP \(bu 2
$protocol_version: HTTP version (e.g., HTTP/1.1,
HTTP/2)
.UNINDENT .UNINDENT
.sp .sp
The variable can be enclosed by "{" and "}" for The variable can be enclosed by "{" and "}" for
@ -1526,21 +1463,13 @@ not be altered regardless of this option.
.UNINDENT .UNINDENT
.INDENT 0.0 .INDENT 0.0
.TP .TP
.B \-\-altsvc=<PROTOID,PORT[,HOST,[ORIGIN[,PARAMS]]]> .B \-\-altsvc=<PROTOID,PORT[,HOST,[ORIGIN]]>
Specify protocol ID, port, host and origin of Specify protocol ID, port, host and origin of
alternative service. <HOST>, <ORIGIN> and <PARAMS> are alternative service. <HOST> and <ORIGIN> are optional.
optional. Empty <HOST> and <ORIGIN> are allowed and They are advertised in alt\-svc header field only in
they are treated as nothing is specified. They are HTTP/1.1 frontend. This option can be used multiple
advertised in alt\-svc header field only in HTTP/1.1 times to specify multiple alternative services.
frontend. This option can be used multiple times to Example: \fI\%\-\-altsvc\fP=h2,443
specify multiple alternative services.
Example: \fI\%\-\-altsvc\fP="h2,443,,,ma=3600; persist=1"
.UNINDENT
.INDENT 0.0
.TP
.B \-\-http2\-altsvc=<PROTOID,PORT[,HOST,[ORIGIN[,PARAMS]]]>
Just like \fI\%\-\-altsvc\fP option, but this altsvc is only sent
in HTTP/2 frontend.
.UNINDENT .UNINDENT
.INDENT 0.0 .INDENT 0.0
.TP .TP
@ -1631,16 +1560,6 @@ field when redirect to HTTPS URI is made due to
.sp .sp
Default: \fB443\fP Default: \fB443\fP
.UNINDENT .UNINDENT
.INDENT 0.0
.TP
.B \-\-require\-http\-scheme
Always require http or https scheme in HTTP request. It
also requires that https scheme must be used for an
encrypted connection. Otherwise, http scheme must be
used. This option is recommended for a server
deployment which directly faces clients and the services
it provides only require http or https scheme.
.UNINDENT
.SS API .SS API
.INDENT 0.0 .INDENT 0.0
.TP .TP
@ -1735,39 +1654,12 @@ be used to drop root privileges.
.B \-\-single\-process .B \-\-single\-process
Run this program in a single process mode for debugging Run this program in a single process mode for debugging
purpose. Without this option, nghttpx creates at least purpose. Without this option, nghttpx creates at least
2 processes: main and worker processes. If this option 2 processes: master and worker processes. If this
is used, main and worker are unified into a single option is used, master and worker are unified into a
process. nghttpx still spawns additional process if single process. nghttpx still spawns additional process
neverbleed is used. In the single process mode, the if neverbleed is used. In the single process mode, the
signal handling feature is disabled. signal handling feature is disabled.
.UNINDENT .UNINDENT
.INDENT 0.0
.TP
.B \-\-max\-worker\-processes=<N>
The maximum number of worker processes. nghttpx spawns
new worker process when it reloads its configuration.
The previous worker process enters graceful termination
period and will terminate when it finishes handling the
existing connections. However, if reloading
configurations happen very frequently, the worker
processes might be piled up if they take a bit long time
to finish the existing connections. With this option,
if the number of worker processes exceeds the given
value, the oldest worker process is terminated
immediately. Specifying 0 means no limit and it is the
default behaviour.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-worker\-process\-grace\-shutdown\-period=<DURATION>
Maximum period for a worker process to terminate
gracefully. When a worker process enters in graceful
shutdown period (e.g., when nghttpx reloads its
configuration) and it does not finish handling the
existing connections in the given period of time, it is
immediately terminated. Specifying 0 means no limit and
it is the default behaviour.
.UNINDENT
.SS Scripting .SS Scripting
.INDENT 0.0 .INDENT 0.0
.TP .TP
@ -1781,160 +1673,6 @@ Ignore mruby compile error for per\-pattern mruby script
file. If error occurred, it is treated as if no mruby file. If error occurred, it is treated as if no mruby
file were specified for the pattern. file were specified for the pattern.
.UNINDENT .UNINDENT
.SS HTTP/3 and QUIC
.INDENT 0.0
.TP
.B \-\-frontend\-quic\-idle\-timeout=<DURATION>
Specify an idle timeout for QUIC connection.
.sp
Default: \fB30s\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-quic\-debug\-log
Output QUIC debug log to \fI/dev/stderr.\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-quic\-bpf\-program\-file=<PATH>
Specify a path to eBPF program file reuseport_kern.o to
direct an incoming QUIC UDP datagram to a correct
socket.
.sp
Default: \fB/usr/local/lib/nghttp2/reuseport_kern.o\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-quic\-early\-data
Enable early data on frontend QUIC connections. nghttpx
sends "Early\-Data" header field to a backend server if a
request is received in early data and handshake has not
finished. All backend servers should deal with possibly
replayed requests.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-quic\-qlog\-dir=<DIR>
Specify a directory where a qlog file is written for
frontend QUIC connections. A qlog file is created per
each QUIC connection. The file name is ISO8601 basic
format, followed by "\-", server Source Connection ID and
".sqlog".
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-quic\-require\-token
Require an address validation token for a frontend QUIC
connection. Server sends a token in Retry packet or
NEW_TOKEN frame in the previous connection.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-quic\-congestion\-controller=<CC>
Specify a congestion controller algorithm for a frontend
QUIC connection. <CC> should be one of "cubic", "bbr",
and "bbr2".
.sp
Default: \fBcubic\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-quic\-secret\-file=<PATH>
Path to file that contains secure random data to be used
as QUIC keying materials. It is used to derive keys for
encrypting tokens and Connection IDs. It is not used to
encrypt QUIC packets. Each line of this file must
contain exactly 136 bytes hex\-encoded string (when
decoded the byte string is 68 bytes long). The first 2
bits of decoded byte string are used to identify the
keying material. An empty line or a line which starts
\(aq#\(aq is ignored. The file can contain more than one
keying materials. Because the identifier is 2 bits, at
most 4 keying materials are read and the remaining data
is discarded. The first keying material in the file is
primarily used for encryption and decryption for new
connection. The other ones are used to decrypt data for
the existing connections. Specifying multiple keying
materials enables key rotation. Please note that key
rotation does not occur automatically. User should
update files or change options values and restart
nghttpx gracefully. If opening or reading given file
fails, all loaded keying materials are discarded and it
is treated as if none of this option is given. If this
option is not given or an error occurred while opening
or reading a file, a keying material is generated
internally on startup and reload.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-quic\-server\-id=<HEXSTRING>
Specify server ID encoded in Connection ID to identify
this particular server instance. Connection ID is
encrypted and this part is not visible in public. It
must be 4 bytes long and must be encoded in hex string
(which is 8 bytes long). If this option is omitted, a
random server ID is generated on startup and
configuration reload.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-quic\-initial\-rtt=<DURATION>
Specify the initial RTT of the frontend QUIC connection.
.sp
Default: \fB333ms\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-no\-quic\-bpf
Disable eBPF.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-http3\-window\-size=<SIZE>
Sets the per\-stream initial window size of HTTP/3
frontend connection.
.sp
Default: \fB256K\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-http3\-connection\-window\-size=<SIZE>
Sets the per\-connection window size of HTTP/3 frontend
connection.
.sp
Default: \fB1M\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-http3\-max\-window\-size=<SIZE>
Sets the maximum per\-stream window size of HTTP/3
frontend connection. The window size is adjusted based
on the receiving rate of stream data. The initial value
is the value specified by \fI\%\-\-frontend\-http3\-window\-size\fP
and the window size grows up to <SIZE> bytes.
.sp
Default: \fB6M\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-http3\-max\-connection\-window\-size=<SIZE>
Sets the maximum per\-connection window size of HTTP/3
frontend connection. The window size is adjusted based
on the receiving rate of stream data. The initial value
is the value specified by
\fI\%\-\-frontend\-http3\-connection\-window\-size\fP and the window
size grows up to <SIZE> bytes.
.sp
Default: \fB8M\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-http3\-max\-concurrent\-streams=<N>
Set the maximum number of the concurrent streams in one
frontend HTTP/3 connection.
.sp
Default: \fB100\fP
.UNINDENT
.SS Misc .SS Misc
.INDENT 0.0 .INDENT 0.0
.TP .TP
@ -2031,15 +1769,15 @@ Error log is written to stderr by default. It can be configured
using \fI\%\-\-errorlog\-file\fP\&. The format of log message is as using \fI\%\-\-errorlog\-file\fP\&. The format of log message is as
follows: follows:
.sp .sp
<datetime> <main\-pid> <current\-pid> <thread\-id> <level> (<filename>:<line>) <msg> <datetime> <master\-pid> <current\-pid> <thread\-id> <level> (<filename>:<line>) <msg>
.INDENT 7.0 .INDENT 7.0
.TP .TP
.B <datetime> .B <datetime>
It is a combination of date and time when the log is written. It It is a combination of date and time when the log is written. It
is in ISO 8601 format. is in ISO 8601 format.
.TP .TP
.B <main\-pid> .B <master\-pid>
It is a main process ID. It is a master process ID.
.TP .TP
.B <current\-pid> .B <current\-pid>
It is a process ID which writes this log. It is a process ID which writes this log.
@ -2075,15 +1813,15 @@ SIGUSR2
.INDENT 3.5 .INDENT 3.5
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. As
of nghttpx version 1.20.0, the new main process sends SIGQUIT to the of nghttpx version 1.20.0, the new master process sends SIGQUIT to
original main process when it is ready to serve requests. For the the original master process when it is ready to serve requests. For
earlier versions of nghttpx, user has to send SIGQUIT to the the earlier versions of nghttpx, user has to send SIGQUIT to the
original main process. original master process.
.sp .sp
The difference between SIGUSR2 (+ SIGQUIT) and SIGHUP is that former The difference between SIGUSR2 (+ SIGQUIT) and SIGHUP is that former
is usually used to execute new binary, and the main process is newly is usually used to execute new binary, and the master process is
spawned. On the other hand, the latter just reloads configuration newly spawned. On the other hand, the latter just reloads
file, and the same main process continues to exist. configuration file, and the same master process continues to exist.
.UNINDENT .UNINDENT
.UNINDENT .UNINDENT
.sp .sp
@ -2092,16 +1830,16 @@ file, and the same main process continues to exist.
.INDENT 3.5 .INDENT 3.5
nghttpx consists of multiple processes: one process for processing nghttpx consists of multiple processes: one process for processing
these signals, and another one for processing requests. The former these signals, and another one for processing requests. The former
spawns the latter. The former is called main process, and the spawns the latter. The former is called master process, and the
latter is called worker process. If neverbleed is enabled, the latter is called worker process. If neverbleed is enabled, the
worker process spawns neverbleed daemon process which does RSA key worker process spawns neverbleed daemon process which does RSA key
processing. The above signal must be sent to the main process. If processing. The above signal must be sent to the master process.
the other processes received one of them, it is ignored. This If the other processes received one of them, it is ignored. This
behaviour of these processes may change in the future release. In behaviour of these processes may change in the future release. In
other words, in the future release, the processes other than main other words, in the future release, the processes other than master
process may terminate upon the reception of these signals. process may terminate upon the reception of these signals.
Therefore these signals should not be sent to the processes other Therefore these signals should not be sent to the processes other
than main process. than master process.
.UNINDENT .UNINDENT
.UNINDENT .UNINDENT
.SH SERVER PUSH .SH SERVER PUSH

View File

@ -14,7 +14,7 @@ SYNOPSIS
DESCRIPTION DESCRIPTION
----------- -----------
A reverse proxy for HTTP/3, HTTP/2, and HTTP/1. A reverse proxy for HTTP/2, and HTTP/1.
.. describe:: <PRIVATE_KEY> .. describe:: <PRIVATE_KEY>
@ -124,13 +124,12 @@ Connections
"affinity=<METHOD>", "dns", "redirect-if-not-tls", "affinity=<METHOD>", "dns", "redirect-if-not-tls",
"upgrade-scheme", "mruby=<PATH>", "upgrade-scheme", "mruby=<PATH>",
"read-timeout=<DURATION>", "write-timeout=<DURATION>", "read-timeout=<DURATION>", "write-timeout=<DURATION>",
"group=<GROUP>", "group-weight=<N>", "weight=<N>", and "group=<GROUP>", "group-weight=<N>", and "weight=<N>".
"dnf". The parameter consists of keyword, and The parameter consists of keyword, and optionally
optionally followed by "=" and value. For example, the followed by "=" and value. For example, the parameter
parameter "proto=h2" consists of the keyword "proto" and "proto=h2" consists of the keyword "proto" and value
value "h2". The parameter "tls" consists of the keyword "h2". The parameter "tls" consists of the keyword "tls"
"tls" without value. Each parameter is described as without value. Each parameter is described as follows.
follows.
The backend application protocol can be specified using The backend application protocol can be specified using
optional "proto" parameter, and in the form of optional "proto" parameter, and in the form of
@ -194,17 +193,6 @@ Connections
set. Otherwise, it is not set. If <SECURE> is "yes", set. Otherwise, it is not set. If <SECURE> is "yes",
the Secure attribute is always set. If <SECURE> is the Secure attribute is always set. If <SECURE> is
"no", the Secure attribute is always omitted. "no", the Secure attribute is always omitted.
"affinity-cookie-stickiness=<STICKINESS>" controls
stickiness of this affinity. If <STICKINESS> is
"loose", removing or adding a backend server might break
the affinity and the request might be forwarded to a
different backend server. If <STICKINESS> is "strict",
removing the designated backend server breaks affinity,
but adding new backend server does not cause breakage.
If the designated backend server becomes unavailable,
new backend server is chosen as if the request does not
have an affinity cookie. <STICKINESS> defaults to
"loose".
By default, name resolution of backend host name is done By default, name resolution of backend host name is done
at start up, or reloading configuration. If "dns" at start up, or reloading configuration. If "dns"
@ -272,19 +260,9 @@ Connections
weight becomes 1. "weight" is ignored if session weight becomes 1. "weight" is ignored if session
affinity is enabled. affinity is enabled.
If "dnf" parameter is specified, an incoming request is
not forwarded to a backend and just consumed along with
the request body (actually a backend server never be
contacted). It is expected that the HTTP response is
generated by mruby script (see "mruby=<PATH>" parameter
above). "dnf" is an abbreviation of "do not forward".
Since ";" and ":" are used as delimiter, <PATTERN> must Since ";" and ":" are used as delimiter, <PATTERN> must
not contain these characters. In order to include ":" not contain these characters. Since ";" has special
in <PATTERN>, one has to specify "%3A" (which is meaning in shell, the option value must be quoted.
percent-encoded from of ":") instead. Since ";" has
special meaning in shell, the option value must be
quoted.
Default: ``127.0.0.1,80`` Default: ``127.0.0.1,80``
@ -326,12 +304,6 @@ Connections
connection, specify "proxyproto" parameter. This is connection, specify "proxyproto" parameter. This is
disabled by default. disabled by default.
To receive HTTP/3 (QUIC) traffic, specify "quic"
parameter. It makes nghttpx listen on UDP port rather
than TCP port. UNIX domain socket, "api", and
"healthmon" parameters cannot be used with "quic"
parameter.
Default: ``*,3000`` Default: ``*,3000``
@ -483,14 +455,6 @@ Performance
Default: ``0`` Default: ``0``
.. option:: --rlimit-memlock=<N>
Set maximum number of bytes of memory that may be locked
into RAM. If 0 is given, nghttpx does not set the
limit.
Default: ``0``
.. option:: --backend-request-buffer=<SIZE> .. option:: --backend-request-buffer=<SIZE>
Set buffer size used to store backend request. Set buffer size used to store backend request.
@ -528,12 +492,6 @@ Timeout
Default: ``3m`` Default: ``3m``
.. option:: --frontend-http3-read-timeout=<DURATION>
Specify read timeout for HTTP/3 frontend connection.
Default: ``3m``
.. option:: --frontend-read-timeout=<DURATION> .. option:: --frontend-read-timeout=<DURATION>
Specify read timeout for HTTP/1.1 frontend connection. Specify read timeout for HTTP/1.1 frontend connection.
@ -639,7 +597,7 @@ SSL/TLS
This option sets cipher suites for TLSv1.2 or earlier. This option sets cipher suites for TLSv1.2 or earlier.
Use :option:`--tls13-ciphers` for TLSv1.3. Use :option:`--tls13-ciphers` for TLSv1.3.
Default: ``ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384`` 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:: --tls13-ciphers=<SUITE> .. option:: --tls13-ciphers=<SUITE>
@ -648,7 +606,7 @@ SSL/TLS
This option sets cipher suites for TLSv1.3. Use This option sets cipher suites for TLSv1.3. Use
:option:`--ciphers` for TLSv1.2 or earlier. :option:`--ciphers` for TLSv1.2 or earlier.
Default: ``TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256`` Default: ``TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256``
.. option:: --client-ciphers=<SUITE> .. option:: --client-ciphers=<SUITE>
@ -657,7 +615,7 @@ SSL/TLS
This option sets cipher suites for TLSv1.2 or earlier. This option sets cipher suites for TLSv1.2 or earlier.
Use :option:`--tls13-client-ciphers` for TLSv1.3. Use :option:`--tls13-client-ciphers` for TLSv1.3.
Default: ``ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384`` 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:: --tls13-client-ciphers=<SUITE> .. option:: --tls13-client-ciphers=<SUITE>
@ -666,7 +624,7 @@ SSL/TLS
This option sets cipher suites for TLSv1.3. Use This option sets cipher suites for TLSv1.3. Use
:option:`--tls13-client-ciphers` for TLSv1.2 or earlier. :option:`--tls13-client-ciphers` for TLSv1.2 or earlier.
Default: ``TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256`` Default: ``TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256``
.. option:: --ecdh-curves=<LIST> .. option:: --ecdh-curves=<LIST>
@ -964,19 +922,19 @@ SSL/TLS
Default: ``1s`` Default: ``1s``
.. option:: --no-http2-cipher-block-list .. option:: --no-http2-cipher-black-list
Allow block listed cipher suite on frontend HTTP/2 Allow black listed cipher suite on frontend HTTP/2
connection. See connection. See
https://tools.ietf.org/html/rfc7540#appendix-A for the https://tools.ietf.org/html/rfc7540#appendix-A for the
complete HTTP/2 cipher suites block list. complete HTTP/2 cipher suites black list.
.. option:: --client-no-http2-cipher-block-list .. option:: --client-no-http2-cipher-black-list
Allow block listed cipher suite on backend HTTP/2 Allow black listed cipher suite on backend HTTP/2
connection. See connection. See
https://tools.ietf.org/html/rfc7540#appendix-A for the https://tools.ietf.org/html/rfc7540#appendix-A for the
complete HTTP/2 cipher suites block list. complete HTTP/2 cipher suites black list.
.. option:: --tls-sct-dir=<DIR> .. option:: --tls-sct-dir=<DIR>
@ -999,9 +957,9 @@ SSL/TLS
are skipped. The default enabled cipher list might not are skipped. The default enabled cipher list might not
contain any PSK cipher suite. In that case, desired PSK contain any PSK cipher suite. In that case, desired PSK
cipher suites must be enabled using :option:`--ciphers` option. cipher suites must be enabled using :option:`--ciphers` option.
The desired PSK cipher suite may be block listed by The desired PSK cipher suite may be black listed by
HTTP/2. To use those cipher suites with HTTP/2, HTTP/2. To use those cipher suites with HTTP/2,
consider to use :option:`--no-http2-cipher-block-list` option. consider to use :option:`--no-http2-cipher-black-list` option.
But be aware its implications. But be aware its implications.
.. option:: --client-psk-secrets=<PATH> .. option:: --client-psk-secrets=<PATH>
@ -1015,20 +973,19 @@ SSL/TLS
The default enabled cipher list might not contain any The default enabled cipher list might not contain any
PSK cipher suite. In that case, desired PSK cipher PSK cipher suite. In that case, desired PSK cipher
suites must be enabled using :option:`--client-ciphers` option. suites must be enabled using :option:`--client-ciphers` option.
The desired PSK cipher suite may be block listed by The desired PSK cipher suite may be black listed by
HTTP/2. To use those cipher suites with HTTP/2, HTTP/2. To use those cipher suites with HTTP/2,
consider to use :option:`--client-no-http2-cipher-block-list` consider to use :option:`--client-no-http2-cipher-black-list`
option. But be aware its implications. option. But be aware its implications.
.. option:: --tls-no-postpone-early-data .. option:: --tls-no-postpone-early-data
By default, except for QUIC connections, nghttpx By default, nghttpx postpones forwarding HTTP requests
postpones forwarding HTTP requests sent in early data, sent in early data, including those sent in partially in
including those sent in partially in it, until TLS it, until TLS handshake finishes. If all backend server
handshake finishes. If all backend server recognizes recognizes "Early-Data" header field, using this option
"Early-Data" header field, using this option makes makes nghttpx not postpone forwarding request and get
nghttpx not postpone forwarding request and get full full potential of 0-RTT data.
potential of 0-RTT data.
.. option:: --tls-max-early-data=<SIZE> .. option:: --tls-max-early-data=<SIZE>
@ -1037,11 +994,6 @@ SSL/TLS
Default: ``16K`` Default: ``16K``
.. option:: --tls-ktls
Enable ktls. For server, ktls is enable if
:option:`--tls-session-cache-memcached` is not configured.
HTTP/2 HTTP/2
~~~~~~ ~~~~~~
@ -1251,14 +1203,6 @@ Logging
request. "-" if backend host is not available. request. "-" if backend host is not available.
* $backend_port: backend port used to fulfill the * $backend_port: backend port used to fulfill the
request. "-" if backend host is not available. request. "-" if backend host is not available.
* $method: HTTP method
* $path: Request path including query. For CONNECT
request, authority is recorded.
* $path_without_query: $path up to the first '?'
character. For CONNECT request, authority is
recorded.
* $protocol_version: HTTP version (e.g., HTTP/1.1,
HTTP/2)
The variable can be enclosed by "{" and "}" for The variable can be enclosed by "{" and "}" for
disambiguation (e.g., ${remote_addr}). disambiguation (e.g., ${remote_addr}).
@ -1383,21 +1327,14 @@ HTTP
mode. When :option:`--http2-proxy` is used, these headers will mode. When :option:`--http2-proxy` is used, these headers will
not be altered regardless of this option. not be altered regardless of this option.
.. option:: --altsvc=<PROTOID,PORT[,HOST,[ORIGIN[,PARAMS]]]> .. option:: --altsvc=<PROTOID,PORT[,HOST,[ORIGIN]]>
Specify protocol ID, port, host and origin of Specify protocol ID, port, host and origin of
alternative service. <HOST>, <ORIGIN> and <PARAMS> are alternative service. <HOST> and <ORIGIN> are optional.
optional. Empty <HOST> and <ORIGIN> are allowed and They are advertised in alt-svc header field only in
they are treated as nothing is specified. They are HTTP/1.1 frontend. This option can be used multiple
advertised in alt-svc header field only in HTTP/1.1 times to specify multiple alternative services.
frontend. This option can be used multiple times to Example: :option:`--altsvc`\=h2,443
specify multiple alternative services.
Example: :option:`--altsvc`\="h2,443,,,ma=3600; persist=1"
.. option:: --http2-altsvc=<PROTOID,PORT[,HOST,[ORIGIN[,PARAMS]]]>
Just like :option:`--altsvc` option, but this altsvc is only sent
in HTTP/2 frontend.
.. option:: --add-request-header=<HEADER> .. option:: --add-request-header=<HEADER>
@ -1478,15 +1415,6 @@ HTTP
Default: ``443`` Default: ``443``
.. option:: --require-http-scheme
Always require http or https scheme in HTTP request. It
also requires that https scheme must be used for an
encrypted connection. Otherwise, http scheme must be
used. This option is recommended for a server
deployment which directly faces clients and the services
it provides only require http or https scheme.
API API
~~~ ~~~
@ -1581,37 +1509,12 @@ Process
Run this program in a single process mode for debugging Run this program in a single process mode for debugging
purpose. Without this option, nghttpx creates at least purpose. Without this option, nghttpx creates at least
2 processes: main and worker processes. If this option 2 processes: master and worker processes. If this
is used, main and worker are unified into a single option is used, master and worker are unified into a
process. nghttpx still spawns additional process if single process. nghttpx still spawns additional process
neverbleed is used. In the single process mode, the if neverbleed is used. In the single process mode, the
signal handling feature is disabled. signal handling feature is disabled.
.. option:: --max-worker-processes=<N>
The maximum number of worker processes. nghttpx spawns
new worker process when it reloads its configuration.
The previous worker process enters graceful termination
period and will terminate when it finishes handling the
existing connections. However, if reloading
configurations happen very frequently, the worker
processes might be piled up if they take a bit long time
to finish the existing connections. With this option,
if the number of worker processes exceeds the given
value, the oldest worker process is terminated
immediately. Specifying 0 means no limit and it is the
default behaviour.
.. option:: --worker-process-grace-shutdown-period=<DURATION>
Maximum period for a worker process to terminate
gracefully. When a worker process enters in graceful
shutdown period (e.g., when nghttpx reloads its
configuration) and it does not finish handling the
existing connections in the given period of time, it is
immediately terminated. Specifying 0 means no limit and
it is the default behaviour.
Scripting Scripting
~~~~~~~~~ ~~~~~~~~~
@ -1627,147 +1530,6 @@ Scripting
file were specified for the pattern. file were specified for the pattern.
HTTP/3 and QUIC
~~~~~~~~~~~~~~~
.. option:: --frontend-quic-idle-timeout=<DURATION>
Specify an idle timeout for QUIC connection.
Default: ``30s``
.. option:: --frontend-quic-debug-log
Output QUIC debug log to */dev/stderr.*
.. option:: --quic-bpf-program-file=<PATH>
Specify a path to eBPF program file reuseport_kern.o to
direct an incoming QUIC UDP datagram to a correct
socket.
Default: ``/usr/local/lib/nghttp2/reuseport_kern.o``
.. option:: --frontend-quic-early-data
Enable early data on frontend QUIC connections. nghttpx
sends "Early-Data" header field to a backend server if a
request is received in early data and handshake has not
finished. All backend servers should deal with possibly
replayed requests.
.. option:: --frontend-quic-qlog-dir=<DIR>
Specify a directory where a qlog file is written for
frontend QUIC connections. A qlog file is created per
each QUIC connection. The file name is ISO8601 basic
format, followed by "-", server Source Connection ID and
".sqlog".
.. option:: --frontend-quic-require-token
Require an address validation token for a frontend QUIC
connection. Server sends a token in Retry packet or
NEW_TOKEN frame in the previous connection.
.. option:: --frontend-quic-congestion-controller=<CC>
Specify a congestion controller algorithm for a frontend
QUIC connection. <CC> should be one of "cubic", "bbr",
and "bbr2".
Default: ``cubic``
.. option:: --frontend-quic-secret-file=<PATH>
Path to file that contains secure random data to be used
as QUIC keying materials. It is used to derive keys for
encrypting tokens and Connection IDs. It is not used to
encrypt QUIC packets. Each line of this file must
contain exactly 136 bytes hex-encoded string (when
decoded the byte string is 68 bytes long). The first 2
bits of decoded byte string are used to identify the
keying material. An empty line or a line which starts
'#' is ignored. The file can contain more than one
keying materials. Because the identifier is 2 bits, at
most 4 keying materials are read and the remaining data
is discarded. The first keying material in the file is
primarily used for encryption and decryption for new
connection. The other ones are used to decrypt data for
the existing connections. Specifying multiple keying
materials enables key rotation. Please note that key
rotation does not occur automatically. User should
update files or change options values and restart
nghttpx gracefully. If opening or reading given file
fails, all loaded keying materials are discarded and it
is treated as if none of this option is given. If this
option is not given or an error occurred while opening
or reading a file, a keying material is generated
internally on startup and reload.
.. option:: --quic-server-id=<HEXSTRING>
Specify server ID encoded in Connection ID to identify
this particular server instance. Connection ID is
encrypted and this part is not visible in public. It
must be 4 bytes long and must be encoded in hex string
(which is 8 bytes long). If this option is omitted, a
random server ID is generated on startup and
configuration reload.
.. option:: --frontend-quic-initial-rtt=<DURATION>
Specify the initial RTT of the frontend QUIC connection.
Default: ``333ms``
.. option:: --no-quic-bpf
Disable eBPF.
.. option:: --frontend-http3-window-size=<SIZE>
Sets the per-stream initial window size of HTTP/3
frontend connection.
Default: ``256K``
.. option:: --frontend-http3-connection-window-size=<SIZE>
Sets the per-connection window size of HTTP/3 frontend
connection.
Default: ``1M``
.. option:: --frontend-http3-max-window-size=<SIZE>
Sets the maximum per-stream window size of HTTP/3
frontend connection. The window size is adjusted based
on the receiving rate of stream data. The initial value
is the value specified by :option:`--frontend-http3-window-size`
and the window size grows up to <SIZE> bytes.
Default: ``6M``
.. option:: --frontend-http3-max-connection-window-size=<SIZE>
Sets the maximum per-connection window size of HTTP/3
frontend connection. The window size is adjusted based
on the receiving rate of stream data. The initial value
is the value specified by
:option:`--frontend-http3-connection-window-size` and the window
size grows up to <SIZE> bytes.
Default: ``8M``
.. option:: --frontend-http3-max-concurrent-streams=<N>
Set the maximum number of the concurrent streams in one
frontend HTTP/3 connection.
Default: ``100``
Misc Misc
~~~~ ~~~~
@ -1852,14 +1614,14 @@ Error log
using :option:`--errorlog-file`. The format of log message is as using :option:`--errorlog-file`. The format of log message is as
follows: follows:
<datetime> <main-pid> <current-pid> <thread-id> <level> (<filename>:<line>) <msg> <datetime> <master-pid> <current-pid> <thread-id> <level> (<filename>:<line>) <msg>
<datetime> <datetime>
It is a combination of date and time when the log is written. It It is a combination of date and time when the log is written. It
is in ISO 8601 format. is in ISO 8601 format.
<main-pid> <master-pid>
It is a main process ID. It is a master process ID.
<current-pid> <current-pid>
It is a process ID which writes this log. It is a process ID which writes this log.
@ -1892,30 +1654,30 @@ 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. As
of nghttpx version 1.20.0, the new main process sends SIGQUIT to the of nghttpx version 1.20.0, the new master process sends SIGQUIT to
original main process when it is ready to serve requests. For the the original master process when it is ready to serve requests. For
earlier versions of nghttpx, user has to send SIGQUIT to the the earlier versions of nghttpx, user has to send SIGQUIT to the
original main process. original master process.
The difference between SIGUSR2 (+ SIGQUIT) and SIGHUP is that former The difference between SIGUSR2 (+ SIGQUIT) and SIGHUP is that former
is usually used to execute new binary, and the main process is newly is usually used to execute new binary, and the master process is
spawned. On the other hand, the latter just reloads configuration newly spawned. On the other hand, the latter just reloads
file, and the same main process continues to exist. configuration file, and the same master process continues to exist.
.. note:: .. note::
nghttpx consists of multiple processes: one process for processing nghttpx consists of multiple processes: one process for processing
these signals, and another one for processing requests. The former these signals, and another one for processing requests. The former
spawns the latter. The former is called main process, and the spawns the latter. The former is called master process, and the
latter is called worker process. If neverbleed is enabled, the latter is called worker process. If neverbleed is enabled, the
worker process spawns neverbleed daemon process which does RSA key worker process spawns neverbleed daemon process which does RSA key
processing. The above signal must be sent to the main process. If processing. The above signal must be sent to the master process.
the other processes received one of them, it is ignored. This If the other processes received one of them, it is ignored. This
behaviour of these processes may change in the future release. In behaviour of these processes may change in the future release. In
other words, in the future release, the processes other than main other words, in the future release, the processes other than master
process may terminate upon the reception of these signals. process may terminate upon the reception of these signals.
Therefore these signals should not be sent to the processes other Therefore these signals should not be sent to the processes other
than main process. than master process.
SERVER PUSH SERVER PUSH
----------- -----------

View File

@ -46,14 +46,14 @@ Error log
using :option:`--errorlog-file`. The format of log message is as using :option:`--errorlog-file`. The format of log message is as
follows: follows:
<datetime> <main-pid> <current-pid> <thread-id> <level> (<filename>:<line>) <msg> <datetime> <master-pid> <current-pid> <thread-id> <level> (<filename>:<line>) <msg>
<datetime> <datetime>
It is a combination of date and time when the log is written. It It is a combination of date and time when the log is written. It
is in ISO 8601 format. is in ISO 8601 format.
<main-pid> <master-pid>
It is a main process ID. It is a master process ID.
<current-pid> <current-pid>
It is a process ID which writes this log. It is a process ID which writes this log.
@ -86,30 +86,30 @@ 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. As
of nghttpx version 1.20.0, the new main process sends SIGQUIT to the of nghttpx version 1.20.0, the new master process sends SIGQUIT to
original main process when it is ready to serve requests. For the the original master process when it is ready to serve requests. For
earlier versions of nghttpx, user has to send SIGQUIT to the the earlier versions of nghttpx, user has to send SIGQUIT to the
original main process. original master process.
The difference between SIGUSR2 (+ SIGQUIT) and SIGHUP is that former The difference between SIGUSR2 (+ SIGQUIT) and SIGHUP is that former
is usually used to execute new binary, and the main process is newly is usually used to execute new binary, and the master process is
spawned. On the other hand, the latter just reloads configuration newly spawned. On the other hand, the latter just reloads
file, and the same main process continues to exist. configuration file, and the same master process continues to exist.
.. note:: .. note::
nghttpx consists of multiple processes: one process for processing nghttpx consists of multiple processes: one process for processing
these signals, and another one for processing requests. The former these signals, and another one for processing requests. The former
spawns the latter. The former is called main process, and the spawns the latter. The former is called master process, and the
latter is called worker process. If neverbleed is enabled, the latter is called worker process. If neverbleed is enabled, the
worker process spawns neverbleed daemon process which does RSA key worker process spawns neverbleed daemon process which does RSA key
processing. The above signal must be sent to the main process. If processing. The above signal must be sent to the master process.
the other processes received one of them, it is ignored. This If the other processes received one of them, it is ignored. This
behaviour of these processes may change in the future release. In behaviour of these processes may change in the future release. In
other words, in the future release, the processes other than main other words, in the future release, the processes other than master
process may terminate upon the reception of these signals. process may terminate upon the reception of these signals.
Therefore these signals should not be sent to the processes other Therefore these signals should not be sent to the processes other
than main process. than master process.
SERVER PUSH SERVER PUSH
----------- -----------

View File

@ -6,7 +6,7 @@ Architecture
The most notable point in nghttp2 library architecture is it does not The most notable point in nghttp2 library architecture is it does not
perform any I/O. nghttp2 only performs HTTP/2 protocol stuff based on perform any I/O. nghttp2 only performs HTTP/2 protocol stuff based on
input byte strings. It will call callback functions set by input byte strings. It will calls callback functions set by
applications while processing input. The output of nghttp2 is just applications while processing input. The output of nghttp2 is just
byte string. An application is responsible to send these output to byte string. An application is responsible to send these output to
the remote peer. The callback functions may be called while producing the remote peer. The callback functions may be called while producing
@ -479,48 +479,3 @@ its creation, like so:
When ALTSVC is received, :type:`nghttp2_on_frame_recv_callback` will When ALTSVC is received, :type:`nghttp2_on_frame_recv_callback` will
be called as usual. be called as usual.
Stream priorities
-----------------
By default, the stream prioritization scheme described in :rfc:`7540`
is used. This scheme has been formally deprecated by :rfc:`9113`. In
order to disable it, send
:enum:`nghttp2_settings_id.NGHTTP2_SETTINGS_NO_RFC7540_PRIORITIES` of
value of 1 via `nghttp2_submit_settings()`. This settings ID is
defined by :rfc:`9218`. The sender of this settings value disables
RFC 7540 priorities, and instead it enables RFC 9218 Extensible
Prioritization Scheme. This new prioritization scheme has 2 methods
to convey the stream priorities to a remote endpoint: Priority header
field and PRIORITY_UPDATE frame. nghttp2 supports both methods. In
order to receive and process PRIORITY_UPDATE frame, server has to call
``nghttp2_option_set_builtin_recv_extension_type(option,
NGHTTP2_PRIORITY_UPDATE)`` (see the above section), and pass the
option to `nghttp2_session_server_new2()` or
`nghttp2_session_server_new3()` to create a server session. Client
can send Priority header field via `nghttp2_submit_request()`. It can
also send PRIORITY_UPDATE frame via
`nghttp2_submit_priority_update()`. Server processes Priority header
field in a request header field and updates the stream priority unless
HTTP messaging rule enforcement is disabled (see
`nghttp2_option_set_no_http_messaging()`).
For the purpose of smooth migration from RFC 7540 priorities, client
is advised to send
:enum:`nghttp2_settings_id.NGHTTP2_SETTINGS_NO_RFC7540_PRIORITIES` of
value of 1. Until it receives the first server SETTINGS frame, it can
send both RFC 7540 and RFC 9128 priority signals. If client receives
SETTINGS_NO_RFC7540_PRIORITIES of value of 0, or it is omitted ,
client stops sending PRIORITY_UPDATE frame. Priority header field
will be sent in anyway since it is an end-to-end signal. If
SETTINGS_NO_RFC7540_PRIORITIES of value of 1 is received, client stops
sending RFC 7540 priority signals. This is the advice described in
:rfc:`9218#section-2.1.1`.
Server has an optional mechanism to fallback to RFC 7540 priorities.
By default, if server sends SETTINGS_NO_RFC7540_PRIORITIES of value of
1, it completely disables RFC 7540 priorities and no fallback. By
setting nonzero value to
`nghttp2_option_set_server_fallback_rfc7540_priorities()`, server
falls back to RFC 7540 priorities if it sends
SETTINGS_NO_RFC7540_PRIORITIES value of value of 1, and client omits
SETTINGS_NO_RFC7540_PRIORITIES in its SETTINGS frame.

1
doc/python-apiref.rst.in Normal file
View File

@ -0,0 +1 @@
.. include:: @top_srcdir@/doc/sources/python-apiref.rst

View File

@ -2,39 +2,49 @@ 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>`_ cross-compiler on `Android NDK <https://developer.android.com/ndk/index.html>`_
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.
See Dockerfile.android for more details. If you cannot use See Dockerfile.android for more details. If you cannot use
Dockerfile.android for whatever reason, continue to read the rest of Dockerfile.android for whatever reason, continue to read the rest of
this article. this article.
We offer ``android-config`` script to make the build easier. To make We offer ``android-config`` and ``android-make`` scripts to make the
the script work, NDK directory must be set to ``NDK`` environment build easier. To make these script work, NDK toolchain must be
variable. NDK directory is the directory where NDK is unpacked: installed in the following way. First, let us introduce
``ANDROID_HOME`` environment variable. We need to install toolchain
under ``$ANDROID_HOME/toolchain``. An user can freely choose the path
for ``ANDROID_HOME``. For example, to install toolchain under
``$ANDROID_HOME/toolchain``, do this in the the directory where NDK is
unpacked:
.. code-block:: text .. code-block:: text
$ unzip android-ndk-$NDK_VERSION-linux.zip $ build/tools/make_standalone_toolchain.py \
$ cd android-ndk-$NDK_VERSION --arch arm --api 16 --stl gnustl \
$ export NDK=$PWD --install-dir $ANDROID_HOME/toolchain
The API level (``--api``) is not important here because we don't use
Android specific C/C++ API.
The dependent libraries, such as OpenSSL, libev, and c-ares should be The dependent libraries, such as OpenSSL, libev, and c-ares should be
built with the same NDK toolchain and installed under built with the toolchain and installed under
``$NDK/usr/local``. We recommend to build these libraries as static ``$ANDROID_HOME/usr/local``. We recommend to build these libraries as
library to make the deployment easier. libxml2 support is currently static library to make the deployment easier. libxml2 support is
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.
Before running ``android-config``, ``NDK`` environment variable must Before running ``android-config`` and ``android-make``,
be set to point to the correct path. ``ANDROID_HOME`` environment variable must be set to point to the
correct path. Also add ``$ANDROID_HOME/toolchain/bin`` to ``PATH``:
You need to set ``NGHTTP2`` environment variable to the absolute path .. code-block:: text
to the source directory of nghttp2.
$ export PATH=$PATH:$ANDROID_HOME/toolchain/bin
To configure OpenSSL, use the following script: To configure OpenSSL, use the following script:
@ -42,36 +52,39 @@ To configure OpenSSL, use the following script:
#!/bin/sh #!/bin/sh
. $NGHTTP2/android-env 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
export ANDROID_NDK_HOME=$NDK export CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi-
export PATH=$TOOLCHAIN/bin:$PATH ./Configure --prefix=$PREFIX android
./Configure no-shared --prefix=$PREFIX android-arm64 And run ``make install_sw`` to build and install without
documentation.
And run the following script to build and install without We cannot compile libev without modification. Apply `this patch
documentation: <https://gist.github.com/tatsuhiro-t/48c45f08950f587180ed>`_ before
configuring libev. This patch is for libev-4.19. After applying the
patch, to configure libev, use the following script:
.. code-block:: sh .. code-block:: sh
#!/bin/sh #!/bin/sh
. $NGHTTP2/android-env if [ -z "$ANDROID_HOME" ]; then
echo 'No $ANDROID_HOME specified.'
export PATH=$TOOLCHAIN/bin:$PATH exit 1
fi
make install_sw PREFIX=$ANDROID_HOME/usr/local
TOOLCHAIN=$ANDROID_HOME/toolchain
To configure libev, use the following script: PATH=$TOOLCHAIN/bin:$PATH
.. code-block:: sh
#!/bin/sh
. $NGHTTP2/android-env
./configure \ ./configure \
--host=$TARGET \ --host=arm-linux-androideabi \
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \ --build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
--prefix=$PREFIX \ --prefix=$PREFIX \
--disable-shared \ --disable-shared \
@ -87,26 +100,41 @@ To configure c-ares, use the following script:
#!/bin/sh -e #!/bin/sh -e
. $NGHTTP2/android-env 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 \ ./configure \
--host=$TARGET \ --host=arm-linux-androideabi \
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \ --build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
--prefix=$PREFIX \ --prefix=$PREFIX \
--disable-shared --disable-shared
And run ``make install`` to build and install.
To configure zlib, use the following script: To configure zlib, use the following script:
.. code-block:: sh .. code-block:: sh
#!/bin/sh -e #!/bin/sh -e
. $NGHTTP2/android-env 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
export HOST=$TARGET HOST=arm-linux-androideabi
CC=$HOST-gcc \
AR=$HOST-ar \
LD=$HOST-ld \
RANLIB=$HOST-ranlib \
STRIP=$HOST-strip \
./configure \ ./configure \
--prefix=$PREFIX \ --prefix=$PREFIX \
--libdir=$PREFIX/lib \ --libdir=$PREFIX/lib \
@ -116,7 +144,7 @@ To configure zlib, use the following script:
And run ``make install`` to build and install. 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 ``make`` to compile nghttp2 source files. then ``android-make`` to compile nghttp2 source files.
If all went well, application binaries, such as nghttpx, are created If all went well, application binaries, such as nghttpx, are created
under src directory. Strip debugging information from the binary under src directory. Strip debugging information from the binary
@ -124,4 +152,4 @@ using the following command:
.. code-block:: text .. code-block:: text
$ $NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip src/nghttpx $ arm-linux-androideabi-strip src/nghttpx

View File

@ -26,21 +26,21 @@ 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-14. between versions, we currently use clang-format-9.
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., your PATH or it exists under different name (e.g., clang-format-diff-9
clang-format-diff-14 in debian), either add it to PATH variable or add in debian), either add it to PATH variable or add git option
git option ``clangformatdiff.binary`` to point to the script. ``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
found, download it from `here found, download it from `here
<https://github.com/llvm/llvm-project/blob/main/clang/tools/clang-format/clang-format.el>`_. <https://llvm.org/svn/llvm-project/cfe/trunk/tools/clang-format/clang-format.el>`_.
And add these lines to your .emacs file: And add these lines to your .emacs file:
.. code-block:: lisp .. code-block:: lisp

View File

@ -131,12 +131,3 @@ specify ``unix:`` followed by the path to UNIX domain socket. For
example, if UNIX domain socket is ``/tmp/nghttpx.sock``, use example, if UNIX domain socket is ``/tmp/nghttpx.sock``, use
``--base-uri=unix:/tmp/nghttpx.sock``. h2load uses scheme, host and ``--base-uri=unix:/tmp/nghttpx.sock``. h2load uses scheme, host and
port in the first URI in command-line or input file. port in the first URI in command-line or input file.
HTTP/3
------
h2load supports HTTP/3 if it is built with HTTP/3 enabled. HTTP/3
support is experimental.
In order to send HTTP/3 request, specify ``h3`` to
:option:`--npn-list`.

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