mirror of
https://github.com/nghttp2/nghttp2.git
synced 2025-12-07 18:48:54 +08:00
Compare commits
90 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
25f29e7634 | ||
|
|
19cf303828 | ||
|
|
217d2fc13a | ||
|
|
07edcb9ffe | ||
|
|
cf9a7df327 | ||
|
|
4cbbff3ca7 | ||
|
|
9f1fc4810b | ||
|
|
2321253545 | ||
|
|
dc3ca53a8e | ||
|
|
44869a4924 | ||
|
|
6862916306 | ||
|
|
2917f6d8e8 | ||
|
|
7d60389596 | ||
|
|
a37117a98b | ||
|
|
eb1607890a | ||
|
|
fadedc46f8 | ||
|
|
0362bd6e00 | ||
|
|
25d3323c8a | ||
|
|
e7f35e879b | ||
|
|
2ca1ba9f72 | ||
|
|
8affef1061 | ||
|
|
7006bf04e3 | ||
|
|
132cd21c12 | ||
|
|
863434fa01 | ||
|
|
4660252b32 | ||
|
|
51510f1710 | ||
|
|
51d4e419cf | ||
|
|
3912e965fb | ||
|
|
4b2f528719 | ||
|
|
c5102d3f81 | ||
|
|
4bedc9a074 | ||
|
|
89aa449ddf | ||
|
|
90846d8af2 | ||
|
|
ae736b4054 | ||
|
|
5d9d35a6f5 | ||
|
|
31a4628034 | ||
|
|
7f949152bd | ||
|
|
d4a67a6868 | ||
|
|
7d87221a8c | ||
|
|
3162ffedfc | ||
|
|
7d41e4db6b | ||
|
|
aebd837790 | ||
|
|
c7736c2a85 | ||
|
|
0b98685c41 | ||
|
|
39e6588fd5 | ||
|
|
a1e88ad809 | ||
|
|
c60ca34719 | ||
|
|
a4dc6cf526 | ||
|
|
799f72b078 | ||
|
|
245dbd6511 | ||
|
|
987e700f36 | ||
|
|
a26bb9c8d1 | ||
|
|
d590b67dc1 | ||
|
|
5ce081ce95 | ||
|
|
a995580913 | ||
|
|
aa7c580bb1 | ||
|
|
1d05c6c3c5 | ||
|
|
52e4cd80c3 | ||
|
|
212635eeca | ||
|
|
2d80acfdbb | ||
|
|
f8528c5080 | ||
|
|
4733167f91 | ||
|
|
7f7979a8ae | ||
|
|
06cdc97da5 | ||
|
|
dbfd59ad38 | ||
|
|
dc9384dc7c | ||
|
|
3c15e85783 | ||
|
|
42f47c1920 | ||
|
|
327a7adbaa | ||
|
|
9e089521e7 | ||
|
|
b912b626cd | ||
|
|
8b32ad735f | ||
|
|
8d3932d94a | ||
|
|
1a63c02c0e | ||
|
|
e45b10ca20 | ||
|
|
330fe12494 | ||
|
|
06272f8365 | ||
|
|
db5ad83776 | ||
|
|
b558eeb861 | ||
|
|
f4276ce2dc | ||
|
|
4fd9fa238a | ||
|
|
9031469735 | ||
|
|
19fb74b03f | ||
|
|
5b788f5218 | ||
|
|
d64488d909 | ||
|
|
daad34ab95 | ||
|
|
1bd57360c7 | ||
|
|
e9d5c5a489 | ||
|
|
78974cb60b | ||
|
|
c24c7ffa06 |
@@ -2,7 +2,6 @@
|
|||||||
Language: Cpp
|
Language: Cpp
|
||||||
AccessModifierOffset: -2
|
AccessModifierOffset: -2
|
||||||
AlignAfterOpenBracket: Align
|
AlignAfterOpenBracket: Align
|
||||||
AlignArrayOfStructures: None
|
|
||||||
AlignConsecutiveMacros: None
|
AlignConsecutiveMacros: None
|
||||||
AlignConsecutiveAssignments: None
|
AlignConsecutiveAssignments: None
|
||||||
AlignConsecutiveBitFields: None
|
AlignConsecutiveBitFields: None
|
||||||
@@ -11,6 +10,7 @@ AlignEscapedNewlines: Right
|
|||||||
AlignOperands: Align
|
AlignOperands: Align
|
||||||
AlignTrailingComments: true
|
AlignTrailingComments: true
|
||||||
AllowAllArgumentsOnNextLine: true
|
AllowAllArgumentsOnNextLine: true
|
||||||
|
AllowAllConstructorInitializersOnNextLine: true
|
||||||
AllowAllParametersOfDeclarationOnNextLine: true
|
AllowAllParametersOfDeclarationOnNextLine: true
|
||||||
AllowShortEnumsOnASingleLine: true
|
AllowShortEnumsOnASingleLine: true
|
||||||
AllowShortBlocksOnASingleLine: Never
|
AllowShortBlocksOnASingleLine: Never
|
||||||
@@ -58,28 +58,23 @@ 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
|
DeriveLineEnding: true
|
||||||
DerivePointerAlignment: false
|
DerivePointerAlignment: false
|
||||||
DisableFormat: false
|
DisableFormat: false
|
||||||
EmptyLineAfterAccessModifier: Never
|
|
||||||
EmptyLineBeforeAccessModifier: LogicalBlock
|
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:
|
StatementAttributeLikeMacros:
|
||||||
- KJ_IF_MAYBE
|
- Q_EMIT
|
||||||
IncludeBlocks: Preserve
|
IncludeBlocks: Preserve
|
||||||
IncludeCategories:
|
IncludeCategories:
|
||||||
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
|
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
|
||||||
@@ -96,7 +91,6 @@ IncludeCategories:
|
|||||||
CaseSensitive: false
|
CaseSensitive: false
|
||||||
IncludeIsMainRegex: '$'
|
IncludeIsMainRegex: '$'
|
||||||
IncludeIsMainSourceRegex: ''
|
IncludeIsMainSourceRegex: ''
|
||||||
IndentAccessModifiers: false
|
|
||||||
IndentCaseLabels: false
|
IndentCaseLabels: false
|
||||||
IndentCaseBlocks: false
|
IndentCaseBlocks: false
|
||||||
IndentGotoLabels: true
|
IndentGotoLabels: true
|
||||||
@@ -109,7 +103,6 @@ InsertTrailingCommas: None
|
|||||||
JavaScriptQuotes: Leave
|
JavaScriptQuotes: Leave
|
||||||
JavaScriptWrapImports: true
|
JavaScriptWrapImports: true
|
||||||
KeepEmptyLinesAtTheStartOfBlocks: true
|
KeepEmptyLinesAtTheStartOfBlocks: true
|
||||||
LambdaBodyIndentation: Signature
|
|
||||||
MacroBlockBegin: ''
|
MacroBlockBegin: ''
|
||||||
MacroBlockEnd: ''
|
MacroBlockEnd: ''
|
||||||
MaxEmptyLinesToKeep: 1
|
MaxEmptyLinesToKeep: 1
|
||||||
@@ -123,20 +116,14 @@ 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
|
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
|
SortJavaStaticImport: Before
|
||||||
SortUsingDeclarations: true
|
SortUsingDeclarations: true
|
||||||
SpaceAfterCStyleCast: false
|
SpaceAfterCStyleCast: false
|
||||||
@@ -148,33 +135,20 @@ 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
|
SpaceAroundPointerQualifiers: Default
|
||||||
SpaceBeforeRangeBasedForLoopColon: true
|
SpaceBeforeRangeBasedForLoopColon: true
|
||||||
SpaceInEmptyBlock: false
|
SpaceInEmptyBlock: false
|
||||||
SpaceInEmptyParentheses: false
|
SpaceInEmptyParentheses: false
|
||||||
SpacesBeforeTrailingComments: 1
|
SpacesBeforeTrailingComments: 1
|
||||||
SpacesInAngles: Never
|
SpacesInAngles: false
|
||||||
SpacesInConditionalStatement: 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
|
SpaceBeforeSquareBrackets: false
|
||||||
BitFieldColonSpacing: Both
|
BitFieldColonSpacing: Both
|
||||||
Standard: Latest
|
Standard: Latest
|
||||||
StatementAttributeLikeMacros:
|
|
||||||
- Q_EMIT
|
|
||||||
StatementMacros:
|
StatementMacros:
|
||||||
- Q_UNUSED
|
- Q_UNUSED
|
||||||
- QT_REQUIRE_VERSION
|
- QT_REQUIRE_VERSION
|
||||||
|
|||||||
242
.github/workflows/build.yml
vendored
242
.github/workflows/build.yml
vendored
@@ -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-20.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++-11 \
|
g++-8 \
|
||||||
clang-12 \
|
clang-10 \
|
||||||
autoconf \
|
autoconf \
|
||||||
automake \
|
automake \
|
||||||
autotools-dev \
|
autotools-dev \
|
||||||
@@ -52,7 +34,6 @@ 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,undefined -fno-sanitize-recover=undefined -g' >> $GITHUB_ENV
|
||||||
@@ -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-12' >> $GITHUB_ENV
|
echo 'CC=clang-10' >> $GITHUB_ENV
|
||||||
echo 'CXX=clang++-12' >> $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-11' >> $GITHUB_ENV
|
echo 'CC=gcc-8' >> $GITHUB_ENV
|
||||||
echo 'CXX=g++-11' >> $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.0 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_1q+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.5+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 04989786e9ab16cef5261bbd05a2b1a8cb312dbf
|
|
||||||
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.7.1 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.9.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
|
|
||||||
|
|||||||
89
.travis.yml
Normal file
89
.travis.yml
Normal 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
|
||||||
17
AUTHORS
17
AUTHORS
@@ -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
|
||||||
@@ -35,15 +34,11 @@ 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 +48,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
|
||||||
@@ -82,32 +74,25 @@ 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
|
||||||
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
|
||||||
@@ -142,11 +127,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
|
||||||
|
|||||||
@@ -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.50.0)
|
project(nghttp2 VERSION 1.44.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 0)
|
set(LT_REVISION 2)
|
||||||
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)
|
||||||
@@ -61,18 +61,6 @@ 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()
|
||||||
@@ -179,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.
|
||||||
@@ -194,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 "")
|
||||||
@@ -247,31 +223,11 @@ if(ENABLE_ASIO_LIB)
|
|||||||
find_package(Boost 1.54.0 REQUIRED system thread)
|
find_package(Boost 1.54.0 REQUIRED system thread)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# libbpf (for bpf)
|
|
||||||
set(HAVE_LIBBPF ${LIBBPF_FOUND})
|
|
||||||
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()
|
|
||||||
|
|
||||||
# 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
|
||||||
if(ENABLE_APP AND NOT (ZLIB_FOUND AND OPENSSL_FOUND AND LIBEV_FOUND))
|
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.")
|
||||||
@@ -492,16 +448,11 @@ foreach(name
|
|||||||
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}")
|
||||||
|
|
||||||
@@ -515,12 +466,9 @@ 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)
|
||||||
@@ -551,10 +499,6 @@ 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}')
|
||||||
@@ -573,7 +517,6 @@ message(STATUS "summary of build options:
|
|||||||
Examples: ${ENABLE_EXAMPLES}
|
Examples: ${ENABLE_EXAMPLES}
|
||||||
Python bindings:${ENABLE_PYTHON_BINDINGS}
|
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 "
|
||||||
|
|||||||
@@ -17,15 +17,14 @@ option(ENABLE_LIB_ONLY "Build libnghttp2 only. This is a short hand for -DENAB
|
|||||||
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:
|
||||||
|
|||||||
12
Makefile.am
12
Makefile.am
@@ -20,7 +20,7 @@
|
|||||||
# 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 python 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
|
# Now with python setuptools, make uninstall will leave many files we
|
||||||
@@ -46,20 +46,16 @@ EXTRA_DIST = nghttpx.conf.sample proxy.pac.sample android-config android-make \
|
|||||||
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} src/includes/nghttp2/*.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}
|
||||||
|
|||||||
198
README.rst
198
README.rst
@@ -11,6 +11,40 @@ 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.
|
||||||
|
|
||||||
|
Running h2load against HTTP/3 server
|
||||||
|
------------------------------------
|
||||||
|
|
||||||
|
In order to build h2load with HTTP/3 support, you have to build
|
||||||
|
ngtcp2, nghttp3 and my patched OpenSSL.
|
||||||
|
https://github.com/ngtcp2/ngtcp2#build-from-git describes how to build
|
||||||
|
these three software.
|
||||||
|
|
||||||
|
To run h2load against HTTP/3 server, specify h3 ALPN with
|
||||||
|
``--npn-list`` option like so:
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
$ h2load --npn-list h3 https://127.0.0.1:4433
|
||||||
|
|
||||||
|
You can use Dockerfile to skip the tedious build steps to manually
|
||||||
|
pull and build dependencies. In order to build Docker image, do this:
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
$ cd docker
|
||||||
|
$ docker build -t nghttp2-quic .
|
||||||
|
|
||||||
|
Run h2load:
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
$ docker run --rm -it --network=host nghttp2-quic /usr/local/bin/h2load --npn-list h3 https://127.0.0.1:4433
|
||||||
|
|
||||||
Development Status
|
Development Status
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
@@ -27,14 +61,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``.
|
||||||
@@ -101,14 +133,12 @@ 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 (deprecated, has moved to
|
libnghttp2_asio C++ library requires the following packages:
|
||||||
https://github.com/nghttp2/nghttp2-asio) requires the following
|
|
||||||
packages:
|
|
||||||
|
|
||||||
* libboost-dev >= 1.54.0
|
* libboost-dev >= 1.54.0
|
||||||
* libboost-thread-dev >= 1.54.0
|
* libboost-thread-dev >= 1.54.0
|
||||||
|
|
||||||
The Python bindings (deprecated) require the following packages:
|
The Python bindings require the following packages:
|
||||||
|
|
||||||
* cython >= 0.19
|
* cython >= 0.19
|
||||||
* python >= 3.8
|
* python >= 3.8
|
||||||
@@ -144,33 +174,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_1q+quic>`_; or
|
|
||||||
`BoringSSL <https://boringssl.googlesource.com/boringssl/>`_ (commit
|
|
||||||
04989786e9ab16cef5261bbd05a2b1a8cb312dbf)
|
|
||||||
* `ngtcp2 <https://github.com/ngtcp2/ngtcp2>`_ >= 0.9.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.0>`_. 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
|
||||||
@@ -333,88 +336,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_1q+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.7.1 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.9.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.0 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 \
|
|
||||||
--disable-python-bindings \
|
|
||||||
CC=clang-12 CXX=clang++-12 \
|
|
||||||
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
|
||||||
----------
|
----------
|
||||||
|
|
||||||
@@ -842,7 +763,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.
|
||||||
|
|
||||||
@@ -863,16 +784,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
|
||||||
@@ -890,16 +811,16 @@ 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
|
||||||
is so called secure HTTP/2 proxy:
|
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
|
||||||
``nghttpx`` as secure proxy.
|
``nghttpx`` as secure proxy.
|
||||||
@@ -931,7 +852,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)
|
||||||
@@ -939,8 +860,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:
|
||||||
|
|
||||||
@@ -983,14 +904,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
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
@@ -1431,9 +1344,6 @@ corresponding header set was processed. The format is the same as
|
|||||||
libnghttp2_asio: High level HTTP/2 C++ library
|
libnghttp2_asio: High level HTTP/2 C++ library
|
||||||
----------------------------------------------
|
----------------------------------------------
|
||||||
|
|
||||||
libnghttp2_asio has been deprecated, and moved to
|
|
||||||
https://github.com/nghttp2/nghttp2-asio.
|
|
||||||
|
|
||||||
libnghttp2_asio is C++ library built on top of libnghttp2 and provides
|
libnghttp2_asio is C++ library built on top of libnghttp2 and provides
|
||||||
high level abstraction API to build HTTP/2 applications. It depends
|
high level abstraction API to build HTTP/2 applications. It depends
|
||||||
on the Boost::ASIO library and OpenSSL. Currently libnghttp2_asio
|
on the Boost::ASIO library and OpenSSL. Currently libnghttp2_asio
|
||||||
@@ -1531,8 +1441,6 @@ For more details, see the documentation of libnghttp2_asio.
|
|||||||
Python bindings
|
Python bindings
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
Python bindings have been deprecated.
|
|
||||||
|
|
||||||
The ``python`` directory contains nghttp2 Python bindings. The
|
The ``python`` directory contains nghttp2 Python bindings. The
|
||||||
bindings currently provide HPACK compressor and decompressor classes
|
bindings currently provide HPACK compressor and decompressor classes
|
||||||
and an HTTP/2 server.
|
and an HTTP/2 server.
|
||||||
|
|||||||
53
appveyor.yml
Normal file
53
appveyor.yml
Normal 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
|
||||||
@@ -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()
|
|
||||||
@@ -1,40 +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.
|
|
||||||
|
|
||||||
EXTRA_DIST = CMakeLists.txt reuseport_kern.c
|
|
||||||
|
|
||||||
if HAVE_LIBBPF
|
|
||||||
|
|
||||||
bpf_pkglibdir = $(pkglibdir)
|
|
||||||
bpf_pkglib_DATA = reuseport_kern.o
|
|
||||||
|
|
||||||
all: $(builddir)/reuseport_kern.o
|
|
||||||
|
|
||||||
$(builddir)/reuseport_kern.o: reuseport_kern.c
|
|
||||||
$(CC) @LIBBPF_CFLAGS@ @BPFCFLAGS@ @EXTRABPFCFLAGS@ \
|
|
||||||
-target bpf -c $< -o $@
|
|
||||||
|
|
||||||
clean-local:
|
|
||||||
-rm -f reuseport_kern.o
|
|
||||||
|
|
||||||
endif # HAVE_LIBBPF
|
|
||||||
@@ -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;
|
|
||||||
}
|
|
||||||
@@ -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)
|
|
||||||
@@ -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)
|
|
||||||
@@ -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)
|
|
||||||
@@ -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)
|
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
|
||||||
|
|||||||
253
configure.ac
253
configure.ac
@@ -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.50.0], [t-tujikawa@users.sourceforge.net])
|
AC_INIT([nghttp2], [1.45.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, 0)
|
AC_SUBST(LT_REVISION, 2)
|
||||||
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"`
|
||||||
@@ -107,11 +107,6 @@ AC_ARG_ENABLE([lib-only],
|
|||||||
[Build libnghttp2 only. This is a short hand for --disable-app --disable-examples --disable-hpack-tools --disable-python-bindings])],
|
[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]])],
|
||||||
@@ -177,21 +172,6 @@ AC_ARG_WITH([cython],
|
|||||||
[Use cython in given PATH])],
|
[Use cython in given PATH])],
|
||||||
[cython_path=$withval], [])
|
[cython_path=$withval], [])
|
||||||
|
|
||||||
AC_ARG_WITH([libngtcp2],
|
|
||||||
[AS_HELP_STRING([--with-libngtcp2],
|
|
||||||
[Use libngtcp2 [default=check]])],
|
|
||||||
[request_libngtcp2=$withval], [request_libngtcp2=check])
|
|
||||||
|
|
||||||
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([CYTHON], [the Cython executable])
|
AC_ARG_VAR([CYTHON], [the Cython executable])
|
||||||
|
|
||||||
@@ -205,8 +185,6 @@ AC_ARG_VAR([JEMALLOC_LIBS], [linker flags for jemalloc, skipping any checks])
|
|||||||
AC_ARG_VAR([LIBTOOL_LDFLAGS],
|
AC_ARG_VAR([LIBTOOL_LDFLAGS],
|
||||||
[libtool specific flags (e.g., -static-libtool-libs)])
|
[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
|
||||||
AC_PROG_CXX
|
AC_PROG_CXX
|
||||||
@@ -220,37 +198,15 @@ PKG_PROG_PKG_CONFIG([0.20])
|
|||||||
|
|
||||||
AM_PATH_PYTHON([3.8],, [:])
|
AM_PATH_PYTHON([3.8],, [:])
|
||||||
|
|
||||||
if test "x$request_python_bindings" = "xyes" &&
|
|
||||||
test "x$PYTHON" = "x:"; then
|
|
||||||
AC_MSG_ERROR([python was requested (enable-python-bindings) but not found])
|
|
||||||
fi
|
|
||||||
|
|
||||||
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_python_bindings=no
|
request_python_bindings=no
|
||||||
request_http3=no
|
|
||||||
request_libxml2=no
|
|
||||||
request_jansson=no
|
|
||||||
request_zlib=no
|
|
||||||
request_libevent_openssl=no
|
|
||||||
request_libcares=no
|
|
||||||
request_openssl=no
|
|
||||||
request_libev=no
|
|
||||||
request_jemalloc=no
|
|
||||||
request_systemd=no
|
|
||||||
request_mruby=no
|
|
||||||
request_neverbleed=no
|
|
||||||
request_libngtcp2=no
|
|
||||||
request_libnghttp3=no
|
|
||||||
request_libbpf=no
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "x$request_python_bindings" != "xno" &&
|
if [test "x$request_python_bindings" != "xno"]; then
|
||||||
test "x$PYTHON" != "x:"; then
|
AX_PYTHON_DEVEL([>= '3.8'])
|
||||||
# version check is broken
|
|
||||||
AX_PYTHON_DEVEL()
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "x${cython_path}" = "x"; then
|
if test "x${cython_path}" = "x"; then
|
||||||
@@ -289,7 +245,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`.])
|
||||||
@@ -364,7 +319,7 @@ 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 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++"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
@@ -379,13 +334,6 @@ 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
|
have_zlib=no
|
||||||
if test "x${request_zlib}" != "xno"; then
|
if test "x${request_zlib}" != "xno"; then
|
||||||
@@ -483,37 +431,6 @@ if test "x${request_openssl}" != "xno"; then
|
|||||||
[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
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -538,124 +455,28 @@ if test "x${request_libcares}" = "xyes" &&
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# ngtcp2 (for src)
|
# ngtcp2 (for src)
|
||||||
have_libngtcp2=no
|
PKG_CHECK_MODULES([LIBNGTCP2], [libngtcp2 >= 0.0.0], [have_libngtcp2=yes],
|
||||||
if test "x${request_libngtcp2}" != "xno"; then
|
[have_libngtcp2=no])
|
||||||
PKG_CHECK_MODULES([LIBNGTCP2], [libngtcp2 >= 0.9.0], [have_libngtcp2=yes],
|
if test "x${have_libngtcp2}" = "xno"; then
|
||||||
[have_libngtcp2=no])
|
AC_MSG_NOTICE($LIBNGTCP2_PKG_ERRORS)
|
||||||
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
|
fi
|
||||||
|
|
||||||
# ngtcp2_crypto_openssl (for src)
|
# ngtcp2_crypto_openssl (for src)
|
||||||
have_libngtcp2_crypto_openssl=no
|
PKG_CHECK_MODULES([LIBNGTCP2_CRYPTO_OPENSSL],
|
||||||
if test "x${have_ssl_is_quic}" = "xyes" &&
|
[libngtcp2_crypto_openssl >= 0.0.0],
|
||||||
test "x${request_libngtcp2}" != "xno"; then
|
[have_libngtcp2_crypto_openssl=yes],
|
||||||
PKG_CHECK_MODULES([LIBNGTCP2_CRYPTO_OPENSSL],
|
[have_libngtcp2_crypto_openssl=no])
|
||||||
[libngtcp2_crypto_openssl >= 0.9.0],
|
if test "x${have_libngtcp2_crypto_openssl}" = "xno"; then
|
||||||
[have_libngtcp2_crypto_openssl=yes],
|
AC_MSG_NOTICE($LIBNGTCP2_CRYPTO_OPENSSL_PKG_ERRORS)
|
||||||
[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
|
fi
|
||||||
|
|
||||||
# nghttp3 (for src)
|
# nghttp3 (for src)
|
||||||
have_libnghttp3=no
|
PKG_CHECK_MODULES([LIBNGHTTP3], [libnghttp3 >= 0.0.0], [have_libnghttp3=yes],
|
||||||
if test "x${request_libnghttp3}" != "xno"; then
|
[have_libnghttp3=no])
|
||||||
PKG_CHECK_MODULES([LIBNGHTTP3], [libnghttp3 >= 0.7.0], [have_libnghttp3=yes],
|
if test "x${have_libnghttp3}" = "xno"; then
|
||||||
[have_libnghttp3=no])
|
AC_MSG_NOTICE($LIBNGHTTP3_PKT_ERRORS)
|
||||||
if test "x${have_libnghttp3}" = "xno"; then
|
|
||||||
AC_MSG_NOTICE($LIBNGHTTP3_PKG_ERRORS)
|
|
||||||
fi
|
|
||||||
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
|
have_libevent_openssl=no
|
||||||
@@ -800,26 +621,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" &&
|
||||||
@@ -1161,7 +962,6 @@ AC_CONFIG_FILES([
|
|||||||
src/Makefile
|
src/Makefile
|
||||||
src/includes/Makefile
|
src/includes/Makefile
|
||||||
src/libnghttp2_asio.pc
|
src/libnghttp2_asio.pc
|
||||||
bpf/Makefile
|
|
||||||
examples/Makefile
|
examples/Makefile
|
||||||
python/Makefile
|
python/Makefile
|
||||||
python/setup.py
|
python/setup.py
|
||||||
@@ -1213,11 +1013,7 @@ 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}
|
||||||
@@ -1240,9 +1036,7 @@ AC_MSG_NOTICE([summary of build options:
|
|||||||
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: ${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_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}')
|
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} (CFLAGS='${JEMALLOC_CFLAGS}' LIBS='${JEMALLOC_LIBS}')
|
||||||
@@ -1264,5 +1058,4 @@ AC_MSG_NOTICE([summary of build options:
|
|||||||
Examples: ${enable_examples}
|
Examples: ${enable_examples}
|
||||||
Python bindings:${enable_python_bindings}
|
Python bindings:${enable_python_bindings}
|
||||||
Threading: ${enable_threads}
|
Threading: ${enable_threads}
|
||||||
HTTP/3 (EXPERIMENTAL): ${enable_http3}
|
|
||||||
])
|
])
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -184,9 +184,9 @@ set(EXTRA_DIST
|
|||||||
sources/python-apiref.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
|
||||||
|
|||||||
@@ -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 \
|
||||||
@@ -211,9 +204,9 @@ EXTRA_DIST = \
|
|||||||
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 \
|
||||||
@@ -277,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
|
||||||
|
|
||||||
|
|||||||
@@ -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:
|
||||||
41
doc/_themes/sphinx_rtd_theme/__init__.py
vendored
41
doc/_themes/sphinx_rtd_theme/__init__.py
vendored
@@ -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")
|
# Register the theme that can be referenced without adding a theme path
|
||||||
app.require_sphinx('1.6')
|
app.add_html_theme('sphinx_rtd_theme', path.abspath(path.dirname(__file__)))
|
||||||
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
|
if sphinx.version_info >= (1, 8, 0):
|
||||||
app.add_html_theme('sphinx_rtd_theme', path.abspath(path.dirname(__file__)))
|
|
||||||
|
|
||||||
if sphinx_version >= (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}
|
||||||
|
|||||||
115
doc/_themes/sphinx_rtd_theme/breadcrumbs.html
vendored
115
doc/_themes/sphinx_rtd_theme/breadcrumbs.html
vendored
@@ -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> »</li>
|
<li><a href="{{ pathto(master_doc) }}" class="icon icon-home"></a> »</li>
|
||||||
{%- for doc in parents %}
|
{% for doc in parents %}
|
||||||
<li><a href="{{ doc.link|e }}">{{ doc.title }}</a> »</li>
|
<li><a href="{{ doc.link|e }}">{{ doc.title }}</a> »</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>
|
||||||
|
|||||||
57
doc/_themes/sphinx_rtd_theme/footer.html
vendored
57
doc/_themes/sphinx_rtd_theme/footer.html
vendored
@@ -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 %}© <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %}
|
{% set path = pathto('copyright') %}
|
||||||
|
{% set copyright = copyright|e %}
|
||||||
|
© <a href="{{ path }}">{% trans %}Copyright{% endtrans %}</a> {{ copyright }}
|
||||||
{%- else %}
|
{%- else %}
|
||||||
{%- trans copyright=copyright|e %}© Copyright {{ copyright }}.{% endtrans %}
|
{% set copyright = copyright|e %}
|
||||||
|
© {% 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>
|
||||||
|
|
||||||
|
|||||||
206
doc/_themes/sphinx_rtd_theme/layout.html
vendored
206
doc/_themes/sphinx_rtd_theme/layout.html
vendored
@@ -7,74 +7,56 @@
|
|||||||
{%- 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 %} />
|
||||||
{%- else %}
|
{%- else %}
|
||||||
<link rel="stylesheet" href="{{ pathto(css, 1) }}" type="text/css" />
|
<link rel="stylesheet" href="{{ pathto(css, 1) }}" type="text/css" />
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
{%- endfor %}
|
{%- endfor %}
|
||||||
|
|
||||||
{%- 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
|
||||||
collapse=theme_collapse_navigation|tobool,
|
toctree is empty. Skip building this for now.
|
||||||
includehidden=theme_includehidden|tobool,
|
#}
|
||||||
titles_only=theme_titles_only|tobool) %}
|
{% if 'singlehtml' not in builder %}
|
||||||
{%- if toctree %}
|
{% set global_toc = toctree(maxdepth=theme_navigation_depth|int,
|
||||||
{{ toctree }}
|
collapse=theme_collapse_navigation|tobool,
|
||||||
{%- else %}
|
includehidden=theme_includehidden|tobool,
|
||||||
|
titles_only=theme_titles_only|tobool) %}
|
||||||
|
{% endif %}
|
||||||
|
{% if global_toc %}
|
||||||
|
{{ 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 %}
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@@ -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"
|
||||||
|
|||||||
Binary file not shown.
@@ -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 "© <a href=\"%(path)s\">Copyright</a> %(copyright)s."
|
msgid "Copyright"
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: sphinx_rtd_theme/footer.html:23
|
|
||||||
#, python-format
|
|
||||||
msgid "© 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 ""
|
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@@ -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 "© <a href=\"%(path)s\">Copyright</a> %(copyright)s."
|
msgid "Copyright"
|
||||||
msgstr "© <a href=\"%(path)s\">Derechos de autor</a> %(copyright)s."
|
msgstr "Derechos de autor"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/footer.html:23
|
|
||||||
#, python-format
|
|
||||||
msgid "© Copyright %(copyright)s."
|
|
||||||
msgstr "© 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"
|
||||||
|
|||||||
Binary file not shown.
@@ -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 "© <a href=\"%(path)s\">Copyright</a> %(copyright)s."
|
msgid "Copyright"
|
||||||
msgstr "© <a href=\"%(path)s\">Autoriõigus</a> %(copyright)s."
|
msgstr "Autoriõigus"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/footer.html:23
|
|
||||||
#, python-format
|
|
||||||
msgid "© Copyright %(copyright)s."
|
|
||||||
msgstr "© 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"
|
||||||
|
|||||||
Binary file not shown.
@@ -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 "© <a href=\"%(path)s\">Copyright</a> %(copyright)s."
|
|
||||||
msgstr "© <a href=\"%(path)s\">حق انتشار</a> %(copyright)s."
|
|
||||||
|
|
||||||
#: sphinx_rtd_theme/footer.html:23
|
|
||||||
#, python-format
|
|
||||||
msgid "© Copyright %(copyright)s."
|
|
||||||
msgstr "© حق انتشار%(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 "ساختها"
|
|
||||||
Binary file not shown.
@@ -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 "© <a href=\"%(path)s\">Copyright</a> %(copyright)s."
|
msgid "Copyright"
|
||||||
msgstr "© <a href=\"%(path)s\">Droits d'auteur</a> %(copyright)s."
|
msgstr "Droits d'auteur"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/footer.html:23
|
|
||||||
#, python-format
|
|
||||||
msgid "© Copyright %(copyright)s."
|
|
||||||
msgstr "© 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"
|
||||||
|
|||||||
Binary file not shown.
@@ -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 "© <a href=\"%(path)s\">Copyright</a> %(copyright)s."
|
|
||||||
msgstr "© <a href=\"%(path)s\">Copyright</a> %(copyright)s."
|
|
||||||
|
|
||||||
#: sphinx_rtd_theme/footer.html:23
|
|
||||||
#, python-format
|
|
||||||
msgid "© Copyright %(copyright)s."
|
|
||||||
msgstr "© 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."
|
|
||||||
Binary file not shown.
@@ -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 "© <a href=\"%(path)s\">Copyright</a> %(copyright)s."
|
|
||||||
msgstr "© <a href=\"%(path)s\">Copyright</a> %(copyright)s."
|
|
||||||
|
|
||||||
#: sphinx_rtd_theme/footer.html:23
|
|
||||||
#, python-format
|
|
||||||
msgid "© Copyright %(copyright)s."
|
|
||||||
msgstr "© 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"
|
|
||||||
Binary file not shown.
@@ -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 "© <a href=\"%(path)s\">Copyright</a> %(copyright)s."
|
msgid "Copyright"
|
||||||
msgstr "© <a href=\"%(path)s\">Copyright</a> %(copyright)s."
|
msgstr "Copyright"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/footer.html:23
|
|
||||||
#, python-format
|
|
||||||
msgid "© Copyright %(copyright)s."
|
|
||||||
msgstr "© 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"
|
||||||
|
|||||||
Binary file not shown.
@@ -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 "© <a href=\"%(path)s\">Copyright</a> %(copyright)s."
|
|
||||||
msgstr "© <a href=\"%(path)s\">Prawa zastrzeżone</a> %(copyright)s."
|
|
||||||
|
|
||||||
#: sphinx_rtd_theme/footer.html:23
|
|
||||||
#, python-format
|
|
||||||
msgid "© Copyright %(copyright)s."
|
|
||||||
msgstr "© 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"
|
|
||||||
Binary file not shown.
@@ -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"
|
|
||||||
Binary file not shown.
@@ -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 "© <a href=\"%(path)s\">Copyright</a> %(copyright)s."
|
msgid "Copyright"
|
||||||
msgstr "© <a href=\"%(path)s\">Direitos autorais</a> %(copyright)s."
|
msgstr "Copyright"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/footer.html:23
|
|
||||||
#, python-format
|
|
||||||
msgid "© Copyright %(copyright)s."
|
|
||||||
msgstr "© 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"
|
||||||
|
|||||||
Binary file not shown.
@@ -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 "© <a href=\"%(path)s\">Copyright</a> %(copyright)s."
|
msgid "Copyright"
|
||||||
msgstr "© <a href=\"%(path)s\">Авторские права</a> %(copyright)s. "
|
msgstr "Авторские права"
|
||||||
|
|
||||||
#: sphinx_rtd_theme/footer.html:23
|
|
||||||
#, python-format
|
|
||||||
msgid "© Copyright %(copyright)s."
|
|
||||||
msgstr "© Авторские права %(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 "Бесплатный хостинг документов, предоставленный"
|
||||||
|
|||||||
95
doc/_themes/sphinx_rtd_theme/locale/sphinx.pot
vendored
95
doc/_themes/sphinx_rtd_theme/locale/sphinx.pot
vendored
@@ -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 "© <a href=\"%(path)s\">Copyright</a> %(copyright)s."
|
msgid "Copyright"
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: sphinx_rtd_theme/footer.html:23
|
|
||||||
#, python-format
|
|
||||||
msgid "© 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 ""
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@@ -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"
|
||||||
|
|||||||
Binary file not shown.
@@ -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"
|
||||||
|
|||||||
Binary file not shown.
@@ -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 "此文档免费托管于"
|
||||||
|
|||||||
9
doc/_themes/sphinx_rtd_theme/search.html
vendored
9
doc/_themes/sphinx_rtd_theme/search.html
vendored
@@ -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 %}
|
||||||
|
|||||||
2
doc/_themes/sphinx_rtd_theme/searchbox.html
vendored
2
doc/_themes/sphinx_rtd_theme/searchbox.html
vendored
@@ -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
4
doc/_themes/sphinx_rtd_theme/theme.conf
vendored
4
doc/_themes/sphinx_rtd_theme/theme.conf
vendored
@@ -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
|
||||||
@@ -16,5 +15,4 @@ logo_only =
|
|||||||
display_version = True
|
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 =
|
|
||||||
2
doc/_themes/sphinx_rtd_theme/versions.html
vendored
2
doc/_themes/sphinx_rtd_theme/versions.html
vendored
@@ -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 }}
|
||||||
|
|||||||
@@ -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 --rps --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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 --tls-session-cache-memcached-cert-file --no-via --mruby-file --no-server-push --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 --frontend-http2-window-size --tls-ticket-key-memcached-max-retry --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 --no-http2-cipher-block-list --tls-session-cache-memcached --no-ocsp --backend-response-buffer --tls-min-proto-version --workers --add-x-forwarded-for --add-forwarded --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 --client-no-http2-cipher-block-list --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
|
||||||
|
|||||||
@@ -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']
|
||||||
|
|||||||
60
doc/h2load.1
60
doc/h2load.1
@@ -1,5 +1,8 @@
|
|||||||
.\" Man page generated from reStructuredText.
|
.\" Man page generated from reStructuredText.
|
||||||
.
|
.
|
||||||
|
.TH "H2LOAD" "1" "Jul 18, 2021" "1.45.0-DEV" "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" "Sep 21, 2022" "1.50.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
|
||||||
@@ -302,15 +285,6 @@ 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>.
|
||||||
@@ -323,28 +297,6 @@ Specify request per second for each client. \fI\%\-\-rps\fP and
|
|||||||
.UNINDENT
|
.UNINDENT
|
||||||
.INDENT 0.0
|
.INDENT 0.0
|
||||||
.TP
|
.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
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
@@ -255,14 +240,6 @@ 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
|
||||||
@@ -273,24 +250,6 @@ OPTIONS
|
|||||||
Specify request per second for each client. :option:`--rps` and
|
Specify request per second for each client. :option:`--rps` and
|
||||||
:option:`--timing-script-file` are mutually exclusive.
|
: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.
|
||||||
|
|||||||
16
doc/nghttp.1
16
doc/nghttp.1
@@ -1,5 +1,8 @@
|
|||||||
.\" Man page generated from reStructuredText.
|
.\" Man page generated from reStructuredText.
|
||||||
.
|
.
|
||||||
|
.TH "NGHTTP" "1" "Jul 18, 2021" "1.45.0-DEV" "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" "Sep 21, 2022" "1.50.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
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
.\" Man page generated from reStructuredText.
|
.\" Man page generated from reStructuredText.
|
||||||
.
|
.
|
||||||
|
.TH "NGHTTPD" "1" "Jul 18, 2021" "1.45.0-DEV" "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" "Sep 21, 2022" "1.50.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
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
301
doc/nghttpx.1
301
doc/nghttpx.1
@@ -1,5 +1,8 @@
|
|||||||
.\" Man page generated from reStructuredText.
|
.\" Man page generated from reStructuredText.
|
||||||
.
|
.
|
||||||
|
.TH "NGHTTPX" "1" "Jul 18, 2021" "1.45.0-DEV" "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" "Sep 21, 2022" "1.50.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
|
||||||
@@ -209,18 +208,7 @@ the Secure attribute is determined by a request scheme.
|
|||||||
If a request scheme is "https", then Secure attribute is
|
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,13 +276,6 @@ 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. In order to include ":"
|
||||||
in <PATTERN>, one has to specify "%3A" (which is
|
in <PATTERN>, one has to specify "%3A" (which is
|
||||||
@@ -342,12 +323,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 +489,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 +528,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 +642,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 +652,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 +662,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 +672,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
|
||||||
@@ -1109,13 +1068,12 @@ option. But be aware its implications.
|
|||||||
.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 +1083,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
|
||||||
@@ -1526,21 +1478,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 +1575,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
|
||||||
@@ -1741,33 +1675,6 @@ process. nghttpx still spawns additional process if
|
|||||||
neverbleed is used. In the single process mode, the
|
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 +1688,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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -193,18 +192,7 @@ Connections
|
|||||||
If a request scheme is "https", then Secure attribute is
|
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".
|
|
||||||
|
|
||||||
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,13 +260,6 @@ 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. In order to include ":"
|
||||||
in <PATTERN>, one has to specify "%3A" (which is
|
in <PATTERN>, one has to specify "%3A" (which is
|
||||||
@@ -326,12 +307,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 +458,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 +495,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 +600,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 +609,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 +618,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 +627,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>
|
||||||
|
|
||||||
@@ -1022,13 +983,12 @@ SSL/TLS
|
|||||||
|
|
||||||
.. 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 +997,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
|
||||||
~~~~~~
|
~~~~~~
|
||||||
@@ -1383,21 +1338,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 +1426,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
|
||||||
~~~
|
~~~
|
||||||
@@ -1587,31 +1526,6 @@ Process
|
|||||||
neverbleed is used. In the single process mode, the
|
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 +1541,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
|
||||||
~~~~
|
~~~~
|
||||||
|
|
||||||
|
|||||||
@@ -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.
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ 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-12.
|
||||||
|
|
||||||
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.
|
||||||
@@ -34,13 +34,13 @@ 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-14 in debian), either add it to PATH variable or add
|
clang-format-diff-12 in debian), either add it to PATH variable or add
|
||||||
git option ``clangformatdiff.binary`` to point to the script.
|
git option ``clangformatdiff.binary`` to point to the script.
|
||||||
|
|
||||||
For emacs users, integrating clang-format to emacs is very easy.
|
For emacs users, integrating clang-format to emacs is very easy.
|
||||||
clang-format.el should come with clang distribution. If it is not
|
clang-format.el should come with clang distribution. If it is not
|
||||||
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
|
||||||
|
|||||||
@@ -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`.
|
|
||||||
|
|||||||
@@ -1,12 +1,6 @@
|
|||||||
libnghttp2_asio: High level HTTP/2 C++ library
|
libnghttp2_asio: High level HTTP/2 C++ library
|
||||||
==============================================
|
==============================================
|
||||||
|
|
||||||
.. warning::
|
|
||||||
|
|
||||||
libnghttp2_asio has been deprecated in this repository due to
|
|
||||||
maintenance issue and will be removed at the end of 2022. It has
|
|
||||||
moved to https://github.com/nghttp2/nghttp2-asio.
|
|
||||||
|
|
||||||
libnghttp2_asio is C++ library built on top of libnghttp2 and provides
|
libnghttp2_asio is C++ library built on top of libnghttp2 and provides
|
||||||
high level abstraction API to build HTTP/2 applications. It depends
|
high level abstraction API to build HTTP/2 applications. It depends
|
||||||
on Boost::ASIO library and OpenSSL. Currently libnghttp2_asio
|
on Boost::ASIO library and OpenSSL. Currently libnghttp2_asio
|
||||||
|
|||||||
@@ -14,8 +14,8 @@ Default mode
|
|||||||
|
|
||||||
If nghttpx is invoked without :option:`--http2-proxy`, it operates in
|
If nghttpx is invoked without :option:`--http2-proxy`, it operates in
|
||||||
default mode. In this mode, it works as reverse proxy (gateway) for
|
default mode. In this mode, it works as reverse proxy (gateway) for
|
||||||
HTTP/3, HTTP/2 and HTTP/1 clients to backend servers. This is also
|
both HTTP/2 and HTTP/1 clients to backend servers. This is also known
|
||||||
known as "HTTP/2 router".
|
as "HTTP/2 router".
|
||||||
|
|
||||||
By default, frontend connection is encrypted using SSL/TLS. So
|
By default, frontend connection is encrypted using SSL/TLS. So
|
||||||
server's private key and certificate must be supplied to the command
|
server's private key and certificate must be supplied to the command
|
||||||
@@ -28,9 +28,6 @@ the frontend, and an HTTP/1 connection can be upgraded to HTTP/2 using
|
|||||||
HTTP Upgrade. Starting HTTP/2 connection by sending HTTP/2 connection
|
HTTP Upgrade. Starting HTTP/2 connection by sending HTTP/2 connection
|
||||||
preface is also supported.
|
preface is also supported.
|
||||||
|
|
||||||
In order to receive HTTP/3 traffic, use ``quic`` parameter in
|
|
||||||
:option:`--frontend` option (.e.g, ``--frontend='*,443;quic'``)
|
|
||||||
|
|
||||||
nghttpx can listen on multiple frontend addresses. This is achieved
|
nghttpx can listen on multiple frontend addresses. This is achieved
|
||||||
by using multiple :option:`--frontend` options. For each frontend
|
by using multiple :option:`--frontend` options. For each frontend
|
||||||
address, TLS can be enabled or disabled.
|
address, TLS can be enabled or disabled.
|
||||||
@@ -427,11 +424,7 @@ parameter. Optionally, a Path attribute can be specified in
|
|||||||
backend=127.0.0.1,3000;;affinity=cookie;affinity-cookie-name=nghttpxlb;affinity-cookie-path=/
|
backend=127.0.0.1,3000;;affinity=cookie;affinity-cookie-name=nghttpxlb;affinity-cookie-path=/
|
||||||
|
|
||||||
Secure attribute of cookie is set if client connection is protected by
|
Secure attribute of cookie is set if client connection is protected by
|
||||||
TLS. ``affinity-cookie-stickiness`` specifies the stickiness of this
|
TLS.
|
||||||
affinity. If ``loose`` is given, which is the default, removing or
|
|
||||||
adding a backend server might break affinity. While ``strict`` is
|
|
||||||
given, removing the designated backend server breaks affinity, but
|
|
||||||
adding new backend server does not cause breakage.
|
|
||||||
|
|
||||||
PSK cipher suites
|
PSK cipher suites
|
||||||
-----------------
|
-----------------
|
||||||
@@ -516,60 +509,6 @@ Bootstrapping WebSockets with HTTP/2 for both frontend and backend
|
|||||||
connections. This feature is enabled by default and no configuration
|
connections. This feature is enabled by default and no configuration
|
||||||
is required.
|
is required.
|
||||||
|
|
||||||
WebSockets over HTTP/3 is also supported.
|
|
||||||
|
|
||||||
HTTP/3
|
|
||||||
------
|
|
||||||
|
|
||||||
nghttpx supports HTTP/3 if it is built with HTTP/3 support enabled.
|
|
||||||
HTTP/3 support is experimental.
|
|
||||||
|
|
||||||
In order to listen UDP port to receive HTTP/3 traffic,
|
|
||||||
:option:`--frontend` option must have ``quic`` parameter:
|
|
||||||
|
|
||||||
.. code-block:: text
|
|
||||||
|
|
||||||
frontend=*,443;quic
|
|
||||||
|
|
||||||
The above example makes nghttpx receive HTTP/3 traffic on UDP
|
|
||||||
port 443.
|
|
||||||
|
|
||||||
nghttpx does not support HTTP/3 on backend connection.
|
|
||||||
|
|
||||||
Hot swapping (SIGUSR2) or configuration reload (SIGHUP) require eBPF
|
|
||||||
program. Without eBPF, old worker processes keep getting HTTP/3
|
|
||||||
traffic and do not work as intended. The QUIC keying material to
|
|
||||||
encrypt Connection ID must be set with
|
|
||||||
:option:`--frontend-quic-secret-file` and must provide the existing
|
|
||||||
keys in order to keep the existing connections alive during reload.
|
|
||||||
|
|
||||||
The construction of Connection ID closely follows Block Cipher CID
|
|
||||||
Algorithm described in `QUIC-LB draft
|
|
||||||
<https://datatracker.ietf.org/doc/html/draft-ietf-quic-load-balancers>`_.
|
|
||||||
A Connection ID that nghttpx generates is always 20 bytes long. It
|
|
||||||
uses first 2 bits as a configuration ID. The remaining bits in the
|
|
||||||
first byte are reserved and random. The next 4 bytes are server ID.
|
|
||||||
The next 4 bytes are used to route UDP datagram to a correct
|
|
||||||
``SO_REUSEPORT`` socket. The remaining bytes are randomly generated.
|
|
||||||
The server ID and the next 12 bytes are encrypted with AES-ECB. The
|
|
||||||
key is derived from the keying materials stored in a file specified by
|
|
||||||
:option:`--frontend-quic-secret-file`. The first 2 bits of keying
|
|
||||||
material in the file is used as a configuration ID. The remaining
|
|
||||||
bits and following 3 bytes are reserved and unused. The next 32 bytes
|
|
||||||
are used as an initial secret. The remaining 32 bytes are used as a
|
|
||||||
salt. The encryption key is generated by `HKDF
|
|
||||||
<https://datatracker.ietf.org/doc/html/rfc5869>`_ with SHA256 and
|
|
||||||
these keying materials and ``connection id encryption key`` as info.
|
|
||||||
|
|
||||||
In order announce that HTTP/3 endpoint is available, you should
|
|
||||||
specify alt-svc header field. For example, the following options send
|
|
||||||
alt-svc header field in HTTP/1.1 and HTTP/2 response:
|
|
||||||
|
|
||||||
.. code-block:: text
|
|
||||||
|
|
||||||
altsvc=h3,443,,,ma=3600
|
|
||||||
http2-altsvc=h3,443,,,ma=3600
|
|
||||||
|
|
||||||
Migration from nghttpx v1.18.x or earlier
|
Migration from nghttpx v1.18.x or earlier
|
||||||
-----------------------------------------
|
-----------------------------------------
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,6 @@
|
|||||||
Python API Reference
|
Python API Reference
|
||||||
====================
|
====================
|
||||||
|
|
||||||
.. warning::
|
|
||||||
|
|
||||||
Python bindings have been deprecated due to maintenance issue. It
|
|
||||||
will not get any updates. It will be removed at the end of 2022.
|
|
||||||
|
|
||||||
.. py:module:: nghttp2
|
.. py:module:: nghttp2
|
||||||
|
|
||||||
nghttp2 offers some high level Python API to C library. The bindings
|
nghttp2 offers some high level Python API to C library. The bindings
|
||||||
|
|||||||
@@ -1,78 +1,36 @@
|
|||||||
FROM debian:11 as build
|
FROM debian:10 as build
|
||||||
|
|
||||||
RUN apt-get update && \
|
RUN apt-get update && \
|
||||||
apt-get install -y --no-install-recommends \
|
apt-get install -y --no-install-recommends \
|
||||||
git clang make binutils autoconf automake autotools-dev libtool \
|
git g++ make binutils autoconf automake autotools-dev libtool \
|
||||||
pkg-config \
|
pkg-config \
|
||||||
zlib1g-dev libev-dev libjemalloc-dev ruby-dev libc-ares-dev bison \
|
zlib1g-dev libev-dev libjemalloc-dev ruby-dev libc-ares-dev bison && \
|
||||||
libelf-dev
|
git clone --depth 1 -b OpenSSL_1_1_1g-quic-draft-33 https://github.com/tatsuhiro-t/openssl && \
|
||||||
|
cd openssl && ./config enable-tls1_3 --openssldir=/etc/ssl && make -j$(nproc) && make install_sw && cd .. && rm -rf openssl && \
|
||||||
RUN git clone --depth 1 -b OpenSSL_1_1_1q+quic https://github.com/quictls/openssl && \
|
git clone --depth 1 https://github.com/ngtcp2/nghttp3 && \
|
||||||
cd openssl && \
|
cd nghttp3 && autoreconf -i && \
|
||||||
./config --openssldir=/etc/ssl && \
|
|
||||||
make -j$(nproc) && \
|
|
||||||
make install_sw && \
|
|
||||||
cd .. && \
|
|
||||||
rm -rf openssl
|
|
||||||
|
|
||||||
RUN git clone --depth 1 -b v0.7.1 https://github.com/ngtcp2/nghttp3 && \
|
|
||||||
cd nghttp3 && \
|
|
||||||
autoreconf -i && \
|
|
||||||
./configure --enable-lib-only && \
|
./configure --enable-lib-only && \
|
||||||
make -j$(nproc) && \
|
make -j$(nproc) && make install-strip && cd .. && rm -rf nghttp3 && \
|
||||||
make install-strip && \
|
git clone --depth 1 https://github.com/ngtcp2/ngtcp2 && \
|
||||||
cd .. && \
|
cd ngtcp2 && autoreconf -i && \
|
||||||
rm -rf nghttp3
|
./configure && \
|
||||||
|
make -j$(nproc) && make install-strip && cd .. && rm -rf ngtcp2 && \
|
||||||
RUN git clone --depth 1 -b v0.9.0 https://github.com/ngtcp2/ngtcp2 && \
|
git clone --depth 1 -b quic https://github.com/nghttp2/nghttp2.git && \
|
||||||
cd ngtcp2 && \
|
|
||||||
autoreconf -i && \
|
|
||||||
./configure --enable-lib-only \
|
|
||||||
LIBTOOL_LDFLAGS="-static-libtool-libs" \
|
|
||||||
OPENSSL_LIBS="-l:libssl.a -l:libcrypto.a -ldl -lpthread" \
|
|
||||||
PKG_CONFIG_PATH="/usr/local/lib64/pkgconfig" && \
|
|
||||||
make -j$(nproc) && \
|
|
||||||
make install-strip && \
|
|
||||||
cd .. && \
|
|
||||||
rm -rf ngtcp2
|
|
||||||
|
|
||||||
RUN git clone --depth 1 -b v1.0.0 https://github.com/libbpf/libbpf && \
|
|
||||||
cd libbpf && \
|
|
||||||
PREFIX=/usr/local make -C src install && \
|
|
||||||
cd .. && \
|
|
||||||
rm -rf libbpf
|
|
||||||
|
|
||||||
RUN git clone --depth 1 https://github.com/nghttp2/nghttp2.git && \
|
|
||||||
cd nghttp2 && \
|
cd nghttp2 && \
|
||||||
git submodule update --init && \
|
git submodule update --init && autoreconf -i && \
|
||||||
autoreconf -i && \
|
|
||||||
./configure --disable-examples --disable-hpack-tools \
|
./configure --disable-examples --disable-hpack-tools \
|
||||||
--disable-python-bindings --with-mruby --with-neverbleed \
|
--disable-python-bindings --with-mruby --with-neverbleed \
|
||||||
--enable-http3 --with-libbpf \
|
|
||||||
CC=clang CXX=clang++ \
|
|
||||||
LIBTOOL_LDFLAGS="-static-libtool-libs" \
|
LIBTOOL_LDFLAGS="-static-libtool-libs" \
|
||||||
OPENSSL_LIBS="-l:libssl.a -l:libcrypto.a -ldl -pthread" \
|
LIBS="-ldl -pthread" \
|
||||||
|
OPENSSL_LIBS="-l:libssl.a -l:libcrypto.a" \
|
||||||
LIBEV_LIBS="-l:libev.a" \
|
LIBEV_LIBS="-l:libev.a" \
|
||||||
JEMALLOC_LIBS="-l:libjemalloc.a" \
|
JEMALLOC_LIBS="-l:libjemalloc.a" \
|
||||||
LIBCARES_LIBS="-l:libcares.a" \
|
LIBCARES_LIBS="-l:libcares.a" \
|
||||||
ZLIB_LIBS="-l:libz.a" \
|
ZLIB_LIBS="-l:libz.a" && \
|
||||||
LIBBPF_LIBS="-L/usr/local/lib64 -l:libbpf.a -l:libelf.a" \
|
make -j$(nproc) install-strip
|
||||||
LDFLAGS="-static-libgcc -static-libstdc++" \
|
|
||||||
PKG_CONFIG_PATH="/usr/local/lib64/pkgconfig" && \
|
|
||||||
make -j$(nproc) install-strip && \
|
|
||||||
cd .. && \
|
|
||||||
rm -rf nghttp2
|
|
||||||
|
|
||||||
FROM gcr.io/distroless/base-debian11
|
FROM gcr.io/distroless/cc-debian10
|
||||||
|
|
||||||
COPY --from=build \
|
COPY --from=build /usr/local/bin/h2load /usr/local/bin/
|
||||||
/usr/local/share/nghttp2/ \
|
|
||||||
/usr/local/share/nghttp2/
|
ENTRYPOINT ["/usr/local/bin/h2load"]
|
||||||
COPY --from=build \
|
|
||||||
/usr/local/bin/h2load \
|
|
||||||
/usr/local/bin/nghttpx \
|
|
||||||
/usr/local/bin/nghttp \
|
|
||||||
/usr/local/bin/nghttpd \
|
|
||||||
/usr/local/bin/
|
|
||||||
COPY --from=build /usr/local/lib/nghttp2/reuseport_kern.o \
|
|
||||||
/usr/local/lib/nghttp2/
|
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
Dockerfile
|
|
||||||
==========
|
|
||||||
|
|
||||||
Dockerfile creates the applications bundled with nghttp2.
|
|
||||||
These applications are:
|
|
||||||
|
|
||||||
- nghttp
|
|
||||||
- nghttpd
|
|
||||||
- nghttpx
|
|
||||||
- h2load
|
|
||||||
|
|
||||||
HTTP/3 and eBPF features are enabled.
|
|
||||||
|
|
||||||
In order to run nghttpx with HTTP/3 endpoint, you need to run the
|
|
||||||
image with the escalated privilege. Here is the example command-line
|
|
||||||
to run nghttpx to listen to HTTP/3 on port 443, assuming that the
|
|
||||||
current directory contains a private key and a certificate in
|
|
||||||
server.key and server.crt respectively:
|
|
||||||
|
|
||||||
.. code-block:: text
|
|
||||||
|
|
||||||
$ docker run --rm -it -v /path/to/certs:/shared --net=host --privileged \
|
|
||||||
nghttp2 nghttpx \
|
|
||||||
/shared/server.key /shared/server.crt \
|
|
||||||
-f'*,443;quic'
|
|
||||||
@@ -380,10 +380,6 @@ static void init_ssl_ctx(SSL_CTX *ssl_ctx) {
|
|||||||
#ifndef OPENSSL_NO_NEXTPROTONEG
|
#ifndef OPENSSL_NO_NEXTPROTONEG
|
||||||
SSL_CTX_set_next_proto_select_cb(ssl_ctx, select_next_proto_cb, NULL);
|
SSL_CTX_set_next_proto_select_cb(ssl_ctx, select_next_proto_cb, NULL);
|
||||||
#endif /* !OPENSSL_NO_NEXTPROTONEG */
|
#endif /* !OPENSSL_NO_NEXTPROTONEG */
|
||||||
|
|
||||||
#if OPENSSL_VERSION_NUMBER >= 0x10002000L
|
|
||||||
SSL_CTX_set_alpn_protos(ssl_ctx, (const unsigned char *)"\x02h2", 3);
|
|
||||||
#endif /* OPENSSL_VERSION_NUMBER >= 0x10002000L */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ssl_handshake(SSL *ssl, int fd) {
|
static void ssl_handshake(SSL *ssl, int fd) {
|
||||||
@@ -548,7 +544,7 @@ static void fetch_uri(const struct URI *uri) {
|
|||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
die("Could not open file descriptor");
|
die("Could not open file descriptor");
|
||||||
}
|
}
|
||||||
ssl_ctx = SSL_CTX_new(TLS_client_method());
|
ssl_ctx = SSL_CTX_new(SSLv23_client_method());
|
||||||
if (ssl_ctx == NULL) {
|
if (ssl_ctx == NULL) {
|
||||||
dief("SSL_CTX_new", ERR_error_string(ERR_get_error(), NULL));
|
dief("SSL_CTX_new", ERR_error_string(ERR_get_error(), NULL));
|
||||||
}
|
}
|
||||||
@@ -719,18 +715,8 @@ int main(int argc, char **argv) {
|
|||||||
act.sa_handler = SIG_IGN;
|
act.sa_handler = SIG_IGN;
|
||||||
sigaction(SIGPIPE, &act, 0);
|
sigaction(SIGPIPE, &act, 0);
|
||||||
|
|
||||||
#if OPENSSL_VERSION_NUMBER >= 0x1010000fL
|
|
||||||
/* No explicit initialization is required. */
|
|
||||||
#elif defined(OPENSSL_IS_BORINGSSL)
|
|
||||||
CRYPTO_library_init();
|
|
||||||
#else /* !(OPENSSL_VERSION_NUMBER >= 0x1010000fL) && \
|
|
||||||
!defined(OPENSSL_IS_BORINGSSL) */
|
|
||||||
OPENSSL_config(NULL);
|
|
||||||
SSL_load_error_strings();
|
SSL_load_error_strings();
|
||||||
SSL_library_init();
|
SSL_library_init();
|
||||||
OpenSSL_add_all_algorithms();
|
|
||||||
#endif /* !(OPENSSL_VERSION_NUMBER >= 0x1010000fL) && \
|
|
||||||
!defined(OPENSSL_IS_BORINGSSL) */
|
|
||||||
|
|
||||||
rv = parse_uri(&uri, argv[1]);
|
rv = parse_uri(&uri, argv[1]);
|
||||||
if (rv != 0) {
|
if (rv != 0) {
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ static void deflate(nghttp2_hd_deflater *deflater,
|
|||||||
static int inflate_header_block(nghttp2_hd_inflater *inflater, uint8_t *in,
|
static int inflate_header_block(nghttp2_hd_inflater *inflater, uint8_t *in,
|
||||||
size_t inlen, int final);
|
size_t inlen, int final);
|
||||||
|
|
||||||
int main(void) {
|
int main() {
|
||||||
int rv;
|
int rv;
|
||||||
nghttp2_hd_deflater *deflater;
|
nghttp2_hd_deflater *deflater;
|
||||||
nghttp2_hd_inflater *inflater;
|
nghttp2_hd_inflater *inflater;
|
||||||
|
|||||||
@@ -328,7 +328,7 @@ static int select_next_proto_cb(SSL *ssl, unsigned char **out,
|
|||||||
/* Create SSL_CTX. */
|
/* Create SSL_CTX. */
|
||||||
static SSL_CTX *create_ssl_ctx(void) {
|
static SSL_CTX *create_ssl_ctx(void) {
|
||||||
SSL_CTX *ssl_ctx;
|
SSL_CTX *ssl_ctx;
|
||||||
ssl_ctx = SSL_CTX_new(TLS_client_method());
|
ssl_ctx = SSL_CTX_new(SSLv23_client_method());
|
||||||
if (!ssl_ctx) {
|
if (!ssl_ctx) {
|
||||||
errx(1, "Could not create SSL/TLS context: %s",
|
errx(1, "Could not create SSL/TLS context: %s",
|
||||||
ERR_error_string(ERR_get_error(), NULL));
|
ERR_error_string(ERR_get_error(), NULL));
|
||||||
@@ -617,18 +617,8 @@ int main(int argc, char **argv) {
|
|||||||
act.sa_handler = SIG_IGN;
|
act.sa_handler = SIG_IGN;
|
||||||
sigaction(SIGPIPE, &act, NULL);
|
sigaction(SIGPIPE, &act, NULL);
|
||||||
|
|
||||||
#if OPENSSL_VERSION_NUMBER >= 0x1010000fL
|
|
||||||
/* No explicit initialization is required. */
|
|
||||||
#elif defined(OPENSSL_IS_BORINGSSL)
|
|
||||||
CRYPTO_library_init();
|
|
||||||
#else /* !(OPENSSL_VERSION_NUMBER >= 0x1010000fL) && \
|
|
||||||
!defined(OPENSSL_IS_BORINGSSL) */
|
|
||||||
OPENSSL_config(NULL);
|
|
||||||
SSL_load_error_strings();
|
SSL_load_error_strings();
|
||||||
SSL_library_init();
|
SSL_library_init();
|
||||||
OpenSSL_add_all_algorithms();
|
|
||||||
#endif /* !(OPENSSL_VERSION_NUMBER >= 0x1010000fL) && \
|
|
||||||
!defined(OPENSSL_IS_BORINGSSL) */
|
|
||||||
|
|
||||||
run(argv[1]);
|
run(argv[1]);
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -142,8 +142,9 @@ static int alpn_select_proto_cb(SSL *ssl, const unsigned char **out,
|
|||||||
/* Create SSL_CTX. */
|
/* Create SSL_CTX. */
|
||||||
static SSL_CTX *create_ssl_ctx(const char *key_file, const char *cert_file) {
|
static SSL_CTX *create_ssl_ctx(const char *key_file, const char *cert_file) {
|
||||||
SSL_CTX *ssl_ctx;
|
SSL_CTX *ssl_ctx;
|
||||||
|
EC_KEY *ecdh;
|
||||||
|
|
||||||
ssl_ctx = SSL_CTX_new(TLS_server_method());
|
ssl_ctx = SSL_CTX_new(SSLv23_server_method());
|
||||||
if (!ssl_ctx) {
|
if (!ssl_ctx) {
|
||||||
errx(1, "Could not create SSL/TLS context: %s",
|
errx(1, "Could not create SSL/TLS context: %s",
|
||||||
ERR_error_string(ERR_get_error(), NULL));
|
ERR_error_string(ERR_get_error(), NULL));
|
||||||
@@ -152,23 +153,14 @@ static SSL_CTX *create_ssl_ctx(const char *key_file, const char *cert_file) {
|
|||||||
SSL_OP_ALL | SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 |
|
SSL_OP_ALL | SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 |
|
||||||
SSL_OP_NO_COMPRESSION |
|
SSL_OP_NO_COMPRESSION |
|
||||||
SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION);
|
SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION);
|
||||||
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
|
|
||||||
if (SSL_CTX_set1_curves_list(ssl_ctx, "P-256") != 1) {
|
ecdh = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
|
||||||
errx(1, "SSL_CTX_set1_curves_list failed: %s",
|
if (!ecdh) {
|
||||||
|
errx(1, "EC_KEY_new_by_curv_name failed: %s",
|
||||||
ERR_error_string(ERR_get_error(), NULL));
|
ERR_error_string(ERR_get_error(), NULL));
|
||||||
}
|
}
|
||||||
#else /* !(OPENSSL_VERSION_NUMBER >= 0x30000000L) */
|
SSL_CTX_set_tmp_ecdh(ssl_ctx, ecdh);
|
||||||
{
|
EC_KEY_free(ecdh);
|
||||||
EC_KEY *ecdh;
|
|
||||||
ecdh = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
|
|
||||||
if (!ecdh) {
|
|
||||||
errx(1, "EC_KEY_new_by_curv_name failed: %s",
|
|
||||||
ERR_error_string(ERR_get_error(), NULL));
|
|
||||||
}
|
|
||||||
SSL_CTX_set_tmp_ecdh(ssl_ctx, ecdh);
|
|
||||||
EC_KEY_free(ecdh);
|
|
||||||
}
|
|
||||||
#endif /* !(OPENSSL_VERSION_NUMBER >= 0x30000000L) */
|
|
||||||
|
|
||||||
if (SSL_CTX_use_PrivateKey_file(ssl_ctx, key_file, SSL_FILETYPE_PEM) != 1) {
|
if (SSL_CTX_use_PrivateKey_file(ssl_ctx, key_file, SSL_FILETYPE_PEM) != 1) {
|
||||||
errx(1, "Could not read private key file %s", key_file);
|
errx(1, "Could not read private key file %s", key_file);
|
||||||
@@ -817,18 +809,8 @@ int main(int argc, char **argv) {
|
|||||||
act.sa_handler = SIG_IGN;
|
act.sa_handler = SIG_IGN;
|
||||||
sigaction(SIGPIPE, &act, NULL);
|
sigaction(SIGPIPE, &act, NULL);
|
||||||
|
|
||||||
#if OPENSSL_VERSION_NUMBER >= 0x1010000fL
|
|
||||||
/* No explicit initialization is required. */
|
|
||||||
#elif defined(OPENSSL_IS_BORINGSSL)
|
|
||||||
CRYPTO_library_init();
|
|
||||||
#else /* !(OPENSSL_VERSION_NUMBER >= 0x1010000fL) && \
|
|
||||||
!defined(OPENSSL_IS_BORINGSSL) */
|
|
||||||
OPENSSL_config(NULL);
|
|
||||||
SSL_load_error_strings();
|
SSL_load_error_strings();
|
||||||
SSL_library_init();
|
SSL_library_init();
|
||||||
OpenSSL_add_all_algorithms();
|
|
||||||
#endif /* !(OPENSSL_VERSION_NUMBER >= 0x1010000fL) && \
|
|
||||||
!defined(OPENSSL_IS_BORINGSSL) */
|
|
||||||
|
|
||||||
run(argv[1], argv[2], argv[3]);
|
run(argv[1], argv[2], argv[3]);
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -1,160 +0,0 @@
|
|||||||
#include <string>
|
|
||||||
#include <fuzzer/FuzzedDataProvider.h>
|
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
#include <string.h>
|
|
||||||
#include "nghttp2_hd.h"
|
|
||||||
#include "nghttp2_frame.h"
|
|
||||||
|
|
||||||
#include "nghttp2_test_helper.h"
|
|
||||||
|
|
||||||
#define HEADERS_LENGTH 7
|
|
||||||
|
|
||||||
static nghttp2_nv fuzz_make_nv(std::string s1, std::string s2) {
|
|
||||||
nghttp2_nv nv;
|
|
||||||
uint8_t *n = (uint8_t *)malloc(s1.size());
|
|
||||||
memcpy(n, s1.c_str(), s1.size());
|
|
||||||
|
|
||||||
uint8_t *v = (uint8_t *)malloc(s2.size());
|
|
||||||
memcpy(v, s2.c_str(), s2.size());
|
|
||||||
|
|
||||||
nv.name = n;
|
|
||||||
nv.value = v;
|
|
||||||
nv.namelen = s1.size();
|
|
||||||
nv.valuelen = s2.size();
|
|
||||||
nv.flags = NGHTTP2_NV_FLAG_NONE;
|
|
||||||
|
|
||||||
return nv;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void fuzz_free_nv(nghttp2_nv *nv) {
|
|
||||||
free(nv->name);
|
|
||||||
free(nv->value);
|
|
||||||
}
|
|
||||||
|
|
||||||
void check_frame_pack_headers(FuzzedDataProvider *data_provider) {
|
|
||||||
nghttp2_hd_deflater deflater;
|
|
||||||
nghttp2_hd_inflater inflater;
|
|
||||||
nghttp2_headers frame, oframe;
|
|
||||||
nghttp2_bufs bufs;
|
|
||||||
nghttp2_nv *nva;
|
|
||||||
nghttp2_priority_spec pri_spec;
|
|
||||||
size_t nvlen;
|
|
||||||
nva_out out;
|
|
||||||
size_t hdblocklen;
|
|
||||||
int rv;
|
|
||||||
nghttp2_mem *mem;
|
|
||||||
|
|
||||||
mem = nghttp2_mem_default();
|
|
||||||
frame_pack_bufs_init(&bufs);
|
|
||||||
|
|
||||||
nva_out_init(&out);
|
|
||||||
nghttp2_hd_deflate_init(&deflater, mem);
|
|
||||||
nghttp2_hd_inflate_init(&inflater, mem);
|
|
||||||
|
|
||||||
/* Create a set of headers seeded with data from the fuzzer */
|
|
||||||
nva = (nghttp2_nv *)mem->malloc(sizeof(nghttp2_nv) * HEADERS_LENGTH, NULL);
|
|
||||||
for (int i = 0; i < HEADERS_LENGTH; i++) {
|
|
||||||
nva[i] = fuzz_make_nv(data_provider->ConsumeRandomLengthString(30),
|
|
||||||
data_provider->ConsumeRandomLengthString(300));
|
|
||||||
}
|
|
||||||
|
|
||||||
nvlen = HEADERS_LENGTH;
|
|
||||||
nghttp2_priority_spec_default_init(&pri_spec);
|
|
||||||
nghttp2_frame_headers_init(
|
|
||||||
&frame, NGHTTP2_FLAG_END_STREAM | NGHTTP2_FLAG_END_HEADERS, 1000000007,
|
|
||||||
NGHTTP2_HCAT_REQUEST, &pri_spec, nva, nvlen);
|
|
||||||
|
|
||||||
/* Perform a set of operations with the fuzz data */
|
|
||||||
rv = nghttp2_frame_pack_headers(&bufs, &frame, &deflater);
|
|
||||||
if (rv == 0) {
|
|
||||||
unpack_framebuf((nghttp2_frame *)&oframe, &bufs);
|
|
||||||
|
|
||||||
inflate_hd(&inflater, &out, &bufs, NGHTTP2_FRAME_HDLEN, mem);
|
|
||||||
nva_out_reset(&out, mem);
|
|
||||||
nghttp2_bufs_reset(&bufs);
|
|
||||||
}
|
|
||||||
|
|
||||||
nghttp2_nv *nva2 = NULL;
|
|
||||||
rv = nghttp2_nv_array_copy(&nva2, nva, nvlen, mem);
|
|
||||||
if (rv == 0) {
|
|
||||||
nghttp2_nv_array_del(nva2, mem);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Cleanup */
|
|
||||||
for (int i = 0; i < HEADERS_LENGTH; i++) {
|
|
||||||
fuzz_free_nv(&nva[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
nghttp2_bufs_free(&bufs);
|
|
||||||
nghttp2_frame_headers_free(&frame, mem);
|
|
||||||
nghttp2_hd_inflate_free(&inflater);
|
|
||||||
nghttp2_hd_deflate_free(&deflater);
|
|
||||||
}
|
|
||||||
|
|
||||||
void check_frame_push_promise(FuzzedDataProvider *data_provider) {
|
|
||||||
nghttp2_hd_deflater deflater;
|
|
||||||
nghttp2_hd_inflater inflater;
|
|
||||||
nghttp2_push_promise frame, oframe;
|
|
||||||
nghttp2_bufs bufs;
|
|
||||||
nghttp2_nv *nva;
|
|
||||||
nghttp2_priority_spec pri_spec;
|
|
||||||
size_t nvlen;
|
|
||||||
nva_out out;
|
|
||||||
size_t hdblocklen;
|
|
||||||
int rv;
|
|
||||||
nghttp2_mem *mem;
|
|
||||||
|
|
||||||
mem = nghttp2_mem_default();
|
|
||||||
frame_pack_bufs_init(&bufs);
|
|
||||||
|
|
||||||
nva_out_init(&out);
|
|
||||||
nghttp2_hd_deflate_init(&deflater, mem);
|
|
||||||
nghttp2_hd_inflate_init(&inflater, mem);
|
|
||||||
|
|
||||||
/* Create a set of headers seeded with data from the fuzzer */
|
|
||||||
nva = (nghttp2_nv *)mem->malloc(sizeof(nghttp2_nv) * HEADERS_LENGTH, NULL);
|
|
||||||
for (int i = 0; i < HEADERS_LENGTH; i++) {
|
|
||||||
nva[i] = fuzz_make_nv(data_provider->ConsumeRandomLengthString(30),
|
|
||||||
data_provider->ConsumeRandomLengthString(300));
|
|
||||||
}
|
|
||||||
nvlen = HEADERS_LENGTH;
|
|
||||||
nghttp2_priority_spec_default_init(&pri_spec);
|
|
||||||
|
|
||||||
/* Perform a set of operations with the fuzz data */
|
|
||||||
nghttp2_frame_push_promise_init(&frame, NGHTTP2_FLAG_END_HEADERS, 1000000007,
|
|
||||||
(1U << 31) - 1, nva, nvlen);
|
|
||||||
|
|
||||||
rv = nghttp2_frame_pack_push_promise(&bufs, &frame, &deflater);
|
|
||||||
if (rv == 0) {
|
|
||||||
unpack_framebuf((nghttp2_frame *)&oframe, &bufs);
|
|
||||||
}
|
|
||||||
|
|
||||||
nghttp2_nv *nva2 = NULL;
|
|
||||||
rv = nghttp2_nv_array_copy(&nva2, nva, nvlen, mem);
|
|
||||||
if (rv == 0) {
|
|
||||||
nghttp2_nv_array_del(nva2, mem);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Cleanup */
|
|
||||||
for (int i = 0; i < HEADERS_LENGTH; i++) {
|
|
||||||
fuzz_free_nv(&nva[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
nghttp2_bufs_reset(&bufs);
|
|
||||||
nghttp2_bufs_free(&bufs);
|
|
||||||
|
|
||||||
nghttp2_frame_push_promise_free(&frame, mem);
|
|
||||||
nghttp2_hd_inflate_free(&inflater);
|
|
||||||
nghttp2_hd_deflate_free(&deflater);
|
|
||||||
}
|
|
||||||
|
|
||||||
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
|
|
||||||
FuzzedDataProvider data_provider(data, size);
|
|
||||||
|
|
||||||
check_frame_pack_headers(&data_provider);
|
|
||||||
check_frame_push_promise(&data_provider);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // extern C
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
#include <fuzzer/FuzzedDataProvider.h>
|
|
||||||
|
|
||||||
#include <nghttp2/nghttp2.h>
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
int on_frame_recv_callback(nghttp2_session *session, const nghttp2_frame *frame,
|
|
||||||
void *user_data) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
int on_begin_headers_callback(nghttp2_session *session,
|
|
||||||
const nghttp2_frame *frame, void *user_data) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
int on_header_callback2(nghttp2_session *session, const nghttp2_frame *frame,
|
|
||||||
nghttp2_rcbuf *name, nghttp2_rcbuf *value,
|
|
||||||
uint8_t flags, void *user_data) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
int before_frame_send_callback(nghttp2_session *session,
|
|
||||||
const nghttp2_frame *frame, void *user_data) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
int on_frame_send_callback(nghttp2_session *session, const nghttp2_frame *frame,
|
|
||||||
void *user_data) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
void send_pending(nghttp2_session *session) {
|
|
||||||
for (;;) {
|
|
||||||
const uint8_t *data;
|
|
||||||
auto n = nghttp2_session_mem_send(session, &data);
|
|
||||||
if (n == 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
|
|
||||||
nghttp2_session *session;
|
|
||||||
nghttp2_session_callbacks *callbacks;
|
|
||||||
|
|
||||||
nghttp2_session_callbacks_new(&callbacks);
|
|
||||||
nghttp2_session_callbacks_set_on_frame_recv_callback(callbacks,
|
|
||||||
on_frame_recv_callback);
|
|
||||||
nghttp2_session_callbacks_set_on_begin_headers_callback(
|
|
||||||
callbacks, on_begin_headers_callback);
|
|
||||||
nghttp2_session_callbacks_set_on_header_callback2(callbacks,
|
|
||||||
on_header_callback2);
|
|
||||||
nghttp2_session_callbacks_set_before_frame_send_callback(
|
|
||||||
callbacks, before_frame_send_callback);
|
|
||||||
nghttp2_session_callbacks_set_on_frame_send_callback(callbacks,
|
|
||||||
on_frame_send_callback);
|
|
||||||
|
|
||||||
nghttp2_session_server_new(&session, callbacks, nullptr);
|
|
||||||
nghttp2_session_callbacks_del(callbacks);
|
|
||||||
|
|
||||||
FuzzedDataProvider data_provider(data, size);
|
|
||||||
|
|
||||||
/* Initialise a random iv */
|
|
||||||
nghttp2_settings_entry *iv;
|
|
||||||
int size_of_iv = data_provider.ConsumeIntegralInRange(1, 10);
|
|
||||||
iv = (nghttp2_settings_entry *)malloc(sizeof(nghttp2_settings_entry) *
|
|
||||||
size_of_iv);
|
|
||||||
for (int i = 0; i < size_of_iv; i++) {
|
|
||||||
iv[i].settings_id = data_provider.ConsumeIntegralInRange(0, 1000);
|
|
||||||
iv[i].value = data_provider.ConsumeIntegralInRange(0, 1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
nghttp2_submit_settings(session, NGHTTP2_FLAG_NONE, iv, size_of_iv);
|
|
||||||
send_pending(session);
|
|
||||||
|
|
||||||
std::vector<uint8_t> d = data_provider.ConsumeRemainingBytes<uint8_t>();
|
|
||||||
nghttp2_session_mem_recv(session, d.data(), d.size());
|
|
||||||
|
|
||||||
send_pending(session);
|
|
||||||
|
|
||||||
nghttp2_session_del(session);
|
|
||||||
|
|
||||||
free(iv);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -68,7 +68,6 @@ HEADERS = [
|
|||||||
('proxy-connection', None),
|
('proxy-connection', None),
|
||||||
('upgrade', None),
|
('upgrade', None),
|
||||||
(':protocol', None),
|
(':protocol', None),
|
||||||
('priority', None),
|
|
||||||
]
|
]
|
||||||
|
|
||||||
def to_enum_hd(k):
|
def to_enum_hd(k):
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
import sys
|
|
||||||
|
|
||||||
def name(i):
|
|
||||||
if i < 0x21:
|
|
||||||
return \
|
|
||||||
['NUL ', 'SOH ', 'STX ', 'ETX ', 'EOT ', 'ENQ ', 'ACK ', 'BEL ',
|
|
||||||
'BS ', 'HT ', 'LF ', 'VT ', 'FF ', 'CR ', 'SO ', 'SI ',
|
|
||||||
'DLE ', 'DC1 ', 'DC2 ', 'DC3 ', 'DC4 ', 'NAK ', 'SYN ', 'ETB ',
|
|
||||||
'CAN ', 'EM ', 'SUB ', 'ESC ', 'FS ', 'GS ', 'RS ', 'US ',
|
|
||||||
'SPC '][i]
|
|
||||||
elif i == 0x7f:
|
|
||||||
return 'DEL '
|
|
||||||
|
|
||||||
for i in range(256):
|
|
||||||
if chr(i) in ["!" , "#" , "$" , "%" , "&" , "'" , "*",
|
|
||||||
"+" , "-" , "." , "^" , "_" , "`" , "|" , "~"] or\
|
|
||||||
('0' <= chr(i) and chr(i) <= '9') or \
|
|
||||||
('A' <= chr(i) and chr(i) <= 'Z') or \
|
|
||||||
('a' <= chr(i) and chr(i) <= 'z'):
|
|
||||||
sys.stdout.write('1 /* {} */, '.format(chr(i)))
|
|
||||||
elif (0x21 <= i and i < 0x7f):
|
|
||||||
sys.stdout.write('0 /* {} */, '.format(chr(i)))
|
|
||||||
elif 0x80 <= i:
|
|
||||||
sys.stdout.write('0 /* {} */, '.format(hex(i)))
|
|
||||||
else:
|
|
||||||
sys.stdout.write('0 /* {} */, '.format(name(i)))
|
|
||||||
if (i + 1)%4 == 0:
|
|
||||||
sys.stdout.write('\n')
|
|
||||||
@@ -177,29 +177,6 @@ OPTIONS = [
|
|||||||
"tls13-ciphers",
|
"tls13-ciphers",
|
||||||
"tls13-client-ciphers",
|
"tls13-client-ciphers",
|
||||||
"no-strip-incoming-early-data",
|
"no-strip-incoming-early-data",
|
||||||
"quic-bpf-program-file",
|
|
||||||
"no-quic-bpf",
|
|
||||||
"http2-altsvc",
|
|
||||||
"frontend-http3-read-timeout",
|
|
||||||
"frontend-quic-idle-timeout",
|
|
||||||
"frontend-quic-debug-log",
|
|
||||||
"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",
|
|
||||||
"frontend-quic-early-data",
|
|
||||||
"frontend-quic-qlog-dir",
|
|
||||||
"frontend-quic-require-token",
|
|
||||||
"frontend-quic-congestion-controller",
|
|
||||||
"quic-server-id",
|
|
||||||
"frontend-quic-secret-file",
|
|
||||||
"rlimit-memlock",
|
|
||||||
"max-worker-processes",
|
|
||||||
"worker-process-grace-shutdown-period",
|
|
||||||
"frontend-quic-initial-rtt",
|
|
||||||
"require-http-scheme",
|
|
||||||
"tls-ktls",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
LOGVARS = [
|
LOGVARS = [
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
import sys
|
|
||||||
|
|
||||||
def name(i):
|
|
||||||
if i < 0x21:
|
|
||||||
return \
|
|
||||||
['NUL ', 'SOH ', 'STX ', 'ETX ', 'EOT ', 'ENQ ', 'ACK ', 'BEL ',
|
|
||||||
'BS ', 'HT ', 'LF ', 'VT ', 'FF ', 'CR ', 'SO ', 'SI ',
|
|
||||||
'DLE ', 'DC1 ', 'DC2 ', 'DC3 ', 'DC4 ', 'NAK ', 'SYN ', 'ETB ',
|
|
||||||
'CAN ', 'EM ', 'SUB ', 'ESC ', 'FS ', 'GS ', 'RS ', 'US ',
|
|
||||||
'SPC '][i]
|
|
||||||
elif i == 0x7f:
|
|
||||||
return 'DEL '
|
|
||||||
|
|
||||||
for i in range(256):
|
|
||||||
if (0x21 <= i and i < 0x7f):
|
|
||||||
sys.stdout.write('1 /* {} */, '.format(chr(i)))
|
|
||||||
elif 0x80 <= i:
|
|
||||||
sys.stdout.write('1 /* {} */, '.format(hex(i)))
|
|
||||||
else:
|
|
||||||
sys.stdout.write('0 /* {} */, '.format(name(i)))
|
|
||||||
if (i + 1)%4 == 0:
|
|
||||||
sys.stdout.write('\n')
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user