Compare commits

..

691 Commits

Author SHA1 Message Date
George Sokianos c2a039f23f Makefile to build for AmigaOS 4 2023-01-05 23:07:36 +00:00
Tatsuhiro Tsujikawa 05b7929019
Merge pull request #1849 from nghttp2/remove-unused-function
Remove unused function
2022-12-26 21:31:57 +09:00
Tatsuhiro Tsujikawa 5b665b3e48
Merge pull request #1848 from nghttp2/remove-src-includes
Remove src/includes
2022-12-26 21:20:51 +09:00
Tatsuhiro Tsujikawa 5089dcd3f2
Merge pull request #1847 from nghttp2/bump-zlib
Bump zlib to 1.2.13
2022-12-26 20:52:27 +09:00
Tatsuhiro Tsujikawa b52f96d38a Remove unused function 2022-12-26 19:49:28 +09:00
Tatsuhiro Tsujikawa 2ca0bb0a2f Remove src/includes 2022-12-26 19:45:33 +09:00
Tatsuhiro Tsujikawa fa3d1bfc8f Bump zlib to 1.2.13 2022-12-26 19:40:26 +09:00
Tatsuhiro Tsujikawa 30bb4eb8f2
Merge pull request #1846 from nghttp2/remove-python
Remove deprecated python bindings
2022-12-26 19:38:53 +09:00
Tatsuhiro Tsujikawa b4cb3b0090 Remove deprecated python bindings 2022-12-26 17:06:36 +09:00
Tatsuhiro Tsujikawa 2c62572ae1
Merge pull request #1844 from nghttp2/remove-libnghttp2_asio
Remove deprecated libnghttp2_asio
2022-12-26 17:05:44 +09:00
Tatsuhiro Tsujikawa 42904a586c
Merge pull request #1845 from nghttp2/minor-cleanup
Minor cleanup
2022-12-25 18:00:51 +09:00
Tatsuhiro Tsujikawa 8538e1ec42 Minor cleanup 2022-12-25 17:28:08 +09:00
Tatsuhiro Tsujikawa e6d608b522 Remove deprecated libnghttp2_asio 2022-12-24 18:41:49 +09:00
Tatsuhiro Tsujikawa 00a33281be
Merge pull request #1843 from nghttp2/bump-ngtcp2
Bump ngtcp2 dependencies
2022-12-24 17:35:35 +09:00
Tatsuhiro Tsujikawa 7c7ba0586e Bump ngtcp2 dependencies 2022-12-24 16:35:11 +09:00
Tatsuhiro Tsujikawa 252c425ea6
Merge pull request #1837 from fredizzimo/fix-libevent-component
Don't use the unofficial libevent component
2022-12-23 21:35:54 +09:00
Fred Sundvik 525630ae7a Don't use the unofficial libevent component 2022-12-07 16:36:58 +02:00
Tatsuhiro Tsujikawa 5195e8be6a
Merge pull request #1835 from nghttp2/integration-lint
integration: Fix lint errors
2022-11-24 19:05:51 +09:00
Tatsuhiro Tsujikawa 358c15e015 integration: Fix lint errors 2022-11-20 19:14:27 +09:00
Tatsuhiro Tsujikawa b5b18699cb
Merge pull request #1834 from nghttp2/integration-http-status-code
integration: Use HTTP status code constants
2022-11-20 19:12:43 +09:00
Tatsuhiro Tsujikawa 44e4475a31 integration: Use HTTP status code constants 2022-11-20 17:46:46 +09:00
Tatsuhiro Tsujikawa a945c057c5
Merge pull request #1833 from nghttp2/integration-h3
Integration h3
2022-11-20 17:46:17 +09:00
Tatsuhiro Tsujikawa babeddb649 nghttpx: HTTPS redirect should not happen with HTTP/3 upstream 2022-11-20 17:03:30 +09:00
Tatsuhiro Tsujikawa 2d790edac5 integration: Add http3 test which verifies chunked encoding ends prematurely 2022-11-20 16:55:58 +09:00
Tatsuhiro Tsujikawa 2bef60a6f4 integration: Add http3 test which verifies response ends before request 2022-11-20 16:53:34 +09:00
Tatsuhiro Tsujikawa 17e3bb4ec5 integration: Add http3 mruby tests 2022-11-20 16:35:54 +09:00
Tatsuhiro Tsujikawa 5e1b1a0883 integration: Add http3 affinity cookie test 2022-11-20 16:31:24 +09:00
Tatsuhiro Tsujikawa 5b0cbb4892 integration: Add http3 HTTPS redirect test 2022-11-20 16:28:16 +09:00
Tatsuhiro Tsujikawa 17a5ba4969 integration: Add http3 response content-length test 2022-11-20 15:12:19 +09:00
Tatsuhiro Tsujikawa 20d95edc57 integration: Add http3 via tests 2022-11-20 15:04:01 +09:00
Tatsuhiro Tsujikawa 126b5f9d2b Add the missing file 2022-11-20 15:03:41 +09:00
Tatsuhiro Tsujikawa 46602a961d Bump package version 2022-11-13 15:59:20 +09:00
Tatsuhiro Tsujikawa 00399695cb Update manual pages 2022-11-13 14:51:12 +09:00
Tatsuhiro Tsujikawa f8e014de40 Bump package and library versions 2022-11-13 14:40:42 +09:00
Tatsuhiro Tsujikawa 172159305c Update AUTHORS 2022-11-13 14:39:10 +09:00
Tatsuhiro Tsujikawa aa607875b0
Merge pull request #1832 from nghttp2/h3-integration-test
Add http3 integration test
2022-11-13 10:58:10 +09:00
Tatsuhiro Tsujikawa 954d49f7a0 Add http3 integration test 2022-11-12 19:39:25 +09:00
Tatsuhiro Tsujikawa 5929aeb47c
Merge pull request #1831 from nghttp2/bump-ngtcp2
Bump ngtcp2
2022-11-12 18:05:29 +09:00
Tatsuhiro Tsujikawa b990df49d6 Bump boringssl 2022-11-12 16:46:36 +09:00
Tatsuhiro Tsujikawa 2aa9d61ae2 Bump ngtcp2 to v0.11.0 2022-11-12 16:46:24 +09:00
Tatsuhiro Tsujikawa 0fb2c6f4f4
Merge pull request #1830 from nghttp2/bump-libbpf
Bump libbpf to v1.0.1
2022-11-12 16:43:19 +09:00
Tatsuhiro Tsujikawa 1c9817af0d Bump libbpf to v1.0.1 2022-11-12 16:13:03 +09:00
Tatsuhiro Tsujikawa bea6cae0d5
Merge pull request #1829 from nghttp2/disable-python-bindings
Disable python bindings
2022-11-11 19:29:56 +09:00
Tatsuhiro Tsujikawa 804ce364bf Disable python bindings properly by default
Disable python bindings properly by default.  This commit amends
b63705384a.
2022-11-11 18:55:01 +09:00
Tatsuhiro Tsujikawa 83d7fb7fdd Revert "workflow: Disable python bindings"
This reverts commit ddd40bae06.
2022-11-11 18:52:44 +09:00
Tatsuhiro Tsujikawa 266a3d84e4
Merge pull request #1828 from nghttp2/bump-openssl
Bump OpenSSL versions
2022-11-09 18:57:52 +09:00
Tatsuhiro Tsujikawa e91de24be6
Merge pull request #1827 from nghttp2/bump-llhttp
Bump llhttp
2022-11-09 18:48:52 +09:00
Tatsuhiro Tsujikawa b062e9f66c Bump OpenSSL versions 2022-11-09 18:05:55 +09:00
Tatsuhiro Tsujikawa f56448be60 Deal with llhttp incompatible changes 2022-11-09 18:05:14 +09:00
Tatsuhiro Tsujikawa 17aa7b6a61 Bump llhttp to 85dd446419966cafb5a7fdd5031e3113a0768e65 2022-11-09 18:04:54 +09:00
Tatsuhiro Tsujikawa 971d3552c7
Merge pull request #1826 from nghttp2/workflow-disable-python-bindings
workflow: Disable python bindings
2022-11-09 17:37:37 +09:00
Tatsuhiro Tsujikawa ddd40bae06 workflow: Disable python bindings
Disable python bindings because it has been deprecated, and mac OS
build with python binding is broken.
2022-11-09 16:54:19 +09:00
Tatsuhiro Tsujikawa cb11cfcd2c
Merge pull request #1822 from vszakats/warnfix
add casts to silence implicit conversion warnings
2022-10-20 20:50:51 +09:00
Viktor Szakats 5eed83ee17
add casts to silence implicit conversion warnings
Fixes #1821
2022-10-19 11:57:31 +00:00
Tatsuhiro Tsujikawa 11632d3c2c
Merge pull request #1819 from nghttp2/bump-ngtcp2
Bump ngtcp2
2022-10-18 22:35:47 +09:00
Tatsuhiro Tsujikawa 8c70d9c2e1 Bump ngtcp2 2022-10-18 21:11:14 +09:00
Tatsuhiro Tsujikawa 3b21fbaf03
Merge pull request #1818 from nghttp2/fix-nghttpx-affinity-cookie-stickiness
nghttpx: Fix affinity-cookie-stickiness parameter handling
2022-10-18 17:45:25 +09:00
Tatsuhiro Tsujikawa 5abafb4268 nghttpx: Fix affinity-cookie-stickiness parameter handling
Fix affinity-cookie-stickiness backend parameter handling.
Previously, if 3 backend options are used for the same pattern, and
the first one does not have affinity-cookie-stickiness, and the rest
of them have affinity-cookie-stickiness=strict, nghttpx wrongly
determines that they have inconsistent configurations.
2022-10-18 17:17:44 +09:00
Tatsuhiro Tsujikawa 2f71f5c3c9
Merge pull request #1816 from nghttp2/update-doc
Update doc
2022-10-16 16:49:06 +09:00
Tatsuhiro Tsujikawa 3f65ab7871 Update doc
Remove outdated text
2022-10-16 16:09:43 +09:00
Tatsuhiro Tsujikawa 8e120de5bd
Merge pull request #1814 from nghttp2/workflow-bump-compilers
Workflow bump compilers
2022-10-04 21:47:39 +09:00
Tatsuhiro Tsujikawa 8a355db8d9 Fix compile error with gcc-12 2022-10-04 17:58:15 +09:00
Tatsuhiro Tsujikawa 93f1096de3
Merge pull request #1813 from nghttp2/test-fix-tz
Fix test failure on Linux if tz database is not available
2022-10-04 17:48:32 +09:00
Tatsuhiro Tsujikawa f190afd0c0
Merge pull request #1812 from nghttp2/update-ubuntu-packages
Update Ubuntu packages based on Ubuntu 22.04
2022-10-04 17:19:54 +09:00
Tatsuhiro Tsujikawa ebef6b5ced workflow: Bump compilers 2022-10-04 17:12:15 +09:00
Tatsuhiro Tsujikawa 6c45e943b0
Merge pull request #1811 from nghttp2/disable-python
Disable python bindings by default because it has been deprecated
2022-10-04 17:08:40 +09:00
Tatsuhiro Tsujikawa 61caf66f1b Fix test failure on Linux if tz database is not available 2022-10-04 16:47:51 +09:00
Tatsuhiro Tsujikawa c56cda058e Update Ubuntu packages based on Ubuntu 22.04 2022-10-04 16:07:53 +09:00
Tatsuhiro Tsujikawa b63705384a Disable python bindings by default because it has been deprecated 2022-10-04 16:04:43 +09:00
Tatsuhiro Tsujikawa 7380ff3551
Merge pull request #1809 from nghttp2/update-doc-h2-rfc
Update README to mention new HTTP/2 RFC
2022-10-02 12:53:13 +09:00
Tatsuhiro Tsujikawa bfba6764e0 Update README to mention new HTTP/2 RFC 2022-10-02 12:18:41 +09:00
Tatsuhiro Tsujikawa 634e65df64
Merge pull request #1807 from nghttp2/nghttpx-add-missing-exit
nghttpx: Add missing DIE()
2022-09-27 23:13:25 +09:00
Tatsuhiro Tsujikawa 011fbf7f10 nghttpx: Add missing DIE() 2022-09-27 22:23:13 +09:00
Tatsuhiro Tsujikawa 0363606924
Merge pull request #1806 from nghttp2/update-android-build-doc
Update android build documentation
2022-09-26 17:50:42 +09:00
Tatsuhiro Tsujikawa 40c7922386 Update android build documentation 2022-09-26 17:12:03 +09:00
Tatsuhiro Tsujikawa 958d9ac63b
Merge pull request #1805 from nghttp2/dockerfile-android-improvements
Dockerfile android improvements
2022-09-26 17:05:59 +09:00
Tatsuhiro Tsujikawa c06f1e9974 Remove --with-xml-prefix 2022-09-26 16:24:53 +09:00
Tatsuhiro Tsujikawa d3381233b1 Do not create OpenSSL shared library 2022-09-26 16:24:53 +09:00
Tatsuhiro Tsujikawa 6d88da58f1 PATH is required by OpenSSL only 2022-09-26 16:24:53 +09:00
Tatsuhiro Tsujikawa 77449a9477
Merge pull request #1804 from nghttp2/update-dockerfile-android
Bump NDK and others to the latest
2022-09-26 00:06:18 +09:00
Tatsuhiro Tsujikawa 116feb4a8c Bump NDK and others to the latest
The latest nghttp2 release version cannot be built with the latest
NDK.  The nghttp2 version in Dockerfile points to master for now.
2022-09-25 23:23:48 +09:00
Tatsuhiro Tsujikawa dd63d1df42
Merge pull request #1802 from PufferBlue/patch-1
Update dependency versions for Dockerfile.android
2022-09-25 21:29:09 +09:00
PufferOverflow c47fa08b40
Update dependency versions for Dockerfile.android 2022-09-23 10:33:56 +08:00
Tatsuhiro Tsujikawa 4bfd802937 Bump package version 2022-09-21 17:21:01 +09:00
Tatsuhiro Tsujikawa 87fef4ab71 Update manual pages 2022-09-21 16:55:07 +09:00
Tatsuhiro Tsujikawa 844af88dc1 Bump package and library versions 2022-09-21 16:47:56 +09:00
Tatsuhiro Tsujikawa 2f6ebfdf8c Update AUTHORS 2022-09-21 16:45:44 +09:00
Tatsuhiro Tsujikawa 25858d8ada
Merge pull request #1800 from nghttp2/bump-ngtcp2
Bump ngtcp2
2022-09-20 18:28:51 +09:00
Tatsuhiro Tsujikawa 11d1f95412 Bump ngtcp2 2022-09-20 17:46:11 +09:00
Tatsuhiro Tsujikawa 931adb146b
Merge pull request #1799 from nghttp2/dyn-dns-family
nghttpx: Respect backend-address-family on dynamic DNS lookup
2022-09-15 19:45:09 +09:00
Tatsuhiro Tsujikawa 6a513dc9fd nghttpx: Respect backend-address-family on dynamic DNS lookup 2022-09-15 19:11:13 +09:00
Tatsuhiro Tsujikawa f13cff01bb
Merge pull request #1798 from nghttp2/bump-libbpf
Bump libbpf to v1.0.0
2022-09-15 19:10:22 +09:00
Tatsuhiro Tsujikawa 2608333ce5 Bump libbpf to v1.0.0 2022-09-15 18:29:07 +09:00
Tatsuhiro Tsujikawa 9f5bf5c7dd
Merge pull request #1792 from nghttp2/option-no-rfc9113-ltws-validation
Option no rfc9113 ltws validation
2022-09-07 17:08:04 +09:00
Tatsuhiro Tsujikawa eb06e33e38 Add nghttp2_option_set_no_rfc9113_leading_and_trailing_ws_validation 2022-09-07 16:34:12 +09:00
Tatsuhiro Tsujikawa a94d2de89a Check leading white spaces in :protocol 2022-09-07 16:32:20 +09:00
Tatsuhiro Tsujikawa 921b4d027a
Merge pull request #1791 from nghttp2/bump-ngtcp2
Bump ngtcp2
2022-09-06 20:55:12 +09:00
Tatsuhiro Tsujikawa 026ff48edb Bump ngtcp2 2022-09-01 22:06:41 +09:00
Tatsuhiro Tsujikawa 1340b296dd
Merge pull request #1787 from heitbaum/patch-1
Fix typographic error
2022-08-29 21:22:56 +09:00
Rudi Heitbaum fc5a020bc6
Fix typographic error 2022-08-29 22:05:58 +10:00
Tatsuhiro Tsujikawa f919cf1a8e Bump package version 2022-08-22 21:10:20 +09:00
Tatsuhiro Tsujikawa 08676d23f9 Update manual pages 2022-08-22 20:49:37 +09:00
Tatsuhiro Tsujikawa 28fa90811c Bump package and library versions 2022-08-22 20:42:14 +09:00
Tatsuhiro Tsujikawa 56f39b30ce Update AUTHORS 2022-08-22 19:40:15 +09:00
Tatsuhiro Tsujikawa df000cd01b
Merge pull request #1784 from nghttp2/fix-covscan-errors
Fix errors reported by coverity scan
2022-08-22 19:37:29 +09:00
Tatsuhiro Tsujikawa 47b990f508 Fix errors reported by coverity scan 2022-08-22 19:06:35 +09:00
Tatsuhiro Tsujikawa 68ea085535
Merge pull request #1783 from nghttp2/bump-libbpf
Bump libbpf
2022-08-22 18:58:37 +09:00
Tatsuhiro Tsujikawa eb397721be Bump libbpf 2022-08-22 18:27:38 +09:00
Tatsuhiro Tsujikawa c3fa77158a
Merge pull request #1782 from nghttp2/embed-km-id-in-token
nghttpx: Embed km_id in a regular token
2022-08-22 17:46:52 +09:00
Tatsuhiro Tsujikawa 7c0649d466 nghttpx: Embed km_id in a regular token 2022-08-21 23:34:32 +09:00
Tatsuhiro Tsujikawa f02f9ff50c
Merge pull request #1781 from nghttp2/token-dcidlen
nghttpx: Regular token does not require server issued DCID
2022-08-21 23:01:27 +09:00
Tatsuhiro Tsujikawa 31be334660 nghttpx: Regular token does not require server issued DCID 2022-08-21 22:40:10 +09:00
Tatsuhiro Tsujikawa 9d265e8bb8
Merge pull request #1780 from nghttp2/bump-ngtcp2
Bump ngtcp2 and nghttp3
2022-08-21 20:53:04 +09:00
Tatsuhiro Tsujikawa 1aa97d5d2c Bump ngtcp2 and nghttp3 2022-08-21 18:25:08 +09:00
Tatsuhiro Tsujikawa 42394e3342
Merge pull request #1779 from nghttp2/bump-boringssl
Bump boringssl
2022-08-20 11:36:27 +09:00
Tatsuhiro Tsujikawa 1bc1374d0c Bump boringssl 2022-08-20 11:16:44 +09:00
Tatsuhiro Tsujikawa f2c793c75b clang-format 2022-08-10 16:57:01 +09:00
Tatsuhiro Tsujikawa 1bb4877976
Merge pull request #1770 from DavidKorczynski/dav-fuzz-1
fuzz: add frames fuzzer
2022-08-10 16:56:10 +09:00
David Korczynski 651f3bfce2
cleanup 2022-08-09 15:34:04 +01:00
Tatsuhiro Tsujikawa 8a026e18f5 clang-format fuzz 2022-08-09 21:01:42 +09:00
Tatsuhiro Tsujikawa 5164745ff9
Merge pull request #1771 from DavidKorczynski/dav-fuzz-2
fuzz: add extended fuzzer using FuzzedDataProvider
2022-08-09 20:59:50 +09:00
Tatsuhiro Tsujikawa 179ecf7ccd
Merge pull request #1775 from nghttp2/src-eliminate-strtoul
Replace the use of strtoul and strtol with parse_uint
2022-08-09 20:58:52 +09:00
Tatsuhiro Tsujikawa a4d12f2a71 Replace the use of strtoul and strtol with parse_uint
Replace the use of strtoul and strtol with parse_uint to fix the
handling of negative integer.
2022-08-09 19:56:01 +09:00
David Korczynski 0ade040a68
fuzz: add extended fuzzer using FuzzedDataProvider
Similar in nature to fuzz_target.cc but adds the difference of a random
iv constructed by way of fuzzer data.
2022-08-04 20:22:28 +01:00
David Korczynski 59be24be32
fuzz: add frames fuzzer 2022-08-04 15:24:27 +01:00
Tatsuhiro Tsujikawa 092014d5af
Merge pull request #1769 from nghttp2/randomize-backend-addresses
nghttpx: Randomize backend address backend robin order per thread (2nd Ed.)
2022-08-04 19:03:53 +09:00
Tatsuhiro Tsujikawa 39d9efe4bd nghttpx: Randomize backend address backend robin order per thread (2nd Ed.)
This is the 2nd attempt to randomize backend address round robin
order.

The initial attempt of doing this was
fdcdb21c38, which has been reverted via
470f06e5f6 because it broke the session
affinity.

This time, we shuffles seq fields and avoid reordering addrs vector.
2022-08-04 18:38:23 +09:00
Tatsuhiro Tsujikawa a3be763650
Merge pull request #1766 from nghttp2/h2load-h3-reset-stream-cb
h2load: Implement nghttp3 reset_stream callback
2022-07-26 17:39:58 +09:00
Tatsuhiro Tsujikawa b4cf6358d4 h2load: Implement nghttp3 reset_stream callback 2022-07-26 17:05:13 +09:00
Tatsuhiro Tsujikawa a80df35b39 Merge branch 'lemourin-coro-http' 2022-07-26 17:02:03 +09:00
Paweł Wegner ff48a84a86 cmake: add ENABLE_DOC option.
doc subdirectory breaks Xcode generator
2022-07-26 16:42:26 +09:00
Tatsuhiro Tsujikawa 75a0d090df
Merge pull request #1764 from nghttp2/h3-ignore-errors
Ignore nghttp3 errors which can be ignored
2022-07-26 00:40:11 +09:00
Tatsuhiro Tsujikawa 6418a86504 Ignore nghttp3 errors which can be ignored 2022-07-25 23:09:33 +09:00
Tatsuhiro Tsujikawa 2916208eb3
Merge pull request #1763 from nghttp2/bump-neverbleed
Bump neverbleed
2022-07-25 23:04:43 +09:00
Tatsuhiro Tsujikawa 22c88548b9 Bump neverbleed 2022-07-25 21:20:02 +09:00
Tatsuhiro Tsujikawa c642a9f856
Merge pull request #1762 from nghttp2/bump-llhttp
Bump llhttp
2022-07-25 21:04:13 +09:00
Tatsuhiro Tsujikawa 05f8d4e8c9 Fix integration test failure 2022-07-25 20:08:58 +09:00
Tatsuhiro Tsujikawa 9d389e8744 Bump llhttp to f84c4de65875a43b683d4c0c26337b2fa5a38efa 2022-07-25 19:41:13 +09:00
Tatsuhiro Tsujikawa d51647f37e
Merge pull request #1761 from nghttp2/relocate-nghttp2-asio
libnghttp2_asio has moved to its own repository
2022-07-25 18:08:37 +09:00
Tatsuhiro Tsujikawa c011105124 libnghttp2_asio has moved to its own repository 2022-07-25 17:33:50 +09:00
Tatsuhiro Tsujikawa bc909d6157
Merge pull request #1759 from nghttp2/bump-quic-libs
Bump QUIC related libraries
2022-07-22 00:05:52 +09:00
Tatsuhiro Tsujikawa 5cf678cf5e Bump QUIC related libraries 2022-07-21 23:22:42 +09:00
Tatsuhiro Tsujikawa f11be7df09
Merge pull request #1755 from vszakats/fix-win-openssl-quic-detection
cmake: fix detecting quic openssl with win32
2022-07-21 21:18:05 +09:00
Viktor Szakats 7113970ff0
cmake: fix detecting quic openssl with win32
By adding two necessary system libraries to make the QUIC test snippet
link correctly.

Before:
```
-- Looking for SSL_is_quic
-- Looking for SSL_is_quic - not found
CMake Warning at CMakeLists.txt:206 (message):
  OpenSSL in
  /[...]/openssl-quic/x64-ucrt/usr/lib/libssl.a;/[...]/openssl-quic/x64-ucrt/usr/lib/libcrypto.a
  dose not have SSL_is_quic.  HTTP/3 support cannot be enabled
```

After:
```
-- Looking for SSL_is_quic
-- Looking for SSL_is_quic - found
```

Same fix as previously merged to ngtcp2:
https://github.com/ngtcp2/ngtcp2/pull/481
2022-07-14 05:35:11 +00:00
Tatsuhiro Tsujikawa 33974fbcd7
Merge pull request #1754 from nghttp2/bump-sphinx-rtd-theme
Bump sphinx_rtd_theme
2022-07-12 22:47:51 +09:00
Tatsuhiro Tsujikawa 6eb90570f0 Bump sphinx_rtd_theme 2022-07-12 22:23:12 +09:00
Tatsuhiro Tsujikawa 014f1c510d
Merge pull request #1752 from nghttp2/cross-build-fix
Cross build fix
2022-07-08 00:04:18 +09:00
Tatsuhiro Tsujikawa db770a815a Remove missing header patch 2022-07-07 21:59:14 +09:00
Tatsuhiro Tsujikawa aedb01a1a4 Run tests for x86_64-w64-mingw32 host only
GitHub Actions suddenly refused to install wine32 because of broken
dependencies.  In order to workaround this issue, do not run tests on
i686-w64-mingw32 host.
2022-07-07 21:54:31 +09:00
Tatsuhiro Tsujikawa 3d35558f0e
Merge pull request #1751 from nghttp2/bump-quictls
Bump quictls
2022-07-06 22:58:26 +09:00
Tatsuhiro Tsujikawa 02a3a15b82 Bump quictls 2022-07-06 22:21:26 +09:00
Tatsuhiro Tsujikawa ffe1519366
Merge pull request #1750 from nghttp2/pythonbindings-deprecation
Deprecate Python bindings
2022-07-05 20:10:24 +09:00
Tatsuhiro Tsujikawa 97a5ca584b Deprecate Python bindings 2022-07-05 19:45:14 +09:00
Tatsuhiro Tsujikawa 78cb0008d3
Merge pull request #1749 from nghttp2/libasio-deprecation
Deprecate libnghttp2_asio
2022-07-05 19:41:47 +09:00
Tatsuhiro Tsujikawa d38cf2d11c
Merge pull request #1748 from nghttp2/cross-build
Cross build
2022-07-05 19:10:28 +09:00
Tatsuhiro Tsujikawa b7b09acb81 Deprecate libnghttp2_asio 2022-07-05 18:57:22 +09:00
Tatsuhiro Tsujikawa 83ea8e5ba5 Add build-cross 2022-07-05 18:14:22 +09:00
Tatsuhiro Tsujikawa 9a16e73813 Compile with mingw64 2022-07-05 18:10:57 +09:00
Tatsuhiro Tsujikawa 2da1713200 Define BUILDING_NGHTTP2 for tests to make linker work 2022-07-05 18:10:35 +09:00
Tatsuhiro Tsujikawa 118648ff17
Merge pull request #1747 from nghttp2/nghttpx-fix-proxy-proto
nghttpx: Fix broken PROXY-protocol
2022-07-04 22:16:57 +09:00
Tatsuhiro Tsujikawa d9acf873ed nghttpx: Fix broken PROXY-protocol
Fix PROXY-protocol that is enabled for TLS connection.
2022-07-04 21:21:02 +09:00
Tatsuhiro Tsujikawa e065cbccb6
Merge pull request #1745 from nghttp2/no-lws-check
No need to check pseudo header lws
2022-06-25 11:52:15 +09:00
Tatsuhiro Tsujikawa cad6f6c3f0
Merge pull request #1744 from nghttp2/nghttpx-remove-h1-field-trailing-white-spaces
nghttpx: Remove trailing white spaces from HTTP/1.1 fields
2022-06-25 11:37:27 +09:00
Tatsuhiro Tsujikawa fc6d064371 No need to check pseudo header lws
No need to check pseudo header lws because it is guaranteed not to
have leading white spaces.
2022-06-25 11:24:10 +09:00
Tatsuhiro Tsujikawa 501b1d4dcf nghttpx: Remove trailing white spaces from HTTP/1.1 fields 2022-06-25 11:09:35 +09:00
Tatsuhiro Tsujikawa 54848210a9
Merge pull request #1743 from nghttp2/rfc9113-field-value-validation
Add nghttp2_check_header_value_rfc9113
2022-06-24 20:52:17 +09:00
Tatsuhiro Tsujikawa 7f4c2f9ec3 Add nghttp2_check_header_value_rfc9113
Add nghttp2_check_header_value_rfc9113 which verifies the additional
rule imposed by RFC 9113, section 8.2.1, that is a field value must
not start or end with 0x20(SPC) or 0x09(HTAB).

libnghttp2 uses this new function internally.
2022-06-24 19:44:13 +09:00
Tatsuhiro Tsujikawa af30e57c5e Bump package version 2022-06-24 18:27:00 +09:00
Tatsuhiro Tsujikawa b5c4ba8322
Merge pull request #1742 from nghttp2/ignore-priority-in-pp
Do not parse priority header field value included in PUSH_PROMISE
2022-06-23 23:09:21 +09:00
Tatsuhiro Tsujikawa d115f580e2 Do not parse priority header field value included in PUSH_PROMISE 2022-06-23 22:44:01 +09:00
Tatsuhiro Tsujikawa 511fea418a Update bash_completion 2022-06-23 21:13:25 +09:00
Tatsuhiro Tsujikawa 711fb1d3c3 Update manual pages 2022-06-23 21:13:03 +09:00
Tatsuhiro Tsujikawa 31b39ebc4c Bump package and library versions 2022-06-23 20:57:52 +09:00
Tatsuhiro Tsujikawa f214519321
Merge pull request #1741 from nghttp2/gha-boringssl-build
workflow: Add BoringSSL build
2022-06-23 20:06:47 +09:00
Tatsuhiro Tsujikawa 5dfd6d22fa workflow: Add BoringSSL build 2022-06-23 19:30:30 +09:00
Tatsuhiro Tsujikawa 146ca52f26 Update BoringSSL revision which is old but matches what ngtcp2 says 2022-06-23 18:18:26 +09:00
Tatsuhiro Tsujikawa 65e7c24df7
Merge pull request #1740 from nghttp2/bump-quictls
Bump quictls
2022-06-23 00:52:28 +09:00
Tatsuhiro Tsujikawa 5ecd1372c3 Bump quictls 2022-06-23 00:28:32 +09:00
Tatsuhiro Tsujikawa 6596cce8fb Make concat_string_ref_count constexpr 2022-06-23 00:00:16 +09:00
Tatsuhiro Tsujikawa ad7fc183d1 errno should be used to evaluate error code 2022-06-23 00:00:16 +09:00
Tatsuhiro Tsujikawa 22f8cc687f Update doc 2022-06-23 00:00:16 +09:00
Tatsuhiro Tsujikawa 294fb07750
Merge pull request #1739 from nghttp2/h2load-no-udp-segment
h2load: Send more packets without GSO per event loop
2022-06-22 22:50:02 +09:00
Tatsuhiro Tsujikawa 71f8971dde h2load: Send more packets without GSO per event loop 2022-06-22 21:05:11 +09:00
Tatsuhiro Tsujikawa 7077096162
Merge pull request #1738 from nghttp2/bump-llhttp
Bump llhttp to 75b45129db961e1fb3c56044e1b8f7721bfaee5d
2022-06-21 22:18:02 +09:00
Tatsuhiro Tsujikawa 9800934e19 Bump llhttp to 75b45129db961e1fb3c56044e1b8f7721bfaee5d 2022-06-21 21:52:03 +09:00
Tatsuhiro Tsujikawa 075142ab08
Merge pull request #1737 from nghttp2/bump-libbpf
Bump libbpf to v0.8.0
2022-06-21 21:51:31 +09:00
Tatsuhiro Tsujikawa ab3f86ab36 Bump libbpf to v0.8.0 2022-06-21 21:31:37 +09:00
Tatsuhiro Tsujikawa ce66ac88c8
Merge pull request #1736 from nghttp2/bump-ngtcp2
Bump ngtcp2 and nghttp3
2022-06-21 00:09:54 +09:00
Tatsuhiro Tsujikawa 3849337b42 Bump ngtcp2 and nghttp3 2022-06-20 21:52:19 +09:00
Tatsuhiro Tsujikawa e6cf62664d
Merge pull request #1735 from nghttp2/update-default-tls-ciphers
Update default TLS cipher suites
2022-06-20 00:54:58 +09:00
Tatsuhiro Tsujikawa 56ae4124b1 Update default TLS cipher suites 2022-06-20 00:32:43 +09:00
Tatsuhiro Tsujikawa 41aaa47fd0
Merge pull request #1734 from nghttp2/server-change-extpri
Allow server to override RFC 9218 stream priority
2022-06-16 20:53:12 +09:00
Tatsuhiro Tsujikawa ffa50c12b1 Check session side first 2022-06-16 19:50:29 +09:00
Tatsuhiro Tsujikawa 41955b3878 Allow server to override RFC 9218 stream priority
Allow server to override RFC 9218 stream priority with
nghttp2_session_change_extpri_stream_priority.
2022-06-16 19:49:53 +09:00
Tatsuhiro Tsujikawa 534284477e
Merge pull request #1733 from nghttp2/nghttpx-no-rfc7540-priorities
nghttpx: Disable RFC 7540 priorities
2022-06-16 18:39:34 +09:00
Tatsuhiro Tsujikawa b646c0a351
Merge pull request #1732 from nghttp2/stream-priority-doc
Document how to change stream prioritization scheme
2022-06-16 08:34:01 +09:00
Tatsuhiro Tsujikawa 6429551272 nghttpx: Disable RFC 7540 priorities
Disable RFC 7540 priorities in nghttpx.  It enables RFC 9218
extensible prioritization scheme.  It also enables a mechanism for
server to fallback to RFC 7540 in order to handle the existing clients
which do not implement SETTINGS_NO_RFC7540_PRIORITIES.
2022-06-15 23:43:03 +09:00
Tatsuhiro Tsujikawa ae2a9695f0 Document how to change stream prioritization scheme 2022-06-15 23:10:44 +09:00
Tatsuhiro Tsujikawa 9698bd530b
Merge pull request #1731 from nghttp2/fallback-rfc7540-pri
Add a server option to fallback to RFC 7540 priorities
2022-06-15 08:34:58 +09:00
Tatsuhiro Tsujikawa 8c2386c221 Add a server option to fallback to RFC 7540 priorities
Add nghttp2_option_set_server_fallback_rfc7540_priorities.  If it is
set to nonzero, and server submits SETTINGS_NO_RFC7540_PRIORITIES = 1,
but it does not receive SETTINGS_NO_RFC7540_PRIORITIES from client,
server falls back to RFC 7540 priorities.  Only minimal set of
features are enabled in this fallback case.
2022-06-14 23:47:42 +09:00
Tatsuhiro Tsujikawa d1e07ab6b7
Merge pull request #1729 from nghttp2/rfc9218-priority-update-frame
Add PRIORITY_UPDATE frame support
2022-06-13 21:15:43 +09:00
Tatsuhiro Tsujikawa b0fbb93022 Add PRIORITY_UPDATE frame support
This commit adds PRIORITY_UPDATE frame support.  Applying incoming
PRIORITY_UPDATE frame to server push stream is not implemented.

Client can send PRIORITY_UPDATE frame by calling
nghttp2_submit_priority_update.

Server opts to receive PRIORITY_UPDATE frame by the call
nghttp2_option_set_builtin_recv_extension_type(option,
NGHTTP2_PRIORITY_UPDATE), and passing the option to
nghttp2_session_server_new2 or nghttp2_session_server_new3.
2022-06-13 20:04:30 +09:00
Tatsuhiro Tsujikawa c44caa0580
Merge pull request #1728 from nghttp2/rfc9218-ext-priority
Implement RFC 9218 extensible prioritization scheme
2022-06-12 17:32:23 +09:00
Tatsuhiro Tsujikawa c10a55588b Implement RFC 9218 extensible prioritization scheme
This commit implements RFC 9218 extensible prioritization scheme.  It
is enabled when a local endpoint submits
SETTINGS_NO_RFC7540_PRIORITIES = 1.  This commit only handles priority
signal in HTTP request header field.  Priority header field in
PUSH_PROMISE is not supported.

HTTP messaging must be enabled to take advantage of this
prioritization scheme because HTTP fields are not parsed if HTTP
messaging is disabled.
2022-06-12 16:06:04 +09:00
Tatsuhiro Tsujikawa 4ffb63a737 nghttp2_pq_init never fail 2022-06-11 17:36:48 +09:00
Tatsuhiro Tsujikawa ac3f846f29
Merge pull request #1727 from nghttp2/host-in-resp-field-section
Do not verify host field specific characters for response field
2022-06-11 17:33:44 +09:00
Tatsuhiro Tsujikawa 73b5daddbc
Merge pull request #1725 from nghttp2/no-rfc7540-priorities
No rfc7540 priorities
2022-06-11 17:18:24 +09:00
Tatsuhiro Tsujikawa a26bad3324 Do not verify host field specific characters for response field
Do not verify host field specific characters for response field
section because host field in response field section is undefined.
2022-06-11 17:08:51 +09:00
Tatsuhiro Tsujikawa 2c73de5292 Exclude macos + cmake build because of include path issue 2022-06-11 16:50:07 +09:00
Tatsuhiro Tsujikawa 9812a0bc81 Add SETTINGS_NO_RFC7540_PRIORITIES
Add SETTINGS_NO_RFC7540_PRIORITIES to disable RFC7540 priorities.  If
disabled, streams are served in FIFO.
2022-06-11 16:50:07 +09:00
Tatsuhiro Tsujikawa 8d48686cec
Merge pull request #1724 from nghttp2/compile-with-libressl-3.5
Compile with libressl 3.5
2022-06-08 21:28:03 +09:00
Tatsuhiro Tsujikawa f38d9f8cf6 Compile with libressl >= 3.5 2022-06-08 19:58:12 +09:00
Tatsuhiro Tsujikawa 0d1894ecbb Disable neverbleed for macos
Disable neverbleed for macos because it does not work with libressl
installed on github actions.
2022-06-08 19:46:22 +09:00
Tatsuhiro Tsujikawa d801a23f91
Merge pull request #1719 from nghttp2/go-update
Go update
2022-05-24 22:29:57 +09:00
Tatsuhiro Tsujikawa 24d27977bd Rearrange imports 2022-05-24 21:56:38 +09:00
Tatsuhiro Tsujikawa 8bbd0363e9 Remove redundant select 2022-05-24 21:53:15 +09:00
Tatsuhiro Tsujikawa c67dc7ff1d Refactor serverTester constructor 2022-05-24 21:47:24 +09:00
Tatsuhiro Tsujikawa 0287024e85 Wrap error 2022-05-24 18:53:08 +09:00
Tatsuhiro Tsujikawa 31b5eb597d Avoid io/ioutil 2022-05-24 18:52:30 +09:00
Tatsuhiro Tsujikawa 26ef62d613 Move runs-on under strategy 2022-05-22 12:22:32 +09:00
Tatsuhiro Tsujikawa 3977be938f
Merge pull request #1718 from nghttp2/bump-ubuntu
Bump ubuntu
2022-05-22 11:54:13 +09:00
Tatsuhiro Tsujikawa fac4dcfc31 Bump ubuntu 2022-05-22 11:23:40 +09:00
Tatsuhiro Tsujikawa 4cd95470d6 IPV6_PMTUDISC_DO 2022-05-19 22:57:34 +09:00
Tatsuhiro Tsujikawa e224ef45a4
Merge pull request #1716 from nghttp2/optimize-gso
Better pack UDP packets in one GSO write
2022-05-16 22:45:11 +09:00
Tatsuhiro Tsujikawa aacc48662a
Merge pull request #1715 from nghttp2/parallel-build
Parallel build
2022-05-16 22:05:36 +09:00
Tatsuhiro Tsujikawa 0c77d6b943 Better pack UDP packets in one GSO write 2022-05-16 22:03:20 +09:00
Tatsuhiro Tsujikawa 9d159596a4
Merge pull request #1714 from nghttp2/bump-ngtcp2
Bump ngtcp2 and nghttp3
2022-05-16 21:52:09 +09:00
Tatsuhiro Tsujikawa de8eaf6468 Parallel build 2022-05-16 21:40:08 +09:00
Tatsuhiro Tsujikawa 205e956883 Bump ngtcp2 and nghttp3 2022-05-16 21:22:22 +09:00
Tatsuhiro Tsujikawa d5733b6beb
Merge pull request #1712 from nghttp2/extra-dist-mruby
EXTRA_DIST: List mruby files explicitly
2022-05-15 19:31:03 +09:00
Tatsuhiro Tsujikawa 4cbe74235d EXTRA_DIST: List mruby files explicitly 2022-05-15 19:05:24 +09:00
Tatsuhiro Tsujikawa 974a614020
Merge pull request #1711 from nghttp2/fix-nproc
nproc is not available on macos
2022-05-15 18:11:04 +09:00
Tatsuhiro Tsujikawa 267ce93a7e nproc is not available on macos 2022-05-15 17:36:53 +09:00
Tatsuhiro Tsujikawa ae1de00c91 Bump actions/checkout to v3 2022-05-15 15:39:03 +09:00
Tatsuhiro Tsujikawa a144dc0e59
Merge pull request #1710 from nghttp2/quic-error-handling
Quic error handling
2022-05-15 12:45:35 +09:00
Tatsuhiro Tsujikawa 516cf851c3 h2load: Deal with error from ngtcp2_conn_submit_crypto_data 2022-05-15 12:01:07 +09:00
Tatsuhiro Tsujikawa 59d6828848 Slightly simplified error handling for ngtcp2_conn_read_pkt 2022-05-15 11:57:00 +09:00
Tatsuhiro Tsujikawa 76ffd6bf96 nghttpx: Fix build error without mruby 2022-05-14 17:44:53 +09:00
Tatsuhiro Tsujikawa 8ad8d70f62
Merge pull request #1709 from nghttp2/bump-mruby
Bump mruby to 3.1.0
2022-05-14 10:36:45 +09:00
Tatsuhiro Tsujikawa 9da4449025
Merge pull request #1708 from nghttp2/bump-neverbleed
Bump neverbleed based on the latest head
2022-05-13 23:33:44 +09:00
Tatsuhiro Tsujikawa 0a3e55031d Bump mruby to 3.1.0 2022-05-13 23:08:27 +09:00
Tatsuhiro Tsujikawa be9bcdf36e Bump neverbleed based on the latest head 2022-05-13 22:57:17 +09:00
Tatsuhiro Tsujikawa c8a032b6f4
Merge pull request #1707 from nghttp2/fix-nghttpd-tls-read-stall
nghttpd: Fix TLS read stall
2022-05-08 18:25:58 +09:00
Tatsuhiro Tsujikawa 55cf5ff3da nghttpd: Fix TLS read stall 2022-05-08 17:52:19 +09:00
Tatsuhiro Tsujikawa a93cac525e
Merge pull request #1706 from nghttp2/tls13-default-enabled
TLSv1.3 is enabled by default
2022-05-08 12:23:22 +09:00
Tatsuhiro Tsujikawa a20cc23a78
Merge pull request #1705 from nghttp2/nghttp-ktls-fix
nghttp: Fix ktls support
2022-05-08 11:56:53 +09:00
Tatsuhiro Tsujikawa 854ef0e839
Merge pull request #1704 from nghttp2/h2load-ktls
h2load: Add ktls support
2022-05-08 11:39:16 +09:00
Tatsuhiro Tsujikawa 317e80c239 h2load: Add ktls support 2022-05-08 11:08:34 +09:00
Tatsuhiro Tsujikawa 6f3ba6940e TLSv1.3 is enabled by default 2022-05-08 11:08:05 +09:00
Tatsuhiro Tsujikawa 7858997c8f nghttp: Fix ktls support 2022-05-08 11:07:33 +09:00
Tatsuhiro Tsujikawa 1ce55d23a3
Merge pull request #1703 from nghttp2/client-tls-handshake
nghttpx: Client always uses simpler TLS handshake
2022-05-08 11:05:57 +09:00
Tatsuhiro Tsujikawa c13a66d26f nghttpx: Client always uses simpler TLS handshake 2022-05-08 10:31:55 +09:00
Tatsuhiro Tsujikawa 992181a0de
Merge pull request #1702 from nghttp2/ktls
nghttp, nghttpd, nghttpx: Add ktls support
2022-05-07 20:59:11 +09:00
Tatsuhiro Tsujikawa 09344eb1ad nghttp, nghttpd, nghttpx: Add ktls support 2022-05-07 18:53:59 +09:00
Tatsuhiro Tsujikawa 0f1cba2af5 Bump ngtcp2 and nghttp3 in Dockerfile 2022-05-07 11:22:23 +09:00
Tatsuhiro Tsujikawa cf78f476b8
Merge pull request #1701 from nghttp2/bump-quictls
Bump quictls
2022-05-07 11:20:56 +09:00
Tatsuhiro Tsujikawa 846b0c076f Bump quictls 2022-05-07 10:54:51 +09:00
Tatsuhiro Tsujikawa f5757aa18d
Merge pull request #1698 from nghttp2/bump-ngtcp2
Bump ngtcp2 and nghttp3
2022-04-25 23:18:30 +09:00
Tatsuhiro Tsujikawa 80c09ea4db Run build on PR 2022-04-25 22:54:18 +09:00
Tatsuhiro Tsujikawa 6b33fa3417 Bump ngtcp2 and nghttp3 2022-04-25 22:52:21 +09:00
Tatsuhiro Tsujikawa 9ba95c9706
Merge pull request #1697 from nghttp2/add-go-mod
Add go.mod
2022-04-25 22:51:54 +09:00
Tatsuhiro Tsujikawa 7b14706f03 Add go.mod 2022-04-25 22:28:14 +09:00
Tatsuhiro Tsujikawa bfd08a46ec
Merge pull request #1695 from nghttp2/fix-perf-regression
nghttpx, h2load: Fix QUIC performance regression
2022-04-06 21:08:45 +09:00
Tatsuhiro Tsujikawa 3b84147f45 nghttpx, h2load: Fix QUIC performance regression 2022-04-06 19:42:01 +09:00
Tatsuhiro Tsujikawa f277dafe1e Bump macos 2022-04-03 22:03:34 +09:00
Tatsuhiro Tsujikawa aca0573bed Bump clang-format to 14 2022-04-03 22:03:34 +09:00
Tatsuhiro Tsujikawa 8d4c9e4345
Merge pull request #1693 from nghttp2/bump-ngtcp2
Bump ngtcp2 and nghttp3
2022-04-03 22:02:21 +09:00
Tatsuhiro Tsujikawa 80a93ddaf8 Bump ngtcp2 and nghttp3 2022-04-03 21:27:40 +09:00
Tatsuhiro Tsujikawa 3ab7cf375c
Merge pull request #1689 from nghttp2/bump-quictls
Bump quictls
2022-03-25 21:49:16 +09:00
Tatsuhiro Tsujikawa a3fbd5ad73 Bump quictls 2022-03-25 21:28:31 +09:00
Tatsuhiro Tsujikawa f2d1cc1a7a
Merge pull request #1685 from nghttp2/nghttpx-affinity-cookie-stickiness
nghttpx: Add affinity-cookie-stickiness backend parameter
2022-03-21 18:24:45 +09:00
Tatsuhiro Tsujikawa 5ded01e288 nghttpx: Add affinity-cookie-stickiness backend parameter 2022-03-20 11:30:32 +09:00
Tatsuhiro Tsujikawa 3ec588bb54
Merge pull request #1683 from nghttp2/nghttpx-fix-session-affinity
nghttpx: Fix broken session affinity
2022-03-15 21:07:40 +09:00
Tatsuhiro Tsujikawa 470f06e5f6 nghttpx: Fix broken session affinity
Session affinity has been broken since
fdcdb21c38.  This commit reverts the
relevant part of the commit to fix the session affinity.
2022-03-15 19:35:49 +09:00
Tatsuhiro Tsujikawa a10bb832fd
Merge pull request #1680 from nghttp2/fix-stream-stall
Fix stream stall when initial window size is decreased
2022-03-13 19:24:32 +09:00
Tatsuhiro Tsujikawa be16a24fcc
Merge pull request #1682 from nghttp2/http3-amplification
nghttpx: Limit CONNECTION_CLOSE and Retry under server amplification …
2022-03-13 18:27:20 +09:00
Tatsuhiro Tsujikawa 2f5ec66a65 nghttpx: Limit CONNECTION_CLOSE and Retry under server amplification limit 2022-03-12 19:48:31 +09:00
Tatsuhiro Tsujikawa 7c3e9152ce
Merge pull request #1681 from nghttp2/no-app-libs-check
Do not check application libraries if --enable-lib-only is given
2022-03-12 19:44:45 +09:00
Tatsuhiro Tsujikawa 37ad3462d2 Do not check application libraries if --enable-lib-only is given 2022-03-12 19:24:04 +09:00
Tatsuhiro Tsujikawa 129daeff6f Fix stream stall when initial window size is decreased
Fix the bug that causes a stream to stall when a receiver, which
enables nghttp2_option_set_no_auto_window_update() option on, sends
SETTINGS_INITIAL_WINDOW_SIZE with the value that is less than or equal
to the amount of data received.  Previously, in this particular case,
when SETTINGS is acknowledged by the sender, the receiver does not try
to send WINDOW_UPDATE frame.  The sender is unable to send more data
because its stream-level window size is smaller than or equal to the
amount of data it has sent.
2022-03-12 17:05:42 +09:00
Tatsuhiro Tsujikawa 072784c9ee Bump ngtcp2 2022-02-28 19:07:33 +09:00
Tatsuhiro Tsujikawa 89431f1727 Bump package version to 1.48.0-DEV 2022-02-23 17:15:04 +09:00
Tatsuhiro Tsujikawa d9f580c3cb Update doc
Bring back clang because we need it to compile bpf program.
2022-02-23 17:08:04 +09:00
Tatsuhiro Tsujikawa f6b05a0111 Update doc 2022-02-23 17:01:00 +09:00
Tatsuhiro Tsujikawa 0353da4605 Update bash_completion 2022-02-23 16:49:24 +09:00
Tatsuhiro Tsujikawa 039ff29a2f Update manual pages 2022-02-23 16:49:04 +09:00
Tatsuhiro Tsujikawa 385a28c7f1 Update doc
rlimit-memlock is not required anymore.
2022-02-23 16:46:56 +09:00
Tatsuhiro Tsujikawa 89e49f1066 Dockerfile: Pin ngtcp2 and nghttp3 versions 2022-02-23 16:41:17 +09:00
Tatsuhiro Tsujikawa abd6bb6818 Bump package and library versions 2022-02-23 16:25:44 +09:00
Tatsuhiro Tsujikawa ad2fbea087 Update AUTHORS 2022-02-23 16:23:58 +09:00
Tatsuhiro Tsujikawa 47cc36969a Bump libbpf in Dockerfile 2022-02-21 22:18:25 +09:00
Tatsuhiro Tsujikawa 830cf1e294 Bump libbpf to v0.7.0 and turn on all strict features 2022-02-21 22:06:30 +09:00
Tatsuhiro Tsujikawa a22f2cfcc8 Bump ngtcp2 and nghttp3 2022-02-19 18:14:18 +09:00
Tatsuhiro Tsujikawa f3d4b4f846 nghttpx: Fix bug that h3 stream ends prematurely 2022-02-18 23:08:47 +09:00
Tatsuhiro Tsujikawa a6537cb9ce Fix compile error 2022-02-12 11:45:24 +09:00
Tatsuhiro Tsujikawa 79524471b4 nghttpx: Add --require-http-scheme option 2022-02-12 11:39:52 +09:00
Tatsuhiro Tsujikawa a67822b382 Bump llhttp to v6.0.6 2022-02-10 21:53:23 +09:00
Tatsuhiro Tsujikawa 79da3fdedc Revert "Bump llhttp to 836430e892862ed6462f6197417eba8e17378956"
This reverts commit b5d74d7c9d.
2022-02-10 21:51:18 +09:00
Tatsuhiro Tsujikawa b5d74d7c9d Bump llhttp to 836430e892862ed6462f6197417eba8e17378956 2022-02-10 21:34:15 +09:00
Tatsuhiro Tsujikawa 385abf10f7 nghttpx: Add support QUIC BBR2 2022-02-10 19:45:30 +09:00
Tatsuhiro Tsujikawa f3206b12d5 Update doc 2022-02-10 19:38:23 +09:00
Tatsuhiro Tsujikawa b70fdca9ac h2load: Handle EAGAIN/EWOULDBLOCK from sendmsg 2022-02-10 19:35:50 +09:00
Tatsuhiro Tsujikawa bd3cc94a36 Use nullptr for C++ code 2022-02-10 18:56:19 +09:00
Tatsuhiro Tsujikawa 02f2336ab1 Bump libbpf to v0.6.1 2022-02-09 19:03:13 +09:00
Tatsuhiro Tsujikawa 832d811982 Remove appveyor.yml 2022-02-08 20:21:23 +09:00
Tatsuhiro Tsujikawa 637f3d7b33 Windows build on GitHub Actions 2022-02-08 19:16:32 +09:00
Tatsuhiro Tsujikawa 254f2b3c42 Remove macos + gcc ci build to speed up ci build time 2022-02-08 19:14:45 +09:00
Tatsuhiro Tsujikawa 633691e164 Remove .travis.yml 2022-02-08 19:13:50 +09:00
Tatsuhiro Tsujikawa 01bcc72f66 nghttpx: Handle EAGAIN/EWOULDBLOCK from sendmsg 2022-02-03 22:20:58 +09:00
Tatsuhiro Tsujikawa 7ca255ff54 Fix docker build error 2022-02-02 22:55:19 +09:00
Tatsuhiro Tsujikawa 6430c98e86 Compile with the latest ngtcp2 2022-02-02 19:19:00 +09:00
Tatsuhiro Tsujikawa 32c2557bb7 Bump nghttp3 2022-01-26 22:58:50 +09:00
Tatsuhiro Tsujikawa 3122a83900 h2load: Set quic error code based on error from ngtcp2_conn_read_pkt 2022-01-23 23:47:40 +09:00
Tatsuhiro Tsujikawa 75272a817e h2load: Fix ngtcp2 callback error code 2022-01-23 23:47:29 +09:00
Tatsuhiro Tsujikawa 809d5af43e nghttpx: Fix invalid error code 2022-01-23 22:30:46 +09:00
Tatsuhiro Tsujikawa 3b549caf90 clang-format 2022-01-23 22:30:46 +09:00
Tatsuhiro Tsujikawa 42b659354d nghttpx: Support h3 trailer fields 2022-01-23 22:30:46 +09:00
Tatsuhiro Tsujikawa 2275327794 nghttpx: Fix the issue that forwarded h3 GET request always has chunked TE 2022-01-23 21:36:35 +09:00
Tatsuhiro Tsujikawa 02a5649343 Require ngtcp2 >= 0.1.0 and nghttp3 >= 0.1.0 2022-01-23 18:34:59 +09:00
Tatsuhiro Tsujikawa 3b0b9a458c Build docker image with ngtcp2 v0.1.0 2022-01-22 18:17:30 +09:00
Tatsuhiro Tsujikawa 6e6388e7c2 Depend on nghttp3 v0.1.1 2022-01-22 18:17:09 +09:00
Tatsuhiro Tsujikawa ea6f0c641d
Merge pull request #1643 from nwtgck/fix-example-quotes
fix quotes in --altsvc example
2022-01-19 19:01:53 +09:00
Tatsuhiro Tsujikawa c883b18f2d Pin quic dependency 2022-01-16 22:00:27 +09:00
Tatsuhiro Tsujikawa 97e69f7416 Merge branch 'rex4539-typos' 2022-01-16 21:54:15 +09:00
Dimitris Apostolou ad0c9eebf7 Fix typos 2022-01-16 21:53:44 +09:00
Tatsuhiro Tsujikawa 8a552631b4
Merge pull request #1667 from nghttp2/keep-hd-table-size
Fix decoder table size update
2022-01-11 20:53:08 +09:00
Tatsuhiro Tsujikawa cff8106908
Merge pull request #1665 from c0bw3b/cleanup/spdy
Remove SPDY option for CMake
2022-01-11 20:14:37 +09:00
Tatsuhiro Tsujikawa 4eb49ac28e
Merge pull request #1666 from Kludex/patch-1
Update nghttp2.pyx
2022-01-11 20:13:43 +09:00
Tatsuhiro Tsujikawa deb390cf85 Fix decoder table size update
When applying new header table size acknowledged with SETTINGS ACK by
an encoder, change the header table size on a decoder only when it
strictly lowers the current maximum table size set by Dynamic Table
Size Update from the encoder or the default size 4096 if no Dynamic
Table Size Update is received.

Previously, the header table size on a decoder is always changed.  If
a maximum size in SETTINGS are increased (e.g., 4096 -> 8192), and
then decreased to the previous value, the decoder incorrectly requires
Dynamic Table Size Update from an encoder.
2022-01-11 19:50:45 +09:00
Tatsuhiro Tsujikawa d91ae6987d Compile with the latest ngtcp2 2022-01-11 19:40:26 +09:00
Marcelo Trylesinski 8ddb2273b9
Update nghttp2.pyx 2022-01-01 19:18:14 +01:00
Renaud e1446fd57a
Remove SPDY option for CMake
SPDY feature removed in #1091 and release v1.29.0
2022-01-01 15:21:59 +01:00
Tatsuhiro Tsujikawa 02e6cad121 Bump quictls/openssl versions 2021-12-19 20:44:45 +09:00
Tatsuhiro Tsujikawa 0b053e06d8
Merge pull request #1657 from nwtgck/patch-2
Make Docker speak HTTP/3
2021-12-13 18:00:18 +09:00
Ryo Ota c3c0403dfa
Make Docker speak HTTP/3 2021-12-12 23:16:10 +09:00
Ryo Ota abc15c696d fix quotes in --altsvc example 2021-11-18 09:12:05 +09:00
Tatsuhiro Tsujikawa 344d300cf9 Fix cmake CI build 2021-11-16 22:09:48 +09:00
Tatsuhiro Tsujikawa dec233b9ef cmake: Disable libbpf build by default 2021-11-16 22:03:30 +09:00
Tatsuhiro Tsujikawa f695dc999b Merge branch 'robaho-robaho/issue1639' 2021-11-14 16:43:23 +09:00
robaho f92f81c05a allow setting max frame size for h2load 2021-11-14 16:43:01 +09:00
Tatsuhiro Tsujikawa 3c4449c046 nghttpx: Use nghttp3 error code 2021-11-10 19:18:48 +09:00
Tatsuhiro Tsujikawa 918e4ea46b Compile with the latest ngtcp2 2021-11-09 15:44:06 +09:00
Tatsuhiro Tsujikawa d14d97ab68 Rename send_stop_sending to stop_sending 2021-11-09 11:13:23 +09:00
Tatsuhiro Tsujikawa 2aed077761 Merge fd_set_recv_ecn to create_quic_server_socket and handle errors 2021-11-06 17:19:02 +09:00
Tatsuhiro Tsujikawa 68b2295f4e nghttpx: Set IP_PMTUDISC_DO explicitly 2021-11-06 17:12:43 +09:00
Tatsuhiro Tsujikawa 528d177847 nghttpx: Fix compile error 2021-11-06 00:16:53 +09:00
Tatsuhiro Tsujikawa deae6c95b1 nghttpx: Send ECN 2021-11-05 23:23:00 +09:00
Tatsuhiro Tsujikawa 7eb179069d Remove useless assignments 2021-11-05 22:51:36 +09:00
Tatsuhiro Tsujikawa 47c33b8d03 nghttpx: Receive ECN 2021-11-05 20:57:24 +09:00
Tatsuhiro Tsujikawa 94372fbe2a Merge branch 'bagder-version-h3-too' 2021-11-05 18:39:09 +09:00
Daniel Stenberg 9e154297ff shrpx: make nghttpx -v show ngtcp2 and nghttp3 version as well
... if HTTP/3 support is built in.
2021-11-05 18:38:39 +09:00
Tatsuhiro Tsujikawa c4828dbd7c h2load: Fix assertion failure with the latest ngtcp2 2021-11-03 21:23:26 +09:00
Tatsuhiro Tsujikawa 0d16db2c65 Use quictls 1.1.1l for now because 3.0.0 is much slower 2021-10-30 18:09:18 +09:00
Tatsuhiro Tsujikawa fb63ef305d Update doc 2021-10-30 18:09:06 +09:00
Tatsuhiro Tsujikawa 089fc81d72 Change qlog file extension to .sqlog
Change qlog file extension to .sqlog because upstream ngtcp2 moves to
JSON-SEQ streaming qlog format.
2021-10-29 21:59:54 +09:00
Tatsuhiro Tsujikawa c20d175ff2 Guard RLIMIT_MEMLOCK usage 2021-10-29 21:39:17 +09:00
Tatsuhiro Tsujikawa 3985957c4d
Merge pull request #1625 from codebytere/fix-unreachable-return
chore: fix `-Wunreachable-code-return`
2021-10-29 21:35:44 +09:00
Tatsuhiro Tsujikawa 845a20b582 Bump version number to 1.47.0-DEV 2021-10-19 18:59:58 +09:00
Tatsuhiro Tsujikawa 7af0c508be Update manual pages 2021-10-19 18:29:19 +09:00
Tatsuhiro Tsujikawa f8474b25f0 nghttpx: Reduce dgram size if sendmsg fails with EINVAL or EMSGSIZE 2021-10-18 22:37:16 +09:00
Tatsuhiro Tsujikawa 15a8d913ea examples/client: Enable ALPN 2021-10-17 17:25:18 +09:00
Tatsuhiro Tsujikawa 65d3c9047f Replace TLSv23_method with TLS_method 2021-10-17 17:21:09 +09:00
Tatsuhiro Tsujikawa 8c36971ea9 Compile with OPENSSL_NO_DEPRECATED and fix memory leaks 2021-10-17 17:12:14 +09:00
Tatsuhiro Tsujikawa ba1dff187b Update bash_completion 2021-10-17 14:52:55 +09:00
Tatsuhiro Tsujikawa 8ecacc8ed2 Update manual pages 2021-10-17 14:52:36 +09:00
Tatsuhiro Tsujikawa 9d41896663 nghttpx: Rename --frontend-quic-server-id to --quic-server-id 2021-10-17 14:48:46 +09:00
Tatsuhiro Tsujikawa 18d4a9e4ff Update bash_completion 2021-10-17 14:30:27 +09:00
Tatsuhiro Tsujikawa 1745a30644 Update manual pages 2021-10-17 14:30:27 +09:00
Tatsuhiro Tsujikawa 0cc7c598ff src: TLS_DEFAULT_CIPHERSUITES was deprecated in OpenSSL 3.0.0 2021-10-17 14:30:27 +09:00
Tatsuhiro Tsujikawa 8c4fbb86d8 Bump version number to 1.46.0, LT revision to 35:1:21 2021-10-17 14:00:37 +09:00
Tatsuhiro Tsujikawa 693431312c Fix cmake build 2021-10-15 23:39:44 +09:00
Tatsuhiro Tsujikawa f3fca2a19a Update doc 2021-10-15 23:24:23 +09:00
Tatsuhiro Tsujikawa 1ce9efc644 nghttpx: Set SCT data when built with boringssl 2021-10-15 23:06:24 +09:00
Tatsuhiro Tsujikawa 7055501efd src: Enable HTTP/3 with boringssl 2021-10-15 22:50:34 +09:00
Tatsuhiro Tsujikawa c790ee64a4 src: Prefer #ifdef for a single condition 2021-10-15 22:50:26 +09:00
Tatsuhiro Tsujikawa 9fb05d5ea2 Fix compile error under mac os 2021-10-15 19:54:08 +09:00
Tatsuhiro Tsujikawa 3742acaf39 nghttpx: Fix wrong SSL_CTX object usage 2021-10-15 18:19:07 +09:00
Tatsuhiro Tsujikawa d8282de229 nghttpx: Respect !tls-no-postpone-early-data with boringssl 2021-10-15 00:13:49 +09:00
Tatsuhiro Tsujikawa 3a721a9dd5 nghttpx: Send session ticket after handshake with boringssl 2021-10-15 00:13:49 +09:00
Tatsuhiro Tsujikawa 0b6092446b src: Compile with boringssl for non-http3 build 2021-10-14 23:44:27 +09:00
Shelley Vohr 59a76c6d39
chore: fix -Wunreachable-code-return 2021-10-11 12:56:23 +02:00
Tatsuhiro Tsujikawa fa7a916ef3 nghttpx: Store initial_rtt in ev_tstamp for consistency 2021-10-10 17:34:58 +09:00
Tatsuhiro Tsujikawa 69c4187100 nghttpx: Add --frontend-quic-initial-rtt option 2021-10-10 17:24:02 +09:00
Tatsuhiro Tsujikawa 07128719c4 Workaround broken version check in AX_PYTHON_DEVEL 2021-10-10 16:52:05 +09:00
Tatsuhiro Tsujikawa 7471fa627d Update ax_python_devel.m4 2021-10-10 16:08:49 +09:00
Tatsuhiro Tsujikawa d7af5924ff nghttpx: Extend QUIC server ID to 4 bytes 2021-10-10 16:05:48 +09:00
Tatsuhiro Tsujikawa a48e9d3d80 Add bpf to clang-format 2021-10-06 21:29:15 +09:00
Tatsuhiro Tsujikawa 474a6db00c Compile with gcc 2021-10-06 21:28:17 +09:00
Tatsuhiro Tsujikawa cb6aea9aa9 Compile with -DNDEBUG 2021-10-06 21:28:00 +09:00
Tatsuhiro Tsujikawa f4290c6497 Fix compile error 2021-10-04 23:23:03 +09:00
Tatsuhiro Tsujikawa 086b85b8f9 nghttpx: Unload BPF program after setting up all QUIC listeners 2021-10-04 22:39:31 +09:00
Tatsuhiro Tsujikawa abee658a60 nghttpx: Make sure that ngtcp2_conn_update_pkt_tx_time is called 2021-10-02 19:22:53 +09:00
Tatsuhiro Tsujikawa 87bdc21667 nghttpx: Add --worker-process-grace-shutdown-period option 2021-10-02 18:55:51 +09:00
Tatsuhiro Tsujikawa 3e25ee8181 256k memlock is not enough when reloading happens 2021-09-29 22:16:39 +09:00
Tatsuhiro Tsujikawa 0266c458a3 nghttpx: Add --max-worker-processes option 2021-09-29 22:12:10 +09:00
Tatsuhiro Tsujikawa d9c7631dcb Fix compile error 2021-09-29 21:05:46 +09:00
Tatsuhiro Tsujikawa df064fa2ba nghttpx: Unload BPF objects on reload to avoid running out of memlock 2021-09-29 19:33:16 +09:00
Tatsuhiro Tsujikawa 318e0c8447 Guard msghdr_get_local_addr with ENABLE_HTTP3 macro 2021-09-28 22:35:53 +09:00
Tatsuhiro Tsujikawa 17d5503bf2 Update doc 2021-09-28 18:07:31 +09:00
Tatsuhiro Tsujikawa 19b4da6401 nghttpx: Support h3-29 2021-09-26 16:00:47 +09:00
Tatsuhiro Tsujikawa 886dc93f18 nghttpx: Fail h3 connection attempt if no ALPN is negotiated 2021-09-26 16:00:47 +09:00
Tatsuhiro Tsujikawa 407df2822e Remove check for UDP_SEGMENT
Check for UDP_SEGMENT is for debian 10, but now that we have debian
11, remove the check because it breaks cross-build.
2021-09-26 10:29:05 +09:00
Tatsuhiro Tsujikawa f6da0d342a nghttpx: Fix crash if no keying materials are specified in file 2021-09-24 18:19:01 +09:00
Tatsuhiro Tsujikawa 7271537a15 nghttpx: Add --rlimit-memlock option 2021-09-24 18:13:38 +09:00
Tatsuhiro Tsujikawa d0e8efac4d nghttpx: Fix bug that reading QUIC secret file fails without line separator 2021-09-24 17:50:28 +09:00
Tatsuhiro Tsujikawa 27e6d56d83 Update doc 2021-09-23 12:02:19 +09:00
Tatsuhiro Tsujikawa c5122c12cb Update bash_completion 2021-09-23 11:45:23 +09:00
Tatsuhiro Tsujikawa 282050c596 Update manual pages 2021-09-23 11:45:10 +09:00
Tatsuhiro Tsujikawa 308c73bfa2 nghttpx: Read QUIC keying materials from file
Add --frontend-quic-secret-file to read QUIC keying materials from
file.  --frontend-quic-connection-id-encryption-key was removed in
favor of this new option.
2021-09-23 11:18:07 +09:00
Tatsuhiro Tsujikawa c40309ae8e nghttpx: optarg should be allocated per configuration 2021-09-23 11:01:01 +09:00
Tatsuhiro Tsujikawa 1c7a4ecc7f nghttpx: Rename generate_encrypted_quic_connection_id to generate_quic_connection_id 2021-09-21 23:09:03 +09:00
Tatsuhiro Tsujikawa 80cc623eb2 nghttpx: Allocate server id in Connection ID 2021-09-21 23:08:55 +09:00
Tatsuhiro Tsujikawa 89457fd991 More https 2021-09-21 20:40:57 +09:00
Tatsuhiro Tsujikawa 257043b8fb Fix issue that libev cannot be found with autotools under mac osx 2021-09-21 19:49:56 +09:00
Tatsuhiro Tsujikawa 657d94b992 Fix compile error with libressl 2021-09-21 19:48:38 +09:00
Tatsuhiro Tsujikawa 06dc7d5964 Make sure that nghttp2 can be built from tar archive 2021-09-21 19:48:34 +09:00
Tatsuhiro Tsujikawa b50079524b Always include optional files to EXTRA_DIST 2021-09-21 19:26:28 +09:00
Tatsuhiro Tsujikawa cdf1f269ff Add missing cmake files to EXTRA_DIST 2021-09-21 17:53:15 +09:00
Tatsuhiro Tsujikawa 738b562f39 Bump up version number to 1.46.0-DEV 2021-09-20 17:52:07 +09:00
Tatsuhiro Tsujikawa 58499f256b Update bash_completion 2021-09-20 17:07:58 +09:00
Tatsuhiro Tsujikawa afb455ef80 python3 2021-09-20 17:07:44 +09:00
Tatsuhiro Tsujikawa f4515e9034 Update manual pages 2021-09-20 17:02:54 +09:00
Tatsuhiro Tsujikawa aab07d00d7 Bump version number to 1.45.0, LT revision to 35:0:21 2021-09-20 16:58:28 +09:00
Tatsuhiro Tsujikawa 32ecfc6a86 Use https 2021-09-20 16:54:47 +09:00
Tatsuhiro Tsujikawa e866f9fae7 Update AUTHORS 2021-09-20 16:53:55 +09:00
Tatsuhiro Tsujikawa a029f6ed2c Rename sphinxcontrib to rubydomain to avoid module loading error
Rename sphinxcontrib to rubydomain to avoid module loading error when
sphinx-build docker image is used.
2021-09-20 13:43:40 +09:00
Tatsuhiro Tsujikawa 5b6e2cb5e0 Allow SPHINXBUILD to be overridden by environment variable 2021-09-20 12:19:26 +09:00
Tatsuhiro Tsujikawa 0264847a37 bpf: Use LINUX_KERNEL_VERSION extern variable 2021-09-19 21:07:40 +09:00
Tatsuhiro Tsujikawa d276ca0adc Update doc 2021-09-18 19:28:03 +09:00
Tatsuhiro Tsujikawa 6a099ee50a nghttpx: QUIC requires TLS 2021-09-18 19:27:47 +09:00
Tatsuhiro Tsujikawa be88846972 Build HTTP/3 and eBPF enabled nghttpx with Dockerfile 2021-09-18 18:08:40 +09:00
Tatsuhiro Tsujikawa 9a6b623c25 Update doc 2021-09-18 15:19:15 +09:00
Tatsuhiro Tsujikawa 97b36b8c74 make -C 2021-09-17 23:57:26 +09:00
Tatsuhiro Tsujikawa 0df332e7b8 Update doc 2021-09-17 23:53:35 +09:00
Tatsuhiro Tsujikawa 2d7e6fbb11 Update doc 2021-09-17 21:21:42 +09:00
Tatsuhiro Tsujikawa fd107ab47c nghttpx: Refactor quic 2021-09-17 19:35:31 +09:00
Tatsuhiro Tsujikawa 1320d7efab nghttpx: Do not accept new connection during graceful shutdown period 2021-09-17 18:30:16 +09:00
Tatsuhiro Tsujikawa 7cdc6cfa6d nghttpx: Store Retry in CloseWait to rate limit its transmission 2021-09-17 17:52:05 +09:00
Tatsuhiro Tsujikawa 095ee9683d integration: Adds tests for chunked response 2021-09-16 22:37:33 +09:00
Tatsuhiro Tsujikawa 1e2081a1c5 Fix integration test error 2021-09-16 22:24:53 +09:00
Tatsuhiro Tsujikawa e167e07a9a nghttpx: Check that HTTP response message finished safely 2021-09-16 22:00:36 +09:00
Tatsuhiro Tsujikawa f3b9cd8404 bpf: Add workaround for ubuntu 20.04 2021-09-16 20:20:02 +09:00
Tatsuhiro Tsujikawa 8f9744c07b nghttpx: Pass hashed_scid_ to CloseWait 2021-09-15 23:40:46 +09:00
Tatsuhiro Tsujikawa 684a219e39 nghttpx: Tweak close wait handling 2021-09-15 23:07:46 +09:00
Tatsuhiro Tsujikawa e2e6d827c7 Update bash_completion 2021-09-15 22:55:38 +09:00
Tatsuhiro Tsujikawa f0108ece6f Update manual pages 2021-09-15 22:55:21 +09:00
Tatsuhiro Tsujikawa 789b7a5ff1 Update doc 2021-09-15 22:50:47 +09:00
Tatsuhiro Tsujikawa 0961295a82 nghttpx: Transform odcid into hashed cid 2021-09-15 22:19:52 +09:00
Tatsuhiro Tsujikawa fd060eb9f1 nghttpx: Connection ID encryption 2021-09-15 21:31:03 +09:00
Tatsuhiro Tsujikawa 1feeda4514 nghttpx: Fix bug that worker process never exit 2021-09-15 21:00:41 +09:00
Tatsuhiro Tsujikawa 6d29de0f1e Fix compile error 2021-09-14 17:22:25 +09:00
Tatsuhiro Tsujikawa 74162850f0 nghttpx: Compile with the latest nghttp3 2021-09-14 16:45:11 +09:00
Tatsuhiro Tsujikawa 8903bd1e8a nghttpx: Deal with error from ngtcp2_conn_read_pkt 2021-09-13 23:09:38 +09:00
Tatsuhiro Tsujikawa 4b79a4a10d Add message when checking UDP_SEGMENT in linux/udp.h 2021-09-13 21:46:41 +09:00
Tatsuhiro Tsujikawa 8f419a4869 nghttpx: Add --frontend-quic-congestion-controller option 2021-09-13 21:35:46 +09:00
Tatsuhiro Tsujikawa fcdac50f79 Should run program 2021-09-13 21:19:18 +09:00
Tatsuhiro Tsujikawa 4541134c88 Add missing include 2021-09-13 21:19:00 +09:00
Tatsuhiro Tsujikawa b5e5972c2a Update doc 2021-09-12 18:11:11 +09:00
Tatsuhiro Tsujikawa 525d59fdf6 Remove util::make_hostport returning std::string 2021-09-12 18:07:54 +09:00
Tatsuhiro Tsujikawa 00f65afe20 nghttpx: Fix incorrect quic frontend address matching 2021-09-12 18:07:54 +09:00
Tatsuhiro Tsujikawa fc402f5804 Cleanup 2021-09-12 16:55:56 +09:00
Tatsuhiro Tsujikawa f74b6d9a43 nghttpx: Add --frontend-quic-require-token option 2021-09-12 15:04:54 +09:00
Tatsuhiro Tsujikawa ccaf2333ca nghttpx: Enable websocket over h3 2021-09-11 17:56:25 +09:00
Tatsuhiro Tsujikawa 0066bf8eed h2load: Cleanup 2021-09-11 17:00:11 +09:00
Tatsuhiro Tsujikawa bc8f88f5fa Compile with the latest ngtcp2 2021-09-11 16:57:14 +09:00
Tatsuhiro Tsujikawa 10c9d917ad Fix compile error 2021-09-10 22:55:33 +09:00
Tatsuhiro Tsujikawa cc5f752f2d nghttpx: Use secure random to create websocket nonce 2021-09-10 22:43:03 +09:00
Tatsuhiro Tsujikawa 39b1a51ff4 Compile with the latest ngtcp2 2021-09-09 23:41:27 +09:00
Tatsuhiro Tsujikawa a2e2e46af3 Build with OpenSSL v3.0.0 2021-09-09 18:35:35 +09:00
Tatsuhiro Tsujikawa 9d53a7e0a6 Fix compile error 2021-09-07 14:55:30 +09:00
Tatsuhiro Tsujikawa 7ea57eaa18 h2load: Add --max-udp-payload-size option 2021-09-07 14:42:35 +09:00
Tatsuhiro Tsujikawa 1657a425c1 Build with the latest ngtcp2 2021-09-07 13:40:41 +09:00
Tatsuhiro Tsujikawa e929e92245 nghttpx: Fix typo 2021-09-06 20:59:11 +09:00
Tatsuhiro Tsujikawa 5994e48b28 nghttpx: Add more logging for token validation 2021-09-06 20:58:35 +09:00
Tatsuhiro Tsujikawa 50662c9c9e nghttpx: Guard TLS1_3_VERSION 2021-09-06 20:07:38 +09:00
Tatsuhiro Tsujikawa addd614e94 nghttpx: Add qlog support 2021-09-06 20:06:38 +09:00
Tatsuhiro Tsujikawa fbb228050a nghttpx: Fix uninitialized dnf fields 2021-09-06 00:12:04 +09:00
Tatsuhiro Tsujikawa 9bda8e266e nghttpx: Remove BoringSSL early data for QUIC for now 2021-09-05 22:37:20 +09:00
Tatsuhiro Tsujikawa d977005126 nghttpx: Disable session cache for QUIC since it solely uses ticket 2021-09-05 22:36:43 +09:00
Tatsuhiro Tsujikawa 8b579bc7d0 nghttpx: Always renew TLS ticket for TLSv1.3 2021-09-05 22:26:45 +09:00
Tatsuhiro Tsujikawa ab16a11aa3 nghttpx: Add --frontend-quic-early-data, disable early data by default 2021-09-05 21:39:45 +09:00
Tatsuhiro Tsujikawa 85347e12de nghttpx: Rate limit Stateless Reset transmission 2021-09-05 19:23:50 +09:00
Tatsuhiro Tsujikawa 67afbbbaa6 nghttpx: Use ngtcp2_cid as a hash key 2021-09-05 19:00:26 +09:00
Tatsuhiro Tsujikawa b743ee21f0 nghttpx: Implement closing and draining state 2021-09-05 18:01:27 +09:00
Tatsuhiro Tsujikawa 72702a042e Cleanup 2021-09-05 17:47:50 +09:00
Tatsuhiro Tsujikawa 649c69fa9e nghttpx: Do not send CONNECTION_CLOSE on idle timeout 2021-09-04 19:04:22 +09:00
Tatsuhiro Tsujikawa 9fd0b87925 Add missing APIDOCS entry 2021-09-04 18:41:13 +09:00
Tatsuhiro Tsujikawa 1c7a001489 bpf: Take into account entire DCID 2021-09-04 18:31:21 +09:00
Tatsuhiro Tsujikawa 47edc33b0d nghttpx: Use ULOG 2021-09-04 17:48:02 +09:00
Tatsuhiro Tsujikawa 2afad0c650 nghttpx: Use ngtcp2_conn_get_client_initial_dcid 2021-09-04 17:43:24 +09:00
Tatsuhiro Tsujikawa fb53a6a686 Follow the latest ngtcp2 change 2021-09-04 17:37:00 +09:00
Tatsuhiro Tsujikawa 31b5b78dc1 Use switch to avoid many if-else-if 2021-09-04 17:35:33 +09:00
Tatsuhiro Tsujikawa 2f941c7fb3 Update doc 2021-09-04 17:32:57 +09:00
Tatsuhiro Tsujikawa ba483b4032 Update doc 2021-09-04 17:30:06 +09:00
Tatsuhiro Tsujikawa 977b0ceee4 make clang-format 2021-09-04 17:27:43 +09:00
Tatsuhiro Tsujikawa fcc20334da
Merge pull request #1613 from mkauf/check_pseudo_header_chars
Stricter checks for pseudo-headers :method and :path
2021-09-04 17:26:47 +09:00
Michael Kaufmann 83c063346d Stricter checks for pseudo-headers :method and :path
Check the allowed characters for ":method" (see RFC 7230, section 3.2.6) and
":path". For ":path", the space and tab characters are now forbidden, but
other special characters are still allowed for compatibility reasons.

Update genvchartbl.py so that it generates the same table as in the code.

Fixes #1611
2021-08-31 21:47:35 +02:00
Tatsuhiro Tsujikawa c2e29ad06f nghttpx: Enforce worker-frontend-connections for QUIC 2021-08-31 19:48:26 +09:00
Tatsuhiro Tsujikawa 9194d40da7 Update bash_completions 2021-08-31 19:24:41 +09:00
Tatsuhiro Tsujikawa 002073ef57 Update manual pages 2021-08-31 19:24:41 +09:00
Tatsuhiro Tsujikawa ef3066a1bd nghttpx: Update doc 2021-08-31 19:24:41 +09:00
Tatsuhiro Tsujikawa 65db5b94e4 nghttpx: Document "quic" parameter 2021-08-31 19:24:41 +09:00
Tatsuhiro Tsujikawa 3122038c48 Add HTTP/3 documentation 2021-08-31 19:24:41 +09:00
Tatsuhiro Tsujikawa 54fd0efdfe nghttpx: Return error if quic param is specified when quic is disabled 2021-08-31 17:15:44 +09:00
Tatsuhiro Tsujikawa f0d1e50d5a cmake: Build bpf 2021-08-31 17:15:37 +09:00
Tatsuhiro Tsujikawa a87ea20b7c configure: Avoid compile failure 2021-08-31 16:49:55 +09:00
Tatsuhiro Tsujikawa 8e7e40d0cc bpf: Remove redundant -g 2021-08-31 16:49:55 +09:00
Tatsuhiro Tsujikawa de4d4f6609 Fix cmake Systemd warning 2021-08-31 16:49:55 +09:00
Tatsuhiro Tsujikawa e01d61484d Fix compile error with cmake 2021-08-31 16:49:55 +09:00
Tatsuhiro Tsujikawa 51f83087f2 nghttpx: Add missing HTTP/3 timer handling 2021-08-31 14:19:31 +09:00
Tatsuhiro Tsujikawa 17012654e1 nghttpx: Add HTTP/3 graceful shutdown 2021-08-31 14:06:59 +09:00
Tatsuhiro Tsujikawa e998d125ab nghttpx: Send CONNECTION_CLOSE if Retry token validation failed 2021-08-31 13:23:52 +09:00
Tatsuhiro Tsujikawa 95601d3179 nghttpx: Utilize the latest ngtcp2 features 2021-08-31 12:13:06 +09:00
Tatsuhiro Tsujikawa 0566a5833b nghttpx: Fix infinite loop 2021-08-30 18:39:28 +09:00
Tatsuhiro Tsujikawa c50459b81a bpf: use __builtin_memcpy explicitly to build under ubuntu 20.04 2021-08-30 18:34:26 +09:00
Tatsuhiro Tsujikawa 0e52cf76eb bpf: Add -g flag by default 2021-08-30 18:33:27 +09:00
Tatsuhiro Tsujikawa 0baf725073 Remove unneeded include files 2021-08-30 18:32:58 +09:00
Tatsuhiro Tsujikawa e77fd7ddb9 Build libbpf on CI 2021-08-29 22:08:42 +09:00
Tatsuhiro Tsujikawa e5cb5dca61 Fix reuseport_kern.c to work under ubuntu 20.04 2021-08-29 21:09:27 +09:00
Tatsuhiro Tsujikawa 7941b559c5 Fix libbpf configure help message 2021-08-29 21:08:41 +09:00
Tatsuhiro Tsujikawa 58d81dbc52 nghttpx: Send Stateless Reset in response to Short packet only for now 2021-08-29 21:08:41 +09:00
Tatsuhiro Tsujikawa 2b4dc4496f nghttpx: Forward QUIC UDP datagram to lingering worker in graceful shutdown
Forward QUIC UDP datagram to lingering worker process which is in
graceful shutdown.  Both SIGHUP and SIGUSR2 work.  To make this work
correctly, eBPF is required.
2021-08-29 18:35:41 +09:00
Tatsuhiro Tsujikawa c5e9d0096a nghttpx: Fix crash when ConnectionHandler is deleted while doing memcached request 2021-08-29 17:17:36 +09:00
Tatsuhiro Tsujikawa c6f9780b1b Add accidentally deleted BPFCFLAGS 2021-08-29 15:47:45 +09:00
Tatsuhiro Tsujikawa ef694923f7 Provide enum bpf_stats_type if not defined in linux/bpf.h for older kernel 2021-08-29 14:30:59 +09:00
Tatsuhiro Tsujikawa 8d02203bb6 Add LIBBPF_CFLAGS for eBPF program and nghttpx 2021-08-29 13:58:10 +09:00
Tatsuhiro Tsujikawa 1e75be3b5d Find libbpf with pkg-config 2021-08-29 13:43:07 +09:00
Tatsuhiro Tsujikawa 7d13891066 nghttpx: Rename eBPF options 2021-08-27 21:34:18 +09:00
Tatsuhiro Tsujikawa 4292bd7ad9 nghttpx: Set max udp payload size to IPv4 minimum payload size for now 2021-08-27 21:26:50 +09:00
Tatsuhiro Tsujikawa 82cd110dbe nghttpx: Use SHRPX_MAX_UDP_PAYLOAD_SIZE 2021-08-27 21:13:26 +09:00
Tatsuhiro Tsujikawa d2729193c7 nghttpx: Add --frontend-http3-max-concurrent-streams option 2021-08-27 21:11:03 +09:00
Tatsuhiro Tsujikawa 87fb325357 nghttpx: Add window size options for HTTP/3 connection 2021-08-27 21:02:45 +09:00
Tatsuhiro Tsujikawa fb8ff7b892 nghttpx: Format duration for frontend-quic-idle-timeout default value 2021-08-27 19:52:24 +09:00
Tatsuhiro Tsujikawa 5aeae7444f nghttpx: Add --frontend-quic-debug-log option 2021-08-27 19:16:25 +09:00
Tatsuhiro Tsujikawa c9b11e9fbf nghttpx: Rename --quic-idle-timeout to --frontend-quic-idle-timeout 2021-08-27 19:03:06 +09:00
Tatsuhiro Tsujikawa 0005efa508 nghttpx: --frontend-http3-read-timeout should be noop if HTTP/3 is disabled 2021-08-27 18:45:19 +09:00
Tatsuhiro Tsujikawa 6931cb9d65 nghttpx: Add --quic-idle-timeout option 2021-08-27 18:44:33 +09:00
Tatsuhiro Tsujikawa c1bcf0f11a nghttpx: Do not dump HTTP/3 header fields 2021-08-27 18:35:27 +09:00
Tatsuhiro Tsujikawa 717e7ae8b2 nghttpx: Add --frontend-http3-read-timeout option
Add --frontend-http3-read-timeout option.  QUIC idle timeout option
will be added later.
2021-08-27 18:29:06 +09:00
Tatsuhiro Tsujikawa bed00fb8e1 nghttpx: Use buf.size() 2021-08-27 18:20:17 +09:00
Tatsuhiro Tsujikawa 2010401b81 nghttpx: Send APPLICATION_CLOSE on app read timeout 2021-08-27 18:19:44 +09:00
Tatsuhiro Tsujikawa 23e09e3b3c Mention libbpf-dev in README.rst 2021-08-26 22:12:54 +09:00
Tatsuhiro Tsujikawa 80c9d46b70 Update doc 2021-08-26 22:10:02 +09:00
Tatsuhiro Tsujikawa 0aa107426c Bump QUIC flavored OpenSSL 2021-08-26 21:41:06 +09:00
Tatsuhiro Tsujikawa 1517c77d9c h2load: Do not use legacy QUIC transport_parameters code point 2021-08-26 21:34:49 +09:00
Tatsuhiro Tsujikawa 51bf79bb8c nghttpx: Add --http2-altsvc option 2021-08-26 21:34:49 +09:00
Tatsuhiro Tsujikawa d88eadff13 nghttpx: Make sure each quic frontend endpoint has a unique address 2021-08-26 21:34:49 +09:00
Tatsuhiro Tsujikawa 0d35e8e15e nghttpx: Do not allow quic on UNIX domain socket for now 2021-08-26 21:34:49 +09:00
Tatsuhiro Tsujikawa a0066a1ccf nghttpx: Send NEW_TOKEN and very token from client 2021-08-26 21:34:49 +09:00
Tatsuhiro Tsujikawa 7a5082e8c4 nghttpx: Clean up confusing dcid/scid mixup 2021-08-26 21:34:49 +09:00
Tatsuhiro Tsujikawa dfc345756c nghttpx: Send Retry packet 2021-08-26 21:34:49 +09:00
Tatsuhiro Tsujikawa 137da6adf6 nghttpx: Generate and set QUIC secrets 2021-08-26 21:34:49 +09:00
Tatsuhiro Tsujikawa 8563ec5a7a nghttpx: Add options to specify eBPF program file path and disable eBPF 2021-08-26 21:34:49 +09:00
Tatsuhiro Tsujikawa 8ac4bee3bc nghttpx: Add eBPF program to steer QUIC datagram to a correct socket 2021-08-26 21:34:49 +09:00
Tatsuhiro Tsujikawa 579fb478b5 nghttpx: Fix heap-use-after-free on initialization failure 2021-08-26 13:26:37 +09:00
Tatsuhiro Tsujikawa 33c580ebbf Forward QUIC packet to the correct worker 2021-08-23 22:21:48 +09:00
Tatsuhiro Tsujikawa ff389b3e97 Merge branch 'quic' 2021-08-23 18:41:35 +09:00
Tatsuhiro Tsujikawa 50fe8e7852 Check the availability of SSL_is_quic 2021-08-22 23:59:09 +09:00
Tatsuhiro Tsujikawa cdb6d19989 Enable HTTP/3 build for cmake on CI 2021-08-22 23:54:29 +09:00
Tatsuhiro Tsujikawa 29694e2945 nghttpx: Fix build error regarding RAND_bytes 2021-08-22 23:54:29 +09:00
Tatsuhiro Tsujikawa 9fe08d3913 nghttpx: Fix build without mruby 2021-08-22 23:54:29 +09:00
Tatsuhiro Tsujikawa c07a0d9005 Allow HTTP/3 in cmake build 2021-08-22 23:54:29 +09:00
Tatsuhiro Tsujikawa cbd45478e0 Cleanup flags/libs order 2021-08-22 23:54:29 +09:00
Tatsuhiro Tsujikawa 6f243108e9 nghttpx: Fix CI build error 2021-08-22 23:54:29 +09:00
Tatsuhiro Tsujikawa 0dcdf7ae21 Run http3 build on CI 2021-08-22 23:54:29 +09:00
Tatsuhiro Tsujikawa e7ef2bec8b Rename h2load Dockerfile to Dockerfile-h2load-http3 2021-08-22 23:54:29 +09:00
Tatsuhiro Tsujikawa 4f4dce82c6 Update h2load Dockerfile 2021-08-22 23:54:29 +09:00
Tatsuhiro Tsujikawa a619e7a88c Define UDP_SEGMENT if linux/udp.h has it 2021-08-22 23:54:29 +09:00
Tatsuhiro Tsujikawa 102d960106 nghttpx: Compile without UDP_SEGMENT 2021-08-22 23:54:29 +09:00
Tatsuhiro Tsujikawa 7de71b29a0 Update doc 2021-08-22 23:54:29 +09:00
Tatsuhiro Tsujikawa 4eced8a393 Build without HTTP/3 support 2021-08-22 23:54:29 +09:00
Tatsuhiro Tsujikawa 710b9c35e5
Merge pull request #1610 from amirlivneh/comment-typo
Fix reference to non-existing nghttp2_option_set_max_send_header_block_size() in comment
2021-08-22 23:35:05 +09:00
Tatsuhiro Tsujikawa f46984d218 nghttpx: Enable QUIC 0RTT 2021-08-21 18:34:08 +09:00
Tatsuhiro Tsujikawa 44663a7e6e nghttpx: Handle backend reset and early response 2021-08-21 18:34:08 +09:00
Tatsuhiro Tsujikawa 446124f378 nghttpx: Process request body 2021-08-21 18:34:08 +09:00
Tatsuhiro Tsujikawa c45f2085d5 nghttpx: Fix veccnt assertion 2021-08-21 18:34:08 +09:00
Tatsuhiro Tsujikawa 3abf62b41a nghttpx: Send stateless reset token in TP 2021-08-21 18:34:08 +09:00
Tatsuhiro Tsujikawa 9b2982510e nghttpx: Send stateless reset 2021-08-21 18:34:08 +09:00
Tatsuhiro Tsujikawa 48bb1ebe01 nghttpx: Add configuration to enable ngtcp2 logging (no cmd-line opt yet) 2021-08-21 18:34:08 +09:00
Tatsuhiro Tsujikawa fe4c6e4c56 nghttpx: Generate stateless reset secret 2021-08-21 18:34:08 +09:00
Tatsuhiro Tsujikawa 37bd9ffc48 nghttpx: Implement http_reset_stream and http_send_stop_sending 2021-08-21 18:34:08 +09:00
Tatsuhiro Tsujikawa b0548b4944 nghttpx: Complete HTTP request and response 2021-08-21 18:34:08 +09:00
Tatsuhiro Tsujikawa 12425556c1 nghttpx: Extend Downstream stream_id to 64 bits 2021-08-21 18:34:07 +09:00
Tatsuhiro Tsujikawa 3ed2da562b nghttpx: Add HTTP3 skeleton and minor SSL_CTX fix 2021-08-21 18:34:07 +09:00
Tatsuhiro Tsujikawa 354f46d8c5 nghttpx: Add QUIC timeouts 2021-08-21 18:34:07 +09:00
Tatsuhiro Tsujikawa e70f0db83c nghttpx: QUIC handshake now works 2021-08-21 18:34:07 +09:00
Tatsuhiro Tsujikawa 49b8c56fde nghttpx: Use existing QUIC error object 2021-08-21 18:34:07 +09:00
Tatsuhiro Tsujikawa 940fdd5573 nghttpx: Read quic packet 2021-08-21 18:34:04 +09:00
Tatsuhiro Tsujikawa ef53db201e nghttpx: Create QUIC SSL_CTX
We choose an easier route to duplicate SSL_CTX for QUIC.
2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa aeb0b0728d nghttpx: Add QUICConnectionHandler and HTTP3Upstream skeleton 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa 8b2746abf1 nghttpx: Add QUICListener 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa 01da060496 nghttpx: Create quic server socket 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa 20cbd269c4 Compile with the latest ngtcp2 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa 7c2cd43dfa Compile with the latest ngtcp2 and nghttp3 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa de5feff720 Compile with the latest nghttp3 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa 7342de837d Compile with the latest ngtcp2 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa aa2c648918 Just use h3 ALPN 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa e914b50d16 Compile with the latest ngtcp2 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa f79554f918 Count outgoing packets 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa 213cc9c4b5 Enlarge receive buffer 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa 05f3b8fa0f Adopt ngtcp2_crypto_recv_crypto_data_cb 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa bc53624133 Do not specify max_udp_payload_size for now 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa 5944d034da Avoid std::ostringstream 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa df400feb61 make clang-format 2021-08-21 18:33:39 +09:00
Hajime Fujita 48e10c57da h2load: Add qlog output support 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa 1eb818b64c QUIC UDP GSO 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa 0954932091 Rewrite docker file
Rewrite docker file so that:

- avoid k8s debian-base
- build h2load as statically as possible
2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa e584d9cd2e Measure the number of UDP datagrams sent and received 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa 4d140ea6bd Update Dockerfile 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa 09a2e50fc2 Support both h3 and h3-29 ALPN and their corresponding QUIC versions 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa 35d8ef33ef Compile with the latest ngtcp2 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa f1ff2af47a Deal with 0 length HTTP data write case 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa d2d2c31ec7 Follow ngtcp2_conn_writev_stream specification change 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa 95102c1c6c Compile with the latest ngtcp2 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa fa8c16ae01 Compile with the latest ngtcp2 and nghttp3 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa 7ca2a8213d h2load: Enable --data for HTTP/3 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa 1c8e5046e5 Compile with the latest ngtcp2 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa 68a5652733 Build with draft-32 openssl 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa 6b4be30c64 Cap --window-bits to 26 for QUIC 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa 6ce952ad4a Set X25519 as default 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa 5ae62dd9d7 Cap --window-bits to 23 for QUIC 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa 51987107a2 Compile with the latest ngtcp2 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa e4a8c4813c Compile with the latest ngtcp2 2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa 3d708f7dc4 Compile with the latest ngtcp2 2021-08-21 18:33:39 +09:00
George Liu 4b5bcb56bc fix quic branch Dockerfile
libjemalloc1 package doesn't exist as it's now libjemalloc2 named

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

fix reference to OpenSSL 1.1.1 branch

Cloning into 'openssl'...
warning: Could not find remote branch OpenSSL_1_1_1d-quic-draft-29 to clone.
fatal: Remote branch OpenSSL_1_1_1d-quic-draft-29 not found in upstream origin
2021-08-21 18:33:39 +09:00
Tatsuhiro Tsujikawa 10ec8c9558 Compile with the latest ngtcp2 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 3900f758ea QUIC needs termination without session 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa a3346fbad8 Compile with latest ngtcp2 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa f73d58d74e quic draft-29 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 813d5e1ddf Compile with latest ngtcp2 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa acb661df72 Fix bug for platform which does not have SOCK_NONBLOCK 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 4bc7710de9 Fix compile error 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa b8c1f4f138 Compile with latest ngtcp2 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 387b67472c Compile latest ngtcp2 crypto lib 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa b2c099bac6 Use ngtcp2_conn_handle_expiry 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 1acebb1cc4 draft-28 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 8d89a8dcb0 Assert ndatalen 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa a60a34331b Revert "Ensure complete packet is written"
This reverts commit c19046b09f8e66713f0e067f986ed92d676eb6b6.
2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 749015eb86 Ensure complete packet is written 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 4b45142e72 Fix compile error with the latest ngtcp2 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 76009ce7b9 draft-27 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 2722119776 Handle stream limit increment 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa c724585bce Update Dockerfile 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 0b61e46f95 draft-25 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 5c0da486b9 Remove unused member function declaration 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 9701e5e6e4 Fix compile error 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 1684091234 Bump base image and use OpenSSL_1_1_1d-quic-draft-24 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa a93eb8b8f5 Optimize QUIC write 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa c591ab5e6f Only count STREAM data as bytes_total 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa b3fbebed55 Use correct type 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 4621f88441 Follow ngtcp2 API update 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 747edb3a99 quic draft-24 2021-08-21 18:33:38 +09:00
Dmitri Tikhonov 558970e281 Update Dockerfile to use I-D 23 branches of ngtcp2 and openssl 2021-08-21 18:33:38 +09:00
Lucas Pardue 73fd20a608 Add SSLKEYLOGFILE support 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 78c2c33b9e Compile with the latest ngtcp2 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 610add1f59 Send SNI 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 655510ce28 h3-23 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa f7414700f4 Small adjustment of successful HTTP/3 error code
Non-zero successful error code is a bit annoying because ngtcp2 does
not know it.  Enforcing successful application error code to 0 is a
lot simpler.
2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 53a860a5bf Simplify write_quic 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 1aae450303 Handle sending just fine 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa b3a2f8837c Avoid setting 0 to repeat field 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 33d2a93294 Add missing acked_stream_data_offset callback 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 2da0db70de Fix return value 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 8b5cbf8066 Update doc 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 9668563801 Update docker build and doc 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa ff7067f3a3 Compile with the latest ngtcp2 and ngtcp2_crypto_openssl 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 6b8b152444 Remove error handling which does not happen 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 3dbe3b3e7f Follow ngtcp2 API changes and use libngtcp2_crypto_openssl 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 7aa4bff97b quic: Support TLS_AES_128_CCM_SHA256 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 6002fac9f1 h2load: Add --tls13-ciphers option 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 231c6ac862 Add Dockerfile 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa c3eb7e1634 Handle preferred address 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 05a6ee2b49 Show ngtcp2 debug log with --verbose 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 94d76c042d h2load: Add --groups option 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 23ccaa6191 Always call write_quic when timer expires 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 476e9d0a48 h3-22 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 7cd5ed6fc6 Handle Retry 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 750c23f319 quic: Configure settings with options 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa bb36df8b2e h2load: Fix possible deadlock 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 470c43a986 Fix link 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 8ea78e8361 Add build instruction 2021-08-21 18:33:38 +09:00
Tatsuhiro Tsujikawa 9c748d20d5 [WIP] Add QUIC to h2load 2021-08-21 18:33:38 +09:00
Amir Livneh af15b22b03
Fix reference to non-existing nghttp2_option_set_max_send_header_block_size() in comment 2021-08-19 13:14:58 -04:00
Tatsuhiro Tsujikawa 80c9c705b8
Merge pull request #1607 from nghttp2/dnf
Add "dnf" (= "do not forward") parameter to backend option
2021-08-14 17:35:20 +09:00
Tatsuhiro Tsujikawa 138419d232 Add "dnf" (= "do not forward") parameter to backend option 2021-08-14 17:16:21 +09:00
Tatsuhiro Tsujikawa 8cee15bc5a
Merge pull request #1603 from JackyYin/improve-doc
update doc for nghttp2_session_mem_recv
2021-08-10 21:25:41 +09:00
Jacky_Yin 8113974b26 doc: update document for nghttp2_session_mem_recv 2021-08-09 23:54:07 +08:00
Tatsuhiro Tsujikawa 2b70cefd48
Merge pull request #1598 from danbev/programmers_guide_typo
Fix typo in programmers-guide.rst
2021-08-08 15:49:43 +09:00
Tatsuhiro Tsujikawa 16054d4bfd
Merge pull request #1602 from lhuang04/file_read_callback_prototype_mismatch
Fix prototype mismatch for function 'file_read_callback'
2021-08-08 15:48:55 +09:00
lhuang04 c2d4a53b67 Fix prototype mismatch for function 'file_read_callback'
Summary:
The [data_flags](https://github.com/lhuang04/nghttp2/blob/master/src/HttpServer.cc#L1078) is defined as `uint32_t*` in definition, but delared as [int*](https://github.com/lhuang04/nghttp2/blob/master/src/HttpServer.h#L245) in the prototype.

```
stderr: error: no previous prototype for function 'file_read_callback' [-Werror,-Wmissing-prototypes]
ssize_t file_read_callback(nghttp2_session *session, int32_t stream_id,
        ^
```

Test Plan:

Reviewers:

Subscribers:

Tasks:

Tags:
2021-08-07 07:24:21 -07:00
Daniel Bevenius 3448b1c78c Fix typo in programmers-guide.rst 2021-07-26 14:44:15 +02:00
329 changed files with 25194 additions and 17174 deletions

View File

@ -2,6 +2,7 @@
Language: Cpp
AccessModifierOffset: -2
AlignAfterOpenBracket: Align
AlignArrayOfStructures: None
AlignConsecutiveMacros: None
AlignConsecutiveAssignments: None
AlignConsecutiveBitFields: None
@ -10,7 +11,6 @@ AlignEscapedNewlines: Right
AlignOperands: Align
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: true
AllowAllConstructorInitializersOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortEnumsOnASingleLine: true
AllowShortBlocksOnASingleLine: Never
@ -58,23 +58,28 @@ BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: true
ColumnLimit: 80
CommentPragmas: '^ IWYU pragma:'
QualifierAlignment: Leave
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DeriveLineEnding: true
DerivePointerAlignment: false
DisableFormat: false
EmptyLineAfterAccessModifier: Never
EmptyLineBeforeAccessModifier: LogicalBlock
ExperimentalAutoDetectBinPacking: false
PackConstructorInitializers: NextLine
BasedOnStyle: ''
ConstructorInitializerAllOnOneLineOrOnePerLine: false
AllowAllConstructorInitializersOnNextLine: true
FixNamespaceComments: true
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
StatementAttributeLikeMacros:
- Q_EMIT
IfMacros:
- KJ_IF_MAYBE
IncludeBlocks: Preserve
IncludeCategories:
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
@ -91,6 +96,7 @@ IncludeCategories:
CaseSensitive: false
IncludeIsMainRegex: '$'
IncludeIsMainSourceRegex: ''
IndentAccessModifiers: false
IndentCaseLabels: false
IndentCaseBlocks: false
IndentGotoLabels: true
@ -103,6 +109,7 @@ InsertTrailingCommas: None
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: true
LambdaBodyIndentation: Signature
MacroBlockBegin: ''
MacroBlockEnd: ''
MaxEmptyLinesToKeep: 1
@ -116,14 +123,20 @@ PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakOpenParenthesis: 0
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 60
PenaltyIndentedWhitespace: 0
PointerAlignment: Right
PPIndentWidth: -1
ReferenceAlignment: Pointer
ReflowComments: true
SortIncludes: false
RemoveBracesLLVM: false
SeparateDefinitionBlocks: Leave
ShortNamespaceLines: 1
SortIncludes: Never
SortJavaStaticImport: Before
SortUsingDeclarations: true
SpaceAfterCStyleCast: false
@ -135,20 +148,33 @@ SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeParensOptions:
AfterControlStatements: true
AfterForeachMacros: true
AfterFunctionDefinitionName: false
AfterFunctionDeclarationName: false
AfterIfMacros: true
AfterOverloadedOperator: false
BeforeNonEmptyParentheses: false
SpaceAroundPointerQualifiers: Default
SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyBlock: false
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: false
SpacesInAngles: Never
SpacesInConditionalStatement: false
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInLineCommentPrefix:
Minimum: 1
Maximum: -1
SpacesInParentheses: false
SpacesInSquareBrackets: false
SpaceBeforeSquareBrackets: false
BitFieldColonSpacing: Both
Standard: Latest
StatementAttributeLikeMacros:
- Q_EMIT
StatementMacros:
- Q_UNUSED
- QT_REQUIRE_VERSION

View File

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

4
.gitignore vendored
View File

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

View File

@ -1,89 +0,0 @@
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

18
AUTHORS
View File

@ -19,6 +19,7 @@ Alek Storm
Alex Nalivko
Alexandros Konstantinakis-Karmis
Alexis La Goutte
Amir Livneh
Amir Pakdel
Anders Bakken
Andreas Pohl
@ -34,11 +35,15 @@ Bernard Spil
Brendan Heinonen
Brian Card
Brian Suh
Daniel Bevenius
Daniel Evers
Daniel Stenberg
Dave Reisner
David Beitey
David Korczynski
David Weekly
Dimitris Apostolou
Dmitri Tikhonov
Dmitriy Vetutnev
Don
Dylan Plecki
@ -48,9 +53,12 @@ Fabian Wiesel
Gabi Davar
Gaël PORTAY
Geoff Hill
George Liu
Gitai
Google Inc.
Hajime Fujita
Jacky Tian
Jacky_Yin
Jacob Champion
James M Snell
Jan Kundrát
@ -74,25 +82,33 @@ Lorenz Nickel
Lucas Pardue
MATSUMOTO Ryosuke
Marc Bachmann
Marcelo Trylesinski
Matt Rudary
Matt Way
Michael Kaufmann
Mike Conlen
Mike Frysinger
Mike Lothian
Nicholas Hurley
Nora Shoemaker
Paweł Wegner
Pedro Santos
Peeyush Aggarwal
Peter Wu
Piotr Sikora
PufferOverflow
Raul Gutierrez Segales
Remo E
Renaud
Reza Tavakoli
Richard Wolfert
Rick Lei
Ross Smith II
Rudi Heitbaum
Ryo Ota
Scott Mitchell
Sebastiaan Deckers
Shelley Vohr
Simon Frankenberger
Simone Basso
Soham Sinha
@ -127,9 +143,11 @@ es
fangdingjun
jwchoi
kumagi
lhuang04
lstefani
makovich
mod-h2-dev
moparisthebest
robaho
snnn
yuuki-kodama

View File

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

View File

@ -7,24 +7,22 @@ option(ENABLE_APP "Build applications (nghttp, nghttpd, nghttpx and h2load
${ENABLE_APP_DEFAULT})
option(ENABLE_HPACK_TOOLS "Build HPACK tools"
${ENABLE_HPACK_TOOLS_DEFAULT})
option(ENABLE_ASIO_LIB "Build C++ libnghttp2_asio library")
option(ENABLE_EXAMPLES "Build examples"
${ENABLE_EXAMPLES_DEFAULT})
option(ENABLE_PYTHON_BINDINGS "Build Python bindings"
${ENABLE_PYTHON_BINDINGS_DEFAULT})
option(ENABLE_FAILMALLOC "Build failmalloc test program" ON)
option(ENABLE_LIB_ONLY "Build libnghttp2 only. This is a short hand for -DENABLE_APP=0 -DENABLE_EXAMPLES=0 -DENABLE_HPACK_TOOLS=0 -DENABLE_PYTHON_BINDINGS=0")
option(ENABLE_LIB_ONLY "Build libnghttp2 only. This is a short hand for -DENABLE_APP=0 -DENABLE_EXAMPLES=0 -DENABLE_HPACK_TOOLS=0")
option(ENABLE_STATIC_LIB "Build libnghttp2 in static mode also")
option(ENABLE_SHARED_LIB "Build libnghttp2 as a shared library" ON)
option(ENABLE_STATIC_CRT "Build libnghttp2 against the MS LIBCMT[d]")
option(ENABLE_HTTP3 "Enable HTTP/3 support" OFF)
option(ENABLE_DOC "Build documentation" ON)
option(WITH_LIBXML2 "Use libxml2"
${WITH_LIBXML2_DEFAULT})
option(WITH_JEMALLOC "Use jemalloc"
${WITH_JEMALLOC_DEFAULT})
option(WITH_SPDYLAY "Use spdylay"
${WITH_SPDYLAY_DEFAULT})
option(WITH_MRUBY "Use mruby")
option(WITH_NEVERBLEED "Use neverbleed")
option(WITH_LIBBPF "Use libbpf")
# vim: ft=cmake:

View File

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

View File

@ -20,19 +20,14 @@
# 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.
SUBDIRS = lib third-party src examples python tests integration-tests \
SUBDIRS = lib third-party src bpf examples tests integration-tests \
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
dist_doc_DATA = README.rst
EXTRA_DIST = nghttpx.conf.sample proxy.pac.sample android-config android-make \
EXTRA_DIST = nghttpx.conf.sample proxy.pac.sample android-config android-env \
Dockerfile.android \
cmakeconfig.h.in \
CMakeLists.txt \
@ -42,20 +37,23 @@ EXTRA_DIST = nghttpx.conf.sample proxy.pac.sample android-config android-make \
cmake/FindLibev.cmake \
cmake/FindCUnit.cmake \
cmake/Version.cmake \
cmake/FindCython.cmake \
cmake/FindLibevent.cmake \
cmake/FindJansson.cmake \
cmake/FindLibcares.cmake \
cmake/FindSystemd.cmake
cmake/FindSystemd.cmake \
cmake/FindLibbpf.cmake \
cmake/FindLibnghttp3.cmake \
cmake/FindLibngtcp2.cmake \
cmake/FindLibngtcp2_crypto_openssl.cmake
.PHONY: clang-format
# Format source files using clang-format. Don't format source files
# under third-party directory since we are not responsible for thier
# under third-party directory since we are not responsible for their
# coding style.
clang-format:
CLANGFORMAT=`git config --get clangformat.binary`; \
test -z $${CLANGFORMAT} && CLANGFORMAT="clang-format"; \
$${CLANGFORMAT} -i lib/*.{c,h} lib/includes/nghttp2/*.h \
src/*.{c,cc,h} src/includes/nghttp2/*.h examples/*.{c,cc} \
tests/*.{c,h}
src/*.{c,cc,h} examples/*.{c,cc} \
tests/*.{c,h} bpf/*.c fuzz/*.cc

36
Makefile.os4 Normal file
View File

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

View File

@ -11,46 +11,14 @@ HTTP/2.
An HPACK encoder and decoder are available as a public API.
An experimental high level C++ library is also available.
We have Python bindings of this library, but we do not have full
code coverage yet.
Running h2load against HTTP/3 server
------------------------------------
In order to build h2load with HTTP/3 support, you have to build
ngtcp2, nghttp3 and my patched OpenSSL.
https://github.com/ngtcp2/ngtcp2#build-from-git describes how to build
these three software.
To run h2load against HTTP/3 server, specify h3 ALPN with
``--npn-list`` option like so:
.. code-block:: text
$ h2load --npn-list h3 https://127.0.0.1:4433
You can use Dockerfile to skip the tedious build steps to manually
pull and build dependencies. In order to build Docker image, do this:
.. code-block:: text
$ cd docker
$ docker build -t nghttp2-quic .
Run h2load:
.. code-block:: text
$ docker run --rm -it --network=host nghttp2-quic /usr/local/bin/h2load --npn-list h3 https://127.0.0.1:4433
Development Status
------------------
We have implemented `RFC 7540 <https://tools.ietf.org/html/rfc7540>`_
HTTP/2 and `RFC 7541 <https://tools.ietf.org/html/rfc7541>`_ HPACK -
Header Compression for HTTP/2
nghttp2 was originally developed based on `RFC 7540
<https://tools.ietf.org/html/rfc7540>`_ HTTP/2 and `RFC 7541
<https://tools.ietf.org/html/rfc7541>`_ HPACK - Header Compression for
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
(https://github.com/tatsuhiro-t/spdylay) project.
@ -61,12 +29,14 @@ Public Test Server
The following endpoints are available to try out our nghttp2
implementation.
* https://nghttp2.org/ (TLS + ALPN/NPN)
* https://nghttp2.org/ (TLS + ALPN/NPN and HTTP/3)
This endpoint supports ``h2``, ``h2-16``, ``h2-14``, and
``http/1.1`` via ALPN/NPN and requires TLSv1.2 for HTTP/2
connection.
It also supports HTTP/3.
* http://nghttp2.org/ (HTTP Upgrade and HTTP/2 Direct)
``h2c`` and ``http/1.1``.
@ -133,27 +103,6 @@ To mitigate heap fragmentation in long running server programs
Alpine Linux currently does not support malloc replacement
due to musl limitations. See details in issue `#762 <https://github.com/nghttp2/nghttp2/issues/762>`_.
libnghttp2_asio C++ library requires the following packages:
* libboost-dev >= 1.54.0
* libboost-thread-dev >= 1.54.0
The Python bindings require the following packages:
* cython >= 0.19
* python >= 3.8
* 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
<https://github.com/mruby/mruby>`_ is required. We need to build
mruby with C++ ABI explicitly turned on, and probably need other
@ -174,6 +123,33 @@ minimizes the risk of private key leakage when serious bug like
Heartbleed is exploited. The neverbleed is disabled by default. To
enable it, use ``--with-neverbleed`` configure option.
To enable the experimental HTTP/3 support for h2load and nghttpx, the
following libraries are required:
* `OpenSSL with QUIC support
<https://github.com/quictls/openssl/tree/OpenSSL_1_1_1s+quic>`_; or
`BoringSSL <https://boringssl.googlesource.com/boringssl/>`_ (commit
31bad2514d21f6207f3925ba56754611c462a873)
* `ngtcp2 <https://github.com/ngtcp2/ngtcp2>`_ >= 0.10.0
* `nghttp3 <https://github.com/ngtcp2/nghttp3>`_ >= 0.7.0
Use ``--enable-http3`` configure option to enable HTTP/3 feature for
h2load and nghttpx.
In order to build optional eBPF program to direct an incoming QUIC UDP
datagram to a correct socket for nghttpx, the following libraries are
required:
* libbpf-dev >= 0.7.0
Use ``--with-libbpf`` configure option to build eBPF program.
libelf-dev is needed to build libbpf.
For Ubuntu 20.04, you can build libbpf from `the source code
<https://github.com/libbpf/libbpf/releases/tag/v1.0.1>`_. nghttpx
requires eBPF program for reloading its configuration and hot swapping
its executable.
Compiling libnghttp2 C source code requires a C99 compiler. gcc 4.8
is known to be adequate. In order to compile the C++ source code, gcc
>= 6.0 or clang >= 6.0 is required. C++ source code requires C++14
@ -224,6 +200,18 @@ language features.
responsible to specify the correct values to these variables. For
complete list of these variables, run ``./configure -h``.
If you are using Ubuntu 22.04 LTS, run the following to install the
required packages:
.. code-block:: text
sudo apt-get install g++ clang make binutils autoconf automake \
autotools-dev libtool pkg-config \
zlib1g-dev libcunit1-dev libssl-dev libxml2-dev libev-dev \
libevent-dev libjansson-dev \
libc-ares-dev libjemalloc-dev libsystemd-dev \
ruby-dev bison libelf-dev
Building nghttp2 from release tar archive
-----------------------------------------
@ -336,6 +324,87 @@ The generated documents will not be installed with ``make install``.
The online documentation is available at
https://nghttp2.org/documentation/
Build HTTP/3 enabled h2load and nghttpx
---------------------------------------
To build h2load and nghttpx with HTTP/3 feature enabled, run the
configure script with ``--enable-http3``.
For nghttpx to reload configurations and swapping its executable while
gracefully terminating old worker processes, eBPF is required. Run
the configure script with ``--enable-http3 --with-libbpf`` to build
eBPF program. The QUIC keying material must be set with
``--frontend-quic-secret-file`` in order to keep the existing
connections alive during reload.
The detailed steps to build HTTP/3 enabled h2load and nghttpx follow.
Build custom OpenSSL:
.. code-block:: text
$ git clone --depth 1 -b OpenSSL_1_1_1s+quic https://github.com/quictls/openssl
$ cd openssl
$ ./config --prefix=$PWD/build --openssldir=/etc/ssl
$ make -j$(nproc)
$ make install_sw
$ cd ..
Build nghttp3:
.. code-block:: text
$ git clone --depth 1 -b v0.8.0 https://github.com/ngtcp2/nghttp3
$ cd nghttp3
$ autoreconf -i
$ ./configure --prefix=$PWD/build --enable-lib-only
$ make -j$(nproc)
$ make install
$ cd ..
Build ngtcp2:
.. code-block:: text
$ git clone --depth 1 -b v0.12.0 https://github.com/ngtcp2/ngtcp2
$ cd ngtcp2
$ autoreconf -i
$ ./configure --prefix=$PWD/build --enable-lib-only \
PKG_CONFIG_PATH="$PWD/../openssl/build/lib/pkgconfig"
$ make -j$(nproc)
$ make install
$ cd ..
If your Linux distribution does not have libbpf-dev >= 0.7.0, build
from source:
.. code-block:: text
$ git clone --depth 1 -b v1.0.1 https://github.com/libbpf/libbpf
$ cd libbpf
$ PREFIX=$PWD/build make -C src install
$ cd ..
Build nghttp2:
.. code-block:: text
$ git clone https://github.com/nghttp2/nghttp2
$ cd nghttp2
$ git submodule update --init
$ autoreconf -i
$ ./configure --with-mruby --with-neverbleed --enable-http3 --with-libbpf \
CC=clang-14 CXX=clang++-14 \
PKG_CONFIG_PATH="$PWD/../openssl/build/lib/pkgconfig:$PWD/../nghttp3/build/lib/pkgconfig:$PWD/../ngtcp2/build/lib/pkgconfig:$PWD/../libbpf/build/lib64/pkgconfig" \
LDFLAGS="$LDFLAGS -Wl,-rpath,$PWD/../openssl/build/lib -Wl,-rpath,$PWD/../libbpf/build/lib64"
$ make -j$(nproc)
The eBPF program ``reuseport_kern.o`` should be found under bpf
directory. Pass ``--quic-bpf-program-file=bpf/reuseport_kern.o``
option to nghttpx to load it. See also `HTTP/3 section in nghttpx -
HTTP/2 proxy - HOW-TO
<https://nghttp2.org/documentation/nghttpx-howto.html#http-3>`_.
Unit tests
----------
@ -763,7 +832,7 @@ information. Here is sample output from ``nghttpd``:
nghttpx - proxy
+++++++++++++++
``nghttpx`` is a multi-threaded reverse proxy for HTTP/2, and
``nghttpx`` is a multi-threaded reverse proxy for HTTP/3, HTTP/2, and
HTTP/1.1, and powers http://nghttp2.org and supports HTTP/2 server
push.
@ -784,16 +853,16 @@ ticket keys among multiple ``nghttpx`` instances via memcached.
``nghttpx`` has 2 operation modes:
================== ================ ================ =============
Mode option Frontend Backend Note
================== ================ ================ =============
default mode HTTP/2, HTTP/1.1 HTTP/1.1, HTTP/2 Reverse proxy
``--http2-proxy`` HTTP/2, HTTP/1.1 HTTP/1.1, HTTP/2 Forward proxy
================== ================ ================ =============
================== ======================== ================ =============
Mode option Frontend Backend Note
================== ======================== ================ =============
default mode HTTP/3, 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
================== ======================== ================ =============
The interesting mode at the moment is the default mode. It works like
a reverse proxy and listens for HTTP/2, and HTTP/1.1 and can be
deployed as a SSL/TLS terminator for existing web server.
a reverse proxy and listens for HTTP/3, HTTP/2, and HTTP/1.1 and can
be deployed as a SSL/TLS terminator for existing web server.
In all modes, the frontend connections are encrypted by SSL/TLS by
default. To disable encryption, use the ``no-tls`` keyword in
@ -811,16 +880,16 @@ server:
.. code-block:: text
Client <-- (HTTP/2, HTTP/1.1) --> nghttpx <-- (HTTP/1.1, HTTP/2) --> Web Server
[reverse proxy]
Client <-- (HTTP/3, HTTP/2, HTTP/1.1) --> nghttpx <-- (HTTP/1.1, HTTP/2) --> Web Server
[reverse proxy]
With the ``--http2-proxy`` option, it works as forward proxy, and it
is so called secure HTTP/2 proxy:
.. code-block:: text
Client <-- (HTTP/2, HTTP/1.1) --> nghttpx <-- (HTTP/1.1) --> Proxy
[secure proxy] (e.g., Squid, ATS)
Client <-- (HTTP/3, HTTP/2, HTTP/1.1) --> nghttpx <-- (HTTP/1.1) --> Proxy
[secure proxy] (e.g., Squid, ATS)
The ``Client`` in the above example needs to be configured to use
``nghttpx`` as secure proxy.
@ -852,7 +921,7 @@ proxy through an HTTP proxy:
.. code-block:: text
Client <-- (HTTP/2, HTTP/1.1) --> nghttpx <-- (HTTP/2) --
Client <-- (HTTP/3, HTTP/2, HTTP/1.1) --> nghttpx <-- (HTTP/2) --
--===================---> HTTP/2 Proxy
(HTTP proxy tunnel) (e.g., nghttpx -s)
@ -860,8 +929,8 @@ proxy through an HTTP proxy:
Benchmarking tool
-----------------
The ``h2load`` program is a benchmarking tool for HTTP/2. The UI of
``h2load`` is heavily inspired by ``weighttp``
The ``h2load`` program is a benchmarking tool for HTTP/3, HTTP/2, and
HTTP/1.1. The UI of ``h2load`` is heavily inspired by ``weighttp``
(https://github.com/lighttpd/weighttp). The typical usage is as
follows:
@ -904,6 +973,14 @@ threads to avoid saturating a single core on client side.
considered a DOS attack. Please only use it against your private
servers.
If the experimental HTTP/3 is enabled, h2load can send requests to
HTTP/3 server. To do this, specify ``h3`` to ``--npn-list`` option
like so:
.. code-block:: text
$ h2load --npn-list h3 https://127.0.0.1:4433
HPACK tools
-----------
@ -1341,219 +1418,6 @@ associated value includes the state of the dynamic header table after the
corresponding header set was processed. The format is the same as
``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.8``).
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 python3
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
------------

View File

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

View File

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

View File

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

13
bpf/CMakeLists.txt Normal file
View File

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

View File

@ -1,6 +1,6 @@
# nghttp2 - HTTP/2 C Library
# Copyright (c) 2014 Tatsuhiro Tsujikawa
# 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
@ -21,9 +21,20 @@
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
EXTRA_DIST = CMakeLists.txt
EXTRA_DIST = CMakeLists.txt reuseport_kern.c
if ENABLE_ASIO_LIB
nobase_include_HEADERS = nghttp2/asio_http2.h nghttp2/asio_http2_client.h \
nghttp2/asio_http2_server.h
endif # ENABLE_ASIO_LIB
if HAVE_LIBBPF
bpf_pkglibdir = $(pkglibdir)
bpf_pkglib_DATA = reuseport_kern.o
all: $(builddir)/reuseport_kern.o
$(builddir)/reuseport_kern.o: reuseport_kern.c
$(CC) @LIBBPF_CFLAGS@ @BPFCFLAGS@ @EXTRABPFCFLAGS@ \
-target bpf -c $< -o $@
clean-local:
-rm -f reuseport_kern.o
endif # HAVE_LIBBPF

663
bpf/reuseport_kern.c Normal file
View File

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

View File

@ -1,44 +0,0 @@
# 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 )

32
cmake/FindLibbpf.cmake Normal file
View File

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

View File

@ -0,0 +1,41 @@
# - 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)

41
cmake/FindLibngtcp2.cmake Normal file
View File

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

View File

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

View File

@ -15,5 +15,5 @@ find_library(SYSTEMD_LIBRARIES NAMES systemd ${PC_SYSTEMD_LIBRARY_DIRS})
find_path(SYSTEMD_INCLUDE_DIRS systemd/sd-login.h HINTS ${PC_SYSTEMD_INCLUDE_DIRS})
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)

View File

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

View File

@ -22,10 +22,10 @@ dnl OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
dnl WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
dnl Do not change user variables!
dnl http://www.gnu.org/software/automake/manual/html_node/Flag-Variables-Ordering.html
dnl https://www.gnu.org/software/automake/manual/html_node/Flag-Variables-Ordering.html
AC_PREREQ(2.61)
AC_INIT([nghttp2], [1.45.0-DEV], [t-tujikawa@users.sourceforge.net])
AC_INIT([nghttp2], [1.52.0-DEV], [t-tujikawa@users.sourceforge.net])
AC_CONFIG_AUX_DIR([.])
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_HEADERS([config.h])
@ -43,10 +43,10 @@ AM_INIT_AUTOMAKE([subdir-objects])
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
dnl See versioning rule:
dnl http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
AC_SUBST(LT_CURRENT, 34)
AC_SUBST(LT_REVISION, 2)
AC_SUBST(LT_AGE, 20)
dnl https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
AC_SUBST(LT_CURRENT, 38)
AC_SUBST(LT_REVISION, 1)
AC_SUBST(LT_AGE, 24)
major=`echo $PACKAGE_VERSION |cut -d. -f1 | sed -e "s/[^0-9]//g"`
minor=`echo $PACKAGE_VERSION |cut -d. -f2 | sed -e "s/[^0-9]//g"`
@ -82,21 +82,11 @@ AC_ARG_ENABLE([hpack-tools],
[Build HPACK tools [default=check]])],
[request_hpack_tools=$enableval], [request_hpack_tools=check])
AC_ARG_ENABLE([asio-lib],
[AS_HELP_STRING([--enable-asio-lib],
[Build C++ libnghttp2_asio library [default=no]])],
[request_asio_lib=$enableval], [request_asio_lib=no])
AC_ARG_ENABLE([examples],
[AS_HELP_STRING([--enable-examples],
[Build examples [default=check]])],
[request_examples=$enableval], [request_examples=check])
AC_ARG_ENABLE([python-bindings],
[AS_HELP_STRING([--enable-python-bindings],
[Build Python bindings [default=check]])],
[request_python_bindings=$enableval], [request_python_bindings=check])
AC_ARG_ENABLE([failmalloc],
[AS_HELP_STRING([--disable-failmalloc],
[Do not build failmalloc test program])],
@ -104,9 +94,14 @@ AC_ARG_ENABLE([failmalloc],
AC_ARG_ENABLE([lib-only],
[AS_HELP_STRING([--enable-lib-only],
[Build libnghttp2 only. This is a short hand for --disable-app --disable-examples --disable-hpack-tools --disable-python-bindings])],
[Build libnghttp2 only. This is a short hand for --disable-app --disable-examples --disable-hpack-tools])],
[request_lib_only=$enableval], [request_lib_only=no])
AC_ARG_ENABLE([http3],
[AS_HELP_STRING([--enable-http3],
[(EXPERIMENTAL) Enable HTTP/3. This requires ngtcp2, nghttp3, and a custom OpenSSL.])],
[request_http3=$enableval], [request_http3=no])
AC_ARG_WITH([libxml2],
[AS_HELP_STRING([--with-libxml2],
[Use libxml2 [default=check]])],
@ -167,14 +162,22 @@ AC_ARG_WITH([neverbleed],
[Use neverbleed [default=no]])],
[request_neverbleed=$withval], [request_neverbleed=no])
AC_ARG_WITH([cython],
[AS_HELP_STRING([--with-cython=PATH],
[Use cython in given PATH])],
[cython_path=$withval], [])
AC_ARG_WITH([libngtcp2],
[AS_HELP_STRING([--with-libngtcp2],
[Use libngtcp2 [default=check]])],
[request_libngtcp2=$withval], [request_libngtcp2=check])
AC_ARG_WITH([libnghttp3],
[AS_HELP_STRING([--with-libnghttp3],
[Use libnghttp3 [default=check]])],
[request_libnghttp3=$withval], [request_libnghttp3=check])
AC_ARG_WITH([libbpf],
[AS_HELP_STRING([--with-libbpf],
[Use libbpf [default=no]])],
[request_libbpf=$withval], [request_libbpf=no])
dnl Define variables
AC_ARG_VAR([CYTHON], [the Cython executable])
AC_ARG_VAR([LIBEV_CFLAGS], [C compiler flags for libev, skipping any checks])
AC_ARG_VAR([LIBEV_LIBS], [linker flags for libev, skipping any checks])
@ -185,6 +188,8 @@ AC_ARG_VAR([JEMALLOC_LIBS], [linker flags for jemalloc, skipping any checks])
AC_ARG_VAR([LIBTOOL_LDFLAGS],
[libtool specific flags (e.g., -static-libtool-libs)])
AC_ARG_VAR([BPFCFLAGS], [C compiler flags for bpf program])
dnl Checks for programs
AC_PROG_CC
AC_PROG_CXX
@ -202,18 +207,21 @@ if [test "x$request_lib_only" = "xyes"]; then
request_app=no
request_hpack_tools=no
request_examples=no
request_python_bindings=no
fi
if [test "x$request_python_bindings" != "xno"]; then
AX_PYTHON_DEVEL([>= '3.8'])
fi
if test "x${cython_path}" = "x"; then
AC_CHECK_PROGS([CYTHON], [cython.py cython])
else
CYTHON=${cython_path}
AC_SUBST([CYTHON])
request_http3=no
request_libxml2=no
request_jansson=no
request_zlib=no
request_libevent_openssl=no
request_libcares=no
request_openssl=no
request_libev=no
request_jemalloc=no
request_systemd=no
request_mruby=no
request_neverbleed=no
request_libngtcp2=no
request_libnghttp3=no
request_libbpf=no
fi
if test "x$GCC" = "xyes" -o "x$CC" = "xclang" ; then
@ -245,6 +253,7 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
]],
[[
std::vector<std::future<int>> v;
(void)v;
]])],
[AC_DEFINE([HAVE_STD_FUTURE], [1],
[Define to 1 if you have the `std::future`.])
@ -319,8 +328,8 @@ APPLDFLAGS=
case "$host_os" in
*android*)
android_build=yes
# android does not need -pthread, but needs followng 3 libs for C++
APPLDFLAGS="$APPLDFLAGS -lstdc++ -latomic -lsupc++"
# android does not need -pthread, but needs following 2 libs for C++
APPLDFLAGS="$APPLDFLAGS -lstdc++ -latomic"
;;
*)
PTHREAD_LDFLAGS="-pthread"
@ -334,6 +343,13 @@ case "$host_os" in
;;
esac
case "${build}" in
*-apple-darwin*)
EXTRA_DEFS="-D__APPLE_USE_RFC_3542"
AC_SUBST([EXTRA_DEFS])
;;
esac
# zlib
have_zlib=no
if test "x${request_zlib}" != "xno"; then
@ -431,6 +447,37 @@ if test "x${request_openssl}" != "xno"; then
[have_openssl=yes], [have_openssl=no])
if test "x${have_openssl}" = "xno"; then
AC_MSG_NOTICE($OPENSSL_PKG_ERRORS)
else
save_CFLAGS="$CFLAGS"
save_LIBS="$LIBS"
CFLAGS="$OPENSSL_CFLAGS $CFLAGS"
LIBS="$OPENSSL_LIBS $LIBS"
# quictls/openssl has SSL_is_quic.
have_ssl_is_quic=no
AC_MSG_CHECKING([for SSL_is_quic])
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <openssl/ssl.h>
]], [[
SSL *ssl = NULL;
SSL_is_quic(ssl);
]])],
[AC_MSG_RESULT([yes]); have_ssl_is_quic=yes],
[AC_MSG_RESULT([no]); have_ssl_is_quic=no])
# boringssl has SSL_set_quic_early_data_context.
AC_MSG_CHECKING([for SSL_set_quic_early_data_context])
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <openssl/ssl.h>
]], [[
SSL *ssl = NULL;
SSL_set_quic_early_data_context(ssl, NULL, 0);
]])],
[AC_MSG_RESULT([yes]); have_boringssl_quic=yes],
[AC_MSG_RESULT([no]); have_boringssl_quic=no])
CFLAGS="$save_CFLAGS"
LIBS="$save_LIBS"
fi
fi
@ -455,28 +502,124 @@ if test "x${request_libcares}" = "xyes" &&
fi
# ngtcp2 (for src)
PKG_CHECK_MODULES([LIBNGTCP2], [libngtcp2 >= 0.0.0], [have_libngtcp2=yes],
[have_libngtcp2=no])
if test "x${have_libngtcp2}" = "xno"; then
AC_MSG_NOTICE($LIBNGTCP2_PKG_ERRORS)
have_libngtcp2=no
if test "x${request_libngtcp2}" != "xno"; then
PKG_CHECK_MODULES([LIBNGTCP2], [libngtcp2 >= 0.10.0], [have_libngtcp2=yes],
[have_libngtcp2=no])
if test "x${have_libngtcp2}" = "xno"; then
AC_MSG_NOTICE($LIBNGTCP2_PKG_ERRORS)
fi
fi
if test "x${request_libngtcp2}" = "xyes" &&
test "x${have_libngtcp2}" != "xyes"; then
AC_MSG_ERROR([libngtcp2 was requested (--with-libngtcp2) but not found])
fi
# ngtcp2_crypto_openssl (for src)
PKG_CHECK_MODULES([LIBNGTCP2_CRYPTO_OPENSSL],
[libngtcp2_crypto_openssl >= 0.0.0],
[have_libngtcp2_crypto_openssl=yes],
[have_libngtcp2_crypto_openssl=no])
if test "x${have_libngtcp2_crypto_openssl}" = "xno"; then
AC_MSG_NOTICE($LIBNGTCP2_CRYPTO_OPENSSL_PKG_ERRORS)
have_libngtcp2_crypto_openssl=no
if test "x${have_ssl_is_quic}" = "xyes" &&
test "x${request_libngtcp2}" != "xno"; then
PKG_CHECK_MODULES([LIBNGTCP2_CRYPTO_OPENSSL],
[libngtcp2_crypto_openssl >= 0.10.0],
[have_libngtcp2_crypto_openssl=yes],
[have_libngtcp2_crypto_openssl=no])
if test "x${have_libngtcp2_crypto_openssl}" = "xno"; then
AC_MSG_NOTICE($LIBNGTCP2_CRYPTO_OPENSSL_PKG_ERRORS)
else
AC_DEFINE([HAVE_LIBNGTCP2_CRYPTO_OPENSSL], [1],
[Define to 1 if you have `libngtcp2_crypto_openssl` library.])
fi
fi
if test "x${have_ssl_is_quic}" = "xyes" &&
test "x${request_libngtcp2}" = "xyes" &&
test "x${have_libngtcp2_crypto_openssl}" != "xyes"; then
AC_MSG_ERROR([libngtcp2_crypto_openssl was requested (--with-libngtcp2) but not found])
fi
# ngtcp2_crypto_boringssl (for src)
have_libngtcp2_crypto_boringssl=no
if test "x${have_boringssl_quic}" = "xyes" &&
test "x${request_libngtcp2}" != "xno"; then
PKG_CHECK_MODULES([LIBNGTCP2_CRYPTO_BORINGSSL],
[libngtcp2_crypto_boringssl >= 0.0.0],
[have_libngtcp2_crypto_boringssl=yes],
[have_libngtcp2_crypto_boringssl=no])
if test "x${have_libngtcp2_crypto_boringssl}" = "xno"; then
AC_MSG_NOTICE($LIBNGTCP2_CRYPTO_BORINGSSL_PKG_ERRORS)
else
AC_DEFINE([HAVE_LIBNGTCP2_CRYPTO_BORINGSSL], [1],
[Define to 1 if you have `libngtcp2_crypto_boringssl` library.])
fi
fi
if test "x${have_boringssl_quic}" = "xyes" &&
test "x${request_libngtcp2}" = "xyes" &&
test "x${have_libngtcp2_crypto_boringssl}" != "xyes"; then
AC_MSG_ERROR([libngtcp2_crypto_boringssl was requested (--with-libngtcp2) but not found])
fi
# nghttp3 (for src)
PKG_CHECK_MODULES([LIBNGHTTP3], [libnghttp3 >= 0.0.0], [have_libnghttp3=yes],
[have_libnghttp3=no])
if test "x${have_libnghttp3}" = "xno"; then
AC_MSG_NOTICE($LIBNGHTTP3_PKT_ERRORS)
have_libnghttp3=no
if test "x${request_libnghttp3}" != "xno"; then
PKG_CHECK_MODULES([LIBNGHTTP3], [libnghttp3 >= 0.7.0], [have_libnghttp3=yes],
[have_libnghttp3=no])
if test "x${have_libnghttp3}" = "xno"; then
AC_MSG_NOTICE($LIBNGHTTP3_PKG_ERRORS)
fi
fi
if test "x${request_libnghttp3}" = "xyes" &&
test "x${have_libnghttp3}" != "xyes"; then
AC_MSG_ERROR([libnghttp3 was requested (--with-libnghttp3) but not found])
fi
# libbpf (for src)
have_libbpf=no
if test "x${request_libbpf}" != "xno"; then
PKG_CHECK_MODULES([LIBBPF], [libbpf >= 0.7.0], [have_libbpf=yes],
[have_libbpf=no])
if test "x${have_libbpf}" = "xyes"; then
AC_DEFINE([HAVE_LIBBPF], [1], [Define to 1 if you have `libbpf` library.])
if test "x${BPFCFLAGS}" = "x"; then
BPFCFLAGS="-Wall -O2 -g"
fi
# Add the include path for Debian
EXTRABPFCFLAGS="-I/usr/include/$host_cpu-$host_os"
AC_SUBST([EXTRABPFCFLAGS])
AC_MSG_CHECKING([whether enum bpf_stats_type is defined in linux/bpf.h])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
[[
#include <linux/bpf.h>
]],
[[
enum bpf_stats_type foo;
(void)foo;
]])],
[have_bpf_stats_type=yes],
[have_bpf_stats_type=no])
if test "x${have_bpf_stats_type}" = "xyes"; then
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_BPF_STATS_TYPE], [1],
[Define to 1 if you have enum bpf_stats_type in linux/bpf.h.])
else
AC_MSG_RESULT([no])
fi
else
AC_MSG_NOTICE($LIBBPF_PKG_ERRORS)
fi
fi
if test "x${request_libbpf}" = "xyes" &&
test "x${have_libbpf}" != "xyes"; then
AC_MSG_ERROR([libbpf was requested (--with-libbpf) but not found])
fi
AM_CONDITIONAL([HAVE_LIBBPF], [ test "x${have_libbpf}" = "xyes" ])
# libevent_openssl (for examples)
# 2.0.8 is required because we use evconnlistener_set_error_cb()
have_libevent_openssl=no
@ -584,25 +727,6 @@ if test "x${request_jemalloc}" = "xyes" &&
AC_MSG_ERROR([jemalloc was requested (--with-jemalloc) but not found])
fi
# Check Boost Asio library
have_asio_lib=no
if test "x${request_asio_lib}" = "xyes"; then
AX_BOOST_BASE([1.54.0], [have_boost_base=yes], [have_boost_base=no])
if test "x${have_boost_base}" = "xyes"; then
AX_BOOST_ASIO()
AX_BOOST_SYSTEM()
AX_BOOST_THREAD()
if test "x${ax_cv_boost_asio}" = "xyes" &&
test "x${ax_cv_boost_system}" = "xyes" &&
test "x${ax_cv_boost_thread}" = "xyes"; then
have_asio_lib=yes
fi
fi
fi
# The nghttp, nghttpd and nghttpx under src depend on zlib, OpenSSL,
# libev, and libc-ares.
enable_app=no
@ -621,6 +745,26 @@ fi
AM_CONDITIONAL([ENABLE_APP], [ test "x${enable_app}" = "xyes" ])
# Check HTTP/3 support
enable_http3=no
if test "x${request_http3}" != "xno" &&
(test "x${have_ssl_is_quic}" = "xyes" ||
test "x${have_boringssl_quic}" = "xyes") &&
test "x${have_libngtcp2}" = "xyes" &&
(test "x${have_libngtcp2_crypto_openssl}" = "xyes" ||
test "x${have_libngtcp2_crypto_boringssl}" = "xyes") &&
test "x${have_libnghttp3}" = "xyes"; then
enable_http3=yes
AC_DEFINE([ENABLE_HTTP3], [1], [Define to 1 if HTTP/3 is enabled.])
fi
if test "x${request_http3}" = "xyes" &&
test "x${enable_http3}" != "xyes"; then
AC_MSG_ERROR([HTTP/3 was requested (--enable-http3) but dependencies are not met.])
fi
AM_CONDITIONAL([ENABLE_HTTP3], [ test "x${enable_http3}" = "xyes" ])
enable_hpack_tools=no
# HPACK tools requires jansson
if test "x${request_hpack_tools}" != "xno" &&
@ -635,16 +779,6 @@ fi
AM_CONDITIONAL([ENABLE_HPACK_TOOLS], [ test "x${enable_hpack_tools}" = "xyes" ])
# C++ library libnghttp2_asio
enable_asio_lib=no
if test "x${request_asio_lib}" != "xno" &&
test "x${have_asio_lib}" = "xyes"; then
enable_asio_lib=yes
fi
AM_CONDITIONAL([ENABLE_ASIO_LIB], [ test "x${enable_asio_lib}" = "xyes" ])
# The example programs depend on OpenSSL and libevent_openssl
enable_examples=no
if test "x${request_examples}" != "xno" &&
@ -667,8 +801,7 @@ have_mruby=no
have_neverbleed=no
if test "x${enable_examples}" = "xyes" ||
test "x${enable_app}" = "xyes" ||
test "x${enable_hpack_tools}" = "xyes" ||
test "x${enable_asio_lib}" = "xyes"; then
test "x${enable_hpack_tools}" = "xyes"; then
enable_third_party=yes
# mruby (for src/nghttpx)
@ -693,27 +826,6 @@ AM_CONDITIONAL([ENABLE_THIRD_PARTY], [ test "x${enable_third_party}" = "xyes" ])
AM_CONDITIONAL([HAVE_MRUBY], [test "x${have_mruby}" = "xyes"])
AM_CONDITIONAL([HAVE_NEVERBLEED], [test "x${have_neverbleed}" = "xyes"])
# Python bindings
enable_python_bindings=no
if test "x${request_python_bindings}" != "xno" &&
test "x${CYTHON}" != "x" &&
test "x${PYTHON}" != "x:" &&
test "x${PYTHON_VERSION}" != "x"; then
enable_python_bindings=yes
fi
if test "x${request_python_bindings}" = "xyes" &&
test "x${enable_python_bindings}" != "xyes"; then
AC_MSG_ERROR([python bindings were requested (--enable-python-bindings) but dependencies are not met.])
fi
AM_CONDITIONAL([ENABLE_PYTHON_BINDINGS],
[test "x${enable_python_bindings}" = "xyes"])
# Produce cython conditional, so that we can distribute generated C
# source
AM_CONDITIONAL([HAVE_CYTHON], [test "x${CYTHON}" != "x"])
# failmalloc tests
enable_failmalloc=no
if test "x${request_failmalloc}" = "xyes"; then
@ -960,11 +1072,8 @@ AC_CONFIG_FILES([
tests/testdata/Makefile
third-party/Makefile
src/Makefile
src/includes/Makefile
src/libnghttp2_asio.pc
bpf/Makefile
examples/Makefile
python/Makefile
python/setup.py
integration-tests/Makefile
integration-tests/config.go
integration-tests/setenv
@ -977,14 +1086,9 @@ AC_CONFIG_FILES([
doc/tutorial-hpack.rst
doc/nghttpx-howto.rst
doc/h2load-howto.rst
doc/libnghttp2_asio.rst
doc/python-apiref.rst
doc/building-android-binary.rst
doc/nghttp2.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
contrib/Makefile
script/Makefile
@ -1013,7 +1117,11 @@ AC_MSG_NOTICE([summary of build options:
WARNCXXFLAGS: ${WARNCXXFLAGS}
CXX1XCXXFLAGS: ${CXX1XCXXFLAGS}
EXTRACFLAG: ${EXTRACFLAG}
BPFCFLAGS: ${BPFCFLAGS}
EXTRABPFCFLAGS: ${EXTRABPFCFLAGS}
LIBS: ${LIBS}
DEFS: ${DEFS}
EXTRA_DEFS: ${EXTRA_DEFS}
Library:
Shared: ${enable_shared}
Static: ${enable_static}
@ -1022,10 +1130,6 @@ AC_MSG_NOTICE([summary of build options:
Python:
Python: ${PYTHON}
PYTHON_VERSION: ${PYTHON_VERSION}
pyexecdir: ${pyexecdir}
PYTHON_CPPFLAGS:${PYTHON_CPPFLAGS}
PYTHON_LIBS: ${PYTHON_LIBS}
Cython: ${CYTHON}
Test:
CUnit: ${have_cunit} (CFLAGS='${CUNIT_CFLAGS}' LIBS='${CUNIT_LIBS}')
Failmalloc: ${enable_failmalloc}
@ -1036,17 +1140,14 @@ AC_MSG_NOTICE([summary of build options:
Libc-ares: ${have_libcares} (CFLAGS='${LIBCARES_CFLAGS}' LIBS='${LIBCARES_LIBS}')
libngtcp2: ${have_libngtcp2} (CFLAGS='${LIBNGTCP2_CFLAGS}' LIBS='${LIBNGTCP2_LIBS}')
libngtcp2_crypto_openssl: ${have_libngtcp2_crypto_openssl} (CFLAGS='${LIBNGTCP2_CRYPTO_OPENSSL_CFLAGS}' LIBS='${LIBNGTCP2_CRYPTO_OPENSSL_LIBS}')
libngtcp2_crypto_boringssl: ${have_libngtcp2_crypto_boringssl} (CFLAGS='${LIBNGTCP2_CRYPTO_BORINGSSL_CFLAGS}' LIBS='${LIBNGTCP2_CRYPTO_BORINGSSL_LIBS}')
libnghttp3: ${have_libnghttp3} (CFLAGS='${LIBNGHTTP3_CFLAGS}' LIBS='${LIBNGHTTP3_LIBS}')
libbpf: ${have_libbpf} (CFLAGS='${LIBBPF_CFLAGS}' LIBS='${LIBBPF_LIBS}')
Libevent(SSL): ${have_libevent_openssl} (CFLAGS='${LIBEVENT_OPENSSL_CFLAGS}' LIBS='${LIBEVENT_OPENSSL_LIBS}')
Jansson: ${have_jansson} (CFLAGS='${JANSSON_CFLAGS}' LIBS='${JANSSON_LIBS}')
Jemalloc: ${have_jemalloc} (CFLAGS='${JEMALLOC_CFLAGS}' LIBS='${JEMALLOC_LIBS}')
Zlib: ${have_zlib} (CFLAGS='${ZLIB_CFLAGS}' LIBS='${ZLIB_LIBS}')
Systemd: ${have_libsystemd} (CFLAGS='${SYSTEMD_CFLAGS}' LIBS='${SYSTEMD_LIBS}')
Boost CPPFLAGS: ${BOOST_CPPFLAGS}
Boost LDFLAGS: ${BOOST_LDFLAGS}
Boost::ASIO: ${BOOST_ASIO_LIB}
Boost::System: ${BOOST_SYSTEM_LIB}
Boost::Thread: ${BOOST_THREAD_LIB}
Third-party:
http-parser: ${enable_third_party}
MRuby: ${have_mruby} (CFLAGS='${LIBMRUBY_CFLAGS}' LIBS='${LIBMRUBY_LIBS}')
@ -1054,8 +1155,7 @@ AC_MSG_NOTICE([summary of build options:
Features:
Applications: ${enable_app}
HPACK tools: ${enable_hpack_tools}
Libnghttp2_asio:${enable_asio_lib}
Examples: ${enable_examples}
Python bindings:${enable_python_bindings}
Threading: ${enable_threads}
HTTP/3 (EXPERIMENTAL): ${enable_http3}
])

View File

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

5
doc/.gitignore vendored
View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,63 +1,62 @@
<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 %}
{%- if (theme_prev_next_buttons_location == 'bottom' or theme_prev_next_buttons_location == 'both') and (next or prev) %}
{#- Translators: This is an ARIA section label for the footer section of the page. -#}
<div class="rst-footer-buttons" role="navigation" aria-label="{{ _('Footer') }}">
{%- 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" aria-hidden="true"></span> {{ _('Previous') }}</a>
{%- endif %}
{%- 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" aria-hidden="true"></span></a>
{%- endif %}
</div>
{% endif %}
{%- endif %}
<hr/>
<div role="contentinfo">
{%- block contentinfo %}
<p>
{%- if show_copyright %}
{%- if hasdoc('copyright') %}
{% set path = pathto('copyright') %}
{% set copyright = copyright|e %}
&copy; <a href="{{ path }}">{% trans %}Copyright{% endtrans %}</a> {{ copyright }}
{%- trans path=pathto('copyright'), copyright=copyright|e %}&#169; <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %}
{%- else %}
{% set copyright = copyright|e %}
&copy; {% trans %}Copyright{% endtrans %} {{ copyright }}
{%- trans copyright=copyright|e %}&#169; Copyright {{ copyright }}.{% endtrans %}
{%- endif %}
{%- endif %}
{%- if build_id and build_url %}
<span class="build">
{# Translators: Build is a noun, not a verb #}
{% trans %}Build{% endtrans %}
{#- 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>.
{#- 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 %}
{%- trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
</span>
{%- endif %}
{%- endif -%}
</p>
{%- endblock %}
</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 #}
{% 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 documentation #}
<a href="https://github.com/readthedocs/sphinx_rtd_theme">{% trans %}theme{% endtrans %}</a>
{# Translators: this is always used as "provided by Read the Docs", and should not imply Read the Docs is an author of the generated documentation. #}
{#- Translators: this is always used as "provided by Read the Docs", and should not imply Read the Docs is an author of the generated documentation. #}
{% trans %}provided by {{ readthedocs_web }}{% endtrans %}.
{%- endif %}
{% endif %}
{%- block extrafooter %} {% endblock %}
</footer>

View File

@ -7,56 +7,74 @@
{%- set titlesuffix = "" %}
{%- endif %}
{%- set lang_attr = 'en' if language == None else (language | replace('_', '-')) %}
{%- set sphinx_writer = 'writer-html5' if html5_doctype else 'writer-html4' %}
{%- set sphinx_writer = 'writer-html5' if html5_doctype else 'writer-html4' -%}
{# Build sphinx_version_info tuple from sphinx_version string in pure Jinja #}
{%- set (_ver_major, _ver_minor, _ver_bugfix) = sphinx_version.split('.') | map('int') -%}
{%- set sphinx_version_info = (_ver_major, _ver_minor, _ver_bugfix) -%}
<!DOCTYPE html>
<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 %}
<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 %}
{%- 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" />
{#- CSS #}
{%- if sphinx_version_info < (4, 0) -%}
<link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
<link rel="stylesheet" href="{{ pathto('_static/pygments.css', 1) }}" type="text/css" />
{%- endif %}
{%- 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 %} />
<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" />
<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 %}
{%- endfor -%}
{# FAVICON #}
{% if favicon %}
{#- FAVICON #}
{%- if favicon %}
{%- if sphinx_version_info < (4, 0) -%}
<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 %}
{%- else %}
<link rel="shortcut icon" href="{{ favicon_url }}"/>
{%- endif %}
{%- endif -%}
{# JAVASCRIPTS #}
{#- CANONICAL URL (deprecated) #}
{%- if theme_canonical_url and not pageurl %}
<link rel="canonical" href="{{ theme_canonical_url }}{{ pagename }}.html"/>
{%- endif -%}
{#- CANONICAL URL #}
{%- if pageurl %}
<link rel="canonical" href="{{ pageurl|e }}" />
{%- 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>
{%- if sphinx_version_info >= (1, 8) -%}
{%- if sphinx_version_info < (4, 0) -%}
<script id="documentation_options" data-url_root="{{ url_root }}" src="{{ pathto('_static/documentation_options.js', 1) }}"></script>
{%- endif -%}
{%- for scriptfile in script_files %}
{{ js_tag(scriptfile) }}
{%- endfor %}
{% else %}
<script type="text/javascript">
{%- else %}
<script>
var DOCUMENTATION_OPTIONS = {
URL_ROOT:'{{ url_root }}',
VERSION:'{{ release|e }}',
@ -68,12 +86,12 @@
};
</script>
{%- for scriptfile in script_files %}
<script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
<script src="{{ pathto(scriptfile, 1) }}"></script>
{%- endfor %}
{% endif %}
<script type="text/javascript" src="{{ pathto('_static/js/theme.js', 1) }}"></script>
{%- endif %}
<script src="{{ pathto('_static/js/theme.js', 1) }}"></script>
{# OPENSEARCH #}
{#- OPENSEARCH #}
{%- if use_opensearch %}
<link rel="search" type="application/opensearchdescription+xml"
title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}"
@ -107,133 +125,131 @@
<body class="wy-body-for-nav">
{% block extrabody %} {% endblock %}
{%- block extrabody %} {% endblock %}
<div class="wy-grid-for-nav">
{# SIDE NAV, TOGGLES ON MOBILE #}
{#- SIDE NAV, TOGGLES ON MOBILE #}
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<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 %}
{%- block sidebartitle %}
{% if logo and theme_logo_only %}
{%- if logo and theme_logo_only %}
<a href="{{ pathto(master_doc) }}">
{% else %}
{%- else %}
<a href="{{ pathto(master_doc) }}" class="icon icon-home"> {{ project }}
{% endif %}
{%- 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
{%- if logo %}
{#- Not strictly valid HTML, but it's the only way to display/scale
it properly, without weird scripting or heaps of work
#}
{%- if sphinx_version_info < (4, 0) -%}
<img src="{{ pathto('_static/' + logo, 1) }}" class="logo" alt="{{ _('Logo') }}"/>
{% endif %}
{%- else %}
<img src="{{ logo_url }}" class="logo" alt="{{ _('Logo') }}"/>
{%- endif %}
{%- endif %}
</a>
{% if theme_display_version %}
{%- if theme_display_version %}
{%- set nav_version = version %}
{% if READTHEDOCS and current_version %}
{%- if READTHEDOCS and current_version %}
{%- set nav_version = current_version %}
{% endif %}
{% if nav_version %}
{%- endif %}
{%- if nav_version %}
<div class="version">
{{ nav_version }}
</div>
{% endif %}
{% endif %}
{%- endif %}
{%- endif %}
{% include "searchbox.html" %}
{%- include "searchbox.html" %}
{% endblock %}
{%- 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 %}
{%- block navigation %}
{#- Translators: This is an ARIA section label for the main navigation menu -#}
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="{{ _('Navigation menu') }}">
{%- block menu %}
{%- set toctree = toctree(maxdepth=theme_navigation_depth|int,
collapse=theme_collapse_navigation|tobool,
includehidden=theme_includehidden|tobool,
titles_only=theme_titles_only|tobool) %}
{%- if toctree %}
{{ toctree }}
{%- else %}
<!-- Local TOC -->
<div class="local-toc">{{ toc }}</div>
{% endif %}
{% endblock %}
{%- endif %}
{%- endblock %}
</div>
{% endblock %}
{%- 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 %}
{#- MOBILE NAV, TRIGGLES SIDE NAV ON TOGGLE #}
{#- Translators: This is an ARIA section label for the navigation menu that is visible when viewing the page on mobile devices -#}
<nav class="wy-nav-top" aria-label="{{ _('Mobile navigation menu') }}" {% if theme_style_nav_header_background %} style="background: {{theme_style_nav_header_background}}" {% endif %}>
{%- block mobile_nav %}
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="{{ pathto(master_doc) }}">{{ project }}</a>
{% endblock %}
{%- endblock %}
</nav>
<div class="wy-nav-content">
{%- block content %}
{% if theme_style_external_links|tobool %}
{%- if theme_style_external_links|tobool %}
<div class="rst-content style-external-links">
{% else %}
{%- else %}
<div class="rst-content">
{% endif %}
{%- endif %}
{% include "breadcrumbs.html" %}
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
{%- block document %}
<div itemprop="articleBody">
{% block body %}{% endblock %}
{% block body %}{% endblock %}
</div>
{% if self.comments()|trim %}
<div class="articleComments">
{% block comments %}{% endblock %}
</div>
{% endif%}
{%- 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" %}
{% include "versions.html" -%}
<script type="text/javascript">
<script>
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 %}
{#- Do not conflict with RTD insertion of analytics script #}
{%- if not READTHEDOCS %}
{%- if theme_analytics_id %}
<!-- Theme Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id={{ theme_analytics_id }}"></script>
<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');
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
ga('create', '{{ theme_analytics_id }}', 'auto');
ga('send', 'pageview');
gtag('config', '{{ theme_analytics_id }}', {
'anonymize_ip': {{ 'true' if theme_analytics_anonymize_ip|tobool else 'false' }},
});
</script>
{% endif %}
{% endif %}
{%- endif %}
{%- endif %}
{%- block footer %} {% endblock %}

View File

@ -11,7 +11,7 @@ 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"
"POT-Creation-Date: 2021-09-13 13:35-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"
@ -22,37 +22,32 @@ msgstr ""
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
msgid "Edit on GitHub"
msgstr "Auf GitHub bearbeiten"
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
msgid "Edit on Bitbucket"
msgstr "Auf Bitbucket bearbeiten"
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
msgid "Edit on GitLab"
msgstr "Auf GitLab bearbeiten"
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
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
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
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"
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
msgid "Next"
msgstr "Weiter"
#. Build is a noun, not a verb
#: sphinx_rtd_theme/footer.html:31
#: sphinx_rtd_theme/footer.html:30
msgid "Build"
msgstr "Build"
@ -64,49 +59,53 @@ 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
#: sphinx_rtd_theme/footer.html:53
#, 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
#: sphinx_rtd_theme/footer.html:57
#, python-format
msgid "provided by %(readthedocs_web)s"
msgstr "bereitgestellt von %(readthedocs_web)s"
#: sphinx_rtd_theme/layout.html:79
#: sphinx_rtd_theme/layout.html:97
#, python-format
msgid "Search within %(docstitle)s"
msgstr "%(docstitle)s durchsuchen"
#: sphinx_rtd_theme/layout.html:87
#: sphinx_rtd_theme/layout.html:105
msgid "About these documents"
msgstr "Über diese Dokumentation"
#: sphinx_rtd_theme/layout.html:90
#: sphinx_rtd_theme/layout.html:108
msgid "Index"
msgstr "Index"
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
msgid "Search"
msgstr "Suche"
#: sphinx_rtd_theme/layout.html:128
#: sphinx_rtd_theme/layout.html:114
msgid "Copyright"
msgstr "Copyright"
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
msgid "Logo"
msgstr "Logo"
#: sphinx_rtd_theme/search.html:29
#: sphinx_rtd_theme/search.html:31
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
#: sphinx_rtd_theme/search.html:39
msgid "Search Results"
msgstr "Suchergebnisse"
#: sphinx_rtd_theme/search.html:39
#: sphinx_rtd_theme/search.html:41
msgid ""
"Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories."
@ -119,7 +118,7 @@ msgstr ""
msgid "Search docs"
msgstr "Dokumentation durchsuchen"
#: sphinx_rtd_theme/versions.html:11
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
msgid "Versions"
msgstr "Versionen"
@ -135,9 +134,3 @@ 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"

View File

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

View File

@ -6,15 +6,15 @@
#
# Translators:
# Anthony <aj@ohess.org>, 2019
# Leonardo J. Caballero G. <leonardocaballero@gmail.com>, 2020
# Radina Matic <radina.matic@gmail.com>, 2021
#
msgid ""
msgstr ""
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2020-05-06 13:38-0600\n"
"POT-Creation-Date: 2021-09-13 13:35-0600\n"
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
"Last-Translator: Leonardo J. Caballero G. <leonardocaballero@gmail.com>, 2020\n"
"Last-Translator: Radina Matic <radina.matic@gmail.com>, 2021\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"
@ -23,107 +23,117 @@ msgstr ""
"Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
msgid "Edit on GitHub"
msgstr "Editar en GitHub"
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
msgid "Edit on Bitbucket"
msgstr "Editar en Bitbucket"
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
msgid "Edit on GitLab"
msgstr "Editar en GitLab"
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
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
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
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"
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
msgid "Next"
msgstr "Siguiente"
#. This is an ARIA section label for the footer section of the page.
#: sphinx_rtd_theme/footer.html:4
msgid "Footer"
msgstr "Pie de página"
#: sphinx_rtd_theme/footer.html:21
#, python-format
msgid "&#169; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
msgstr "&#169; <a href=\"%(path)s\">Derechos de autor</a> %(copyright)s."
#: sphinx_rtd_theme/footer.html:23
#, python-format
msgid "&#169; Copyright %(copyright)s."
msgstr "&#169; Derechos de autor %(copyright)s."
#. Build is a noun, not a verb
#: sphinx_rtd_theme/footer.html:31
#: sphinx_rtd_theme/footer.html:30
msgid "Build"
msgstr "Construido"
msgstr "Compilación"
#. the phrase "revision" comes from Git, referring to a commit
#: sphinx_rtd_theme/footer.html:37
#: sphinx_rtd_theme/footer.html:36
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."
msgstr "Actualizado por última vez el %(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
#: sphinx_rtd_theme/footer.html:53
#, python-format
msgid "Built with %(sphinx_web)s using a"
msgstr "Construido con %(sphinx_web)s usando un"
msgstr "Compilado 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
#. generated documentation
#: sphinx_rtd_theme/footer.html:55
msgid "theme"
msgstr "tema"
#. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation.
#: sphinx_rtd_theme/footer.html:56
#: sphinx_rtd_theme/footer.html:57
#, python-format
msgid "provided by %(readthedocs_web)s"
msgstr "proporcionado por %(readthedocs_web)s"
#: sphinx_rtd_theme/layout.html:79
#: sphinx_rtd_theme/layout.html:97
#, python-format
msgid "Search within %(docstitle)s"
msgstr "Buscar en %(docstitle)s"
#: sphinx_rtd_theme/layout.html:87
#: sphinx_rtd_theme/layout.html:105
msgid "About these documents"
msgstr "Sobre esta documentación"
#: sphinx_rtd_theme/layout.html:90
#: sphinx_rtd_theme/layout.html:108
msgid "Index"
msgstr "Índice"
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
#: sphinx_rtd_theme/layout.html:111 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:114
msgid "Copyright"
msgstr "Derechos de autor"
#: sphinx_rtd_theme/layout.html:128
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
msgid "Logo"
msgstr "Logotipo"
#: sphinx_rtd_theme/search.html:29
#: sphinx_rtd_theme/search.html:31
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
#: sphinx_rtd_theme/search.html:39
msgid "Search Results"
msgstr "Resultados de la búsqueda"
#: sphinx_rtd_theme/search.html:39
#: sphinx_rtd_theme/search.html:41
msgid ""
"Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories."
@ -136,7 +146,7 @@ msgstr ""
msgid "Search docs"
msgstr "Buscar documentos"
#: sphinx_rtd_theme/versions.html:11
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
msgid "Versions"
msgstr "Versiones"
@ -155,10 +165,4 @@ 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"
msgstr "Compilaciones"

View File

@ -6,15 +6,15 @@
#
# Translators:
# Anthony <aj@ohess.org>, 2020
# Ivar Smolin <okul@linux.ee>, 2020
# Ivar Smolin <okul@linux.ee>, 2021
#
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"
"POT-Creation-Date: 2021-09-13 13:35-0600\n"
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
"Last-Translator: Ivar Smolin <okul@linux.ee>, 2020\n"
"Last-Translator: Ivar Smolin <okul@linux.ee>, 2021\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"
@ -23,42 +23,52 @@ msgstr ""
"Language: et\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
msgid "Edit on GitHub"
msgstr "Muuda GitHubis"
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
msgid "Edit on Bitbucket"
msgstr "Muuda Bitbucketis"
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
msgid "Edit on GitLab"
msgstr "Muuda GitLabis"
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
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
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
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"
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
msgid "Next"
msgstr "Järgmine"
#. This is an ARIA section label for the footer section of the page.
#: sphinx_rtd_theme/footer.html:4
msgid "Footer"
msgstr "Jalus"
#: sphinx_rtd_theme/footer.html:21
#, python-format
msgid "&#169; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
msgstr "&#169; <a href=\"%(path)s\">Autoriõigus</a> %(copyright)s."
#: sphinx_rtd_theme/footer.html:23
#, python-format
msgid "&#169; Copyright %(copyright)s."
msgstr "&#169; Autoriõigus %(copyright)s."
#. Build is a noun, not a verb
#: sphinx_rtd_theme/footer.html:31
#: sphinx_rtd_theme/footer.html:30
msgid "Build"
msgstr "Ehitus"
#. the phrase "revision" comes from Git, referring to a commit
#: sphinx_rtd_theme/footer.html:37
#: sphinx_rtd_theme/footer.html:36
msgid "Revision"
msgstr "Redaktsioon"
@ -70,52 +80,59 @@ 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
#: sphinx_rtd_theme/footer.html:53
#, 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
#: sphinx_rtd_theme/footer.html:55
msgid "theme"
msgstr "kujundusteema"
#: sphinx_rtd_theme/layout.html:79
#. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation.
#: sphinx_rtd_theme/footer.html:57
#, python-format
msgid "provided by %(readthedocs_web)s"
msgstr "on loonud %(readthedocs_web)s"
#: sphinx_rtd_theme/layout.html:97
#, python-format
msgid "Search within %(docstitle)s"
msgstr "Otsi dokumendist %(docstitle)s"
#: sphinx_rtd_theme/layout.html:87
#: sphinx_rtd_theme/layout.html:105
msgid "About these documents"
msgstr "Nende dokumentide kirjeldused"
#: sphinx_rtd_theme/layout.html:90
#: sphinx_rtd_theme/layout.html:108
msgid "Index"
msgstr "Indeks"
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
#: sphinx_rtd_theme/layout.html:111 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:114
msgid "Copyright"
msgstr "Autoriõigus"
#: sphinx_rtd_theme/layout.html:128
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
msgid "Logo"
msgstr "Logo"
#: sphinx_rtd_theme/search.html:29
#: sphinx_rtd_theme/search.html:31
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
#: sphinx_rtd_theme/search.html:39
msgid "Search Results"
msgstr "Otsingu tulemused"
#: sphinx_rtd_theme/search.html:39
#: sphinx_rtd_theme/search.html:41
msgid ""
"Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories."
@ -127,7 +144,7 @@ msgstr ""
msgid "Search docs"
msgstr "Otsi dokumente"
#: sphinx_rtd_theme/versions.html:11
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
msgid "Versions"
msgstr "Versioonid"
@ -147,9 +164,3 @@ 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"

Binary file not shown.

View File

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

View File

@ -5,16 +5,16 @@
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
#
# Translators:
# Radina Matic <radina.matic@gmail.com>, 2020
# Anthony <aj@ohess.org>, 2020
# Radina Matic <radina.matic@gmail.com>, 2021
#
msgid ""
msgstr ""
"Project-Id-Version: sphinx_rtd_theme 0.4.3.dev0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2020-05-06 13:38-0600\n"
"POT-Creation-Date: 2021-09-13 13:35-0600\n"
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
"Last-Translator: Anthony <aj@ohess.org>, 2020\n"
"Last-Translator: Radina Matic <radina.matic@gmail.com>, 2021\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"
@ -23,42 +23,52 @@ msgstr ""
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
msgid "Edit on GitHub"
msgstr "Éditer sur GitHub"
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
msgid "Edit on Bitbucket"
msgstr "Éditer sur Bitbucket"
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
msgid "Edit on GitLab"
msgstr "Éditer sur GitLab"
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
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
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
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"
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
msgid "Next"
msgstr "Suivant"
#. This is an ARIA section label for the footer section of the page.
#: sphinx_rtd_theme/footer.html:4
msgid "Footer"
msgstr "Pied de page"
#: sphinx_rtd_theme/footer.html:21
#, python-format
msgid "&#169; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
msgstr "&#169; <a href=\"%(path)s\">Droits d'auteur</a> %(copyright)s."
#: sphinx_rtd_theme/footer.html:23
#, python-format
msgid "&#169; Copyright %(copyright)s."
msgstr "&#169; Droits d'auteur %(copyright)s."
#. Build is a noun, not a verb
#: sphinx_rtd_theme/footer.html:31
#: sphinx_rtd_theme/footer.html:30
msgid "Build"
msgstr "Compilation"
#. the phrase "revision" comes from Git, referring to a commit
#: sphinx_rtd_theme/footer.html:37
#: sphinx_rtd_theme/footer.html:36
msgid "Revision"
msgstr "Révision"
@ -70,55 +80,59 @@ 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
#: sphinx_rtd_theme/footer.html:53
#, 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
#: sphinx_rtd_theme/footer.html:55
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
#: sphinx_rtd_theme/footer.html:57
#, python-format
msgid "provided by %(readthedocs_web)s"
msgstr "fourni par %(readthedocs_web)s"
#: sphinx_rtd_theme/layout.html:79
#: sphinx_rtd_theme/layout.html:97
#, python-format
msgid "Search within %(docstitle)s"
msgstr "Rechercher dans %(docstitle)s"
#: sphinx_rtd_theme/layout.html:87
#: sphinx_rtd_theme/layout.html:105
msgid "About these documents"
msgstr "À propos de cette documentation"
#: sphinx_rtd_theme/layout.html:90
#: sphinx_rtd_theme/layout.html:108
msgid "Index"
msgstr "Index"
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
msgid "Search"
msgstr "Rechercher"
#: sphinx_rtd_theme/layout.html:128
#: sphinx_rtd_theme/layout.html:114
msgid "Copyright"
msgstr "Droits d'auteur"
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
msgid "Logo"
msgstr "Logo"
#: sphinx_rtd_theme/search.html:29
#: sphinx_rtd_theme/search.html:31
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
#: sphinx_rtd_theme/search.html:39
msgid "Search Results"
msgstr "Résultats de la recherche"
#: sphinx_rtd_theme/search.html:39
#: sphinx_rtd_theme/search.html:41
msgid ""
"Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories."
@ -131,7 +145,7 @@ msgstr ""
msgid "Search docs"
msgstr "Rechercher docs"
#: sphinx_rtd_theme/versions.html:11
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
msgid "Versions"
msgstr "Versions"
@ -139,6 +153,11 @@ msgstr "Versions"
msgid "Downloads"
msgstr "Téléchargements"
#. The phrase "Read the Docs" is not translated
#: sphinx_rtd_theme/versions.html:24
msgid "On Read the Docs"
msgstr "À propos de Read the Docs"
#: sphinx_rtd_theme/versions.html:26
msgid "Project Home"
msgstr "Accueil du projet"
@ -146,9 +165,3 @@ 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"

Binary file not shown.

View File

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

Binary file not shown.

View File

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

View File

@ -5,15 +5,15 @@
# FIRST AUTHOR <EMAIL@ADDRESS>, 2019.
#
# Translators:
# Jesse Tan, 2019
# Jesse Tan, 2021
#
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"
"POT-Creation-Date: 2021-09-13 13:35-0600\n"
"PO-Revision-Date: 2019-07-16 21:44+0000\n"
"Last-Translator: Jesse Tan, 2019\n"
"Last-Translator: Jesse Tan, 2021\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"
@ -22,42 +22,64 @@ msgstr ""
"Language: nl\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
#. This is an ARIA section label for page links, including previous/next page
#. link and links to GitHub/GitLab/etc.
#: sphinx_rtd_theme/breadcrumbs.html:22
msgid "Page navigation"
msgstr "Paginanavigatie"
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
msgid "Edit on GitHub"
msgstr "Bewerk op GitHub"
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
msgid "Edit on Bitbucket"
msgstr "Bewerk op BitBucket"
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
msgid "Edit on GitLab"
msgstr "Bewerk op GitLab"
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
msgid "View page source"
msgstr "Bekijk paginabron"
#: sphinx_rtd_theme/breadcrumbs.html:74 sphinx_rtd_theme/footer.html:5
msgid "Next"
msgstr "Volgende"
#. This is an ARIA section label for sequential page links, such as previous
#. and next page links.
#: sphinx_rtd_theme/breadcrumbs.html:67
msgid "Sequential page navigation"
msgstr "Navigatie voor gerelateerde pagina's"
#: sphinx_rtd_theme/breadcrumbs.html:77 sphinx_rtd_theme/footer.html:8
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
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"
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
msgid "Next"
msgstr "Volgende"
#. This is an ARIA section label for the footer section of the page.
#: sphinx_rtd_theme/footer.html:4
msgid "Footer"
msgstr "Voettekst"
#: sphinx_rtd_theme/footer.html:21
#, python-format
msgid "&#169; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
msgstr "&#169; <a href=\"%(path)s\">Copyright</a> %(copyright)s."
#: sphinx_rtd_theme/footer.html:23
#, python-format
msgid "&#169; Copyright %(copyright)s."
msgstr "&#169; Copyright %(copyright)s."
#. Build is a noun, not a verb
#: sphinx_rtd_theme/footer.html:31
#: sphinx_rtd_theme/footer.html:30
msgid "Build"
msgstr "Bouwresultaat"
#. the phrase "revision" comes from Git, referring to a commit
#: sphinx_rtd_theme/footer.html:37
#: sphinx_rtd_theme/footer.html:36
msgid "Revision"
msgstr "Revisie"
@ -69,55 +91,70 @@ 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
#: sphinx_rtd_theme/footer.html:53
#, 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
#. generated documentation
#: sphinx_rtd_theme/footer.html:55
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
#: sphinx_rtd_theme/footer.html:57
#, python-format
msgid "provided by %(readthedocs_web)s"
msgstr "geleverd door %(readthedocs_web)s"
#: sphinx_rtd_theme/layout.html:79
#: sphinx_rtd_theme/layout.html:97
#, python-format
msgid "Search within %(docstitle)s"
msgstr "Zoek binnen %(docstitle)s"
#: sphinx_rtd_theme/layout.html:87
#: sphinx_rtd_theme/layout.html:105
msgid "About these documents"
msgstr "Over deze documenten"
#: sphinx_rtd_theme/layout.html:90
#: sphinx_rtd_theme/layout.html:108
msgid "Index"
msgstr "Index"
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
msgid "Search"
msgstr "Zoek"
#: sphinx_rtd_theme/layout.html:128
#: sphinx_rtd_theme/layout.html:114
msgid "Copyright"
msgstr "Copyright"
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
msgid "Logo"
msgstr "Logo"
#: sphinx_rtd_theme/search.html:29
#. This is an ARIA section label for the main navigation menu
#: sphinx_rtd_theme/layout.html:173
msgid "Navigation menu"
msgstr "Navigatiemenu"
#. This is an ARIA section label for the navigation menu that is visible when
#. viewing the page on mobile devices
#: sphinx_rtd_theme/layout.html:195
msgid "Mobile navigation menu"
msgstr "Navigatiemenu voor mobiel"
#: sphinx_rtd_theme/search.html:31
msgid "Please activate JavaScript to enable the search functionality."
msgstr "Zet JavaScript aan om de zoekfunctie mogelijk te maken."
#. Search is a noun, not a verb
#: sphinx_rtd_theme/search.html:37
#: sphinx_rtd_theme/search.html:39
msgid "Search Results"
msgstr "Zoekresultaten"
#: sphinx_rtd_theme/search.html:39
#: sphinx_rtd_theme/search.html:41
msgid ""
"Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories."
@ -129,7 +166,7 @@ msgstr ""
msgid "Search docs"
msgstr "Zoek in documentatie"
#: sphinx_rtd_theme/versions.html:11
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
msgid "Versions"
msgstr "Versies"
@ -149,9 +186,3 @@ 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"

Binary file not shown.

View File

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

Binary file not shown.

View File

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

View File

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

View File

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

View File

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

View File

@ -11,7 +11,7 @@ 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"
"POT-Creation-Date: 2021-09-13 13:35-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"
@ -22,42 +22,37 @@ msgstr ""
"Language: sv\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
msgid "Edit on GitHub"
msgstr "Editera på GitHub"
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
msgid "Edit on Bitbucket"
msgstr "Editera på Bitbucket"
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
msgid "Edit on GitLab"
msgstr "Editera på GitLab"
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
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
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
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"
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
msgid "Next"
msgstr "Nästa"
#. Build is a noun, not a verb
#: sphinx_rtd_theme/footer.html:31
#: sphinx_rtd_theme/footer.html:30
msgid "Build"
msgstr "Bygg"
#. the phrase "revision" comes from Git, referring to a commit
#: sphinx_rtd_theme/footer.html:37
#: sphinx_rtd_theme/footer.html:36
msgid "Revision"
msgstr "Ändra"
@ -69,60 +64,60 @@ 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
#: sphinx_rtd_theme/footer.html:53
#, 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
#: sphinx_rtd_theme/footer.html:55
msgid "theme"
msgstr "tema"
#. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation.
#: sphinx_rtd_theme/footer.html:56
#: sphinx_rtd_theme/footer.html:57
#, python-format
msgid "provided by %(readthedocs_web)s"
msgstr "erhållet av %(readthedocs_web)s"
#: sphinx_rtd_theme/layout.html:79
#: sphinx_rtd_theme/layout.html:97
#, python-format
msgid "Search within %(docstitle)s"
msgstr "Sök i %(docstitle)s"
#: sphinx_rtd_theme/layout.html:87
#: sphinx_rtd_theme/layout.html:105
msgid "About these documents"
msgstr "Om dessa dokument"
#: sphinx_rtd_theme/layout.html:90
#: sphinx_rtd_theme/layout.html:108
msgid "Index"
msgstr "Index"
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
#: sphinx_rtd_theme/layout.html:111 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:114
msgid "Copyright"
msgstr "Upphovsrätt"
#: sphinx_rtd_theme/layout.html:128
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
msgid "Logo"
msgstr "Logo"
#: sphinx_rtd_theme/search.html:29
#: sphinx_rtd_theme/search.html:31
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
#: sphinx_rtd_theme/search.html:39
msgid "Search Results"
msgstr "Sökresultat"
#: sphinx_rtd_theme/search.html:39
#: sphinx_rtd_theme/search.html:41
msgid ""
"Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories."
@ -134,7 +129,7 @@ msgstr ""
msgid "Search docs"
msgstr "Sök i dokumentationen"
#: sphinx_rtd_theme/versions.html:11
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
msgid "Versions"
msgstr "Versioner"
@ -151,8 +146,6 @@ msgstr "På Read the Docs"
msgid "Project Home"
msgstr "Projekt Hem"
#~ msgid "Docs"
#~ msgstr "Dokumentation"
#~ msgid "Free document hosting provided by"
#~ msgstr "Gratis dokumentations hysning erhållen av"
#: sphinx_rtd_theme/versions.html:29
msgid "Builds"
msgstr "Versioner"

View File

@ -11,7 +11,7 @@ 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"
"POT-Creation-Date: 2021-09-13 13:35-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"
@ -22,42 +22,37 @@ msgstr ""
"Language: tr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: sphinx_rtd_theme/breadcrumbs.html:43 sphinx_rtd_theme/breadcrumbs.html:45
#: sphinx_rtd_theme/breadcrumbs.html:37 sphinx_rtd_theme/breadcrumbs.html:39
msgid "Edit on GitHub"
msgstr "GitHub'da Düzenle"
#: sphinx_rtd_theme/breadcrumbs.html:50 sphinx_rtd_theme/breadcrumbs.html:52
#: sphinx_rtd_theme/breadcrumbs.html:44 sphinx_rtd_theme/breadcrumbs.html:46
msgid "Edit on Bitbucket"
msgstr "Bitbucket'ta Düzenle"
#: sphinx_rtd_theme/breadcrumbs.html:57 sphinx_rtd_theme/breadcrumbs.html:59
#: sphinx_rtd_theme/breadcrumbs.html:51 sphinx_rtd_theme/breadcrumbs.html:53
msgid "Edit on GitLab"
msgstr "GitLab'ta Düzenle"
#: sphinx_rtd_theme/breadcrumbs.html:62 sphinx_rtd_theme/breadcrumbs.html:64
#: sphinx_rtd_theme/breadcrumbs.html:56 sphinx_rtd_theme/breadcrumbs.html:58
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
#: sphinx_rtd_theme/breadcrumbs.html:69 sphinx_rtd_theme/footer.html:6
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ı"
#: sphinx_rtd_theme/breadcrumbs.html:72 sphinx_rtd_theme/footer.html:9
msgid "Next"
msgstr "Sonraki"
#. Build is a noun, not a verb
#: sphinx_rtd_theme/footer.html:31
#: sphinx_rtd_theme/footer.html:30
msgid "Build"
msgstr "Oluşturma"
#. the phrase "revision" comes from Git, referring to a commit
#: sphinx_rtd_theme/footer.html:37
#: sphinx_rtd_theme/footer.html:36
msgid "Revision"
msgstr "Gözden geçirme"
@ -67,50 +62,54 @@ 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
#. generated documentation
#: sphinx_rtd_theme/footer.html:55
msgid "theme"
msgstr "tema"
#. this is always used as "provided by Read the Docs", and should not imply
#. Read the Docs is an author of the generated documentation.
#: sphinx_rtd_theme/footer.html:56
#: sphinx_rtd_theme/footer.html:57
#, 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
#: sphinx_rtd_theme/layout.html:97
#, python-format
msgid "Search within %(docstitle)s"
msgstr "%(docstitle)s içinde ara"
#: sphinx_rtd_theme/layout.html:87
#: sphinx_rtd_theme/layout.html:105
msgid "About these documents"
msgstr "Bu belgeler hakkında"
#: sphinx_rtd_theme/layout.html:90
#: sphinx_rtd_theme/layout.html:108
msgid "Index"
msgstr "Dizin"
#: sphinx_rtd_theme/layout.html:93 sphinx_rtd_theme/search.html:11
#: sphinx_rtd_theme/layout.html:111 sphinx_rtd_theme/search.html:11
msgid "Search"
msgstr "Arama"
#: sphinx_rtd_theme/layout.html:128
#: sphinx_rtd_theme/layout.html:114
msgid "Copyright"
msgstr "Telif hakkı"
#: sphinx_rtd_theme/layout.html:147 sphinx_rtd_theme/layout.html:149
msgid "Logo"
msgstr "Logo"
#: sphinx_rtd_theme/search.html:29
#: sphinx_rtd_theme/search.html:31
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
#: sphinx_rtd_theme/search.html:39
msgid "Search Results"
msgstr "Arama Sonuçları"
#: sphinx_rtd_theme/search.html:39
#: sphinx_rtd_theme/search.html:41
msgid ""
"Your search did not match any documents. Please make sure that all words are"
" spelled correctly and that you've selected enough categories."
@ -122,7 +121,7 @@ msgstr ""
msgid "Search docs"
msgstr "Belgeleri arayın"
#: sphinx_rtd_theme/versions.html:11
#: sphinx_rtd_theme/versions.html:3 sphinx_rtd_theme/versions.html:11
msgid "Versions"
msgstr "Sürümler"
@ -142,6 +141,3 @@ 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"

View File

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

View File

@ -5,22 +5,23 @@
Template for the search page.
:copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
:license: BSD, see LICENSE for details.
:license: BSD, see https://github.com/sphinx-doc/sphinx/blob/master/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>
<script src="{{ pathto('_static/searchtools.js', 1) }}"></script>
<script src="{{ pathto('_static/language_data.js', 1) }}"></script>
{%- endblock %}
{% block footer %}
<script type="text/javascript">
<script>
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>
<script id="searchindexloader"></script>
{{ super() }}
{% endblock %}
{% block body %}

View File

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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

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

View File

@ -1,6 +1,6 @@
{% 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">
<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 }}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,8 +1,5 @@
.\" Man page generated from reStructuredText.
.
.TH "H2LOAD" "1" "Jul 18, 2021" "1.45.0-DEV" "nghttp2"
.SH NAME
h2load \- HTTP/2 benchmarking tool
.
.nr rst2man-indent-level 0
.
@ -30,6 +27,9 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.TH "H2LOAD" "1" "Nov 13, 2022" "1.51.0" "nghttp2"
.SH NAME
h2load \- HTTP/2 benchmarking tool
.SH SYNOPSIS
.sp
\fBh2load\fP [OPTIONS]... [URI]...
@ -99,8 +99,17 @@ Default: \fB1\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-f, \-\-max\-frame\-size=<SIZE>
Maximum frame size that the local endpoint is willing to
receive.
.sp
Default: \fB16K\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-w, \-\-window\-bits=<N>
Sets the stream level initial window size to (2**<N>)\-1.
For QUIC, <N> is capped to 26 (roughly 64MiB).
.sp
Default: \fB30\fP
.UNINDENT
@ -120,10 +129,18 @@ Add/Override a header to the requests.
.INDENT 0.0
.TP
.B \-\-ciphers=<SUITE>
Set allowed cipher list. The format of the string is
described in OpenSSL ciphers(1).
Set allowed cipher list for TLSv1.2 or earlier. The
format of the string is described in OpenSSL ciphers(1).
.sp
Default: \fBECDHE\-ECDSA\-AES256\-GCM\-SHA384:ECDHE\-RSA\-AES256\-GCM\-SHA384:ECDHE\-ECDSA\-CHACHA20\-POLY1305:ECDHE\-RSA\-CHACHA20\-POLY1305:ECDHE\-ECDSA\-AES128\-GCM\-SHA256:ECDHE\-RSA\-AES128\-GCM\-SHA256:ECDHE\-ECDSA\-AES256\-SHA384:ECDHE\-RSA\-AES256\-SHA384:ECDHE\-ECDSA\-AES128\-SHA256:ECDHE\-RSA\-AES128\-SHA256\fP
Default: \fBECDHE\-ECDSA\-AES128\-GCM\-SHA256:ECDHE\-RSA\-AES128\-GCM\-SHA256:ECDHE\-ECDSA\-AES256\-GCM\-SHA384:ECDHE\-RSA\-AES256\-GCM\-SHA384:ECDHE\-ECDSA\-CHACHA20\-POLY1305:ECDHE\-RSA\-CHACHA20\-POLY1305:DHE\-RSA\-AES128\-GCM\-SHA256:DHE\-RSA\-AES256\-GCM\-SHA384\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-tls13\-ciphers=<SUITE>
Set allowed cipher list for TLSv1.3. The format of the
string is described in OpenSSL ciphers(1).
.sp
Default: \fBTLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_CCM_SHA256\fP
.UNINDENT
.INDENT 0.0
.TP
@ -285,6 +302,15 @@ to buffering. Status code is \-1 for failed streams.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-qlog\-file\-base=<PATH>
Enable qlog output and specify base file name for qlogs.
Qlog is emitted for each connection. For a given base
name "base", each output file name becomes
"base.M.N.sqlog" where M is worker ID and N is client ID
(e.g. "base.0.3.sqlog"). Only effective in QUIC runs.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-connect\-to=<HOST>[:<PORT>]
Host and port to connect instead of using the authority
in <URI>.
@ -297,6 +323,28 @@ Specify request per second for each client. \fI\%\-\-rps\fP and
.UNINDENT
.INDENT 0.0
.TP
.B \-\-groups=<GROUPS>
Specify the supported groups.
.sp
Default: \fBX25519:P\-256:P\-384:P\-521\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-no\-udp\-gso
Disable UDP GSO.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-max\-udp\-payload\-size=<SIZE>
Specify the maximum outgoing UDP datagram payload size.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-ktls
Enable ktls.
.UNINDENT
.INDENT 0.0
.TP
.B \-v, \-\-verbose
Output debug information.
.UNINDENT

View File

@ -73,9 +73,17 @@ OPTIONS
Default: ``1``
.. option:: -f, --max-frame-size=<SIZE>
Maximum frame size that the local endpoint is willing to
receive.
Default: ``16K``
.. option:: -w, --window-bits=<N>
Sets the stream level initial window size to (2\*\*<N>)-1.
For QUIC, <N> is capped to 26 (roughly 64MiB).
Default: ``30``
@ -92,10 +100,17 @@ OPTIONS
.. option:: --ciphers=<SUITE>
Set allowed cipher list. The format of the string is
described in OpenSSL ciphers(1).
Set allowed cipher list for TLSv1.2 or earlier. The
format of the string is described in OpenSSL ciphers(1).
Default: ``ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256``
Default: ``ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384``
.. option:: --tls13-ciphers=<SUITE>
Set allowed cipher list for TLSv1.3. The format of the
string is described in OpenSSL ciphers(1).
Default: ``TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_CCM_SHA256``
.. option:: -p, --no-tls-proto=<PROTOID>
@ -240,6 +255,14 @@ OPTIONS
appear slightly out of order with multiple threads due
to buffering. Status code is -1 for failed streams.
.. option:: --qlog-file-base=<PATH>
Enable qlog output and specify base file name for qlogs.
Qlog is emitted for each connection. For a given base
name "base", each output file name becomes
"base.M.N.sqlog" where M is worker ID and N is client ID
(e.g. "base.0.3.sqlog"). Only effective in QUIC runs.
.. option:: --connect-to=<HOST>[:<PORT>]
Host and port to connect instead of using the authority
@ -250,6 +273,24 @@ OPTIONS
Specify request per second for each client. :option:`--rps` and
:option:`--timing-script-file` are mutually exclusive.
.. option:: --groups=<GROUPS>
Specify the supported groups.
Default: ``X25519:P-256:P-384:P-521``
.. option:: --no-udp-gso
Disable UDP GSO.
.. option:: --max-udp-payload-size=<SIZE>
Specify the maximum outgoing UDP datagram payload size.
.. option:: --ktls
Enable ktls.
.. option:: -v, --verbose
Output debug information.

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,8 +1,5 @@
.\" Man page generated from reStructuredText.
.
.TH "NGHTTPX" "1" "Jul 18, 2021" "1.45.0-DEV" "nghttp2"
.SH NAME
nghttpx \- HTTP/2 proxy
.
.nr rst2man-indent-level 0
.
@ -30,12 +27,15 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.TH "NGHTTPX" "1" "Nov 13, 2022" "1.51.0" "nghttp2"
.SH NAME
nghttpx \- HTTP/2 proxy
.SH SYNOPSIS
.sp
\fBnghttpx\fP [OPTIONS]... [<PRIVATE_KEY> <CERT>]
.SH DESCRIPTION
.sp
A reverse proxy for HTTP/2, and HTTP/1.
A reverse proxy for HTTP/3, HTTP/2, and HTTP/1.
.INDENT 0.0
.TP
.B <PRIVATE_KEY>
@ -140,12 +140,13 @@ parameters are: "proto=<PROTO>", "tls",
"affinity=<METHOD>", "dns", "redirect\-if\-not\-tls",
"upgrade\-scheme", "mruby=<PATH>",
"read\-timeout=<DURATION>", "write\-timeout=<DURATION>",
"group=<GROUP>", "group\-weight=<N>", and "weight=<N>".
The parameter consists of keyword, and optionally
followed by "=" and value. For example, the parameter
"proto=h2" consists of the keyword "proto" and value
"h2". The parameter "tls" consists of the keyword "tls"
without value. Each parameter is described as follows.
"group=<GROUP>", "group\-weight=<N>", "weight=<N>", and
"dnf". The parameter consists of keyword, and
optionally followed by "=" and value. For example, the
parameter "proto=h2" consists of the keyword "proto" and
value "h2". The parameter "tls" consists of the keyword
"tls" without value. Each parameter is described as
follows.
.sp
The backend application protocol can be specified using
optional "proto" parameter, and in the form of
@ -208,7 +209,18 @@ the Secure attribute is determined by a request scheme.
If a request scheme is "https", then Secure attribute is
set. Otherwise, it is not set. If <SECURE> is "yes",
the Secure attribute is always set. If <SECURE> is
"no", the Secure attribute is always omitted.
"no", the Secure attribute is always omitted.
"affinity\-cookie\-stickiness=<STICKINESS>" controls
stickiness of this affinity. If <STICKINESS> is
"loose", removing or adding a backend server might break
the affinity and the request might be forwarded to a
different backend server. If <STICKINESS> is "strict",
removing the designated backend server breaks affinity,
but adding new backend server does not cause breakage.
If the designated backend server becomes unavailable,
new backend server is chosen as if the request does not
have an affinity cookie. <STICKINESS> defaults to
"loose".
.sp
By default, name resolution of backend host name is done
at start up, or reloading configuration. If "dns"
@ -276,6 +288,13 @@ weight than weight 2. If this parameter is omitted,
weight becomes 1. "weight" is ignored if session
affinity is enabled.
.sp
If "dnf" parameter is specified, an incoming request is
not forwarded to a backend and just consumed along with
the request body (actually a backend server never be
contacted). It is expected that the HTTP response is
generated by mruby script (see "mruby=<PATH>" parameter
above). "dnf" is an abbreviation of "do not forward".
.sp
Since ";" and ":" are used as delimiter, <PATTERN> must
not contain these characters. In order to include ":"
in <PATTERN>, one has to specify "%3A" (which is
@ -323,6 +342,12 @@ To accept PROXY protocol version 1 and 2 on frontend
connection, specify "proxyproto" parameter. This is
disabled by default.
.sp
To receive HTTP/3 (QUIC) traffic, specify "quic"
parameter. It makes nghttpx listen on UDP port rather
than TCP port. UNIX domain socket, "api", and
"healthmon" parameters cannot be used with "quic"
parameter.
.sp
Default: \fB*,3000\fP
.UNINDENT
.INDENT 0.0
@ -489,6 +514,15 @@ Default: \fB0\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-rlimit\-memlock=<N>
Set maximum number of bytes of memory that may be locked
into RAM. If 0 is given, nghttpx does not set the
limit.
.sp
Default: \fB0\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-backend\-request\-buffer=<SIZE>
Set buffer size used to store backend request.
.sp
@ -528,6 +562,13 @@ Default: \fB3m\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-http3\-read\-timeout=<DURATION>
Specify read timeout for HTTP/3 frontend connection.
.sp
Default: \fB3m\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-read\-timeout=<DURATION>
Specify read timeout for HTTP/1.1 frontend connection.
.sp
@ -642,7 +683,7 @@ format of the string is described in OpenSSL ciphers(1).
This option sets cipher suites for TLSv1.2 or earlier.
Use \fI\%\-\-tls13\-ciphers\fP for TLSv1.3.
.sp
Default: \fBECDHE\-ECDSA\-AES256\-GCM\-SHA384:ECDHE\-RSA\-AES256\-GCM\-SHA384:ECDHE\-ECDSA\-CHACHA20\-POLY1305:ECDHE\-RSA\-CHACHA20\-POLY1305:ECDHE\-ECDSA\-AES128\-GCM\-SHA256:ECDHE\-RSA\-AES128\-GCM\-SHA256:ECDHE\-ECDSA\-AES256\-SHA384:ECDHE\-RSA\-AES256\-SHA384:ECDHE\-ECDSA\-AES128\-SHA256:ECDHE\-RSA\-AES128\-SHA256\fP
Default: \fBECDHE\-ECDSA\-AES128\-GCM\-SHA256:ECDHE\-RSA\-AES128\-GCM\-SHA256:ECDHE\-ECDSA\-AES256\-GCM\-SHA384:ECDHE\-RSA\-AES256\-GCM\-SHA384:ECDHE\-ECDSA\-CHACHA20\-POLY1305:ECDHE\-RSA\-CHACHA20\-POLY1305:DHE\-RSA\-AES128\-GCM\-SHA256:DHE\-RSA\-AES256\-GCM\-SHA384\fP
.UNINDENT
.INDENT 0.0
.TP
@ -652,7 +693,7 @@ format of the string is described in OpenSSL ciphers(1).
This option sets cipher suites for TLSv1.3. Use
\fI\%\-\-ciphers\fP for TLSv1.2 or earlier.
.sp
Default: \fBTLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256\fP
Default: \fBTLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256\fP
.UNINDENT
.INDENT 0.0
.TP
@ -662,7 +703,7 @@ format of the string is described in OpenSSL ciphers(1).
This option sets cipher suites for TLSv1.2 or earlier.
Use \fI\%\-\-tls13\-client\-ciphers\fP for TLSv1.3.
.sp
Default: \fBECDHE\-ECDSA\-AES256\-GCM\-SHA384:ECDHE\-RSA\-AES256\-GCM\-SHA384:ECDHE\-ECDSA\-CHACHA20\-POLY1305:ECDHE\-RSA\-CHACHA20\-POLY1305:ECDHE\-ECDSA\-AES128\-GCM\-SHA256:ECDHE\-RSA\-AES128\-GCM\-SHA256:ECDHE\-ECDSA\-AES256\-SHA384:ECDHE\-RSA\-AES256\-SHA384:ECDHE\-ECDSA\-AES128\-SHA256:ECDHE\-RSA\-AES128\-SHA256\fP
Default: \fBECDHE\-ECDSA\-AES128\-GCM\-SHA256:ECDHE\-RSA\-AES128\-GCM\-SHA256:ECDHE\-ECDSA\-AES256\-GCM\-SHA384:ECDHE\-RSA\-AES256\-GCM\-SHA384:ECDHE\-ECDSA\-CHACHA20\-POLY1305:ECDHE\-RSA\-CHACHA20\-POLY1305:DHE\-RSA\-AES128\-GCM\-SHA256:DHE\-RSA\-AES256\-GCM\-SHA384\fP
.UNINDENT
.INDENT 0.0
.TP
@ -672,7 +713,7 @@ format of the string is described in OpenSSL ciphers(1).
This option sets cipher suites for TLSv1.3. Use
\fI\%\-\-tls13\-client\-ciphers\fP for TLSv1.2 or earlier.
.sp
Default: \fBTLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256\fP
Default: \fBTLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256\fP
.UNINDENT
.INDENT 0.0
.TP
@ -1068,12 +1109,13 @@ option. But be aware its implications.
.INDENT 0.0
.TP
.B \-\-tls\-no\-postpone\-early\-data
By default, nghttpx postpones forwarding HTTP requests
sent in early data, including those sent in partially in
it, until TLS handshake finishes. If all backend server
recognizes "Early\-Data" header field, using this option
makes nghttpx not postpone forwarding request and get
full potential of 0\-RTT data.
By default, except for QUIC connections, nghttpx
postpones forwarding HTTP requests sent in early data,
including those sent in partially in it, until TLS
handshake finishes. If all backend server recognizes
"Early\-Data" header field, using this option makes
nghttpx not postpone forwarding request and get full
potential of 0\-RTT data.
.UNINDENT
.INDENT 0.0
.TP
@ -1083,6 +1125,12 @@ accepts.
.sp
Default: \fB16K\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-tls\-ktls
Enable ktls. For server, ktls is enable if
\fI\%\-\-tls\-session\-cache\-memcached\fP is not configured.
.UNINDENT
.SS HTTP/2
.INDENT 0.0
.TP
@ -1478,13 +1526,21 @@ not be altered regardless of this option.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-altsvc=<PROTOID,PORT[,HOST,[ORIGIN]]>
.B \-\-altsvc=<PROTOID,PORT[,HOST,[ORIGIN[,PARAMS]]]>
Specify protocol ID, port, host and origin of
alternative service. <HOST> and <ORIGIN> are optional.
They are advertised in alt\-svc header field only in
HTTP/1.1 frontend. This option can be used multiple
times to specify multiple alternative services.
Example: \fI\%\-\-altsvc\fP=h2,443
alternative service. <HOST>, <ORIGIN> and <PARAMS> are
optional. Empty <HOST> and <ORIGIN> are allowed and
they are treated as nothing is specified. They are
advertised in alt\-svc header field only in HTTP/1.1
frontend. This option can be used multiple times to
specify multiple alternative services.
Example: \fI\%\-\-altsvc\fP="h2,443,,,ma=3600; persist=1"
.UNINDENT
.INDENT 0.0
.TP
.B \-\-http2\-altsvc=<PROTOID,PORT[,HOST,[ORIGIN[,PARAMS]]]>
Just like \fI\%\-\-altsvc\fP option, but this altsvc is only sent
in HTTP/2 frontend.
.UNINDENT
.INDENT 0.0
.TP
@ -1575,6 +1631,16 @@ field when redirect to HTTPS URI is made due to
.sp
Default: \fB443\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-require\-http\-scheme
Always require http or https scheme in HTTP request. It
also requires that https scheme must be used for an
encrypted connection. Otherwise, http scheme must be
used. This option is recommended for a server
deployment which directly faces clients and the services
it provides only require http or https scheme.
.UNINDENT
.SS API
.INDENT 0.0
.TP
@ -1675,6 +1741,33 @@ process. nghttpx still spawns additional process if
neverbleed is used. In the single process mode, the
signal handling feature is disabled.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-max\-worker\-processes=<N>
The maximum number of worker processes. nghttpx spawns
new worker process when it reloads its configuration.
The previous worker process enters graceful termination
period and will terminate when it finishes handling the
existing connections. However, if reloading
configurations happen very frequently, the worker
processes might be piled up if they take a bit long time
to finish the existing connections. With this option,
if the number of worker processes exceeds the given
value, the oldest worker process is terminated
immediately. Specifying 0 means no limit and it is the
default behaviour.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-worker\-process\-grace\-shutdown\-period=<DURATION>
Maximum period for a worker process to terminate
gracefully. When a worker process enters in graceful
shutdown period (e.g., when nghttpx reloads its
configuration) and it does not finish handling the
existing connections in the given period of time, it is
immediately terminated. Specifying 0 means no limit and
it is the default behaviour.
.UNINDENT
.SS Scripting
.INDENT 0.0
.TP
@ -1688,6 +1781,160 @@ Ignore mruby compile error for per\-pattern mruby script
file. If error occurred, it is treated as if no mruby
file were specified for the pattern.
.UNINDENT
.SS HTTP/3 and QUIC
.INDENT 0.0
.TP
.B \-\-frontend\-quic\-idle\-timeout=<DURATION>
Specify an idle timeout for QUIC connection.
.sp
Default: \fB30s\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-quic\-debug\-log
Output QUIC debug log to \fI/dev/stderr.\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-quic\-bpf\-program\-file=<PATH>
Specify a path to eBPF program file reuseport_kern.o to
direct an incoming QUIC UDP datagram to a correct
socket.
.sp
Default: \fB/usr/local/lib/nghttp2/reuseport_kern.o\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-quic\-early\-data
Enable early data on frontend QUIC connections. nghttpx
sends "Early\-Data" header field to a backend server if a
request is received in early data and handshake has not
finished. All backend servers should deal with possibly
replayed requests.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-quic\-qlog\-dir=<DIR>
Specify a directory where a qlog file is written for
frontend QUIC connections. A qlog file is created per
each QUIC connection. The file name is ISO8601 basic
format, followed by "\-", server Source Connection ID and
".sqlog".
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-quic\-require\-token
Require an address validation token for a frontend QUIC
connection. Server sends a token in Retry packet or
NEW_TOKEN frame in the previous connection.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-quic\-congestion\-controller=<CC>
Specify a congestion controller algorithm for a frontend
QUIC connection. <CC> should be one of "cubic", "bbr",
and "bbr2".
.sp
Default: \fBcubic\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-quic\-secret\-file=<PATH>
Path to file that contains secure random data to be used
as QUIC keying materials. It is used to derive keys for
encrypting tokens and Connection IDs. It is not used to
encrypt QUIC packets. Each line of this file must
contain exactly 136 bytes hex\-encoded string (when
decoded the byte string is 68 bytes long). The first 2
bits of decoded byte string are used to identify the
keying material. An empty line or a line which starts
\(aq#\(aq is ignored. The file can contain more than one
keying materials. Because the identifier is 2 bits, at
most 4 keying materials are read and the remaining data
is discarded. The first keying material in the file is
primarily used for encryption and decryption for new
connection. The other ones are used to decrypt data for
the existing connections. Specifying multiple keying
materials enables key rotation. Please note that key
rotation does not occur automatically. User should
update files or change options values and restart
nghttpx gracefully. If opening or reading given file
fails, all loaded keying materials are discarded and it
is treated as if none of this option is given. If this
option is not given or an error occurred while opening
or reading a file, a keying material is generated
internally on startup and reload.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-quic\-server\-id=<HEXSTRING>
Specify server ID encoded in Connection ID to identify
this particular server instance. Connection ID is
encrypted and this part is not visible in public. It
must be 4 bytes long and must be encoded in hex string
(which is 8 bytes long). If this option is omitted, a
random server ID is generated on startup and
configuration reload.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-quic\-initial\-rtt=<DURATION>
Specify the initial RTT of the frontend QUIC connection.
.sp
Default: \fB333ms\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-no\-quic\-bpf
Disable eBPF.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-http3\-window\-size=<SIZE>
Sets the per\-stream initial window size of HTTP/3
frontend connection.
.sp
Default: \fB256K\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-http3\-connection\-window\-size=<SIZE>
Sets the per\-connection window size of HTTP/3 frontend
connection.
.sp
Default: \fB1M\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-http3\-max\-window\-size=<SIZE>
Sets the maximum per\-stream window size of HTTP/3
frontend connection. The window size is adjusted based
on the receiving rate of stream data. The initial value
is the value specified by \fI\%\-\-frontend\-http3\-window\-size\fP
and the window size grows up to <SIZE> bytes.
.sp
Default: \fB6M\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-http3\-max\-connection\-window\-size=<SIZE>
Sets the maximum per\-connection window size of HTTP/3
frontend connection. The window size is adjusted based
on the receiving rate of stream data. The initial value
is the value specified by
\fI\%\-\-frontend\-http3\-connection\-window\-size\fP and the window
size grows up to <SIZE> bytes.
.sp
Default: \fB8M\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-http3\-max\-concurrent\-streams=<N>
Set the maximum number of the concurrent streams in one
frontend HTTP/3 connection.
.sp
Default: \fB100\fP
.UNINDENT
.SS Misc
.INDENT 0.0
.TP

View File

@ -14,7 +14,7 @@ SYNOPSIS
DESCRIPTION
-----------
A reverse proxy for HTTP/2, and HTTP/1.
A reverse proxy for HTTP/3, HTTP/2, and HTTP/1.
.. describe:: <PRIVATE_KEY>
@ -124,12 +124,13 @@ Connections
"affinity=<METHOD>", "dns", "redirect-if-not-tls",
"upgrade-scheme", "mruby=<PATH>",
"read-timeout=<DURATION>", "write-timeout=<DURATION>",
"group=<GROUP>", "group-weight=<N>", and "weight=<N>".
The parameter consists of keyword, and optionally
followed by "=" and value. For example, the parameter
"proto=h2" consists of the keyword "proto" and value
"h2". The parameter "tls" consists of the keyword "tls"
without value. Each parameter is described as follows.
"group=<GROUP>", "group-weight=<N>", "weight=<N>", and
"dnf". The parameter consists of keyword, and
optionally followed by "=" and value. For example, the
parameter "proto=h2" consists of the keyword "proto" and
value "h2". The parameter "tls" consists of the keyword
"tls" without value. Each parameter is described as
follows.
The backend application protocol can be specified using
optional "proto" parameter, and in the form of
@ -192,7 +193,18 @@ Connections
If a request scheme is "https", then Secure attribute is
set. Otherwise, it is not set. If <SECURE> is "yes",
the Secure attribute is always set. If <SECURE> is
"no", the Secure attribute is always omitted.
"no", the Secure attribute is always omitted.
"affinity-cookie-stickiness=<STICKINESS>" controls
stickiness of this affinity. If <STICKINESS> is
"loose", removing or adding a backend server might break
the affinity and the request might be forwarded to a
different backend server. If <STICKINESS> is "strict",
removing the designated backend server breaks affinity,
but adding new backend server does not cause breakage.
If the designated backend server becomes unavailable,
new backend server is chosen as if the request does not
have an affinity cookie. <STICKINESS> defaults to
"loose".
By default, name resolution of backend host name is done
at start up, or reloading configuration. If "dns"
@ -260,6 +272,13 @@ Connections
weight becomes 1. "weight" is ignored if session
affinity is enabled.
If "dnf" parameter is specified, an incoming request is
not forwarded to a backend and just consumed along with
the request body (actually a backend server never be
contacted). It is expected that the HTTP response is
generated by mruby script (see "mruby=<PATH>" parameter
above). "dnf" is an abbreviation of "do not forward".
Since ";" and ":" are used as delimiter, <PATTERN> must
not contain these characters. In order to include ":"
in <PATTERN>, one has to specify "%3A" (which is
@ -307,6 +326,12 @@ Connections
connection, specify "proxyproto" parameter. This is
disabled by default.
To receive HTTP/3 (QUIC) traffic, specify "quic"
parameter. It makes nghttpx listen on UDP port rather
than TCP port. UNIX domain socket, "api", and
"healthmon" parameters cannot be used with "quic"
parameter.
Default: ``*,3000``
@ -458,6 +483,14 @@ Performance
Default: ``0``
.. option:: --rlimit-memlock=<N>
Set maximum number of bytes of memory that may be locked
into RAM. If 0 is given, nghttpx does not set the
limit.
Default: ``0``
.. option:: --backend-request-buffer=<SIZE>
Set buffer size used to store backend request.
@ -495,6 +528,12 @@ Timeout
Default: ``3m``
.. option:: --frontend-http3-read-timeout=<DURATION>
Specify read timeout for HTTP/3 frontend connection.
Default: ``3m``
.. option:: --frontend-read-timeout=<DURATION>
Specify read timeout for HTTP/1.1 frontend connection.
@ -600,7 +639,7 @@ SSL/TLS
This option sets cipher suites for TLSv1.2 or earlier.
Use :option:`--tls13-ciphers` for TLSv1.3.
Default: ``ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256``
Default: ``ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384``
.. option:: --tls13-ciphers=<SUITE>
@ -609,7 +648,7 @@ SSL/TLS
This option sets cipher suites for TLSv1.3. Use
:option:`--ciphers` for TLSv1.2 or earlier.
Default: ``TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256``
Default: ``TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256``
.. option:: --client-ciphers=<SUITE>
@ -618,7 +657,7 @@ SSL/TLS
This option sets cipher suites for TLSv1.2 or earlier.
Use :option:`--tls13-client-ciphers` for TLSv1.3.
Default: ``ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256``
Default: ``ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384``
.. option:: --tls13-client-ciphers=<SUITE>
@ -627,7 +666,7 @@ SSL/TLS
This option sets cipher suites for TLSv1.3. Use
:option:`--tls13-client-ciphers` for TLSv1.2 or earlier.
Default: ``TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256``
Default: ``TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256``
.. option:: --ecdh-curves=<LIST>
@ -983,12 +1022,13 @@ SSL/TLS
.. option:: --tls-no-postpone-early-data
By default, nghttpx postpones forwarding HTTP requests
sent in early data, including those sent in partially in
it, until TLS handshake finishes. If all backend server
recognizes "Early-Data" header field, using this option
makes nghttpx not postpone forwarding request and get
full potential of 0-RTT data.
By default, except for QUIC connections, nghttpx
postpones forwarding HTTP requests sent in early data,
including those sent in partially in it, until TLS
handshake finishes. If all backend server recognizes
"Early-Data" header field, using this option makes
nghttpx not postpone forwarding request and get full
potential of 0-RTT data.
.. option:: --tls-max-early-data=<SIZE>
@ -997,6 +1037,11 @@ SSL/TLS
Default: ``16K``
.. option:: --tls-ktls
Enable ktls. For server, ktls is enable if
:option:`--tls-session-cache-memcached` is not configured.
HTTP/2
~~~~~~
@ -1338,14 +1383,21 @@ HTTP
mode. When :option:`--http2-proxy` is used, these headers will
not be altered regardless of this option.
.. option:: --altsvc=<PROTOID,PORT[,HOST,[ORIGIN]]>
.. option:: --altsvc=<PROTOID,PORT[,HOST,[ORIGIN[,PARAMS]]]>
Specify protocol ID, port, host and origin of
alternative service. <HOST> and <ORIGIN> are optional.
They are advertised in alt-svc header field only in
HTTP/1.1 frontend. This option can be used multiple
times to specify multiple alternative services.
Example: :option:`--altsvc`\=h2,443
alternative service. <HOST>, <ORIGIN> and <PARAMS> are
optional. Empty <HOST> and <ORIGIN> are allowed and
they are treated as nothing is specified. They are
advertised in alt-svc header field only in HTTP/1.1
frontend. This option can be used multiple times to
specify multiple alternative services.
Example: :option:`--altsvc`\="h2,443,,,ma=3600; persist=1"
.. option:: --http2-altsvc=<PROTOID,PORT[,HOST,[ORIGIN[,PARAMS]]]>
Just like :option:`--altsvc` option, but this altsvc is only sent
in HTTP/2 frontend.
.. option:: --add-request-header=<HEADER>
@ -1426,6 +1478,15 @@ HTTP
Default: ``443``
.. option:: --require-http-scheme
Always require http or https scheme in HTTP request. It
also requires that https scheme must be used for an
encrypted connection. Otherwise, http scheme must be
used. This option is recommended for a server
deployment which directly faces clients and the services
it provides only require http or https scheme.
API
~~~
@ -1526,6 +1587,31 @@ Process
neverbleed is used. In the single process mode, the
signal handling feature is disabled.
.. option:: --max-worker-processes=<N>
The maximum number of worker processes. nghttpx spawns
new worker process when it reloads its configuration.
The previous worker process enters graceful termination
period and will terminate when it finishes handling the
existing connections. However, if reloading
configurations happen very frequently, the worker
processes might be piled up if they take a bit long time
to finish the existing connections. With this option,
if the number of worker processes exceeds the given
value, the oldest worker process is terminated
immediately. Specifying 0 means no limit and it is the
default behaviour.
.. option:: --worker-process-grace-shutdown-period=<DURATION>
Maximum period for a worker process to terminate
gracefully. When a worker process enters in graceful
shutdown period (e.g., when nghttpx reloads its
configuration) and it does not finish handling the
existing connections in the given period of time, it is
immediately terminated. Specifying 0 means no limit and
it is the default behaviour.
Scripting
~~~~~~~~~
@ -1541,6 +1627,147 @@ Scripting
file were specified for the pattern.
HTTP/3 and QUIC
~~~~~~~~~~~~~~~
.. option:: --frontend-quic-idle-timeout=<DURATION>
Specify an idle timeout for QUIC connection.
Default: ``30s``
.. option:: --frontend-quic-debug-log
Output QUIC debug log to */dev/stderr.*
.. option:: --quic-bpf-program-file=<PATH>
Specify a path to eBPF program file reuseport_kern.o to
direct an incoming QUIC UDP datagram to a correct
socket.
Default: ``/usr/local/lib/nghttp2/reuseport_kern.o``
.. option:: --frontend-quic-early-data
Enable early data on frontend QUIC connections. nghttpx
sends "Early-Data" header field to a backend server if a
request is received in early data and handshake has not
finished. All backend servers should deal with possibly
replayed requests.
.. option:: --frontend-quic-qlog-dir=<DIR>
Specify a directory where a qlog file is written for
frontend QUIC connections. A qlog file is created per
each QUIC connection. The file name is ISO8601 basic
format, followed by "-", server Source Connection ID and
".sqlog".
.. option:: --frontend-quic-require-token
Require an address validation token for a frontend QUIC
connection. Server sends a token in Retry packet or
NEW_TOKEN frame in the previous connection.
.. option:: --frontend-quic-congestion-controller=<CC>
Specify a congestion controller algorithm for a frontend
QUIC connection. <CC> should be one of "cubic", "bbr",
and "bbr2".
Default: ``cubic``
.. option:: --frontend-quic-secret-file=<PATH>
Path to file that contains secure random data to be used
as QUIC keying materials. It is used to derive keys for
encrypting tokens and Connection IDs. It is not used to
encrypt QUIC packets. Each line of this file must
contain exactly 136 bytes hex-encoded string (when
decoded the byte string is 68 bytes long). The first 2
bits of decoded byte string are used to identify the
keying material. An empty line or a line which starts
'#' is ignored. The file can contain more than one
keying materials. Because the identifier is 2 bits, at
most 4 keying materials are read and the remaining data
is discarded. The first keying material in the file is
primarily used for encryption and decryption for new
connection. The other ones are used to decrypt data for
the existing connections. Specifying multiple keying
materials enables key rotation. Please note that key
rotation does not occur automatically. User should
update files or change options values and restart
nghttpx gracefully. If opening or reading given file
fails, all loaded keying materials are discarded and it
is treated as if none of this option is given. If this
option is not given or an error occurred while opening
or reading a file, a keying material is generated
internally on startup and reload.
.. option:: --quic-server-id=<HEXSTRING>
Specify server ID encoded in Connection ID to identify
this particular server instance. Connection ID is
encrypted and this part is not visible in public. It
must be 4 bytes long and must be encoded in hex string
(which is 8 bytes long). If this option is omitted, a
random server ID is generated on startup and
configuration reload.
.. option:: --frontend-quic-initial-rtt=<DURATION>
Specify the initial RTT of the frontend QUIC connection.
Default: ``333ms``
.. option:: --no-quic-bpf
Disable eBPF.
.. option:: --frontend-http3-window-size=<SIZE>
Sets the per-stream initial window size of HTTP/3
frontend connection.
Default: ``256K``
.. option:: --frontend-http3-connection-window-size=<SIZE>
Sets the per-connection window size of HTTP/3 frontend
connection.
Default: ``1M``
.. option:: --frontend-http3-max-window-size=<SIZE>
Sets the maximum per-stream window size of HTTP/3
frontend connection. The window size is adjusted based
on the receiving rate of stream data. The initial value
is the value specified by :option:`--frontend-http3-window-size`
and the window size grows up to <SIZE> bytes.
Default: ``6M``
.. option:: --frontend-http3-max-connection-window-size=<SIZE>
Sets the maximum per-connection window size of HTTP/3
frontend connection. The window size is adjusted based
on the receiving rate of stream data. The initial value
is the value specified by
:option:`--frontend-http3-connection-window-size` and the window
size grows up to <SIZE> bytes.
Default: ``8M``
.. option:: --frontend-http3-max-concurrent-streams=<N>
Set the maximum number of the concurrent streams in one
frontend HTTP/3 connection.
Default: ``100``
Misc
~~~~

View File

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

View File

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

View File

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

View File

@ -26,7 +26,7 @@ Coding style
We use clang-format to format source code consistently. The
clang-format configuration file .clang-format is located at the root
directory. Since clang-format produces slightly different results
between versions, we currently use clang-format-12.
between versions, we currently use clang-format-14.
To detect any violation to the coding style, we recommend to setup git
pre-commit hook to check coding style of the changes you introduced.
@ -34,13 +34,13 @@ The pre-commit file is located at the root directory. Copy it under
.git/hooks and make sure that it is executable. The pre-commit script
uses clang-format-diff.py to detect any style errors. If it is not in
your PATH or it exists under different name (e.g.,
clang-format-diff-12 in debian), either add it to PATH variable or add
clang-format-diff-14 in debian), either add it to PATH variable or add
git option ``clangformatdiff.binary`` to point to the script.
For emacs users, integrating clang-format to emacs is very easy.
clang-format.el should come with clang distribution. If it is not
found, download it from `here
<https://llvm.org/svn/llvm-project/cfe/trunk/tools/clang-format/clang-format.el>`_.
<https://github.com/llvm/llvm-project/blob/main/clang/tools/clang-format/clang-format.el>`_.
And add these lines to your .emacs file:
.. code-block:: lisp

View File

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

View File

@ -31,13 +31,8 @@ Contents:
h2load-howto
programmers-guide
apiref
libnghttp2_asio
python-apiref
nghttp2.h
nghttp2ver.h
asio_http2_server.h
asio_http2_client.h
asio_http2.h
Source <https://github.com/nghttp2/nghttp2>
Issues <https://github.com/nghttp2/nghttp2/issues>
nghttp2.org <https://nghttp2.org/>

View File

@ -1,433 +0,0 @@
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 Boost::ASIO library and OpenSSL. Currently libnghttp2_asio
provides server and client side API.
libnghttp2_asio is not built by default. Use ``--enable-asio-lib``
configure flag to build libnghttp2_asio. The required Boost libraries
are:
* Boost::Asio
* Boost::System
* Boost::Thread
We have 3 header files for this library:
* :doc:`asio_http2_server.h`
* :doc:`asio_http2_client.h`
* :doc:`asio_http2.h`
asio_http2.h is included from the other two files.
To build a program with libnghttp2_asio, link to the following
libraries::
-lnghttp2_asio -lboost_system
If ``boost::asio::ssl`` is used in application code, OpenSSL is also
required in link line::
-lnghttp2_asio -lboost_system -lssl -lcrypto
Server API
----------
To use server API, first include following header file:
.. code-block:: cpp
#include <nghttp2/asio_http2_server.h>
Also take a look at that header file :doc:`asio_http2_server.h`.
Server API is designed to build HTTP/2 server very easily to utilize
C++11 anonymous function and closure. The bare minimum example of
HTTP/2 server looks like this:
.. code-block:: cpp
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;
}
}
First we instantiate ``nghttp2::asio_http2::server::http2`` object.
``nghttp2::asio_http2::server::http2::handle`` function registers
pattern and its handler function. In this example, we register "/" as
pattern, which matches all requests. Then call
``nghttp2::asio_http2::server::http2::listen_and_serve`` function with
address and port to listen to.
The ``req`` and ``res`` represent HTTP request and response
respectively. ``nghttp2::asio_http2_::server::response::write_head``
constructs HTTP response header fields. The first argument is HTTP
status code, in the above example, which is 200. The second argument,
which is omitted in the above example, is additional header fields to
send.
``nghttp2::asio_http2::server::response::end`` sends response body.
In the above example, we send string "hello, world".
The life time of req and res object ends after the callback set by
``nghttp2::asio_http2::server::response::on_close`` function.
Application must not use those objects after this call.
Serving static files and enabling SSL/TLS
+++++++++++++++++++++++++++++++++++++++++
In this example, we serve a couple of static files and also enable
SSL/TLS.
.. code-block:: cpp
#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;
boost::asio::ssl::context tls(boost::asio::ssl::context::sslv23);
tls.use_private_key_file("server.key", boost::asio::ssl::context::pem);
tls.use_certificate_chain_file("server.crt");
configure_tls_context_easy(ec, tls);
http2 server;
server.handle("/index.html", [](const request &req, const response &res) {
res.write_head(200);
res.end(file_generator("index.html"));
});
if (server.listen_and_serve(ec, tls, "localhost", "3000")) {
std::cerr << "error: " << ec.message() << std::endl;
}
}
We first create ``boost::asio::ssl::context`` object and set path to
private key file and certificate file.
``nghttp2::asio_http2::server::configure_tls_context_easy`` function
configures SSL/TLS context object for HTTP/2 server use, including NPN
callbacks.
In the above example, if request path is "/index.html", we serve
index.html file in the current working directory.
``nghttp2::asio_http2::server::response::end`` has overload to take
function of type ``nghttp2::asio_http2::generator_cb`` and application
pass its implementation to generate response body. For the
convenience, libnghttp2_asio library provides
``nghttp2::asio_http2::file_generator`` function to generate function
to server static file. If other resource is requested, server
automatically responds with 404 status code.
Server push
+++++++++++
Server push is also supported.
.. code-block:: cpp
#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;
boost::asio::ssl::context tls(boost::asio::ssl::context::sslv23);
tls.use_private_key_file("server.key", boost::asio::ssl::context::pem);
tls.use_certificate_chain_file("server.crt");
configure_tls_context_easy(ec, tls);
http2 server;
std::string style_css = "h1 { color: green; }";
server.handle("/", [&style_css](const request &req, const response &res) {
boost::system::error_code ec;
auto push = res.push(ec, "GET", "/style.css");
push->write_head(200);
push->end(style_css);
res.write_head(200);
res.end(R"(
<!DOCTYPE html><html lang="en">
<title>HTTP/2 FTW</title><body>
<link href="/style.css" rel="stylesheet" type="text/css">
<h1>This should be green</h1>
</body></html>
)");
});
server.handle("/style.css",
[&style_css](const request &req, const response &res) {
res.write_head(200);
res.end(style_css);
});
if (server.listen_and_serve(ec, tls, "localhost", "3000")) {
std::cerr << "error: " << ec.message() << std::endl;
}
}
When client requested any resource other than "/style.css", we push
"/style.css". To push resource, call
``nghttp2::asio_http2::server::response::push`` function with desired
method and path. It returns another response object and use its
functions to send push response.
Enable multi-threading
++++++++++++++++++++++
Enabling multi-threading is very easy. Just call
``nghttp2::asio_http2::server::http2::num_threads`` function with the
desired number of threads:
.. code-block:: cpp
http2 server;
// Use 4 native threads
server.num_threads(4);
Client API
----------
To use client API, first include following header file:
.. code-block:: cpp
#include <nghttp2/asio_http2_client.h>
Also take a look at that header file :doc:`asio_http2_client.h`.
Here is the sample client code to access HTTP/2 server and print out
response header fields and response body to the console screen:
.. 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();
}
``nghttp2::asio_http2::client::session`` object takes
``boost::asio::io_service`` object and remote server address. When
connection is made, the callback function passed to
``nghttp2::asio_http2::client::on_connect`` is invoked with connected
address as its parameter. After this callback call, use
``nghttp2::asio_http2::session::submit`` to send request to the
server. You can submit multiple requests at once without waiting for
the completion of previous request.
The life time of req and res object ends after the callback set by
``nghttp2::asio_http2::server::request::on_close`` function.
Application must not use those objects after this call.
Normally, client does not stop even after all requests are done unless
connection is lost. To stop client, call
``nghttp2::asio_http2::server::session::shutdown()``.
Receive server push and enable SSL/TLS
++++++++++++++++++++++++++++++++++++++
.. 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;
boost::asio::ssl::context tls(boost::asio::ssl::context::sslv23);
tls.set_default_verify_paths();
// disabled to make development easier...
// tls_ctx.set_verify_mode(boost::asio::ssl::verify_peer);
configure_tls_context(ec, tls);
// connect to localhost:3000
session sess(io_service, tls, "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([&sess](const response &res) {
std::cerr << "response received!" << std::endl;
res.on_data([&sess](const uint8_t *data, std::size_t len) {
std::cerr.write(reinterpret_cast<const char *>(data), len);
std::cerr << std::endl;
});
});
req->on_push([](const request &push) {
std::cerr << "push request received!" << std::endl;
push.on_response([](const response &res) {
std::cerr << "push response received!" << 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;
});
});
});
});
sess.on_error([](const boost::system::error_code &ec) {
std::cerr << "error: " << ec.message() << std::endl;
});
io_service.run();
}
The above sample code demonstrates how to enable SSL/TLS and receive
server push. Currently,
``nghttp2::asio_http2::client::configure_tls_context`` function setups
NPN callbacks for SSL/TLS context for HTTP/2 use.
To receive server push, use
``nghttp2::asio_http2::client::request::on_push`` function to set
callback function which is invoked when server push request is
arrived. The callback function takes
``nghttp2::asio_http2::client::request`` object, which contains the
pushed request. To get server push response, set callback using
``nghttp2::asio_http2::client::request::on_response``.
As stated in the previous section, client does not stop automatically
as long as HTTP/2 session is fine and connection is alive. We don't
call ``nghttp2::asio_http2::client::session::shutdown`` in this
example, so the program does not terminate after all responses are
received. Hit Ctrl-C to terminate the program.
Multiple concurrent requests
++++++++++++++++++++++++++++
.. 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 printer = [](const response &res) {
res.on_data([](const uint8_t *data, std::size_t len) {
std::cerr.write(reinterpret_cast<const char *>(data), len);
std::cerr << std::endl;
});
};
std::size_t num = 3;
auto count = std::make_shared<int>(num);
for (std::size_t i = 0; i < num; ++i) {
auto req = sess.submit(ec, "GET",
"http://localhost:3000/" + std::to_string(i + 1));
req->on_response(printer);
req->on_close([&sess, count](uint32_t error_code) {
if (--*count == 0) {
// shutdown session after |num| requests were done.
sess.shutdown();
}
});
}
});
sess.on_error([](const boost::system::error_code &ec) {
std::cerr << "error: " << ec.message() << std::endl;
});
io_service.run();
}
Here is the sample to send 3 requests at once. Depending on the
server settings, these requests are processed out-of-order. In this
example, we have a trick to shutdown session after all requests were
done. We made ``count`` object which is shared pointer to int and is
initialized to 3. On each request closure (the invocation of the
callback set by ``nghttp2::asio_http2::client::request::on_close``),
we decrement the count. If count becomes 0, we are sure that all
requests have been done and initiate shutdown.

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