mirror of
https://github.com/nghttp2/nghttp2.git
synced 2025-12-07 18:48:54 +08:00
Compare commits
2 Commits
v1.64.0
...
gh-actions
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3accecd661 | ||
|
|
edb0bf1f36 |
174
.clang-format
174
.clang-format
@@ -2,247 +2,125 @@
|
|||||||
Language: Cpp
|
Language: Cpp
|
||||||
AccessModifierOffset: -2
|
AccessModifierOffset: -2
|
||||||
AlignAfterOpenBracket: Align
|
AlignAfterOpenBracket: Align
|
||||||
AlignArrayOfStructures: None
|
AlignConsecutiveMacros: false
|
||||||
AlignConsecutiveAssignments:
|
AlignConsecutiveAssignments: false
|
||||||
Enabled: false
|
AlignConsecutiveDeclarations: false
|
||||||
AcrossEmptyLines: false
|
|
||||||
AcrossComments: false
|
|
||||||
AlignCompound: false
|
|
||||||
AlignFunctionPointers: false
|
|
||||||
PadOperators: true
|
|
||||||
AlignConsecutiveBitFields:
|
|
||||||
Enabled: false
|
|
||||||
AcrossEmptyLines: false
|
|
||||||
AcrossComments: false
|
|
||||||
AlignCompound: false
|
|
||||||
AlignFunctionPointers: false
|
|
||||||
PadOperators: true
|
|
||||||
AlignConsecutiveDeclarations:
|
|
||||||
Enabled: false
|
|
||||||
AcrossEmptyLines: false
|
|
||||||
AcrossComments: false
|
|
||||||
AlignCompound: false
|
|
||||||
AlignFunctionPointers: false
|
|
||||||
PadOperators: true
|
|
||||||
AlignConsecutiveMacros:
|
|
||||||
Enabled: false
|
|
||||||
AcrossEmptyLines: false
|
|
||||||
AcrossComments: false
|
|
||||||
AlignCompound: false
|
|
||||||
AlignFunctionPointers: false
|
|
||||||
PadOperators: true
|
|
||||||
AlignConsecutiveShortCaseStatements:
|
|
||||||
Enabled: false
|
|
||||||
AcrossEmptyLines: false
|
|
||||||
AcrossComments: false
|
|
||||||
AlignCaseColons: false
|
|
||||||
AlignEscapedNewlines: Right
|
AlignEscapedNewlines: Right
|
||||||
AlignOperands: Align
|
AlignOperands: true
|
||||||
AlignTrailingComments:
|
AlignTrailingComments: true
|
||||||
Kind: Always
|
|
||||||
OverEmptyLines: 0
|
|
||||||
AllowAllArgumentsOnNextLine: true
|
AllowAllArgumentsOnNextLine: true
|
||||||
|
AllowAllConstructorInitializersOnNextLine: true
|
||||||
AllowAllParametersOfDeclarationOnNextLine: true
|
AllowAllParametersOfDeclarationOnNextLine: true
|
||||||
AllowBreakBeforeNoexceptSpecifier: Never
|
AllowShortBlocksOnASingleLine: false
|
||||||
AllowShortBlocksOnASingleLine: Never
|
|
||||||
AllowShortCaseLabelsOnASingleLine: false
|
AllowShortCaseLabelsOnASingleLine: false
|
||||||
AllowShortCompoundRequirementOnASingleLine: true
|
|
||||||
AllowShortEnumsOnASingleLine: true
|
|
||||||
AllowShortFunctionsOnASingleLine: All
|
AllowShortFunctionsOnASingleLine: All
|
||||||
AllowShortIfStatementsOnASingleLine: Never
|
|
||||||
AllowShortLambdasOnASingleLine: All
|
AllowShortLambdasOnASingleLine: All
|
||||||
|
AllowShortIfStatementsOnASingleLine: Never
|
||||||
AllowShortLoopsOnASingleLine: false
|
AllowShortLoopsOnASingleLine: false
|
||||||
AlwaysBreakAfterDefinitionReturnType: None
|
AlwaysBreakAfterDefinitionReturnType: None
|
||||||
AlwaysBreakAfterReturnType: None
|
AlwaysBreakAfterReturnType: None
|
||||||
AlwaysBreakBeforeMultilineStrings: false
|
AlwaysBreakBeforeMultilineStrings: false
|
||||||
AlwaysBreakTemplateDeclarations: MultiLine
|
AlwaysBreakTemplateDeclarations: MultiLine
|
||||||
AttributeMacros:
|
|
||||||
- __capability
|
|
||||||
BinPackArguments: true
|
BinPackArguments: true
|
||||||
BinPackParameters: true
|
BinPackParameters: true
|
||||||
BitFieldColonSpacing: Both
|
|
||||||
BraceWrapping:
|
BraceWrapping:
|
||||||
AfterCaseLabel: false
|
AfterCaseLabel: false
|
||||||
AfterClass: false
|
AfterClass: false
|
||||||
AfterControlStatement: Never
|
AfterControlStatement: false
|
||||||
AfterEnum: false
|
AfterEnum: false
|
||||||
AfterExternBlock: false
|
|
||||||
AfterFunction: false
|
AfterFunction: false
|
||||||
AfterNamespace: false
|
AfterNamespace: false
|
||||||
AfterObjCDeclaration: false
|
AfterObjCDeclaration: false
|
||||||
AfterStruct: false
|
AfterStruct: false
|
||||||
AfterUnion: false
|
AfterUnion: false
|
||||||
|
AfterExternBlock: false
|
||||||
BeforeCatch: false
|
BeforeCatch: false
|
||||||
BeforeElse: false
|
BeforeElse: false
|
||||||
BeforeLambdaBody: false
|
|
||||||
BeforeWhile: false
|
|
||||||
IndentBraces: false
|
IndentBraces: false
|
||||||
SplitEmptyFunction: true
|
SplitEmptyFunction: true
|
||||||
SplitEmptyRecord: true
|
SplitEmptyRecord: true
|
||||||
SplitEmptyNamespace: true
|
SplitEmptyNamespace: true
|
||||||
BreakAdjacentStringLiterals: true
|
|
||||||
BreakAfterAttributes: Leave
|
|
||||||
BreakAfterJavaFieldAnnotations: false
|
|
||||||
BreakArrays: true
|
|
||||||
BreakBeforeBinaryOperators: None
|
BreakBeforeBinaryOperators: None
|
||||||
BreakBeforeConceptDeclarations: Always
|
|
||||||
BreakBeforeBraces: Attach
|
BreakBeforeBraces: Attach
|
||||||
BreakBeforeInlineASMColon: OnlyMultiline
|
BreakBeforeInheritanceComma: false
|
||||||
BreakBeforeTernaryOperators: true
|
|
||||||
BreakConstructorInitializers: BeforeColon
|
|
||||||
BreakInheritanceList: BeforeColon
|
BreakInheritanceList: BeforeColon
|
||||||
|
BreakBeforeTernaryOperators: true
|
||||||
|
BreakConstructorInitializersBeforeComma: false
|
||||||
|
BreakConstructorInitializers: BeforeColon
|
||||||
|
BreakAfterJavaFieldAnnotations: false
|
||||||
BreakStringLiterals: true
|
BreakStringLiterals: true
|
||||||
ColumnLimit: 80
|
ColumnLimit: 80
|
||||||
CommentPragmas: '^ IWYU pragma:'
|
CommentPragmas: '^ IWYU pragma:'
|
||||||
CompactNamespaces: false
|
CompactNamespaces: false
|
||||||
ConstructorInitializerIndentWidth: 2
|
ConstructorInitializerAllOnOneLineOrOnePerLine: true
|
||||||
ContinuationIndentWidth: 2
|
ConstructorInitializerIndentWidth: 4
|
||||||
|
ContinuationIndentWidth: 4
|
||||||
Cpp11BracedListStyle: true
|
Cpp11BracedListStyle: true
|
||||||
DerivePointerAlignment: false
|
DerivePointerAlignment: false
|
||||||
DisableFormat: false
|
DisableFormat: false
|
||||||
EmptyLineAfterAccessModifier: Never
|
|
||||||
EmptyLineBeforeAccessModifier: LogicalBlock
|
|
||||||
ExperimentalAutoDetectBinPacking: false
|
ExperimentalAutoDetectBinPacking: false
|
||||||
FixNamespaceComments: true
|
FixNamespaceComments: true
|
||||||
ForEachMacros:
|
ForEachMacros:
|
||||||
- foreach
|
- foreach
|
||||||
- Q_FOREACH
|
- Q_FOREACH
|
||||||
- BOOST_FOREACH
|
- BOOST_FOREACH
|
||||||
IfMacros:
|
|
||||||
- KJ_IF_MAYBE
|
|
||||||
IncludeBlocks: Preserve
|
IncludeBlocks: Preserve
|
||||||
IncludeCategories:
|
IncludeCategories:
|
||||||
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
|
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
|
||||||
Priority: 2
|
Priority: 2
|
||||||
SortPriority: 0
|
|
||||||
CaseSensitive: false
|
|
||||||
- Regex: '^(<|"(gtest|isl|json)/)'
|
- Regex: '^(<|"(gtest|isl|json)/)'
|
||||||
Priority: 3
|
Priority: 3
|
||||||
SortPriority: 0
|
|
||||||
CaseSensitive: false
|
|
||||||
- Regex: '.*'
|
- Regex: '.*'
|
||||||
Priority: 1
|
Priority: 1
|
||||||
SortPriority: 0
|
|
||||||
CaseSensitive: false
|
|
||||||
IncludeIsMainRegex: '$'
|
IncludeIsMainRegex: '$'
|
||||||
IncludeIsMainSourceRegex: ''
|
|
||||||
IndentAccessModifiers: false
|
|
||||||
IndentCaseBlocks: false
|
|
||||||
IndentCaseLabels: false
|
IndentCaseLabels: false
|
||||||
IndentExternBlock: AfterExternBlock
|
|
||||||
IndentGotoLabels: true
|
|
||||||
IndentPPDirectives: AfterHash
|
IndentPPDirectives: AfterHash
|
||||||
IndentRequiresClause: false
|
|
||||||
IndentWidth: 2
|
IndentWidth: 2
|
||||||
IndentWrappedFunctionNames: false
|
IndentWrappedFunctionNames: false
|
||||||
InsertBraces: false
|
|
||||||
InsertNewlineAtEOF: false
|
|
||||||
InsertTrailingCommas: None
|
|
||||||
IntegerLiteralSeparator:
|
|
||||||
Binary: 0
|
|
||||||
BinaryMinDigits: 0
|
|
||||||
Decimal: 0
|
|
||||||
DecimalMinDigits: 0
|
|
||||||
Hex: 0
|
|
||||||
HexMinDigits: 0
|
|
||||||
JavaScriptQuotes: Leave
|
JavaScriptQuotes: Leave
|
||||||
JavaScriptWrapImports: true
|
JavaScriptWrapImports: true
|
||||||
KeepEmptyLinesAtTheStartOfBlocks: false
|
KeepEmptyLinesAtTheStartOfBlocks: true
|
||||||
KeepEmptyLinesAtEOF: false
|
|
||||||
LambdaBodyIndentation: Signature
|
|
||||||
LineEnding: DeriveLF
|
|
||||||
MacroBlockBegin: ''
|
MacroBlockBegin: ''
|
||||||
MacroBlockEnd: ''
|
MacroBlockEnd: ''
|
||||||
MaxEmptyLinesToKeep: 1
|
MaxEmptyLinesToKeep: 1
|
||||||
NamespaceIndentation: None
|
NamespaceIndentation: None
|
||||||
ObjCBinPackProtocolList: Auto
|
ObjCBinPackProtocolList: Auto
|
||||||
ObjCBlockIndentWidth: 2
|
ObjCBlockIndentWidth: 2
|
||||||
ObjCBreakBeforeNestedBlockParam: true
|
|
||||||
ObjCSpaceAfterProperty: false
|
ObjCSpaceAfterProperty: false
|
||||||
ObjCSpaceBeforeProtocolList: true
|
ObjCSpaceBeforeProtocolList: true
|
||||||
PackConstructorInitializers: NextLine
|
|
||||||
PenaltyBreakAssignment: 2
|
PenaltyBreakAssignment: 2
|
||||||
PenaltyBreakBeforeFirstCallParameter: 19
|
PenaltyBreakBeforeFirstCallParameter: 19
|
||||||
PenaltyBreakComment: 300
|
PenaltyBreakComment: 300
|
||||||
PenaltyBreakFirstLessLess: 120
|
PenaltyBreakFirstLessLess: 120
|
||||||
PenaltyBreakOpenParenthesis: 0
|
|
||||||
PenaltyBreakScopeResolution: 500
|
|
||||||
PenaltyBreakString: 1000
|
PenaltyBreakString: 1000
|
||||||
PenaltyBreakTemplateDeclaration: 10
|
PenaltyBreakTemplateDeclaration: 10
|
||||||
PenaltyExcessCharacter: 1000000
|
PenaltyExcessCharacter: 1000000
|
||||||
PenaltyIndentedWhitespace: 0
|
|
||||||
PenaltyReturnTypeOnItsOwnLine: 60
|
PenaltyReturnTypeOnItsOwnLine: 60
|
||||||
PointerAlignment: Right
|
PointerAlignment: Right
|
||||||
PPIndentWidth: -1
|
|
||||||
QualifierAlignment: Leave
|
|
||||||
ReferenceAlignment: Pointer
|
|
||||||
ReflowComments: true
|
ReflowComments: true
|
||||||
RemoveBracesLLVM: false
|
SortIncludes: false
|
||||||
RemoveParentheses: Leave
|
SortUsingDeclarations: true
|
||||||
RemoveSemicolon: false
|
|
||||||
RequiresClausePosition: OwnLine
|
|
||||||
RequiresExpressionIndentation: OuterScope
|
|
||||||
SeparateDefinitionBlocks: Leave
|
|
||||||
ShortNamespaceLines: 1
|
|
||||||
SkipMacroDefinitionBody: false
|
|
||||||
SortIncludes: Never
|
|
||||||
SortJavaStaticImport: Before
|
|
||||||
SortUsingDeclarations: LexicographicNumeric
|
|
||||||
SpaceAfterCStyleCast: false
|
SpaceAfterCStyleCast: false
|
||||||
SpaceAfterLogicalNot: false
|
SpaceAfterLogicalNot: false
|
||||||
SpaceAfterTemplateKeyword: true
|
SpaceAfterTemplateKeyword: true
|
||||||
SpaceAroundPointerQualifiers: Default
|
|
||||||
SpaceBeforeAssignmentOperators: true
|
SpaceBeforeAssignmentOperators: true
|
||||||
SpaceBeforeCaseColon: false
|
|
||||||
SpaceBeforeCpp11BracedList: false
|
SpaceBeforeCpp11BracedList: false
|
||||||
SpaceBeforeCtorInitializerColon: true
|
SpaceBeforeCtorInitializerColon: true
|
||||||
SpaceBeforeInheritanceColon: true
|
SpaceBeforeInheritanceColon: true
|
||||||
SpaceBeforeJsonColon: false
|
|
||||||
SpaceBeforeParens: ControlStatements
|
SpaceBeforeParens: ControlStatements
|
||||||
SpaceBeforeParensOptions:
|
|
||||||
AfterControlStatements: true
|
|
||||||
AfterForeachMacros: true
|
|
||||||
AfterFunctionDefinitionName: false
|
|
||||||
AfterFunctionDeclarationName: false
|
|
||||||
AfterIfMacros: true
|
|
||||||
AfterOverloadedOperator: false
|
|
||||||
AfterPlacementOperator: true
|
|
||||||
AfterRequiresInClause: false
|
|
||||||
AfterRequiresInExpression: false
|
|
||||||
BeforeNonEmptyParentheses: false
|
|
||||||
SpaceBeforeRangeBasedForLoopColon: true
|
SpaceBeforeRangeBasedForLoopColon: true
|
||||||
SpaceBeforeSquareBrackets: false
|
SpaceInEmptyParentheses: false
|
||||||
SpaceInEmptyBlock: false
|
|
||||||
SpacesBeforeTrailingComments: 1
|
SpacesBeforeTrailingComments: 1
|
||||||
SpacesInAngles: Never
|
SpacesInAngles: false
|
||||||
SpacesInContainerLiterals: true
|
SpacesInContainerLiterals: true
|
||||||
SpacesInLineCommentPrefix:
|
SpacesInCStyleCastParentheses: false
|
||||||
Minimum: 1
|
SpacesInParentheses: false
|
||||||
Maximum: -1
|
|
||||||
SpacesInParens: Never
|
|
||||||
SpacesInParensOptions:
|
|
||||||
InCStyleCasts: false
|
|
||||||
InConditionalStatements: false
|
|
||||||
InEmptyParentheses: false
|
|
||||||
Other: false
|
|
||||||
SpacesInSquareBrackets: false
|
SpacesInSquareBrackets: false
|
||||||
Standard: Latest
|
Standard: Cpp11
|
||||||
StatementAttributeLikeMacros:
|
|
||||||
- Q_EMIT
|
|
||||||
StatementMacros:
|
StatementMacros:
|
||||||
- Q_UNUSED
|
- Q_UNUSED
|
||||||
- QT_REQUIRE_VERSION
|
- QT_REQUIRE_VERSION
|
||||||
- munit_void_test_decl
|
|
||||||
- nghttp2_max_def
|
|
||||||
- nghttp2_min_def
|
|
||||||
TabWidth: 8
|
TabWidth: 8
|
||||||
UseTab: Never
|
UseTab: Never
|
||||||
VerilogBreakBetweenInstancePorts: true
|
|
||||||
WhitespaceSensitiveMacros:
|
|
||||||
- STRINGIZE
|
|
||||||
- PP_STRINGIZE
|
|
||||||
- BOOST_PP_STRINGIZE
|
|
||||||
- NS_SWIFT_NAME
|
|
||||||
- CF_SWIFT_NAME
|
|
||||||
...
|
...
|
||||||
|
|
||||||
|
|||||||
10
.github/dependabot.yml
vendored
10
.github/dependabot.yml
vendored
@@ -1,10 +0,0 @@
|
|||||||
version: 2
|
|
||||||
updates:
|
|
||||||
- package-ecosystem: "github-actions"
|
|
||||||
directory: "/"
|
|
||||||
schedule:
|
|
||||||
interval: "weekly"
|
|
||||||
- package-ecosystem: "gomod"
|
|
||||||
directory: "/"
|
|
||||||
schedule:
|
|
||||||
interval: "weekly"
|
|
||||||
648
.github/workflows/build.yml
vendored
648
.github/workflows/build.yml
vendored
@@ -1,288 +1,32 @@
|
|||||||
name: build
|
name: build
|
||||||
|
|
||||||
on: [push, pull_request]
|
on: push
|
||||||
|
|
||||||
permissions: read-all
|
|
||||||
|
|
||||||
env:
|
|
||||||
LIBBPF_VERSION: v1.4.6
|
|
||||||
OPENSSL1_VERSION: 1_1_1w+quic
|
|
||||||
OPENSSL3_VERSION: 3.1.7+quic
|
|
||||||
BORINGSSL_VERSION: 76968bb3d53982560bcf08bcd0ba3e1865fe15cd
|
|
||||||
AWSLC_VERSION: v1.36.1
|
|
||||||
NGHTTP3_VERSION: v1.6.0
|
|
||||||
NGTCP2_VERSION: v1.8.1
|
|
||||||
WOLFSSL_VERSION: v5.7.2-stable
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-cache:
|
build:
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
os: [ubuntu-24.04, macos-13, macos-14]
|
|
||||||
|
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
- name: Restore libbpf cache
|
|
||||||
id: cache-libbpf
|
|
||||||
uses: actions/cache@v4
|
|
||||||
if: runner.os == 'Linux'
|
|
||||||
with:
|
|
||||||
path: libbpf/build
|
|
||||||
key: ${{ matrix.os }}-libbpf-${{ env.LIBBPF_VERSION }}
|
|
||||||
- name: Restore OpenSSL v1.1.1 cache
|
|
||||||
id: cache-openssl1
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: openssl1/build
|
|
||||||
key: ${{ matrix.os }}-openssl-${{ env.OPENSSL1_VERSION }}
|
|
||||||
- name: Restore OpenSSL v3.x cache
|
|
||||||
id: cache-openssl3
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: openssl3/build
|
|
||||||
key: ${{ matrix.os }}-openssl-${{ env.OPENSSL3_VERSION }}
|
|
||||||
- name: Restore BoringSSL cache
|
|
||||||
id: cache-boringssl
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
boringssl/build/crypto/libcrypto.a
|
|
||||||
boringssl/build/ssl/libssl.a
|
|
||||||
boringssl/include
|
|
||||||
key: ${{ matrix.os }}-boringssl-${{ env.BORINGSSL_VERSION }}
|
|
||||||
- name: Restore aws-lc cache
|
|
||||||
id: cache-awslc
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
aws-lc/build/crypto/libcrypto.a
|
|
||||||
aws-lc/build/ssl/libssl.a
|
|
||||||
aws-lc/include
|
|
||||||
key: ${{ matrix.os }}-awslc-${{ env.AWSLC_VERSION }}
|
|
||||||
- name: Restore wolfSSL cache
|
|
||||||
id: cache-wolfssl
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: wolfssl/build
|
|
||||||
key: ${{ matrix.os }}-wolfssl-${{ env.WOLFSSL_VERSION }}
|
|
||||||
- name: Restore nghttp3 cache
|
|
||||||
id: cache-nghttp3
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: nghttp3/build
|
|
||||||
key: ${{ matrix.os }}-nghttp3-${{ env.NGHTTP3_VERSION }}
|
|
||||||
- name: Restore ngtcp2 + quictls/openssl v1.1.1 cache
|
|
||||||
id: cache-ngtcp2-openssl1
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: ngtcp2-openssl1/build
|
|
||||||
key: ${{ matrix.os }}-ngtcp2-${{ env.NGTCP2_VERSION }}-openssl-${{ env.OPENSSL1_VERSION }}
|
|
||||||
- name: Restore ngtcp2 + quictls/openssl v3.x cache
|
|
||||||
id: cache-ngtcp2-openssl3
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: ngtcp2-openssl3/build
|
|
||||||
key: ${{ matrix.os }}-ngtcp2-${{ env.NGTCP2_VERSION }}-openssl-${{ env.OPENSSL3_VERSION }}
|
|
||||||
- id: settings
|
|
||||||
if: |
|
|
||||||
(steps.cache-libbpf.outputs.cache-hit != 'true' && runner.os == 'Linux') ||
|
|
||||||
steps.cache-openssl1.outputs.cache-hit != 'true' ||
|
|
||||||
steps.cache-openssl3.outputs.cache-hit != 'true' ||
|
|
||||||
steps.cache-boringssl.outputs.cache-hit != 'true' ||
|
|
||||||
steps.cache-awslc.outputs.cache-hit != 'true' ||
|
|
||||||
steps.cache-wolfssl.outputs.cache-hit != 'true' ||
|
|
||||||
steps.cache-nghttp3.outputs.cache-hit != 'true' ||
|
|
||||||
steps.cache-ngtcp2-openssl1.outputs.cache-hit != 'true' ||
|
|
||||||
steps.cache-ngtcp2-openssl3.outputs.cache-hit != 'true'
|
|
||||||
run: |
|
|
||||||
echo 'needs-build=true' >> $GITHUB_OUTPUT
|
|
||||||
- name: Linux setup
|
|
||||||
if: runner.os == 'Linux' && steps.settings.outputs.needs-build == 'true'
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install \
|
|
||||||
autoconf \
|
|
||||||
automake \
|
|
||||||
autotools-dev \
|
|
||||||
libtool \
|
|
||||||
pkg-config \
|
|
||||||
libelf-dev \
|
|
||||||
cmake \
|
|
||||||
cmake-data
|
|
||||||
- name: MacOS setup
|
|
||||||
if: runner.os == 'macOS' && steps.settings.outputs.needs-build == 'true'
|
|
||||||
run: |
|
|
||||||
brew install \
|
|
||||||
autoconf \
|
|
||||||
automake \
|
|
||||||
pkg-config \
|
|
||||||
libtool
|
|
||||||
- name: Build libbpf
|
|
||||||
if: steps.cache-libbpf.outputs.cache-hit != 'true' && runner.os == 'Linux'
|
|
||||||
run: |
|
|
||||||
git clone --recursive --shallow-submodules -b ${{ env.LIBBPF_VERSION }} https://github.com/libbpf/libbpf
|
|
||||||
cd libbpf
|
|
||||||
make -C src install PREFIX=$PWD/build
|
|
||||||
- name: Build quictls/openssl v1.1.1
|
|
||||||
if: steps.cache-openssl1.outputs.cache-hit != 'true'
|
|
||||||
run: |
|
|
||||||
git clone --recursive --shallow-submodules --depth 1 -b OpenSSL_${{ env.OPENSSL1_VERSION }} https://github.com/quictls/openssl openssl1
|
|
||||||
cd openssl1
|
|
||||||
./config --prefix=$PWD/build
|
|
||||||
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)"
|
|
||||||
make install_sw
|
|
||||||
- name: Build quictls/openssl v3.x
|
|
||||||
if: steps.cache-openssl3.outputs.cache-hit != 'true'
|
|
||||||
run: |
|
|
||||||
git clone --recursive --shallow-submodules --depth 1 -b openssl-${{ env.OPENSSL3_VERSION }} https://github.com/quictls/openssl openssl3
|
|
||||||
cd openssl3
|
|
||||||
./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: steps.cache-boringssl.outputs.cache-hit != 'true'
|
|
||||||
run: |
|
|
||||||
mkdir boringssl
|
|
||||||
cd boringssl
|
|
||||||
git init
|
|
||||||
git remote add origin https://boringssl.googlesource.com/boringssl
|
|
||||||
git fetch origin --depth 1 ${{ env.BORINGSSL_VERSION }}
|
|
||||||
git checkout ${{ env.BORINGSSL_VERSION }}
|
|
||||||
mkdir build
|
|
||||||
cd build
|
|
||||||
cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON ..
|
|
||||||
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)"
|
|
||||||
- name: Build aws-lc
|
|
||||||
if: steps.cache-awslc.outputs.cache-hit != 'true'
|
|
||||||
run: |
|
|
||||||
git clone --recursive --shallow-submodules --depth 1 -b "${AWSLC_VERSION}" https://github.com/aws/aws-lc
|
|
||||||
cd aws-lc
|
|
||||||
cmake -B build -DDISABLE_GO=ON
|
|
||||||
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)" -C build
|
|
||||||
- name: Build wolfSSL
|
|
||||||
if: steps.cache-wolfssl.outputs.cache-hit != 'true'
|
|
||||||
run: |
|
|
||||||
git clone --depth 1 -b ${{ env.WOLFSSL_VERSION }} https://github.com/wolfSSL/wolfssl
|
|
||||||
cd wolfssl
|
|
||||||
autoreconf -i
|
|
||||||
./configure --disable-dependency-tracking --prefix=$PWD/build \
|
|
||||||
--enable-all --enable-harden --disable-ech
|
|
||||||
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)"
|
|
||||||
make install
|
|
||||||
- name: Build nghttp3
|
|
||||||
if: steps.cache-nghttp3.outputs.cache-hit != 'true'
|
|
||||||
run: |
|
|
||||||
git clone --recursive --shallow-submodules --depth 1 -b ${{ env.NGHTTP3_VERSION}} https://github.com/ngtcp2/nghttp3
|
|
||||||
cd nghttp3
|
|
||||||
autoreconf -i
|
|
||||||
./configure --disable-dependency-tracking --prefix=$PWD/build \
|
|
||||||
--enable-lib-only
|
|
||||||
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)" check
|
|
||||||
make install
|
|
||||||
- name: Build ngtcp2 + quictls/openssl v1.1.1 + BoringSSL
|
|
||||||
if: steps.cache-ngtcp2-openssl1.outputs.cache-hit != 'true'
|
|
||||||
run: |
|
|
||||||
git clone --recursive --shallow-submodules --depth 1 -b ${{ env.NGTCP2_VERSION }} https://github.com/ngtcp2/ngtcp2 ngtcp2-openssl1
|
|
||||||
cd ngtcp2-openssl1
|
|
||||||
autoreconf -i
|
|
||||||
./configure --prefix=$PWD/build --enable-lib-only \
|
|
||||||
PKG_CONFIG_PATH="../openssl1/build/lib/pkgconfig:../wolfssl/build/lib/pkgconfig" \
|
|
||||||
BORINGSSL_CFLAGS="-I$PWD/../boringssl/include/" \
|
|
||||||
BORINGSSL_LIBS="-L$PWD/../boringssl/build/ssl -lssl -L$PWD/../boringssl/build/crypto -lcrypto" \
|
|
||||||
--disable-dependency-tracking \
|
|
||||||
--with-boringssl \
|
|
||||||
--with-wolfssl
|
|
||||||
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)" check
|
|
||||||
make install
|
|
||||||
- name: Build ngtcp2 + quictls/openssl v3.x + aws-lc
|
|
||||||
if: steps.cache-ngtcp2-openssl3.outputs.cache-hit != 'true'
|
|
||||||
run: |
|
|
||||||
git clone --recursive --shallow-submodules --depth 1 -b ${{ env.NGTCP2_VERSION }} https://github.com/ngtcp2/ngtcp2 ngtcp2-openssl3
|
|
||||||
cd ngtcp2-openssl3
|
|
||||||
autoreconf -i
|
|
||||||
./configure --prefix=$PWD/build --enable-lib-only \
|
|
||||||
PKG_CONFIG_PATH="../openssl3/build/lib/pkgconfig" \
|
|
||||||
BORINGSSL_CFLAGS="-I$PWD/../aws-lc/include/" \
|
|
||||||
BORINGSSL_LIBS="-L$PWD/../aws-lc/build/ssl -lssl -L$PWD/../aws-lc/build/crypto -lcrypto" \
|
|
||||||
--disable-dependency-tracking \
|
|
||||||
--with-boringssl
|
|
||||||
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)" check
|
|
||||||
make install
|
|
||||||
|
|
||||||
build:
|
|
||||||
needs:
|
|
||||||
- build-cache
|
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
os: [ubuntu-24.04, macos-13, macos-14]
|
os: [ubuntu-18.04, macos-10.15]
|
||||||
compiler: [gcc, clang]
|
compiler: [gcc, clang]
|
||||||
buildtool: [autotools, cmake]
|
buildtool: [autotools, cmake]
|
||||||
http3: [http3, no-http3]
|
|
||||||
openssl: [openssl1, openssl3, boringssl, awslc, wolfssl]
|
|
||||||
exclude:
|
|
||||||
- os: macos-13
|
|
||||||
openssl: openssl3
|
|
||||||
- os: macos-14
|
|
||||||
openssl: openssl3
|
|
||||||
- http3: no-http3
|
|
||||||
openssl: openssl3
|
|
||||||
- os: macos-13
|
|
||||||
compiler: gcc
|
|
||||||
- os: macos-14
|
|
||||||
compiler: gcc
|
|
||||||
- # disable macos cmake because of include path issue
|
|
||||||
os: macos-13
|
|
||||||
buildtool: cmake
|
|
||||||
- # disable macos cmake because of include path issue
|
|
||||||
os: macos-14
|
|
||||||
buildtool: cmake
|
|
||||||
- os: macos-13
|
|
||||||
openssl: boringssl
|
|
||||||
- os: macos-14
|
|
||||||
openssl: boringssl
|
|
||||||
- openssl: boringssl
|
|
||||||
buildtool: cmake
|
|
||||||
- openssl: boringssl
|
|
||||||
compiler: gcc
|
|
||||||
- os: macos-13
|
|
||||||
openssl: awslc
|
|
||||||
- os: macos-14
|
|
||||||
openssl: awslc
|
|
||||||
- openssl: awslc
|
|
||||||
buildtool: cmake
|
|
||||||
- openssl: awslc
|
|
||||||
compiler: gcc
|
|
||||||
include:
|
|
||||||
- os: ubuntu-24.04
|
|
||||||
compiler: clang
|
|
||||||
buildtool: distcheck
|
|
||||||
http3: http3
|
|
||||||
openssl: awslc
|
|
||||||
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- uses: actions/checkout@v2
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
submodules: recursive
|
|
||||||
- name: Linux setup
|
- name: Linux setup
|
||||||
if: runner.os == 'Linux'
|
if: runner.os == 'Linux'
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install \
|
sudo apt-get install \
|
||||||
g++-14 \
|
g++-8 \
|
||||||
clang-18 \
|
clang-10 \
|
||||||
autoconf \
|
autoconf \
|
||||||
automake \
|
automake \
|
||||||
autotools-dev \
|
autotools-dev \
|
||||||
libtool \
|
libtool \
|
||||||
pkg-config \
|
pkg-config \
|
||||||
zlib1g-dev \
|
zlib1g-dev \
|
||||||
|
libcunit1-dev \
|
||||||
libssl-dev \
|
libssl-dev \
|
||||||
libxml2-dev \
|
libxml2-dev \
|
||||||
libev-dev \
|
libev-dev \
|
||||||
@@ -290,33 +34,31 @@ jobs:
|
|||||||
libjansson-dev \
|
libjansson-dev \
|
||||||
libjemalloc-dev \
|
libjemalloc-dev \
|
||||||
libc-ares-dev \
|
libc-ares-dev \
|
||||||
libelf-dev \
|
|
||||||
libbrotli-dev \
|
|
||||||
cmake \
|
cmake \
|
||||||
cmake-data
|
cmake-data
|
||||||
echo 'CPPFLAGS=-fsanitize=address,undefined -fno-sanitize-recover=undefined -g' >> $GITHUB_ENV
|
echo 'CPPFLAGS=-fsanitize=address' >> $GITHUB_ENV
|
||||||
echo 'LDFLAGS=-fsanitize=address,undefined -fno-sanitize-recover=undefined' >> $GITHUB_ENV
|
echo 'LDFLAGS=-fsanitize=address' >> $GITHUB_ENV
|
||||||
|
|
||||||
# https://github.com/actions/runner-images/issues/9491#issuecomment-1989718917
|
|
||||||
# Asan in llvm 14 provided in ubuntu 22.04 is incompatible with
|
|
||||||
# high-entropy ASLR in much newer kernels that GitHub runners are
|
|
||||||
# using leading to random crashes: https://reviews.llvm.org/D148280
|
|
||||||
sudo sysctl vm.mmap_rnd_bits=28
|
|
||||||
- name: MacOS setup
|
- name: MacOS setup
|
||||||
if: runner.os == 'macOS'
|
if: runner.os == 'macOS'
|
||||||
run: |
|
run: |
|
||||||
brew install \
|
brew install \
|
||||||
libev \
|
libev \
|
||||||
|
libevent \
|
||||||
|
c-ares \
|
||||||
|
cunit \
|
||||||
libressl \
|
libressl \
|
||||||
autoconf \
|
autoconf \
|
||||||
automake \
|
automake \
|
||||||
|
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-18' >> $GITHUB_ENV
|
echo 'CC=clang-10' >> $GITHUB_ENV
|
||||||
echo 'CXX=clang++-18' >> $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: |
|
||||||
@@ -325,359 +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-14' >> $GITHUB_ENV
|
echo 'CC=gcc-8' >> $GITHUB_ENV
|
||||||
echo 'CXX=g++-14' >> $GITHUB_ENV
|
echo 'CXX=g++-8' >> $GITHUB_ENV
|
||||||
# g++-12 is known to produce false positive warnings.
|
|
||||||
echo 'CXXFLAGS=-Wno-restrict' >> $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: Restore libbpf cache
|
- name: Setup git submodules
|
||||||
uses: actions/cache/restore@v4
|
|
||||||
if: matrix.http3 == 'http3' && matrix.compiler == 'clang' && runner.os == 'Linux'
|
|
||||||
with:
|
|
||||||
path: libbpf/build
|
|
||||||
key: ${{ matrix.os }}-libbpf-${{ env.LIBBPF_VERSION }}
|
|
||||||
fail-on-cache-miss: true
|
|
||||||
- name: Set libbpf variables
|
|
||||||
if: matrix.http3 == 'http3' && matrix.compiler == 'clang' && runner.os == 'Linux'
|
|
||||||
run: |
|
run: |
|
||||||
cd libbpf
|
git submodule update --init
|
||||||
|
|
||||||
EXTRA_AUTOTOOLS_OPTS="$EXTRA_AUTOTOOLS_OPTS --with-libbpf"
|
|
||||||
EXTRA_CMAKE_OPTS="$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: Setup libev variables
|
|
||||||
if: matrix.os == 'macos-14'
|
|
||||||
run: |
|
|
||||||
LIBEV_CFLAGS="-I/opt/homebrew/Cellar/libev/4.33/include"
|
|
||||||
LIBEV_LIBS="-L/opt/homebrew/Cellar/libev/4.33/lib -lev"
|
|
||||||
|
|
||||||
echo 'LIBEV_CFLAGS='"$LIBEV_CFLAGS" >> $GITHUB_ENV
|
|
||||||
echo 'LIBEV_LIBS='"$LIBEV_LIBS" >> $GITHUB_ENV
|
|
||||||
- name: Restore quictls/openssl v1.1.1 cache
|
|
||||||
uses: actions/cache/restore@v4
|
|
||||||
if: matrix.openssl == 'openssl1'
|
|
||||||
with:
|
|
||||||
path: openssl1/build
|
|
||||||
key: ${{ matrix.os }}-openssl-${{ env.OPENSSL1_VERSION }}
|
|
||||||
fail-on-cache-miss: true
|
|
||||||
- name: Restore quictls/openssl v3.x cache
|
|
||||||
uses: actions/cache/restore@v4
|
|
||||||
if: matrix.openssl == 'openssl3'
|
|
||||||
with:
|
|
||||||
path: openssl3/build
|
|
||||||
key: ${{ matrix.os }}-openssl-${{ env.OPENSSL3_VERSION }}
|
|
||||||
fail-on-cache-miss: true
|
|
||||||
- name: Restore BoringSSL cache
|
|
||||||
uses: actions/cache/restore@v4
|
|
||||||
if: matrix.openssl == 'boringssl'
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
boringssl/build/crypto/libcrypto.a
|
|
||||||
boringssl/build/ssl/libssl.a
|
|
||||||
boringssl/include
|
|
||||||
key: ${{ matrix.os }}-boringssl-${{ env.BORINGSSL_VERSION }}
|
|
||||||
fail-on-cache-miss: true
|
|
||||||
- name: Restore aws-lc cache
|
|
||||||
uses: actions/cache/restore@v4
|
|
||||||
if: matrix.openssl == 'awslc'
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
aws-lc/build/crypto/libcrypto.a
|
|
||||||
aws-lc/build/ssl/libssl.a
|
|
||||||
aws-lc/include
|
|
||||||
key: ${{ matrix.os }}-awslc-${{ env.AWSLC_VERSION }}
|
|
||||||
fail-on-cache-miss: true
|
|
||||||
- name: Set BoringSSL variables
|
|
||||||
if: matrix.openssl == 'boringssl'
|
|
||||||
run: |
|
|
||||||
cd boringssl
|
|
||||||
|
|
||||||
OPENSSL_CFLAGS="-I$PWD/include/"
|
|
||||||
OPENSSL_LIBS="-L$PWD/build/ssl -lssl -L$PWD/build/crypto -lcrypto -pthread"
|
|
||||||
EXTRA_AUTOTOOLS_OPTS="$EXTRA_AUTOTOOLS_OPTS --without-neverbleed --without-jemalloc --disable-examples"
|
|
||||||
|
|
||||||
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_AUTOTOOLS_OPTS='"$EXTRA_AUTOTOOLS_OPTS" >> $GITHUB_ENV
|
|
||||||
- name: Set aws-lc variables
|
|
||||||
if: matrix.openssl == 'awslc'
|
|
||||||
run: |
|
|
||||||
cd aws-lc
|
|
||||||
|
|
||||||
OPENSSL_CFLAGS="-I$PWD/include/"
|
|
||||||
OPENSSL_LIBS="-L$PWD/build/ssl -lssl -L$PWD/build/crypto -lcrypto -pthread"
|
|
||||||
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_AUTOTOOLS_OPTS='"$EXTRA_AUTOTOOLS_OPTS" >> $GITHUB_ENV
|
|
||||||
- name: Restore wolfSSL cache
|
|
||||||
uses: actions/cache/restore@v4
|
|
||||||
if: matrix.openssl == 'wolfssl'
|
|
||||||
with:
|
|
||||||
path: wolfssl/build
|
|
||||||
key: ${{ matrix.os }}-wolfssl-${{ env.WOLFSSL_VERSION }}
|
|
||||||
fail-on-cache-miss: true
|
|
||||||
- name: Set wolfSSL variables
|
|
||||||
if: matrix.openssl == 'wolfssl'
|
|
||||||
run: |
|
|
||||||
EXTRA_AUTOTOOLS_OPTS="$EXTRA_AUTOTOOLS_OPTS --with-wolfssl --without-neverbleed"
|
|
||||||
EXTRA_CMAKE_OPTS="$EXTRA_CMAKE_OPTS -DWITH_WOLFSSL=1 -DWITH_NEVERBLEED=0 -DENABLE_EXAMPLES=0"
|
|
||||||
|
|
||||||
echo 'EXTRA_AUTOTOOLS_OPTS='"$EXTRA_AUTOTOOLS_OPTS" >> $GITHUB_ENV
|
|
||||||
echo 'EXTRA_CMAKE_OPTS='"$EXTRA_CMAKE_OPTS" >> $GITHUB_ENV
|
|
||||||
- name: Restore nghttp3 cache
|
|
||||||
uses: actions/cache/restore@v4
|
|
||||||
if: matrix.http3 == 'http3'
|
|
||||||
with:
|
|
||||||
path: nghttp3/build
|
|
||||||
key: ${{ matrix.os }}-nghttp3-${{ env.NGHTTP3_VERSION }}
|
|
||||||
fail-on-cache-miss: true
|
|
||||||
- name: Restore ngtcp2 + quictls/openssl v1.1.1 cache + BoringSSL
|
|
||||||
uses: actions/cache/restore@v4
|
|
||||||
if: matrix.http3 == 'http3' && (matrix.openssl == 'openssl1' || matrix.openssl == 'boringssl' || matrix.openssl == 'wolfssl')
|
|
||||||
with:
|
|
||||||
path: ngtcp2-openssl1/build
|
|
||||||
key: ${{ matrix.os }}-ngtcp2-${{ env.NGTCP2_VERSION }}-openssl-${{ env.OPENSSL1_VERSION }}
|
|
||||||
fail-on-cache-miss: true
|
|
||||||
- name: Restore ngtcp2 + quictls/openssl v3.x cache + aws-lc
|
|
||||||
uses: actions/cache/restore@v4
|
|
||||||
if: matrix.http3 == 'http3' && (matrix.openssl == 'openssl3' || matrix.openssl == 'awslc')
|
|
||||||
with:
|
|
||||||
path: ngtcp2-openssl3/build
|
|
||||||
key: ${{ matrix.os }}-ngtcp2-${{ env.NGTCP2_VERSION }}-openssl-${{ env.OPENSSL3_VERSION }}
|
|
||||||
fail-on-cache-miss: true
|
|
||||||
- name: Setup extra environment variables
|
|
||||||
if: matrix.http3 == 'no-http3'
|
|
||||||
run: |
|
|
||||||
PKG_CONFIG_PATH="$PWD/openssl1/build/lib/pkgconfig:$PWD/openssl3/build/lib/pkgconfig:$PWD/wolfssl/build/lib/pkgconfig:$PKG_CONFIG_PATH"
|
|
||||||
LDFLAGS="$LDFLAGS -Wl,-rpath,$PWD/openssl1/build/lib -Wl,-rpath,$PWD/openssl3/build/lib"
|
|
||||||
|
|
||||||
echo 'PKG_CONFIG_PATH='"$PKG_CONFIG_PATH" >> $GITHUB_ENV
|
|
||||||
echo 'LDFLAGS='"$LDFLAGS" >> $GITHUB_ENV
|
|
||||||
- name: Setup extra environment variables for HTTP/3
|
|
||||||
if: matrix.http3 == 'http3'
|
|
||||||
run: |
|
|
||||||
PKG_CONFIG_PATH="$PWD/openssl1/build/lib/pkgconfig:$PWD/openssl3/build/lib/pkgconfig:$PWD/wolfssl/build/lib/pkgconfig:$PWD/nghttp3/build/lib/pkgconfig:$PWD/ngtcp2-openssl1/build/lib/pkgconfig:$PWD/ngtcp2-openssl3/build/lib/pkgconfig:$PWD/libbpf/build/lib64/pkgconfig:$PKG_CONFIG_PATH"
|
|
||||||
LDFLAGS="$LDFLAGS -Wl,-rpath,$PWD/openssl1/build/lib -Wl,-rpath,$PWD/openssl3/build/lib -Wl,-rpath,$PWD/libbpf/build/lib64"
|
|
||||||
EXTRA_AUTOTOOLS_OPTS="$EXTRA_AUTOTOOLS_OPTS --enable-http3"
|
|
||||||
EXTRA_CMAKE_OPTS="$EXTRA_CMAKE_OPTS -DENABLE_HTTP3=1"
|
|
||||||
|
|
||||||
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: Configure autotools
|
- name: Configure autotools
|
||||||
|
if: matrix.buildtool == 'autotools'
|
||||||
run: |
|
run: |
|
||||||
autoreconf -i
|
autoreconf -i
|
||||||
./configure --disable-dependency-tracking
|
./configure --enable-werror --with-mruby
|
||||||
- name: Make distribution and unpack
|
- name: Configure cmake
|
||||||
if: matrix.buildtool != 'distcheck'
|
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_BUILD_DIR='"$PWD" >> $GITHUB_ENV
|
|
||||||
- name: Configure cmake (Linux)
|
|
||||||
if: matrix.buildtool == 'cmake' && runner.os == 'Linux'
|
|
||||||
run: |
|
run: |
|
||||||
cd $NGHTTP2_BUILD_DIR
|
make distcheck \
|
||||||
|
DISTCHECK_CONFIGURE_FLAGS="--with-mruby --with-neverbleed --enable-werror CPPFLAGS=\"$CPPFLAGS\" LDFLAGS=\"$LDFLAGS\""
|
||||||
cmake -DENABLE_WERROR=1 -DWITH_MRUBY=1 -DWITH_NEVERBLEED=1 -DENABLE_APP=1 $EXTRA_CMAKE_OPTS -DCPPFLAGS="$CPPFLAGS" -DLDFLAGS="$LDFLAGS" -DBUILD_STATIC_LIBS=ON -DBUILD_TESTING=ON .
|
|
||||||
- name: Configure cmake (MacOS)
|
|
||||||
if: matrix.buildtool == 'cmake' && runner.os == 'macOS'
|
|
||||||
run: |
|
|
||||||
# This fixes infamous 'stdio.h not found' error.
|
|
||||||
echo 'SDKROOT='"$(xcrun --sdk macosx --show-sdk-path)" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
cd $NGHTTP2_BUILD_DIR
|
|
||||||
|
|
||||||
cmake -DENABLE_WERROR=1 -DWITH_MRUBY=1 -DENABLE_APP=1 $EXTRA_CMAKE_OPTS -DCPPFLAGS="$CPPFLAGS" -DLDFLAGS="$LDFLAGS" -DBUILD_STATIC_LIBS=ON -DBUILD_TESTING=ON .
|
|
||||||
- name: Build nghttp2 with autotools (Linux)
|
|
||||||
if: matrix.buildtool == 'autotools' && runner.os == 'Linux'
|
|
||||||
run: |
|
|
||||||
cd $NGHTTP2_BUILD_DIR
|
|
||||||
|
|
||||||
./configure --disable-dependency-tracking --with-mruby --with-neverbleed --with-libev --with-libbrotlienc --with-libbrotlidec --enable-werror $EXTRA_AUTOTOOLS_OPTS
|
|
||||||
make -j"$(nproc)" check
|
|
||||||
- name: Build nghttp2 with autotools (MacOS)
|
|
||||||
if: matrix.buildtool == 'autotools' && runner.os == 'macOS'
|
|
||||||
run: |
|
|
||||||
cd $NGHTTP2_BUILD_DIR
|
|
||||||
|
|
||||||
./configure --disable-dependency-tracking --with-mruby --with-libev --with-libbrotlienc --with-libbrotlidec --enable-werror $EXTRA_AUTOTOOLS_OPTS
|
|
||||||
make -j"$(sysctl -n hw.ncpu)" check
|
|
||||||
- name: Build nghttp2 with autotools (distcheck)
|
|
||||||
if: matrix.buildtool == 'distcheck'
|
|
||||||
run: |
|
|
||||||
make -j"$(nproc)" distcheck \
|
|
||||||
DISTCHECK_CONFIGURE_FLAGS="--with-mruby --with-neverbleed --with-libev --with-libbrotlienc --with-libbrotlidec --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_BUILD_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
|
|
||||||
- uses: actions/setup-go@v5
|
|
||||||
if: matrix.buildtool != 'distcheck'
|
|
||||||
with:
|
|
||||||
go-version: "1.22"
|
|
||||||
- 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 != 'distcheck'
|
if: matrix.buildtool == 'cmake'
|
||||||
run: |
|
run: |
|
||||||
cd $NGHTTP2_BUILD_DIR/integration-tests
|
cd integration-tests
|
||||||
make it
|
make itprep it
|
||||||
|
|
||||||
build-cross:
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
host: [x86_64-w64-mingw32, i686-w64-mingw32]
|
|
||||||
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
|
|
||||||
env:
|
|
||||||
HOST: ${{ matrix.host }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
submodules: recursive
|
|
||||||
- name: Prepare for i386
|
|
||||||
if: matrix.host == 'i686-w64-mingw32'
|
|
||||||
run: |
|
|
||||||
sudo dpkg --add-architecture i386
|
|
||||||
- name: Linux setup
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install \
|
|
||||||
gcc-mingw-w64 \
|
|
||||||
autoconf \
|
|
||||||
automake \
|
|
||||||
autotools-dev \
|
|
||||||
libtool \
|
|
||||||
pkg-config \
|
|
||||||
wine
|
|
||||||
- name: Configure autotools
|
|
||||||
run: |
|
|
||||||
autoreconf -i && \
|
|
||||||
./configure --disable-dependency-tracking --enable-werror \
|
|
||||||
--enable-lib-only --host="$HOST" \
|
|
||||||
CFLAGS="-g -O2 -D_WIN32_WINNT=0x0600" LIBS="-pthread"
|
|
||||||
- name: Build nghttp2
|
|
||||||
run: |
|
|
||||||
make -j$(nproc)
|
|
||||||
make -j$(nproc) check TESTS=""
|
|
||||||
- name: Run tests
|
|
||||||
run: |
|
|
||||||
export WINEPATH="/usr/${{ matrix.host }}/lib;$(winepath -w /usr/lib/x86_64-linux-gnu/wine/x86_64-windows)"
|
|
||||||
cd tests
|
|
||||||
wine main.exe
|
|
||||||
|
|
||||||
build-windows:
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
arch: [x86, x64]
|
|
||||||
include:
|
|
||||||
- arch: x86
|
|
||||||
platform: Win32
|
|
||||||
- arch: x64
|
|
||||||
platform: x64
|
|
||||||
|
|
||||||
runs-on: windows-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
submodules: recursive
|
|
||||||
- uses: microsoft/setup-msbuild@v2
|
|
||||||
- name: Configure cmake
|
|
||||||
run: cmake -B build -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_GENERATOR_PLATFORM=${{ matrix.platform }} -DVCPKG_TARGET_TRIPLET=${{ matrix.arch}}-windows -DBUILD_STATIC_LIBS=ON -DBUILD_TESTING=ON
|
|
||||||
- name: Build nghttp2
|
|
||||||
run: |
|
|
||||||
cmake --build build
|
|
||||||
cmake --build build --target check
|
|
||||||
|
|
||||||
release:
|
|
||||||
if: github.ref_type == 'tag'
|
|
||||||
|
|
||||||
needs:
|
|
||||||
- build
|
|
||||||
- build-cross
|
|
||||||
- build-windows
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
submodules: recursive
|
|
||||||
- name: Make artifacts
|
|
||||||
run: |
|
|
||||||
ver='${{ github.ref_name }}'
|
|
||||||
|
|
||||||
prev_ver=$(git tag --sort v:refname | grep -v -F "${ver}" | \
|
|
||||||
grep 'v[0-9]\+\.[0-9]\+\.0' | tail -n1)
|
|
||||||
|
|
||||||
echo -n "$GPG_KEY" | gpg --batch --pinentry-mode loopback --import
|
|
||||||
./makerelease.sh "${ver}" "${prev_ver}"
|
|
||||||
env:
|
|
||||||
GPG_KEY: ${{ secrets.GPG_KEY }}
|
|
||||||
GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
|
|
||||||
- name: Make release
|
|
||||||
uses: actions/github-script@v7
|
|
||||||
with:
|
|
||||||
script: |
|
|
||||||
const fs = require('fs')
|
|
||||||
|
|
||||||
let ver = '${{ github.ref_name }}'
|
|
||||||
|
|
||||||
let {data: release} = await github.rest.repos.createRelease({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
tag_name: ver,
|
|
||||||
name: `nghttp2 ${ver}`,
|
|
||||||
draft: true,
|
|
||||||
generate_release_notes: true,
|
|
||||||
discussion_category_name: 'Announcements',
|
|
||||||
})
|
|
||||||
|
|
||||||
let v = ver.substring(1)
|
|
||||||
|
|
||||||
let files = [
|
|
||||||
'checksums.txt',
|
|
||||||
`nghttp2-${v}.tar.bz2`,
|
|
||||||
`nghttp2-${v}.tar.bz2.asc`,
|
|
||||||
`nghttp2-${v}.tar.gz`,
|
|
||||||
`nghttp2-${v}.tar.gz.asc`,
|
|
||||||
`nghttp2-${v}.tar.xz`,
|
|
||||||
`nghttp2-${v}.tar.xz.asc`,
|
|
||||||
]
|
|
||||||
|
|
||||||
await Promise.all(files.map(elem =>
|
|
||||||
github.rest.repos.uploadReleaseAsset({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
release_id: release.id,
|
|
||||||
name: elem,
|
|
||||||
data: fs.readFileSync(elem),
|
|
||||||
})
|
|
||||||
))
|
|
||||||
|
|||||||
24
.github/workflows/docker.yaml
vendored
24
.github/workflows/docker.yaml
vendored
@@ -1,24 +0,0 @@
|
|||||||
name: docker-build
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
paths:
|
|
||||||
- docker/Dockerfile
|
|
||||||
branches:
|
|
||||||
- '**'
|
|
||||||
|
|
||||||
permissions: read-all
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v3
|
|
||||||
- name: Build
|
|
||||||
uses: docker/build-push-action@v6
|
|
||||||
with:
|
|
||||||
context: docker
|
|
||||||
build-args: NGHTTP2_BRANCH=${{ github.ref_name }}
|
|
||||||
10
.github/workflows/fuzz.yml
vendored
10
.github/workflows/fuzz.yml
vendored
@@ -1,17 +1,9 @@
|
|||||||
name: CIFuzz
|
name: CIFuzz
|
||||||
on: [pull_request]
|
on: [pull_request]
|
||||||
permissions: read-all
|
|
||||||
jobs:
|
jobs:
|
||||||
Fuzzing:
|
Fuzzing:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: LLVM workaround
|
|
||||||
run: |
|
|
||||||
# https://github.com/actions/runner-images/issues/9491#issuecomment-1989718917
|
|
||||||
# Asan in llvm 14 provided in ubuntu 22.04 is incompatible with
|
|
||||||
# high-entropy ASLR in much newer kernels that GitHub runners are
|
|
||||||
# using leading to random crashes: https://reviews.llvm.org/D148280
|
|
||||||
sudo sysctl vm.mmap_rnd_bits=28
|
|
||||||
- name: Build Fuzzers
|
- name: Build Fuzzers
|
||||||
uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master
|
uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master
|
||||||
with:
|
with:
|
||||||
@@ -24,7 +16,7 @@ jobs:
|
|||||||
fuzz-seconds: 600
|
fuzz-seconds: 600
|
||||||
dry-run: false
|
dry-run: false
|
||||||
- name: Upload Crash
|
- name: Upload Crash
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v1
|
||||||
if: failure()
|
if: failure()
|
||||||
with:
|
with:
|
||||||
name: artifacts
|
name: artifacts
|
||||||
|
|||||||
20
.github/workflows/stale.yaml
vendored
20
.github/workflows/stale.yaml
vendored
@@ -1,20 +0,0 @@
|
|||||||
name: 'Close stale issues'
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: '30 1 * * *'
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
issues: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
stale:
|
|
||||||
runs-on: ubuntu-24.04
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/stale@v9
|
|
||||||
with:
|
|
||||||
stale-issue-message: 'This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 7 days.'
|
|
||||||
days-before-stale: 30
|
|
||||||
days-before-close: 7
|
|
||||||
exempt-all-milestones: true
|
|
||||||
9
.gitignore
vendored
9
.gitignore
vendored
@@ -42,7 +42,6 @@ rules.ninja
|
|||||||
lib*.so
|
lib*.so
|
||||||
lib*.so.*
|
lib*.so.*
|
||||||
lib*.a
|
lib*.a
|
||||||
|
|
||||||
# generated by "make test" with cmake
|
# generated by "make test" with cmake
|
||||||
Testing/
|
Testing/
|
||||||
|
|
||||||
@@ -55,10 +54,4 @@ _VC_ROOT/
|
|||||||
.depend.MSVC
|
.depend.MSVC
|
||||||
*.pyd
|
*.pyd
|
||||||
*.egg-info/
|
*.egg-info/
|
||||||
|
python/nghttp2.c
|
||||||
# Build Directories
|
|
||||||
build/
|
|
||||||
|
|
||||||
# IDEs
|
|
||||||
cmake-*
|
|
||||||
.idea/
|
|
||||||
|
|||||||
5
.gitmodules
vendored
5
.gitmodules
vendored
@@ -4,7 +4,4 @@
|
|||||||
[submodule "third-party/neverbleed"]
|
[submodule "third-party/neverbleed"]
|
||||||
path = third-party/neverbleed
|
path = third-party/neverbleed
|
||||||
url = https://github.com/tatsuhiro-t/neverbleed.git
|
url = https://github.com/tatsuhiro-t/neverbleed.git
|
||||||
branch = nghttp2
|
branch = openssl111fix
|
||||||
[submodule "tests/munit"]
|
|
||||||
path = tests/munit
|
|
||||||
url = https://github.com/ngtcp2/munit
|
|
||||||
|
|||||||
89
.travis.yml
Normal file
89
.travis.yml
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
dist: xenial
|
||||||
|
os:
|
||||||
|
- linux
|
||||||
|
compiler:
|
||||||
|
- clang
|
||||||
|
- gcc
|
||||||
|
env:
|
||||||
|
matrix:
|
||||||
|
- CI_BUILD=cmake
|
||||||
|
- CI_BUILD=autotools
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- os: osx
|
||||||
|
compiler: clang
|
||||||
|
osx_image: xcode10.2
|
||||||
|
env: CI_BUILD=autotools
|
||||||
|
language: cpp
|
||||||
|
sudo: required
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
sources:
|
||||||
|
- ubuntu-toolchain-r-test
|
||||||
|
packages:
|
||||||
|
- g++-8
|
||||||
|
- autoconf
|
||||||
|
- automake
|
||||||
|
- autotools-dev
|
||||||
|
- libtool
|
||||||
|
- pkg-config
|
||||||
|
- zlib1g-dev
|
||||||
|
- libcunit1-dev
|
||||||
|
- libssl-dev
|
||||||
|
- libxml2-dev
|
||||||
|
- libev-dev
|
||||||
|
- libevent-dev
|
||||||
|
- libjansson-dev
|
||||||
|
- libjemalloc-dev
|
||||||
|
- libc-ares-dev
|
||||||
|
- cmake
|
||||||
|
- cmake-data
|
||||||
|
homebrew:
|
||||||
|
packages:
|
||||||
|
- libev
|
||||||
|
- libevent
|
||||||
|
- c-ares
|
||||||
|
- cunit
|
||||||
|
- libressl
|
||||||
|
before_install:
|
||||||
|
- $CC --version
|
||||||
|
- if [ "$CXX" = "g++" ]; then export CXX="g++-8" CC="gcc-8"; fi
|
||||||
|
- $CC --version
|
||||||
|
- go version
|
||||||
|
- cmake --version
|
||||||
|
before_script:
|
||||||
|
- |
|
||||||
|
if [ "$TRAVIS_OS_NAME" = "linux" ]; then
|
||||||
|
CPPFLAGS="-fsanitize=address" LDFLAGS="-fsanitize=address -fuse-ld=gold"
|
||||||
|
fi
|
||||||
|
- |
|
||||||
|
if [ "$TRAVIS_OS_NAME" = "osx" ]; then
|
||||||
|
PKG_CONFIG_PATH="/usr/local/opt/libressl/lib/pkgconfig:/usr/local/opt/libxml2/lib/pkgconfig"
|
||||||
|
fi
|
||||||
|
# Now build nghttp2
|
||||||
|
- git submodule update --init
|
||||||
|
- |
|
||||||
|
if [ "$CI_BUILD" = "autotools" ]; then
|
||||||
|
autoreconf -i && ./configure --with-mruby PKG_CONFIG_PATH=$PKG_CONFIG_PATH
|
||||||
|
fi
|
||||||
|
- |
|
||||||
|
if [ "$CI_BUILD" = "cmake" ]; then
|
||||||
|
cmake -DENABLE_WERROR=1 -DWITH_MRUBY=1 -DWITH_NEVERBLEED=1
|
||||||
|
fi
|
||||||
|
script:
|
||||||
|
- |
|
||||||
|
if [ "$CI_BUILD" = "autotools" ]; then
|
||||||
|
make distcheck DISTCHECK_CONFIGURE_FLAGS="--with-mruby --with-neverbleed --enable-werror CPPFLAGS=$CPPFLAGS LDFLAGS=\"$LDFLAGS\" PKG_CONFIG_PATH=$PKG_CONFIG_PATH"
|
||||||
|
fi
|
||||||
|
- |
|
||||||
|
if [ "$CI_BUILD" = "cmake" ]; then
|
||||||
|
make && make check
|
||||||
|
fi
|
||||||
|
- |
|
||||||
|
if [ "$CI_BUILD" = "cmake" ]; then
|
||||||
|
# Integration tests for nghttpx; autotools build erases build
|
||||||
|
# for packaging test.
|
||||||
|
cd integration-tests
|
||||||
|
export GO111MODULE=on
|
||||||
|
make it
|
||||||
|
fi
|
||||||
34
AUTHORS
34
AUTHORS
@@ -17,11 +17,8 @@ github issues [2].
|
|||||||
Adam Gołębiowski
|
Adam Gołębiowski
|
||||||
Alek Storm
|
Alek Storm
|
||||||
Alex Nalivko
|
Alex Nalivko
|
||||||
Alexandr Vlasov
|
|
||||||
Alexandros Konstantinakis-Karmis
|
Alexandros Konstantinakis-Karmis
|
||||||
Alexis La Goutte
|
Alexis La Goutte
|
||||||
Alyssa Ross
|
|
||||||
Amir Livneh
|
|
||||||
Amir Pakdel
|
Amir Pakdel
|
||||||
Anders Bakken
|
Anders Bakken
|
||||||
Andreas Pohl
|
Andreas Pohl
|
||||||
@@ -30,41 +27,29 @@ Andy Davies
|
|||||||
Angus Gratton
|
Angus Gratton
|
||||||
Anna Henningsen
|
Anna Henningsen
|
||||||
Ant Bryan
|
Ant Bryan
|
||||||
Anthony Alayo
|
|
||||||
Asra Ali
|
|
||||||
Benedikt Christoph Wolters
|
Benedikt Christoph Wolters
|
||||||
Benjamin Peterson
|
Benjamin Peterson
|
||||||
Bernard Spil
|
Bernard Spil
|
||||||
Bernhard Walle
|
|
||||||
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
|
||||||
Deel
|
|
||||||
Dimitris Apostolou
|
|
||||||
Dmitri Tikhonov
|
|
||||||
Dmitriy Vetutnev
|
Dmitriy Vetutnev
|
||||||
Don
|
Don
|
||||||
Dylan Plecki
|
Dylan Plecki
|
||||||
Etienne Cimon
|
Etienne Cimon
|
||||||
Fabian Möller
|
Fabian Möller
|
||||||
Fabian Wiesel
|
Fabian Wiesel
|
||||||
Fred Sundvik
|
|
||||||
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
|
||||||
@@ -74,8 +59,6 @@ Jay Satiro
|
|||||||
Jeff 'Raid' Baitis
|
Jeff 'Raid' Baitis
|
||||||
Jianqing Wang
|
Jianqing Wang
|
||||||
Jim Morrison
|
Jim Morrison
|
||||||
Jiwoo Park
|
|
||||||
Jonas Kvinge
|
|
||||||
Josh Braegger
|
Josh Braegger
|
||||||
José F. Calcerrada
|
José F. Calcerrada
|
||||||
Kamil Dudka
|
Kamil Dudka
|
||||||
@@ -86,40 +69,28 @@ Kit Chan
|
|||||||
Kyle Schomp
|
Kyle Schomp
|
||||||
LazyHamster
|
LazyHamster
|
||||||
Leo Neat
|
Leo Neat
|
||||||
Lorenz Nickel
|
|
||||||
Lucas Pardue
|
Lucas Pardue
|
||||||
MATSUMOTO Ryosuke
|
MATSUMOTO Ryosuke
|
||||||
Marc Bachmann
|
Marc Bachmann
|
||||||
Marcelo Trylesinski
|
|
||||||
Mark Boddington
|
|
||||||
Matt Rudary
|
Matt Rudary
|
||||||
Matt Way
|
Matt Way
|
||||||
Michael Kaufmann
|
|
||||||
Mike Conlen
|
Mike Conlen
|
||||||
Mike Frysinger
|
Mike Frysinger
|
||||||
Mike Lothian
|
Mike Lothian
|
||||||
Nicholas Hurley
|
Nicholas Hurley
|
||||||
Nora Shoemaker
|
Nora Shoemaker
|
||||||
Paweł Wegner
|
|
||||||
Pedro Santos
|
Pedro Santos
|
||||||
Peeyush Aggarwal
|
Peeyush Aggarwal
|
||||||
Peter Wu
|
Peter Wu
|
||||||
Piotr Sikora
|
Piotr Sikora
|
||||||
PufferOverflow
|
|
||||||
Raul Gutierrez Segales
|
Raul Gutierrez Segales
|
||||||
Remo E
|
Remo E
|
||||||
Renaud
|
|
||||||
Reza Tavakoli
|
Reza Tavakoli
|
||||||
Richard Wolfert
|
Richard Wolfert
|
||||||
Rick Lei
|
Rick Lei
|
||||||
Ross Smith II
|
Ross Smith II
|
||||||
Rudi Heitbaum
|
|
||||||
Ryan Carsten Schmidt
|
|
||||||
Ryo Ota
|
|
||||||
Scott Mitchell
|
Scott Mitchell
|
||||||
Sebastiaan Deckers
|
Sebastiaan Deckers
|
||||||
Sergey Fedorov
|
|
||||||
Shelley Vohr
|
|
||||||
Simon Frankenberger
|
Simon Frankenberger
|
||||||
Simone Basso
|
Simone Basso
|
||||||
Soham Sinha
|
Soham Sinha
|
||||||
@@ -131,10 +102,8 @@ Syohei YOSHIDA
|
|||||||
Tapanito
|
Tapanito
|
||||||
Tatsuhiko Kubo
|
Tatsuhiko Kubo
|
||||||
Tatsuhiro Tsujikawa
|
Tatsuhiro Tsujikawa
|
||||||
Thomas Devoogdt
|
|
||||||
Tobias Geerinckx-Rice
|
Tobias Geerinckx-Rice
|
||||||
Tom Harwood
|
Tom Harwood
|
||||||
Tomas Krizek
|
|
||||||
Tomasz Buchert
|
Tomasz Buchert
|
||||||
Tomasz Torcz
|
Tomasz Torcz
|
||||||
Vernon Tang
|
Vernon Tang
|
||||||
@@ -153,14 +122,11 @@ dalf
|
|||||||
dawg
|
dawg
|
||||||
es
|
es
|
||||||
fangdingjun
|
fangdingjun
|
||||||
hrxi
|
|
||||||
jwchoi
|
jwchoi
|
||||||
kumagi
|
kumagi
|
||||||
lhuang04
|
|
||||||
lstefani
|
lstefani
|
||||||
makovich
|
makovich
|
||||||
mod-h2-dev
|
mod-h2-dev
|
||||||
moparisthebest
|
moparisthebest
|
||||||
robaho
|
|
||||||
snnn
|
snnn
|
||||||
yuuki-kodama
|
yuuki-kodama
|
||||||
|
|||||||
331
CMakeLists.txt
331
CMakeLists.txt
@@ -22,15 +22,15 @@
|
|||||||
# 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.
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 3.14)
|
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.64.0 LANGUAGES C)
|
project(nghttp2 VERSION 1.41.90)
|
||||||
|
|
||||||
# See versioning rule:
|
# See versioning rule:
|
||||||
# https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
|
# http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
|
||||||
set(LT_CURRENT 42)
|
set(LT_CURRENT 34)
|
||||||
set(LT_REVISION 3)
|
set(LT_REVISION 0)
|
||||||
set(LT_AGE 28)
|
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)
|
||||||
@@ -51,47 +51,17 @@ if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
include(GNUInstallDirs)
|
include(GNUInstallDirs)
|
||||||
include(CMakeDependentOption)
|
|
||||||
|
|
||||||
# For documentation
|
# For Python bindings and documentation
|
||||||
find_package(Python3 COMPONENTS Interpreter)
|
# (Must be called before PythonLibs for matching versions.)
|
||||||
|
find_package(PythonInterp)
|
||||||
|
|
||||||
# Auto-detection of features that can be toggled
|
# Auto-detection of features that can be toggled
|
||||||
if(NOT ENABLE_LIB_ONLY)
|
find_package(OpenSSL 1.0.1)
|
||||||
enable_language(CXX)
|
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)
|
if(OPENSSL_FOUND AND LIBEV_FOUND AND ZLIB_FOUND)
|
||||||
find_package(Libbrotlienc 1.0.9)
|
|
||||||
find_package(Libbrotlidec 1.0.9)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WITH_WOLFSSL)
|
|
||||||
find_package(WolfSSL 5.7.0)
|
|
||||||
else()
|
|
||||||
find_package(OpenSSL 1.1.1)
|
|
||||||
endif()
|
|
||||||
find_package(Libngtcp2 1.0.0)
|
|
||||||
if(OPENSSL_FOUND)
|
|
||||||
find_package(Libngtcp2_crypto_quictls 1.0.0)
|
|
||||||
if(LIBNGTCP2_CRYPTO_QUICTLS_FOUND)
|
|
||||||
set(HAVE_LIBNGTCP2_CRYPTO_QUICTLS 1)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
if(WOLFSSL_FOUND)
|
|
||||||
find_package(Libngtcp2_crypto_wolfssl 1.0.0)
|
|
||||||
if(LIBNGTCP2_CRYPTO_WOLFSSL_FOUND)
|
|
||||||
set(HAVE_LIBNGTCP2_CRYPTO_WOLFSSL 1)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
find_package(Libnghttp3 1.1.0)
|
|
||||||
if(WITH_LIBBPF)
|
|
||||||
find_package(Libbpf 0.7.0)
|
|
||||||
if(NOT LIBBPF_FOUND)
|
|
||||||
message(FATAL_ERROR "libbpf was requested (WITH_LIBBPF=1) but not found.")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
if((OPENSSL_FOUND OR WOLFSSL_FOUND) AND LIBEV_FOUND AND ZLIB_FOUND)
|
|
||||||
set(ENABLE_APP_DEFAULT ON)
|
set(ENABLE_APP_DEFAULT ON)
|
||||||
else()
|
else()
|
||||||
set(ENABLE_APP_DEFAULT OFF)
|
set(ENABLE_APP_DEFAULT OFF)
|
||||||
@@ -100,8 +70,15 @@ find_package(Systemd 209)
|
|||||||
find_package(Jansson 2.5)
|
find_package(Jansson 2.5)
|
||||||
set(ENABLE_HPACK_TOOLS_DEFAULT ${JANSSON_FOUND})
|
set(ENABLE_HPACK_TOOLS_DEFAULT ${JANSSON_FOUND})
|
||||||
# 2.0.8 is required because we use evconnlistener_set_error_cb()
|
# 2.0.8 is required because we use evconnlistener_set_error_cb()
|
||||||
find_package(Libevent 2.0.8 COMPONENTS core extra openssl)
|
find_package(Libevent 2.0.8 COMPONENTS libevent openssl)
|
||||||
set(ENABLE_EXAMPLES_DEFAULT ${LIBEVENT_OPENSSL_FOUND})
|
set(ENABLE_EXAMPLES_DEFAULT ${LIBEVENT_OPENSSL_FOUND})
|
||||||
|
find_package(Cython)
|
||||||
|
find_package(PythonLibs)
|
||||||
|
if(CYTHON_FOUND AND PYTHONLIBS_FOUND)
|
||||||
|
set(ENABLE_PYTHON_BINDINGS_DEFAULT ON)
|
||||||
|
else()
|
||||||
|
set(ENABLE_PYTHON_BINDINGS_DEFAULT OFF)
|
||||||
|
endif()
|
||||||
|
|
||||||
find_package(LibXml2 2.6.26)
|
find_package(LibXml2 2.6.26)
|
||||||
set(WITH_LIBXML2_DEFAULT ${LIBXML2_FOUND})
|
set(WITH_LIBXML2_DEFAULT ${LIBXML2_FOUND})
|
||||||
@@ -110,7 +87,8 @@ set(WITH_JEMALLOC_DEFAULT ${JEMALLOC_FOUND})
|
|||||||
|
|
||||||
include(CMakeOptions.txt)
|
include(CMakeOptions.txt)
|
||||||
|
|
||||||
if(ENABLE_LIB_ONLY AND (ENABLE_APP OR ENABLE_HPACK_TOOLS OR ENABLE_EXAMPLES))
|
if(ENABLE_LIB_ONLY AND (ENABLE_APP OR ENABLE_HPACK_TOOLS OR ENABLE_EXAMPLES OR
|
||||||
|
ENABLE_PYTHON_BINDINGS))
|
||||||
# Remember when disabled options are disabled for later diagnostics.
|
# Remember when disabled options are disabled for later diagnostics.
|
||||||
set(ENABLE_LIB_ONLY_DISABLED_OTHERS 1)
|
set(ENABLE_LIB_ONLY_DISABLED_OTHERS 1)
|
||||||
else()
|
else()
|
||||||
@@ -120,6 +98,7 @@ if(ENABLE_LIB_ONLY)
|
|||||||
set(ENABLE_APP OFF)
|
set(ENABLE_APP OFF)
|
||||||
set(ENABLE_HPACK_TOOLS OFF)
|
set(ENABLE_HPACK_TOOLS OFF)
|
||||||
set(ENABLE_EXAMPLES OFF)
|
set(ENABLE_EXAMPLES OFF)
|
||||||
|
set(ENABLE_PYTHON_BINDINGS OFF)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Do not disable assertions based on CMAKE_BUILD_TYPE.
|
# Do not disable assertions based on CMAKE_BUILD_TYPE.
|
||||||
@@ -136,36 +115,49 @@ else()
|
|||||||
set(HINT_NORETURN)
|
set(HINT_NORETURN)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT ENABLE_LIB_ONLY)
|
include(ExtractValidFlags)
|
||||||
include(ExtractValidFlags)
|
foreach(_cxx1x_flag -std=c++14)
|
||||||
foreach(_cxx1x_flag -std=c++20)
|
extract_valid_cxx_flags(_cxx1x_flag_supported ${_cxx1x_flag})
|
||||||
extract_valid_cxx_flags(_cxx1x_flag_supported ${_cxx1x_flag})
|
if(_cxx1x_flag_supported)
|
||||||
if(_cxx1x_flag_supported)
|
set(CXX1XCXXFLAGS ${_cxx1x_flag})
|
||||||
set(CXX1XCXXFLAGS ${_cxx1x_flag})
|
break()
|
||||||
break()
|
endif()
|
||||||
endif()
|
endforeach()
|
||||||
endforeach()
|
|
||||||
|
include(CMakePushCheckState)
|
||||||
|
include(CheckCXXSourceCompiles)
|
||||||
|
cmake_push_check_state()
|
||||||
|
set(CMAKE_REQUIRED_DEFINITIONS "${CXX1XCXXFLAGS}")
|
||||||
|
# Check that std::future is available.
|
||||||
|
check_cxx_source_compiles("
|
||||||
|
#include <vector>
|
||||||
|
#include <future>
|
||||||
|
int main() { std::vector<std::future<int>> v; }" HAVE_STD_FUTURE)
|
||||||
|
# Check that std::map::emplace is available for g++-4.7.
|
||||||
|
check_cxx_source_compiles("
|
||||||
|
#include <map>
|
||||||
|
int main() { std::map<int, int>().emplace(1, 2); }" HAVE_STD_MAP_EMPLACE)
|
||||||
|
cmake_pop_check_state()
|
||||||
|
|
||||||
include(CMakePushCheckState)
|
|
||||||
include(CheckCXXSourceCompiles)
|
|
||||||
cmake_push_check_state()
|
|
||||||
set(CMAKE_REQUIRED_DEFINITIONS "${CXX1XCXXFLAGS}")
|
|
||||||
# Check that std::future is available.
|
|
||||||
check_cxx_source_compiles("
|
|
||||||
#include <vector>
|
|
||||||
#include <future>
|
|
||||||
int main() { std::vector<std::future<int>> v; }" HAVE_STD_FUTURE)
|
|
||||||
# Check that std::map::emplace is available for g++-4.7.
|
|
||||||
check_cxx_source_compiles("
|
|
||||||
#include <map>
|
|
||||||
int main() { std::map<int, int>().emplace(1, 2); }" HAVE_STD_MAP_EMPLACE)
|
|
||||||
cmake_pop_check_state()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Checks for libraries.
|
# Checks for libraries.
|
||||||
# Additional libraries required for programs under src directory.
|
# Additional libraries required for programs under src directory.
|
||||||
set(APP_LIBRARIES)
|
set(APP_LIBRARIES)
|
||||||
|
|
||||||
|
if(ENABLE_PYTHON_BINDINGS)
|
||||||
|
if(NOT (CYTHON_FOUND AND PYTHONLIBS_FOUND))
|
||||||
|
message(FATAL_ERROR "python bindings were requested "
|
||||||
|
"(ENABLE_PYTHON_BINDINGS=1) but dependencies are not met.")
|
||||||
|
endif()
|
||||||
|
if(NOT PYTHON_VERSION_STRING STREQUAL PYTHONLIBS_VERSION_STRING)
|
||||||
|
message(FATAL_ERROR
|
||||||
|
"Python executable and library must have the same version!"
|
||||||
|
" Found Python ${PYTHON_VERSION_STRING} and"
|
||||||
|
" PythonLibs ${PYTHONLIBS_VERSION_STRING}"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
set(CMAKE_THREAD_PREFER_PTHREAD 1)
|
set(CMAKE_THREAD_PREFER_PTHREAD 1)
|
||||||
find_package(Threads)
|
find_package(Threads)
|
||||||
if(CMAKE_USE_PTHREADS_INIT)
|
if(CMAKE_USE_PTHREADS_INIT)
|
||||||
@@ -175,54 +167,28 @@ 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.
|
||||||
# XXX shouldn't ${CMAKE_DL_LIBS} be appended to OPENSSL_LIBRARIES instead of
|
# XXX shouldn't ${CMAKE_DL_LIBS} be appended to OPENSSL_LIBRARIES instead of
|
||||||
# APP_LIBRARIES if it is really specific to OpenSSL?
|
# APP_LIBRARIES if it is really specific to OpenSSL?
|
||||||
|
|
||||||
|
find_package(CUnit 2.1)
|
||||||
enable_testing()
|
enable_testing()
|
||||||
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND})
|
set(HAVE_CUNIT ${CUNIT_FOUND})
|
||||||
|
if(HAVE_CUNIT)
|
||||||
|
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND})
|
||||||
|
endif()
|
||||||
|
|
||||||
# openssl (for src)
|
# openssl (for src)
|
||||||
include(CheckSymbolExists)
|
|
||||||
set(HAVE_OPENSSL ${OPENSSL_FOUND})
|
set(HAVE_OPENSSL ${OPENSSL_FOUND})
|
||||||
if(NOT ENABLE_LIB_ONLY AND 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()
|
|
||||||
if(ENABLE_HTTP3)
|
|
||||||
check_symbol_exists(SSL_provide_quic_data "openssl/ssl.h" HAVE_SSL_PROVIDE_QUIC_DATA)
|
|
||||||
if(NOT HAVE_SSL_PROVIDE_QUIC_DATA)
|
|
||||||
message(WARNING "OpenSSL in ${OPENSSL_LIBRARIES} does not have SSL_provide_quic_data. HTTP/3 support cannot be enabled")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
cmake_pop_check_state()
|
|
||||||
else()
|
else()
|
||||||
set(OPENSSL_INCLUDE_DIRS "")
|
set(OPENSSL_INCLUDE_DIRS "")
|
||||||
set(OPENSSL_LIBRARIES "")
|
set(OPENSSL_LIBRARIES "")
|
||||||
endif()
|
endif()
|
||||||
# wolfSSL (for src)
|
|
||||||
set(HAVE_WOLFSSL ${WOLFSSL_FOUND})
|
|
||||||
if(WOLFSSL_FOUND)
|
|
||||||
set(WOLFSSL_INCLUDE_DIRS ${WOLFSSL_INCLUDE_DIR})
|
|
||||||
cmake_push_check_state()
|
|
||||||
set(CMAKE_REQUIRED_INCLUDES "${WOLFSSL_INCLUDE_DIR}")
|
|
||||||
set(CMAKE_REQUIRED_LIBRARIES "${WOLFSSL_LIBRARIES}")
|
|
||||||
check_symbol_exists(SSL_provide_quic_data "wolfssl/options.h;wolfssl/ssl.h" HAVE_WOLFSSL_SSL_PROVIDE_QUIC_DATA)
|
|
||||||
if(NOT HAVE_WOLFSSL_SSL_PROVIDE_QUIC_DATA)
|
|
||||||
message(WARNING "wolfSSL in ${WOLFSSL_LIBRARIES} does not have SSL_provide_quic_data. HTTP/3 support cannot be enabled")
|
|
||||||
endif()
|
|
||||||
cmake_pop_check_state()
|
|
||||||
else()
|
|
||||||
set(WOLFSSL_INCLUDE_DIRS "")
|
|
||||||
set(WOLFSSL_LIBRARIES "")
|
|
||||||
endif()
|
|
||||||
# libev (for src)
|
# libev (for src)
|
||||||
set(HAVE_LIBEV ${LIBEV_FOUND})
|
set(HAVE_LIBEV ${LIBEV_FOUND})
|
||||||
set(HAVE_ZLIB ${ZLIB_FOUND})
|
set(HAVE_ZLIB ${ZLIB_FOUND})
|
||||||
@@ -253,53 +219,27 @@ endif()
|
|||||||
# jemalloc
|
# jemalloc
|
||||||
set(HAVE_JEMALLOC ${JEMALLOC_FOUND})
|
set(HAVE_JEMALLOC ${JEMALLOC_FOUND})
|
||||||
|
|
||||||
# libbrotli (for src)
|
if(ENABLE_ASIO_LIB)
|
||||||
set(HAVE_LIBBROTLIENC ${LIBBROTLIENC_FOUND})
|
find_package(Boost 1.54.0 REQUIRED system thread)
|
||||||
set(HAVE_LIBBROTLIDEC ${LIBBROTLIDEC_FOUND})
|
|
||||||
if(LIBBROTLIENC_FOUND AND LIBBROTLIDEC_FOUND)
|
|
||||||
set(HAVE_LIBBROTLI 1)
|
|
||||||
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()
|
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 OR WOLFSSL_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 libngtcp2 + (quictls/openssl +
|
|
||||||
# libngtcp2_crypto_quictls or wolfSSL + libngtcp2_crypto_wolfssl) and
|
|
||||||
# libnghttp3.
|
|
||||||
if(ENABLE_HTTP3 AND NOT (LIBNGTCP2_FOUND AND LIBNGHTTP3_FOUND AND
|
|
||||||
((HAVE_SSL_PROVIDE_QUIC_DATA AND LIBNGTCP2_CRYPTO_QUICTLS_FOUND) OR
|
|
||||||
(HAVE_WOLFSSL_SSL_PROVIDE_QUIC_DATA AND LIBNGTCP2_CRYPTO_WOLFSSL_FOUND))))
|
|
||||||
message(FATAL_ERROR "HTTP/3 was requested (ENABLE_HTTP3=1) but dependencies are not met.")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# HPACK tools requires jansson
|
# HPACK tools requires jansson
|
||||||
if(ENABLE_HPACK_TOOLS AND NOT HAVE_JANSSON)
|
if(ENABLE_HPACK_TOOLS AND NOT HAVE_JANSSON)
|
||||||
message(FATAL_ERROR "HPACK tools were requested (ENABLE_HPACK_TOOLS=1) but dependencies are not met.")
|
message(FATAL_ERROR "HPACK tools were requested (ENABLE_HPACK_TOOLS=1) but dependencies are not met.")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# examples
|
# C++ library libnghttp2_asio
|
||||||
if(ENABLE_EXAMPLES AND NOT (OPENSSL_FOUND AND LIBEVENT_OPENSSL_FOUND))
|
if(ENABLE_EXAMPLES AND NOT (OPENSSL_FOUND AND LIBEVENT_OPENSSL_FOUND))
|
||||||
message(FATAL_ERROR "examples were requested (ENABLE_EXAMPLES=1) but dependencies are not met.")
|
message(FATAL_ERROR "examples were requested (ENABLE_EXAMPLES=1) but dependencies are not met.")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# third-party http-parser only be built when needed
|
# third-party http-parser only be built when needed
|
||||||
if(ENABLE_EXAMPLES OR ENABLE_APP OR ENABLE_HPACK_TOOLS)
|
if(ENABLE_EXAMPLES OR ENABLE_APP OR ENABLE_HPACK_TOOLS OR ENABLE_ASIO_LIB)
|
||||||
set(ENABLE_THIRD_PARTY 1)
|
set(ENABLE_THIRD_PARTY 1)
|
||||||
# mruby (for src/nghttpx)
|
# mruby (for src/nghttpx)
|
||||||
set(HAVE_MRUBY ${WITH_MRUBY})
|
set(HAVE_MRUBY ${WITH_MRUBY})
|
||||||
@@ -317,13 +257,12 @@ check_include_file("inttypes.h" HAVE_INTTYPES_H)
|
|||||||
check_include_file("limits.h" HAVE_LIMITS_H)
|
check_include_file("limits.h" HAVE_LIMITS_H)
|
||||||
check_include_file("netdb.h" HAVE_NETDB_H)
|
check_include_file("netdb.h" HAVE_NETDB_H)
|
||||||
check_include_file("netinet/in.h" HAVE_NETINET_IN_H)
|
check_include_file("netinet/in.h" HAVE_NETINET_IN_H)
|
||||||
check_include_file("netinet/ip.h" HAVE_NETINET_IP_H)
|
|
||||||
check_include_file("pwd.h" HAVE_PWD_H)
|
check_include_file("pwd.h" HAVE_PWD_H)
|
||||||
check_include_file("sys/socket.h" HAVE_SYS_SOCKET_H)
|
check_include_file("sys/socket.h" HAVE_SYS_SOCKET_H)
|
||||||
check_include_file("sys/time.h" HAVE_SYS_TIME_H)
|
check_include_file("sys/time.h" HAVE_SYS_TIME_H)
|
||||||
check_include_file("syslog.h" HAVE_SYSLOG_H)
|
check_include_file("syslog.h" HAVE_SYSLOG_H)
|
||||||
|
check_include_file("time.h" HAVE_TIME_H)
|
||||||
check_include_file("unistd.h" HAVE_UNISTD_H)
|
check_include_file("unistd.h" HAVE_UNISTD_H)
|
||||||
check_include_file("windows.h" HAVE_WINDOWS_H)
|
|
||||||
|
|
||||||
include(CheckTypeSize)
|
include(CheckTypeSize)
|
||||||
# Checks for typedefs, structures, and compiler characteristics.
|
# Checks for typedefs, structures, and compiler characteristics.
|
||||||
@@ -353,15 +292,15 @@ endif()
|
|||||||
include(CheckStructHasMember)
|
include(CheckStructHasMember)
|
||||||
check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_STRUCT_TM_TM_GMTOFF)
|
check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_STRUCT_TM_TM_GMTOFF)
|
||||||
|
|
||||||
|
# Check size of pointer to decide we need 8 bytes alignment adjustment.
|
||||||
|
check_type_size("int *" SIZEOF_INT_P)
|
||||||
|
check_type_size("time_t" SIZEOF_TIME_T)
|
||||||
|
|
||||||
# Checks for library functions.
|
# Checks for library functions.
|
||||||
include(CheckFunctionExists)
|
include(CheckFunctionExists)
|
||||||
check_function_exists(_Exit HAVE__EXIT)
|
check_function_exists(_Exit HAVE__EXIT)
|
||||||
check_function_exists(accept4 HAVE_ACCEPT4)
|
check_function_exists(accept4 HAVE_ACCEPT4)
|
||||||
check_function_exists(clock_gettime HAVE_CLOCK_GETTIME)
|
|
||||||
check_function_exists(mkostemp HAVE_MKOSTEMP)
|
check_function_exists(mkostemp HAVE_MKOSTEMP)
|
||||||
check_function_exists(pipe2 HAVE_PIPE2)
|
|
||||||
|
|
||||||
check_symbol_exists(GetTickCount64 sysinfoapi.h HAVE_GETTICKCOUNT64)
|
|
||||||
|
|
||||||
include(CheckSymbolExists)
|
include(CheckSymbolExists)
|
||||||
# XXX does this correctly detect initgroups (un)availability on cygwin?
|
# XXX does this correctly detect initgroups (un)availability on cygwin?
|
||||||
@@ -374,8 +313,6 @@ if(NOT HAVE_DECL_INITGROUPS AND HAVE_UNISTD_H)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
check_symbol_exists(CLOCK_MONOTONIC "time.h" HAVE_DECL_CLOCK_MONOTONIC)
|
|
||||||
|
|
||||||
set(WARNCFLAGS)
|
set(WARNCFLAGS)
|
||||||
set(WARNCXXFLAGS)
|
set(WARNCXXFLAGS)
|
||||||
if(CMAKE_C_COMPILER_ID MATCHES "MSVC")
|
if(CMAKE_C_COMPILER_ID MATCHES "MSVC")
|
||||||
@@ -385,12 +322,65 @@ if(CMAKE_C_COMPILER_ID MATCHES "MSVC")
|
|||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
if(ENABLE_WERROR)
|
if(ENABLE_WERROR)
|
||||||
set(WARNCFLAGS "-Werror")
|
extract_valid_c_flags(WARNCFLAGS -Werror)
|
||||||
set(WARNCXXFLAGS "-Werror")
|
extract_valid_c_flags(WARNCXXFLAGS -Werror)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
include(PickyWarningsC)
|
# For C compiler
|
||||||
include(PickyWarningsCXX)
|
extract_valid_c_flags(WARNCFLAGS
|
||||||
|
-Wall
|
||||||
|
-Wextra
|
||||||
|
-Wmissing-prototypes
|
||||||
|
-Wstrict-prototypes
|
||||||
|
-Wmissing-declarations
|
||||||
|
-Wpointer-arith
|
||||||
|
-Wdeclaration-after-statement
|
||||||
|
-Wformat-security
|
||||||
|
-Wwrite-strings
|
||||||
|
-Wshadow
|
||||||
|
-Winline
|
||||||
|
-Wnested-externs
|
||||||
|
-Wfloat-equal
|
||||||
|
-Wundef
|
||||||
|
-Wendif-labels
|
||||||
|
-Wempty-body
|
||||||
|
-Wcast-align
|
||||||
|
-Wclobbered
|
||||||
|
-Wvla
|
||||||
|
-Wpragmas
|
||||||
|
-Wunreachable-code
|
||||||
|
-Waddress
|
||||||
|
-Wattributes
|
||||||
|
-Wdiv-by-zero
|
||||||
|
-Wshorten-64-to-32
|
||||||
|
|
||||||
|
-Wconversion
|
||||||
|
-Wextended-offsetof
|
||||||
|
-Wformat-nonliteral
|
||||||
|
-Wlanguage-extension-token
|
||||||
|
-Wmissing-field-initializers
|
||||||
|
-Wmissing-noreturn
|
||||||
|
-Wmissing-variable-declarations
|
||||||
|
# Not used because we cannot change public structs
|
||||||
|
# -Wpadded
|
||||||
|
-Wsign-conversion
|
||||||
|
# Not used because this basically disallows default case
|
||||||
|
# -Wswitch-enum
|
||||||
|
-Wunreachable-code-break
|
||||||
|
-Wunused-macros
|
||||||
|
-Wunused-parameter
|
||||||
|
-Wredundant-decls
|
||||||
|
# Only work with Clang for the moment
|
||||||
|
-Wheader-guard
|
||||||
|
# This is required because we pass format string as "const char*.
|
||||||
|
-Wno-format-nonliteral
|
||||||
|
)
|
||||||
|
|
||||||
|
extract_valid_cxx_flags(WARNCXXFLAGS
|
||||||
|
# For C++ compiler
|
||||||
|
-Wall
|
||||||
|
-Wformat-security
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(ENABLE_STATIC_CRT)
|
if(ENABLE_STATIC_CRT)
|
||||||
@@ -433,6 +423,8 @@ set(sbindir "${CMAKE_INSTALL_FULL_SBINDIR}")
|
|||||||
foreach(name
|
foreach(name
|
||||||
lib/libnghttp2.pc
|
lib/libnghttp2.pc
|
||||||
lib/includes/nghttp2/nghttp2ver.h
|
lib/includes/nghttp2/nghttp2ver.h
|
||||||
|
src/libnghttp2_asio.pc
|
||||||
|
python/setup.py
|
||||||
integration-tests/config.go
|
integration-tests/config.go
|
||||||
integration-tests/setenv
|
integration-tests/setenv
|
||||||
doc/conf.py
|
doc/conf.py
|
||||||
@@ -443,24 +435,24 @@ foreach(name
|
|||||||
doc/tutorial-hpack.rst
|
doc/tutorial-hpack.rst
|
||||||
doc/nghttpx-howto.rst
|
doc/nghttpx-howto.rst
|
||||||
doc/h2load-howto.rst
|
doc/h2load-howto.rst
|
||||||
|
doc/libnghttp2_asio.rst
|
||||||
|
doc/python-apiref.rst
|
||||||
doc/building-android-binary.rst
|
doc/building-android-binary.rst
|
||||||
doc/nghttp2.h.rst
|
doc/nghttp2.h.rst
|
||||||
doc/nghttp2ver.h.rst
|
doc/nghttp2ver.h.rst
|
||||||
|
doc/asio_http2.h.rst
|
||||||
|
doc/asio_http2_server.h.rst
|
||||||
|
doc/asio_http2_client.h.rst
|
||||||
doc/contribute.rst
|
doc/contribute.rst
|
||||||
)
|
)
|
||||||
configure_file("${name}.in" "${name}" @ONLY)
|
configure_file("${name}.in" "${name}" @ONLY)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
if(APPLE)
|
|
||||||
add_definitions(-D__APPLE_USE_RFC_3542)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include_directories(
|
include_directories(
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}" # for config.h
|
"${CMAKE_CURRENT_BINARY_DIR}" # for config.h
|
||||||
)
|
)
|
||||||
# For use in src/CMakeLists.txt
|
# For use in src/CMakeLists.txt
|
||||||
set(PKGDATADIR "${CMAKE_INSTALL_FULL_DATADIR}/${CMAKE_PROJECT_NAME}")
|
set(PKGDATADIR "${CMAKE_INSTALL_FULL_DATADIR}/${CMAKE_PROJECT_NAME}")
|
||||||
set(PKGLIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}/${CMAKE_PROJECT_NAME}")
|
|
||||||
|
|
||||||
install(FILES README.rst DESTINATION "${CMAKE_INSTALL_DOCDIR}")
|
install(FILES README.rst DESTINATION "${CMAKE_INSTALL_DOCDIR}")
|
||||||
|
|
||||||
@@ -468,18 +460,15 @@ add_subdirectory(lib)
|
|||||||
#add_subdirectory(lib/includes)
|
#add_subdirectory(lib/includes)
|
||||||
add_subdirectory(third-party)
|
add_subdirectory(third-party)
|
||||||
add_subdirectory(src)
|
add_subdirectory(src)
|
||||||
|
#add_subdirectory(src/includes)
|
||||||
add_subdirectory(examples)
|
add_subdirectory(examples)
|
||||||
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME AND BUILD_TESTING)
|
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)
|
||||||
endif()
|
add_subdirectory(doc)
|
||||||
if(ENABLE_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)
|
||||||
@@ -497,31 +486,26 @@ message(STATUS "summary of build options:
|
|||||||
CXXFLAGS: ${CMAKE_CXX_FLAGS_${_build_type}} ${CMAKE_CXX_FLAGS}
|
CXXFLAGS: ${CMAKE_CXX_FLAGS_${_build_type}} ${CMAKE_CXX_FLAGS}
|
||||||
WARNCFLAGS: ${WARNCFLAGS}
|
WARNCFLAGS: ${WARNCFLAGS}
|
||||||
CXX1XCXXFLAGS: ${CXX1XCXXFLAGS}
|
CXX1XCXXFLAGS: ${CXX1XCXXFLAGS}
|
||||||
WARNCXXFLAGS: ${WARNCXXFLAGS}
|
|
||||||
Python:
|
Python:
|
||||||
Python: ${Python3_EXECUTABLE}
|
Python: ${PYTHON_EXECUTABLE}
|
||||||
Python3_VERSION: ${Python3_VERSION}
|
PYTHON_VERSION: ${PYTHON_VERSION_STRING}
|
||||||
|
Library version:${PYTHONLIBS_VERSION_STRING}
|
||||||
|
Cython: ${CYTHON_EXECUTABLE}
|
||||||
Test:
|
Test:
|
||||||
|
CUnit: ${HAVE_CUNIT} (LIBS='${CUNIT_LIBRARIES}')
|
||||||
Failmalloc: ${ENABLE_FAILMALLOC}
|
Failmalloc: ${ENABLE_FAILMALLOC}
|
||||||
Build Test: ${BUILD_TESTING}
|
|
||||||
Libs:
|
Libs:
|
||||||
OpenSSL: ${HAVE_OPENSSL} (LIBS='${OPENSSL_LIBRARIES}')
|
OpenSSL: ${HAVE_OPENSSL} (LIBS='${OPENSSL_LIBRARIES}')
|
||||||
wolfSSL: ${HAVE_WOLFSSL} (LIBS='${WOLFSSL_LIBRARIES}')
|
|
||||||
Libxml2: ${HAVE_LIBXML2} (LIBS='${LIBXML2_LIBRARIES}')
|
Libxml2: ${HAVE_LIBXML2} (LIBS='${LIBXML2_LIBRARIES}')
|
||||||
Libev: ${HAVE_LIBEV} (LIBS='${LIBEV_LIBRARIES}')
|
Libev: ${HAVE_LIBEV} (LIBS='${LIBEV_LIBRARIES}')
|
||||||
Libc-ares: ${HAVE_LIBCARES} (LIBS='${LIBCARES_LIBRARIES}')
|
Libc-ares: ${HAVE_LIBCARES} (LIBS='${LIBCARES_LIBRARIES}')
|
||||||
Libngtcp2: ${HAVE_LIBNGTCP2} (LIBS='${LIBNGTCP2_LIBRARIES}')
|
|
||||||
Libngtcp2_crypto_quictls: ${HAVE_LIBNGTCP2_CRYPTO_QUICTLS} (LIBS='${LIBNGTCP2_CRYPTO_QUICTLS_LIBRARIES}')
|
|
||||||
Libngtcp2_crypto_wolfssl: ${HAVE_LIBNGTCP2_CRYPTO_WOLFSSL} (LIBS='${LIBNGTCP2_CRYPTO_WOLFSSL_LIBRARIES}')
|
|
||||||
Libnghttp3: ${HAVE_LIBNGHTTP3} (LIBS='${LIBNGHTTP3_LIBRARIES}')
|
|
||||||
Libbpf: ${HAVE_LIBBPF} (LIBS='${LIBBPF_LIBRARIES}')
|
|
||||||
Libevent(SSL): ${HAVE_LIBEVENT_OPENSSL} (LIBS='${LIBEVENT_OPENSSL_LIBRARIES}')
|
Libevent(SSL): ${HAVE_LIBEVENT_OPENSSL} (LIBS='${LIBEVENT_OPENSSL_LIBRARIES}')
|
||||||
Jansson: ${HAVE_JANSSON} (LIBS='${JANSSON_LIBRARIES}')
|
Jansson: ${HAVE_JANSSON} (LIBS='${JANSSON_LIBRARIES}')
|
||||||
Jemalloc: ${HAVE_JEMALLOC} (LIBS='${JEMALLOC_LIBRARIES}')
|
Jemalloc: ${HAVE_JEMALLOC} (LIBS='${JEMALLOC_LIBRARIES}')
|
||||||
Zlib: ${HAVE_ZLIB} (LIBS='${ZLIB_LIBRARIES}')
|
Zlib: ${HAVE_ZLIB} (LIBS='${ZLIB_LIBRARIES}')
|
||||||
Systemd: ${HAVE_SYSTEMD} (LIBS='${SYSTEMD_LIBRARIES}')
|
Systemd: ${HAVE_SYSTEMD} (LIBS='${SYSTEMD_LIBRARIES}')
|
||||||
Libbrotlienc: ${HAVE_LIBBROTLIENC} (LIBS='${LIBBROTLIENC_LIBRARIES}')
|
Boost::System: ${Boost_SYSTEM_LIBRARY}
|
||||||
Libbrotlidec: ${HAVE_LIBBROTLIDEC} (LIBS='${LIBBROTLIDEC_LIBRARIES}')
|
Boost::Thread: ${Boost_THREAD_LIBRARY}
|
||||||
Third-party:
|
Third-party:
|
||||||
http-parser: ${ENABLE_THIRD_PARTY}
|
http-parser: ${ENABLE_THIRD_PARTY}
|
||||||
MRuby: ${HAVE_MRUBY}
|
MRuby: ${HAVE_MRUBY}
|
||||||
@@ -529,9 +513,10 @@ message(STATUS "summary of build options:
|
|||||||
Features:
|
Features:
|
||||||
Applications: ${ENABLE_APP}
|
Applications: ${ENABLE_APP}
|
||||||
HPACK tools: ${ENABLE_HPACK_TOOLS}
|
HPACK tools: ${ENABLE_HPACK_TOOLS}
|
||||||
|
Libnghttp2_asio:${ENABLE_ASIO_LIB}
|
||||||
Examples: ${ENABLE_EXAMPLES}
|
Examples: ${ENABLE_EXAMPLES}
|
||||||
|
Python bindings:${ENABLE_PYTHON_BINDINGS}
|
||||||
Threading: ${ENABLE_THREADS}
|
Threading: ${ENABLE_THREADS}
|
||||||
HTTP/3(EXPERIMENTAL): ${ENABLE_HTTP3}
|
|
||||||
")
|
")
|
||||||
if(ENABLE_LIB_ONLY_DISABLED_OTHERS)
|
if(ENABLE_LIB_ONLY_DISABLED_OTHERS)
|
||||||
message("Only the library will be built. To build other components "
|
message("Only the library will be built. To build other components "
|
||||||
|
|||||||
@@ -7,24 +7,24 @@ option(ENABLE_APP "Build applications (nghttp, nghttpd, nghttpx and h2load
|
|||||||
${ENABLE_APP_DEFAULT})
|
${ENABLE_APP_DEFAULT})
|
||||||
option(ENABLE_HPACK_TOOLS "Build HPACK tools"
|
option(ENABLE_HPACK_TOOLS "Build HPACK tools"
|
||||||
${ENABLE_HPACK_TOOLS_DEFAULT})
|
${ENABLE_HPACK_TOOLS_DEFAULT})
|
||||||
|
option(ENABLE_ASIO_LIB "Build C++ libnghttp2_asio library")
|
||||||
option(ENABLE_EXAMPLES "Build examples"
|
option(ENABLE_EXAMPLES "Build examples"
|
||||||
${ENABLE_EXAMPLES_DEFAULT})
|
${ENABLE_EXAMPLES_DEFAULT})
|
||||||
|
option(ENABLE_PYTHON_BINDINGS "Build Python bindings"
|
||||||
|
${ENABLE_PYTHON_BINDINGS_DEFAULT})
|
||||||
option(ENABLE_FAILMALLOC "Build failmalloc test program" ON)
|
option(ENABLE_FAILMALLOC "Build failmalloc test program" ON)
|
||||||
option(ENABLE_LIB_ONLY "Build libnghttp2 only. This is a short hand for -DENABLE_APP=0 -DENABLE_EXAMPLES=0 -DENABLE_HPACK_TOOLS=0")
|
option(ENABLE_LIB_ONLY "Build libnghttp2 only. This is a short hand for -DENABLE_APP=0 -DENABLE_EXAMPLES=0 -DENABLE_HPACK_TOOLS=0 -DENABLE_PYTHON_BINDINGS=0")
|
||||||
option(BUILD_SHARED_LIBS "Build libnghttp2 as a shared library" ON)
|
option(ENABLE_STATIC_LIB "Build libnghttp2 in static mode also")
|
||||||
option(BUILD_STATIC_LIBS "Build libnghttp2 in static mode also" OFF)
|
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)
|
|
||||||
cmake_dependent_option(BUILD_TESTING "Enable tests" ON "BUILD_STATIC_LIBS" OFF)
|
|
||||||
|
|
||||||
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")
|
|
||||||
option(WITH_WOLFSSL "Use wolfSSL")
|
|
||||||
|
|
||||||
# vim: ft=cmake:
|
# vim: ft=cmake:
|
||||||
|
|||||||
@@ -12,41 +12,59 @@
|
|||||||
|
|
||||||
|
|
||||||
# Only use standalone-toolchain for reduce size
|
# Only use standalone-toolchain for reduce size
|
||||||
FROM ubuntu:22.04
|
FROM ubuntu:xenial
|
||||||
MAINTAINER Tatsuhiro Tsujikawa
|
MAINTAINER Tatsuhiro Tsujikawa
|
||||||
|
ENV ANDROID_HOME /root
|
||||||
|
ENV TOOLCHAIN $ANDROID_HOME/toolchain
|
||||||
|
ENV PATH $TOOLCHAIN/bin:$PATH
|
||||||
|
|
||||||
ENV NDK_VERSION r26d
|
ENV NDK_VERSION r14b
|
||||||
ENV NDK /root/android-ndk-$NDK_VERSION
|
|
||||||
ENV TOOLCHAIN $NDK/toolchains/llvm/prebuilt/linux-x86_64
|
|
||||||
ENV TARGET aarch64-linux-android
|
|
||||||
ENV API 33
|
|
||||||
ENV AR $TOOLCHAIN/bin/llvm-ar
|
|
||||||
ENV CC $TOOLCHAIN/bin/$TARGET$API-clang
|
|
||||||
ENV CXX $TOOLCHAIN/bin/$TARGET$API-clang++
|
|
||||||
ENV LD $TOOLCHAIN/bin/ld
|
|
||||||
ENV RANDLIB $TOOLCHAIN/bin/llvm-ranlib
|
|
||||||
ENV STRIP $TOOLCHAIN/bin/llvm-strip
|
|
||||||
ENV PREFIX /root/usr/local
|
|
||||||
|
|
||||||
WORKDIR /root
|
WORKDIR /root
|
||||||
RUN apt-get update && \
|
RUN apt-get update && \
|
||||||
apt-get install -y unzip make binutils autoconf \
|
apt-get install -y unzip make binutils autoconf \
|
||||||
automake autotools-dev libtool pkg-config git \
|
automake autotools-dev libtool pkg-config git \
|
||||||
curl dpkg-dev libxml2-dev genisoimage libc6-i386 \
|
curl dpkg-dev libxml2-dev genisoimage libc6-i386 \
|
||||||
lib32stdc++6 && \
|
lib32stdc++6 python&& \
|
||||||
rm -rf /var/cache/apt/*
|
rm -rf /var/cache/apk/*
|
||||||
|
|
||||||
# Download NDK
|
# Install toolchain
|
||||||
RUN curl -L -O https://dl.google.com/android/repository/android-ndk-$NDK_VERSION-linux.zip && \
|
RUN curl -L -O https://dl.google.com/android/repository/android-ndk-$NDK_VERSION-linux-x86_64.zip && \
|
||||||
unzip -q android-ndk-$NDK_VERSION-linux.zip && \
|
unzip -q android-ndk-$NDK_VERSION-linux-x86_64.zip && \
|
||||||
rm android-ndk-$NDK_VERSION-linux.zip
|
rm android-ndk-$NDK_VERSION-linux-x86_64.zip && \
|
||||||
|
mkdir -p $ANDROID_HOME/toolchain && \
|
||||||
|
$ANDROID_HOME/android-ndk-$NDK_VERSION/build/tools/make-standalone-toolchain.sh \
|
||||||
|
--install-dir=$ANDROID_HOME/toolchain \
|
||||||
|
--toolchain=arm-linux-androideabi-4.9 \
|
||||||
|
--force && \
|
||||||
|
rm -r android-ndk-$NDK_VERSION
|
||||||
|
|
||||||
|
ENV PREFIX /root/usr/local
|
||||||
|
|
||||||
# Setup version of libraries
|
# Setup version of libraries
|
||||||
ENV OPENSSL_VERSION 1.1.1w
|
ENV OPENSSL_VERSION 1.0.2d
|
||||||
ENV LIBEV_VERSION 4.33
|
ENV SPDYLAY_VERSION v1.4.0
|
||||||
ENV ZLIB_VERSION 1.3.1
|
ENV LIBEV_VERSION 4.19
|
||||||
ENV CARES_VERSION 1.18.1
|
ENV ZLIB_VERSION 1.2.8
|
||||||
ENV NGHTTP2_VERSION master
|
ENV CARES_VERSION 1.13.0
|
||||||
|
ENV NGHTTP2_VERSION v1.24.0
|
||||||
|
|
||||||
|
WORKDIR /root/build
|
||||||
|
RUN git clone https://github.com/tatsuhiro-t/spdylay -b $SPDYLAY_VERSION --depth 1
|
||||||
|
WORKDIR /root/build/spdylay
|
||||||
|
RUN autoreconf -i && \
|
||||||
|
./configure \
|
||||||
|
--disable-shared \
|
||||||
|
--host=arm-linux-androideabi \
|
||||||
|
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
||||||
|
--prefix=$PREFIX \
|
||||||
|
--without-libxml2 \
|
||||||
|
--disable-src \
|
||||||
|
--disable-examples \
|
||||||
|
CPPFLAGS="-I$PREFIX/include" \
|
||||||
|
PKG_CONFIG_LIBDIR="$PREFIX/lib/pkgconfig" \
|
||||||
|
LDFLAGS="-L$PREFIX/lib" && \
|
||||||
|
make install
|
||||||
|
|
||||||
WORKDIR /root/build
|
WORKDIR /root/build
|
||||||
RUN curl -L -O https://www.openssl.org/source/openssl-$OPENSSL_VERSION.tar.gz && \
|
RUN curl -L -O https://www.openssl.org/source/openssl-$OPENSSL_VERSION.tar.gz && \
|
||||||
@@ -54,19 +72,20 @@ RUN curl -L -O https://www.openssl.org/source/openssl-$OPENSSL_VERSION.tar.gz &&
|
|||||||
rm openssl-$OPENSSL_VERSION.tar.gz
|
rm openssl-$OPENSSL_VERSION.tar.gz
|
||||||
|
|
||||||
WORKDIR /root/build/openssl-$OPENSSL_VERSION
|
WORKDIR /root/build/openssl-$OPENSSL_VERSION
|
||||||
RUN export ANDROID_NDK_HOME=$NDK PATH=$TOOLCHAIN/bin:$PATH && \
|
RUN export CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi- && \
|
||||||
./Configure no-shared --prefix=$PREFIX android-arm64 && \
|
./Configure --prefix=$PREFIX android && \
|
||||||
make && make install_sw
|
make && make install_sw
|
||||||
|
|
||||||
WORKDIR /root/build
|
WORKDIR /root/build
|
||||||
RUN curl -L -O http://dist.schmorp.de/libev/Attic/libev-$LIBEV_VERSION.tar.gz && \
|
RUN curl -L -O http://dist.schmorp.de/libev/Attic/libev-$LIBEV_VERSION.tar.gz && \
|
||||||
|
curl -L -O https://gist.github.com/tatsuhiro-t/48c45f08950f587180ed/raw/80a8f003b5d1091eae497c5995bbaa68096e739b/libev-4.19-android.patch && \
|
||||||
tar xf libev-$LIBEV_VERSION.tar.gz && \
|
tar xf libev-$LIBEV_VERSION.tar.gz && \
|
||||||
rm libev-$LIBEV_VERSION.tar.gz
|
rm libev-$LIBEV_VERSION.tar.gz
|
||||||
|
|
||||||
WORKDIR /root/build/libev-$LIBEV_VERSION
|
WORKDIR /root/build/libev-$LIBEV_VERSION
|
||||||
RUN ./configure \
|
RUN patch -p1 < ../libev-4.19-android.patch && \
|
||||||
--disable-dependency-tracking \
|
./configure \
|
||||||
--host=$TARGET \
|
--host=arm-linux-androideabi \
|
||||||
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
||||||
--prefix=$PREFIX \
|
--prefix=$PREFIX \
|
||||||
--disable-shared \
|
--disable-shared \
|
||||||
@@ -76,12 +95,17 @@ RUN ./configure \
|
|||||||
make install
|
make install
|
||||||
|
|
||||||
WORKDIR /root/build
|
WORKDIR /root/build
|
||||||
RUN curl -L -O https://github.com/madler/zlib/releases/download/v$ZLIB_VERSION/zlib-$ZLIB_VERSION.tar.gz && \
|
RUN curl -L -O https://downloads.sourceforge.net/project/libpng/zlib/$ZLIB_VERSION/zlib-$ZLIB_VERSION.tar.gz && \
|
||||||
tar xf zlib-$ZLIB_VERSION.tar.gz && \
|
tar xf zlib-$ZLIB_VERSION.tar.gz && \
|
||||||
rm zlib-$ZLIB_VERSION.tar.gz
|
rm zlib-$ZLIB_VERSION.tar.gz
|
||||||
|
|
||||||
WORKDIR /root/build/zlib-$ZLIB_VERSION
|
WORKDIR /root/build/zlib-$ZLIB_VERSION
|
||||||
RUN HOST=$TARGET \
|
RUN HOST=arm-linux-androideabi \
|
||||||
|
CC=$HOST-gcc \
|
||||||
|
AR=$HOST-ar \
|
||||||
|
LD=$HOST-ld \
|
||||||
|
RANLIB=$HOST-ranlib \
|
||||||
|
STRIP=$HOST-strip \
|
||||||
./configure \
|
./configure \
|
||||||
--prefix=$PREFIX \
|
--prefix=$PREFIX \
|
||||||
--libdir=$PREFIX/lib \
|
--libdir=$PREFIX/lib \
|
||||||
@@ -91,14 +115,13 @@ RUN HOST=$TARGET \
|
|||||||
|
|
||||||
|
|
||||||
WORKDIR /root/build
|
WORKDIR /root/build
|
||||||
RUN curl -L -O https://github.com/c-ares/c-ares/releases/download/cares-1_18_1/c-ares-$CARES_VERSION.tar.gz && \
|
RUN curl -L -O https://c-ares.haxx.se/download/c-ares-$CARES_VERSION.tar.gz && \
|
||||||
tar xf c-ares-$CARES_VERSION.tar.gz && \
|
tar xf c-ares-$CARES_VERSION.tar.gz && \
|
||||||
rm c-ares-$CARES_VERSION.tar.gz
|
rm c-ares-$CARES_VERSION.tar.gz
|
||||||
|
|
||||||
WORKDIR /root/build/c-ares-$CARES_VERSION
|
WORKDIR /root/build/c-ares-$CARES_VERSION
|
||||||
RUN ./configure \
|
RUN ./configure \
|
||||||
--disable-dependency-tracking \
|
--host=arm-linux-androideabi \
|
||||||
--host=$TARGET \
|
|
||||||
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
||||||
--prefix=$PREFIX \
|
--prefix=$PREFIX \
|
||||||
--disable-shared && \
|
--disable-shared && \
|
||||||
@@ -109,16 +132,19 @@ RUN git clone https://github.com/nghttp2/nghttp2 -b $NGHTTP2_VERSION --depth 1
|
|||||||
WORKDIR /root/build/nghttp2
|
WORKDIR /root/build/nghttp2
|
||||||
RUN autoreconf -i && \
|
RUN autoreconf -i && \
|
||||||
./configure \
|
./configure \
|
||||||
--disable-dependency-tracking \
|
|
||||||
--enable-app \
|
--enable-app \
|
||||||
--disable-shared \
|
--disable-shared \
|
||||||
--host=$TARGET \
|
--host=arm-linux-androideabi \
|
||||||
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
||||||
|
--with-xml-prefix="$PREFIX" \
|
||||||
--without-libxml2 \
|
--without-libxml2 \
|
||||||
|
--disable-python-bindings \
|
||||||
--disable-examples \
|
--disable-examples \
|
||||||
--disable-threads \
|
--disable-threads \
|
||||||
|
CC="$TOOLCHAIN"/bin/arm-linux-androideabi-clang \
|
||||||
|
CXX="$TOOLCHAIN"/bin/arm-linux-androideabi-clang++ \
|
||||||
CPPFLAGS="-fPIE -I$PREFIX/include" \
|
CPPFLAGS="-fPIE -I$PREFIX/include" \
|
||||||
PKG_CONFIG_LIBDIR="$PREFIX/lib/pkgconfig" \
|
PKG_CONFIG_LIBDIR="$PREFIX/lib/pkgconfig" \
|
||||||
LDFLAGS="-fPIE -pie -L$PREFIX/lib" && \
|
LDFLAGS="-fPIE -pie -L$PREFIX/lib" && \
|
||||||
make && \
|
make && \
|
||||||
$STRIP src/nghttpx src/nghttpd src/nghttp
|
arm-linux-androideabi-strip src/nghttpx src/nghttpd src/nghttp
|
||||||
|
|||||||
29
Makefile.am
29
Makefile.am
@@ -20,14 +20,19 @@
|
|||||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
SUBDIRS = lib third-party src bpf examples tests integration-tests \
|
SUBDIRS = lib third-party src examples python tests integration-tests \
|
||||||
doc contrib script
|
doc contrib script
|
||||||
|
|
||||||
|
# Now with python setuptools, make uninstall will leave many files we
|
||||||
|
# cannot easily remove (e.g., easy-install.pth). Disable it for
|
||||||
|
# distcheck rule.
|
||||||
|
AM_DISTCHECK_CONFIGURE_FLAGS = --disable-python-bindings
|
||||||
|
|
||||||
ACLOCAL_AMFLAGS = -I m4
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
|
|
||||||
dist_doc_DATA = README.rst
|
dist_doc_DATA = README.rst
|
||||||
|
|
||||||
EXTRA_DIST = nghttpx.conf.sample proxy.pac.sample android-config android-env \
|
EXTRA_DIST = nghttpx.conf.sample proxy.pac.sample android-config android-make \
|
||||||
Dockerfile.android \
|
Dockerfile.android \
|
||||||
cmakeconfig.h.in \
|
cmakeconfig.h.in \
|
||||||
CMakeLists.txt \
|
CMakeLists.txt \
|
||||||
@@ -35,30 +40,22 @@ EXTRA_DIST = nghttpx.conf.sample proxy.pac.sample android-config android-env \
|
|||||||
cmake/ExtractValidFlags.cmake \
|
cmake/ExtractValidFlags.cmake \
|
||||||
cmake/FindJemalloc.cmake \
|
cmake/FindJemalloc.cmake \
|
||||||
cmake/FindLibev.cmake \
|
cmake/FindLibev.cmake \
|
||||||
|
cmake/FindCUnit.cmake \
|
||||||
cmake/Version.cmake \
|
cmake/Version.cmake \
|
||||||
|
cmake/FindCython.cmake \
|
||||||
cmake/FindLibevent.cmake \
|
cmake/FindLibevent.cmake \
|
||||||
cmake/FindJansson.cmake \
|
cmake/FindJansson.cmake \
|
||||||
cmake/FindLibcares.cmake \
|
cmake/FindLibcares.cmake \
|
||||||
cmake/FindSystemd.cmake \
|
cmake/FindSystemd.cmake
|
||||||
cmake/FindLibbpf.cmake \
|
|
||||||
cmake/FindLibnghttp3.cmake \
|
|
||||||
cmake/FindLibngtcp2.cmake \
|
|
||||||
cmake/FindLibngtcp2_crypto_quictls.cmake \
|
|
||||||
cmake/FindLibbrotlienc.cmake \
|
|
||||||
cmake/FindLibbrotlidec.cmake \
|
|
||||||
cmake/FindLibngtcp2_crypto_wolfssl.cmake \
|
|
||||||
cmake/FindWolfSSL.cmake \
|
|
||||||
cmake/PickyWarningsC.cmake \
|
|
||||||
cmake/PickyWarningsCXX.cmake
|
|
||||||
|
|
||||||
.PHONY: clang-format
|
.PHONY: clang-format
|
||||||
|
|
||||||
# Format source files using clang-format. Don't format source files
|
# Format source files using clang-format. Don't format source files
|
||||||
# under third-party directory since we are not responsible for their
|
# under third-party directory since we are not responsible for thier
|
||||||
# coding style.
|
# coding style.
|
||||||
clang-format:
|
clang-format:
|
||||||
CLANGFORMAT=`git config --get clangformat.binary`; \
|
CLANGFORMAT=`git config --get clangformat.binary`; \
|
||||||
test -z $${CLANGFORMAT} && CLANGFORMAT="clang-format"; \
|
test -z $${CLANGFORMAT} && CLANGFORMAT="clang-format"; \
|
||||||
$${CLANGFORMAT} -i lib/*.{c,h} lib/includes/nghttp2/*.h \
|
$${CLANGFORMAT} -i lib/*.{c,h} lib/includes/nghttp2/*.h \
|
||||||
src/*.{c,cc,h} examples/*.c \
|
src/*.{c,cc,h} src/includes/nghttp2/*.h examples/*.{c,cc} \
|
||||||
tests/*.{c,h} bpf/*.c fuzz/*.cc
|
tests/*.{c,h}
|
||||||
|
|||||||
478
README.rst
478
README.rst
@@ -11,14 +11,17 @@ HTTP/2.
|
|||||||
|
|
||||||
An HPACK encoder and decoder are available as a public API.
|
An HPACK encoder and decoder are available as a public API.
|
||||||
|
|
||||||
|
An experimental high level C++ library is also available.
|
||||||
|
|
||||||
|
We have Python bindings of this library, but we do not have full
|
||||||
|
code coverage yet.
|
||||||
|
|
||||||
Development Status
|
Development Status
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
nghttp2 was originally developed based on `RFC 7540
|
We have implemented `RFC 7540 <https://tools.ietf.org/html/rfc7540>`_
|
||||||
<https://tools.ietf.org/html/rfc7540>`_ HTTP/2 and `RFC 7541
|
HTTP/2 and `RFC 7541 <https://tools.ietf.org/html/rfc7541>`_ HPACK -
|
||||||
<https://tools.ietf.org/html/rfc7541>`_ HPACK - Header Compression for
|
Header Compression for HTTP/2
|
||||||
HTTP/2. Now we are updating our code to implement `RFC 9113
|
|
||||||
<https://datatracker.ietf.org/doc/html/rfc9113>`_.
|
|
||||||
|
|
||||||
The nghttp2 code base was forked from the spdylay
|
The nghttp2 code base was forked from the spdylay
|
||||||
(https://github.com/tatsuhiro-t/spdylay) project.
|
(https://github.com/tatsuhiro-t/spdylay) project.
|
||||||
@@ -29,14 +32,12 @@ Public Test Server
|
|||||||
The following endpoints are available to try out our nghttp2
|
The following endpoints are available to try out our nghttp2
|
||||||
implementation.
|
implementation.
|
||||||
|
|
||||||
* https://nghttp2.org/ (TLS + ALPN 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 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``.
|
||||||
@@ -48,6 +49,11 @@ The following package is required to build the libnghttp2 library:
|
|||||||
|
|
||||||
* pkg-config >= 0.20
|
* pkg-config >= 0.20
|
||||||
|
|
||||||
|
To build and run the unit test programs, the following package is
|
||||||
|
required:
|
||||||
|
|
||||||
|
* cunit >= 2.1
|
||||||
|
|
||||||
To build the documentation, you need to install:
|
To build the documentation, you need to install:
|
||||||
|
|
||||||
* sphinx (http://sphinx-doc.org/)
|
* sphinx (http://sphinx-doc.org/)
|
||||||
@@ -61,12 +67,15 @@ To build and run the application programs (``nghttp``, ``nghttpd``,
|
|||||||
``nghttpx`` and ``h2load``) in the ``src`` directory, the following packages
|
``nghttpx`` and ``h2load``) in the ``src`` directory, the following packages
|
||||||
are required:
|
are required:
|
||||||
|
|
||||||
* OpenSSL >= 1.1.1; or wolfSSL >= 5.7.0; or LibreSSL >= 3.8.1; or
|
* OpenSSL >= 1.0.1
|
||||||
aws-lc >= 1.19.0; or BoringSSL
|
|
||||||
* libev >= 4.11
|
* libev >= 4.11
|
||||||
* zlib >= 1.2.3
|
* zlib >= 1.2.3
|
||||||
* libc-ares >= 1.7.5
|
* libc-ares >= 1.7.5
|
||||||
|
|
||||||
|
ALPN support requires OpenSSL >= 1.0.2 (released 22 January 2015).
|
||||||
|
LibreSSL >= 2.2.0 can be used instead of OpenSSL, but OpenSSL has more
|
||||||
|
features than LibreSSL at the time of this writing.
|
||||||
|
|
||||||
To enable ``-a`` option (getting linked assets from the downloaded
|
To enable ``-a`` option (getting linked assets from the downloaded
|
||||||
resource) in ``nghttp``, the following package is required:
|
resource) in ``nghttp``, the following package is required:
|
||||||
|
|
||||||
@@ -95,15 +104,31 @@ 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>`_.
|
||||||
|
|
||||||
For BoringSSL or aws-lc build, to enable :rfc:`8879` TLS Certificate
|
libnghttp2_asio C++ library requires the following packages:
|
||||||
Compression in applications, the following library is required:
|
|
||||||
|
|
||||||
* libbrotli-dev >= 1.0.9
|
* libboost-dev >= 1.54.0
|
||||||
|
* libboost-thread-dev >= 1.54.0
|
||||||
|
|
||||||
|
The Python bindings require the following packages:
|
||||||
|
|
||||||
|
* cython >= 0.19
|
||||||
|
* python >= 2.7
|
||||||
|
* python-setuptools
|
||||||
|
|
||||||
|
If you are using Ubuntu 16.04 LTS (Xenial Xerus) or Debian 8 (jessie)
|
||||||
|
and above, run the following to install the required packages:
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
sudo apt-get install g++ make binutils autoconf automake autotools-dev libtool pkg-config \
|
||||||
|
zlib1g-dev libcunit1-dev libssl-dev libxml2-dev libev-dev libevent-dev libjansson-dev \
|
||||||
|
libc-ares-dev libjemalloc-dev libsystemd-dev \
|
||||||
|
cython python3-dev python-setuptools
|
||||||
|
|
||||||
To enable mruby support for nghttpx, `mruby
|
To enable mruby support for nghttpx, `mruby
|
||||||
<https://github.com/mruby/mruby>`_ is required. We need to build
|
<https://github.com/mruby/mruby>`_ is required. We need to build
|
||||||
mruby with C++ ABI explicitly turned on, and probably need other
|
mruby with C++ ABI explicitly turned on, and probably need other
|
||||||
mrgems, mruby is managed by git submodule under third-party/mruby
|
mrgems, mruby is manged by git submodule under third-party/mruby
|
||||||
directory. Currently, mruby support for nghttpx is disabled by
|
directory. Currently, mruby support for nghttpx is disabled by
|
||||||
default. To enable mruby support, use ``--with-mruby`` configure
|
default. To enable mruby support, use ``--with-mruby`` configure
|
||||||
option. Note that at the time of this writing, libmruby-dev and mruby
|
option. Note that at the time of this writing, libmruby-dev and mruby
|
||||||
@@ -115,43 +140,15 @@ required:
|
|||||||
* bison
|
* bison
|
||||||
|
|
||||||
nghttpx supports `neverbleed <https://github.com/h2o/neverbleed>`_,
|
nghttpx supports `neverbleed <https://github.com/h2o/neverbleed>`_,
|
||||||
privilege separation engine for OpenSSL. In short, it minimizes the
|
privilege separation engine for OpenSSL / LibreSSL. In short, it
|
||||||
risk of private key leakage when serious bug like Heartbleed is
|
minimizes the risk of private key leakage when serious bug like
|
||||||
exploited. The neverbleed is disabled by default. To enable it, use
|
Heartbleed is exploited. The neverbleed is disabled by default. To
|
||||||
``--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_1w+quic>`_; or
|
|
||||||
wolfSSL; or LibreSSL (does not support 0RTT); or aws-lc; or
|
|
||||||
`BoringSSL <https://boringssl.googlesource.com/boringssl/>`_ (commit
|
|
||||||
76968bb3d53982560bcf08bcd0ba3e1865fe15cd)
|
|
||||||
* `ngtcp2 <https://github.com/ngtcp2/ngtcp2>`_ >= 1.4.0
|
|
||||||
* `nghttp3 <https://github.com/ngtcp2/nghttp3>`_ >= 1.1.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>`_. 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,
|
is known to be adequate. In order to compile the C++ source code, gcc
|
||||||
C++20 compliant compiler is required. At least g++ >= 12 and
|
>= 6.0 or clang >= 6.0 is required. C++ source code requires C++14
|
||||||
clang++ >= 15 are known to work.
|
language features.
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
@@ -198,18 +195,6 @@ clang++ >= 15 are known to work.
|
|||||||
responsible to specify the correct values to these variables. For
|
responsible to specify the correct values to these variables. For
|
||||||
complete list of these variables, run ``./configure -h``.
|
complete list of these variables, run ``./configure -h``.
|
||||||
|
|
||||||
If you are using Ubuntu 22.04 LTS, run the following to install the
|
|
||||||
required packages:
|
|
||||||
|
|
||||||
.. code-block:: text
|
|
||||||
|
|
||||||
sudo apt-get install g++ clang make binutils autoconf automake \
|
|
||||||
autotools-dev libtool pkg-config \
|
|
||||||
zlib1g-dev libssl-dev libxml2-dev libev-dev \
|
|
||||||
libevent-dev libjansson-dev \
|
|
||||||
libc-ares-dev libjemalloc-dev libsystemd-dev \
|
|
||||||
ruby-dev bison libelf-dev
|
|
||||||
|
|
||||||
Building nghttp2 from release tar archive
|
Building nghttp2 from release tar archive
|
||||||
-----------------------------------------
|
-----------------------------------------
|
||||||
|
|
||||||
@@ -322,90 +307,6 @@ The generated documents will not be installed with ``make install``.
|
|||||||
The online documentation is available at
|
The online documentation is available at
|
||||||
https://nghttp2.org/documentation/
|
https://nghttp2.org/documentation/
|
||||||
|
|
||||||
Build HTTP/3 enabled h2load and nghttpx
|
|
||||||
---------------------------------------
|
|
||||||
|
|
||||||
To build h2load and nghttpx with HTTP/3 feature enabled, run the
|
|
||||||
configure script with ``--enable-http3``.
|
|
||||||
|
|
||||||
For nghttpx to reload configurations and swapping its executable while
|
|
||||||
gracefully terminating old worker processes, eBPF is required. Run
|
|
||||||
the configure script with ``--enable-http3 --with-libbpf`` to build
|
|
||||||
eBPF program. The QUIC keying material must be set with
|
|
||||||
``--frontend-quic-secret-file`` in order to keep the existing
|
|
||||||
connections alive during reload.
|
|
||||||
|
|
||||||
The detailed steps to build HTTP/3 enabled h2load and nghttpx follow.
|
|
||||||
|
|
||||||
Build aws-lc:
|
|
||||||
|
|
||||||
.. code-block:: text
|
|
||||||
|
|
||||||
$ git clone --depth 1 -b v1.36.1 https://github.com/aws/aws-lc
|
|
||||||
$ cd aws-lc
|
|
||||||
$ cmake -B build -DDISABLE_GO=ON --install-prefix=$PWD/opt
|
|
||||||
$ make -j$(nproc) -C build
|
|
||||||
$ cmake --install build
|
|
||||||
$ cd ..
|
|
||||||
|
|
||||||
Build nghttp3:
|
|
||||||
|
|
||||||
.. code-block:: text
|
|
||||||
|
|
||||||
$ git clone --depth 1 -b v1.6.0 https://github.com/ngtcp2/nghttp3
|
|
||||||
$ cd nghttp3
|
|
||||||
$ git submodule update --init --depth 1
|
|
||||||
$ 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 v1.8.1 https://github.com/ngtcp2/ngtcp2
|
|
||||||
$ cd ngtcp2
|
|
||||||
$ git submodule update --init --depth 1
|
|
||||||
$ autoreconf -i
|
|
||||||
$ ./configure --prefix=$PWD/build --enable-lib-only --with-boringssl \
|
|
||||||
BORINGSSL_CFLAGS="-I$PWD/../aws-lc/opt/include" \
|
|
||||||
BORINGSSL_LIBS="-L$PWD/../aws-lc/opt/lib -lssl -lcrypto"
|
|
||||||
$ 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.4.6 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 --enable-http3 --with-libbpf \
|
|
||||||
CC=clang-15 CXX=clang++-15 \
|
|
||||||
PKG_CONFIG_PATH="$PWD/../aws-lc/opt/lib/pkgconfig:$PWD/../nghttp3/build/lib/pkgconfig:$PWD/../ngtcp2/build/lib/pkgconfig:$PWD/../libbpf/build/lib64/pkgconfig" \
|
|
||||||
LDFLAGS="$LDFLAGS -Wl,-rpath,$PWD/../aws-lc/opt/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
|
||||||
----------
|
----------
|
||||||
|
|
||||||
@@ -482,7 +383,7 @@ Previously nghttp2 library did not send client magic, which is first
|
|||||||
24 bytes byte string of client connection preface, and client
|
24 bytes byte string of client connection preface, and client
|
||||||
applications have to send it by themselves. Since v1.0.0, client
|
applications have to send it by themselves. Since v1.0.0, client
|
||||||
magic is sent by library via first call of ``nghttp2_session_send()``
|
magic is sent by library via first call of ``nghttp2_session_send()``
|
||||||
or ``nghttp2_session_mem_send2()``.
|
or ``nghttp2_session_mem_send()``.
|
||||||
|
|
||||||
The client applications which send client magic must remove the
|
The client applications which send client magic must remove the
|
||||||
relevant code.
|
relevant code.
|
||||||
@@ -540,7 +441,7 @@ nghttp - client
|
|||||||
+++++++++++++++
|
+++++++++++++++
|
||||||
|
|
||||||
``nghttp`` is a HTTP/2 client. It can connect to the HTTP/2 server
|
``nghttp`` is a HTTP/2 client. It can connect to the HTTP/2 server
|
||||||
with prior knowledge, HTTP Upgrade and ALPN TLS extension.
|
with prior knowledge, HTTP Upgrade and NPN/ALPN TLS extension.
|
||||||
|
|
||||||
It has verbose output mode for framing information. Here is sample
|
It has verbose output mode for framing information. Here is sample
|
||||||
output from ``nghttp`` client:
|
output from ``nghttp`` client:
|
||||||
@@ -766,8 +667,8 @@ nghttpd - server
|
|||||||
By default, it uses SSL/TLS connection. Use ``--no-tls`` option to
|
By default, it uses SSL/TLS connection. Use ``--no-tls`` option to
|
||||||
disable it.
|
disable it.
|
||||||
|
|
||||||
``nghttpd`` only accepts HTTP/2 connections via ALPN or direct HTTP/2
|
``nghttpd`` only accepts HTTP/2 connections via NPN/ALPN or direct
|
||||||
connections. No HTTP Upgrade is supported.
|
HTTP/2 connections. No HTTP Upgrade is supported.
|
||||||
|
|
||||||
The ``-p`` option allows users to configure server push.
|
The ``-p`` option allows users to configure server push.
|
||||||
|
|
||||||
@@ -833,7 +734,7 @@ information. Here is sample output from ``nghttpd``:
|
|||||||
nghttpx - proxy
|
nghttpx - proxy
|
||||||
+++++++++++++++
|
+++++++++++++++
|
||||||
|
|
||||||
``nghttpx`` is a multi-threaded reverse proxy for HTTP/3, HTTP/2, and
|
``nghttpx`` is a multi-threaded reverse proxy for HTTP/2, and
|
||||||
HTTP/1.1, and powers http://nghttp2.org and supports HTTP/2 server
|
HTTP/1.1, and powers http://nghttp2.org and supports HTTP/2 server
|
||||||
push.
|
push.
|
||||||
|
|
||||||
@@ -848,22 +749,22 @@ to know how to migrate from earlier releases.
|
|||||||
``nghttpx`` implements `important performance-oriented features
|
``nghttpx`` implements `important performance-oriented features
|
||||||
<https://istlsfastyet.com/#server-performance>`_ in TLS, such as
|
<https://istlsfastyet.com/#server-performance>`_ in TLS, such as
|
||||||
session IDs, session tickets (with automatic key rotation), OCSP
|
session IDs, session tickets (with automatic key rotation), OCSP
|
||||||
stapling, dynamic record sizing, ALPN, forward secrecy and HTTP/2.
|
stapling, dynamic record sizing, ALPN/NPN, forward secrecy and HTTP/2.
|
||||||
``nghttpx`` also offers the functionality to share session cache and
|
``nghttpx`` also offers the functionality to share session cache and
|
||||||
ticket keys among multiple ``nghttpx`` instances via memcached.
|
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
|
||||||
@@ -881,16 +782,16 @@ server:
|
|||||||
|
|
||||||
.. code-block:: text
|
.. code-block:: text
|
||||||
|
|
||||||
Client <-- (HTTP/3, HTTP/2, HTTP/1.1) --> nghttpx <-- (HTTP/1.1, HTTP/2) --> Web Server
|
Client <-- (HTTP/2, HTTP/1.1) --> nghttpx <-- (HTTP/1.1, HTTP/2) --> Web Server
|
||||||
[reverse proxy]
|
[reverse proxy]
|
||||||
|
|
||||||
With the ``--http2-proxy`` option, it works as forward proxy, and it
|
With the ``--http2-proxy`` option, it works as forward proxy, and it
|
||||||
is so called secure HTTP/2 proxy:
|
is so called secure HTTP/2 proxy:
|
||||||
|
|
||||||
.. code-block:: text
|
.. code-block:: text
|
||||||
|
|
||||||
Client <-- (HTTP/3, HTTP/2, HTTP/1.1) --> nghttpx <-- (HTTP/1.1) --> Proxy
|
Client <-- (HTTP/2, HTTP/1.1) --> nghttpx <-- (HTTP/1.1) --> Proxy
|
||||||
[secure proxy] (e.g., Squid, ATS)
|
[secure proxy] (e.g., Squid, ATS)
|
||||||
|
|
||||||
The ``Client`` in the above example needs to be configured to use
|
The ``Client`` in the above example needs to be configured to use
|
||||||
``nghttpx`` as secure proxy.
|
``nghttpx`` as secure proxy.
|
||||||
@@ -922,7 +823,7 @@ proxy through an HTTP proxy:
|
|||||||
|
|
||||||
.. code-block:: text
|
.. code-block:: text
|
||||||
|
|
||||||
Client <-- (HTTP/3, HTTP/2, HTTP/1.1) --> nghttpx <-- (HTTP/2) --
|
Client <-- (HTTP/2, HTTP/1.1) --> nghttpx <-- (HTTP/2) --
|
||||||
|
|
||||||
--===================---> HTTP/2 Proxy
|
--===================---> HTTP/2 Proxy
|
||||||
(HTTP proxy tunnel) (e.g., nghttpx -s)
|
(HTTP proxy tunnel) (e.g., nghttpx -s)
|
||||||
@@ -930,8 +831,8 @@ proxy through an HTTP proxy:
|
|||||||
Benchmarking tool
|
Benchmarking tool
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
The ``h2load`` program is a benchmarking tool for HTTP/3, HTTP/2, and
|
The ``h2load`` program is a benchmarking tool for HTTP/2. The UI of
|
||||||
HTTP/1.1. The UI of ``h2load`` is heavily inspired by ``weighttp``
|
``h2load`` is heavily inspired by ``weighttp``
|
||||||
(https://github.com/lighttpd/weighttp). The typical usage is as
|
(https://github.com/lighttpd/weighttp). The typical usage is as
|
||||||
follows:
|
follows:
|
||||||
|
|
||||||
@@ -974,17 +875,6 @@ threads to avoid saturating a single core on client side.
|
|||||||
considered a DOS attack. Please only use it against your private
|
considered a DOS attack. Please only use it against your private
|
||||||
servers.
|
servers.
|
||||||
|
|
||||||
If the experimental HTTP/3 is enabled, h2load can send requests to
|
|
||||||
HTTP/3 server. To do this, specify ``h3`` to ``--alpn-list`` option
|
|
||||||
like so:
|
|
||||||
|
|
||||||
.. code-block:: text
|
|
||||||
|
|
||||||
$ h2load --alpn-list h3 https://127.0.0.1:4433
|
|
||||||
|
|
||||||
For nghttp2 v1.58 or earlier, use ``--npn-list`` instead of
|
|
||||||
``--alpn-list``.
|
|
||||||
|
|
||||||
HPACK tools
|
HPACK tools
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
@@ -1422,6 +1312,219 @@ associated value includes the state of the dynamic header table after the
|
|||||||
corresponding header set was processed. The format is the same as
|
corresponding header set was processed. The format is the same as
|
||||||
``deflatehd``.
|
``deflatehd``.
|
||||||
|
|
||||||
|
libnghttp2_asio: High level HTTP/2 C++ library
|
||||||
|
----------------------------------------------
|
||||||
|
|
||||||
|
libnghttp2_asio is C++ library built on top of libnghttp2 and provides
|
||||||
|
high level abstraction API to build HTTP/2 applications. It depends
|
||||||
|
on the Boost::ASIO library and OpenSSL. Currently libnghttp2_asio
|
||||||
|
provides both client and server APIs.
|
||||||
|
|
||||||
|
libnghttp2_asio is not built by default. Use the ``--enable-asio-lib``
|
||||||
|
configure flag to build libnghttp2_asio. The required Boost libraries
|
||||||
|
are:
|
||||||
|
|
||||||
|
* Boost::Asio
|
||||||
|
* Boost::System
|
||||||
|
* Boost::Thread
|
||||||
|
|
||||||
|
The server API is designed to build an HTTP/2 server very easily to utilize
|
||||||
|
C++14 anonymous functions and closures. The bare minimum example of
|
||||||
|
an HTTP/2 server looks like this:
|
||||||
|
|
||||||
|
.. code-block:: cpp
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include <nghttp2/asio_http2_server.h>
|
||||||
|
|
||||||
|
using namespace nghttp2::asio_http2;
|
||||||
|
using namespace nghttp2::asio_http2::server;
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
boost::system::error_code ec;
|
||||||
|
http2 server;
|
||||||
|
|
||||||
|
server.handle("/", [](const request &req, const response &res) {
|
||||||
|
res.write_head(200);
|
||||||
|
res.end("hello, world\n");
|
||||||
|
});
|
||||||
|
|
||||||
|
if (server.listen_and_serve(ec, "localhost", "3000")) {
|
||||||
|
std::cerr << "error: " << ec.message() << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Here is sample code to use the client API:
|
||||||
|
|
||||||
|
.. code-block:: cpp
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include <nghttp2/asio_http2_client.h>
|
||||||
|
|
||||||
|
using boost::asio::ip::tcp;
|
||||||
|
|
||||||
|
using namespace nghttp2::asio_http2;
|
||||||
|
using namespace nghttp2::asio_http2::client;
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
boost::system::error_code ec;
|
||||||
|
boost::asio::io_service io_service;
|
||||||
|
|
||||||
|
// connect to localhost:3000
|
||||||
|
session sess(io_service, "localhost", "3000");
|
||||||
|
|
||||||
|
sess.on_connect([&sess](tcp::resolver::iterator endpoint_it) {
|
||||||
|
boost::system::error_code ec;
|
||||||
|
|
||||||
|
auto req = sess.submit(ec, "GET", "http://localhost:3000/");
|
||||||
|
|
||||||
|
req->on_response([](const response &res) {
|
||||||
|
// print status code and response header fields.
|
||||||
|
std::cerr << "HTTP/2 " << res.status_code() << std::endl;
|
||||||
|
for (auto &kv : res.header()) {
|
||||||
|
std::cerr << kv.first << ": " << kv.second.value << "\n";
|
||||||
|
}
|
||||||
|
std::cerr << std::endl;
|
||||||
|
|
||||||
|
res.on_data([](const uint8_t *data, std::size_t len) {
|
||||||
|
std::cerr.write(reinterpret_cast<const char *>(data), len);
|
||||||
|
std::cerr << std::endl;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
req->on_close([&sess](uint32_t error_code) {
|
||||||
|
// shutdown session after first request was done.
|
||||||
|
sess.shutdown();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
sess.on_error([](const boost::system::error_code &ec) {
|
||||||
|
std::cerr << "error: " << ec.message() << std::endl;
|
||||||
|
});
|
||||||
|
|
||||||
|
io_service.run();
|
||||||
|
}
|
||||||
|
|
||||||
|
For more details, see the documentation of libnghttp2_asio.
|
||||||
|
|
||||||
|
Python bindings
|
||||||
|
---------------
|
||||||
|
|
||||||
|
The ``python`` directory contains nghttp2 Python bindings. The
|
||||||
|
bindings currently provide HPACK compressor and decompressor classes
|
||||||
|
and an HTTP/2 server.
|
||||||
|
|
||||||
|
The extension module is called ``nghttp2``.
|
||||||
|
|
||||||
|
``make`` will build the bindings and target Python version is
|
||||||
|
determined by the ``configure`` script. If the detected Python version is not
|
||||||
|
what you expect, specify a path to Python executable in a ``PYTHON``
|
||||||
|
variable as an argument to configure script (e.g., ``./configure
|
||||||
|
PYTHON=/usr/bin/python3.5``).
|
||||||
|
|
||||||
|
The following example code illustrates basic usage of the HPACK compressor
|
||||||
|
and decompressor in Python:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
import binascii
|
||||||
|
import nghttp2
|
||||||
|
|
||||||
|
deflater = nghttp2.HDDeflater()
|
||||||
|
inflater = nghttp2.HDInflater()
|
||||||
|
|
||||||
|
data = deflater.deflate([(b'foo', b'bar'),
|
||||||
|
(b'baz', b'buz')])
|
||||||
|
print(binascii.b2a_hex(data))
|
||||||
|
|
||||||
|
hdrs = inflater.inflate(data)
|
||||||
|
print(hdrs)
|
||||||
|
|
||||||
|
The ``nghttp2.HTTP2Server`` class builds on top of the asyncio event
|
||||||
|
loop. On construction, *RequestHandlerClass* must be given, which
|
||||||
|
must be a subclass of ``nghttp2.BaseRequestHandler`` class.
|
||||||
|
|
||||||
|
The ``BaseRequestHandler`` class is used to handle the HTTP/2 stream.
|
||||||
|
By default, it does nothing. It must be subclassed to handle each
|
||||||
|
event callback method.
|
||||||
|
|
||||||
|
The first callback method invoked is ``on_headers()``. It is called
|
||||||
|
when HEADERS frame, which includes the request header fields, has arrived.
|
||||||
|
|
||||||
|
If the request has a request body, ``on_data(data)`` is invoked for each
|
||||||
|
chunk of received data.
|
||||||
|
|
||||||
|
Once the entire request is received, ``on_request_done()`` is invoked.
|
||||||
|
|
||||||
|
When the stream is closed, ``on_close(error_code)`` is called.
|
||||||
|
|
||||||
|
The application can send a response using ``send_response()`` method.
|
||||||
|
It can be used in ``on_headers()``, ``on_data()`` or
|
||||||
|
``on_request_done()``.
|
||||||
|
|
||||||
|
The application can push resources using the ``push()`` method. It must be
|
||||||
|
used before the ``send_response()`` call.
|
||||||
|
|
||||||
|
The following instance variables are available:
|
||||||
|
|
||||||
|
client_address
|
||||||
|
Contains a tuple of the form (host, port) referring to the
|
||||||
|
client's address.
|
||||||
|
|
||||||
|
stream_id
|
||||||
|
Stream ID of this stream.
|
||||||
|
|
||||||
|
scheme
|
||||||
|
Scheme of the request URI. This is a value of :scheme header
|
||||||
|
field.
|
||||||
|
|
||||||
|
method
|
||||||
|
Method of this stream. This is a value of :method header field.
|
||||||
|
|
||||||
|
host
|
||||||
|
This is a value of :authority or host header field.
|
||||||
|
|
||||||
|
path
|
||||||
|
This is a value of :path header field.
|
||||||
|
|
||||||
|
The following example illustrates the HTTP2Server and
|
||||||
|
BaseRequestHandler usage:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
import io, ssl
|
||||||
|
import nghttp2
|
||||||
|
|
||||||
|
class Handler(nghttp2.BaseRequestHandler):
|
||||||
|
|
||||||
|
def on_headers(self):
|
||||||
|
self.push(path='/css/bootstrap.css',
|
||||||
|
request_headers = [('content-length', '3')],
|
||||||
|
status=200,
|
||||||
|
body='foo')
|
||||||
|
|
||||||
|
self.push(path='/js/bootstrap.js',
|
||||||
|
method='GET',
|
||||||
|
request_headers = [('content-length', '10')],
|
||||||
|
status=200,
|
||||||
|
body='foobarbuzz')
|
||||||
|
|
||||||
|
self.send_response(status=200,
|
||||||
|
headers = [('content-type', 'text/plain')],
|
||||||
|
body=io.BytesIO(b'nghttp2-python FTW'))
|
||||||
|
|
||||||
|
ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
|
||||||
|
ctx.options = ssl.OP_ALL | ssl.OP_NO_SSLv2
|
||||||
|
ctx.load_cert_chain('server.crt', 'server.key')
|
||||||
|
|
||||||
|
# give None to ssl to make the server non-SSL/TLS
|
||||||
|
server = nghttp2.HTTP2Server(('127.0.0.1', 8443), Handler, ssl=ctx)
|
||||||
|
server.serve_forever()
|
||||||
|
|
||||||
Contribution
|
Contribution
|
||||||
------------
|
------------
|
||||||
|
|
||||||
@@ -1449,10 +1552,23 @@ See `Contribution Guidelines
|
|||||||
<https://nghttp2.org/documentation/contribute.html>`_ for more
|
<https://nghttp2.org/documentation/contribute.html>`_ for more
|
||||||
details.
|
details.
|
||||||
|
|
||||||
Versioning
|
Reporting vulnerability
|
||||||
----------
|
-----------------------
|
||||||
|
|
||||||
In general, we follow `Semantic Versioning <http://semver.org/>`_.
|
If you find a vulnerability in our software, please send the email to
|
||||||
|
"tatsuhiro.t at gmail dot com" about its details instead of submitting
|
||||||
|
issues on github issue page. It is a standard practice not to
|
||||||
|
disclose vulnerability information publicly until a fixed version is
|
||||||
|
released, or mitigation is worked out.
|
||||||
|
|
||||||
|
In the future, we may setup a dedicated mail address for this purpose.
|
||||||
|
|
||||||
|
Release schedule
|
||||||
|
----------------
|
||||||
|
|
||||||
|
In general, we follow `Semantic Versioning <http://semver.org/>`_. We
|
||||||
|
release MINOR version update every month, and usually we ship it
|
||||||
|
around 25th day of every month.
|
||||||
|
|
||||||
We may release PATCH releases between the regular releases, mainly for
|
We may release PATCH releases between the regular releases, mainly for
|
||||||
severe security bug fixes.
|
severe security bug fixes.
|
||||||
|
|||||||
31
SECURITY.md
31
SECURITY.md
@@ -1,31 +0,0 @@
|
|||||||
# Security Process
|
|
||||||
|
|
||||||
If you find a vulnerability in our software, please report it via
|
|
||||||
GitHub "Private vulnerability reporting" feature at
|
|
||||||
https://github.com/nghttp2/nghttp2/security instead of submitting
|
|
||||||
issues on github issue page. It is a standard practice not to
|
|
||||||
disclose vulnerability information publicly until a fixed version is
|
|
||||||
released, or mitigation is worked out.
|
|
||||||
|
|
||||||
If we identify that the reported issue is really a vulnerability, we
|
|
||||||
open a new security advisory draft using [GitHub security
|
|
||||||
feature](https://github.com/nghttp2/nghttp2/security) and discuss the
|
|
||||||
mitigation and bug fixes there. The fixes are committed to the
|
|
||||||
private repository.
|
|
||||||
|
|
||||||
We write the security advisory and get CVE number from GitHub
|
|
||||||
privately. We also discuss the disclosure date to the public.
|
|
||||||
|
|
||||||
We make a new release with the fix at the same time when the
|
|
||||||
vulnerability is disclosed to public.
|
|
||||||
|
|
||||||
At least 7 days before the public disclosure date, we open a new issue
|
|
||||||
on [nghttp2 issue tracker](https://github.com/nghttp2/nghttp2/issues)
|
|
||||||
which notifies that the upcoming release will have a security fix.
|
|
||||||
The `SECURITY` label is attached to this kind of issue. The issue is
|
|
||||||
not opened if a vulnerability is already disclosed, and it is publicly
|
|
||||||
known that nghttp2 is affected by that.
|
|
||||||
|
|
||||||
Before few hours of new release, we merge the fixes to the master
|
|
||||||
branch (and/or a release branch if necessary) and make a new release.
|
|
||||||
Security advisory is disclosed on GitHub.
|
|
||||||
@@ -23,15 +23,25 @@
|
|||||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
. ./android-env
|
if [ -z "$ANDROID_HOME" ]; then
|
||||||
|
echo 'No $ANDROID_HOME specified.'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
PREFIX="$ANDROID_HOME"/usr/local
|
||||||
|
TOOLCHAIN="$ANDROID_HOME"/toolchain
|
||||||
|
PATH="$TOOLCHAIN"/bin:"$PATH"
|
||||||
|
|
||||||
./configure \
|
./configure \
|
||||||
--disable-shared \
|
--disable-shared \
|
||||||
--host=$TARGET \
|
--host=arm-linux-androideabi \
|
||||||
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
|
||||||
|
--with-xml-prefix="$PREFIX" \
|
||||||
--without-libxml2 \
|
--without-libxml2 \
|
||||||
|
--disable-python-bindings \
|
||||||
--disable-examples \
|
--disable-examples \
|
||||||
--disable-threads \
|
--disable-threads \
|
||||||
|
CC="$TOOLCHAIN"/bin/arm-linux-androideabi-clang \
|
||||||
|
CXX="$TOOLCHAIN"/bin/arm-linux-androideabi-clang++ \
|
||||||
CPPFLAGS="-fPIE -I$PREFIX/include" \
|
CPPFLAGS="-fPIE -I$PREFIX/include" \
|
||||||
PKG_CONFIG_LIBDIR="$PREFIX/lib/pkgconfig" \
|
PKG_CONFIG_LIBDIR="$PREFIX/lib/pkgconfig" \
|
||||||
LDFLAGS="-fPIE -pie -L$PREFIX/lib"
|
LDFLAGS="-fPIE -pie -L$PREFIX/lib"
|
||||||
|
|||||||
26
src/testdata/Makefile.am → android-make
Normal file → Executable file
26
src/testdata/Makefile.am → android-make
Normal file → Executable file
@@ -1,7 +1,9 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
# nghttp2 - HTTP/2 C Library
|
# nghttp2 - HTTP/2 C Library
|
||||||
|
#
|
||||||
# Copyright (c) 2023 Tatsuhiro Tsujikawa
|
# Copyright (c) 2013 Tatsuhiro Tsujikawa
|
||||||
|
#
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining
|
# Permission is hereby granted, free of charge, to any person obtaining
|
||||||
# a copy of this software and associated documentation files (the
|
# a copy of this software and associated documentation files (the
|
||||||
# "Software"), to deal in the Software without restriction, including
|
# "Software"), to deal in the Software without restriction, including
|
||||||
@@ -9,10 +11,10 @@
|
|||||||
# distribute, sublicense, and/or sell copies of the Software, and to
|
# distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
# permit persons to whom the Software is furnished to do so, subject to
|
# permit persons to whom the Software is furnished to do so, subject to
|
||||||
# the following conditions:
|
# the following conditions:
|
||||||
|
#
|
||||||
# The above copyright notice and this permission notice shall be
|
# The above copyright notice and this permission notice shall be
|
||||||
# included in all copies or substantial portions of the Software.
|
# included in all copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
@@ -20,8 +22,12 @@
|
|||||||
# 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.
|
||||||
EXTRA_DIST = \
|
|
||||||
ipaddr.crt \
|
if [ -z "$ANDROID_HOME" ]; then
|
||||||
nosan.crt \
|
echo 'No $ANDROID_HOME specified.'
|
||||||
nosan_ip.crt \
|
exit 1
|
||||||
verify_hostname.crt
|
fi
|
||||||
|
TOOLCHAIN=$ANDROID_HOME/toolchain
|
||||||
|
PATH=$TOOLCHAIN/bin:$PATH
|
||||||
|
|
||||||
|
make "$@"
|
||||||
53
appveyor.yml
Normal file
53
appveyor.yml
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
# Notes:
|
||||||
|
# - Minimal appveyor.yml file is an empty file. All sections are optional.
|
||||||
|
# - Indent each level of configuration with 2 spaces. Do not use tabs!
|
||||||
|
# - All section names are case-sensitive.
|
||||||
|
# - Section names should be unique on each level.
|
||||||
|
|
||||||
|
#---------------------------------#
|
||||||
|
# general configuration #
|
||||||
|
#---------------------------------#
|
||||||
|
|
||||||
|
# version format
|
||||||
|
#version: 0.10.{build}
|
||||||
|
|
||||||
|
# branches to build
|
||||||
|
branches:
|
||||||
|
# blacklist
|
||||||
|
except:
|
||||||
|
- gh-pages
|
||||||
|
|
||||||
|
# Do not build on tags (GitHub only)
|
||||||
|
skip_tags: true
|
||||||
|
|
||||||
|
#---------------------------------#
|
||||||
|
# environment configuration #
|
||||||
|
#---------------------------------#
|
||||||
|
|
||||||
|
os: Windows Server 2012
|
||||||
|
|
||||||
|
# scripts that run after cloning repository
|
||||||
|
install:
|
||||||
|
# install Win-Flex-Bison
|
||||||
|
#- cmd: cinst winflexbison -y
|
||||||
|
|
||||||
|
#---------------------------------#
|
||||||
|
# build configuration #
|
||||||
|
#---------------------------------#
|
||||||
|
|
||||||
|
# scripts to run before build
|
||||||
|
before_build:
|
||||||
|
- cmd: cmake .
|
||||||
|
|
||||||
|
# scripts to run *after* solution is built and *before* automatic packaging occurs (web apps, NuGet packages, Azure Cloud Services)
|
||||||
|
# before_package:
|
||||||
|
|
||||||
|
# scripts to run after build
|
||||||
|
# after_build:
|
||||||
|
|
||||||
|
# to run your custom scripts instead of automatic MSBuild
|
||||||
|
build_script:
|
||||||
|
- cmd: cmake --build .
|
||||||
|
|
||||||
|
# to disable automatic builds
|
||||||
|
# build: off
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python
|
||||||
|
|
||||||
# script to extract commit author's name from standard input. The
|
# script to extract commit author's name from standard input. The
|
||||||
# input should be <AUTHOR>:<EMAIL>, one per line.
|
# input should be <AUTHOR>:<EMAIL>, one per line.
|
||||||
@@ -49,4 +49,4 @@ for name in names:
|
|||||||
ndict[lowname] = name
|
ndict[lowname] = name
|
||||||
|
|
||||||
for name in sorted(ndict.values()):
|
for name in sorted(ndict.values()):
|
||||||
print(name)
|
print name
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
if(LIBBPF_FOUND)
|
|
||||||
add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/reuseport_kern.o"
|
|
||||||
COMMAND ${CMAKE_C_COMPILER} ${BPFCFLAGS} ${EXTRABPFCFLAGS} -I${LIBBPF_INCLUDE_DIRS} -target bpf -c reuseport_kern.c -o "${CMAKE_CURRENT_BINARY_DIR}/reuseport_kern.o"
|
|
||||||
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
|
||||||
VERBATIM)
|
|
||||||
|
|
||||||
add_custom_target(bpf ALL
|
|
||||||
DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/reuseport_kern.o"
|
|
||||||
VERBATIM)
|
|
||||||
|
|
||||||
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/reuseport_kern.o"
|
|
||||||
DESTINATION "${CMAKE_INSTALL_LIBDIR}/${CMAKE_PROJECT_NAME}")
|
|
||||||
endif()
|
|
||||||
@@ -1,579 +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_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 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 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};
|
|
||||||
|
|
||||||
/* 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);
|
|
||||||
} worker_id_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, 1);
|
|
||||||
__type(key, __u32);
|
|
||||||
__type(value, __u64);
|
|
||||||
} sk_info SEC(".maps");
|
|
||||||
|
|
||||||
struct {
|
|
||||||
__uint(type, BPF_MAP_TYPE_ARRAY);
|
|
||||||
__uint(max_entries, 1);
|
|
||||||
__type(key, __u32);
|
|
||||||
__type(value, struct AES_ctx);
|
|
||||||
} aes_key SEC(".maps");
|
|
||||||
|
|
||||||
typedef struct quic_hd {
|
|
||||||
__u8 *dcid;
|
|
||||||
__u32 dcidlen;
|
|
||||||
__u32 dcid_offset;
|
|
||||||
__u8 type;
|
|
||||||
} quic_hd;
|
|
||||||
|
|
||||||
#define SV_DCIDLEN 17
|
|
||||||
#define MAX_DCIDLEN 20
|
|
||||||
#define MIN_DCIDLEN 8
|
|
||||||
#define WORKER_IDLEN 8
|
|
||||||
#define WORKER_ID_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;
|
|
||||||
__u32 zero = 0;
|
|
||||||
int rv;
|
|
||||||
quic_hd qhd;
|
|
||||||
__u8 qpktbuf[6 + MAX_DCIDLEN];
|
|
||||||
struct AES_ctx *aes_ctx;
|
|
||||||
__u8 *worker_id;
|
|
||||||
__u16 remote_port;
|
|
||||||
__u8 *data = reuse_md->data;
|
|
||||||
|
|
||||||
/* Packets less than 22 bytes never be a valid QUIC packet. */
|
|
||||||
if (reuse_md->len < sizeof(struct udphdr) + 22) {
|
|
||||||
return SK_DROP;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (reuse_md->data + sizeof(struct udphdr) > reuse_md->data_end) {
|
|
||||||
return SK_DROP;
|
|
||||||
}
|
|
||||||
|
|
||||||
remote_port = (data[0] << 8) + data[1];
|
|
||||||
|
|
||||||
switch (remote_port) {
|
|
||||||
case 1900:
|
|
||||||
case 5353:
|
|
||||||
case 11211:
|
|
||||||
case 20800:
|
|
||||||
case 27015:
|
|
||||||
return SK_DROP;
|
|
||||||
default:
|
|
||||||
if (remote_port < 1024) {
|
|
||||||
return SK_DROP;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
aes_ctx = bpf_map_lookup_elem(&aes_key, &zero);
|
|
||||||
if (aes_ctx == NULL) {
|
|
||||||
return SK_DROP;
|
|
||||||
}
|
|
||||||
|
|
||||||
rv = parse_quic(&qhd, qpktbuf, qpktbuf + sizeof(qpktbuf));
|
|
||||||
if (rv != 0) {
|
|
||||||
return SK_DROP;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (qhd.type) {
|
|
||||||
case NGTCP2_PKT_INITIAL:
|
|
||||||
case NGTCP2_PKT_0RTT:
|
|
||||||
if (qhd.dcidlen == SV_DCIDLEN) {
|
|
||||||
worker_id = qhd.dcid + WORKER_ID_OFFSET;
|
|
||||||
AES_ECB_decrypt(aes_ctx, worker_id);
|
|
||||||
|
|
||||||
psk_index = bpf_map_lookup_elem(&worker_id_map, worker_id);
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
worker_id = qhd.dcid + WORKER_ID_OFFSET;
|
|
||||||
AES_ECB_decrypt(aes_ctx, worker_id);
|
|
||||||
|
|
||||||
psk_index = bpf_map_lookup_elem(&worker_id_map, worker_id);
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
40
cmake/FindCUnit.cmake
Normal file
40
cmake/FindCUnit.cmake
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
# - Try to find cunit
|
||||||
|
# Once done this will define
|
||||||
|
# CUNIT_FOUND - System has cunit
|
||||||
|
# CUNIT_INCLUDE_DIRS - The cunit include directories
|
||||||
|
# CUNIT_LIBRARIES - The libraries needed to use cunit
|
||||||
|
|
||||||
|
find_package(PkgConfig QUIET)
|
||||||
|
pkg_check_modules(PC_CUNIT QUIET cunit)
|
||||||
|
|
||||||
|
find_path(CUNIT_INCLUDE_DIR
|
||||||
|
NAMES CUnit/CUnit.h
|
||||||
|
HINTS ${PC_CUNIT_INCLUDE_DIRS}
|
||||||
|
)
|
||||||
|
find_library(CUNIT_LIBRARY
|
||||||
|
NAMES cunit
|
||||||
|
HINTS ${PC_CUNIT_LIBRARY_DIRS}
|
||||||
|
)
|
||||||
|
|
||||||
|
if(CUNIT_INCLUDE_DIR)
|
||||||
|
set(_version_regex "^#define[ \t]+CU_VERSION[ \t]+\"([^\"]+)\".*")
|
||||||
|
file(STRINGS "${CUNIT_INCLUDE_DIR}/CUnit/CUnit.h"
|
||||||
|
CUNIT_VERSION REGEX "${_version_regex}")
|
||||||
|
string(REGEX REPLACE "${_version_regex}" "\\1"
|
||||||
|
CUNIT_VERSION "${CUNIT_VERSION}")
|
||||||
|
unset(_version_regex)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
# handle the QUIETLY and REQUIRED arguments and set CUNIT_FOUND to TRUE
|
||||||
|
# if all listed variables are TRUE and the requested version matches.
|
||||||
|
find_package_handle_standard_args(CUnit REQUIRED_VARS
|
||||||
|
CUNIT_LIBRARY CUNIT_INCLUDE_DIR
|
||||||
|
VERSION_VAR CUNIT_VERSION)
|
||||||
|
|
||||||
|
if(CUNIT_FOUND)
|
||||||
|
set(CUNIT_LIBRARIES ${CUNIT_LIBRARY})
|
||||||
|
set(CUNIT_INCLUDE_DIRS ${CUNIT_INCLUDE_DIR})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
mark_as_advanced(CUNIT_INCLUDE_DIR CUNIT_LIBRARY)
|
||||||
44
cmake/FindCython.cmake
Normal file
44
cmake/FindCython.cmake
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
# Find the Cython compiler.
|
||||||
|
#
|
||||||
|
# This code sets the following variables:
|
||||||
|
#
|
||||||
|
# CYTHON_EXECUTABLE
|
||||||
|
#
|
||||||
|
# See also UseCython.cmake
|
||||||
|
|
||||||
|
#=============================================================================
|
||||||
|
# Copyright 2011 Kitware, Inc.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
#=============================================================================
|
||||||
|
|
||||||
|
# Use the Cython executable that lives next to the Python executable
|
||||||
|
# if it is a local installation.
|
||||||
|
find_package( PythonInterp )
|
||||||
|
if( PYTHONINTERP_FOUND )
|
||||||
|
get_filename_component( _python_path ${PYTHON_EXECUTABLE} PATH )
|
||||||
|
find_program( CYTHON_EXECUTABLE
|
||||||
|
NAMES cython cython.bat cython3
|
||||||
|
HINTS ${_python_path}
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
find_program( CYTHON_EXECUTABLE
|
||||||
|
NAMES cython cython.bat cython3
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
include( FindPackageHandleStandardArgs )
|
||||||
|
FIND_PACKAGE_HANDLE_STANDARD_ARGS( Cython REQUIRED_VARS CYTHON_EXECUTABLE )
|
||||||
|
|
||||||
|
mark_as_advanced( CYTHON_EXECUTABLE )
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
# - Try to find libbpf
|
|
||||||
# Once done this will define
|
|
||||||
# LIBBPF_FOUND - System has libbpf
|
|
||||||
# LIBBPF_INCLUDE_DIRS - The libbpf include directories
|
|
||||||
# LIBBPF_LIBRARIES - The libraries needed to use libbpf
|
|
||||||
|
|
||||||
find_package(PkgConfig QUIET)
|
|
||||||
pkg_check_modules(PC_LIBBPF QUIET libbpf)
|
|
||||||
|
|
||||||
find_path(LIBBPF_INCLUDE_DIR
|
|
||||||
NAMES bpf/bpf.h
|
|
||||||
HINTS ${PC_LIBBPF_INCLUDE_DIRS}
|
|
||||||
)
|
|
||||||
find_library(LIBBPF_LIBRARY
|
|
||||||
NAMES bpf
|
|
||||||
HINTS ${PC_LIBBPF_LIBRARY_DIRS}
|
|
||||||
)
|
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
# handle the QUIETLY and REQUIRED arguments and set LIBBPF_FOUND
|
|
||||||
# to TRUE if all listed variables are TRUE and the requested version
|
|
||||||
# matches.
|
|
||||||
find_package_handle_standard_args(Libbpf REQUIRED_VARS
|
|
||||||
LIBBPF_LIBRARY LIBBPF_INCLUDE_DIR
|
|
||||||
VERSION_VAR LIBBPF_VERSION)
|
|
||||||
|
|
||||||
if(LIBBPF_FOUND)
|
|
||||||
set(LIBBPF_LIBRARIES ${LIBBPF_LIBRARY})
|
|
||||||
set(LIBBPF_INCLUDE_DIRS ${LIBBPF_INCLUDE_DIR})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
mark_as_advanced(LIBBPF_INCLUDE_DIR LIBBPF_LIBRARY)
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
# - Try to find libbrotlidec
|
|
||||||
# Once done this will define
|
|
||||||
# LIBBROTLIDEC_FOUND - System has libbrotlidec
|
|
||||||
# LIBBROTLIDEC_INCLUDE_DIRS - The libbrotlidec include directories
|
|
||||||
# LIBBROTLIDEC_LIBRARIES - The libraries needed to use libbrotlidec
|
|
||||||
|
|
||||||
find_package(PkgConfig QUIET)
|
|
||||||
pkg_check_modules(PC_LIBBROTLIDEC QUIET libbrotlidec)
|
|
||||||
|
|
||||||
find_path(LIBBROTLIDEC_INCLUDE_DIR
|
|
||||||
NAMES brotli/decode.h
|
|
||||||
HINTS ${PC_LIBBROTLIDEC_INCLUDE_DIRS}
|
|
||||||
)
|
|
||||||
find_library(LIBBROTLIDEC_LIBRARY
|
|
||||||
NAMES brotlidec
|
|
||||||
HINTS ${PC_LIBBROTLIDEC_LIBRARY_DIRS}
|
|
||||||
)
|
|
||||||
|
|
||||||
if(PC_LIBBROTLIDEC_FOUND)
|
|
||||||
set(LIBBROTLIDEC_VERSION ${PC_LIBBROTLIDEC_VERSION})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
# handle the QUIETLY and REQUIRED arguments and set LIBBROTLIDEC_FOUND
|
|
||||||
# to TRUE if all listed variables are TRUE and the requested version
|
|
||||||
# matches.
|
|
||||||
find_package_handle_standard_args(Libbrotlidec REQUIRED_VARS
|
|
||||||
LIBBROTLIDEC_LIBRARY LIBBROTLIDEC_INCLUDE_DIR
|
|
||||||
VERSION_VAR LIBBROTLIDEC_VERSION)
|
|
||||||
|
|
||||||
if(LIBBROTLIDEC_FOUND)
|
|
||||||
set(LIBBROTLIDEC_LIBRARIES ${LIBBROTLIDEC_LIBRARY})
|
|
||||||
set(LIBBROTLIDEC_INCLUDE_DIRS ${LIBBROTLIDEC_INCLUDE_DIR})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
mark_as_advanced(LIBBROTLIDEC_INCLUDE_DIR LIBBROTLIDEC_LIBRARY)
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
# - Try to find libbrotlienc
|
|
||||||
# Once done this will define
|
|
||||||
# LIBBROTLIENC_FOUND - System has libbrotlienc
|
|
||||||
# LIBBROTLIENC_INCLUDE_DIRS - The libbrotlienc include directories
|
|
||||||
# LIBBROTLIENC_LIBRARIES - The libraries needed to use libbrotlienc
|
|
||||||
|
|
||||||
find_package(PkgConfig QUIET)
|
|
||||||
pkg_check_modules(PC_LIBBROTLIENC QUIET libbrotlienc)
|
|
||||||
|
|
||||||
find_path(LIBBROTLIENC_INCLUDE_DIR
|
|
||||||
NAMES brotli/encode.h
|
|
||||||
HINTS ${PC_LIBBROTLIENC_INCLUDE_DIRS}
|
|
||||||
)
|
|
||||||
find_library(LIBBROTLIENC_LIBRARY
|
|
||||||
NAMES brotlienc
|
|
||||||
HINTS ${PC_LIBBROTLIENC_LIBRARY_DIRS}
|
|
||||||
)
|
|
||||||
|
|
||||||
if(PC_LIBBROTLIENC_FOUND)
|
|
||||||
set(LIBBROTLIENC_VERSION ${PC_LIBBROTLIENC_VERSION})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
# handle the QUIETLY and REQUIRED arguments and set LIBBROTLIENC_FOUND
|
|
||||||
# to TRUE if all listed variables are TRUE and the requested version
|
|
||||||
# matches.
|
|
||||||
find_package_handle_standard_args(Libbrotlienc REQUIRED_VARS
|
|
||||||
LIBBROTLIENC_LIBRARY LIBBROTLIENC_INCLUDE_DIR
|
|
||||||
VERSION_VAR LIBBROTLIENC_VERSION)
|
|
||||||
|
|
||||||
if(LIBBROTLIENC_FOUND)
|
|
||||||
set(LIBBROTLIENC_LIBRARIES ${LIBBROTLIENC_LIBRARY})
|
|
||||||
set(LIBBROTLIENC_INCLUDE_DIRS ${LIBBROTLIENC_INCLUDE_DIR})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
mark_as_advanced(LIBBROTLIENC_INCLUDE_DIR LIBBROTLIENC_LIBRARY)
|
|
||||||
@@ -17,18 +17,12 @@ find_library(LIBCARES_LIBRARY
|
|||||||
)
|
)
|
||||||
|
|
||||||
if(LIBCARES_INCLUDE_DIR)
|
if(LIBCARES_INCLUDE_DIR)
|
||||||
file(READ "${LIBCARES_INCLUDE_DIR}/ares_version.h" _ares_version_h)
|
set(_version_regex "^#define[ \t]+ARES_VERSION_STR[ \t]+\"([^\"]+)\".*")
|
||||||
string(REGEX REPLACE ".*#define[ \t]+ARES_VERSION_MAJOR[ \t]+([0-9]+).*" "\\1"
|
file(STRINGS "${LIBCARES_INCLUDE_DIR}/ares_version.h"
|
||||||
_ares_version_major ${_ares_version_h})
|
LIBCARES_VERSION REGEX "${_version_regex}")
|
||||||
string(REGEX REPLACE ".*#define[ \t]+ARES_VERSION_MINOR[ \t]+([0-9]+).*" "\\1"
|
string(REGEX REPLACE "${_version_regex}" "\\1"
|
||||||
_ares_version_minor ${_ares_version_h})
|
LIBCARES_VERSION "${LIBCARES_VERSION}")
|
||||||
string(REGEX REPLACE ".*#define[ \t]+ARES_VERSION_PATCH[ \t]+([0-9]+).*" "\\1"
|
unset(_version_regex)
|
||||||
_ares_version_patch ${_ares_version_h})
|
|
||||||
set(LIBCARES_VERSION "${_ares_version_major}.${_ares_version_minor}.${_ares_version_patch}")
|
|
||||||
unset(_ares_version_patch)
|
|
||||||
unset(_ares_version_minor)
|
|
||||||
unset(_ares_version_major)
|
|
||||||
unset(_ares_version_h)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
include(FindPackageHandleStandardArgs)
|
||||||
|
|||||||
@@ -1,41 +0,0 @@
|
|||||||
# - Try to find libnghttp3
|
|
||||||
# Once done this will define
|
|
||||||
# LIBNGHTTP3_FOUND - System has libnghttp3
|
|
||||||
# LIBNGHTTP3_INCLUDE_DIRS - The libnghttp3 include directories
|
|
||||||
# LIBNGHTTP3_LIBRARIES - The libraries needed to use libnghttp3
|
|
||||||
|
|
||||||
find_package(PkgConfig QUIET)
|
|
||||||
pkg_check_modules(PC_LIBNGHTTP3 QUIET libnghttp3)
|
|
||||||
|
|
||||||
find_path(LIBNGHTTP3_INCLUDE_DIR
|
|
||||||
NAMES nghttp3/nghttp3.h
|
|
||||||
HINTS ${PC_LIBNGHTTP3_INCLUDE_DIRS}
|
|
||||||
)
|
|
||||||
find_library(LIBNGHTTP3_LIBRARY
|
|
||||||
NAMES nghttp3
|
|
||||||
HINTS ${PC_LIBNGHTTP3_LIBRARY_DIRS}
|
|
||||||
)
|
|
||||||
|
|
||||||
if(LIBNGHTTP3_INCLUDE_DIR)
|
|
||||||
set(_version_regex "^#define[ \t]+NGHTTP3_VERSION[ \t]+\"([^\"]+)\".*")
|
|
||||||
file(STRINGS "${LIBNGHTTP3_INCLUDE_DIR}/nghttp3/version.h"
|
|
||||||
LIBNGHTTP3_VERSION REGEX "${_version_regex}")
|
|
||||||
string(REGEX REPLACE "${_version_regex}" "\\1"
|
|
||||||
LIBNGHTTP3_VERSION "${LIBNGHTTP3_VERSION}")
|
|
||||||
unset(_version_regex)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
# handle the QUIETLY and REQUIRED arguments and set LIBNGHTTP3_FOUND
|
|
||||||
# to TRUE if all listed variables are TRUE and the requested version
|
|
||||||
# matches.
|
|
||||||
find_package_handle_standard_args(Libnghttp3 REQUIRED_VARS
|
|
||||||
LIBNGHTTP3_LIBRARY LIBNGHTTP3_INCLUDE_DIR
|
|
||||||
VERSION_VAR LIBNGHTTP3_VERSION)
|
|
||||||
|
|
||||||
if(LIBNGHTTP3_FOUND)
|
|
||||||
set(LIBNGHTTP3_LIBRARIES ${LIBNGHTTP3_LIBRARY})
|
|
||||||
set(LIBNGHTTP3_INCLUDE_DIRS ${LIBNGHTTP3_INCLUDE_DIR})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
mark_as_advanced(LIBNGHTTP3_INCLUDE_DIR LIBNGHTTP3_LIBRARY)
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
# - Try to find libngtcp2
|
|
||||||
# Once done this will define
|
|
||||||
# LIBNGTCP2_FOUND - System has libngtcp2
|
|
||||||
# LIBNGTCP2_INCLUDE_DIRS - The libngtcp2 include directories
|
|
||||||
# LIBNGTCP2_LIBRARIES - The libraries needed to use libngtcp2
|
|
||||||
|
|
||||||
find_package(PkgConfig QUIET)
|
|
||||||
pkg_check_modules(PC_LIBNGTCP2 QUIET libngtcp2)
|
|
||||||
|
|
||||||
find_path(LIBNGTCP2_INCLUDE_DIR
|
|
||||||
NAMES ngtcp2/ngtcp2.h
|
|
||||||
HINTS ${PC_LIBNGTCP2_INCLUDE_DIRS}
|
|
||||||
)
|
|
||||||
find_library(LIBNGTCP2_LIBRARY
|
|
||||||
NAMES ngtcp2
|
|
||||||
HINTS ${PC_LIBNGTCP2_LIBRARY_DIRS}
|
|
||||||
)
|
|
||||||
|
|
||||||
if(LIBNGTCP2_INCLUDE_DIR)
|
|
||||||
set(_version_regex "^#define[ \t]+NGTCP2_VERSION[ \t]+\"([^\"]+)\".*")
|
|
||||||
file(STRINGS "${LIBNGTCP2_INCLUDE_DIR}/ngtcp2/version.h"
|
|
||||||
LIBNGTCP2_VERSION REGEX "${_version_regex}")
|
|
||||||
string(REGEX REPLACE "${_version_regex}" "\\1"
|
|
||||||
LIBNGTCP2_VERSION "${LIBNGTCP2_VERSION}")
|
|
||||||
unset(_version_regex)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
# handle the QUIETLY and REQUIRED arguments and set LIBNGTCP2_FOUND
|
|
||||||
# to TRUE if all listed variables are TRUE and the requested version
|
|
||||||
# matches.
|
|
||||||
find_package_handle_standard_args(Libngtcp2 REQUIRED_VARS
|
|
||||||
LIBNGTCP2_LIBRARY LIBNGTCP2_INCLUDE_DIR
|
|
||||||
VERSION_VAR LIBNGTCP2_VERSION)
|
|
||||||
|
|
||||||
if(LIBNGTCP2_FOUND)
|
|
||||||
set(LIBNGTCP2_LIBRARIES ${LIBNGTCP2_LIBRARY})
|
|
||||||
set(LIBNGTCP2_INCLUDE_DIRS ${LIBNGTCP2_INCLUDE_DIR})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
mark_as_advanced(LIBNGTCP2_INCLUDE_DIR LIBNGTCP2_LIBRARY)
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
# - Try to find libngtcp2_crypto_quictls
|
|
||||||
# Once done this will define
|
|
||||||
# LIBNGTCP2_CRYPTO_QUICTLS_FOUND - System has libngtcp2_crypto_quictls
|
|
||||||
# LIBNGTCP2_CRYPTO_QUICTLS_INCLUDE_DIRS - The libngtcp2_crypto_quictls include directories
|
|
||||||
# LIBNGTCP2_CRYPTO_QUICTLS_LIBRARIES - The libraries needed to use libngtcp2_crypto_quictls
|
|
||||||
|
|
||||||
find_package(PkgConfig QUIET)
|
|
||||||
pkg_check_modules(PC_LIBNGTCP2_CRYPTO_QUICTLS QUIET libngtcp2_crypto_quictls)
|
|
||||||
|
|
||||||
find_path(LIBNGTCP2_CRYPTO_QUICTLS_INCLUDE_DIR
|
|
||||||
NAMES ngtcp2/ngtcp2_crypto_quictls.h
|
|
||||||
HINTS ${PC_LIBNGTCP2_CRYPTO_QUICTLS_INCLUDE_DIRS}
|
|
||||||
)
|
|
||||||
find_library(LIBNGTCP2_CRYPTO_QUICTLS_LIBRARY
|
|
||||||
NAMES ngtcp2_crypto_quictls
|
|
||||||
HINTS ${PC_LIBNGTCP2_CRYPTO_QUICTLS_LIBRARY_DIRS}
|
|
||||||
)
|
|
||||||
|
|
||||||
if(LIBNGTCP2_CRYPTO_QUICTLS_INCLUDE_DIR)
|
|
||||||
set(_version_regex "^#define[ \t]+NGTCP2_VERSION[ \t]+\"([^\"]+)\".*")
|
|
||||||
file(STRINGS "${LIBNGTCP2_CRYPTO_QUICTLS_INCLUDE_DIR}/ngtcp2/version.h"
|
|
||||||
LIBNGTCP2_CRYPTO_QUICTLS_VERSION REGEX "${_version_regex}")
|
|
||||||
string(REGEX REPLACE "${_version_regex}" "\\1"
|
|
||||||
LIBNGTCP2_CRYPTO_QUICTLS_VERSION "${LIBNGTCP2_CRYPTO_QUICTLS_VERSION}")
|
|
||||||
unset(_version_regex)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
# handle the QUIETLY and REQUIRED arguments and set
|
|
||||||
# LIBNGTCP2_CRYPTO_QUICTLS_FOUND to TRUE if all listed variables are
|
|
||||||
# TRUE and the requested version matches.
|
|
||||||
find_package_handle_standard_args(Libngtcp2_crypto_quictls REQUIRED_VARS
|
|
||||||
LIBNGTCP2_CRYPTO_QUICTLS_LIBRARY
|
|
||||||
LIBNGTCP2_CRYPTO_QUICTLS_INCLUDE_DIR
|
|
||||||
VERSION_VAR LIBNGTCP2_CRYPTO_QUICTLS_VERSION)
|
|
||||||
|
|
||||||
if(LIBNGTCP2_CRYPTO_QUICTLS_FOUND)
|
|
||||||
set(LIBNGTCP2_CRYPTO_QUICTLS_LIBRARIES ${LIBNGTCP2_CRYPTO_QUICTLS_LIBRARY})
|
|
||||||
set(LIBNGTCP2_CRYPTO_QUICTLS_INCLUDE_DIRS ${LIBNGTCP2_CRYPTO_QUICTLS_INCLUDE_DIR})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
mark_as_advanced(LIBNGTCP2_CRYPTO_QUICTLS_INCLUDE_DIR
|
|
||||||
LIBNGTCP2_CRYPTO_QUICTLS_LIBRARY)
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
# - Try to find libngtcp2_crypto_wolfssl
|
|
||||||
# Once done this will define
|
|
||||||
# LIBNGTCP2_CRYPTO_WOLFSSL_FOUND - System has libngtcp2_crypto_wolfssl
|
|
||||||
# LIBNGTCP2_CRYPTO_WOLFSSL_INCLUDE_DIRS - The libngtcp2_crypto_wolfssl include directories
|
|
||||||
# LIBNGTCP2_CRYPTO_WOLFSSL_LIBRARIES - The libraries needed to use libngtcp2_crypto_wolfssl
|
|
||||||
|
|
||||||
find_package(PkgConfig QUIET)
|
|
||||||
pkg_check_modules(PC_LIBNGTCP2_CRYPTO_WOLFSSL QUIET libngtcp2_crypto_wolfssl)
|
|
||||||
|
|
||||||
find_path(LIBNGTCP2_CRYPTO_WOLFSSL_INCLUDE_DIR
|
|
||||||
NAMES ngtcp2/ngtcp2_crypto_wolfssl.h
|
|
||||||
HINTS ${PC_LIBNGTCP2_CRYPTO_WOLFSSL_INCLUDE_DIRS}
|
|
||||||
)
|
|
||||||
find_library(LIBNGTCP2_CRYPTO_WOLFSSL_LIBRARY
|
|
||||||
NAMES ngtcp2_crypto_wolfssl
|
|
||||||
HINTS ${PC_LIBNGTCP2_CRYPTO_WOLFSSL_LIBRARY_DIRS}
|
|
||||||
)
|
|
||||||
|
|
||||||
if(LIBNGTCP2_CRYPTO_WOLFSSL_INCLUDE_DIR)
|
|
||||||
set(_version_regex "^#define[ \t]+NGTCP2_VERSION[ \t]+\"([^\"]+)\".*")
|
|
||||||
file(STRINGS "${LIBNGTCP2_CRYPTO_WOLFSSL_INCLUDE_DIR}/ngtcp2/version.h"
|
|
||||||
LIBNGTCP2_CRYPTO_WOLFSSL_VERSION REGEX "${_version_regex}")
|
|
||||||
string(REGEX REPLACE "${_version_regex}" "\\1"
|
|
||||||
LIBNGTCP2_CRYPTO_WOLFSSL_VERSION "${LIBNGTCP2_CRYPTO_WOLFSSL_VERSION}")
|
|
||||||
unset(_version_regex)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
# handle the QUIETLY and REQUIRED arguments and set
|
|
||||||
# LIBNGTCP2_CRYPTO_WOLFSSL_FOUND to TRUE if all listed variables are
|
|
||||||
# TRUE and the requested version matches.
|
|
||||||
find_package_handle_standard_args(Libngtcp2_crypto_wolfssl REQUIRED_VARS
|
|
||||||
LIBNGTCP2_CRYPTO_WOLFSSL_LIBRARY
|
|
||||||
LIBNGTCP2_CRYPTO_WOLFSSL_INCLUDE_DIR
|
|
||||||
VERSION_VAR LIBNGTCP2_CRYPTO_WOLFSSL_VERSION)
|
|
||||||
|
|
||||||
if(LIBNGTCP2_CRYPTO_WOLFSSL_FOUND)
|
|
||||||
set(LIBNGTCP2_CRYPTO_WOLFSSL_LIBRARIES ${LIBNGTCP2_CRYPTO_WOLFSSL_LIBRARY})
|
|
||||||
set(LIBNGTCP2_CRYPTO_WOLFSSL_INCLUDE_DIRS ${LIBNGTCP2_CRYPTO_WOLFSSL_INCLUDE_DIR})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
mark_as_advanced(LIBNGTCP2_CRYPTO_WOLFSSL_INCLUDE_DIR
|
|
||||||
LIBNGTCP2_CRYPTO_WOLFSSL_LIBRARY)
|
|
||||||
@@ -15,5 +15,5 @@ find_library(SYSTEMD_LIBRARIES NAMES systemd ${PC_SYSTEMD_LIBRARY_DIRS})
|
|||||||
find_path(SYSTEMD_INCLUDE_DIRS systemd/sd-login.h HINTS ${PC_SYSTEMD_INCLUDE_DIRS})
|
find_path(SYSTEMD_INCLUDE_DIRS systemd/sd-login.h HINTS ${PC_SYSTEMD_INCLUDE_DIRS})
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
include(FindPackageHandleStandardArgs)
|
||||||
find_package_handle_standard_args(Systemd DEFAULT_MSG SYSTEMD_INCLUDE_DIRS SYSTEMD_LIBRARIES)
|
find_package_handle_standard_args(SYSTEMD DEFAULT_MSG SYSTEMD_INCLUDE_DIRS SYSTEMD_LIBRARIES)
|
||||||
mark_as_advanced(SYSTEMD_INCLUDE_DIRS SYSTEMD_LIBRARIES)
|
mark_as_advanced(SYSTEMD_INCLUDE_DIRS SYSTEMD_LIBRARIES)
|
||||||
|
|||||||
@@ -1,41 +0,0 @@
|
|||||||
# - Try to find wolfssl
|
|
||||||
# Once done this will define
|
|
||||||
# WOLFSSL_FOUND - System has wolfssl
|
|
||||||
# WOLFSSL_INCLUDE_DIRS - The wolfssl include directories
|
|
||||||
# WOLFSSL_LIBRARIES - The libraries needed to use wolfssl
|
|
||||||
|
|
||||||
find_package(PkgConfig QUIET)
|
|
||||||
pkg_check_modules(PC_WOLFSSL QUIET wolfssl)
|
|
||||||
|
|
||||||
find_path(WOLFSSL_INCLUDE_DIR
|
|
||||||
NAMES wolfssl/ssl.h
|
|
||||||
HINTS ${PC_WOLFSSL_INCLUDE_DIRS}
|
|
||||||
)
|
|
||||||
find_library(WOLFSSL_LIBRARY
|
|
||||||
NAMES wolfssl
|
|
||||||
HINTS ${PC_WOLFSSL_LIBRARY_DIRS}
|
|
||||||
)
|
|
||||||
|
|
||||||
if(WOLFSSL_INCLUDE_DIR)
|
|
||||||
set(_version_regex "^#define[ \t]+LIBWOLFSSL_VERSION_STRING[ \t]+\"([^\"]+)\".*")
|
|
||||||
file(STRINGS "${WOLFSSL_INCLUDE_DIR}/wolfssl/version.h"
|
|
||||||
WOLFSSL_VERSION REGEX "${_version_regex}")
|
|
||||||
string(REGEX REPLACE "${_version_regex}" "\\1"
|
|
||||||
WOLFSSL_VERSION "${WOLFSSL_VERSION}")
|
|
||||||
unset(_version_regex)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
# handle the QUIETLY and REQUIRED arguments and set WOLFSSL_FOUND
|
|
||||||
# to TRUE if all listed variables are TRUE and the requested version
|
|
||||||
# matches.
|
|
||||||
find_package_handle_standard_args(WolfSSL REQUIRED_VARS
|
|
||||||
WOLFSSL_LIBRARY WOLFSSL_INCLUDE_DIR
|
|
||||||
VERSION_VAR WOLFSSL_VERSION)
|
|
||||||
|
|
||||||
if(WOLFSSL_FOUND)
|
|
||||||
set(WOLFSSL_LIBRARIES ${WOLFSSL_LIBRARY})
|
|
||||||
set(WOLFSSL_INCLUDE_DIRS ${WOLFSSL_INCLUDE_DIR})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
mark_as_advanced(WOLFSSL_INCLUDE_DIR WOLFSSL_LIBRARY)
|
|
||||||
@@ -1,162 +0,0 @@
|
|||||||
# nghttp2
|
|
||||||
#
|
|
||||||
# Copyright (c) 2023 nghttp2 contributors
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
# C
|
|
||||||
|
|
||||||
include(CheckCCompilerFlag)
|
|
||||||
|
|
||||||
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR CMAKE_C_COMPILER_ID MATCHES "Clang")
|
|
||||||
|
|
||||||
# https://clang.llvm.org/docs/DiagnosticsReference.html
|
|
||||||
# https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
|
|
||||||
|
|
||||||
# WPICKY_ENABLE = Options we want to enable as-is.
|
|
||||||
# WPICKY_DETECT = Options we want to test first and enable if available.
|
|
||||||
|
|
||||||
# Prefer the -Wextra alias with clang.
|
|
||||||
if(CMAKE_C_COMPILER_ID MATCHES "Clang")
|
|
||||||
set(WPICKY_ENABLE "-Wextra")
|
|
||||||
else()
|
|
||||||
set(WPICKY_ENABLE "-W")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
list(APPEND WPICKY_ENABLE
|
|
||||||
-Wall
|
|
||||||
)
|
|
||||||
|
|
||||||
# ----------------------------------
|
|
||||||
# Add new options here, if in doubt:
|
|
||||||
# ----------------------------------
|
|
||||||
set(WPICKY_DETECT
|
|
||||||
)
|
|
||||||
|
|
||||||
# Assume these options always exist with both clang and gcc.
|
|
||||||
# Require clang 3.0 / gcc 2.95 or later.
|
|
||||||
list(APPEND WPICKY_ENABLE
|
|
||||||
-Wconversion # clang 3.0 gcc 2.95
|
|
||||||
-Winline # clang 1.0 gcc 1.0
|
|
||||||
-Wmissing-declarations # clang 1.0 gcc 2.7
|
|
||||||
-Wmissing-prototypes # clang 1.0 gcc 1.0
|
|
||||||
-Wnested-externs # clang 1.0 gcc 2.7
|
|
||||||
-Wpointer-arith # clang 1.0 gcc 1.4
|
|
||||||
-Wshadow # clang 1.0 gcc 2.95
|
|
||||||
-Wundef # clang 1.0 gcc 2.95
|
|
||||||
-Wwrite-strings # clang 1.0 gcc 1.4
|
|
||||||
)
|
|
||||||
|
|
||||||
# Always enable with clang, version dependent with gcc
|
|
||||||
set(WPICKY_COMMON_OLD
|
|
||||||
-Waddress # clang 3.0 gcc 4.3
|
|
||||||
-Wattributes # clang 3.0 gcc 4.1
|
|
||||||
-Wcast-align # clang 1.0 gcc 4.2
|
|
||||||
-Wdeclaration-after-statement # clang 1.0 gcc 3.4
|
|
||||||
-Wdiv-by-zero # clang 3.0 gcc 4.1
|
|
||||||
-Wempty-body # clang 3.0 gcc 4.3
|
|
||||||
-Wendif-labels # clang 1.0 gcc 3.3
|
|
||||||
-Wfloat-equal # clang 1.0 gcc 2.96 (3.0)
|
|
||||||
-Wformat-nonliteral # clang 3.0 gcc 4.1
|
|
||||||
-Wformat-security # clang 3.0 gcc 4.1
|
|
||||||
-Wmissing-field-initializers # clang 3.0 gcc 4.1
|
|
||||||
-Wmissing-noreturn # clang 3.0 gcc 4.1
|
|
||||||
-Wno-format-nonliteral # clang 1.0 gcc 2.96 (3.0) # This is required because we pass format string as "const char*"
|
|
||||||
# -Wpadded # clang 3.0 gcc 4.1 # Not used because we cannot change public structs
|
|
||||||
-Wredundant-decls # clang 3.0 gcc 4.1
|
|
||||||
-Wsign-conversion # clang 3.0 gcc 4.3
|
|
||||||
-Wstrict-prototypes # clang 1.0 gcc 3.3
|
|
||||||
# -Wswitch-enum # clang 3.0 gcc 4.1 # Not used because this basically disallows default case
|
|
||||||
-Wunreachable-code # clang 3.0 gcc 4.1
|
|
||||||
-Wunused-parameter # clang 3.0 gcc 4.1
|
|
||||||
-Wvla # clang 2.8 gcc 4.3
|
|
||||||
)
|
|
||||||
|
|
||||||
set(WPICKY_COMMON
|
|
||||||
-Wpragmas # clang 3.5 gcc 4.1 appleclang 6.0
|
|
||||||
)
|
|
||||||
|
|
||||||
if(CMAKE_C_COMPILER_ID MATCHES "Clang")
|
|
||||||
list(APPEND WPICKY_ENABLE
|
|
||||||
${WPICKY_COMMON_OLD}
|
|
||||||
-Wshorten-64-to-32 # clang 1.0
|
|
||||||
-Wlanguage-extension-token # clang 3.0
|
|
||||||
)
|
|
||||||
# Enable based on compiler version
|
|
||||||
if((CMAKE_C_COMPILER_ID STREQUAL "Clang" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 3.6) OR
|
|
||||||
(CMAKE_C_COMPILER_ID STREQUAL "AppleClang" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 6.3))
|
|
||||||
list(APPEND WPICKY_ENABLE
|
|
||||||
${WPICKY_COMMON}
|
|
||||||
-Wunreachable-code-break # clang 3.5 appleclang 6.0
|
|
||||||
-Wheader-guard # clang 3.4 appleclang 5.1
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
if((CMAKE_C_COMPILER_ID STREQUAL "Clang" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 3.9) OR
|
|
||||||
(CMAKE_C_COMPILER_ID STREQUAL "AppleClang" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 8.3))
|
|
||||||
list(APPEND WPICKY_ENABLE
|
|
||||||
-Wmissing-variable-declarations # clang 3.2 appleclang 4.6
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
if((CMAKE_C_COMPILER_ID STREQUAL "Clang" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 5.0) OR
|
|
||||||
(CMAKE_C_COMPILER_ID STREQUAL "AppleClang" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 9.4))
|
|
||||||
list(APPEND WPICKY_ENABLE
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
if((CMAKE_C_COMPILER_ID STREQUAL "Clang" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 7.0) OR
|
|
||||||
(CMAKE_C_COMPILER_ID STREQUAL "AppleClang" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 10.3))
|
|
||||||
list(APPEND WPICKY_ENABLE
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
else() # gcc
|
|
||||||
list(APPEND WPICKY_DETECT
|
|
||||||
${WPICKY_COMMON}
|
|
||||||
)
|
|
||||||
# Enable based on compiler version
|
|
||||||
if(NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.3)
|
|
||||||
list(APPEND WPICKY_ENABLE
|
|
||||||
${WPICKY_COMMON_OLD}
|
|
||||||
-Wclobbered # gcc 4.3
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
#
|
|
||||||
|
|
||||||
unset(_wpicky)
|
|
||||||
|
|
||||||
foreach(_CCOPT IN LISTS WPICKY_ENABLE)
|
|
||||||
set(_wpicky "${_wpicky} ${_CCOPT}")
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
foreach(_CCOPT IN LISTS WPICKY_DETECT)
|
|
||||||
# surprisingly, CHECK_C_COMPILER_FLAG needs a new variable to store each new
|
|
||||||
# test result in.
|
|
||||||
string(MAKE_C_IDENTIFIER "OPT${_CCOPT}" _optvarname)
|
|
||||||
# GCC only warns about unknown -Wno- options if there are also other diagnostic messages,
|
|
||||||
# so test for the positive form instead
|
|
||||||
string(REPLACE "-Wno-" "-W" _CCOPT_ON "${_CCOPT}")
|
|
||||||
check_c_compiler_flag(${_CCOPT_ON} ${_optvarname})
|
|
||||||
if(${_optvarname})
|
|
||||||
set(_wpicky "${_wpicky} ${_CCOPT}")
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
set(WARNCFLAGS "${WARNCFLAGS} ${_wpicky}")
|
|
||||||
endif()
|
|
||||||
@@ -1,117 +0,0 @@
|
|||||||
# nghttp2
|
|
||||||
#
|
|
||||||
# Copyright (c) 2023 nghttp2 contributors
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
# C++
|
|
||||||
|
|
||||||
include(CheckCXXCompilerFlag)
|
|
||||||
|
|
||||||
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
|
||||||
|
|
||||||
# https://clang.llvm.org/docs/DiagnosticsReference.html
|
|
||||||
# https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
|
|
||||||
|
|
||||||
# WPICKY_ENABLE = Options we want to enable as-is.
|
|
||||||
# WPICKY_DETECT = Options we want to test first and enable if available.
|
|
||||||
|
|
||||||
set(WPICKY_ENABLE "-Wall")
|
|
||||||
|
|
||||||
# ----------------------------------
|
|
||||||
# Add new options here, if in doubt:
|
|
||||||
# ----------------------------------
|
|
||||||
set(WPICKY_DETECT
|
|
||||||
)
|
|
||||||
|
|
||||||
# Assume these options always exist with both clang and gcc.
|
|
||||||
# Require clang 3.0 / gcc 2.95 or later.
|
|
||||||
list(APPEND WPICKY_ENABLE
|
|
||||||
)
|
|
||||||
|
|
||||||
# Always enable with clang, version dependent with gcc
|
|
||||||
set(WPICKY_COMMON_OLD
|
|
||||||
-Wformat-security # clang 3.0 gcc 4.1
|
|
||||||
)
|
|
||||||
|
|
||||||
set(WPICKY_COMMON
|
|
||||||
)
|
|
||||||
|
|
||||||
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
|
||||||
list(APPEND WPICKY_ENABLE
|
|
||||||
${WPICKY_COMMON_OLD}
|
|
||||||
)
|
|
||||||
# Enable based on compiler version
|
|
||||||
if((CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.6) OR
|
|
||||||
(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6.3))
|
|
||||||
list(APPEND WPICKY_ENABLE
|
|
||||||
${WPICKY_COMMON}
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
if((CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.9) OR
|
|
||||||
(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.3))
|
|
||||||
list(APPEND WPICKY_ENABLE
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
if((CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0) OR
|
|
||||||
(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9.4))
|
|
||||||
list(APPEND WPICKY_ENABLE
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
if((CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0) OR
|
|
||||||
(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10.3))
|
|
||||||
list(APPEND WPICKY_ENABLE
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
else() # gcc
|
|
||||||
list(APPEND WPICKY_DETECT
|
|
||||||
${WPICKY_COMMON}
|
|
||||||
)
|
|
||||||
# Enable based on compiler version
|
|
||||||
if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.3)
|
|
||||||
list(APPEND WPICKY_ENABLE
|
|
||||||
${WPICKY_COMMON_OLD}
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
#
|
|
||||||
|
|
||||||
unset(_wpicky)
|
|
||||||
|
|
||||||
foreach(_CCOPT IN LISTS WPICKY_ENABLE)
|
|
||||||
set(_wpicky "${_wpicky} ${_CCOPT}")
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
foreach(_CCOPT IN LISTS WPICKY_DETECT)
|
|
||||||
# surprisingly, CHECK_CXX_COMPILER_FLAG needs a new variable to store each new
|
|
||||||
# test result in.
|
|
||||||
string(MAKE_C_IDENTIFIER "OPT${_CCOPT}" _optvarname)
|
|
||||||
# GCC only warns about unknown -Wno- options if there are also other diagnostic messages,
|
|
||||||
# so test for the positive form instead
|
|
||||||
string(REPLACE "-Wno-" "-W" _CCOPT_ON "${_CCOPT}")
|
|
||||||
check_cxx_compiler_flag(${_CCOPT_ON} ${_optvarname})
|
|
||||||
if(${_optvarname})
|
|
||||||
set(_wpicky "${_wpicky} ${_CCOPT}")
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
set(WARNCXXFLAGS "${WARNCXXFLAGS} ${_wpicky}")
|
|
||||||
endif()
|
|
||||||
@@ -19,30 +19,24 @@
|
|||||||
/* Define to 1 if you have `neverbleed` library. */
|
/* Define to 1 if you have `neverbleed` library. */
|
||||||
#cmakedefine HAVE_NEVERBLEED 1
|
#cmakedefine HAVE_NEVERBLEED 1
|
||||||
|
|
||||||
|
/* sizeof(int *) */
|
||||||
|
#cmakedefine SIZEOF_INT_P @SIZEOF_INT_P@
|
||||||
|
|
||||||
|
/* sizeof(time_t) */
|
||||||
|
#cmakedefine SIZEOF_TIME_T @SIZEOF_TIME_T@
|
||||||
|
|
||||||
/* Define to 1 if you have the `_Exit` function. */
|
/* Define to 1 if you have the `_Exit` function. */
|
||||||
#cmakedefine HAVE__EXIT 1
|
#cmakedefine HAVE__EXIT 1
|
||||||
|
|
||||||
/* Define to 1 if you have the `accept4` function. */
|
/* Define to 1 if you have the `accept4` function. */
|
||||||
#cmakedefine HAVE_ACCEPT4 1
|
#cmakedefine HAVE_ACCEPT4 1
|
||||||
|
|
||||||
/* Define to 1 if you have the `clock_gettime` function. */
|
|
||||||
#cmakedefine HAVE_CLOCK_GETTIME 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `mkostemp` function. */
|
/* Define to 1 if you have the `mkostemp` function. */
|
||||||
#cmakedefine HAVE_MKOSTEMP 1
|
#cmakedefine HAVE_MKOSTEMP 1
|
||||||
|
|
||||||
/* Define to 1 if you have the `pipe2` function. */
|
|
||||||
#cmakedefine HAVE_PIPE2 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `GetTickCount64` function. */
|
|
||||||
#cmakedefine HAVE_GETTICKCOUNT64 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `initgroups` function. */
|
/* Define to 1 if you have the `initgroups` function. */
|
||||||
#cmakedefine01 HAVE_DECL_INITGROUPS
|
#cmakedefine01 HAVE_DECL_INITGROUPS
|
||||||
|
|
||||||
/* Define to 1 if you have the `CLOCK_MONOTONIC` defined. */
|
|
||||||
#cmakedefine01 HAVE_DECL_CLOCK_MONOTONIC
|
|
||||||
|
|
||||||
/* Define to 1 to enable debug output. */
|
/* Define to 1 to enable debug output. */
|
||||||
#cmakedefine DEBUGBUILD 1
|
#cmakedefine DEBUGBUILD 1
|
||||||
|
|
||||||
@@ -67,9 +61,6 @@
|
|||||||
/* Define to 1 if you have the <netinet/in.h> header file. */
|
/* Define to 1 if you have the <netinet/in.h> header file. */
|
||||||
#cmakedefine HAVE_NETINET_IN_H 1
|
#cmakedefine HAVE_NETINET_IN_H 1
|
||||||
|
|
||||||
/* Define to 1 if you have the <netinet/ip.h> header file. */
|
|
||||||
#cmakedefine HAVE_NETINET_IP_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <pwd.h> header file. */
|
/* Define to 1 if you have the <pwd.h> header file. */
|
||||||
#cmakedefine HAVE_PWD_H 1
|
#cmakedefine HAVE_PWD_H 1
|
||||||
|
|
||||||
@@ -82,32 +73,8 @@
|
|||||||
/* Define to 1 if you have the <syslog.h> header file. */
|
/* Define to 1 if you have the <syslog.h> header file. */
|
||||||
#cmakedefine HAVE_SYSLOG_H 1
|
#cmakedefine HAVE_SYSLOG_H 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <time.h> header file. */
|
||||||
|
#cmakedefine HAVE_TIME_H 1
|
||||||
|
|
||||||
/* 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 you have the <windows.h> header file. */
|
|
||||||
#cmakedefine HAVE_WINDOWS_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_quictls` library. */
|
|
||||||
#cmakedefine HAVE_LIBNGTCP2_CRYPTO_QUICTLS
|
|
||||||
|
|
||||||
/* Define to 1 if you have `libngtcp2_crypto_wolfssl` library. */
|
|
||||||
#cmakedefine HAVE_LIBNGTCP2_CRYPTO_WOLFSSL 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have `libev` library. */
|
|
||||||
#cmakedefine HAVE_LIBEV 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have `libbrotlienc` and `libbrotlidec` libraries. */
|
|
||||||
#cmakedefine HAVE_LIBBROTLI 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have `wolfssl` library. */
|
|
||||||
#cmakedefine HAVE_WOLFSSL 1
|
|
||||||
|
|||||||
776
configure.ac
776
configure.ac
File diff suppressed because it is too large
Load Diff
@@ -30,10 +30,9 @@ import (
|
|||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/bradfitz/gomemcache/memcache"
|
||||||
"log"
|
"log"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/bradfitz/gomemcache/memcache"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func makeKey(len int) []byte {
|
func makeKey(len int) []byte {
|
||||||
@@ -90,7 +89,9 @@ func main() {
|
|||||||
Expiration: int32((*interval) + 300),
|
Expiration: int32((*interval) + 300),
|
||||||
})
|
})
|
||||||
|
|
||||||
<-time.After(time.Duration(*interval) * time.Second)
|
select {
|
||||||
|
case <-time.After(time.Duration(*interval) * time.Second):
|
||||||
|
}
|
||||||
|
|
||||||
// rotate keys. the last key is now encryption key.
|
// rotate keys. the last key is now encryption key.
|
||||||
// generate new key and append it to the last, so that
|
// generate new key and append it to the last, so that
|
||||||
|
|||||||
5
doc/.gitignore
vendored
5
doc/.gitignore
vendored
@@ -1,11 +1,15 @@
|
|||||||
# generated files
|
# generated files
|
||||||
apiref.rst
|
apiref.rst
|
||||||
|
asio_http2.h.rst
|
||||||
|
asio_http2_client.h.rst
|
||||||
|
asio_http2_server.h.rst
|
||||||
building-android-binary.rst
|
building-android-binary.rst
|
||||||
conf.py
|
conf.py
|
||||||
contribute.rst
|
contribute.rst
|
||||||
enums.rst
|
enums.rst
|
||||||
h2load-howto.rst
|
h2load-howto.rst
|
||||||
index.rst
|
index.rst
|
||||||
|
libnghttp2_asio.rst
|
||||||
macros.rst
|
macros.rst
|
||||||
manual/
|
manual/
|
||||||
nghttp2.h.rst
|
nghttp2.h.rst
|
||||||
@@ -13,6 +17,7 @@ nghttp2_*.rst
|
|||||||
nghttp2ver.h.rst
|
nghttp2ver.h.rst
|
||||||
nghttpx-howto.rst
|
nghttpx-howto.rst
|
||||||
package_README.rst
|
package_README.rst
|
||||||
|
python-apiref.rst
|
||||||
tutorial-client.rst
|
tutorial-client.rst
|
||||||
tutorial-hpack.rst
|
tutorial-hpack.rst
|
||||||
tutorial-server.rst
|
tutorial-server.rst
|
||||||
|
|||||||
@@ -180,11 +180,13 @@ set(EXTRA_DIST
|
|||||||
sources/tutorial-hpack.rst
|
sources/tutorial-hpack.rst
|
||||||
sources/nghttpx-howto.rst
|
sources/nghttpx-howto.rst
|
||||||
sources/h2load-howto.rst
|
sources/h2load-howto.rst
|
||||||
|
sources/libnghttp2_asio.rst
|
||||||
|
sources/python-apiref.rst
|
||||||
sources/building-android-binary.rst
|
sources/building-android-binary.rst
|
||||||
sources/contribute.rst
|
sources/contribute.rst
|
||||||
_exts/rubydomain/LICENSE.rubydomain
|
_exts/sphinxcontrib/LICENSE.rubydomain
|
||||||
_exts/rubydomain/__init__.py
|
_exts/sphinxcontrib/__init__.py
|
||||||
_exts/rubydomain/rubydomain.py
|
_exts/sphinxcontrib/rubydomain.py
|
||||||
_themes/sphinx_rtd_theme/__init__.py
|
_themes/sphinx_rtd_theme/__init__.py
|
||||||
_themes/sphinx_rtd_theme/breadcrumbs.html
|
_themes/sphinx_rtd_theme/breadcrumbs.html
|
||||||
_themes/sphinx_rtd_theme/footer.html
|
_themes/sphinx_rtd_theme/footer.html
|
||||||
@@ -267,7 +269,7 @@ add_custom_command(
|
|||||||
apiref.rst
|
apiref.rst
|
||||||
${APIDOCS}
|
${APIDOCS}
|
||||||
COMMAND
|
COMMAND
|
||||||
"${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/mkapiref.py"
|
"${PYTHON_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/mkapiref.py"
|
||||||
apiref.rst macros.rst enums.rst types.rst .
|
apiref.rst macros.rst enums.rst types.rst .
|
||||||
${apiref_SOURCES}
|
${apiref_SOURCES}
|
||||||
DEPENDS
|
DEPENDS
|
||||||
|
|||||||
@@ -30,10 +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_extpri_parse_priority.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 \
|
||||||
@@ -42,9 +38,7 @@ APIDOCS= \
|
|||||||
nghttp2_hd_deflate_get_num_table_entries.rst \
|
nghttp2_hd_deflate_get_num_table_entries.rst \
|
||||||
nghttp2_hd_deflate_get_table_entry.rst \
|
nghttp2_hd_deflate_get_table_entry.rst \
|
||||||
nghttp2_hd_deflate_hd.rst \
|
nghttp2_hd_deflate_hd.rst \
|
||||||
nghttp2_hd_deflate_hd2.rst \
|
|
||||||
nghttp2_hd_deflate_hd_vec.rst \
|
nghttp2_hd_deflate_hd_vec.rst \
|
||||||
nghttp2_hd_deflate_hd_vec2.rst \
|
|
||||||
nghttp2_hd_deflate_new.rst \
|
nghttp2_hd_deflate_new.rst \
|
||||||
nghttp2_hd_deflate_new2.rst \
|
nghttp2_hd_deflate_new2.rst \
|
||||||
nghttp2_hd_inflate_change_table_size.rst \
|
nghttp2_hd_inflate_change_table_size.rst \
|
||||||
@@ -56,7 +50,6 @@ APIDOCS= \
|
|||||||
nghttp2_hd_inflate_get_table_entry.rst \
|
nghttp2_hd_inflate_get_table_entry.rst \
|
||||||
nghttp2_hd_inflate_hd.rst \
|
nghttp2_hd_inflate_hd.rst \
|
||||||
nghttp2_hd_inflate_hd2.rst \
|
nghttp2_hd_inflate_hd2.rst \
|
||||||
nghttp2_hd_inflate_hd3.rst \
|
|
||||||
nghttp2_hd_inflate_new.rst \
|
nghttp2_hd_inflate_new.rst \
|
||||||
nghttp2_hd_inflate_new2.rst \
|
nghttp2_hd_inflate_new2.rst \
|
||||||
nghttp2_http2_strerror.rst \
|
nghttp2_http2_strerror.rst \
|
||||||
@@ -73,16 +66,11 @@ 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_continuations.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 \
|
||||||
nghttp2_option_set_stream_reset_rate_limit.rst \
|
|
||||||
nghttp2_pack_settings_payload.rst \
|
nghttp2_pack_settings_payload.rst \
|
||||||
nghttp2_pack_settings_payload2.rst \
|
|
||||||
nghttp2_priority_spec_check_default.rst \
|
nghttp2_priority_spec_check_default.rst \
|
||||||
nghttp2_priority_spec_default_init.rst \
|
nghttp2_priority_spec_default_init.rst \
|
||||||
nghttp2_priority_spec_init.rst \
|
nghttp2_priority_spec_init.rst \
|
||||||
@@ -91,12 +79,10 @@ APIDOCS= \
|
|||||||
nghttp2_rcbuf_incref.rst \
|
nghttp2_rcbuf_incref.rst \
|
||||||
nghttp2_rcbuf_is_static.rst \
|
nghttp2_rcbuf_is_static.rst \
|
||||||
nghttp2_select_next_protocol.rst \
|
nghttp2_select_next_protocol.rst \
|
||||||
nghttp2_select_alpn.rst \
|
|
||||||
nghttp2_session_callbacks_del.rst \
|
nghttp2_session_callbacks_del.rst \
|
||||||
nghttp2_session_callbacks_new.rst \
|
nghttp2_session_callbacks_new.rst \
|
||||||
nghttp2_session_callbacks_set_before_frame_send_callback.rst \
|
nghttp2_session_callbacks_set_before_frame_send_callback.rst \
|
||||||
nghttp2_session_callbacks_set_data_source_read_length_callback.rst \
|
nghttp2_session_callbacks_set_data_source_read_length_callback.rst \
|
||||||
nghttp2_session_callbacks_set_data_source_read_length_callback2.rst \
|
|
||||||
nghttp2_session_callbacks_set_error_callback.rst \
|
nghttp2_session_callbacks_set_error_callback.rst \
|
||||||
nghttp2_session_callbacks_set_error_callback2.rst \
|
nghttp2_session_callbacks_set_error_callback2.rst \
|
||||||
nghttp2_session_callbacks_set_on_begin_frame_callback.rst \
|
nghttp2_session_callbacks_set_on_begin_frame_callback.rst \
|
||||||
@@ -113,16 +99,11 @@ APIDOCS= \
|
|||||||
nghttp2_session_callbacks_set_on_invalid_header_callback2.rst \
|
nghttp2_session_callbacks_set_on_invalid_header_callback2.rst \
|
||||||
nghttp2_session_callbacks_set_on_stream_close_callback.rst \
|
nghttp2_session_callbacks_set_on_stream_close_callback.rst \
|
||||||
nghttp2_session_callbacks_set_pack_extension_callback.rst \
|
nghttp2_session_callbacks_set_pack_extension_callback.rst \
|
||||||
nghttp2_session_callbacks_set_pack_extension_callback2.rst \
|
|
||||||
nghttp2_session_callbacks_set_recv_callback.rst \
|
nghttp2_session_callbacks_set_recv_callback.rst \
|
||||||
nghttp2_session_callbacks_set_recv_callback2.rst \
|
|
||||||
nghttp2_session_callbacks_set_select_padding_callback.rst \
|
nghttp2_session_callbacks_set_select_padding_callback.rst \
|
||||||
nghttp2_session_callbacks_set_select_padding_callback2.rst \
|
|
||||||
nghttp2_session_callbacks_set_send_callback.rst \
|
nghttp2_session_callbacks_set_send_callback.rst \
|
||||||
nghttp2_session_callbacks_set_send_callback2.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 \
|
||||||
@@ -137,7 +118,6 @@ APIDOCS= \
|
|||||||
nghttp2_session_find_stream.rst \
|
nghttp2_session_find_stream.rst \
|
||||||
nghttp2_session_get_effective_local_window_size.rst \
|
nghttp2_session_get_effective_local_window_size.rst \
|
||||||
nghttp2_session_get_effective_recv_data_length.rst \
|
nghttp2_session_get_effective_recv_data_length.rst \
|
||||||
nghttp2_session_get_extpri_stream_priority.rst \
|
|
||||||
nghttp2_session_get_hd_deflate_dynamic_table_size.rst \
|
nghttp2_session_get_hd_deflate_dynamic_table_size.rst \
|
||||||
nghttp2_session_get_hd_inflate_dynamic_table_size.rst \
|
nghttp2_session_get_hd_inflate_dynamic_table_size.rst \
|
||||||
nghttp2_session_get_last_proc_stream_id.rst \
|
nghttp2_session_get_last_proc_stream_id.rst \
|
||||||
@@ -156,9 +136,7 @@ APIDOCS= \
|
|||||||
nghttp2_session_get_stream_remote_window_size.rst \
|
nghttp2_session_get_stream_remote_window_size.rst \
|
||||||
nghttp2_session_get_stream_user_data.rst \
|
nghttp2_session_get_stream_user_data.rst \
|
||||||
nghttp2_session_mem_recv.rst \
|
nghttp2_session_mem_recv.rst \
|
||||||
nghttp2_session_mem_recv2.rst \
|
|
||||||
nghttp2_session_mem_send.rst \
|
nghttp2_session_mem_send.rst \
|
||||||
nghttp2_session_mem_send2.rst \
|
|
||||||
nghttp2_session_recv.rst \
|
nghttp2_session_recv.rst \
|
||||||
nghttp2_session_resume_data.rst \
|
nghttp2_session_resume_data.rst \
|
||||||
nghttp2_session_send.rst \
|
nghttp2_session_send.rst \
|
||||||
@@ -186,19 +164,15 @@ APIDOCS= \
|
|||||||
nghttp2_strerror.rst \
|
nghttp2_strerror.rst \
|
||||||
nghttp2_submit_altsvc.rst \
|
nghttp2_submit_altsvc.rst \
|
||||||
nghttp2_submit_data.rst \
|
nghttp2_submit_data.rst \
|
||||||
nghttp2_submit_data2.rst \
|
|
||||||
nghttp2_submit_extension.rst \
|
nghttp2_submit_extension.rst \
|
||||||
nghttp2_submit_goaway.rst \
|
nghttp2_submit_goaway.rst \
|
||||||
nghttp2_submit_headers.rst \
|
nghttp2_submit_headers.rst \
|
||||||
nghttp2_submit_origin.rst \
|
nghttp2_submit_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_request2.rst \
|
|
||||||
nghttp2_submit_response.rst \
|
nghttp2_submit_response.rst \
|
||||||
nghttp2_submit_response2.rst \
|
|
||||||
nghttp2_submit_rst_stream.rst \
|
nghttp2_submit_rst_stream.rst \
|
||||||
nghttp2_submit_settings.rst \
|
nghttp2_submit_settings.rst \
|
||||||
nghttp2_submit_shutdown_notice.rst \
|
nghttp2_submit_shutdown_notice.rst \
|
||||||
@@ -225,11 +199,66 @@ EXTRA_DIST = \
|
|||||||
sources/tutorial-hpack.rst \
|
sources/tutorial-hpack.rst \
|
||||||
sources/nghttpx-howto.rst \
|
sources/nghttpx-howto.rst \
|
||||||
sources/h2load-howto.rst \
|
sources/h2load-howto.rst \
|
||||||
|
sources/libnghttp2_asio.rst \
|
||||||
|
sources/python-apiref.rst \
|
||||||
sources/building-android-binary.rst \
|
sources/building-android-binary.rst \
|
||||||
sources/contribute.rst \
|
sources/contribute.rst \
|
||||||
_exts/rubydomain/LICENSE.rubydomain \
|
sources/security.rst \
|
||||||
_exts/rubydomain/__init__.py \
|
_exts/sphinxcontrib/LICENSE.rubydomain \
|
||||||
_exts/rubydomain/rubydomain.py \
|
_exts/sphinxcontrib/__init__.py \
|
||||||
|
_exts/sphinxcontrib/rubydomain.py \
|
||||||
|
_themes/sphinx_rtd_theme/__init__.py \
|
||||||
|
_themes/sphinx_rtd_theme/breadcrumbs.html \
|
||||||
|
_themes/sphinx_rtd_theme/footer.html \
|
||||||
|
_themes/sphinx_rtd_theme/layout.html \
|
||||||
|
_themes/sphinx_rtd_theme/locale/de/LC_MESSAGES/sphinx.mo \
|
||||||
|
_themes/sphinx_rtd_theme/locale/de/LC_MESSAGES/sphinx.po \
|
||||||
|
_themes/sphinx_rtd_theme/locale/en/LC_MESSAGES/sphinx.mo \
|
||||||
|
_themes/sphinx_rtd_theme/locale/en/LC_MESSAGES/sphinx.po \
|
||||||
|
_themes/sphinx_rtd_theme/locale/es/LC_MESSAGES/sphinx.mo \
|
||||||
|
_themes/sphinx_rtd_theme/locale/es/LC_MESSAGES/sphinx.po \
|
||||||
|
_themes/sphinx_rtd_theme/locale/et/LC_MESSAGES/sphinx.mo \
|
||||||
|
_themes/sphinx_rtd_theme/locale/et/LC_MESSAGES/sphinx.po \
|
||||||
|
_themes/sphinx_rtd_theme/locale/fr/LC_MESSAGES/sphinx.mo \
|
||||||
|
_themes/sphinx_rtd_theme/locale/fr/LC_MESSAGES/sphinx.po \
|
||||||
|
_themes/sphinx_rtd_theme/locale/nl/LC_MESSAGES/sphinx.mo \
|
||||||
|
_themes/sphinx_rtd_theme/locale/nl/LC_MESSAGES/sphinx.po \
|
||||||
|
_themes/sphinx_rtd_theme/locale/pt_BR/LC_MESSAGES/sphinx.mo \
|
||||||
|
_themes/sphinx_rtd_theme/locale/pt_BR/LC_MESSAGES/sphinx.po \
|
||||||
|
_themes/sphinx_rtd_theme/locale/ru/LC_MESSAGES/sphinx.mo \
|
||||||
|
_themes/sphinx_rtd_theme/locale/ru/LC_MESSAGES/sphinx.po \
|
||||||
|
_themes/sphinx_rtd_theme/locale/sphinx.pot \
|
||||||
|
_themes/sphinx_rtd_theme/locale/sv/LC_MESSAGES/sphinx.mo \
|
||||||
|
_themes/sphinx_rtd_theme/locale/sv/LC_MESSAGES/sphinx.po \
|
||||||
|
_themes/sphinx_rtd_theme/locale/tr/LC_MESSAGES/sphinx.mo \
|
||||||
|
_themes/sphinx_rtd_theme/locale/tr/LC_MESSAGES/sphinx.po \
|
||||||
|
_themes/sphinx_rtd_theme/locale/zh_CN/LC_MESSAGES/sphinx.mo \
|
||||||
|
_themes/sphinx_rtd_theme/locale/zh_CN/LC_MESSAGES/sphinx.po \
|
||||||
|
_themes/sphinx_rtd_theme/search.html \
|
||||||
|
_themes/sphinx_rtd_theme/searchbox.html \
|
||||||
|
_themes/sphinx_rtd_theme/static/css/badge_only.css \
|
||||||
|
_themes/sphinx_rtd_theme/static/css/fonts/Roboto-Slab-Bold.woff \
|
||||||
|
_themes/sphinx_rtd_theme/static/css/fonts/Roboto-Slab-Bold.woff2 \
|
||||||
|
_themes/sphinx_rtd_theme/static/css/fonts/Roboto-Slab-Regular.woff \
|
||||||
|
_themes/sphinx_rtd_theme/static/css/fonts/Roboto-Slab-Regular.woff2 \
|
||||||
|
_themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.eot \
|
||||||
|
_themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.svg \
|
||||||
|
_themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.ttf \
|
||||||
|
_themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.woff \
|
||||||
|
_themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.woff2 \
|
||||||
|
_themes/sphinx_rtd_theme/static/css/fonts/lato-bold-italic.woff \
|
||||||
|
_themes/sphinx_rtd_theme/static/css/fonts/lato-bold-italic.woff2 \
|
||||||
|
_themes/sphinx_rtd_theme/static/css/fonts/lato-bold.woff \
|
||||||
|
_themes/sphinx_rtd_theme/static/css/fonts/lato-bold.woff2 \
|
||||||
|
_themes/sphinx_rtd_theme/static/css/fonts/lato-normal-italic.woff \
|
||||||
|
_themes/sphinx_rtd_theme/static/css/fonts/lato-normal-italic.woff2 \
|
||||||
|
_themes/sphinx_rtd_theme/static/css/fonts/lato-normal.woff \
|
||||||
|
_themes/sphinx_rtd_theme/static/css/fonts/lato-normal.woff2 \
|
||||||
|
_themes/sphinx_rtd_theme/static/css/theme.css \
|
||||||
|
_themes/sphinx_rtd_theme/static/js/badge_only.js \
|
||||||
|
_themes/sphinx_rtd_theme/static/js/theme.js \
|
||||||
|
_themes/sphinx_rtd_theme/theme.conf \
|
||||||
|
_themes/sphinx_rtd_theme/versions.html \
|
||||||
$(man_MANS) \
|
$(man_MANS) \
|
||||||
bash_completion/nghttp \
|
bash_completion/nghttp \
|
||||||
bash_completion/nghttpd \
|
bash_completion/nghttpd \
|
||||||
@@ -241,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
|
||||||
|
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ The example follows::
|
|||||||
* Callback function invoked when |session| wants to send data to
|
* Callback function invoked when |session| wants to send data to
|
||||||
* remote peer.
|
* remote peer.
|
||||||
*/
|
*/
|
||||||
typedef nghttp2_ssize (*nghttp2_send_callback2)
|
typedef ssize_t (*nghttp2_send_callback)
|
||||||
(nghttp2_session *session,
|
(nghttp2_session *session,
|
||||||
const uint8_t *data, size_t length, int flags, void *user_data);
|
const uint8_t *data, size_t length, int flags, void *user_data);
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ from docutils.parsers.rst import Directive
|
|||||||
from sphinx import addnodes
|
from sphinx import addnodes
|
||||||
from sphinx import version_info
|
from sphinx import version_info
|
||||||
from sphinx.roles import XRefRole
|
from sphinx.roles import XRefRole
|
||||||
from sphinx.locale import _
|
from sphinx.locale import l_, _
|
||||||
from sphinx.domains import Domain, ObjType, Index
|
from sphinx.domains import Domain, ObjType, Index
|
||||||
from sphinx.directives import ObjectDescription
|
from sphinx.directives import ObjectDescription
|
||||||
from sphinx.util.nodes import make_refnode
|
from sphinx.util.nodes import make_refnode
|
||||||
@@ -493,7 +493,7 @@ class RubyModuleIndex(Index):
|
|||||||
# list of all modules, sorted by module name
|
# list of all modules, sorted by module name
|
||||||
modules = sorted(_iteritems(self.domain.data['modules']),
|
modules = sorted(_iteritems(self.domain.data['modules']),
|
||||||
key=lambda x: x[0].lower())
|
key=lambda x: x[0].lower())
|
||||||
# sort out collapsible modules
|
# sort out collapsable modules
|
||||||
prev_modname = ''
|
prev_modname = ''
|
||||||
num_toplevels = 0
|
num_toplevels = 0
|
||||||
for modname, (docname, synopsis, platforms, deprecated) in modules:
|
for modname, (docname, synopsis, platforms, deprecated) in modules:
|
||||||
34
doc/_themes/sphinx_rtd_theme/__init__.py
vendored
Normal file
34
doc/_themes/sphinx_rtd_theme/__init__.py
vendored
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
"""
|
||||||
|
Sphinx Read the Docs theme.
|
||||||
|
|
||||||
|
From https://github.com/ryan-roemer/sphinx-bootstrap-theme.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from os import path
|
||||||
|
|
||||||
|
import sphinx
|
||||||
|
|
||||||
|
|
||||||
|
__version__ = '0.5.0'
|
||||||
|
__version_full__ = __version__
|
||||||
|
|
||||||
|
|
||||||
|
def get_html_theme_path():
|
||||||
|
"""Return list of HTML theme paths."""
|
||||||
|
cur_dir = path.abspath(path.dirname(path.dirname(__file__)))
|
||||||
|
return cur_dir
|
||||||
|
|
||||||
|
|
||||||
|
# See http://www.sphinx-doc.org/en/stable/theming.html#distribute-your-theme-as-a-python-package
|
||||||
|
def setup(app):
|
||||||
|
if sphinx.version_info >= (1, 6, 0):
|
||||||
|
# Register the theme that can be referenced without adding a theme path
|
||||||
|
app.add_html_theme('sphinx_rtd_theme', path.abspath(path.dirname(__file__)))
|
||||||
|
|
||||||
|
if sphinx.version_info >= (1, 8, 0):
|
||||||
|
# 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
|
||||||
|
rtd_locale_path = path.join(path.abspath(path.dirname(__file__)), 'locale')
|
||||||
|
app.add_message_catalog('sphinx', rtd_locale_path)
|
||||||
|
|
||||||
|
return {'parallel_read_safe': True, 'parallel_write_safe': True}
|
||||||
84
doc/_themes/sphinx_rtd_theme/breadcrumbs.html
vendored
Normal file
84
doc/_themes/sphinx_rtd_theme/breadcrumbs.html
vendored
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
{# Support for Sphinx 1.3+ page_source_suffix, but don't break old builds. #}
|
||||||
|
|
||||||
|
{% if page_source_suffix %}
|
||||||
|
{% set suffix = page_source_suffix %}
|
||||||
|
{% else %}
|
||||||
|
{% set suffix = source_suffix %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if meta is defined and meta is not none %}
|
||||||
|
{% set check_meta = True %}
|
||||||
|
{% else %}
|
||||||
|
{% set check_meta = False %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if check_meta and 'github_url' in meta %}
|
||||||
|
{% set display_github = True %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% 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">
|
||||||
|
|
||||||
|
<ul class="wy-breadcrumbs">
|
||||||
|
{% block breadcrumbs %}
|
||||||
|
<li><a href="{{ pathto(master_doc) }}" class="icon icon-home"></a> »</li>
|
||||||
|
{% for doc in parents %}
|
||||||
|
<li><a href="{{ doc.link|e }}">{{ doc.title }}</a> »</li>
|
||||||
|
{% endfor %}
|
||||||
|
<li>{{ title }}</li>
|
||||||
|
{% endblock %}
|
||||||
|
{% block breadcrumbs_aside %}
|
||||||
|
<li class="wy-breadcrumbs-aside">
|
||||||
|
{% if hasdoc(pagename) and display_vcs_links %}
|
||||||
|
{% if display_github %}
|
||||||
|
{% if check_meta and 'github_url' in meta %}
|
||||||
|
<!-- User defined GitHub URL -->
|
||||||
|
<a href="{{ meta['github_url'] }}" class="fa fa-github"> {{ _('Edit on GitHub') }}</a>
|
||||||
|
{% else %}
|
||||||
|
<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 %}
|
||||||
|
{% elif display_bitbucket %}
|
||||||
|
{% if check_meta and 'bitbucket_url' in meta %}
|
||||||
|
<!-- User defined Bitbucket URL -->
|
||||||
|
<a href="{{ meta['bitbucket_url'] }}" class="fa fa-bitbucket"> {{ _('Edit on Bitbucket') }}</a>
|
||||||
|
{% else %}
|
||||||
|
<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 %}
|
||||||
|
{% elif display_gitlab %}
|
||||||
|
{% if check_meta and 'gitlab_url' in meta %}
|
||||||
|
<!-- User defined GitLab URL -->
|
||||||
|
<a href="{{ meta['gitlab_url'] }}" class="fa fa-gitlab"> {{ _('Edit on GitLab') }}</a>
|
||||||
|
{% else %}
|
||||||
|
<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 %}
|
||||||
|
{% elif show_source and source_url_prefix %}
|
||||||
|
<a href="{{ source_url_prefix }}{{ pagename }}{{ suffix }}">{{ _('View page source') }}</a>
|
||||||
|
{% elif show_source and has_source and sourcename %}
|
||||||
|
<a href="{{ pathto('_sources/' + sourcename, true)|e }}" rel="nofollow"> {{ _('View page source') }}</a>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
</li>
|
||||||
|
{% endblock %}
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
{% if (theme_prev_next_buttons_location == 'top' or theme_prev_next_buttons_location == 'both') and (next or prev) %}
|
||||||
|
<div class="rst-breadcrumbs-buttons" role="navigation" aria-label="breadcrumb navigation">
|
||||||
|
{% if next %}
|
||||||
|
<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>
|
||||||
|
{% endif %}
|
||||||
|
{% if prev %}
|
||||||
|
<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>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
<hr/>
|
||||||
|
</div>
|
||||||
63
doc/_themes/sphinx_rtd_theme/footer.html
vendored
Normal file
63
doc/_themes/sphinx_rtd_theme/footer.html
vendored
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
<footer>
|
||||||
|
{% if (theme_prev_next_buttons_location == 'bottom' or theme_prev_next_buttons_location == 'both') and (next or prev) %}
|
||||||
|
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
|
||||||
|
{% if next %}
|
||||||
|
<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>
|
||||||
|
{% endif %}
|
||||||
|
{% if prev %}
|
||||||
|
<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>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<hr/>
|
||||||
|
|
||||||
|
<div role="contentinfo">
|
||||||
|
<p>
|
||||||
|
{%- if show_copyright %}
|
||||||
|
{%- if hasdoc('copyright') %}
|
||||||
|
{% set path = pathto('copyright') %}
|
||||||
|
{% set copyright = copyright|e %}
|
||||||
|
© <a href="{{ path }}">{% trans %}Copyright{% endtrans %}</a> {{ copyright }}
|
||||||
|
{%- else %}
|
||||||
|
{% set copyright = copyright|e %}
|
||||||
|
© {% trans %}Copyright{% endtrans %} {{ copyright }}
|
||||||
|
{%- endif %}
|
||||||
|
{%- endif %}
|
||||||
|
|
||||||
|
{%- if build_id and build_url %}
|
||||||
|
<span class="build">
|
||||||
|
{# Translators: Build is a noun, not a verb #}
|
||||||
|
{% trans %}Build{% endtrans %}
|
||||||
|
<a href="{{ build_url }}">{{ build_id }}</a>.
|
||||||
|
</span>
|
||||||
|
{%- elif commit %}
|
||||||
|
<span class="commit">
|
||||||
|
{# Translators: the phrase "revision" comes from Git, referring to a commit #}
|
||||||
|
{% trans %}Revision{% endtrans %} <code>{{ commit }}</code>.
|
||||||
|
</span>
|
||||||
|
{%- endif %}
|
||||||
|
{%- if last_updated %}
|
||||||
|
<span class="lastupdated">
|
||||||
|
{% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
|
||||||
|
</span>
|
||||||
|
{%- endif %}
|
||||||
|
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{%- if show_sphinx %}
|
||||||
|
{% set sphinx_web = '<a href="https://www.sphinx-doc.org/">Sphinx</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" #}
|
||||||
|
{% 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 documenation #}
|
||||||
|
<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. #}
|
||||||
|
{% trans %}provided by {{ readthedocs_web }}{% endtrans %}.
|
||||||
|
{%- endif %}
|
||||||
|
|
||||||
|
{%- block extrafooter %} {% endblock %}
|
||||||
|
|
||||||
|
</footer>
|
||||||
|
|
||||||
241
doc/_themes/sphinx_rtd_theme/layout.html
vendored
Normal file
241
doc/_themes/sphinx_rtd_theme/layout.html
vendored
Normal file
@@ -0,0 +1,241 @@
|
|||||||
|
{# TEMPLATE VAR SETTINGS #}
|
||||||
|
{%- set url_root = pathto('', 1) %}
|
||||||
|
{%- if url_root == '#' %}{% set url_root = '' %}{% endif %}
|
||||||
|
{%- if not embedded and docstitle %}
|
||||||
|
{%- set titlesuffix = " — "|safe + docstitle|e %}
|
||||||
|
{%- else %}
|
||||||
|
{%- set titlesuffix = "" %}
|
||||||
|
{%- endif %}
|
||||||
|
{%- set lang_attr = 'en' if language == None else (language | replace('_', '-')) %}
|
||||||
|
{%- set sphinx_writer = 'writer-html5' if html5_doctype else 'writer-html4' %}
|
||||||
|
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html class="{{ sphinx_writer }}" lang="{{ lang_attr }}" >
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
{{ metatags }}
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
{% block htmltitle %}
|
||||||
|
<title>{{ title|striptags|e }}{{ titlesuffix }}</title>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{# CSS #}
|
||||||
|
<link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
|
||||||
|
<link rel="stylesheet" href="{{ pathto('_static/pygments.css', 1) }}" type="text/css" />
|
||||||
|
{%- for css in css_files %}
|
||||||
|
{%- 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 %} />
|
||||||
|
{%- else %}
|
||||||
|
<link rel="stylesheet" href="{{ pathto(css, 1) }}" type="text/css" />
|
||||||
|
{%- endif %}
|
||||||
|
{%- endfor %}
|
||||||
|
|
||||||
|
{%- for cssfile in extra_css_files %}
|
||||||
|
<link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
|
||||||
|
{%- endfor %}
|
||||||
|
|
||||||
|
{# FAVICON #}
|
||||||
|
{% if favicon %}
|
||||||
|
<link rel="shortcut icon" href="{{ pathto('_static/' + favicon, 1) }}"/>
|
||||||
|
{% endif %}
|
||||||
|
{# CANONICAL URL #}
|
||||||
|
{% if theme_canonical_url %}
|
||||||
|
<link rel="canonical" href="{{ theme_canonical_url }}{{ pagename }}.html"/>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{# JAVASCRIPTS #}
|
||||||
|
{%- block scripts %}
|
||||||
|
<!--[if lt IE 9]>
|
||||||
|
<script src="{{ pathto('_static/js/html5shiv.min.js', 1) }}"></script>
|
||||||
|
<![endif]-->
|
||||||
|
{%- 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 #}
|
||||||
|
{% if sphinx_version >= "1.8.0" %}
|
||||||
|
<script type="text/javascript" id="documentation_options" data-url_root="{{ pathto('', 1) }}" src="{{ pathto('_static/documentation_options.js', 1) }}"></script>
|
||||||
|
{%- for scriptfile in script_files %}
|
||||||
|
{{ js_tag(scriptfile) }}
|
||||||
|
{%- endfor %}
|
||||||
|
{% else %}
|
||||||
|
<script type="text/javascript">
|
||||||
|
var DOCUMENTATION_OPTIONS = {
|
||||||
|
URL_ROOT:'{{ url_root }}',
|
||||||
|
VERSION:'{{ release|e }}',
|
||||||
|
LANGUAGE:'{{ language }}',
|
||||||
|
COLLAPSE_INDEX:false,
|
||||||
|
FILE_SUFFIX:'{{ '' if no_search_suffix else file_suffix }}',
|
||||||
|
HAS_SOURCE: {{ has_source|lower }},
|
||||||
|
SOURCELINK_SUFFIX: '{{ sourcelink_suffix }}'
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
{%- for scriptfile in script_files %}
|
||||||
|
<script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
|
||||||
|
{%- endfor %}
|
||||||
|
{% endif %}
|
||||||
|
<script type="text/javascript" src="{{ pathto('_static/js/theme.js', 1) }}"></script>
|
||||||
|
|
||||||
|
{# OPENSEARCH #}
|
||||||
|
{%- if use_opensearch %}
|
||||||
|
<link rel="search" type="application/opensearchdescription+xml"
|
||||||
|
title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}"
|
||||||
|
href="{{ pathto('_static/opensearch.xml', 1) }}"/>
|
||||||
|
{%- endif %}
|
||||||
|
{%- endif %}
|
||||||
|
{%- endblock %}
|
||||||
|
|
||||||
|
{%- block linktags %}
|
||||||
|
{%- if hasdoc('about') %}
|
||||||
|
<link rel="author" title="{{ _('About these documents') }}" href="{{ pathto('about') }}" />
|
||||||
|
{%- endif %}
|
||||||
|
{%- if hasdoc('genindex') %}
|
||||||
|
<link rel="index" title="{{ _('Index') }}" href="{{ pathto('genindex') }}" />
|
||||||
|
{%- endif %}
|
||||||
|
{%- if hasdoc('search') %}
|
||||||
|
<link rel="search" title="{{ _('Search') }}" href="{{ pathto('search') }}" />
|
||||||
|
{%- endif %}
|
||||||
|
{%- if hasdoc('copyright') %}
|
||||||
|
<link rel="copyright" title="{{ _('Copyright') }}" href="{{ pathto('copyright') }}" />
|
||||||
|
{%- endif %}
|
||||||
|
{%- if next %}
|
||||||
|
<link rel="next" title="{{ next.title|striptags|e }}" href="{{ next.link|e }}" />
|
||||||
|
{%- endif %}
|
||||||
|
{%- if prev %}
|
||||||
|
<link rel="prev" title="{{ prev.title|striptags|e }}" href="{{ prev.link|e }}" />
|
||||||
|
{%- endif %}
|
||||||
|
{%- endblock %}
|
||||||
|
{%- block extrahead %} {% endblock %}
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="wy-body-for-nav">
|
||||||
|
|
||||||
|
{% block extrabody %} {% endblock %}
|
||||||
|
<div class="wy-grid-for-nav">
|
||||||
|
{# SIDE NAV, TOGGLES ON MOBILE #}
|
||||||
|
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
|
||||||
|
<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 %}>
|
||||||
|
{% block sidebartitle %}
|
||||||
|
|
||||||
|
{% if logo and theme_logo_only %}
|
||||||
|
<a href="{{ pathto(master_doc) }}">
|
||||||
|
{% else %}
|
||||||
|
<a href="{{ pathto(master_doc) }}" class="icon icon-home"> {{ project }}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if logo %}
|
||||||
|
{# Not strictly valid HTML, but it's the only way to display/scale
|
||||||
|
it properly, without weird scripting or heaps of work
|
||||||
|
#}
|
||||||
|
<img src="{{ pathto('_static/' + logo, 1) }}" class="logo" alt="{{ _('Logo') }}"/>
|
||||||
|
{% endif %}
|
||||||
|
</a>
|
||||||
|
|
||||||
|
{% if theme_display_version %}
|
||||||
|
{%- set nav_version = version %}
|
||||||
|
{% if READTHEDOCS and current_version %}
|
||||||
|
{%- set nav_version = current_version %}
|
||||||
|
{% endif %}
|
||||||
|
{% if nav_version %}
|
||||||
|
<div class="version">
|
||||||
|
{{ nav_version }}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% include "searchbox.html" %}
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% block navigation %}
|
||||||
|
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
|
||||||
|
{% block menu %}
|
||||||
|
{#
|
||||||
|
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,
|
||||||
|
includehidden=theme_includehidden|tobool,
|
||||||
|
titles_only=theme_titles_only|tobool) %}
|
||||||
|
{% endif %}
|
||||||
|
{% if global_toc %}
|
||||||
|
{{ global_toc }}
|
||||||
|
{% else %}
|
||||||
|
<!-- Local TOC -->
|
||||||
|
<div class="local-toc">{{ toc }}</div>
|
||||||
|
{% endif %}
|
||||||
|
{% endblock %}
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
|
||||||
|
|
||||||
|
{# MOBILE NAV, TRIGGLES SIDE NAV ON TOGGLE #}
|
||||||
|
<nav class="wy-nav-top" aria-label="top navigation">
|
||||||
|
{% block mobile_nav %}
|
||||||
|
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
|
||||||
|
<a href="{{ pathto(master_doc) }}">{{ project }}</a>
|
||||||
|
{% endblock %}
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="wy-nav-content">
|
||||||
|
{%- block content %}
|
||||||
|
{% if theme_style_external_links|tobool %}
|
||||||
|
<div class="rst-content style-external-links">
|
||||||
|
{% else %}
|
||||||
|
<div class="rst-content">
|
||||||
|
{% endif %}
|
||||||
|
{% include "breadcrumbs.html" %}
|
||||||
|
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
|
||||||
|
{%- block document %}
|
||||||
|
<div itemprop="articleBody">
|
||||||
|
{% block body %}{% endblock %}
|
||||||
|
</div>
|
||||||
|
{% if self.comments()|trim %}
|
||||||
|
<div class="articleComments">
|
||||||
|
{% block comments %}{% endblock %}
|
||||||
|
</div>
|
||||||
|
{% endif%}
|
||||||
|
</div>
|
||||||
|
{%- endblock %}
|
||||||
|
{% include "footer.html" %}
|
||||||
|
</div>
|
||||||
|
{%- endblock %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</section>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% include "versions.html" %}
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
jQuery(function () {
|
||||||
|
SphinxRtdTheme.Navigation.enable({{ 'true' if theme_sticky_navigation|tobool else 'false' }});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{# Do not conflict with RTD insertion of analytics script #}
|
||||||
|
{% if not READTHEDOCS %}
|
||||||
|
{% if theme_analytics_id %}
|
||||||
|
<!-- Theme Analytics -->
|
||||||
|
<script>
|
||||||
|
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||||
|
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||||
|
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');
|
||||||
|
|
||||||
|
ga('create', '{{ theme_analytics_id }}', 'auto');
|
||||||
|
ga('send', 'pageview');
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{%- block footer %} {% endblock %}
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
BIN
doc/_themes/sphinx_rtd_theme/locale/de/LC_MESSAGES/sphinx.mo
vendored
Normal file
BIN
doc/_themes/sphinx_rtd_theme/locale/de/LC_MESSAGES/sphinx.mo
vendored
Normal file
Binary file not shown.
143
doc/_themes/sphinx_rtd_theme/locale/de/LC_MESSAGES/sphinx.po
vendored
Normal file
143
doc/_themes/sphinx_rtd_theme/locale/de/LC_MESSAGES/sphinx.po
vendored
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
# 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:
|
||||||
|
# Tom Kunze <transifex.com@tomabrafix.de>, 2019
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
||||||
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
|
"POT-Creation-Date: 2020-05-06 13:38-0600\n"
|
||||||
|
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
||||||
|
"Last-Translator: Tom Kunze <transifex.com@tomabrafix.de>, 2019\n"
|
||||||
|
"Language-Team: German (https://www.transifex.com/readthedocs/teams/101354/de/)\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: de\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
|
||||||
|
msgid "Edit on GitHub"
|
||||||
|
msgstr "Auf GitHub bearbeiten"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
|
||||||
|
msgid "Edit on Bitbucket"
|
||||||
|
msgstr "Auf Bitbucket bearbeiten"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
|
||||||
|
msgid "Edit on GitLab"
|
||||||
|
msgstr "Auf GitLab bearbeiten"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
|
||||||
|
msgid "View page source"
|
||||||
|
msgstr "Quelltext anzeigen"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
|
||||||
|
msgid "Next"
|
||||||
|
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
|
||||||
|
#: sphinx_rtd_theme/footer.html:31
|
||||||
|
msgid "Build"
|
||||||
|
msgstr "Build"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:41
|
||||||
|
#, python-format
|
||||||
|
msgid "Last updated on %(last_updated)s."
|
||||||
|
msgstr "Zuletzt aktualisiert am %(last_updated)s."
|
||||||
|
|
||||||
|
#. the variable "sphinx_web" is a link to the Sphinx project documentation
|
||||||
|
#. with
|
||||||
|
#. the text "Sphinx"
|
||||||
|
#: sphinx_rtd_theme/footer.html:52
|
||||||
|
#, python-format
|
||||||
|
msgid "Built with %(sphinx_web)s using a"
|
||||||
|
msgstr "Erstellt mit %(sphinx_web)s mit einem"
|
||||||
|
|
||||||
|
#. 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:56
|
||||||
|
#, python-format
|
||||||
|
msgid "provided by %(readthedocs_web)s"
|
||||||
|
msgstr "bereitgestellt von %(readthedocs_web)s"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:79
|
||||||
|
#, python-format
|
||||||
|
msgid "Search within %(docstitle)s"
|
||||||
|
msgstr "%(docstitle)s durchsuchen"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:87
|
||||||
|
msgid "About these documents"
|
||||||
|
msgstr "Über diese Dokumentation"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:90
|
||||||
|
msgid "Index"
|
||||||
|
msgstr "Index"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
|
||||||
|
msgid "Search"
|
||||||
|
msgstr "Suche"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:128
|
||||||
|
msgid "Logo"
|
||||||
|
msgstr "Logo"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:29
|
||||||
|
msgid "Please activate JavaScript to enable the search functionality."
|
||||||
|
msgstr "Bitte aktiviere JavaScript, um die Suchfunktion zu nutzen."
|
||||||
|
|
||||||
|
#. Search is a noun, not a verb
|
||||||
|
#: sphinx_rtd_theme/search.html:37
|
||||||
|
msgid "Search Results"
|
||||||
|
msgstr "Suchergebnisse"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:39
|
||||||
|
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 ""
|
||||||
|
"Es wurden keine mit deiner Suchanfrage übereinstimmenden Dokumente gefunden."
|
||||||
|
" Achte darauf, dass alle Wörter richtig geschrieben sind und dass genug "
|
||||||
|
"Kategorien ausgewählt sind."
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/searchbox.html:4
|
||||||
|
msgid "Search docs"
|
||||||
|
msgstr "Dokumentation durchsuchen"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:11
|
||||||
|
msgid "Versions"
|
||||||
|
msgstr "Versionen"
|
||||||
|
|
||||||
|
#. The phrase "Read the Docs" is not translated
|
||||||
|
#: sphinx_rtd_theme/versions.html:24
|
||||||
|
msgid "On Read the Docs"
|
||||||
|
msgstr "Auf Read the Docs"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:26
|
||||||
|
msgid "Project Home"
|
||||||
|
msgstr "Projektübersicht"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:29
|
||||||
|
msgid "Builds"
|
||||||
|
msgstr "Builds"
|
||||||
|
|
||||||
|
#~ msgid "Docs"
|
||||||
|
#~ msgstr "Dokumentation"
|
||||||
|
|
||||||
|
#~ msgid "Free document hosting provided by"
|
||||||
|
#~ msgstr "Kostenloses Dokumentationen-Hosting zur Verfügung gestellt von"
|
||||||
BIN
doc/_themes/sphinx_rtd_theme/locale/en/LC_MESSAGES/sphinx.mo
vendored
Normal file
BIN
doc/_themes/sphinx_rtd_theme/locale/en/LC_MESSAGES/sphinx.mo
vendored
Normal file
Binary file not shown.
156
doc/_themes/sphinx_rtd_theme/locale/en/LC_MESSAGES/sphinx.po
vendored
Normal file
156
doc/_themes/sphinx_rtd_theme/locale/en/LC_MESSAGES/sphinx.po
vendored
Normal file
@@ -0,0 +1,156 @@
|
|||||||
|
# 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.
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
||||||
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
|
"POT-Creation-Date: 2020-05-06 13:38-0600\n"
|
||||||
|
"PO-Revision-Date: 2019-07-16 15:43-0600\n"
|
||||||
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
|
"Language: en\n"
|
||||||
|
"Language-Team: en <LL@li.org>\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1)\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"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
|
||||||
|
msgid "Edit on GitHub"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
|
||||||
|
msgid "Edit on Bitbucket"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
|
||||||
|
msgid "Edit on GitLab"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
|
||||||
|
msgid "View page source"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
|
||||||
|
msgid "Next"
|
||||||
|
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
|
||||||
|
#: sphinx_rtd_theme/footer.html:31
|
||||||
|
msgid "Build"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. the phrase "revision" comes from Git, referring to a commit
|
||||||
|
#: sphinx_rtd_theme/footer.html:37
|
||||||
|
msgid "Revision"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:41
|
||||||
|
#, python-format
|
||||||
|
msgid "Last updated on %(last_updated)s."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. the variable "sphinx_web" is a link to the Sphinx project documentation with
|
||||||
|
#. the text "Sphinx"
|
||||||
|
#: sphinx_rtd_theme/footer.html:52
|
||||||
|
#, python-format
|
||||||
|
msgid "Built with %(sphinx_web)s using a"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
||||||
|
#. generated documenation
|
||||||
|
#: sphinx_rtd_theme/footer.html:54
|
||||||
|
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:56
|
||||||
|
#, python-format
|
||||||
|
msgid "provided by %(readthedocs_web)s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:79
|
||||||
|
#, python-format
|
||||||
|
msgid "Search within %(docstitle)s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:87
|
||||||
|
msgid "About these documents"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:90
|
||||||
|
msgid "Index"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
|
||||||
|
msgid "Search"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:121
|
||||||
|
msgid "Documentation Home"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:128
|
||||||
|
msgid "Logo"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:29
|
||||||
|
msgid "Please activate JavaScript to enable the search functionality."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Search is a noun, not a verb
|
||||||
|
#: sphinx_rtd_theme/search.html:37
|
||||||
|
msgid "Search Results"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:39
|
||||||
|
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: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 ""
|
||||||
|
|
||||||
|
#~ msgid "Docs"
|
||||||
|
#~ msgstr ""
|
||||||
|
|
||||||
|
#~ msgid "Free document hosting provided by"
|
||||||
|
#~ msgstr ""
|
||||||
|
|
||||||
BIN
doc/_themes/sphinx_rtd_theme/locale/es/LC_MESSAGES/sphinx.mo
vendored
Normal file
BIN
doc/_themes/sphinx_rtd_theme/locale/es/LC_MESSAGES/sphinx.mo
vendored
Normal file
Binary file not shown.
164
doc/_themes/sphinx_rtd_theme/locale/es/LC_MESSAGES/sphinx.po
vendored
Normal file
164
doc/_themes/sphinx_rtd_theme/locale/es/LC_MESSAGES/sphinx.po
vendored
Normal file
@@ -0,0 +1,164 @@
|
|||||||
|
# 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>, 2019
|
||||||
|
# Leonardo J. Caballero G. <leonardocaballero@gmail.com>, 2020
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
||||||
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
|
"POT-Creation-Date: 2020-05-06 13:38-0600\n"
|
||||||
|
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
||||||
|
"Last-Translator: Leonardo J. Caballero G. <leonardocaballero@gmail.com>, 2020\n"
|
||||||
|
"Language-Team: Spanish (https://www.transifex.com/readthedocs/teams/101354/es/)\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: es\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
|
||||||
|
msgid "Edit on GitHub"
|
||||||
|
msgstr "Editar en GitHub"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
|
||||||
|
msgid "Edit on Bitbucket"
|
||||||
|
msgstr "Editar en Bitbucket"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
|
||||||
|
msgid "Edit on GitLab"
|
||||||
|
msgstr "Editar en GitLab"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
|
||||||
|
msgid "View page source"
|
||||||
|
msgstr "Ver código fuente de la página"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
|
||||||
|
msgid "Next"
|
||||||
|
msgstr "Siguiente"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
|
||||||
|
msgid "Previous"
|
||||||
|
msgstr "Anterior"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
|
||||||
|
#: sphinx_rtd_theme/layout.html:96
|
||||||
|
msgid "Copyright"
|
||||||
|
msgstr "Derechos de autor"
|
||||||
|
|
||||||
|
#. Build is a noun, not a verb
|
||||||
|
#: sphinx_rtd_theme/footer.html:31
|
||||||
|
msgid "Build"
|
||||||
|
msgstr "Construido"
|
||||||
|
|
||||||
|
#. the phrase "revision" comes from Git, referring to a commit
|
||||||
|
#: sphinx_rtd_theme/footer.html:37
|
||||||
|
msgid "Revision"
|
||||||
|
msgstr "Revisión"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:41
|
||||||
|
#, python-format
|
||||||
|
msgid "Last updated on %(last_updated)s."
|
||||||
|
msgstr "Actualizado por última vez en %(last_updated)s."
|
||||||
|
|
||||||
|
#. the variable "sphinx_web" is a link to the Sphinx project documentation
|
||||||
|
#. with
|
||||||
|
#. the text "Sphinx"
|
||||||
|
#: sphinx_rtd_theme/footer.html:52
|
||||||
|
#, python-format
|
||||||
|
msgid "Built with %(sphinx_web)s using a"
|
||||||
|
msgstr "Construido con %(sphinx_web)s usando un"
|
||||||
|
|
||||||
|
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
||||||
|
#. generated documenation
|
||||||
|
#: sphinx_rtd_theme/footer.html:54
|
||||||
|
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:56
|
||||||
|
#, python-format
|
||||||
|
msgid "provided by %(readthedocs_web)s"
|
||||||
|
msgstr "proporcionado por %(readthedocs_web)s"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:79
|
||||||
|
#, python-format
|
||||||
|
msgid "Search within %(docstitle)s"
|
||||||
|
msgstr "Buscar en %(docstitle)s"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:87
|
||||||
|
msgid "About these documents"
|
||||||
|
msgstr "Sobre esta documentación"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:90
|
||||||
|
msgid "Index"
|
||||||
|
msgstr "Índice"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
|
||||||
|
msgid "Search"
|
||||||
|
msgstr "Búsqueda"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:121
|
||||||
|
msgid "Documentation Home"
|
||||||
|
msgstr "Inicio de Documentación"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:128
|
||||||
|
msgid "Logo"
|
||||||
|
msgstr "Logotipo"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:29
|
||||||
|
msgid "Please activate JavaScript to enable the search functionality."
|
||||||
|
msgstr ""
|
||||||
|
"Por favor, active JavaScript para habilitar la funcionalidad de búsqueda."
|
||||||
|
|
||||||
|
#. Search is a noun, not a verb
|
||||||
|
#: sphinx_rtd_theme/search.html:37
|
||||||
|
msgid "Search Results"
|
||||||
|
msgstr "Resultados de la búsqueda"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:39
|
||||||
|
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 ""
|
||||||
|
"Su búsqueda no coincide con ningún documento. Por favor, asegúrese de que "
|
||||||
|
"todas las palabras estén correctamente escritas y que usted haya "
|
||||||
|
"seleccionado las suficientes categorías."
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/searchbox.html:4
|
||||||
|
msgid "Search docs"
|
||||||
|
msgstr "Buscar documentos"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:11
|
||||||
|
msgid "Versions"
|
||||||
|
msgstr "Versiones"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:17
|
||||||
|
msgid "Downloads"
|
||||||
|
msgstr "Descargas"
|
||||||
|
|
||||||
|
#. The phrase "Read the Docs" is not translated
|
||||||
|
#: sphinx_rtd_theme/versions.html:24
|
||||||
|
msgid "On Read the Docs"
|
||||||
|
msgstr "En Read the Docs"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:26
|
||||||
|
msgid "Project Home"
|
||||||
|
msgstr "Página de Proyecto"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:29
|
||||||
|
msgid "Builds"
|
||||||
|
msgstr "Construcciones"
|
||||||
|
|
||||||
|
#~ msgid "Docs"
|
||||||
|
#~ msgstr "Documentos"
|
||||||
|
|
||||||
|
#~ msgid "Free document hosting provided by"
|
||||||
|
#~ msgstr "Alojamiento gratuito de documentos proporcionado por"
|
||||||
BIN
doc/_themes/sphinx_rtd_theme/locale/et/LC_MESSAGES/sphinx.mo
vendored
Normal file
BIN
doc/_themes/sphinx_rtd_theme/locale/et/LC_MESSAGES/sphinx.mo
vendored
Normal file
Binary file not shown.
155
doc/_themes/sphinx_rtd_theme/locale/et/LC_MESSAGES/sphinx.po
vendored
Normal file
155
doc/_themes/sphinx_rtd_theme/locale/et/LC_MESSAGES/sphinx.po
vendored
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
# 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>, 2020
|
||||||
|
# Ivar Smolin <okul@linux.ee>, 2020
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
||||||
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
|
"POT-Creation-Date: 2020-05-06 13:38-0600\n"
|
||||||
|
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
||||||
|
"Last-Translator: Ivar Smolin <okul@linux.ee>, 2020\n"
|
||||||
|
"Language-Team: Estonian (https://www.transifex.com/readthedocs/teams/101354/et/)\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: et\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
|
||||||
|
msgid "Edit on GitHub"
|
||||||
|
msgstr "Muuda GitHubis"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
|
||||||
|
msgid "Edit on Bitbucket"
|
||||||
|
msgstr "Muuda Bitbucketis"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
|
||||||
|
msgid "Edit on GitLab"
|
||||||
|
msgstr "Muuda GitLabis"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
|
||||||
|
msgid "View page source"
|
||||||
|
msgstr "Vaata lehe lähtekoodi"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
|
||||||
|
msgid "Next"
|
||||||
|
msgstr "Järgmine"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
|
||||||
|
msgid "Previous"
|
||||||
|
msgstr "Eelmine"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
|
||||||
|
#: sphinx_rtd_theme/layout.html:96
|
||||||
|
msgid "Copyright"
|
||||||
|
msgstr "Autoriõigus"
|
||||||
|
|
||||||
|
#. Build is a noun, not a verb
|
||||||
|
#: sphinx_rtd_theme/footer.html:31
|
||||||
|
msgid "Build"
|
||||||
|
msgstr "Ehitus"
|
||||||
|
|
||||||
|
#. the phrase "revision" comes from Git, referring to a commit
|
||||||
|
#: sphinx_rtd_theme/footer.html:37
|
||||||
|
msgid "Revision"
|
||||||
|
msgstr "Redaktsioon"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:41
|
||||||
|
#, python-format
|
||||||
|
msgid "Last updated on %(last_updated)s."
|
||||||
|
msgstr "Viimati uuendatud %(last_updated)s."
|
||||||
|
|
||||||
|
#. the variable "sphinx_web" is a link to the Sphinx project documentation
|
||||||
|
#. with
|
||||||
|
#. the text "Sphinx"
|
||||||
|
#: sphinx_rtd_theme/footer.html:52
|
||||||
|
#, python-format
|
||||||
|
msgid "Built with %(sphinx_web)s using a"
|
||||||
|
msgstr "Ehitatud %(sphinx_web)s'iga,"
|
||||||
|
|
||||||
|
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
||||||
|
#. generated documenation
|
||||||
|
#: sphinx_rtd_theme/footer.html:54
|
||||||
|
msgid "theme"
|
||||||
|
msgstr "kujundusteema"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:79
|
||||||
|
#, python-format
|
||||||
|
msgid "Search within %(docstitle)s"
|
||||||
|
msgstr "Otsi dokumendist %(docstitle)s"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:87
|
||||||
|
msgid "About these documents"
|
||||||
|
msgstr "Nende dokumentide kirjeldused"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:90
|
||||||
|
msgid "Index"
|
||||||
|
msgstr "Indeks"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
|
||||||
|
msgid "Search"
|
||||||
|
msgstr "Otsing"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:121
|
||||||
|
msgid "Documentation Home"
|
||||||
|
msgstr "Dokumentatsiooni kodu"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:128
|
||||||
|
msgid "Logo"
|
||||||
|
msgstr "Logo"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:29
|
||||||
|
msgid "Please activate JavaScript to enable the search functionality."
|
||||||
|
msgstr "Otsimisfunktsiooni lubamiseks aktiveeri palun JavaScript"
|
||||||
|
|
||||||
|
#. Search is a noun, not a verb
|
||||||
|
#: sphinx_rtd_theme/search.html:37
|
||||||
|
msgid "Search Results"
|
||||||
|
msgstr "Otsingu tulemused"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:39
|
||||||
|
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 ""
|
||||||
|
"Sinu otsingule ei vastanud ükski dokument. Palun veendu, et kõik sisestatud "
|
||||||
|
"sõnad on õigesti kirjutatud ja sa oled valikud piisaval hulgal kategooriaid."
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/searchbox.html:4
|
||||||
|
msgid "Search docs"
|
||||||
|
msgstr "Otsi dokumente"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:11
|
||||||
|
msgid "Versions"
|
||||||
|
msgstr "Versioonid"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:17
|
||||||
|
msgid "Downloads"
|
||||||
|
msgstr "Allalaadimised"
|
||||||
|
|
||||||
|
#. The phrase "Read the Docs" is not translated
|
||||||
|
#: sphinx_rtd_theme/versions.html:24
|
||||||
|
msgid "On Read the Docs"
|
||||||
|
msgstr "Saidil Read the Docs"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:26
|
||||||
|
msgid "Project Home"
|
||||||
|
msgstr "Projekti kodu"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:29
|
||||||
|
msgid "Builds"
|
||||||
|
msgstr "Ehitused"
|
||||||
|
|
||||||
|
#~ msgid "Docs"
|
||||||
|
#~ msgstr "Dokumendid"
|
||||||
|
|
||||||
|
#~ msgid "Free document hosting provided by"
|
||||||
|
#~ msgstr "Dokumentatsiooni majutab tasuta"
|
||||||
BIN
doc/_themes/sphinx_rtd_theme/locale/fr/LC_MESSAGES/sphinx.mo
vendored
Normal file
BIN
doc/_themes/sphinx_rtd_theme/locale/fr/LC_MESSAGES/sphinx.mo
vendored
Normal file
Binary file not shown.
154
doc/_themes/sphinx_rtd_theme/locale/fr/LC_MESSAGES/sphinx.po
vendored
Normal file
154
doc/_themes/sphinx_rtd_theme/locale/fr/LC_MESSAGES/sphinx.po
vendored
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
# 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:
|
||||||
|
# Radina Matic <radina.matic@gmail.com>, 2020
|
||||||
|
# Anthony <aj@ohess.org>, 2020
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
||||||
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
|
"POT-Creation-Date: 2020-05-06 13:38-0600\n"
|
||||||
|
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
||||||
|
"Last-Translator: Anthony <aj@ohess.org>, 2020\n"
|
||||||
|
"Language-Team: French (https://www.transifex.com/readthedocs/teams/101354/fr/)\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: fr\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
|
||||||
|
msgid "Edit on GitHub"
|
||||||
|
msgstr "Éditer sur GitHub"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
|
||||||
|
msgid "Edit on Bitbucket"
|
||||||
|
msgstr "Éditer sur Bitbucket"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
|
||||||
|
msgid "Edit on GitLab"
|
||||||
|
msgstr "Éditer sur GitLab"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
|
||||||
|
msgid "View page source"
|
||||||
|
msgstr "Afficher la source de la page"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
|
||||||
|
msgid "Next"
|
||||||
|
msgstr "Suivant"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
|
||||||
|
msgid "Previous"
|
||||||
|
msgstr "Précédent"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:21 sphinx_rtd_theme/footer.html:24
|
||||||
|
#: sphinx_rtd_theme/layout.html:96
|
||||||
|
msgid "Copyright"
|
||||||
|
msgstr "Droits d'auteur"
|
||||||
|
|
||||||
|
#. Build is a noun, not a verb
|
||||||
|
#: sphinx_rtd_theme/footer.html:31
|
||||||
|
msgid "Build"
|
||||||
|
msgstr "Compilation"
|
||||||
|
|
||||||
|
#. the phrase "revision" comes from Git, referring to a commit
|
||||||
|
#: sphinx_rtd_theme/footer.html:37
|
||||||
|
msgid "Revision"
|
||||||
|
msgstr "Révision"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:41
|
||||||
|
#, python-format
|
||||||
|
msgid "Last updated on %(last_updated)s."
|
||||||
|
msgstr "Dernière mise à jour le %(last_updated)s."
|
||||||
|
|
||||||
|
#. the variable "sphinx_web" is a link to the Sphinx project documentation
|
||||||
|
#. with
|
||||||
|
#. the text "Sphinx"
|
||||||
|
#: sphinx_rtd_theme/footer.html:52
|
||||||
|
#, python-format
|
||||||
|
msgid "Built with %(sphinx_web)s using a"
|
||||||
|
msgstr "Compilé avec %(sphinx_web)s en utilisant un"
|
||||||
|
|
||||||
|
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
||||||
|
#. generated documenation
|
||||||
|
#: sphinx_rtd_theme/footer.html:54
|
||||||
|
msgid "theme"
|
||||||
|
msgstr "thème"
|
||||||
|
|
||||||
|
#. 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:56
|
||||||
|
#, python-format
|
||||||
|
msgid "provided by %(readthedocs_web)s"
|
||||||
|
msgstr "fourni par %(readthedocs_web)s"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:79
|
||||||
|
#, python-format
|
||||||
|
msgid "Search within %(docstitle)s"
|
||||||
|
msgstr "Rechercher dans %(docstitle)s"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:87
|
||||||
|
msgid "About these documents"
|
||||||
|
msgstr "À propos de cette documentation"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:90
|
||||||
|
msgid "Index"
|
||||||
|
msgstr "Index"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
|
||||||
|
msgid "Search"
|
||||||
|
msgstr "Rechercher"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:128
|
||||||
|
msgid "Logo"
|
||||||
|
msgstr "Logo"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:29
|
||||||
|
msgid "Please activate JavaScript to enable the search functionality."
|
||||||
|
msgstr "Activez JavaScript pour accéder à la fonction de recherche."
|
||||||
|
|
||||||
|
#. Search is a noun, not a verb
|
||||||
|
#: sphinx_rtd_theme/search.html:37
|
||||||
|
msgid "Search Results"
|
||||||
|
msgstr "Résultats de la recherche"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:39
|
||||||
|
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 ""
|
||||||
|
"Votre recherche ne correspond à aucun document. Assurez-vous que tous les "
|
||||||
|
"mots sont correctement orthographiés et que vous avez sélectionné "
|
||||||
|
"suffisamment de catégories."
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/searchbox.html:4
|
||||||
|
msgid "Search docs"
|
||||||
|
msgstr "Rechercher docs"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:11
|
||||||
|
msgid "Versions"
|
||||||
|
msgstr "Versions"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:17
|
||||||
|
msgid "Downloads"
|
||||||
|
msgstr "Téléchargements"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:26
|
||||||
|
msgid "Project Home"
|
||||||
|
msgstr "Accueil du projet"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:29
|
||||||
|
msgid "Builds"
|
||||||
|
msgstr "Compilations"
|
||||||
|
|
||||||
|
#~ msgid "Docs"
|
||||||
|
#~ msgstr "Docs"
|
||||||
|
|
||||||
|
#~ msgid "Free document hosting provided by"
|
||||||
|
#~ msgstr "Hébergement gratuit de documents fourni par"
|
||||||
BIN
doc/_themes/sphinx_rtd_theme/locale/nl/LC_MESSAGES/sphinx.mo
vendored
Normal file
BIN
doc/_themes/sphinx_rtd_theme/locale/nl/LC_MESSAGES/sphinx.mo
vendored
Normal file
Binary file not shown.
157
doc/_themes/sphinx_rtd_theme/locale/nl/LC_MESSAGES/sphinx.po
vendored
Normal file
157
doc/_themes/sphinx_rtd_theme/locale/nl/LC_MESSAGES/sphinx.po
vendored
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
# 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:
|
||||||
|
# Jesse Tan, 2019
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
||||||
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
|
"POT-Creation-Date: 2020-05-06 13:38-0600\n"
|
||||||
|
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
||||||
|
"Last-Translator: Jesse Tan, 2019\n"
|
||||||
|
"Language-Team: Dutch (https://www.transifex.com/readthedocs/teams/101354/nl/)\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: nl\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
|
||||||
|
msgid "Edit on GitHub"
|
||||||
|
msgstr "Bewerk op GitHub"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
|
||||||
|
msgid "Edit on Bitbucket"
|
||||||
|
msgstr "Bewerk op BitBucket"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
|
||||||
|
msgid "Edit on GitLab"
|
||||||
|
msgstr "Bewerk op GitLab"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
|
||||||
|
msgid "View page source"
|
||||||
|
msgstr "Bekijk paginabron"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
|
||||||
|
msgid "Next"
|
||||||
|
msgstr "Volgende"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
|
||||||
|
msgid "Previous"
|
||||||
|
msgstr "Vorige"
|
||||||
|
|
||||||
|
#: 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
|
||||||
|
#: sphinx_rtd_theme/footer.html:31
|
||||||
|
msgid "Build"
|
||||||
|
msgstr "Bouwresultaat"
|
||||||
|
|
||||||
|
#. the phrase "revision" comes from Git, referring to a commit
|
||||||
|
#: sphinx_rtd_theme/footer.html:37
|
||||||
|
msgid "Revision"
|
||||||
|
msgstr "Revisie"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:41
|
||||||
|
#, python-format
|
||||||
|
msgid "Last updated on %(last_updated)s."
|
||||||
|
msgstr "Laatste update op %(last_updated)s."
|
||||||
|
|
||||||
|
#. the variable "sphinx_web" is a link to the Sphinx project documentation
|
||||||
|
#. with
|
||||||
|
#. the text "Sphinx"
|
||||||
|
#: sphinx_rtd_theme/footer.html:52
|
||||||
|
#, python-format
|
||||||
|
msgid "Built with %(sphinx_web)s using a"
|
||||||
|
msgstr "Gebouwd met %(sphinx_web)s met een"
|
||||||
|
|
||||||
|
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
||||||
|
#. generated documenation
|
||||||
|
#: sphinx_rtd_theme/footer.html:54
|
||||||
|
msgid "theme"
|
||||||
|
msgstr "thema"
|
||||||
|
|
||||||
|
#. 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:56
|
||||||
|
#, python-format
|
||||||
|
msgid "provided by %(readthedocs_web)s"
|
||||||
|
msgstr "geleverd door %(readthedocs_web)s"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:79
|
||||||
|
#, python-format
|
||||||
|
msgid "Search within %(docstitle)s"
|
||||||
|
msgstr "Zoek binnen %(docstitle)s"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:87
|
||||||
|
msgid "About these documents"
|
||||||
|
msgstr "Over deze documenten"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:90
|
||||||
|
msgid "Index"
|
||||||
|
msgstr "Index"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
|
||||||
|
msgid "Search"
|
||||||
|
msgstr "Zoek"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:128
|
||||||
|
msgid "Logo"
|
||||||
|
msgstr "Logo"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:29
|
||||||
|
msgid "Please activate JavaScript to enable the search functionality."
|
||||||
|
msgstr "Zet JavaScript aan om de zoekfunctie mogelijk te maken."
|
||||||
|
|
||||||
|
#. Search is a noun, not a verb
|
||||||
|
#: sphinx_rtd_theme/search.html:37
|
||||||
|
msgid "Search Results"
|
||||||
|
msgstr "Zoekresultaten"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:39
|
||||||
|
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 ""
|
||||||
|
"Zoekpoging vond geen documenten. Zorg ervoor dat alle woorden correct zijn "
|
||||||
|
"gespeld en dat voldoende categorieën zijn geselecteerd."
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/searchbox.html:4
|
||||||
|
msgid "Search docs"
|
||||||
|
msgstr "Zoek in documentatie"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:11
|
||||||
|
msgid "Versions"
|
||||||
|
msgstr "Versies"
|
||||||
|
|
||||||
|
#: 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 "Op Read the Docs"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:26
|
||||||
|
msgid "Project Home"
|
||||||
|
msgstr "Project Home"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:29
|
||||||
|
msgid "Builds"
|
||||||
|
msgstr "Bouwresultaten"
|
||||||
|
|
||||||
|
#~ msgid "Docs"
|
||||||
|
#~ msgstr "Documentatie"
|
||||||
|
|
||||||
|
#~ msgid "Free document hosting provided by"
|
||||||
|
#~ msgstr "Gratis hosting voor documentatie verzorgd door"
|
||||||
BIN
doc/_themes/sphinx_rtd_theme/locale/pt_BR/LC_MESSAGES/sphinx.mo
vendored
Normal file
BIN
doc/_themes/sphinx_rtd_theme/locale/pt_BR/LC_MESSAGES/sphinx.mo
vendored
Normal file
Binary file not shown.
159
doc/_themes/sphinx_rtd_theme/locale/pt_BR/LC_MESSAGES/sphinx.po
vendored
Normal file
159
doc/_themes/sphinx_rtd_theme/locale/pt_BR/LC_MESSAGES/sphinx.po
vendored
Normal file
@@ -0,0 +1,159 @@
|
|||||||
|
# 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:
|
||||||
|
# Rafael Fontenelle <rffontenelle@gmail.com>, 2020
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
||||||
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
|
"POT-Creation-Date: 2020-05-06 13:38-0600\n"
|
||||||
|
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
||||||
|
"Last-Translator: Rafael Fontenelle <rffontenelle@gmail.com>, 2020\n"
|
||||||
|
"Language-Team: Portuguese (Brazil) (https://www.transifex.com/readthedocs/teams/101354/pt_BR/)\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_BR\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
|
||||||
|
msgid "Edit on GitHub"
|
||||||
|
msgstr "Editar no GitHub"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
|
||||||
|
msgid "Edit on Bitbucket"
|
||||||
|
msgstr "Editar no Bitbucket"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
|
||||||
|
msgid "Edit on GitLab"
|
||||||
|
msgstr "Editar no GitLab"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
|
||||||
|
msgid "View page source"
|
||||||
|
msgstr "Ver código-fonte da página"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
|
||||||
|
msgid "Next"
|
||||||
|
msgstr "Próximo"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
|
||||||
|
msgid "Previous"
|
||||||
|
msgstr "Anterior"
|
||||||
|
|
||||||
|
#: 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
|
||||||
|
#: sphinx_rtd_theme/footer.html:31
|
||||||
|
msgid "Build"
|
||||||
|
msgstr "Compilação"
|
||||||
|
|
||||||
|
#. the phrase "revision" comes from Git, referring to a commit
|
||||||
|
#: sphinx_rtd_theme/footer.html:37
|
||||||
|
msgid "Revision"
|
||||||
|
msgstr "Revisão"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:41
|
||||||
|
#, python-format
|
||||||
|
msgid "Last updated on %(last_updated)s."
|
||||||
|
msgstr "Última atualizaçã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:52
|
||||||
|
#, 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 documenation
|
||||||
|
#: sphinx_rtd_theme/footer.html:54
|
||||||
|
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:56
|
||||||
|
#, python-format
|
||||||
|
msgid "provided by %(readthedocs_web)s"
|
||||||
|
msgstr "fornecido por %(readthedocs_web)s"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:79
|
||||||
|
#, python-format
|
||||||
|
msgid "Search within %(docstitle)s"
|
||||||
|
msgstr "Pesquisar em %(docstitle)s"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:87
|
||||||
|
msgid "About these documents"
|
||||||
|
msgstr "Sobre esses documentos"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:90
|
||||||
|
msgid "Index"
|
||||||
|
msgstr "Índice"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
|
||||||
|
msgid "Search"
|
||||||
|
msgstr "Pesquisar"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:128
|
||||||
|
msgid "Logo"
|
||||||
|
msgstr "Logo"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:29
|
||||||
|
msgid "Please activate JavaScript to enable the search functionality."
|
||||||
|
msgstr ""
|
||||||
|
"Por favor, ative JavaScript para habilitar a funcionalidade de pesquisa."
|
||||||
|
|
||||||
|
#. Search is a noun, not a verb
|
||||||
|
#: sphinx_rtd_theme/search.html:37
|
||||||
|
msgid "Search Results"
|
||||||
|
msgstr "Resultados da pesquisa"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:39
|
||||||
|
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 correspondente. Verifique se "
|
||||||
|
"todas as palavras estão escritas corretamente e se você selecionou "
|
||||||
|
"categorias suficientes."
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/searchbox.html:4
|
||||||
|
msgid "Search docs"
|
||||||
|
msgstr "Pesquisar documentos"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:11
|
||||||
|
msgid "Versions"
|
||||||
|
msgstr "Versões"
|
||||||
|
|
||||||
|
#: 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 "No Read the Docs"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:26
|
||||||
|
msgid "Project Home"
|
||||||
|
msgstr "Página inicial"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:29
|
||||||
|
msgid "Builds"
|
||||||
|
msgstr "Compilações"
|
||||||
|
|
||||||
|
#~ msgid "Docs"
|
||||||
|
#~ msgstr "Docs"
|
||||||
|
|
||||||
|
#~ msgid "Free document hosting provided by"
|
||||||
|
#~ msgstr "Hospedagem de documentos livres fornecida por"
|
||||||
BIN
doc/_themes/sphinx_rtd_theme/locale/ru/LC_MESSAGES/sphinx.mo
vendored
Normal file
BIN
doc/_themes/sphinx_rtd_theme/locale/ru/LC_MESSAGES/sphinx.mo
vendored
Normal file
Binary file not shown.
158
doc/_themes/sphinx_rtd_theme/locale/ru/LC_MESSAGES/sphinx.po
vendored
Normal file
158
doc/_themes/sphinx_rtd_theme/locale/ru/LC_MESSAGES/sphinx.po
vendored
Normal file
@@ -0,0 +1,158 @@
|
|||||||
|
# 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:
|
||||||
|
# Dmitry Shachnev <mitya57@gmail.com>, 2019
|
||||||
|
# lvv83 <vlozhkin83@gmail.com>, 2019
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
||||||
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
|
"POT-Creation-Date: 2020-05-06 13:38-0600\n"
|
||||||
|
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
||||||
|
"Last-Translator: lvv83 <vlozhkin83@gmail.com>, 2019\n"
|
||||||
|
"Language-Team: Russian (https://www.transifex.com/readthedocs/teams/101354/ru/)\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: 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"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
|
||||||
|
msgid "Edit on GitHub"
|
||||||
|
msgstr "Редактировать на GitHub"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
|
||||||
|
msgid "Edit on Bitbucket"
|
||||||
|
msgstr "Редактировать на BitBucket"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
|
||||||
|
msgid "Edit on GitLab"
|
||||||
|
msgstr "Редактировать на GitLab"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
|
||||||
|
msgid "View page source"
|
||||||
|
msgstr "Просмотреть исходный код страницы"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
|
||||||
|
msgid "Next"
|
||||||
|
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
|
||||||
|
#: sphinx_rtd_theme/footer.html:31
|
||||||
|
msgid "Build"
|
||||||
|
msgstr "Сборка"
|
||||||
|
|
||||||
|
#. the phrase "revision" comes from Git, referring to a commit
|
||||||
|
#: sphinx_rtd_theme/footer.html:37
|
||||||
|
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:52
|
||||||
|
#, 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 documenation
|
||||||
|
#: sphinx_rtd_theme/footer.html:54
|
||||||
|
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:56
|
||||||
|
#, python-format
|
||||||
|
msgid "provided by %(readthedocs_web)s"
|
||||||
|
msgstr "предоставленной %(readthedocs_web)s"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:79
|
||||||
|
#, python-format
|
||||||
|
msgid "Search within %(docstitle)s"
|
||||||
|
msgstr "Поиск в %(docstitle)s"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:87
|
||||||
|
msgid "About these documents"
|
||||||
|
msgstr "Об этих документах"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:90
|
||||||
|
msgid "Index"
|
||||||
|
msgstr "Алфавитный указатель"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
|
||||||
|
msgid "Search"
|
||||||
|
msgstr "Поиск"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:128
|
||||||
|
msgid "Logo"
|
||||||
|
msgstr "Логотип"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:29
|
||||||
|
msgid "Please activate JavaScript to enable the search functionality."
|
||||||
|
msgstr "Активируйте JavaScript, чтобы использовать функционал поиска."
|
||||||
|
|
||||||
|
#. Search is a noun, not a verb
|
||||||
|
#: sphinx_rtd_theme/search.html:37
|
||||||
|
msgid "Search Results"
|
||||||
|
msgstr "Результаты поиска"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:39
|
||||||
|
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: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 "На Read the Docs"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:26
|
||||||
|
msgid "Project Home"
|
||||||
|
msgstr "Домашняя страница проекта"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:29
|
||||||
|
msgid "Builds"
|
||||||
|
msgstr "Сборки"
|
||||||
|
|
||||||
|
#~ msgid "Docs"
|
||||||
|
#~ msgstr "Документация"
|
||||||
|
|
||||||
|
#~ msgid "Free document hosting provided by"
|
||||||
|
#~ msgstr "Бесплатный хостинг документов, предоставленный"
|
||||||
149
doc/_themes/sphinx_rtd_theme/locale/sphinx.pot
vendored
Normal file
149
doc/_themes/sphinx_rtd_theme/locale/sphinx.pot
vendored
Normal file
@@ -0,0 +1,149 @@
|
|||||||
|
# Translations template for sphinx_rtd_theme.
|
||||||
|
# Copyright (C) 2020 ORGANIZATION
|
||||||
|
# This file is distributed under the same license as the sphinx_rtd_theme
|
||||||
|
# project.
|
||||||
|
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
|
||||||
|
#
|
||||||
|
#, fuzzy
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
||||||
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
|
"POT-Creation-Date: 2020-05-06 13:38-0600\n"
|
||||||
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
|
"Language-Team: LANGUAGE <LL@li.org>\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"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
|
||||||
|
msgid "Edit on GitHub"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
|
||||||
|
msgid "Edit on Bitbucket"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
|
||||||
|
msgid "Edit on GitLab"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
|
||||||
|
msgid "View page source"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
|
||||||
|
msgid "Next"
|
||||||
|
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
|
||||||
|
#: sphinx_rtd_theme/footer.html:31
|
||||||
|
msgid "Build"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. the phrase "revision" comes from Git, referring to a commit
|
||||||
|
#: sphinx_rtd_theme/footer.html:37
|
||||||
|
msgid "Revision"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:41
|
||||||
|
#, python-format
|
||||||
|
msgid "Last updated on %(last_updated)s."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. the variable "sphinx_web" is a link to the Sphinx project documentation with
|
||||||
|
#. the text "Sphinx"
|
||||||
|
#: sphinx_rtd_theme/footer.html:52
|
||||||
|
#, python-format
|
||||||
|
msgid "Built with %(sphinx_web)s using a"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
||||||
|
#. generated documenation
|
||||||
|
#: sphinx_rtd_theme/footer.html:54
|
||||||
|
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:56
|
||||||
|
#, python-format
|
||||||
|
msgid "provided by %(readthedocs_web)s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:79
|
||||||
|
#, python-format
|
||||||
|
msgid "Search within %(docstitle)s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:87
|
||||||
|
msgid "About these documents"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:90
|
||||||
|
msgid "Index"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
|
||||||
|
msgid "Search"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:121
|
||||||
|
msgid "Documentation Home"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:128
|
||||||
|
msgid "Logo"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:29
|
||||||
|
msgid "Please activate JavaScript to enable the search functionality."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Search is a noun, not a verb
|
||||||
|
#: sphinx_rtd_theme/search.html:37
|
||||||
|
msgid "Search Results"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:39
|
||||||
|
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: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 ""
|
||||||
|
|
||||||
BIN
doc/_themes/sphinx_rtd_theme/locale/sv/LC_MESSAGES/sphinx.mo
vendored
Normal file
BIN
doc/_themes/sphinx_rtd_theme/locale/sv/LC_MESSAGES/sphinx.mo
vendored
Normal file
Binary file not shown.
158
doc/_themes/sphinx_rtd_theme/locale/sv/LC_MESSAGES/sphinx.po
vendored
Normal file
158
doc/_themes/sphinx_rtd_theme/locale/sv/LC_MESSAGES/sphinx.po
vendored
Normal file
@@ -0,0 +1,158 @@
|
|||||||
|
# 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:
|
||||||
|
# Daniel Holmberg <daniel.holmberg97@gmail.com>, 2020
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
||||||
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
|
"POT-Creation-Date: 2020-05-06 13:38-0600\n"
|
||||||
|
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
||||||
|
"Last-Translator: Daniel Holmberg <daniel.holmberg97@gmail.com>, 2020\n"
|
||||||
|
"Language-Team: Swedish (https://www.transifex.com/readthedocs/teams/101354/sv/)\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: sv\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
|
||||||
|
msgid "Edit on GitHub"
|
||||||
|
msgstr "Editera på GitHub"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
|
||||||
|
msgid "Edit on Bitbucket"
|
||||||
|
msgstr "Editera på Bitbucket"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
|
||||||
|
msgid "Edit on GitLab"
|
||||||
|
msgstr "Editera på GitLab"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
|
||||||
|
msgid "View page source"
|
||||||
|
msgstr "Visa sidkälla"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
|
||||||
|
msgid "Next"
|
||||||
|
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
|
||||||
|
#: sphinx_rtd_theme/footer.html:31
|
||||||
|
msgid "Build"
|
||||||
|
msgstr "Bygg"
|
||||||
|
|
||||||
|
#. the phrase "revision" comes from Git, referring to a commit
|
||||||
|
#: sphinx_rtd_theme/footer.html:37
|
||||||
|
msgid "Revision"
|
||||||
|
msgstr "Ändra"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:41
|
||||||
|
#, python-format
|
||||||
|
msgid "Last updated on %(last_updated)s."
|
||||||
|
msgstr "Senast uppdaterad %(last_updated)s."
|
||||||
|
|
||||||
|
#. the variable "sphinx_web" is a link to the Sphinx project documentation
|
||||||
|
#. with
|
||||||
|
#. the text "Sphinx"
|
||||||
|
#: sphinx_rtd_theme/footer.html:52
|
||||||
|
#, python-format
|
||||||
|
msgid "Built with %(sphinx_web)s using a"
|
||||||
|
msgstr "Gjord med %(sphinx_web)s med hjälp av"
|
||||||
|
|
||||||
|
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
||||||
|
#. generated documenation
|
||||||
|
#: sphinx_rtd_theme/footer.html:54
|
||||||
|
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:56
|
||||||
|
#, python-format
|
||||||
|
msgid "provided by %(readthedocs_web)s"
|
||||||
|
msgstr "erhållet av %(readthedocs_web)s"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:79
|
||||||
|
#, python-format
|
||||||
|
msgid "Search within %(docstitle)s"
|
||||||
|
msgstr "Sök i %(docstitle)s"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:87
|
||||||
|
msgid "About these documents"
|
||||||
|
msgstr "Om dessa dokument"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:90
|
||||||
|
msgid "Index"
|
||||||
|
msgstr "Index"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
|
||||||
|
msgid "Search"
|
||||||
|
msgstr "Sök"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:121
|
||||||
|
msgid "Documentation Home"
|
||||||
|
msgstr "Dokumentation Hem"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:128
|
||||||
|
msgid "Logo"
|
||||||
|
msgstr "Logo"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:29
|
||||||
|
msgid "Please activate JavaScript to enable the search functionality."
|
||||||
|
msgstr ""
|
||||||
|
"Var vänlig och aktivera JavaScript för att möjliggöra sökfunktionaliteten."
|
||||||
|
|
||||||
|
#. Search is a noun, not a verb
|
||||||
|
#: sphinx_rtd_theme/search.html:37
|
||||||
|
msgid "Search Results"
|
||||||
|
msgstr "Sökresultat"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:39
|
||||||
|
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 ""
|
||||||
|
"Din sökning gav inga träffar. Var vänlig och se till att alla ord är rätt "
|
||||||
|
"stavade och att du har valt tillräckligt många kategorier."
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/searchbox.html:4
|
||||||
|
msgid "Search docs"
|
||||||
|
msgstr "Sök i dokumentationen"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:11
|
||||||
|
msgid "Versions"
|
||||||
|
msgstr "Versioner"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:17
|
||||||
|
msgid "Downloads"
|
||||||
|
msgstr "Nerladdningar"
|
||||||
|
|
||||||
|
#. The phrase "Read the Docs" is not translated
|
||||||
|
#: sphinx_rtd_theme/versions.html:24
|
||||||
|
msgid "On Read the Docs"
|
||||||
|
msgstr "På Read the Docs"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:26
|
||||||
|
msgid "Project Home"
|
||||||
|
msgstr "Projekt Hem"
|
||||||
|
|
||||||
|
#~ msgid "Docs"
|
||||||
|
#~ msgstr "Dokumentation"
|
||||||
|
|
||||||
|
#~ msgid "Free document hosting provided by"
|
||||||
|
#~ msgstr "Gratis dokumentations hysning erhållen av"
|
||||||
BIN
doc/_themes/sphinx_rtd_theme/locale/tr/LC_MESSAGES/sphinx.mo
vendored
Normal file
BIN
doc/_themes/sphinx_rtd_theme/locale/tr/LC_MESSAGES/sphinx.mo
vendored
Normal file
Binary file not shown.
147
doc/_themes/sphinx_rtd_theme/locale/tr/LC_MESSAGES/sphinx.po
vendored
Normal file
147
doc/_themes/sphinx_rtd_theme/locale/tr/LC_MESSAGES/sphinx.po
vendored
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
# 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:
|
||||||
|
# BouRock, 2020
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
||||||
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
|
"POT-Creation-Date: 2020-05-06 13:38-0600\n"
|
||||||
|
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
||||||
|
"Last-Translator: BouRock, 2020\n"
|
||||||
|
"Language-Team: Turkish (https://www.transifex.com/readthedocs/teams/101354/tr/)\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: tr\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
|
||||||
|
msgid "Edit on GitHub"
|
||||||
|
msgstr "GitHub'da Düzenle"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
|
||||||
|
msgid "Edit on Bitbucket"
|
||||||
|
msgstr "Bitbucket'ta Düzenle"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
|
||||||
|
msgid "Edit on GitLab"
|
||||||
|
msgstr "GitLab'ta Düzenle"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
|
||||||
|
msgid "View page source"
|
||||||
|
msgstr "Sayfa kaynağını görüntüle"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
|
||||||
|
msgid "Next"
|
||||||
|
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
|
||||||
|
#: sphinx_rtd_theme/footer.html:31
|
||||||
|
msgid "Build"
|
||||||
|
msgstr "Oluşturma"
|
||||||
|
|
||||||
|
#. the phrase "revision" comes from Git, referring to a commit
|
||||||
|
#: sphinx_rtd_theme/footer.html:37
|
||||||
|
msgid "Revision"
|
||||||
|
msgstr "Gözden geçirme"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/footer.html:41
|
||||||
|
#, python-format
|
||||||
|
msgid "Last updated on %(last_updated)s."
|
||||||
|
msgstr "Son olarak %(last_updated)s tarihinde güncellendi."
|
||||||
|
|
||||||
|
#. "theme" refers to a theme for Sphinx, which alters the appearance of the
|
||||||
|
#. generated documenation
|
||||||
|
#: sphinx_rtd_theme/footer.html:54
|
||||||
|
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:56
|
||||||
|
#, python-format
|
||||||
|
msgid "provided by %(readthedocs_web)s"
|
||||||
|
msgstr "kullanılarak %(readthedocs_web)s tarafından sağlanmasıyla oluşturuldu"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:79
|
||||||
|
#, python-format
|
||||||
|
msgid "Search within %(docstitle)s"
|
||||||
|
msgstr "%(docstitle)s içinde ara"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:87
|
||||||
|
msgid "About these documents"
|
||||||
|
msgstr "Bu belgeler hakkında"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:90
|
||||||
|
msgid "Index"
|
||||||
|
msgstr "Dizin"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
|
||||||
|
msgid "Search"
|
||||||
|
msgstr "Arama"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:128
|
||||||
|
msgid "Logo"
|
||||||
|
msgstr "Logo"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:29
|
||||||
|
msgid "Please activate JavaScript to enable the search functionality."
|
||||||
|
msgstr ""
|
||||||
|
"Arama işlevselliğini etkinleştirmek için lütfen JavaScript'i etkinleştirin."
|
||||||
|
|
||||||
|
#. Search is a noun, not a verb
|
||||||
|
#: sphinx_rtd_theme/search.html:37
|
||||||
|
msgid "Search Results"
|
||||||
|
msgstr "Arama Sonuçları"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:39
|
||||||
|
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 ""
|
||||||
|
"Aramanız hiçbir belgeyle eşleşmedi. Lütfen tüm kelimelerin doğru "
|
||||||
|
"yazıldığından ve yeterli kategori seçtiğinizden emin olun."
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/searchbox.html:4
|
||||||
|
msgid "Search docs"
|
||||||
|
msgstr "Belgeleri arayın"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:11
|
||||||
|
msgid "Versions"
|
||||||
|
msgstr "Sürümler"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:17
|
||||||
|
msgid "Downloads"
|
||||||
|
msgstr "İndirmeler"
|
||||||
|
|
||||||
|
#. The phrase "Read the Docs" is not translated
|
||||||
|
#: sphinx_rtd_theme/versions.html:24
|
||||||
|
msgid "On Read the Docs"
|
||||||
|
msgstr "Read the Docs Üzerinde"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:26
|
||||||
|
msgid "Project Home"
|
||||||
|
msgstr "Proje Ana Sayfa"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:29
|
||||||
|
msgid "Builds"
|
||||||
|
msgstr "Oluşturmalar"
|
||||||
|
|
||||||
|
#~ msgid "Free document hosting provided by"
|
||||||
|
#~ msgstr "Ücretsiz belge barındırmayı sağlayan"
|
||||||
BIN
doc/_themes/sphinx_rtd_theme/locale/zh_CN/LC_MESSAGES/sphinx.mo
vendored
Normal file
BIN
doc/_themes/sphinx_rtd_theme/locale/zh_CN/LC_MESSAGES/sphinx.mo
vendored
Normal file
Binary file not shown.
151
doc/_themes/sphinx_rtd_theme/locale/zh_CN/LC_MESSAGES/sphinx.po
vendored
Normal file
151
doc/_themes/sphinx_rtd_theme/locale/zh_CN/LC_MESSAGES/sphinx.po
vendored
Normal file
@@ -0,0 +1,151 @@
|
|||||||
|
# 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:
|
||||||
|
# 王赛 <wangsai@bootcss.com>, 2019
|
||||||
|
# Anthony <aj@ohess.org>, 2020
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
|
||||||
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
|
"POT-Creation-Date: 2020-05-06 13:38-0600\n"
|
||||||
|
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
|
||||||
|
"Last-Translator: Anthony <aj@ohess.org>, 2020\n"
|
||||||
|
"Language-Team: Chinese (China) (https://www.transifex.com/readthedocs/teams/101354/zh_CN/)\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: zh_CN\n"
|
||||||
|
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
|
||||||
|
msgid "Edit on GitHub"
|
||||||
|
msgstr "在 GitHub 上修改"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
|
||||||
|
msgid "Edit on Bitbucket"
|
||||||
|
msgstr "在 Bitbucket 上修改"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
|
||||||
|
msgid "Edit on GitLab"
|
||||||
|
msgstr "在 GitLab 上修改"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
|
||||||
|
msgid "View page source"
|
||||||
|
msgstr "查看页面源码"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
|
||||||
|
msgid "Next"
|
||||||
|
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
|
||||||
|
#: sphinx_rtd_theme/footer.html:31
|
||||||
|
msgid "Build"
|
||||||
|
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:52
|
||||||
|
#, 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 documenation
|
||||||
|
#: sphinx_rtd_theme/footer.html:54
|
||||||
|
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:56
|
||||||
|
#, python-format
|
||||||
|
msgid "provided by %(readthedocs_web)s"
|
||||||
|
msgstr "由 %(readthedocs_web)s开发"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:79
|
||||||
|
#, python-format
|
||||||
|
msgid "Search within %(docstitle)s"
|
||||||
|
msgstr "在 %(docstitle)s中搜索"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:87
|
||||||
|
msgid "About these documents"
|
||||||
|
msgstr "关于此文档"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:90
|
||||||
|
msgid "Index"
|
||||||
|
msgstr "索引"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
|
||||||
|
msgid "Search"
|
||||||
|
msgstr "搜索"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/layout.html:128
|
||||||
|
msgid "Logo"
|
||||||
|
msgstr "Logo"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:29
|
||||||
|
msgid "Please activate JavaScript to enable the search functionality."
|
||||||
|
msgstr "请启用 JavaScript 以便使用搜索功能"
|
||||||
|
|
||||||
|
#. Search is a noun, not a verb
|
||||||
|
#: sphinx_rtd_theme/search.html:37
|
||||||
|
msgid "Search Results"
|
||||||
|
msgstr "搜索结果"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/search.html:39
|
||||||
|
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: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 "托管于 Read the Docs"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:26
|
||||||
|
msgid "Project Home"
|
||||||
|
msgstr "项目首页"
|
||||||
|
|
||||||
|
#: sphinx_rtd_theme/versions.html:29
|
||||||
|
msgid "Builds"
|
||||||
|
msgstr "构建"
|
||||||
|
|
||||||
|
#~ msgid "Docs"
|
||||||
|
#~ msgstr "文档"
|
||||||
|
|
||||||
|
#~ msgid "Free document hosting provided by"
|
||||||
|
#~ msgstr "此文档免费托管于"
|
||||||
55
doc/_themes/sphinx_rtd_theme/search.html
vendored
Normal file
55
doc/_themes/sphinx_rtd_theme/search.html
vendored
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
{#
|
||||||
|
basic/search.html
|
||||||
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Template for the search page.
|
||||||
|
|
||||||
|
:copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
|
||||||
|
:license: BSD, see LICENSE for details.
|
||||||
|
#}
|
||||||
|
{%- extends "layout.html" %}
|
||||||
|
{% set title = _('Search') %}
|
||||||
|
{% set display_vcs_links = False %}
|
||||||
|
{%- block scripts %}
|
||||||
|
{{ super() }}
|
||||||
|
<script type="text/javascript" src="{{ pathto('_static/searchtools.js', 1) }}"></script>
|
||||||
|
{%- endblock %}
|
||||||
|
{% block footer %}
|
||||||
|
<script type="text/javascript">
|
||||||
|
jQuery(function() { Search.loadIndex("{{ pathto('searchindex.js', 1) }}"); });
|
||||||
|
</script>
|
||||||
|
{# this is used when loading the search index using $.ajax fails,
|
||||||
|
such as on Chrome for documents on localhost #}
|
||||||
|
<script type="text/javascript" id="searchindexloader"></script>
|
||||||
|
{{ super() }}
|
||||||
|
{% endblock %}
|
||||||
|
{% block body %}
|
||||||
|
<noscript>
|
||||||
|
<div id="fallback" class="admonition warning">
|
||||||
|
<p class="last">
|
||||||
|
{% trans trimmed %}Please activate JavaScript to enable the search
|
||||||
|
functionality.{% endtrans %}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</noscript>
|
||||||
|
|
||||||
|
{% if search_performed %}
|
||||||
|
{# Translators: Search is a noun, not a verb #}
|
||||||
|
<h2>{{ _('Search Results') }}</h2>
|
||||||
|
{% if not search_results %}
|
||||||
|
<p>{{ _('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.') }}</p>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
<div id="search-results">
|
||||||
|
{% if search_results %}
|
||||||
|
<ul>
|
||||||
|
{% for href, caption, context in search_results %}
|
||||||
|
<li>
|
||||||
|
<a href="{{ pathto(item.href) }}">{{ caption }}</a>
|
||||||
|
<p class="context">{{ context|e }}</p>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
9
doc/_themes/sphinx_rtd_theme/searchbox.html
vendored
Normal file
9
doc/_themes/sphinx_rtd_theme/searchbox.html
vendored
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{%- if builder != 'singlehtml' %}
|
||||||
|
<div role="search">
|
||||||
|
<form id="rtd-search-form" class="wy-form" action="{{ pathto('search') }}" method="get">
|
||||||
|
<input type="text" name="q" placeholder="{{ _('Search docs') }}" />
|
||||||
|
<input type="hidden" name="check_keywords" value="yes" />
|
||||||
|
<input type="hidden" name="area" value="default" />
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
{%- endif %}
|
||||||
1
doc/_themes/sphinx_rtd_theme/static/css/badge_only.css
vendored
Normal file
1
doc/_themes/sphinx_rtd_theme/static/css/badge_only.css
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}
|
||||||
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/Roboto-Slab-Bold.woff
vendored
Normal file
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/Roboto-Slab-Bold.woff
vendored
Normal file
Binary file not shown.
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/Roboto-Slab-Bold.woff2
vendored
Normal file
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/Roboto-Slab-Bold.woff2
vendored
Normal file
Binary file not shown.
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/Roboto-Slab-Regular.woff
vendored
Normal file
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/Roboto-Slab-Regular.woff
vendored
Normal file
Binary file not shown.
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/Roboto-Slab-Regular.woff2
vendored
Normal file
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/Roboto-Slab-Regular.woff2
vendored
Normal file
Binary file not shown.
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.eot
vendored
Normal file
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.eot
vendored
Normal file
Binary file not shown.
2671
doc/_themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.svg
vendored
Normal file
2671
doc/_themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.svg
vendored
Normal file
File diff suppressed because it is too large
Load Diff
|
After Width: | Height: | Size: 434 KiB |
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.ttf
vendored
Normal file
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.ttf
vendored
Normal file
Binary file not shown.
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.woff
vendored
Normal file
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.woff
vendored
Normal file
Binary file not shown.
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.woff2
vendored
Normal file
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.woff2
vendored
Normal file
Binary file not shown.
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/lato-bold-italic.woff
vendored
Normal file
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/lato-bold-italic.woff
vendored
Normal file
Binary file not shown.
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/lato-bold-italic.woff2
vendored
Normal file
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/lato-bold-italic.woff2
vendored
Normal file
Binary file not shown.
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/lato-bold.woff
vendored
Normal file
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/lato-bold.woff
vendored
Normal file
Binary file not shown.
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/lato-bold.woff2
vendored
Normal file
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/lato-bold.woff2
vendored
Normal file
Binary file not shown.
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/lato-normal-italic.woff
vendored
Normal file
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/lato-normal-italic.woff
vendored
Normal file
Binary file not shown.
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/lato-normal-italic.woff2
vendored
Normal file
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/lato-normal-italic.woff2
vendored
Normal file
Binary file not shown.
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/lato-normal.woff
vendored
Normal file
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/lato-normal.woff
vendored
Normal file
Binary file not shown.
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/lato-normal.woff2
vendored
Normal file
BIN
doc/_themes/sphinx_rtd_theme/static/css/fonts/lato-normal.woff2
vendored
Normal file
Binary file not shown.
4
doc/_themes/sphinx_rtd_theme/static/css/theme.css
vendored
Normal file
4
doc/_themes/sphinx_rtd_theme/static/css/theme.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1
doc/_themes/sphinx_rtd_theme/static/js/badge_only.js
vendored
Normal file
1
doc/_themes/sphinx_rtd_theme/static/js/badge_only.js
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
!function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=4)}({4:function(e,t,r){}});
|
||||||
1
doc/_themes/sphinx_rtd_theme/static/js/theme.js
vendored
Normal file
1
doc/_themes/sphinx_rtd_theme/static/js/theme.js
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("<div class='wy-table-responsive'></div>"),n("table.docutils.footnote").wrap("<div class='wy-table-responsive footnote'></div>"),n("table.docutils.citation").wrap("<div class='wy-table-responsive citation'></div>"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n('<span class="toctree-expand"></span>'),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}t.length>0&&($(".wy-menu-vertical .current").removeClass("current"),t.addClass("current"),t.closest("li.toctree-l1").addClass("current"),t.closest("li.toctree-l1").parent().addClass("current"),t.closest("li.toctree-l1").addClass("current"),t.closest("li.toctree-l2").addClass("current"),t.closest("li.toctree-l3").addClass("current"),t.closest("li.toctree-l4").addClass("current"),t.closest("li.toctree-l5").addClass("current"),t[0].scrollIntoView())}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current"),e.siblings().find("li.current").removeClass("current"),e.find("> ul li.current").removeClass("current"),e.toggleClass("current")}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t<e.length&&!window.requestAnimationFrame;++t)window.requestAnimationFrame=window[e[t]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[e[t]+"CancelAnimationFrame"]||window[e[t]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(e,t){var i=(new Date).getTime(),o=Math.max(0,16-(i-n)),r=window.setTimeout((function(){e(i+o)}),o);return n=i+o,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(n){clearTimeout(n)})}()}).call(window)},function(n,e){n.exports=jQuery},function(n,e,t){}]);
|
||||||
18
doc/_themes/sphinx_rtd_theme/theme.conf
vendored
Normal file
18
doc/_themes/sphinx_rtd_theme/theme.conf
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
[theme]
|
||||||
|
inherit = basic
|
||||||
|
stylesheet = css/theme.css
|
||||||
|
pygments_style = default
|
||||||
|
|
||||||
|
[options]
|
||||||
|
canonical_url =
|
||||||
|
analytics_id =
|
||||||
|
collapse_navigation = True
|
||||||
|
sticky_navigation = True
|
||||||
|
navigation_depth = 4
|
||||||
|
includehidden = True
|
||||||
|
titles_only =
|
||||||
|
logo_only =
|
||||||
|
display_version = True
|
||||||
|
prev_next_buttons_location = bottom
|
||||||
|
style_external_links = False
|
||||||
|
style_nav_header_background =
|
||||||
34
doc/_themes/sphinx_rtd_theme/versions.html
vendored
Normal file
34
doc/_themes/sphinx_rtd_theme/versions.html
vendored
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
{% if READTHEDOCS %}
|
||||||
|
{# Add rst-badge after rst-versions for small badge style. #}
|
||||||
|
<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="fa fa-book"> Read the Docs</span>
|
||||||
|
v: {{ current_version }}
|
||||||
|
<span class="fa fa-caret-down"></span>
|
||||||
|
</span>
|
||||||
|
<div class="rst-other-versions">
|
||||||
|
<dl>
|
||||||
|
<dt>{{ _('Versions') }}</dt>
|
||||||
|
{% for slug, url in versions %}
|
||||||
|
<dd><a href="{{ url }}">{{ slug }}</a></dd>
|
||||||
|
{% endfor %}
|
||||||
|
</dl>
|
||||||
|
<dl>
|
||||||
|
<dt>{{ _('Downloads') }}</dt>
|
||||||
|
{% for type, url in downloads %}
|
||||||
|
<dd><a href="{{ url }}">{{ type }}</a></dd>
|
||||||
|
{% endfor %}
|
||||||
|
</dl>
|
||||||
|
<dl>
|
||||||
|
{# Translators: The phrase "Read the Docs" is not translated #}
|
||||||
|
<dt>{{ _('On Read the Docs') }}</dt>
|
||||||
|
<dd>
|
||||||
|
<a href="//{{ PRODUCTION_DOMAIN }}/projects/{{ slug }}/?fromdocs={{ slug }}">{{ _('Project Home') }}</a>
|
||||||
|
</dd>
|
||||||
|
<dd>
|
||||||
|
<a href="//{{ PRODUCTION_DOMAIN }}/builds/{{ slug }}/?fromdocs={{ slug }}">{{ _('Builds') }}</a>
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
5
doc/asio_http2.h.rst.in
Normal file
5
doc/asio_http2.h.rst.in
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
asio_http2.h
|
||||||
|
============
|
||||||
|
|
||||||
|
.. literalinclude:: @top_srcdir@/src/includes/nghttp2/asio_http2.h
|
||||||
|
:language: cpp
|
||||||
5
doc/asio_http2_client.h.rst.in
Normal file
5
doc/asio_http2_client.h.rst.in
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
asio_http2_client.h
|
||||||
|
===================
|
||||||
|
|
||||||
|
.. literalinclude:: @top_srcdir@/src/includes/nghttp2/asio_http2_client.h
|
||||||
|
:language: cpp
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user