Compare commits

..

90 Commits

Author SHA1 Message Date
Tatsuhiro Tsujikawa
25f29e7634 Compile with the latest ngtcp2 2021-08-16 16:58:11 +09:00
Tatsuhiro Tsujikawa
19cf303828 Compile with the latest ngtcp2 and nghttp3 2021-08-09 21:54:04 +09:00
Tatsuhiro Tsujikawa
217d2fc13a Compile with the latest nghttp3 2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
07edcb9ffe Compile with the latest ngtcp2 2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
cf9a7df327 Just use h3 ALPN 2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
4cbbff3ca7 Compile with the latest ngtcp2 2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
9f1fc4810b Count outgoing packets 2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
2321253545 Enlarge receive buffer 2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
dc3ca53a8e Adopt ngtcp2_crypto_recv_crypto_data_cb 2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
44869a4924 Do not specify max_udp_payload_size for now 2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
6862916306 Avoid std::ostringstream 2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
2917f6d8e8 make clang-format 2021-08-04 15:05:09 +09:00
Hajime Fujita
7d60389596 h2load: Add qlog output support 2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
a37117a98b QUIC UDP GSO 2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
eb1607890a Rewrite docker file
Rewrite docker file so that:

- avoid k8s debian-base
- build h2load as statically as possible
2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
fadedc46f8 Measure the number of UDP datagrams sent and received 2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
0362bd6e00 Update Dockerfile 2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
25d3323c8a Support both h3 and h3-29 ALPN and their corresponding QUIC versions 2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
e7f35e879b Compile with the latest ngtcp2 2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
2ca1ba9f72 Deal with 0 length HTTP data write case 2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
8affef1061 Follow ngtcp2_conn_writev_stream specification change 2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
7006bf04e3 Compile with the latest ngtcp2 2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
132cd21c12 Compile with the latest ngtcp2 and nghttp3 2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
863434fa01 h2load: Enable --data for HTTP/3 2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
4660252b32 Compile with the latest ngtcp2 2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
51510f1710 Build with draft-32 openssl 2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
51d4e419cf Cap --window-bits to 26 for QUIC 2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
3912e965fb Set X25519 as default 2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
4b2f528719 Cap --window-bits to 23 for QUIC 2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
c5102d3f81 Compile with the latest ngtcp2 2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
4bedc9a074 Compile with the latest ngtcp2 2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
89aa449ddf Compile with the latest ngtcp2 2021-08-04 15:05:09 +09:00
George Liu
90846d8af2 fix quic branch Dockerfile
libjemalloc1 package doesn't exist as it's now libjemalloc2 named

Get:1 http://security.debian.org/debian-security buster/updates InRelease [65.4 kB]
Get:2 http://deb.debian.org/debian buster InRelease [121 kB]
Get:3 http://deb.debian.org/debian buster-updates InRelease [51.9 kB]
Get:4 http://security.debian.org/debian-security buster/updates/main amd64 Packages [213 kB]
Get:5 http://deb.debian.org/debian buster/main amd64 Packages [7905 kB]
Get:6 http://deb.debian.org/debian buster-updates/main amd64 Packages [7868 B]
Fetched 8364 kB in 1s (6499 kB/s)
Reading package lists...
Reading package lists...
Building dependency tree...
Reading state information...
E: Unable to locate package libjemalloc1

fix reference to OpenSSL 1.1.1 branch

Cloning into 'openssl'...
warning: Could not find remote branch OpenSSL_1_1_1d-quic-draft-29 to clone.
fatal: Remote branch OpenSSL_1_1_1d-quic-draft-29 not found in upstream origin
2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
ae736b4054 Compile with the latest ngtcp2 2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
5d9d35a6f5 QUIC needs termination without session 2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
31a4628034 Compile with latest ngtcp2 2021-08-04 15:05:09 +09:00
Tatsuhiro Tsujikawa
7f949152bd quic draft-29 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
d4a67a6868 Compile with latest ngtcp2 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
7d87221a8c Fix bug for platform which does not have SOCK_NONBLOCK 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
3162ffedfc Fix compile error 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
7d41e4db6b Compile with latest ngtcp2 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
aebd837790 Compile latest ngtcp2 crypto lib 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
c7736c2a85 Use ngtcp2_conn_handle_expiry 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
0b98685c41 draft-28 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
39e6588fd5 Assert ndatalen 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
a1e88ad809 Revert "Ensure complete packet is written"
This reverts commit c19046b09f8e66713f0e067f986ed92d676eb6b6.
2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
c60ca34719 Ensure complete packet is written 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
a4dc6cf526 Fix compile error with the latest ngtcp2 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
799f72b078 draft-27 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
245dbd6511 Handle stream limit increment 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
987e700f36 Update Dockerfile 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
a26bb9c8d1 draft-25 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
d590b67dc1 Remove unused member function declaration 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
5ce081ce95 Fix compile error 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
a995580913 Bump base image and use OpenSSL_1_1_1d-quic-draft-24 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
aa7c580bb1 Optimize QUIC write 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
1d05c6c3c5 Only count STREAM data as bytes_total 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
52e4cd80c3 Use correct type 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
212635eeca Follow ngtcp2 API update 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
2d80acfdbb quic draft-24 2021-08-04 15:05:08 +09:00
Dmitri Tikhonov
f8528c5080 Update Dockerfile to use I-D 23 branches of ngtcp2 and openssl 2021-08-04 15:05:08 +09:00
Lucas Pardue
4733167f91 Add SSLKEYLOGFILE support 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
7f7979a8ae Compile with the latest ngtcp2 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
06cdc97da5 Send SNI 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
dbfd59ad38 h3-23 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
dc9384dc7c Small adjustment of successful HTTP/3 error code
Non-zero successful error code is a bit annoying because ngtcp2 does
not know it.  Enforcing successful application error code to 0 is a
lot simpler.
2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
3c15e85783 Simplify write_quic 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
42f47c1920 Handle sending just fine 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
327a7adbaa Avoid setting 0 to repeat field 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
9e089521e7 Add missing acked_stream_data_offset callback 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
b912b626cd Fix return value 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
8b32ad735f Update doc 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
8d3932d94a Update docker build and doc 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
1a63c02c0e Compile with the latest ngtcp2 and ngtcp2_crypto_openssl 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
e45b10ca20 Remove error handling which does not happen 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
330fe12494 Follow ngtcp2 API changes and use libngtcp2_crypto_openssl 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
06272f8365 quic: Support TLS_AES_128_CCM_SHA256 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
db5ad83776 h2load: Add --tls13-ciphers option 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
b558eeb861 Add Dockerfile 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
f4276ce2dc Handle preferred address 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
4fd9fa238a Show ngtcp2 debug log with --verbose 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
9031469735 h2load: Add --groups option 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
19fb74b03f Always call write_quic when timer expires 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
5b788f5218 h3-22 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
d64488d909 Handle Retry 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
daad34ab95 quic: Configure settings with options 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
1bd57360c7 h2load: Fix possible deadlock 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
e9d5c5a489 Fix link 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
78974cb60b Add build instruction 2021-08-04 15:05:08 +09:00
Tatsuhiro Tsujikawa
c24c7ffa06 [WIP] Add QUIC to h2load 2021-08-04 15:05:08 +09:00
245 changed files with 3329 additions and 23341 deletions

View File

@@ -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

View File

@@ -1,43 +1,25 @@
name: build name: build
on: [push, pull_request] on: push
jobs: jobs:
build: build:
strategy:
matrix:
os: [ubuntu-22.04, macos-11]
compiler: [gcc, clang]
buildtool: [autotools, cmake]
http3: [http3, no-http3]
openssl: [openssl1, openssl3, boringssl]
exclude:
- os: macos-11
openssl: openssl3
- http3: no-http3
openssl: openssl3
- os: macos-11
compiler: gcc
- # disable macos cmake because of include path issue
os: macos-11
buildtool: cmake
- os: macos-11
openssl: boringssl
- openssl: boringssl
buildtool: cmake
- openssl: boringssl
compiler: gcc
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-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
View File

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

17
AUTHORS
View File

@@ -19,7 +19,6 @@ Alek Storm
Alex Nalivko Alex Nalivko
Alexandros Konstantinakis-Karmis Alexandros Konstantinakis-Karmis
Alexis La Goutte Alexis La Goutte
Amir Livneh
Amir Pakdel Amir Pakdel
Anders Bakken Anders Bakken
Andreas Pohl Andreas Pohl
@@ -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

View File

@@ -24,13 +24,13 @@
cmake_minimum_required(VERSION 3.0) cmake_minimum_required(VERSION 3.0)
# XXX using 1.8.90 instead of 1.9.0-DEV # XXX using 1.8.90 instead of 1.9.0-DEV
project(nghttp2 VERSION 1.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 "

View File

@@ -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:

View File

@@ -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}

View File

@@ -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,7 +811,7 @@ server:
.. code-block:: text .. code-block:: text
Client <-- (HTTP/3, HTTP/2, HTTP/1.1) --> nghttpx <-- (HTTP/1.1, HTTP/2) --> Web Server Client <-- (HTTP/2, HTTP/1.1) --> nghttpx <-- (HTTP/1.1, HTTP/2) --> Web Server
[reverse proxy] [reverse proxy]
With the ``--http2-proxy`` option, it works as forward proxy, and it With the ``--http2-proxy`` option, it works as forward proxy, and it
@@ -898,7 +819,7 @@ is so called secure HTTP/2 proxy:
.. code-block:: text .. code-block:: text
Client <-- (HTTP/3, HTTP/2, HTTP/1.1) --> nghttpx <-- (HTTP/1.1) --> Proxy Client <-- (HTTP/2, HTTP/1.1) --> nghttpx <-- (HTTP/1.1) --> Proxy
[secure proxy] (e.g., Squid, ATS) [secure proxy] (e.g., Squid, ATS)
The ``Client`` in the above example needs to be configured to use The ``Client`` in the above example needs to be configured to use
@@ -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
View File

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

View File

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

View File

@@ -1,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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -22,10 +22,10 @@ dnl OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
dnl WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. dnl WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
dnl Do not change user variables! dnl Do not change user variables!
dnl https://www.gnu.org/software/automake/manual/html_node/Flag-Variables-Ordering.html dnl http://www.gnu.org/software/automake/manual/html_node/Flag-Variables-Ordering.html
AC_PREREQ(2.61) AC_PREREQ(2.61)
AC_INIT([nghttp2], [1.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,123 +455,27 @@ 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
PKG_CHECK_MODULES([LIBNGTCP2], [libngtcp2 >= 0.9.0], [have_libngtcp2=yes],
[have_libngtcp2=no]) [have_libngtcp2=no])
if test "x${have_libngtcp2}" = "xno"; then if test "x${have_libngtcp2}" = "xno"; then
AC_MSG_NOTICE($LIBNGTCP2_PKG_ERRORS) AC_MSG_NOTICE($LIBNGTCP2_PKG_ERRORS)
fi fi
fi
if test "x${request_libngtcp2}" = "xyes" &&
test "x${have_libngtcp2}" != "xyes"; then
AC_MSG_ERROR([libngtcp2 was requested (--with-libngtcp2) but not found])
fi
# ngtcp2_crypto_openssl (for src) # ngtcp2_crypto_openssl (for src)
have_libngtcp2_crypto_openssl=no
if test "x${have_ssl_is_quic}" = "xyes" &&
test "x${request_libngtcp2}" != "xno"; then
PKG_CHECK_MODULES([LIBNGTCP2_CRYPTO_OPENSSL], PKG_CHECK_MODULES([LIBNGTCP2_CRYPTO_OPENSSL],
[libngtcp2_crypto_openssl >= 0.9.0], [libngtcp2_crypto_openssl >= 0.0.0],
[have_libngtcp2_crypto_openssl=yes], [have_libngtcp2_crypto_openssl=yes],
[have_libngtcp2_crypto_openssl=no]) [have_libngtcp2_crypto_openssl=no])
if test "x${have_libngtcp2_crypto_openssl}" = "xno"; then if test "x${have_libngtcp2_crypto_openssl}" = "xno"; then
AC_MSG_NOTICE($LIBNGTCP2_CRYPTO_OPENSSL_PKG_ERRORS) 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
PKG_CHECK_MODULES([LIBNGHTTP3], [libnghttp3 >= 0.7.0], [have_libnghttp3=yes],
[have_libnghttp3=no]) [have_libnghttp3=no])
if test "x${have_libnghttp3}" = "xno"; then if test "x${have_libnghttp3}" = "xno"; then
AC_MSG_NOTICE($LIBNGHTTP3_PKG_ERRORS) AC_MSG_NOTICE($LIBNGHTTP3_PKT_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()
@@ -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}
]) ])

View File

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

View File

@@ -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

View File

@@ -30,9 +30,6 @@ APIDOCS= \
nghttp2_check_authority.rst \ nghttp2_check_authority.rst \
nghttp2_check_header_name.rst \ nghttp2_check_header_name.rst \
nghttp2_check_header_value.rst \ nghttp2_check_header_value.rst \
nghttp2_check_header_value_rfc9113.rst \
nghttp2_check_method.rst \
nghttp2_check_path.rst \
nghttp2_hd_deflate_bound.rst \ nghttp2_hd_deflate_bound.rst \
nghttp2_hd_deflate_change_table_size.rst \ nghttp2_hd_deflate_change_table_size.rst \
nghttp2_hd_deflate_del.rst \ nghttp2_hd_deflate_del.rst \
@@ -69,9 +66,7 @@ APIDOCS= \
nghttp2_option_set_no_closed_streams.rst \ nghttp2_option_set_no_closed_streams.rst \
nghttp2_option_set_no_http_messaging.rst \ nghttp2_option_set_no_http_messaging.rst \
nghttp2_option_set_no_recv_client_magic.rst \ nghttp2_option_set_no_recv_client_magic.rst \
nghttp2_option_set_no_rfc9113_leading_and_trailing_ws_validation.rst \
nghttp2_option_set_peer_max_concurrent_streams.rst \ nghttp2_option_set_peer_max_concurrent_streams.rst \
nghttp2_option_set_server_fallback_rfc7540_priorities.rst \
nghttp2_option_set_user_recv_extension_type.rst \ nghttp2_option_set_user_recv_extension_type.rst \
nghttp2_option_set_max_outbound_ack.rst \ nghttp2_option_set_max_outbound_ack.rst \
nghttp2_option_set_max_settings.rst \ nghttp2_option_set_max_settings.rst \
@@ -109,7 +104,6 @@ APIDOCS= \
nghttp2_session_callbacks_set_send_callback.rst \ nghttp2_session_callbacks_set_send_callback.rst \
nghttp2_session_callbacks_set_send_data_callback.rst \ nghttp2_session_callbacks_set_send_data_callback.rst \
nghttp2_session_callbacks_set_unpack_extension_callback.rst \ nghttp2_session_callbacks_set_unpack_extension_callback.rst \
nghttp2_session_change_extpri_stream_priority.rst \
nghttp2_session_change_stream_priority.rst \ nghttp2_session_change_stream_priority.rst \
nghttp2_session_check_request_allowed.rst \ nghttp2_session_check_request_allowed.rst \
nghttp2_session_check_server_session.rst \ nghttp2_session_check_server_session.rst \
@@ -176,7 +170,6 @@ APIDOCS= \
nghttp2_submit_origin.rst \ nghttp2_submit_origin.rst \
nghttp2_submit_ping.rst \ nghttp2_submit_ping.rst \
nghttp2_submit_priority.rst \ nghttp2_submit_priority.rst \
nghttp2_submit_priority_update.rst \
nghttp2_submit_push_promise.rst \ nghttp2_submit_push_promise.rst \
nghttp2_submit_request.rst \ nghttp2_submit_request.rst \
nghttp2_submit_response.rst \ nghttp2_submit_response.rst \
@@ -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

View File

@@ -493,7 +493,7 @@ class RubyModuleIndex(Index):
# list of all modules, sorted by module name # list of all modules, sorted by module name
modules = sorted(_iteritems(self.domain.data['modules']), modules = sorted(_iteritems(self.domain.data['modules']),
key=lambda x: x[0].lower()) key=lambda x: x[0].lower())
# sort out collapsible modules # sort out collapsable modules
prev_modname = '' prev_modname = ''
num_toplevels = 0 num_toplevels = 0
for modname, (docname, synopsis, platforms, deprecated) in modules: for modname, (docname, synopsis, platforms, deprecated) in modules:

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,5 +1,8 @@
.\" Man page generated from reStructuredText. .\" Man page generated from reStructuredText.
. .
.TH "H2LOAD" "1" "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

View File

@@ -73,17 +73,9 @@ OPTIONS
Default: ``1`` Default: ``1``
.. option:: -f, --max-frame-size=<SIZE>
Maximum frame size that the local endpoint is willing to
receive.
Default: ``16K``
.. option:: -w, --window-bits=<N> .. option:: -w, --window-bits=<N>
Sets the stream level initial window size to (2\*\*<N>)-1. Sets the stream level initial window size to (2\*\*<N>)-1.
For QUIC, <N> is capped to 26 (roughly 64MiB).
Default: ``30`` Default: ``30``
@@ -100,17 +92,10 @@ OPTIONS
.. option:: --ciphers=<SUITE> .. option:: --ciphers=<SUITE>
Set allowed cipher list for TLSv1.2 or earlier. The Set allowed cipher list. The format of the string is
format of the string is described in OpenSSL ciphers(1). described in OpenSSL ciphers(1).
Default: ``ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384`` Default: ``ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256``
.. option:: --tls13-ciphers=<SUITE>
Set allowed cipher list for TLSv1.3. The format of the
string is described in OpenSSL ciphers(1).
Default: ``TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_CCM_SHA256``
.. option:: -p, --no-tls-proto=<PROTOID> .. option:: -p, --no-tls-proto=<PROTOID>
@@ -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.

View File

@@ -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

View File

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

View File

@@ -1,5 +1,8 @@
.\" Man page generated from reStructuredText. .\" Man page generated from reStructuredText.
. .
.TH "NGHTTPD" "1" "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

View File

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

View File

@@ -1,5 +1,8 @@
.\" Man page generated from reStructuredText. .\" Man page generated from reStructuredText.
. .
.TH "NGHTTPX" "1" "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
@@ -210,17 +209,6 @@ If a request scheme is "https", then Secure attribute is
set. Otherwise, it is not set. If <SECURE> is "yes", set. Otherwise, it is not set. If <SECURE> is "yes",
the Secure attribute is always set. If <SECURE> is the Secure attribute is always set. If <SECURE> is
"no", the Secure attribute is always omitted. "no", the Secure attribute is always omitted.
"affinity\-cookie\-stickiness=<STICKINESS>" controls
stickiness of this affinity. If <STICKINESS> is
"loose", removing or adding a backend server might break
the affinity and the request might be forwarded to a
different backend server. If <STICKINESS> is "strict",
removing the designated backend server breaks affinity,
but adding new backend server does not cause breakage.
If the designated backend server becomes unavailable,
new backend server is chosen as if the request does not
have an affinity cookie. <STICKINESS> defaults to
"loose".
.sp .sp
By default, name resolution of backend host name is done By default, name resolution of backend host name is done
at start up, or reloading configuration. If "dns" at start up, or reloading configuration. If "dns"
@@ -288,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

View File

@@ -14,7 +14,7 @@ SYNOPSIS
DESCRIPTION DESCRIPTION
----------- -----------
A reverse proxy for HTTP/3, HTTP/2, and HTTP/1. A reverse proxy for HTTP/2, and HTTP/1.
.. describe:: <PRIVATE_KEY> .. describe:: <PRIVATE_KEY>
@@ -124,13 +124,12 @@ Connections
"affinity=<METHOD>", "dns", "redirect-if-not-tls", "affinity=<METHOD>", "dns", "redirect-if-not-tls",
"upgrade-scheme", "mruby=<PATH>", "upgrade-scheme", "mruby=<PATH>",
"read-timeout=<DURATION>", "write-timeout=<DURATION>", "read-timeout=<DURATION>", "write-timeout=<DURATION>",
"group=<GROUP>", "group-weight=<N>", "weight=<N>", and "group=<GROUP>", "group-weight=<N>", and "weight=<N>".
"dnf". The parameter consists of keyword, and The parameter consists of keyword, and optionally
optionally followed by "=" and value. For example, the followed by "=" and value. For example, the parameter
parameter "proto=h2" consists of the keyword "proto" and "proto=h2" consists of the keyword "proto" and value
value "h2". The parameter "tls" consists of the keyword "h2". The parameter "tls" consists of the keyword "tls"
"tls" without value. Each parameter is described as without value. Each parameter is described as follows.
follows.
The backend application protocol can be specified using The backend application protocol can be specified using
optional "proto" parameter, and in the form of optional "proto" parameter, and in the form of
@@ -194,17 +193,6 @@ Connections
set. Otherwise, it is not set. If <SECURE> is "yes", set. Otherwise, it is not set. If <SECURE> is "yes",
the Secure attribute is always set. If <SECURE> is the Secure attribute is always set. If <SECURE> is
"no", the Secure attribute is always omitted. "no", the Secure attribute is always omitted.
"affinity-cookie-stickiness=<STICKINESS>" controls
stickiness of this affinity. If <STICKINESS> is
"loose", removing or adding a backend server might break
the affinity and the request might be forwarded to a
different backend server. If <STICKINESS> is "strict",
removing the designated backend server breaks affinity,
but adding new backend server does not cause breakage.
If the designated backend server becomes unavailable,
new backend server is chosen as if the request does not
have an affinity cookie. <STICKINESS> defaults to
"loose".
By default, name resolution of backend host name is done By default, name resolution of backend host name is done
at start up, or reloading configuration. If "dns" at start up, or reloading configuration. If "dns"
@@ -272,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
~~~~ ~~~~

View File

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

View File

@@ -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

View File

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

View File

@@ -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

View File

@@ -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
----------------------------------------- -----------------------------------------

View File

@@ -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

View File

@@ -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/

View File

@@ -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'

View File

@@ -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) {

View File

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

View File

@@ -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;

View File

@@ -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,14 +153,7 @@ 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) {
errx(1, "SSL_CTX_set1_curves_list failed: %s",
ERR_error_string(ERR_get_error(), NULL));
}
#else /* !(OPENSSL_VERSION_NUMBER >= 0x30000000L) */
{
EC_KEY *ecdh;
ecdh = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1); ecdh = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
if (!ecdh) { if (!ecdh) {
errx(1, "EC_KEY_new_by_curv_name failed: %s", errx(1, "EC_KEY_new_by_curv_name failed: %s",
@@ -167,8 +161,6 @@ static SSL_CTX *create_ssl_ctx(const char *key_file, const char *cert_file) {
} }
SSL_CTX_set_tmp_ecdh(ssl_ctx, ecdh); SSL_CTX_set_tmp_ecdh(ssl_ctx, ecdh);
EC_KEY_free(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;

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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):

View File

@@ -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')

View File

@@ -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 = [

View File

@@ -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