Compare commits

..

616 Commits

Author SHA1 Message Date
Tatsuhiro Tsujikawa
534b74b725 Update bash_completion 2025-10-25 17:13:35 +09:00
Tatsuhiro Tsujikawa
090c7fe26c Update manual pages 2025-10-25 17:13:19 +09:00
Tatsuhiro Tsujikawa
527cdebfee Bump package and library versions 2025-10-25 17:09:28 +09:00
Tatsuhiro Tsujikawa
a2667a6692 Merge pull request #2544 from nghttp2/bump-ngtcp2
Bump ngtcp2 and its dependencies
2025-10-22 21:25:39 +09:00
Tatsuhiro Tsujikawa
aedc348754 Bump ngtcp2 and its dependencies 2025-10-22 19:28:19 +09:00
Tatsuhiro Tsujikawa
19fbcf5238 Merge pull request #2543 from nghttp2/remove-ticket_keys-from-WorkerEvent
nghttpx: Remove unused ticket_keys from WorkerEvent
2025-10-14 21:06:32 +09:00
Tatsuhiro Tsujikawa
6fe99003df nghttpx: Remove unused ticket_keys from WorkerEvent 2025-10-14 20:33:21 +09:00
Tatsuhiro Tsujikawa
0139746d53 Merge pull request #2542 from nghttp2/optimize-quic-io
Optimize quic io
2025-10-14 19:35:06 +09:00
Tatsuhiro Tsujikawa
8dd0c86bde h2load: Prioritize QUIC UDP read event over the other events 2025-10-14 19:00:31 +09:00
Tatsuhiro Tsujikawa
5d4df477e8 h2load: Defer write to the next event loop for QUIC 2025-10-14 18:54:52 +09:00
Tatsuhiro Tsujikawa
2b355a338c nghttpx: Prioritize QUIC UDP read event over the other events 2025-10-14 18:54:44 +09:00
Tatsuhiro Tsujikawa
cfeec12a52 nghttpx: Defer write to the next event loop for QUIC 2025-10-14 18:48:38 +09:00
Tatsuhiro Tsujikawa
26e2d53536 Merge pull request #2541 from nghttp2/dependabot/go_modules/golang.org/x/net-0.46.0
build(deps): bump golang.org/x/net from 0.44.0 to 0.46.0
2025-10-14 08:35:08 +09:00
dependabot[bot]
d921c54209 build(deps): bump golang.org/x/net from 0.44.0 to 0.46.0
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.44.0 to 0.46.0.
- [Commits](https://github.com/golang/net/compare/v0.44.0...v0.46.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-version: 0.46.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-13 14:36:11 +00:00
Tatsuhiro Tsujikawa
8f729331c1 Merge pull request #2540 from nghttp2/nghttpx-quic-recv-pktcnt
nghttpx: Increase number of UDP packets to read
2025-10-13 19:14:15 +09:00
Tatsuhiro Tsujikawa
a25dd12811 nghttpx: Increase number of UDP packets to read
It turns out that the limit of 10 packets per event loop is too small,
that prevents an endpoint from consuming ACKs and other control frames
(e.g., MAX_STREAM_DATA, MAX_STREAMS), resulting in the loss of
throughput.  This change increases maximum number of packets to read
to 64.
2025-10-13 18:35:42 +09:00
Tatsuhiro Tsujikawa
2f1565b0e2 Merge pull request #2538 from nghttp2/dependabot/go_modules/github.com/quic-go/quic-go-0.55.0
build(deps): bump github.com/quic-go/quic-go from 0.54.1 to 0.55.0
2025-10-07 00:49:31 +09:00
dependabot[bot]
389ae66d12 build(deps): bump github.com/quic-go/quic-go from 0.54.1 to 0.55.0
Bumps [github.com/quic-go/quic-go](https://github.com/quic-go/quic-go) from 0.54.1 to 0.55.0.
- [Release notes](https://github.com/quic-go/quic-go/releases)
- [Commits](https://github.com/quic-go/quic-go/compare/v0.54.1...v0.55.0)

---
updated-dependencies:
- dependency-name: github.com/quic-go/quic-go
  dependency-version: 0.55.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-06 14:33:55 +00:00
Tatsuhiro Tsujikawa
a60e00c628 Merge pull request #2537 from nghttp2/dependabot/go_modules/github.com/quic-go/quic-go-0.54.1
build(deps): bump github.com/quic-go/quic-go from 0.54.0 to 0.54.1
2025-09-30 21:42:28 +09:00
dependabot[bot]
53ce088694 build(deps): bump github.com/quic-go/quic-go from 0.54.0 to 0.54.1
Bumps [github.com/quic-go/quic-go](https://github.com/quic-go/quic-go) from 0.54.0 to 0.54.1.
- [Release notes](https://github.com/quic-go/quic-go/releases)
- [Commits](https://github.com/quic-go/quic-go/compare/v0.54.0...v0.54.1)

---
updated-dependencies:
- dependency-name: github.com/quic-go/quic-go
  dependency-version: 0.54.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-29 18:32:02 +00:00
Copilot
e802ccc02a Fix typos in documentation: "or3xx" → "or 3xx" and missing space after period (#2536)
Fix typos in documentation: "or3xx" → "or 3xx" and "itself.To" → "itself. To"

Co-authored-by: tatsuhiro-t <404610+tatsuhiro-t@users.noreply.github.com>
2025-09-29 23:30:52 +09:00
Tatsuhiro Tsujikawa
17428a5d09 Merge pull request #2535 from nghttp2/h2load-quic-window-bits-default
h2load: Set QUIC window-bits to 24 by default
2025-09-29 22:23:26 +09:00
Tatsuhiro Tsujikawa
83683742f1 h2load: Set QUIC window-bits to 24 by default
Reduce the default windows-bits for QUIC to 24 (16MiB).  The previous
default (1 << 30) is too large and causes too many packet losses on
very fast connection with super low RTT.
2025-09-29 21:04:48 +09:00
Tatsuhiro Tsujikawa
fa585e9182 Merge pull request #2534 from nghttp2/remove-redundant-semicolon
Remove redundant semicolon
2025-09-28 17:53:35 +09:00
Tatsuhiro Tsujikawa
7434a37016 Remove redundant semicolon 2025-09-28 12:08:38 +09:00
Tatsuhiro Tsujikawa
a2c47748f0 Merge pull request #2533 from nghttp2/iterators
src: Use std::ranges::begin and std::ranges::end consistently
2025-09-25 22:23:20 +09:00
Tatsuhiro Tsujikawa
1784c1c0d1 src: Use std::ranges::begin and std::ranges::end consistently 2025-09-25 21:39:50 +09:00
Tatsuhiro Tsujikawa
59a9534a2d Merge pull request #2532 from nghttp2/adopt-nghttp3_conn_read_stream2
src: Adopt nghttp3_conn_read_stream2
2025-09-25 20:31:28 +09:00
Tatsuhiro Tsujikawa
7fcbcd786e src: Adopt nghttp3_conn_read_stream2
Adopt nghttp3_conn_read_stream2 which requires nghttp3 v1.12.0.  To
pass the current timestamp, ngtcp2_conn_get_timestamp is used, which
requires ngtcp2 v1.16.0.
2025-09-25 18:56:05 +09:00
Tatsuhiro Tsujikawa
4e0738d24a Merge pull request #2531 from nghttp2/bump-ngtcp2
Bump ngtcp2 and its dependencies
2025-09-25 18:49:18 +09:00
Tatsuhiro Tsujikawa
1e0413f4a6 Bump ngtcp2 and its dependencies 2025-09-25 17:51:17 +09:00
Tatsuhiro Tsujikawa
06e7219d10 Merge pull request #2530 from nghttp2/examples-consistent-cond-macro-comments
examples: Consistent conditional macro comments
2025-09-24 23:35:58 +09:00
Tatsuhiro Tsujikawa
c06c069126 examples: Consistent conditional macro comments 2025-09-24 22:44:11 +09:00
Tatsuhiro Tsujikawa
d8ed2559f6 Merge pull request #2529 from nghttp2/sgi-daemonize
src: Move sgi _daemonize to util::daemonize
2025-09-24 21:52:41 +09:00
Tatsuhiro Tsujikawa
d829be3517 src: Move sgi _daemonize to util::daemonize
Move sgi _daemonize to util::daemonize so that we do not need to
handle sgi case in the multiple places.  Because we have no test
environment for sgi machine, the flags adjustment is omitted.  This is
not a problem now because we only call util::daemonize with zeros.
2025-09-24 21:26:49 +09:00
Tatsuhiro Tsujikawa
6aa9f6c72e Merge pull request #2528 from nghttp2/src-consistent-cond-macro-comments
src: Consistent conditional macro comments
2025-09-24 20:55:10 +09:00
Tatsuhiro Tsujikawa
4181fffc02 src: Consistent conditional macro comments 2025-09-24 20:29:56 +09:00
Tatsuhiro Tsujikawa
8f8eef40e8 Merge pull request #2527 from nghttp2/lib-consistent-cond-macro-comments
lib: Consistent conditional macro comments
2025-09-23 15:01:54 +09:00
Tatsuhiro Tsujikawa
3a95bf47f3 lib: Consistent conditional macro comments
Make conditional macro comments consistent.

- Repeat condition in closing #endif.
- Use #ifdef for a single macro.  Do not use #if defined(...) in this
  case.  Use defined(...) form when repeating condition in #endif.
- Apply De Morgan when negating conditions in #else.
2025-09-23 14:30:52 +09:00
Tatsuhiro Tsujikawa
c218d441ea Merge pull request #2526 from nghttp2/nullptr
src: Use nullptr in C++ code
2025-09-23 00:29:01 +09:00
Tatsuhiro Tsujikawa
1952b166e9 src: Use nullptr in C++ code 2025-09-22 22:47:05 +09:00
Tatsuhiro Tsujikawa
bcfb5d8305 Merge pull request #2525 from nghttp2/nghttpx-cert-type-constexpr
nghttpx: Define NGHTTP2_CERT_TYPE as constexpr
2025-09-22 21:45:04 +09:00
Tatsuhiro Tsujikawa
37fb82621c nghttpx: Define NGHTTP2_CERT_TYPE as constexpr 2025-09-22 20:55:09 +09:00
Tatsuhiro Tsujikawa
00bd05edcc Merge pull request #2524 from nghttp2/nghttpx-drop-tlsv1.1
nghttpx: Drop TLSv1.0 and TLSv1.1 support
2025-09-21 19:14:07 +09:00
Tatsuhiro Tsujikawa
45c67616b9 nghttpx: Drop TLSv1.0 and TLSv1.1 support
Nowadays, people always use TLSv1.3.  TLSv1.2 may be used for a
particular situation where TLSv1.3 is not available due to TLS stack
limitation.  The large companies started to drop TLSv1.1 and earlier
versions.  I do not feel keeping their support without a strong
reason, and I could not find any.
2025-09-21 18:49:15 +09:00
Tatsuhiro Tsujikawa
d94ce2a557 Merge pull request #2523 from nghttp2/nghttpx-consistent-servername-cb-behavior
nghttpx: Make servername_callback behavior consistent
2025-09-21 18:05:33 +09:00
Tatsuhiro Tsujikawa
8a5c731533 nghttpx: Make servername_callback behavior consistent
Make servername_callback behavior consistent across all supported TLS
stacks.  RFC 6066 does not provide any guidance or requirement when a
server must not acknowledge Server Name Indication.
2025-09-21 17:25:22 +09:00
Tatsuhiro Tsujikawa
6dfb3bdb8f Merge pull request #2522 from nghttp2/nghttpx-wolfssl-support-mldsa-cert-select
nghttpx: Support ML-DSA certificate selection with wolfSSL
2025-09-21 17:24:43 +09:00
Tatsuhiro Tsujikawa
43649c8004 nghttpx: Support ML-DSA certificate selection with wolfSSL 2025-09-21 16:45:32 +09:00
Tatsuhiro Tsujikawa
b35fa94ba5 Merge pull request #2521 from nghttp2/nghttpx-refactor-cert-type-detection
nghttpx: Select a certificate in a single pass
2025-09-21 15:08:32 +09:00
Tatsuhiro Tsujikawa
ee6565feb7 nghttpx: Select a certificate in a single pass
Refactored the certificate selection to select the certificate in a
single pass.  Cache the type of certificate to reduce the overhead.
2025-09-21 14:39:09 +09:00
Tatsuhiro Tsujikawa
7caa11f09e Merge pull request #2520 from nghttp2/nghttpx-cert-select-fast-path
nghttpx: Add the fast path when selecting a certificate
2025-09-20 19:38:42 +09:00
Tatsuhiro Tsujikawa
cb73b18a53 nghttpx: Add the fast path when selecting a certificate 2025-09-20 18:59:23 +09:00
Tatsuhiro Tsujikawa
4da70b34d1 Merge pull request #2519 from nghttp2/nghttpx-wolfssl-cert-select
nghttpx: Select certificate with wolfSSL
2025-09-20 18:58:50 +09:00
Tatsuhiro Tsujikawa
cd868f00b9 nghttpx: Select certificate with wolfSSL
This change adds the certificate selection with the supported
signature algorithms for wolfSSL in a way similar to BoringSSL.
wolfSSL does not support ML-DSA certificate as of this writing.
2025-09-20 18:29:50 +09:00
Tatsuhiro Tsujikawa
9fc31cfd16 Merge pull request #2518 from nghttp2/nghttpx-boringssl-cert-select
nghttpx: Select certificate with BoringSSL
2025-09-20 18:23:05 +09:00
Tatsuhiro Tsujikawa
e9f04ae0ad nghttpx: Select certificate with BoringSSL
Previously, the certificate selection in nghttpx depending on the
supported signature algorithm is dedicated to OpenSSL.  This change
brings the same capability to the BoringSSL build.  BoringSSL does not
support ML-DSA certificate as of this writing.
2025-09-20 17:55:25 +09:00
Tatsuhiro Tsujikawa
5e75f0ac81 Merge pull request #2517 from nghttp2/nghttpx-cert-select-pkey-base-id
nghttpx: Select ECDSA cert based on EVP_PKEY_base_id
2025-09-20 11:52:36 +09:00
Tatsuhiro Tsujikawa
8c3f077c5e nghttpx: Select ECDSA cert based on EVP_PKEY_base_id
We once refactored this with the shared curves, but it seems that it
is not entirely correct for this.  Perhaps, the usage of
X509_get_signature_nid was incorrect.
2025-09-20 11:09:55 +09:00
Tatsuhiro Tsujikawa
9cbe936a25 Merge pull request #2516 from nghttp2/nghttpx-ml-dsa-cert-select
nghttpx: Prefer ML-DSA certificate over ECDSA
2025-09-19 23:32:08 +09:00
Tatsuhiro Tsujikawa
b815972b03 nghttpx: Prefer ML-DSA certificate over ECDSA 2025-09-19 23:00:53 +09:00
Tatsuhiro Tsujikawa
59b6d0d1d9 Merge pull request #2515 from nghttp2/nghttpx-supported-groups
nghttpx: Add groups option
2025-09-19 20:59:27 +09:00
Tatsuhiro Tsujikawa
028eeeefeb nghttpx: Add groups option
The groups option takes the list of the supported groups.  This
deprecates ecdh-curves option.  If ecdh-curves option is used, it is
treated as if groups option is specified.
2025-09-19 19:29:04 +09:00
Tatsuhiro Tsujikawa
1feb3679fe Merge pull request #2514 from nghttp2/groups-list
Use SSL_CTX_set1_groups_list
2025-09-19 19:24:03 +09:00
Tatsuhiro Tsujikawa
b00d8da2e2 Use SSL_CTX_set1_groups_list
Replace SSL_CTX_set1_curves_list with SSL_CTX_set1_groups_list.
Remove the workaround for wolfSSL because the bug has been fixed.
2025-09-19 18:45:04 +09:00
Tatsuhiro Tsujikawa
9df3962d08 Merge pull request #2513 from nghttp2/nghttpd-supported-groups
nghttpd: Make the supported groups configurable
2025-09-19 18:43:24 +09:00
Tatsuhiro Tsujikawa
304bfcbb70 nghttpd: Make the supported groups configurable
Use the same default list of groups as h2load.
2025-09-19 18:06:21 +09:00
Tatsuhiro Tsujikawa
280845e52e Merge pull request #2511 from nghttp2/dependabot/go_modules/golang.org/x/net-0.44.0
build(deps): bump golang.org/x/net from 0.43.0 to 0.44.0
2025-09-16 00:05:32 +09:00
dependabot[bot]
bdc5d5a6d1 build(deps): bump golang.org/x/net from 0.43.0 to 0.44.0
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.43.0 to 0.44.0.
- [Commits](https://github.com/golang/net/compare/v0.43.0...v0.44.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-version: 0.44.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-15 14:39:06 +00:00
Tatsuhiro Tsujikawa
c9ff3599de Bump library version due to the patch release 2025-09-15 20:52:45 +09:00
Tatsuhiro Tsujikawa
15912bf810 Merge pull request #2510 from nghttp2/remove-glitch-from-invalid-stream2
Remove session_update_glitch_ratelim called from deep inside the chain
2025-09-15 20:25:59 +09:00
Tatsuhiro Tsujikawa
9e65104b00 Remove session_update_glitch_ratelim called from deep inside the chain
Calling session_update_glitch_ratelim from
session_handle_invalid_stream2 makes handling error quite difficult
because it might be called in nested function calls.  It seems to me
that adding that is accidental.
2025-09-15 18:58:05 +09:00
Tatsuhiro Tsujikawa
80ecefebb5 Merge pull request #2509 from nghttp2/fix-assertion-failure
Fix assertion failure
2025-09-15 18:24:32 +09:00
Tatsuhiro Tsujikawa
43b4369fba Fix assertion failure
Fix assertion failure due to the missing check for NGHTTP2_IB_IGN_ALL
state.  Add tests.
2025-09-15 17:56:17 +09:00
Tatsuhiro Tsujikawa
89b30903cc Merge pull request #2508 from nghttp2/more-builtin-ext-glitch
Increase glitch counter for unexpected builtin extension frames
2025-09-13 11:44:03 +09:00
Tatsuhiro Tsujikawa
4904c736e1 Increase glitch counter for unexpected builtin extension frames 2025-09-13 11:16:19 +09:00
Tatsuhiro Tsujikawa
3b45a19423 Merge pull request #2507 from nghttp2/dependabot/github_actions/actions/stale-10
build(deps): bump actions/stale from 9 to 10
2025-09-09 19:00:47 +09:00
Tatsuhiro Tsujikawa
fbf4a7b750 Merge pull request #2506 from nghttp2/dependabot/github_actions/actions/setup-go-6
build(deps): bump actions/setup-go from 5 to 6
2025-09-09 17:47:18 +09:00
Tatsuhiro Tsujikawa
2a190bf5ee Merge pull request #2505 from nghttp2/dependabot/github_actions/actions/github-script-8
build(deps): bump actions/github-script from 7 to 8
2025-09-09 08:48:32 +09:00
dependabot[bot]
877a78186c build(deps): bump actions/stale from 9 to 10
Bumps [actions/stale](https://github.com/actions/stale) from 9 to 10.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v9...v10)

---
updated-dependencies:
- dependency-name: actions/stale
  dependency-version: '10'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-08 14:09:59 +00:00
dependabot[bot]
3d363ae478 build(deps): bump actions/setup-go from 5 to 6
Bumps [actions/setup-go](https://github.com/actions/setup-go) from 5 to 6.
- [Release notes](https://github.com/actions/setup-go/releases)
- [Commits](https://github.com/actions/setup-go/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/setup-go
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-08 14:09:55 +00:00
dependabot[bot]
73141a7698 build(deps): bump actions/github-script from 7 to 8
Bumps [actions/github-script](https://github.com/actions/github-script) from 7 to 8.
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](https://github.com/actions/github-script/compare/v7...v8)

---
updated-dependencies:
- dependency-name: actions/github-script
  dependency-version: '8'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-08 14:09:51 +00:00
Tatsuhiro Tsujikawa
eacf3484ca Bump package version 2025-09-02 21:03:21 +09:00
Tatsuhiro Tsujikawa
45ac57609b Update manual pages 2025-09-02 19:20:04 +09:00
Tatsuhiro Tsujikawa
3190d030f7 Bump package and library versions 2025-09-02 19:20:04 +09:00
Tatsuhiro Tsujikawa
6979a07da6 Update AUTHORS 2025-09-02 19:20:04 +09:00
Tatsuhiro Tsujikawa
768e383662 Merge pull request #2503 from nghttp2/bump-ngtcp2
Bump ngtcp2 to v1.15.1
2025-09-02 19:19:24 +09:00
Tatsuhiro Tsujikawa
6fd2f9e027 Bump ngtcp2 to v1.15.1 2025-09-02 18:27:22 +09:00
Tatsuhiro Tsujikawa
54359802fa Merge pull request #2500 from bmarques1995/master
Added nghttp3's pattern targets
2025-09-02 18:23:38 +09:00
bmarques1995
bc57689f17 Added nghttp3's pattern targets 2025-09-01 00:15:48 -03:00
Tatsuhiro Tsujikawa
3ae75e840e Merge pull request #2499 from nghttp2/bump-libbpf
Bump libbpf to v1.6.2
2025-08-31 16:52:59 +09:00
Tatsuhiro Tsujikawa
7f79fbfa3e Bump libbpf to v1.6.2 2025-08-31 16:24:02 +09:00
Tatsuhiro Tsujikawa
4c10abe99e Merge pull request #2497 from nghttp2/test-lib-before-app
Test lib before building applications
2025-08-30 20:35:23 +09:00
Tatsuhiro Tsujikawa
2fed8b4945 Test lib before building applications 2025-08-30 19:29:06 +09:00
Tatsuhiro Tsujikawa
f266ee500d Merge pull request #2496 from nghttp2/quic-padding
src: Adopt NGTCP2_WRITE_STREAM_FLAG_PADDING
2025-08-30 19:17:14 +09:00
Tatsuhiro Tsujikawa
708912fe20 Merge pull request #2495 from nghttp2/constexpr-fixup
src: constexpr fixup
2025-08-30 19:11:59 +09:00
Tatsuhiro Tsujikawa
f90a801609 src: Adopt NGTCP2_WRITE_STREAM_FLAG_PADDING
Adopt NGTCP2_WRITE_STREAM_FLAG_PADDING to increase opportunities for
GSO.
2025-08-30 18:42:07 +09:00
Tatsuhiro Tsujikawa
107b7814fa src: constexpr fixup
- Use inline constexpr for constexpr variable with external linkage
- Use static constexpr where they should
- Use consteval for functions to generate a lookup table
2025-08-30 18:37:06 +09:00
Tatsuhiro Tsujikawa
bd70a1546c Merge pull request #2494 from nghttp2/src-designated-initializers
src: Adopt designated initializers
2025-08-26 19:05:25 +09:00
Tatsuhiro Tsujikawa
6e660ddc4b src: Adopt designated initializers 2025-08-26 18:12:09 +09:00
Tatsuhiro Tsujikawa
ea28e672ae Merge pull request #2493 from nghttp2/ngtcp2-callback-designated-init
src: Adopt designated initializers for ngtcp2_callbacks
2025-08-25 21:50:54 +09:00
Tatsuhiro Tsujikawa
fe8685e37f src: Adopt designated initializers for ngtcp2_callbacks 2025-08-25 21:01:08 +09:00
Tatsuhiro Tsujikawa
62c12b673b Merge pull request #2492 from nghttp2/ngtcp2-crypto-libressl
Adopt libngtcp2_crypto_libressl changes
2025-08-25 19:16:15 +09:00
Tatsuhiro Tsujikawa
9ba0b7fde0 Adopt libngtcp2_crypto_libressl changes 2025-08-25 18:26:10 +09:00
Tatsuhiro Tsujikawa
f9f5db5b6a Merge pull request #2491 from nghttp2/adopt-ngtcp2-nghttp3-features
Adopt ngtcp2 nghttp3 features
2025-08-24 21:20:57 +09:00
Tatsuhiro Tsujikawa
7ef3a91d9b src: Adopt ngtcp2_conn_write_aggregate_pkt, require ngtcp2 >= v1.15.0 2025-08-24 20:52:11 +09:00
Tatsuhiro Tsujikawa
e435050378 src: Specify nghttp3_rand callback, require nghttp3 >= v1.11.0 2025-08-24 19:10:49 +09:00
Tatsuhiro Tsujikawa
8f5b450237 Merge pull request #2490 from nghttp2/bump-ngtcp2
Bump ngtcp2 and its dependencies
2025-08-24 12:04:15 +09:00
Tatsuhiro Tsujikawa
5f5fdc780f Bump ngtcp2 and its dependencies 2025-08-24 11:16:06 +09:00
Tatsuhiro Tsujikawa
fd48570e7f Merge pull request #2489 from nghttp2/fix-test-assertions
tests: Swap the positions of expected and actual values
2025-08-24 11:15:35 +09:00
Tatsuhiro Tsujikawa
daa4260f61 tests: Swap the positions of expected and actual values 2025-08-24 10:44:30 +09:00
Tatsuhiro Tsujikawa
451853f39b Merge pull request #2488 from nghttp2/configurable-glitch-counter
Make glitch counter configurable
2025-08-24 10:43:54 +09:00
Tatsuhiro Tsujikawa
dfab53ef65 Make glitch counter configurable 2025-08-23 19:49:14 +09:00
Tatsuhiro Tsujikawa
5d4d517535 Merge pull request #2487 from nghttp2/gha-bump-clang
GHA: Bump clang to 19
2025-08-23 18:59:00 +09:00
Tatsuhiro Tsujikawa
c36b8ee88a GHA: Bump clang to 19 2025-08-23 18:21:56 +09:00
Tatsuhiro Tsujikawa
2e84de0be9 Merge pull request #2486 from nghttp2/bump-clang-format
Bump clang-format to 19
2025-08-23 18:21:03 +09:00
Tatsuhiro Tsujikawa
e18beaa3bd Bump clang-format to 19 2025-08-23 17:41:35 +09:00
Tatsuhiro Tsujikawa
4890cb0fb8 Merge pull request #2485 from nghttp2/glitch-counter
Add "glitch" counter
2025-08-23 17:38:37 +09:00
Tatsuhiro Tsujikawa
06fb688be2 Add "glitch" counter
Any suspicious activity such as DATA frames to a stream which does not
exist are counted to so called "glitch" counter.  If it increases more
than the configured rate, GOAWAY is sent and the connection is closed.
2025-08-23 17:04:27 +09:00
Tatsuhiro Tsujikawa
56d5406bce Merge pull request #2483 from nghttp2/dependabot/go_modules/golang.org/x/net-0.43.0
Bump golang.org/x/net from 0.42.0 to 0.43.0
2025-08-19 18:40:59 +09:00
Tatsuhiro Tsujikawa
0196b2cc03 Merge pull request #2482 from nghttp2/dependabot/github_actions/actions/checkout-5
Bump actions/checkout from 4 to 5
2025-08-19 18:21:13 +09:00
dependabot[bot]
de7da99453 Bump golang.org/x/net from 0.42.0 to 0.43.0
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.42.0 to 0.43.0.
- [Commits](https://github.com/golang/net/compare/v0.42.0...v0.43.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-version: 0.43.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-18 21:33:06 +00:00
dependabot[bot]
40124de400 Bump actions/checkout from 4 to 5
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-18 21:08:56 +00:00
Tatsuhiro Tsujikawa
6d7f80ed7f Merge pull request #2481 from nghttp2/fix-doc
Update doc
2025-08-18 00:24:32 +09:00
Tatsuhiro Tsujikawa
7bf98f2729 Update doc 2025-08-17 21:39:52 +09:00
Tatsuhiro Tsujikawa
e434b74e50 Merge pull request #2480 from nghttp2/robust-error-handling
Make error handling robust
2025-08-17 18:12:44 +09:00
Tatsuhiro Tsujikawa
7784fa979d Make error handling robust
Stream errors are now promoted to connection errors.  This means that
an event that previously just resets a single stream now closes a
connection entirely.  The promoted errors are mostly implementation
errors.  Some involve HTTP fields, but they are already treated stream
error.  People who care about that should have already raised any
issues.  We do not have any outstanding related issues now, so it
seems OK to treat it as connection error.

We have some contradictory specifications around
nghttp2_on_invalid_header and nghttp2_on_invalid_header2 callbacks.
nghttp2_on_invalid_header says that if it is omitted, a stream is
reset.  Meanwhile, nghttp2_on_invalid_header2 says that if it is
omitted, invalid field is silently ignored.  In actual implementation,
if both omitted, we treat it as stream error.  In practice, it is
often required not to bail out if invalid header is received.  In this
change, if both callbacks are omitted, invalid field is silently
ignored as the documentation of nghttp2_on_invalid_header2 says.  The
connection error promotion is applied here as well.  So if invalid
field is received, and callback returns
NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE, it is treated as connection
error.
2025-08-17 16:50:49 +09:00
Tatsuhiro Tsujikawa
8391ae7a57 Merge pull request #2478 from nghttp2/fix-gha-android-build
GHA: Run android workflow on branches event
2025-08-09 18:36:27 +09:00
Tatsuhiro Tsujikawa
d63d2568b7 GHA: Run android workflow on branches event 2025-08-09 17:00:29 +09:00
Tatsuhiro Tsujikawa
d8d94e7a69 Merge pull request #2475 from nghttp2/rewrite-is_hex_string
src: Rewrite util::is_hex_string
2025-07-29 18:06:51 +09:00
Tatsuhiro Tsujikawa
ef3b25e152 src: Rewrite util::is_hex_string 2025-07-29 17:36:46 +09:00
Tatsuhiro Tsujikawa
52ae8b7d9f Merge pull request #2474 from nghttp2/mem-free
lib: Use nghttp2_mem_free
2025-07-25 18:59:14 +09:00
Tatsuhiro Tsujikawa
d204cd0880 lib: Use nghttp2_mem_free 2025-07-25 18:30:51 +09:00
Tatsuhiro Tsujikawa
32a5793b02 Merge pull request #2473 from geoffhill/patch-1
Use allocator-aware free in failure path
2025-07-25 18:27:41 +09:00
Tatsuhiro Tsujikawa
b81979f35b Merge pull request #2472 from nghttp2/dependabot/go_modules/github.com/quic-go/quic-go-0.54.0
Bump github.com/quic-go/quic-go from 0.53.0 to 0.54.0
2025-07-24 20:51:16 +09:00
Geoff Hill
808271a5a9 Use allocator-aware free in failure path
This change avoids free(3) from stdlib in favor of nghttp2_mem_free() for freeing a buffer in an error path. The buffer is allocated with nghttp2_mem_malloc().
2025-07-23 10:41:05 -07:00
dependabot[bot]
4bfd528d44 Bump github.com/quic-go/quic-go from 0.53.0 to 0.54.0
Bumps [github.com/quic-go/quic-go](https://github.com/quic-go/quic-go) from 0.53.0 to 0.54.0.
- [Release notes](https://github.com/quic-go/quic-go/releases)
- [Commits](https://github.com/quic-go/quic-go/compare/v0.53.0...v0.54.0)

---
updated-dependencies:
- dependency-name: github.com/quic-go/quic-go
  dependency-version: 0.54.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-21 16:57:05 +00:00
Tatsuhiro Tsujikawa
2fefe482bf Merge pull request #2471 from nghttp2/dependabot/go_modules/golang.org/x/net-0.42.0
Bump golang.org/x/net from 0.41.0 to 0.42.0
2025-07-16 18:39:22 +09:00
dependabot[bot]
1c2ba03f94 Bump golang.org/x/net from 0.41.0 to 0.42.0
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.41.0 to 0.42.0.
- [Commits](https://github.com/golang/net/compare/v0.41.0...v0.42.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-version: 0.42.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-14 17:26:26 +00:00
Tatsuhiro Tsujikawa
5edfa62c7b Merge pull request #2468 from nghttp2/dependabot/go_modules/github.com/quic-go/quic-go-0.53.0
Bump github.com/quic-go/quic-go from 0.52.0 to 0.53.0
2025-07-01 21:06:26 +09:00
Tatsuhiro Tsujikawa
efad89d9d2 Merge pull request #2469 from nghttp2/map-seed
Map seed
2025-07-01 20:27:22 +09:00
Tatsuhiro Tsujikawa
a8dfe825d0 src: Specify nghttp2_rand_callback 2025-07-01 19:25:33 +09:00
Tatsuhiro Tsujikawa
a9b0230e57 Add nghttp2_rand_callback
Add nghttp2_rand_callback.  Seed nghttp2_map with the unpredictable
value from the callback.
2025-07-01 19:25:33 +09:00
Tatsuhiro Tsujikawa
01b16f64f4 Port ngtcp2_map changes 2025-07-01 18:25:24 +09:00
dependabot[bot]
b41ca012b4 Bump github.com/quic-go/quic-go from 0.52.0 to 0.53.0
Bumps [github.com/quic-go/quic-go](https://github.com/quic-go/quic-go) from 0.52.0 to 0.53.0.
- [Release notes](https://github.com/quic-go/quic-go/releases)
- [Commits](https://github.com/quic-go/quic-go/compare/v0.52.0...v0.53.0)

---
updated-dependencies:
- dependency-name: github.com/quic-go/quic-go
  dependency-version: 0.53.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-30 17:49:27 +00:00
Tatsuhiro Tsujikawa
d2b58bd0cd Merge pull request #2467 from nghttp2/pmtudisc-probe
src: Adopt IP_PMTUDISC_PROBE
2025-06-29 18:03:23 +09:00
Tatsuhiro Tsujikawa
fc43fc1805 src: Adopt IP_PMTUDISC_PROBE
It seems that IP_PMTUDISC_PROBE works in some advertent situations.
2025-06-29 17:37:55 +09:00
Tatsuhiro Tsujikawa
1616d9ef05 Merge pull request #2465 from nghttp2/ngtcp2-map-port
Port ngtcp2 map changes
2025-06-21 19:01:20 +09:00
Tatsuhiro Tsujikawa
05b29df6eb Port ngtcp2 map changes 2025-06-21 18:34:09 +09:00
Tatsuhiro Tsujikawa
9f0c59d6dd Merge pull request #2463 from nghttp2/android-docker-avoid-tag-event
Do not trigger android workflow on tag event
2025-06-17 21:58:51 +09:00
Tatsuhiro Tsujikawa
af02195b60 Do not trigger android workflow on tag event 2025-06-17 21:35:43 +09:00
Tatsuhiro Tsujikawa
0f46173c2d Bump package version 2025-06-17 19:18:12 +09:00
Tatsuhiro Tsujikawa
ac22e0efe3 Update manual pages 2025-06-17 18:56:00 +09:00
Tatsuhiro Tsujikawa
031ae82552 Bump package and library versions 2025-06-17 18:52:43 +09:00
Tatsuhiro Tsujikawa
6b3e58127d Update AUTHORS 2025-06-17 18:46:32 +09:00
Tatsuhiro Tsujikawa
5e576bda7d Merge pull request #2462 from nghttp2/nghttpx-preserve-weightgroup-cycle
nghttpx: Preserve WeightGroup cycles between backend replaces
2025-06-16 21:28:02 +09:00
Tatsuhiro Tsujikawa
6039258f01 nghttpx: Preserve WeightGroup cycles between backend replaces
Preserve cycle in WeightGroups if name and weight of WeightGroups
under a single pattern do not change after replacing backends via
backendconfig API call.  It does not matter if backend addresses under
those groups are changed.
2025-06-16 20:59:10 +09:00
Tatsuhiro Tsujikawa
121e401166 Merge pull request #2460 from nghttp2/dependabot/go_modules/golang.org/x/net-0.41.0
Bump golang.org/x/net from 0.40.0 to 0.41.0
2025-06-10 08:25:19 +09:00
dependabot[bot]
67ab8145c7 Bump golang.org/x/net from 0.40.0 to 0.41.0
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.40.0 to 0.41.0.
- [Commits](https://github.com/golang/net/compare/v0.40.0...v0.41.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-version: 0.41.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-09 14:45:27 +00:00
Tatsuhiro Tsujikawa
68b663eaba Merge pull request #2459 from nghttp2/conf-file-check-error
nghttpx: Check error when reading the configuration file
2025-06-09 21:17:43 +09:00
Tatsuhiro Tsujikawa
c9f3166c4d nghttpx: Check error when reading the configuration file 2025-06-09 20:33:42 +09:00
Tatsuhiro Tsujikawa
eafb876a5b Merge pull request #2458 from nghttp2/quic-secret-getline
nghttpx: Use std::getline to read QUIC secrets
2025-06-09 20:32:31 +09:00
Tatsuhiro Tsujikawa
c8790efadf nghttpx: Use std::getline to read QUIC secrets 2025-06-09 19:42:02 +09:00
Tatsuhiro Tsujikawa
fbcf341878 Merge pull request #2457 from nghttp2/thread-local
Remove the availability check for thread_local
2025-06-09 19:24:52 +09:00
Tatsuhiro Tsujikawa
1adb1d9bb7 Remove the availability check for thread_local 2025-06-09 18:51:39 +09:00
Tatsuhiro Tsujikawa
c9bf55f125 Merge pull request #2455 from starrify/nghttpd-support-sslkeylogfile
nghttpd: Support SSLKEYLOGFILE
2025-06-09 18:51:02 +09:00
Tatsuhiro Tsujikawa
2b07607cac Merge pull request #2456 from nghttp2/as-string-view
Use as_string_view to simplify the construction
2025-06-09 18:29:23 +09:00
Peng-Yu Chen
556fa9f781 nghttpd: Support SSLKEYLOGFILE 2025-06-09 10:18:05 +01:00
Tatsuhiro Tsujikawa
827da803f6 Use as_string_view to simplify the construction 2025-06-09 18:04:20 +09:00
Tatsuhiro Tsujikawa
b1496253d0 Merge pull request #2454 from nghttp2/replace-stringref-with-stringview
Replace stringref with stringview
2025-06-08 22:27:07 +09:00
Tatsuhiro Tsujikawa
811608bef8 Update script 2025-06-08 21:36:23 +09:00
Tatsuhiro Tsujikawa
db304adf70 Remove unnecessary casts and some adjustments 2025-06-08 21:19:59 +09:00
Tatsuhiro Tsujikawa
ef94a3be9a Replace StringRef with std::string_view 2025-06-08 21:00:56 +09:00
Tatsuhiro Tsujikawa
2f283177f7 Merge pull request #2453 from nghttp2/src-refactor
Src refactor
2025-06-08 18:00:53 +09:00
Tatsuhiro Tsujikawa
b13eb2c13f util::format_duration: Use std::string_view for unit 2025-06-08 17:38:00 +09:00
Tatsuhiro Tsujikawa
9707f9bfbe util::show_candidates: Use std::string_view for cands 2025-06-08 17:38:00 +09:00
Tatsuhiro Tsujikawa
53785c2434 tls::get_tls_protocol: Return std::string_view 2025-06-08 17:38:00 +09:00
Tatsuhiro Tsujikawa
4f450d0f5a Router::add_node: Receive pattern as StringRef 2025-06-08 17:38:00 +09:00
Tatsuhiro Tsujikawa
86a36fec8a RNode: Store s as std::string_view 2025-06-08 17:38:00 +09:00
Tatsuhiro Tsujikawa
5ccd54734a Rewrite http::colorize_headers 2025-06-08 17:38:00 +09:00
Tatsuhiro Tsujikawa
ecf42e76a8 FieldStore: Pass StringRef rather than const char * and its length 2025-06-08 17:38:00 +09:00
Tatsuhiro Tsujikawa
c72e5f116d Remove unused http2::dump_nv overloads 2025-06-08 17:38:00 +09:00
Tatsuhiro Tsujikawa
d79fd53b67 http2::get_header: Take std::string_view 2025-06-08 17:38:00 +09:00
Tatsuhiro Tsujikawa
0bfdc8682d Remove http2::get_header overloads that take HeaderIndex 2025-06-08 17:38:00 +09:00
Tatsuhiro Tsujikawa
af5f768a52 Remove unused http2::copy_url_component 2025-06-08 17:38:00 +09:00
Tatsuhiro Tsujikawa
9a51528aab Remove unused http2::lws 2025-06-08 17:38:00 +09:00
Tatsuhiro Tsujikawa
e403873ac8 Refactor levenshtein to accept std::string_view 2025-06-08 17:38:00 +09:00
Tatsuhiro Tsujikawa
e004f75e77 Merge pull request #2452 from nghttp2/nghttpx-quic-read-rate
nghttpx: Implement rate limiting for incoming QUIC traffic
2025-06-08 12:45:58 +09:00
Tatsuhiro Tsujikawa
55e02bdb70 nghttpx: Implement rate limiting for incoming QUIC traffic 2025-06-08 12:06:58 +09:00
Tatsuhiro Tsujikawa
d28170aaeb Merge pull request #2451 from nghttp2/refactor-siphash-keygen
src: Refactor siphash key generation
2025-06-06 20:37:19 +09:00
Tatsuhiro Tsujikawa
d2e9479da4 src: Refactor siphash key generation 2025-06-06 19:32:19 +09:00
Tatsuhiro Tsujikawa
e0c815249d Merge pull request #2450 from nghttp2/bump-libbpf
Bump libbpf to v1.5.1
2025-06-04 20:39:58 +09:00
Tatsuhiro Tsujikawa
f5053fb2ad Bump libbpf to v1.5.1 2025-06-04 18:57:06 +09:00
Tatsuhiro Tsujikawa
53ca70ae70 Merge pull request #2449 from nghttp2/bump-llhttp
Bump llhttp to v9.3.0
2025-06-04 18:40:44 +09:00
Tatsuhiro Tsujikawa
eea717d21b Bump llhttp to v9.3.0 2025-06-04 18:18:57 +09:00
Tatsuhiro Tsujikawa
2e86b1bd77 Merge pull request #2448 from nghttp2/bump-ngtcp2
Bump ngtcp2 and its dependencies
2025-06-03 22:55:08 +09:00
Tatsuhiro Tsujikawa
8b638f219c Bump ngtcp2 and its dependencies 2025-06-03 21:46:00 +09:00
Tatsuhiro Tsujikawa
91340d59bb Merge pull request #2447 from nghttp2/app-cleanup-part2
App cleanup part2
2025-05-31 17:11:43 +09:00
Tatsuhiro Tsujikawa
3eafe7e630 Remove unnecessary cast 2025-05-31 16:34:30 +09:00
Tatsuhiro Tsujikawa
923014d163 Remove noexcept 2025-05-31 16:34:30 +09:00
Tatsuhiro Tsujikawa
4fe2aab723 Might be easier to read 2025-05-31 16:34:30 +09:00
Tatsuhiro Tsujikawa
65c9142cd1 Use is_digit 2025-05-31 16:34:30 +09:00
Tatsuhiro Tsujikawa
d159ff9baa Merge pull request #2446 from nghttp2/app-cleanup
App cleanup
2025-05-31 10:47:00 +09:00
Tatsuhiro Tsujikawa
4ef64cab52 Use std::unordered_map::contains 2025-05-31 09:56:34 +09:00
Tatsuhiro Tsujikawa
a7ae4f80ab Remove unused bio_method 2025-05-31 09:56:34 +09:00
Tatsuhiro Tsujikawa
075788af7c Remove unnecessary <map> include 2025-05-31 09:56:34 +09:00
Tatsuhiro Tsujikawa
24d4afb967 Use std::chrono::floor 2025-05-31 09:56:34 +09:00
Tatsuhiro Tsujikawa
a4d961eb17 Merge pull request #2445 from nghttp2/unordered_set
Use std::unordered_set if applicable
2025-05-31 09:56:04 +09:00
Tatsuhiro Tsujikawa
1d8abe7d1c Use std::unordered_set if applicable 2025-05-31 09:30:27 +09:00
Tatsuhiro Tsujikawa
6ad6c61af2 Merge pull request #2444 from trofi/gcc-16-include-fix
src/template.h: add missing `cstdint` include
2025-05-31 09:17:40 +09:00
Sergei Trofimovich
1440e88347 src/template.h: add missing cstdint include
Without the change build against upcoming gcc-16 fails as:

    template.h:457:9: error: ISO C++ forbids declaration of 'type name' with no type [-fpermissive]
      457 |   const uint8_t, N == std::dynamic_extent ? std::dynamic_extent : N * sizeof(T)>
          |         ^~~~~~~
2025-05-30 21:20:51 +01:00
Tatsuhiro Tsujikawa
4e34e45be6 Merge pull request #2443 from nghttp2/unordered_map
Unordered map
2025-05-30 23:22:22 +09:00
Tatsuhiro Tsujikawa
3ebd7f9966 Remove std::map::emplace detection 2025-05-30 22:55:45 +09:00
Tatsuhiro Tsujikawa
ef7b349928 Use std::unordered_map if applicable 2025-05-30 22:55:45 +09:00
Tatsuhiro Tsujikawa
abdd0ea313 Merge pull request #2442 from nghttp2/remove-const_cast-sockaddr
Remove unnecessary const_cast<sockaddr *>
2025-05-30 22:54:44 +09:00
Tatsuhiro Tsujikawa
7eb7740e01 Remove unnecessary const_cast<sockaddr *> 2025-05-30 21:57:38 +09:00
Tatsuhiro Tsujikawa
bbc091d762 Merge pull request #2441 from nghttp2/socklen_t
Reduce cast to socklen_t
2025-05-30 21:32:16 +09:00
Tatsuhiro Tsujikawa
4fa4e5fdad Reduce cast to socklen_t 2025-05-30 20:50:48 +09:00
Tatsuhiro Tsujikawa
06b758de98 Merge pull request #2440 from nghttp2/cxx-wconversion
Cxx wconversion
2025-05-30 20:23:58 +09:00
Tatsuhiro Tsujikawa
c98c67ae73 Bump neverbleed 2025-05-30 19:41:35 +09:00
Tatsuhiro Tsujikawa
32e26bcf68 Add -Wconversion flag to C++ compiler 2025-05-30 19:41:35 +09:00
Tatsuhiro Tsujikawa
b420749135 Merge pull request #2439 from nghttp2/remove-NGHTTP2_MAX_UINT64_DIGITS
Remove NGHTTP2_MAX_UINT64_DIGITS
2025-05-28 01:07:03 +09:00
Tatsuhiro Tsujikawa
47e886b5a0 Remove NGHTTP2_MAX_UINT64_DIGITS
Remove NGHTTP2_MAX_UINT64_DIGITS.  Rely on
std::numeric_limits<T>::digits10 instead.
2025-05-27 23:13:42 +09:00
Tatsuhiro Tsujikawa
cf5b34a12e Merge pull request #2438 from nghttp2/nghttpx-log-without-snprintf
nghttpx: Write log without snprintf
2025-05-27 23:13:09 +09:00
Tatsuhiro Tsujikawa
91328046dd nghttpx: Write log without snprintf
Write log without snprintf.  For syslog, printf-like format is
unavoidable.  Construct a message as much as possible, and then pass
the entire log message.
2025-05-27 22:49:53 +09:00
Tatsuhiro Tsujikawa
d34515372a Merge pull request #2437 from nghttp2/nghttpx-fix-integral-logging
nghttpx: Fix integral logging is always done in 64 bits integer
2025-05-27 21:44:34 +09:00
Tatsuhiro Tsujikawa
2a79151248 nghttpx: Fix integral logging is always done in 64 bits integer 2025-05-27 21:22:54 +09:00
Tatsuhiro Tsujikawa
b07227a169 Merge pull request #2436 from nghttp2/bump-quic-go
Bump quic-go to v0.52.0
2025-05-27 20:30:54 +09:00
Tatsuhiro Tsujikawa
1213986096 Bump quic-go to v0.52.0 2025-05-27 19:40:49 +09:00
Tatsuhiro Tsujikawa
fe0f31a85c Merge pull request #2435 from nghttp2/refactor-capitalize
Refactor http2::capitalize
2025-05-27 19:40:15 +09:00
Tatsuhiro Tsujikawa
550000f160 Refactor http2::capitalize 2025-05-27 19:20:19 +09:00
Tatsuhiro Tsujikawa
36a9d3620e Merge pull request #2434 from nghttp2/revert-2409-no-capitalize-http-field-name
Revert "nghttpx: No need to capitalize HTTP/1.1 field name"
2025-05-27 18:48:16 +09:00
Tatsuhiro Tsujikawa
e6463c00f7 Revert "nghttpx: No need to capitalize HTTP/1.1 field name"
This reverts commit e0089070f5.
2025-05-27 18:23:39 +09:00
Tatsuhiro Tsujikawa
c827d07c10 Merge pull request #2432 from nghttp2/fix-logger-format_hex
nghttpx: Fix logger does not show address correctly
2025-05-27 00:00:13 +09:00
Tatsuhiro Tsujikawa
f8e31cf478 nghttpx: Fix logger does not show address correctly 2025-05-26 23:18:00 +09:00
Tatsuhiro Tsujikawa
963cbb4cce Merge pull request #2431 from nghttp2/avoid-int-overflow
Avoid integer overflow in table generation
2025-05-26 19:26:18 +09:00
Tatsuhiro Tsujikawa
a1e557a725 Avoid integer overflow in table generation 2025-05-26 17:48:55 +09:00
Tatsuhiro Tsujikawa
a6c036e719 Merge pull request #2430 from nghttp2/remove-shrpx_exec
Remove unused shrpx_exec
2025-05-25 23:15:48 +09:00
Tatsuhiro Tsujikawa
80627afe00 Remove unused shrpx_exec 2025-05-25 22:46:35 +09:00
Tatsuhiro Tsujikawa
052a3fafa9 Merge pull request #2429 from nghttp2/rewrite-to_token68
Rewrite util::to_token68
2025-05-25 22:33:07 +09:00
Tatsuhiro Tsujikawa
5535d099f6 Rewrite util::to_token68 2025-05-25 19:41:01 +09:00
Tatsuhiro Tsujikawa
23e555662e Merge pull request #2428 from nghttp2/h2load-ranges
h2load: Adopt std::ranges
2025-05-25 19:15:27 +09:00
Tatsuhiro Tsujikawa
bbe10abe2e h2load: Adopt std::ranges 2025-05-25 18:08:01 +09:00
Tatsuhiro Tsujikawa
a86e70d278 Merge pull request #2427 from nghttp2/nghttpd-ranges
nghttpd: Adopt std::ranges
2025-05-25 18:07:18 +09:00
Tatsuhiro Tsujikawa
ba484c41a9 nghttpd: Adopt std::ranges 2025-05-25 17:38:45 +09:00
Tatsuhiro Tsujikawa
413674f3ab Merge pull request #2426 from nghttp2/nghttp-ranges
nghttp: Adopt std::ranges
2025-05-25 17:38:17 +09:00
Tatsuhiro Tsujikawa
e907529aaf nghttp: Adopt std::ranges 2025-05-25 16:53:20 +09:00
Tatsuhiro Tsujikawa
05f517b118 Merge pull request #2425 from nghttp2/remove-memchunks-append-return-value
Remove Memchunks::append return value
2025-05-25 11:51:45 +09:00
Tatsuhiro Tsujikawa
d99de27967 Remove Memchunks::append return value
Make Memchunks::append return nothing because it always stores
everything given.
2025-05-25 11:17:15 +09:00
Tatsuhiro Tsujikawa
ceeb73fbfb Merge pull request #2424 from nghttp2/safer-memchunks-reserve-append
Safer way to write data directly to Memchunks buffer
2025-05-25 11:16:16 +09:00
Tatsuhiro Tsujikawa
f336a3dfde Safer way to write data directly to Memchunks buffer 2025-05-25 10:50:08 +09:00
Tatsuhiro Tsujikawa
196e533430 Merge pull request #2423 from nghttp2/update-android-dockerfile
Update android dockerfile
2025-05-24 22:18:45 +09:00
Tatsuhiro Tsujikawa
eefe3759f1 Use ARG instead of ENV because they are build time variables 2025-05-24 21:36:19 +09:00
Tatsuhiro Tsujikawa
fd18019e84 Fix deprecated warning about ENV syntax 2025-05-24 21:30:20 +09:00
Tatsuhiro Tsujikawa
8dfd1c3f95 Migrate deprecated MAINTAINER instruction to LABEL 2025-05-24 21:02:44 +09:00
Tatsuhiro Tsujikawa
d448ee9fa5 Bump NDK version to r27c 2025-05-24 20:56:00 +09:00
Tatsuhiro Tsujikawa
0f6f47ebc9 Dockerfile.android: Bump ubuntu to 24.04 2025-05-24 20:56:00 +09:00
Tatsuhiro Tsujikawa
03c416a2ca Merge pull request #2422 from nghttp2/bump-mruby
Bump mruby to 3.4.0+
2025-05-24 20:50:42 +09:00
Tatsuhiro Tsujikawa
2ac38479f5 Bump mruby to 3.4.0+
3.4.0 breaks out-of-tree build.  Fast forward to the commit that fixes
it.
2025-05-24 19:09:13 +09:00
Tatsuhiro Tsujikawa
a4e447bd84 Merge pull request #2421 from nghttp2/fix-dockerfile
docker: Fix build failure
2025-05-24 19:08:43 +09:00
Tatsuhiro Tsujikawa
bf292cc752 docker: Fix build failure 2025-05-24 18:41:28 +09:00
Tatsuhiro Tsujikawa
3ed14f2b38 Merge pull request #2420 from nghttp2/nghttpx-ranges-part4
Nghttpx ranges part4
2025-05-24 18:40:33 +09:00
Tatsuhiro Tsujikawa
c3574b711d Adopt std::ranges for tests 2025-05-24 18:14:49 +09:00
Tatsuhiro Tsujikawa
8d9c80a285 nghttpx: Fix std::ranges adoption remnants 2025-05-24 18:14:49 +09:00
Tatsuhiro Tsujikawa
34b18758cb Merge pull request #2418 from nghttp2/utos-require-unsigned
Make util::utos require std::unsigned_integral
2025-05-24 17:58:49 +09:00
Tatsuhiro Tsujikawa
89fb8dd503 Make util::utos require std::unsigned_integral 2025-05-24 17:34:23 +09:00
Tatsuhiro Tsujikawa
7634e06611 Merge pull request #2417 from nghttp2/remove-draft-h2-alpn-support
Remove draft h2 alpn support
2025-05-24 16:58:18 +09:00
Tatsuhiro Tsujikawa
9278383c1a Remove util::get_default_alpn 2025-05-24 16:36:20 +09:00
Tatsuhiro Tsujikawa
86ba78b461 Remove draft h2 ALPN support 2025-05-24 16:36:20 +09:00
Tatsuhiro Tsujikawa
82320337ea Merge pull request #2416 from nghttp2/memchunk-reserve-test
Add test for Memchunks::reserve
2025-05-24 16:26:28 +09:00
Tatsuhiro Tsujikawa
3b7cabf15a Add test for Memchunks::reserve 2025-05-24 15:56:57 +09:00
Tatsuhiro Tsujikawa
63aa83ac42 Merge pull request #2415 from nghttp2/remove-memchunk-append-char-array
Remove Memchunks::append(const char (&)[N])
2025-05-24 15:56:30 +09:00
Tatsuhiro Tsujikawa
9a09d9602b Remove Memchunks::append(const char (&)[N]) 2025-05-24 15:18:37 +09:00
Tatsuhiro Tsujikawa
9ac5a1a773 Merge pull request #2414 from nghttp2/refactor-to_numeric_addr
Refactor util::to_numeric_addr
2025-05-24 15:18:13 +09:00
Tatsuhiro Tsujikawa
1814fc1f2f Refactor util::to_numeric_addr 2025-05-24 14:44:12 +09:00
Tatsuhiro Tsujikawa
23f2cb85fe Merge pull request #2413 from nghttp2/ranges-util
util: Adopt std::ranges
2025-05-24 14:42:25 +09:00
Tatsuhiro Tsujikawa
1c07b88b2a util: Adopt std::ranges 2025-05-24 14:05:07 +09:00
Tatsuhiro Tsujikawa
44484e2ed5 Merge pull request #2412 from nghttp2/memchunk-direct-write
Allow Writing data to Memchunks directly
2025-05-24 14:04:48 +09:00
Tatsuhiro Tsujikawa
78f542d59e Allow Writing data to Memchunks directly 2025-05-24 13:40:15 +09:00
Tatsuhiro Tsujikawa
99f658d600 Merge pull request #2411 from nghttp2/status-write
Write http status string directly
2025-05-24 13:34:07 +09:00
Tatsuhiro Tsujikawa
aa2955c8fb Write http status string directly 2025-05-24 13:11:52 +09:00
Tatsuhiro Tsujikawa
d995c75173 Merge pull request #2410 from nghttp2/rewrite-upcase
Rewrite util::upcase
2025-05-24 12:45:17 +09:00
Tatsuhiro Tsujikawa
bb7a0c78ce Rewrite util::upcase 2025-05-24 12:18:34 +09:00
Tatsuhiro Tsujikawa
4993297326 Merge pull request #2409 from nghttp2/no-capitalize-http-field-name
nghttpx: No need to capitalize HTTP/1.1 field name
2025-05-24 11:54:53 +09:00
Tatsuhiro Tsujikawa
e0089070f5 nghttpx: No need to capitalize HTTP/1.1 field name 2025-05-24 11:16:14 +09:00
Tatsuhiro Tsujikawa
c3c418ce7a Merge pull request #2408 from nghttp2/pred-func-tables
Generate tables for character predicate functions
2025-05-24 11:11:01 +09:00
Tatsuhiro Tsujikawa
2643afa593 Generate tables for character predicate functions 2025-05-24 10:46:30 +09:00
Tatsuhiro Tsujikawa
1a118fc0b2 Merge pull request #2407 from nghttp2/amend-date
Amend date
2025-05-23 23:21:28 +09:00
Tatsuhiro Tsujikawa
1af84eca7b Amend date
- Use std::chrono::system_clock::from_time_t
- Allocate extra byte for terminal NUL just in case
2025-05-23 22:59:34 +09:00
Tatsuhiro Tsujikawa
e3fbf4b0f1 Merge pull request #2406 from nghttp2/rewrite-format_http_date
Rewrite format_http_date with std::chrono
2025-05-23 22:14:12 +09:00
Tatsuhiro Tsujikawa
ac080aeabb Rewrite format_http_date with std::chrono 2025-05-23 21:43:05 +09:00
Tatsuhiro Tsujikawa
f59f7b6ded Merge pull request #2405 from nghttp2/rewrite-format_common_log
Rewrite format_common_log
2025-05-23 21:20:54 +09:00
Tatsuhiro Tsujikawa
d73b5d42e9 Rewrite format_common_log 2025-05-23 20:46:33 +09:00
Tatsuhiro Tsujikawa
8b0c12219a Merge pull request #2404 from nghttp2/rewrite-format_iso8601_basic
Rewrite format_iso8601_basic with std::chrono
2025-05-23 19:45:54 +09:00
Tatsuhiro Tsujikawa
f0fce329b3 Rewrite format_iso8601_basic with std::chrono 2025-05-23 19:11:02 +09:00
Tatsuhiro Tsujikawa
c39db11532 Merge pull request #2403 from nghttp2/hide-iso8601_date
Hide iso8601_date in unnamed namespace
2025-05-23 19:10:33 +09:00
Tatsuhiro Tsujikawa
be06de738c Hide iso8601_date in unnamed namespace 2025-05-23 18:50:09 +09:00
Tatsuhiro Tsujikawa
3b82d4848a Merge pull request #2402 from nghttp2/util-refactor-format-date
Util refactor format date
2025-05-22 22:28:16 +09:00
Tatsuhiro Tsujikawa
5504920feb Make MONTH and DAY_OF_WEEK array of std::string_view 2025-05-22 21:50:48 +09:00
Tatsuhiro Tsujikawa
faa3831d05 Rewrite cpydig 2025-05-22 21:41:17 +09:00
Tatsuhiro Tsujikawa
75d836c21e Merge pull request #2401 from nghttp2/chrono-format_iso8601
Rewrite format_iso8601 with std::chrono
2025-05-22 21:31:09 +09:00
Tatsuhiro Tsujikawa
0b730de705 Rewrite format_iso8601 with std::chrono 2025-05-22 21:11:11 +09:00
Tatsuhiro Tsujikawa
4f2b72dbeb Merge pull request #2400 from nghttp2/hide-xdigits
Hide *_XDIGITS inside table generator functions
2025-05-22 20:43:46 +09:00
Tatsuhiro Tsujikawa
5faf84cf2f Hide *_XDIGITS inside table generator functions 2025-05-22 20:23:30 +09:00
Tatsuhiro Tsujikawa
784c1dbe36 Merge pull request #2399 from nghttp2/range-disallow-array
Disallow array to substitute R &&
2025-05-22 19:43:57 +09:00
Tatsuhiro Tsujikawa
74c6a20d96 Disallow array to substitute R &&
C array is sometimes very dangerous for this purpose, for example, if
it contains NULL terminated string.  In such case, passing entire
array is unacceptable.
2025-05-22 19:13:46 +09:00
Tatsuhiro Tsujikawa
901d8d777c Merge pull request #2398 from nghttp2/faster-utox
Optimize util::utox
2025-05-22 00:45:52 +09:00
Tatsuhiro Tsujikawa
880fa82e65 Optimize util::utox 2025-05-21 23:10:03 +09:00
Tatsuhiro Tsujikawa
855e65b9c8 Merge pull request #2397 from nghttp2/faster-format_hex
Optimize util::format_hex
2025-05-21 21:20:06 +09:00
Tatsuhiro Tsujikawa
a2f37abdbe Optimize util::format_hex 2025-05-21 20:49:44 +09:00
Tatsuhiro Tsujikawa
e9b9de1006 Merge pull request #2396 from nghttp2/faster-utos
Optimize util::utos
2025-05-21 19:44:13 +09:00
Tatsuhiro Tsujikawa
ab32a1bb40 Optimize util::utos 2025-05-21 19:10:05 +09:00
Tatsuhiro Tsujikawa
e81aeb6fe4 Merge pull request #2395 from nghttp2/base64-constexpr
Make base64 encoder/decoder constexpr
2025-05-20 23:19:31 +09:00
Tatsuhiro Tsujikawa
a404ba5c12 Make base64 encoder/decoder constexpr 2025-05-20 22:49:00 +09:00
Tatsuhiro Tsujikawa
7d15a7aa6b Merge pull request #2394 from nghttp2/refine-output-iterator
Refine output iterator requirements
2025-05-20 22:38:37 +09:00
Tatsuhiro Tsujikawa
d41fd15d23 Refine output iterator requirements 2025-05-20 21:53:55 +09:00
Tatsuhiro Tsujikawa
c1f08ca2f6 Merge pull request #2393 from nghttp2/refactor-make_hostport
Refactor util::make_http_hostport and util::make_hostport
2025-05-20 21:53:25 +09:00
Tatsuhiro Tsujikawa
aeb5185a44 Refactor util::make_http_hostport and util::make_hostport 2025-05-20 21:33:54 +09:00
Tatsuhiro Tsujikawa
88171ab2bf Merge pull request #2392 from nghttp2/remove-inp_strlower
Remove util::inp_strlower in favor of util::tolower
2025-05-20 18:30:03 +09:00
Tatsuhiro Tsujikawa
02d1de1d9d Remove util::inp_strlower in favor of util::tolower 2025-05-20 18:01:25 +09:00
Tatsuhiro Tsujikawa
339bc419bf Merge pull request #2391 from nghttp2/constexpr-format_hex
Make util::format_hex constexpr
2025-05-19 23:54:36 +09:00
Tatsuhiro Tsujikawa
81e817f695 Make util::format_hex constexpr 2025-05-19 23:03:05 +09:00
Tatsuhiro Tsujikawa
6659de1cfd Merge pull request #2390 from nghttp2/rewrite-decode_hex
Rewrite util::decode_hex
2025-05-19 22:52:33 +09:00
Tatsuhiro Tsujikawa
9e11a12c72 Rewrite util::decode_hex 2025-05-19 22:28:08 +09:00
Tatsuhiro Tsujikawa
a1e9e5f640 Merge pull request #2389 from nghttp2/rewrite-utos
Rewrite util::utos functions
2025-05-19 21:27:40 +09:00
Tatsuhiro Tsujikawa
2f02abfe7a Rewrite util::utos functions 2025-05-19 21:04:10 +09:00
Tatsuhiro Tsujikawa
3bca3282f1 Merge pull request #2388 from nghttp2/rewrite-quote_string
Rewrite util::quote_string
2025-05-19 19:07:03 +09:00
Tatsuhiro Tsujikawa
646615022d Rewrite util::quote_string 2025-05-19 18:34:25 +09:00
Tatsuhiro Tsujikawa
dd293082fc Merge pull request #2387 from nghttp2/constinit
Declare hex_to_uint_tbl constinit
2025-05-19 18:18:42 +09:00
Tatsuhiro Tsujikawa
9e235fe957 Declare hex_to_uint_tbl constinit 2025-05-19 17:52:59 +09:00
Tatsuhiro Tsujikawa
2b47d4b525 Merge pull request #2386 from nghttp2/rewrite-percent-encoding
Rewrite percent encoding
2025-05-18 22:43:01 +09:00
Tatsuhiro Tsujikawa
fa5ac09ade Remove old implementation 2025-05-18 22:22:41 +09:00
Tatsuhiro Tsujikawa
a993d99977 Make util::is_hex_digit and util::hex_to_uint constexpr 2025-05-18 22:22:41 +09:00
Tatsuhiro Tsujikawa
d400319bcc Remove unused util::percent_encode 2025-05-18 21:51:09 +09:00
Tatsuhiro Tsujikawa
10d00c8a53 Rewrite util::percent_encode_token 2025-05-18 21:51:09 +09:00
Tatsuhiro Tsujikawa
b559f69199 Rewrite util::percent_decode 2025-05-18 21:15:36 +09:00
Tatsuhiro Tsujikawa
4513bfc3fc Merge pull request #2385 from nghttp2/immutablestring-literal
Add ImmutableString string literal
2025-05-18 18:30:38 +09:00
Tatsuhiro Tsujikawa
5e373a3514 Add ImmutableString string literal 2025-05-18 17:51:54 +09:00
Tatsuhiro Tsujikawa
0df91a4b0c Merge pull request #2384 from nghttp2/ranges-template
template: Adopt std::ranges
2025-05-18 17:51:09 +09:00
Tatsuhiro Tsujikawa
c362f9d36c template: Adopt std::ranges 2025-05-18 17:26:54 +09:00
Tatsuhiro Tsujikawa
9b568cf542 Merge pull request #2383 from nghttp2/ranges-memchunk
memchunk: Adopt std::ranges
2025-05-18 09:51:14 +09:00
Tatsuhiro Tsujikawa
6be52029db memchunk: Adopt std::ranges 2025-05-18 09:20:16 +09:00
Tatsuhiro Tsujikawa
fef9e8fb20 Merge pull request #2382 from nghttp2/buffer-ranges
buffer: Adopt std::ranges
2025-05-17 19:39:03 +09:00
Tatsuhiro Tsujikawa
09bb8350e8 buffer: Adopt std::ranges 2025-05-17 19:13:44 +09:00
Tatsuhiro Tsujikawa
10ebb3825a Merge pull request #2381 from nghttp2/nghttpx-ranges-shrpx
shrpx: Adopt std::ranges
2025-05-17 11:47:17 +09:00
Tatsuhiro Tsujikawa
8bdf022465 shrpx: Adopt std::ranges 2025-05-17 10:59:15 +09:00
Tatsuhiro Tsujikawa
14f1169a5a Merge pull request #2380 from nghttp2/nghttpx-remove-memcached-session-cache
Nghttpx remove memcached session cache
2025-05-17 10:49:54 +09:00
Tatsuhiro Tsujikawa
93dd369b0e Update bash_completion 2025-05-17 10:13:16 +09:00
Tatsuhiro Tsujikawa
bb3c2a3664 Update manual pages 2025-05-17 10:12:58 +09:00
Tatsuhiro Tsujikawa
11903f36a9 nghttpx: Remove TLS session cache with memcached
Nowadays, TLS session caching is done via ticket and no server side
storage is required, remove TLS session cache with memcached.
2025-05-17 10:06:58 +09:00
Tatsuhiro Tsujikawa
afedd3aa06 Merge pull request #2379 from nghttp2/rename-stream-root
Rename root to nghttp2_stream_root
2025-05-16 21:29:59 +09:00
Tatsuhiro Tsujikawa
242c0c3988 Rename root to nghttp2_stream_root
Rename root to nghttp2_stream_root to avoid potential name crash.
2025-05-16 21:03:12 +09:00
Tatsuhiro Tsujikawa
ed3b31fa4c Merge pull request #2378 from nghttp2/nghttpx-remove-ocsp
Nghttpx remove ocsp
2025-05-16 21:00:21 +09:00
Tatsuhiro Tsujikawa
b7be212c30 Update bash_completion 2025-05-16 20:33:00 +09:00
Tatsuhiro Tsujikawa
ac92a4daae Update manual pages 2025-05-16 20:33:00 +09:00
Tatsuhiro Tsujikawa
ed1c6ed344 nghttpx: Remove OCSP stapling
This commit removes OCSP stapling features and the following options
are deprecated and have no effect:

- fetch-ocsp-response-file
- no-ocsp
- no-verify-ocsp
- ocsp-update-interval
2025-05-16 20:33:00 +09:00
Tatsuhiro Tsujikawa
f804e92785 Merge pull request #2377 from nghttp2/nghttpx-listeners-per-worker
nghttpx: Listen TCP and UNIX domain sockets on worker thread
2025-05-16 19:14:12 +09:00
Tatsuhiro Tsujikawa
9275353a47 nghttpx: Listen TCP and UNIX domain sockets on worker thread
Previously, nghttpx listens TCP and UNIX domain sockets on a dedicated
thread, and then distributes the accepted connection to the one of
worker threads.  With this commit, nghttpx listens those sockets on
each worker thread.  For TCP sockets, SO_REUSEPORT is used to load
balance the connections.  This removes the need for inheriting file
descriptors via environment variables.  For UNIX domain sockets,
because there is no SO_REUSEPORT equivalent for them, they are created
as before, but they are handled per worker.

The support for legacy deprecated environment variables has been
removed.

ocsp-startup option has been deprecated due to this change.  OCSP will
be remove very soon.
2025-05-16 18:46:02 +09:00
Tatsuhiro Tsujikawa
d1bc03bd57 Merge pull request #2375 from nghttp2/nghttpx-ranges-config
shrpx_config: Adopt std::ranges
2025-05-13 23:14:36 +09:00
Tatsuhiro Tsujikawa
853b9ccd3c shrpx_config: Adopt std::ranges 2025-05-13 22:21:56 +09:00
Tatsuhiro Tsujikawa
dd02d164ba Merge pull request #2374 from nghttp2/nghttpx-ranges-part3
Nghttpx ranges part3
2025-05-13 21:59:22 +09:00
Tatsuhiro Tsujikawa
c36d0cb807 http3: Adopt std::ranges 2025-05-13 21:29:08 +09:00
Tatsuhiro Tsujikawa
68ed952004 shrpx_quic_connection_handler: Adopt std::ranges 2025-05-13 21:29:08 +09:00
Tatsuhiro Tsujikawa
f7f8592d6d shrpx_quic: Adopt std::ranges 2025-05-13 21:29:08 +09:00
Tatsuhiro Tsujikawa
500eb25302 shrpx_dns_tracker: Adopt std::ranges 2025-05-13 21:29:08 +09:00
Tatsuhiro Tsujikawa
d074d20ad4 shrpx_api_downstream_connection: Adopt std::ranges 2025-05-13 21:29:08 +09:00
Tatsuhiro Tsujikawa
66e5d45994 shrpx_router: Adopt std::ranges 2025-05-13 21:29:08 +09:00
Tatsuhiro Tsujikawa
e68fa65166 Merge pull request #2373 from nghttp2/rewrite-format_hex
Rewrite format_hex
2025-05-13 21:09:47 +09:00
Tatsuhiro Tsujikawa
d5b11e6f94 Rewrite format_hex 2025-05-13 20:39:17 +09:00
Tatsuhiro Tsujikawa
51909d8bf8 Merge pull request #2372 from nghttp2/nghttpx-ranges-part2
Nghttpx ranges part2
2025-05-13 20:38:20 +09:00
Tatsuhiro Tsujikawa
299b6a4e31 shrpx_worker_process: Adopt std::ranges 2025-05-13 20:02:22 +09:00
Tatsuhiro Tsujikawa
a7407b28ce shrpx_memcached_connection: Adopt std::ranges 2025-05-13 20:02:22 +09:00
Tatsuhiro Tsujikawa
4397a37b31 shrpx_downstream_connection_pool: Adopt std::ranges 2025-05-13 20:02:22 +09:00
Tatsuhiro Tsujikawa
996b02c2fe Merge pull request #2371 from nghttp2/str-cmp-constexpr
Make string comparison functions constexpr
2025-05-13 20:01:36 +09:00
Tatsuhiro Tsujikawa
f27d667cec Make string comparison functions constexpr 2025-05-13 19:14:00 +09:00
Tatsuhiro Tsujikawa
50c2a0fc99 Merge pull request #2370 from nghttp2/single-pass-header-name-lowecase
Single pass header name lowecase
2025-05-13 18:19:18 +09:00
Tatsuhiro Tsujikawa
9a7dad6a50 Make sure that args are forwarded once 2025-05-13 17:54:36 +09:00
Tatsuhiro Tsujikawa
12e6caadce append_last_header_key: Copy and lowecase name in a single pass 2025-05-13 17:54:36 +09:00
Tatsuhiro Tsujikawa
3cdfcd3819 Merge pull request #2369 from nghttp2/dependabot/go_modules/golang.org/x/net-0.40.0
build(deps): bump golang.org/x/net from 0.39.0 to 0.40.0
2025-05-12 23:45:52 +09:00
Tatsuhiro Tsujikawa
87396313d6 Merge pull request #2368 from nghttp2/tolower
Add template to copy lowercased string
2025-05-12 23:32:52 +09:00
dependabot[bot]
48ee27dcd0 build(deps): bump golang.org/x/net from 0.39.0 to 0.40.0
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.39.0 to 0.40.0.
- [Commits](https://github.com/golang/net/compare/v0.39.0...v0.40.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-version: 0.40.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-12 14:13:47 +00:00
Tatsuhiro Tsujikawa
cb94c00a36 Add template to copy lowercased string 2025-05-12 23:01:02 +09:00
Tatsuhiro Tsujikawa
fa00277afe Merge pull request #2367 from nghttp2/nghttpx-ranges-worker
shrpx_worker: Adopt std::ranges
2025-05-12 22:26:15 +09:00
Tatsuhiro Tsujikawa
bf5565ea2c shrpx_worker: Adopt std::ranges 2025-05-12 21:49:48 +09:00
Tatsuhiro Tsujikawa
da6f0dd646 Merge pull request #2364 from nghttp2/as_string_ref
Add helper template for StringRef from contiguous range
2025-05-12 20:56:34 +09:00
Tatsuhiro Tsujikawa
71dd4399fc Add helper template for StringRef from contiguous range 2025-05-12 20:31:39 +09:00
Tatsuhiro Tsujikawa
08c0dad06f Merge pull request #2366 from nghttp2/integration-external-dns-disable-backend-ipv6
integration: Disable IPv6 on backend for external DNS tests
2025-05-12 20:30:36 +09:00
Tatsuhiro Tsujikawa
be9066bd7a GHA: Add backend to /etc/hosts to avoid nip.io 2025-05-12 19:15:22 +09:00
Tatsuhiro Tsujikawa
13aa7e5e78 integration: Disable IPv6 on backend for external DNS tests 2025-05-12 18:43:29 +09:00
Tatsuhiro Tsujikawa
0dbcb08e64 Merge pull request #2363 from nghttp2/bump-munit
Bump munit
2025-05-11 22:23:53 +09:00
Tatsuhiro Tsujikawa
a158d1dbb4 Bump munit 2025-05-11 21:33:51 +09:00
Tatsuhiro Tsujikawa
5742430337 Merge pull request #2362 from nghttp2/nghttpx-ranges-tls
shrpx_tls: Adopt std::ranges
2025-05-11 19:10:10 +09:00
Tatsuhiro Tsujikawa
75453db4ce shrpx_tls: Adopt std::ranges 2025-05-11 18:30:46 +09:00
Tatsuhiro Tsujikawa
458613c923 Merge pull request #2361 from nghttp2/nghttpx-ranges-part1
Nghttpx ranges part1
2025-05-11 11:13:33 +09:00
Tatsuhiro Tsujikawa
f29a47d577 shrpx_downstream_queue: Adopt std::ranges 2025-05-11 10:21:24 +09:00
Tatsuhiro Tsujikawa
4b6e156ddf shrpx_http_downstream_connection: Adopt std::ranges 2025-05-11 10:21:24 +09:00
Tatsuhiro Tsujikawa
5e26011caf shrpx_downstream:: Adopt std::ranges 2025-05-11 10:21:24 +09:00
Tatsuhiro Tsujikawa
4cd3369ed1 shrpx_client_handler: Adopt std::ranges
I was surprised the changes between std::lower_bound and
std::ranges::lower_bound.  It seems using projection is the simplest
workaround for our use.
2025-05-11 10:21:24 +09:00
Tatsuhiro Tsujikawa
90b2fbea66 shrpx_connection_handler: Adopt std::ranges 2025-05-11 10:21:24 +09:00
Tatsuhiro Tsujikawa
5b725c8a83 Merge pull request #2360 from nghttp2/string-ref-hash
StringRef: Piggyback std::hash<std::string_view>
2025-05-11 10:16:57 +09:00
Tatsuhiro Tsujikawa
83e079322e StringRef: Piggyback std::hash<std::string_view> 2025-05-11 09:37:38 +09:00
Tatsuhiro Tsujikawa
cc0207c967 Merge pull request #2359 from nghttp2/ranges-base64
Ranges base64
2025-05-10 18:19:07 +09:00
Tatsuhiro Tsujikawa
1f84d34371 Merge pull request #2358 from nghttp2/nghttpx-ranges-https-upstream
shrpx_https_upstream: Adopt std::ranges
2025-05-10 17:35:56 +09:00
Tatsuhiro Tsujikawa
f1808e1a0f base64::encode: Adopt std::ranges 2025-05-10 17:05:10 +09:00
Tatsuhiro Tsujikawa
07cc22bffa shrpx_https_upstream: Adopt std::ranges 2025-05-10 17:05:10 +09:00
Tatsuhiro Tsujikawa
db0a936158 base64::decode: Adopt std::ranges 2025-05-10 17:05:10 +09:00
Tatsuhiro Tsujikawa
e1c1168db3 Merge pull request #2357 from nghttp2/nghttpx-fix-forwarded-by
nghttpx: Fix Forwarded By
2025-05-10 17:04:43 +09:00
Tatsuhiro Tsujikawa
f5606f9855 nghttpx: Fix Forwarded By
Previously, the value sent with Forward By parameter is the address
assigned to the listening socket.  This does not work expected if the
assigned address is wild card, (e.g., ::, 0.0.0.0).

This commit fixes this issue by using the local address that the
connection is accepted.  For QUIC, it is the local address that
handshake is performed, and it stays the same even after client
address migration occurred.
2025-05-10 16:32:44 +09:00
Tatsuhiro Tsujikawa
d014becee2 Merge pull request #2356 from nghttp2/nghttpx-quic-frontend-address-resolution
nghttpx: Rework frontend address resolution for QUIC packets
2025-05-10 00:28:41 +09:00
Tatsuhiro Tsujikawa
b27c5481ef nghttpx: Rework frontend address resolution for QUIC packets
Instead of getnameinfo every time when forwarding a QUIC packet
internally, cache binary representation of frontend address on
startup, and compare them.
2025-05-09 20:53:54 +09:00
Tatsuhiro Tsujikawa
fe6288421f Merge pull request #2355 from nghttp2/rst-stream-to-closed-stream
Do not submit RST_STREAM more than once
2025-05-09 19:55:46 +09:00
Tatsuhiro Tsujikawa
6e60f76825 Do not submit RST_STREAM more than once
Do not submit RST_STREAM more than once for a same stream with
nghttp2_submit_rst_stream.  Historically, nghttp2_submit_rst_stream
allows this.  nghttp2 also allows receiving multiple RST_STREAM
frames.  To keep compatibility, nghttp2_submit_rst_stream does not
fail if it attempts to submit RST_STREAM to already closed stream.
2025-05-09 18:41:30 +09:00
Tatsuhiro Tsujikawa
5784ff5b46 Merge pull request #2353 from nghttp2/rewrite-starts-with
Rewrite starts_with, ends_with and streq with std::ranges
2025-05-07 23:45:42 +09:00
Tatsuhiro Tsujikawa
d75fddda00 Rewrite starts_with, ends_with and streq with std::ranges 2025-05-07 22:47:35 +09:00
Tatsuhiro Tsujikawa
c17cf5f1f5 Merge pull request #2352 from nghttp2/remove-copy_lit
Remove util::copy_lit
2025-05-07 22:44:29 +09:00
Tatsuhiro Tsujikawa
2fb05c54ad Remove util::copy_lit 2025-05-07 21:25:41 +09:00
Tatsuhiro Tsujikawa
9555260a65 Merge pull request #2351 from nghttp2/nghttpx-ranges-http3-upstream
shrpx_http3_upstream: Adopt std::ranges
2025-05-07 21:25:13 +09:00
Tatsuhiro Tsujikawa
4ce6c8e1dc Merge pull request #2350 from Karthikdasari0423/patch-1
Update README.rst
2025-05-07 20:34:48 +09:00
Tatsuhiro Tsujikawa
6677faed55 shrpx_http3_upstream: Adopt std::ranges 2025-05-07 19:50:46 +09:00
Tatsuhiro Tsujikawa
8a8838de29 Merge pull request #2349 from nghttp2/nghttpx-ranges-http2-upstream
shrpx_http2_upstream: Adopt std::ranges
2025-05-07 19:49:51 +09:00
Karthik Dasari
fa453878c4 Update README.rst
Update clang-15 to clang-18 in README file.
2025-05-07 16:18:23 +05:30
Tatsuhiro Tsujikawa
93072a2828 shrpx_http2_upstream: Adopt std::ranges 2025-05-07 19:02:15 +09:00
Tatsuhiro Tsujikawa
f52d191a69 Merge pull request #2348 from nghttp2/nghttpx-http2-dconn
shrpx_http2_downstream_connection: Adopt std::ranges
2025-05-07 18:48:41 +09:00
Tatsuhiro Tsujikawa
84f36115e5 shrpx_http2_downstream_connection: Adopt std::ranges 2025-05-06 22:51:47 +09:00
Tatsuhiro Tsujikawa
8dd0637645 Merge pull request #2345 from nghttp2/nghttpx-log-ranges
Nghttpx log ranges
2025-05-05 09:58:48 +09:00
Tatsuhiro Tsujikawa
4d6bca22cc Merge pull request #2342 from zjturner/fix_gettickcount64_check
Fix CMake existence check for GetTickCount64
2025-05-03 09:14:12 +09:00
Tatsuhiro Tsujikawa
7bb4146e58 shrpx_log: Make write_seq take std::input_range 2025-05-02 23:35:58 +09:00
Tatsuhiro Tsujikawa
ed5f3df612 shrpx_log: Rewrite with std::span 2025-05-02 23:35:58 +09:00
Tatsuhiro Tsujikawa
f402668a4e shrpx_log: Fix left over for std::ranges migration 2025-05-02 23:35:58 +09:00
Tatsuhiro Tsujikawa
f723380e32 shrpx_log: Do not return d_last which does not change 2025-05-02 23:35:58 +09:00
Tatsuhiro Tsujikawa
1db823f451 shrpx_log: Adopt std::ranges 2025-05-02 23:35:58 +09:00
Tatsuhiro Tsujikawa
fcd710e31d Merge pull request #2344 from nghttp2/nghttpx-dns
nghttpx: Tweak DNS timeout and retry
2025-05-02 23:35:35 +09:00
Tatsuhiro Tsujikawa
6922b336b0 nghttpx: Tweak DNS timeout and retry
Decrease DNS timeout to 250ms, which is the minimum duration allowed
in c-ares.  The number of retries is 3, which is the default value of
c-ares.
2025-05-02 22:59:41 +09:00
Tatsuhiro Tsujikawa
6edf4343b2 Merge pull request #2343 from nghttp2/ranges-http
shrpx_http: Adopt std::ranges
2025-05-02 21:10:05 +09:00
Tatsuhiro Tsujikawa
81864f3c7f shrpx_http: Adopt std::ranges 2025-05-02 17:21:05 +09:00
Zachary Turner
2a0c0a2598 Fix check for GetTickCount64 2025-05-01 11:41:10 -07:00
Tatsuhiro Tsujikawa
3db4000c80 Merge pull request #2341 from nghttp2/ranges-http2
http2: Adopt std::ranges
2025-05-01 18:48:18 +09:00
Tatsuhiro Tsujikawa
c7b33ceea9 http2: Adopt std::ranges 2025-05-01 18:12:32 +09:00
Tatsuhiro Tsujikawa
e47a2cc34a Merge pull request #2340 from nghttp2/refactor-allocator
Refactor allocator
2025-05-01 18:11:56 +09:00
Tatsuhiro Tsujikawa
aa77184ed5 allocator: Use auto 2025-05-01 17:37:51 +09:00
Tatsuhiro Tsujikawa
58ff9e5188 allocator: Adopt std::ranges 2025-05-01 17:37:51 +09:00
Tatsuhiro Tsujikawa
a0bf1d13bb Remove inline from count_string_ref_count 2025-05-01 17:37:51 +09:00
Tatsuhiro Tsujikawa
c47ab92f69 Remove BlockAllocator template parameter 2025-05-01 17:37:51 +09:00
Tatsuhiro Tsujikawa
ad4b9529dc Merge pull request #2339 from nghttp2/adopt-span-first
nghttpx: Adopt std::span::first
2025-05-01 17:36:08 +09:00
Tatsuhiro Tsujikawa
b5819be055 nghttpx: Adopt std::span::first 2025-05-01 17:06:55 +09:00
Tatsuhiro Tsujikawa
21dfefa0c3 Merge pull request #2337 from nghttp2/h2load-refactor-quic-write-path
h2load: Refactor QUIC packet write path
2025-04-28 22:02:11 +09:00
Tatsuhiro Tsujikawa
4c013d1087 h2load: Refactor QUIC packet write path
Refactor QUIC packet write path in h2load.  h2load now falls back to
non-GSO write after GSO failed.
2025-04-28 21:38:55 +09:00
Tatsuhiro Tsujikawa
825b296d12 Merge pull request #2336 from nghttp2/nghttpx-refactor-quic-packet-write
nghttpx: Refactor QUIC packet write
2025-04-27 21:01:18 +09:00
Tatsuhiro Tsujikawa
514b7743d6 nghttpx: Refactor QUIC packet write 2025-04-27 19:33:52 +09:00
Tatsuhiro Tsujikawa
5265110509 Merge pull request #2333 from nghttp2/quic-ossl
h2load, nghttpx: Add libngtcp2_crypto_ossl support
2025-04-22 20:35:51 +09:00
Tatsuhiro Tsujikawa
aa96bfcb27 Merge pull request #2335 from nghttp2/dependabot/go_modules/github.com/quic-go/quic-go-0.51.0
build(deps): bump github.com/quic-go/quic-go from 0.50.1 to 0.51.0
2025-04-22 19:23:09 +09:00
dependabot[bot]
c7f062aeca build(deps): bump github.com/quic-go/quic-go from 0.50.1 to 0.51.0
Bumps [github.com/quic-go/quic-go](https://github.com/quic-go/quic-go) from 0.50.1 to 0.51.0.
- [Release notes](https://github.com/quic-go/quic-go/releases)
- [Changelog](https://github.com/quic-go/quic-go/blob/master/Changelog.md)
- [Commits](https://github.com/quic-go/quic-go/compare/v0.50.1...v0.51.0)

---
updated-dependencies:
- dependency-name: github.com/quic-go/quic-go
  dependency-version: 0.51.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-21 15:42:10 +00:00
Tatsuhiro Tsujikawa
32eeffcd11 h2load, nghttpx: Add libngtcp2_crypto_ossl support 2025-04-19 16:49:02 +09:00
Tatsuhiro Tsujikawa
67a93b53a3 Merge pull request #2332 from nghttp2/gha-android-docker
GHA: Add android workflow
2025-04-19 15:52:54 +09:00
Tatsuhiro Tsujikawa
941024f193 GHA: Add android workflow 2025-04-19 15:30:10 +09:00
Tatsuhiro Tsujikawa
127adf6acf Merge pull request #2330 from feicong/master
Fixed android support
2025-04-19 00:34:06 +09:00
feicong
ff3655c7cd Update Dockerfile.android
Co-authored-by: Tatsuhiro Tsujikawa <404610+tatsuhiro-t@users.noreply.github.com>
2025-04-18 19:37:21 +08:00
Tatsuhiro Tsujikawa
b58c6402f9 Merge pull request #2331 from nghttp2/bump-ngtcp2
Bump ngtcp2
2025-04-18 19:42:19 +09:00
Tatsuhiro Tsujikawa
0af7b9bb84 Bump ngtcp2 2025-04-18 19:06:21 +09:00
feicong
188cd1ef6b Fixed android support 2025-04-17 15:13:51 +08:00
Tatsuhiro Tsujikawa
aa82e0132a Merge pull request #2328 from nghttp2/dependabot/go_modules/golang.org/x/net-0.39.0
build(deps): bump golang.org/x/net from 0.38.0 to 0.39.0
2025-04-16 18:55:02 +09:00
dependabot[bot]
dbd027c796 build(deps): bump golang.org/x/net from 0.38.0 to 0.39.0
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.38.0 to 0.39.0.
- [Commits](https://github.com/golang/net/compare/v0.38.0...v0.39.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-version: 0.39.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-14 14:15:07 +00:00
Tatsuhiro Tsujikawa
999baf9090 Merge pull request #2327 from nghttp2/gha-macos-15
GHA: Replace macos-13 with macos-15
2025-04-13 17:47:23 +09:00
Tatsuhiro Tsujikawa
ce5b1e9235 GHA: Replace macos-13 with macos-15 2025-04-13 17:03:00 +09:00
Tatsuhiro Tsujikawa
ac29d9da5f Merge pull request #2326 from nghttp2/quic-rand-take2
quic: Use secure random generator for ngtcp2_rand
2025-04-10 21:22:50 +09:00
Tatsuhiro Tsujikawa
44495acf4f quic: Use secure random generator for ngtcp2_rand 2025-04-10 20:41:50 +09:00
Tatsuhiro Tsujikawa
29263b1b41 Merge pull request #2325 from nghttp2/revert-2324-quic-rand
Revert "quic: Use secure random generator for ngtcp2_rand"
2025-04-10 20:36:40 +09:00
Tatsuhiro Tsujikawa
3d2e252e2c Revert "quic: Use secure random generator for ngtcp2_rand" 2025-04-10 20:35:39 +09:00
Tatsuhiro Tsujikawa
e1337244d3 Merge pull request #2324 from nghttp2/quic-rand
quic: Use secure random generator for ngtcp2_rand
2025-04-10 20:31:43 +09:00
Tatsuhiro Tsujikawa
885ea764a0 quic: Use secure random generator for ngtcp2_rand 2025-04-10 19:47:56 +09:00
Tatsuhiro Tsujikawa
58a38d00e4 Merge pull request #2322 from nghttp2/update-integration-tests
Update integration tests
2025-04-04 21:11:44 +09:00
Tatsuhiro Tsujikawa
24a1554e3a Merge pull request #2318 from slyon/fix-ftbfs-upstream
doc:rubydomain: Fix build failure with rubydomain namespace
2025-04-04 20:59:22 +09:00
Tatsuhiro Tsujikawa
d167c34753 Merge pull request #2323 from nghttp2/nghttpx-close-conn-on-h1-connect-failure
nghttpx: Close h1 connection on CONNECT failure
2025-04-04 20:40:18 +09:00
Tatsuhiro Tsujikawa
4fd86afb89 nghttpx: Close h1 connection on CONNECT failure 2025-04-04 19:35:34 +09:00
Tatsuhiro Tsujikawa
a2aa9d1fc7 Fix lint errors 2025-04-04 19:32:04 +09:00
Tatsuhiro Tsujikawa
283cbc4df5 Bump go version to 1.24 2025-04-04 18:30:06 +09:00
Tatsuhiro Tsujikawa
18d98dd215 Merge pull request #2320 from nghttp2/dependabot/go_modules/github.com/quic-go/quic-go-0.50.1
build(deps): bump github.com/quic-go/quic-go from 0.50.0 to 0.50.1
2025-04-03 22:51:54 +09:00
Tatsuhiro Tsujikawa
3dee622df6 Merge pull request #2321 from nghttp2/remove-go-toolchain
Remove go toolchain
2025-04-03 21:49:40 +09:00
Tatsuhiro Tsujikawa
6b81eeb106 Remove go toolchain 2025-04-03 19:04:31 +09:00
dependabot[bot]
594bc072ae build(deps): bump github.com/quic-go/quic-go from 0.50.0 to 0.50.1
Bumps [github.com/quic-go/quic-go](https://github.com/quic-go/quic-go) from 0.50.0 to 0.50.1.
- [Release notes](https://github.com/quic-go/quic-go/releases)
- [Changelog](https://github.com/quic-go/quic-go/blob/master/Changelog.md)
- [Commits](https://github.com/quic-go/quic-go/compare/v0.50.0...v0.50.1)

---
updated-dependencies:
- dependency-name: github.com/quic-go/quic-go
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-03 10:03:31 +00:00
Tatsuhiro Tsujikawa
077259c08c Merge pull request #2319 from nghttp2/dependabot/go_modules/golang.org/x/net-0.38.0
build(deps): bump golang.org/x/net from 0.37.0 to 0.38.0
2025-04-03 19:02:24 +09:00
dependabot[bot]
168f210f34 build(deps): bump golang.org/x/net from 0.37.0 to 0.38.0
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.37.0 to 0.38.0.
- [Commits](https://github.com/golang/net/compare/v0.37.0...v0.38.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-31 14:20:04 +00:00
Lukas Märdian
a86dbfd723 doc:rubydomain: Fix build failure with rubydomain namespace
This package fails to build from source in Debian and Ubuntu:

* https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1095360
* https://bugs.launchpad.net/ubuntu/+source/nghttp2/+bug/2104171

With the following log output:
```
During a rebuild of all packages in unstable, your package failed to build:

--------------------------------------------------------------------------------
[...]
make[3]: Entering directory '/<<PKGBUILDDIR>>/integration-tests'
make[3]: Nothing to be done for 'html'.
make[3]: Leaving directory '/<<PKGBUILDDIR>>/integration-tests'
Making html in doc
make[3]: Entering directory '/<<PKGBUILDDIR>>/doc'
for i in README.rst programmers-guide.rst nghttp.1.rst nghttpd.1.rst nghttpx.1.rst h2load.1.rst; do [ -e ./$i ] || cp ./$i .; done
/usr/bin/python3 ../doc/mkapiref.py \
apiref.rst macros.rst enums.rst types.rst . ../lib/includes/nghttp2/nghttp2ver.h ../lib/includes/nghttp2/nghttp2.h
sphinx-build -b html -d manual/doctrees . manual/html
Running Sphinx v8.1.3
loading translations [en]... done

Extension error:
Could not import extension rubydomain.rubydomain (exception: No module named 'pkg_resources')
make[3]: *** [Makefile:921: html-local] Error 2
make[3]: Leaving directory '/<<PKGBUILDDIR>>/doc'
make[2]: *** [Makefile:583: html-recursive] Error 1
make[2]: Leaving directory '/<<PKGBUILDDIR>>'
make[1]: *** [debian/rules:14: override_dh_auto_build-indep] Error 2
make[1]: Leaving directory '/<<PKGBUILDDIR>>'
make: *** [debian/rules:62: binary] Error 2
dpkg-buildpackage: error: debian/rules binary subprocess returned exit status 2
```

Adding a Build-Depends-Indep on `python3-pkg-resources` fixes the build, but is deprecated.

According to setuptools:
```
def declare_namespace(packageName: str) -> None:
    """Declare that package 'packageName' is a namespace package"""

    msg = (
        f"Deprecated call to `pkg_resources.declare_namespace({packageName!r})`.\n"
        "Implementing implicit namespace packages (as specified in PEP 420) "
        "is preferred to `pkg_resources.declare_namespace`. "
        "See https://setuptools.pypa.io/en/latest/references/"
        "keywords.html#keyword-namespace-packages"
    )
    warnings.warn(msg, DeprecationWarning, stacklevel=2)
```

Here it looks like the explicit namespacing was only needed when extending the `sphinxcontrib` module, but it was renamed to be an independent module "rubydomain.rubydomain":
a029f6ed2c

So `doc/_extrs/rubydomain/__init__.py` should just be dropped to make it an implicit namespaced package in accordance with https://peps.python.org/pep-0420/.
2025-03-27 12:47:52 +01:00
Tatsuhiro Tsujikawa
daef61594c Merge pull request #2317 from nghttp2/h2load-group-name
h2load: Check the return value from OBJ_nid2sn
2025-03-23 14:12:48 +09:00
Tatsuhiro Tsujikawa
de7b174cec h2load: Check the return value from OBJ_nid2sn 2025-03-23 13:33:04 +09:00
Tatsuhiro Tsujikawa
d6af4a90d5 Merge pull request #2316 from nghttp2/dependabot/go_modules/golang.org/x/net-0.37.0
build(deps): bump golang.org/x/net from 0.35.0 to 0.37.0
2025-03-12 21:39:01 +09:00
dependabot[bot]
ea6079c2ab build(deps): bump golang.org/x/net from 0.35.0 to 0.37.0
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.35.0 to 0.37.0.
- [Commits](https://github.com/golang/net/compare/v0.35.0...v0.37.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-10 15:13:44 +00:00
Tatsuhiro Tsujikawa
3fbebd97cd Merge pull request #2314 from nghttp2/bump-quic-go
Bump github.com/quic-go/quic-go to v0.50.0
2025-03-04 19:03:08 +09:00
Tatsuhiro Tsujikawa
b3f18d73f5 Bump github.com/quic-go/quic-go to v0.50.0 2025-03-04 18:09:51 +09:00
Tatsuhiro Tsujikawa
cfbe1ff69c Bump package version 2025-03-02 16:51:14 +09:00
Tatsuhiro Tsujikawa
319bf015de Update bash_completion 2025-03-02 16:18:56 +09:00
Tatsuhiro Tsujikawa
99c572448a Update manual pages 2025-03-02 16:18:19 +09:00
Tatsuhiro Tsujikawa
a5007158df Bump package and library versions 2025-03-02 15:34:36 +09:00
Tatsuhiro Tsujikawa
0b210f072d Update AUTHORS 2025-03-02 15:32:40 +09:00
Tatsuhiro Tsujikawa
5ca289471f Merge pull request #2311 from nghttp2/bump-libbpf
Bump libbpf to v1.5.0
2025-03-02 09:28:16 +09:00
Tatsuhiro Tsujikawa
2141edda0c Merge pull request #2312 from nghttp2/fix-coverity-check
Fix errors reported by coverity
2025-03-01 17:36:14 +09:00
Tatsuhiro Tsujikawa
d9793fceaf Fix errors reported by coverity 2025-03-01 16:57:25 +09:00
Tatsuhiro Tsujikawa
1459db27fb Bump libbpf to v1.5.0 2025-02-28 17:23:48 +09:00
Tatsuhiro Tsujikawa
133cc56e70 Merge pull request #2310 from nghttp2/bump-ngtcp2
Bump ngtcp2
2025-02-27 20:48:49 +09:00
Tatsuhiro Tsujikawa
cd9a021a19 Suppress warning when building C++ code with wolfSSL 2025-02-27 18:49:45 +09:00
Tatsuhiro Tsujikawa
2e8124eadb Bump ngtcp2 and its dependencies 2025-02-27 18:20:58 +09:00
Tatsuhiro Tsujikawa
ce5329a310 Merge pull request #2309 from nghttp2/nghttpx-rework-quic-conn
nghttpx: Rework QUIC connection handling
2025-02-18 20:48:09 +09:00
Tatsuhiro Tsujikawa
1049ce0a99 nghttpx: Rework QUIC connection handling 2025-02-18 19:14:38 +09:00
Tatsuhiro Tsujikawa
6b74e0097b Merge pull request #2308 from nghttp2/dependabot/go_modules/golang.org/x/net-0.35.0
build(deps): bump golang.org/x/net from 0.34.0 to 0.35.0
2025-02-18 18:05:30 +09:00
dependabot[bot]
785b0b541d build(deps): bump golang.org/x/net from 0.34.0 to 0.35.0
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.34.0 to 0.35.0.
- [Commits](https://github.com/golang/net/compare/v0.34.0...v0.35.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-17 15:22:16 +00:00
Tatsuhiro Tsujikawa
321b71aedb Merge pull request #2306 from nghttp2/clang-format
clang-format
2025-02-08 21:47:37 +09:00
Tatsuhiro Tsujikawa
1dbbcc35e1 clang-format 2025-02-08 19:23:07 +09:00
Tatsuhiro Tsujikawa
e2e737234e Merge pull request #2305 from qnx-ports/master
Add QNX Support
2025-02-05 18:05:02 +09:00
Deep Chordia
2b7ad6e6f3 Add QNX Support 2025-02-05 10:19:04 +05:30
Tatsuhiro Tsujikawa
e01c9f10a3 Merge pull request #2304 from nghttp2/cmake-src-tests
cmake: Disable src tests if BUILD_TESTING is OFF
2025-02-03 19:07:39 +09:00
Tatsuhiro Tsujikawa
a2db898d70 cmake: Disable src tests if BUILD_TESTING is OFF 2025-02-03 18:17:34 +09:00
Tatsuhiro Tsujikawa
fd4505cfb2 Merge pull request #2302 from nghttp2/min-quic-pktlen
The minimum length of a valid QUIC packet is 21
2025-01-29 22:53:19 +09:00
Tatsuhiro Tsujikawa
9c23c72d99 The minimum length of a valid QUIC packet is 21 2025-01-29 22:33:23 +09:00
Tatsuhiro Tsujikawa
d037dc32b4 Merge pull request #2301 from nghttp2/dependabot/go_modules/github.com/quic-go/quic-go-0.49.0
build(deps): bump github.com/quic-go/quic-go from 0.48.2 to 0.49.0
2025-01-28 00:01:21 +09:00
dependabot[bot]
e045b46352 build(deps): bump github.com/quic-go/quic-go from 0.48.2 to 0.49.0
Bumps [github.com/quic-go/quic-go](https://github.com/quic-go/quic-go) from 0.48.2 to 0.49.0.
- [Release notes](https://github.com/quic-go/quic-go/releases)
- [Changelog](https://github.com/quic-go/quic-go/blob/master/Changelog.md)
- [Commits](https://github.com/quic-go/quic-go/compare/v0.48.2...v0.49.0)

---
updated-dependencies:
- dependency-name: github.com/quic-go/quic-go
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-27 14:12:46 +00:00
Tatsuhiro Tsujikawa
a4dad6d36a Merge pull request #2300 from nghttp2/stale-exempt-pr
GHA: Exempt pull request from actions/stale
2025-01-27 18:33:59 +09:00
Tatsuhiro Tsujikawa
bdf7f14b3d GHA: Exempt pull request from actions/stale 2025-01-27 18:13:27 +09:00
Tatsuhiro Tsujikawa
0c9fdf2639 Merge pull request #2299 from nghttp2/nullptr
src: nullptr
2025-01-26 21:51:37 +09:00
Tatsuhiro Tsujikawa
dd59dd8ba9 src: nullptr 2025-01-26 21:29:58 +09:00
Tatsuhiro Tsujikawa
280110ca8d Merge pull request #2298 from nghttp2/fix-stale-action
Workaround actions/stale cache issue
2025-01-26 17:45:08 +09:00
Tatsuhiro Tsujikawa
f9958255ee Workaround actions/stale cache issue 2025-01-26 17:26:17 +09:00
Tatsuhiro Tsujikawa
e25e68f234 Merge pull request #2297 from thevilledev/fix/hd-int-overflow-check
fix: Add defensive bounds checking in hd_ringbuf_init()
2025-01-25 15:40:50 +09:00
Ville Vesilehto
01accaef55 fix: remove redundant sizeof check
Co-authored-by: Tatsuhiro Tsujikawa <404610+tatsuhiro-t@users.noreply.github.com>
2025-01-24 13:24:40 +02:00
Ville Vesilehto
d06472b2c1 fix: optimise for conditions
Co-authored-by: Tatsuhiro Tsujikawa <404610+tatsuhiro-t@users.noreply.github.com>
2025-01-24 13:20:09 +02:00
Ville Vesilehto
8ada192e69 fix: set max_size as const
Co-authored-by: Tatsuhiro Tsujikawa <404610+tatsuhiro-t@users.noreply.github.com>
2025-01-24 13:16:37 +02:00
Ville Vesilehto
639b14710b fix: Add defensive integer overflow checks in hd ringbuf init
Add bounds checking in hd_ringbuf_init() to prevent potential integer
overflow during size calculations. While HPACK decoder controls its own
buffer size (4-8K typical) and is not vulnerable to remote exploitation,
this adds defensive programming guards for robustness.

Signed-off-by: Ville Vesilehto <ville@vesilehto.fi>
2025-01-20 20:57:20 +02:00
Tatsuhiro Tsujikawa
ab19019b77 Merge pull request #2296 from nghttp2/xmlfree
HtmlParser: Use xmlFree
2025-01-18 18:35:56 +09:00
Tatsuhiro Tsujikawa
15d754040a HtmlParser: Use xmlFree 2025-01-18 17:35:45 +09:00
Tatsuhiro Tsujikawa
f88c09857d Merge pull request #2295 from nghttp2/dependabot/go_modules/golang.org/x/net-0.34.0
build(deps): bump golang.org/x/net from 0.33.0 to 0.34.0
2025-01-14 18:16:54 +09:00
dependabot[bot]
3cb06f116d build(deps): bump golang.org/x/net from 0.33.0 to 0.34.0
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.33.0 to 0.34.0.
- [Commits](https://github.com/golang/net/compare/v0.33.0...v0.34.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-13 14:56:50 +00:00
Tatsuhiro Tsujikawa
e53096123c Merge pull request #2294 from nghttp2/remove-nghttp2-dependency-based-priority-section
Remove nghttp2 dependency based priority section
2025-01-12 18:24:40 +09:00
Tatsuhiro Tsujikawa
48cdba3553 Update manual pages 2025-01-12 17:51:21 +09:00
Tatsuhiro Tsujikawa
7149876704 nghttp: Remove DEPENDENCY BASED PRIORITY section from its manual page 2025-01-12 17:49:10 +09:00
Tatsuhiro Tsujikawa
6494f05638 Merge pull request #2293 from nghttp2/update-priority-doc
Update Stream priorities section
2025-01-12 17:48:05 +09:00
Tatsuhiro Tsujikawa
1f5818070d Merge pull request #2292 from nghttp2/nghttp-show-deprecation-warn-no-rfc7540-pri
nghttp: Show deprecation warning for --no-rfc7540-pri option
2025-01-12 17:13:19 +09:00
Tatsuhiro Tsujikawa
db12ee7a37 Update Stream priorities section 2025-01-12 17:10:22 +09:00
Tatsuhiro Tsujikawa
82602821d0 nghttp: Show deprecation warning for --no-rfc7540-pri option 2025-01-12 16:47:03 +09:00
Tatsuhiro Tsujikawa
d928ceb75a Merge pull request #2291 from nghttp2/nghttpd-remove-rfc7540-pri
nghttpd: Remove RFC 7540 priorities
2025-01-12 16:46:25 +09:00
Tatsuhiro Tsujikawa
7f871f63ea nghttpd: Remove RFC 7540 priorities
This change deprecates --no-rfc7540-pri option.
SETTINGS_NO_RFC7540_PRIORITIES is now always sent.
2025-01-12 16:23:45 +09:00
Tatsuhiro Tsujikawa
7e096cbc41 Merge pull request #2290 from nghttp2/nghttp-remove-rfc7540-pri
nghttp: Remove RFC 7540 priorities
2025-01-11 19:02:00 +09:00
Tatsuhiro Tsujikawa
f25a8dca17 nghttp: Remove RFC 7540 priorities
This change removes RFC 7540 priorities from nghttp.  nghttp now does
not create the initial dependency tree.  --no-dep and --no-rfc7540-pri
options have been removed.

nghttp now always sends NGHTTP2_SETTINGS_NO_RFC7540_PRIORITIES.
--extpri option has been added to set priority for a given URI.
2025-01-11 16:54:39 +09:00
Tatsuhiro Tsujikawa
c8bcf5a6a2 Merge pull request #2289 from nghttp2/deprecate-nghttp2_option_set_no_closed_streams
Deprecate nghttp2_option_set_no_closed_streams
2025-01-11 16:53:54 +09:00
Tatsuhiro Tsujikawa
b2a3299e8e Deprecate nghttp2_option_set_no_closed_streams 2025-01-11 16:13:19 +09:00
Tatsuhiro Tsujikawa
26a33cf99b Merge pull request #2288 from nghttp2/deprecate-nghttp2_option_set_server_fallback_rfc7540_priorities
Deprecate nghttp2_option_set_server_fallback_rfc7540_priorities
2025-01-10 19:40:44 +09:00
Tatsuhiro Tsujikawa
cb8421e353 Merge pull request #2287 from nghttp2/remove-rfc7540-priority
Remove RFC 7540 priorities
2025-01-10 19:01:58 +09:00
Tatsuhiro Tsujikawa
96e06509ac Deprecate nghttp2_option_set_server_fallback_rfc7540_priorities 2025-01-10 18:45:23 +09:00
Tatsuhiro Tsujikawa
3dd61f8ec3 Remove RFC 7540 priorities
Summary of the behavioral changes in public API functions:

- nghttp2_session_change_stream_priority: This function is noop.  It
  always returns 0.
- nghttp2_session_create_idle_stream: This function is noop.  It
  always returns 0.
- nghttp2_submit_request: pri_spec is ignored.
- nghttp2_submit_request2: pri_spec is ignored.
- nghttp2_submit_headers: pri_spec is ignored.
- nghttp2_submit_priority: This function is noop.  It always returns
  0.
- nghttp2_stream_get_parent: This function always returns NULL.
- nghttp2_stream_get_next_sibling: This function always returns NULL.
- nghttp2_stream_get_previous_sibling: This function always returns
  NULL.
- nghttp2_stream_get_first_child: This function always returns NULL.
- nghttp2_stream_get_weight: This function always returns
  NGHTTP2_DEFAULT_WEIGHT.
- nghttp2_stream_get_sum_dependency_weight: This function always
  returns 0.
2025-01-10 18:29:38 +09:00
Tatsuhiro Tsujikawa
8c83772f6c Merge pull request #2286 from nghttp2/bump-munit
Bump munit
2025-01-03 13:56:02 +09:00
Tatsuhiro Tsujikawa
a8d731d81f Bump munit 2025-01-03 13:07:12 +09:00
Tatsuhiro Tsujikawa
5ca0bca199 Merge pull request #2283 from nghttp2/bump-ngtcp2
Bump ngtcp2 and QUIC dependencies
2024-12-19 22:26:05 +09:00
Tatsuhiro Tsujikawa
89f27a597f Merge pull request #2282 from nghttp2/bump-golang.org/x/net
Bump golang.org/x/net to v0.33.0
2024-12-19 21:57:15 +09:00
Tatsuhiro Tsujikawa
947928bcc2 Bump golang.org/x/net to v0.33.0 2024-12-19 21:18:59 +09:00
Tatsuhiro Tsujikawa
23a17d0048 Bump ngtcp2 and QUIC dependencies 2024-12-19 21:08:07 +09:00
Tatsuhiro Tsujikawa
59f85c5d62 Merge pull request #2281 from nghttp2/dependabot/go_modules/golang.org/x/net-0.32.0
build(deps): bump golang.org/x/net from 0.31.0 to 0.32.0
2024-12-10 02:28:21 +09:00
dependabot[bot]
c7bf69c8e1 build(deps): bump golang.org/x/net from 0.31.0 to 0.32.0
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.31.0 to 0.32.0.
- [Commits](https://github.com/golang/net/compare/v0.31.0...v0.32.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-09 15:35:58 +00:00
Tatsuhiro Tsujikawa
92fa43ac91 Merge pull request #2279 from nghttp2/dependabot/go_modules/github.com/quic-go/quic-go-0.48.2
build(deps): bump github.com/quic-go/quic-go from 0.48.1 to 0.48.2
2024-12-10 00:34:58 +09:00
dependabot[bot]
b05ee704dd build(deps): bump github.com/quic-go/quic-go from 0.48.1 to 0.48.2
Bumps [github.com/quic-go/quic-go](https://github.com/quic-go/quic-go) from 0.48.1 to 0.48.2.
- [Release notes](https://github.com/quic-go/quic-go/releases)
- [Changelog](https://github.com/quic-go/quic-go/blob/master/Changelog.md)
- [Commits](https://github.com/quic-go/quic-go/compare/v0.48.1...v0.48.2)

---
updated-dependencies:
- dependency-name: github.com/quic-go/quic-go
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-02 16:31:03 +00:00
Tatsuhiro Tsujikawa
68c3600d9f Merge pull request #2275 from nghttp2/bump-ngtcp2
Bump ngtcp2
2024-11-25 20:18:54 +09:00
Tatsuhiro Tsujikawa
f51e9b300f GHA: Fix build error on Mac OS 14 2024-11-25 19:17:21 +09:00
Tatsuhiro Tsujikawa
f61d304ef3 Bump ngtcp2 and its dependencies 2024-11-25 19:09:25 +09:00
Tatsuhiro Tsujikawa
eb22cc1231 Merge pull request #2274 from nghttp2/bump-sfparse
Bump sfparse to 7eaf5b651f67123edf2605391023ed2fd7e2ef16
2024-11-18 19:31:17 +09:00
Tatsuhiro Tsujikawa
41c8940a4c Bump sfparse to 7eaf5b651f67123edf2605391023ed2fd7e2ef16 2024-11-18 19:06:12 +09:00
Tatsuhiro Tsujikawa
55c5adf967 Merge pull request #2273 from nghttp2/urlparse
Replace url-parser with urlparse
2024-11-16 18:28:31 +09:00
Tatsuhiro Tsujikawa
db315a4588 Replace url-parser with urlparse 2024-11-16 17:58:44 +09:00
Tatsuhiro Tsujikawa
da14a31cfb Merge pull request #2272 from nghttp2/dependabot/go_modules/golang.org/x/net-0.31.0
build(deps): bump golang.org/x/net from 0.30.0 to 0.31.0
2024-11-15 21:07:38 +09:00
dependabot[bot]
f5b0c5bf06 build(deps): bump golang.org/x/net from 0.30.0 to 0.31.0
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.30.0 to 0.31.0.
- [Commits](https://github.com/golang/net/compare/v0.30.0...v0.31.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-11 14:45:35 +00:00
Tatsuhiro Tsujikawa
7a96731c6b Merge pull request #2268 from TuxInvader/conn-close-bytes
account for bytes on closing connections
2024-10-30 18:28:35 +09:00
Mark Boddington
ce70fb2a3e remove len check 2024-10-29 13:24:35 +00:00
Tatsuhiro Tsujikawa
82ec1af20e Merge pull request #2270 from nghttp2/dependabot/go_modules/github.com/quic-go/quic-go-0.48.1
build(deps): bump github.com/quic-go/quic-go from 0.48.0 to 0.48.1
2024-10-29 00:32:25 +09:00
dependabot[bot]
5024c1b240 build(deps): bump github.com/quic-go/quic-go from 0.48.0 to 0.48.1
Bumps [github.com/quic-go/quic-go](https://github.com/quic-go/quic-go) from 0.48.0 to 0.48.1.
- [Release notes](https://github.com/quic-go/quic-go/releases)
- [Changelog](https://github.com/quic-go/quic-go/blob/master/Changelog.md)
- [Commits](https://github.com/quic-go/quic-go/compare/v0.48.0...v0.48.1)

---
updated-dependencies:
- dependency-name: github.com/quic-go/quic-go
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-28 14:11:11 +00:00
Mark Boddington
a30bc25ac7 account for bytes on closing connections 2024-10-25 16:28:46 +01:00
Tatsuhiro Tsujikawa
55d4de7963 Merge pull request #2266 from nghttp2/dependabot/go_modules/github.com/quic-go/quic-go-0.48.0
build(deps): bump github.com/quic-go/quic-go from 0.47.0 to 0.48.0
2024-10-22 00:13:57 +09:00
dependabot[bot]
69df6871f6 build(deps): bump github.com/quic-go/quic-go from 0.47.0 to 0.48.0
Bumps [github.com/quic-go/quic-go](https://github.com/quic-go/quic-go) from 0.47.0 to 0.48.0.
- [Release notes](https://github.com/quic-go/quic-go/releases)
- [Changelog](https://github.com/quic-go/quic-go/blob/master/Changelog.md)
- [Commits](https://github.com/quic-go/quic-go/compare/v0.47.0...v0.48.0)

---
updated-dependencies:
- dependency-name: github.com/quic-go/quic-go
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-21 14:35:01 +00:00
Tatsuhiro Tsujikawa
fcd4f2663a Bump package version 2024-10-21 20:53:29 +09:00
Tatsuhiro Tsujikawa
526ff38e02 Update manual pages 2024-10-21 20:40:27 +09:00
Tatsuhiro Tsujikawa
881aa25d6d Bump package and library versions 2024-10-21 20:40:27 +09:00
Tatsuhiro Tsujikawa
6fe7351579 Update AUTHORS 2024-10-21 20:40:27 +09:00
Tatsuhiro Tsujikawa
01a155a1b9 Merge pull request #2265 from nghttp2/fix-check-authority-doc
Update nghttp2_check_authority doc
2024-10-21 19:40:13 +09:00
Tatsuhiro Tsujikawa
866a93968b Update nghttp2_check_authority doc 2024-10-21 19:15:40 +09:00
Tatsuhiro Tsujikawa
fd251c590f Merge pull request #2264 from nghttp2/bump-libbpf
Bump libbpf to v1.4.6
2024-10-21 18:47:22 +09:00
Tatsuhiro Tsujikawa
18f5e11d35 Bump libbpf to v1.4.6 2024-10-21 18:15:25 +09:00
Tatsuhiro Tsujikawa
b62c737dc6 Merge pull request #2263 from nghttp2/h2load-gro-buffer-size
h2load: GRO buffer size should be 64KiB
2024-10-20 12:11:41 +09:00
Tatsuhiro Tsujikawa
dbb0252d19 h2load: GRO buffer size should be 64KiB 2024-10-20 11:47:16 +09:00
Tatsuhiro Tsujikawa
b268018b7f Merge pull request #2262 from nghttp2/authority-at-sign
Do not allow '@' in :authority or host field values
2024-10-19 16:42:16 +09:00
Tatsuhiro Tsujikawa
cb6dcc39f7 Do not allow '@' in :authority or host field values
:authority and host field values are just host in RFC 3986, which does
not include userinfo.  This change only affects the internal
validation of :authority and host field values.
nghttp2_check_authority still accepts '@' as a valid character because
the function might be used for the other purposes.
2024-10-19 16:10:58 +09:00
Tatsuhiro Tsujikawa
a066a27652 Merge pull request #2261 from nghttp2/bump-ngtcp2
Bump ngtcp2 and its dependencies
2024-10-18 23:08:11 +09:00
Tatsuhiro Tsujikawa
2d9e460766 Merge pull request #2260 from nghttp2/remove-extra-semicolons
Remove extra semicolons
2024-10-18 20:42:19 +09:00
Tatsuhiro Tsujikawa
b59fe32cb6 Bump ngtcp2 and its dependencies 2024-10-18 19:37:03 +09:00
Tatsuhiro Tsujikawa
01ec93ad0f Remove extra semicolons 2024-10-18 19:29:47 +09:00
Tatsuhiro Tsujikawa
1f4a5f3ac3 Merge pull request #2259 from nghttp2/fix-clang-format
clang-format macros that do not need semicolon at the end
2024-10-17 18:43:06 +09:00
Tatsuhiro Tsujikawa
d7729f0caf clang-format macros that do not need semicolon at the end 2024-10-17 18:18:22 +09:00
Tatsuhiro Tsujikawa
c4ab09c509 Merge pull request #2258 from codebytere/fix-extra-semi
fix: `-Wextra-semi` errors in `nghttp2_helper.h`
2024-10-17 18:10:19 +09:00
Shelley Vohr
b4d821716d fix: -Wextra-semi errors in nghttp2_helper.h 2024-10-16 15:39:12 +02:00
Tatsuhiro Tsujikawa
e225057700 Merge pull request #2256 from nghttp2/cmake-ares-version
cmake: Fix c-ares v1.34.0 version detection failure
2024-10-15 21:11:08 +09:00
Tatsuhiro Tsujikawa
1ee4636528 cmake: Fix c-ares v1.34.0 version detection failure 2024-10-15 20:42:53 +09:00
Tatsuhiro Tsujikawa
d8449bbd8f Merge pull request #2255 from nghttp2/wine-run-i686
GHA: Run tests for i686-w64-mingw32 host
2024-10-15 19:24:44 +09:00
Tatsuhiro Tsujikawa
c4cb8631c6 GHA: Run tests for i686-w64-mingw32 host 2024-10-15 18:51:52 +09:00
Tatsuhiro Tsujikawa
2bf3bb2faa Merge pull request #2254 from nghttp2/gha-ubuntu-24.04
Gha ubuntu 24.04
2024-10-14 21:18:29 +09:00
Tatsuhiro Tsujikawa
32248d62f3 GHA: No need to install gcc/clang when building cache 2024-10-14 18:50:01 +09:00
Tatsuhiro Tsujikawa
0600ed82cc neverbleed/cmake: Define _GNU_SOURCE 2024-10-14 18:27:29 +09:00
Tatsuhiro Tsujikawa
ea87bfff51 GHA: Bump Ubuntu runner to 24.04 2024-10-14 17:50:02 +09:00
Tatsuhiro Tsujikawa
4202608e74 Merge pull request #2249 from TuxInvader/duration-close-race
fix race condition on h1 connection close
2024-10-08 20:22:46 +09:00
Tatsuhiro Tsujikawa
ac0bb05bb7 Merge pull request #2252 from nghttp2/dependabot/go_modules/golang.org/x/net-0.30.0
build(deps): bump golang.org/x/net from 0.29.0 to 0.30.0
2024-10-08 19:27:30 +09:00
dependabot[bot]
cfe26f780e build(deps): bump golang.org/x/net from 0.29.0 to 0.30.0
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.29.0 to 0.30.0.
- [Commits](https://github.com/golang/net/compare/v0.29.0...v0.30.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-07 14:27:46 +00:00
Mark Boddington
b9af7736a1 fix race condition on h1 connection close 2024-09-23 20:14:17 +01:00
Tatsuhiro Tsujikawa
24b467f629 Merge pull request #2248 from nghttp2/fix-h2load-dgram-metric
h2load: Fix UDP datagram send/recv metric
2024-09-21 18:28:27 +09:00
Tatsuhiro Tsujikawa
af9449e282 h2load: Fix UDP datagram send/recv metric 2024-09-21 16:39:43 +09:00
Tatsuhiro Tsujikawa
3e660dcd9c Merge pull request #2245 from nghttp2/update-map
nghttp2_map: Port ngtcp2 changes
2024-09-10 18:32:02 +09:00
Tatsuhiro Tsujikawa
8655d26de4 nghttp2_map: Port ngtcp2 changes 2024-09-10 18:08:24 +09:00
Tatsuhiro Tsujikawa
fd55d39c10 Merge pull request #2244 from nghttp2/dependabot/go_modules/golang.org/x/net-0.29.0
build(deps): bump golang.org/x/net from 0.28.0 to 0.29.0
2024-09-10 09:04:21 +09:00
dependabot[bot]
85caffee2f build(deps): bump golang.org/x/net from 0.28.0 to 0.29.0
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.28.0 to 0.29.0.
- [Commits](https://github.com/golang/net/compare/v0.28.0...v0.29.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-09 23:39:23 +00:00
Tatsuhiro Tsujikawa
8dfb25cb73 Merge pull request #2243 from nghttp2/dependabot/go_modules/github.com/quic-go/quic-go-0.47.0
build(deps): bump github.com/quic-go/quic-go from 0.46.0 to 0.47.0
2024-09-10 08:38:42 +09:00
dependabot[bot]
d71858c853 build(deps): bump github.com/quic-go/quic-go from 0.46.0 to 0.47.0
Bumps [github.com/quic-go/quic-go](https://github.com/quic-go/quic-go) from 0.46.0 to 0.47.0.
- [Release notes](https://github.com/quic-go/quic-go/releases)
- [Changelog](https://github.com/quic-go/quic-go/blob/master/Changelog.md)
- [Commits](https://github.com/quic-go/quic-go/compare/v0.46.0...v0.47.0)

---
updated-dependencies:
- dependency-name: github.com/quic-go/quic-go
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-09 14:52:44 +00:00
Tatsuhiro Tsujikawa
beb25a2194 Merge pull request #2240 from nghttp2/change-clang-format-options
Change clang-format options
2024-08-28 19:25:41 +09:00
Tatsuhiro Tsujikawa
292bcbca4f Change clang-format options 2024-08-28 18:55:57 +09:00
Tatsuhiro Tsujikawa
f5d5083110 Bump package version 2024-08-27 18:23:47 +09:00
323 changed files with 24968 additions and 30096 deletions

View File

@@ -35,7 +35,29 @@ AlignConsecutiveShortCaseStatements:
Enabled: false
AcrossEmptyLines: false
AcrossComments: false
AlignCaseArrows: false
AlignCaseColons: false
AlignConsecutiveTableGenBreakingDAGArgColons:
Enabled: false
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
AlignFunctionPointers: false
PadOperators: false
AlignConsecutiveTableGenCondOperatorColons:
Enabled: false
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
AlignFunctionPointers: false
PadOperators: false
AlignConsecutiveTableGenDefinitionColons:
Enabled: false
AcrossEmptyLines: false
AcrossComments: false
AlignCompound: false
AlignFunctionPointers: false
PadOperators: false
AlignEscapedNewlines: Right
AlignOperands: Align
AlignTrailingComments:
@@ -45,6 +67,7 @@ AllowAllArgumentsOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowBreakBeforeNoexceptSpecifier: Never
AllowShortBlocksOnASingleLine: Never
AllowShortCaseExpressionOnASingleLine: true
AllowShortCaseLabelsOnASingleLine: false
AllowShortCompoundRequirementOnASingleLine: true
AllowShortEnumsOnASingleLine: true
@@ -53,9 +76,7 @@ AllowShortIfStatementsOnASingleLine: Never
AllowShortLambdasOnASingleLine: All
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: MultiLine
AttributeMacros:
- __capability
BinPackArguments: true
@@ -83,6 +104,7 @@ BraceWrapping:
BreakAdjacentStringLiterals: true
BreakAfterAttributes: Leave
BreakAfterJavaFieldAnnotations: false
BreakAfterReturnType: None
BreakArrays: true
BreakBeforeBinaryOperators: None
BreakBeforeConceptDeclarations: Always
@@ -90,13 +112,15 @@ BreakBeforeBraces: Attach
BreakBeforeInlineASMColon: OnlyMultiline
BreakBeforeTernaryOperators: true
BreakConstructorInitializers: BeforeColon
BreakFunctionDefinitionParameters: false
BreakInheritanceList: BeforeColon
BreakStringLiterals: true
BreakTemplateDeclarations: MultiLine
ColumnLimit: 80
CommentPragmas: '^ IWYU pragma:'
CompactNamespaces: false
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
ConstructorInitializerIndentWidth: 2
ContinuationIndentWidth: 2
Cpp11BracedListStyle: true
DerivePointerAlignment: false
DisableFormat: false
@@ -147,12 +171,15 @@ IntegerLiteralSeparator:
HexMinDigits: 0
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: true
KeepEmptyLinesAtEOF: false
KeepEmptyLines:
AtEndOfFile: false
AtStartOfBlock: false
AtStartOfFile: true
LambdaBodyIndentation: Signature
LineEnding: DeriveLF
MacroBlockBegin: ''
MacroBlockEnd: ''
MainIncludeChar: Quote
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
ObjCBinPackProtocolList: Auto
@@ -221,6 +248,7 @@ SpacesInLineCommentPrefix:
Maximum: -1
SpacesInParens: Never
SpacesInParensOptions:
ExceptDoubleParentheses: false
InCStyleCasts: false
InConditionalStatements: false
InEmptyParentheses: false
@@ -232,6 +260,10 @@ StatementAttributeLikeMacros:
StatementMacros:
- Q_UNUSED
- QT_REQUIRE_VERSION
- munit_void_test_decl
- nghttp2_max_def
- nghttp2_min_def
TableGenBreakInsideDAGArg: DontBreak
TabWidth: 8
UseTab: Never
VerilogBreakBetweenInstancePorts: true

24
.github/workflows/android.yml vendored Normal file
View File

@@ -0,0 +1,24 @@
name: android
on:
push:
paths:
- Dockerfile.android
- .github/workflows/android.yml
branches:
- '**'
permissions: read-all
jobs:
build:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v5
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build
uses: docker/build-push-action@v6
with:
file: Dockerfile.android

View File

@@ -5,26 +5,26 @@ on: [push, pull_request]
permissions: read-all
env:
LIBBPF_VERSION: v1.4.5
LIBBPF_VERSION: v1.6.2
OPENSSL1_VERSION: 1_1_1w+quic
OPENSSL3_VERSION: 3.1.5+quic
BORINGSSL_VERSION: e13f7e2ff5432205f09b4679c8a7715f1c130372
AWSLC_VERSION: v1.34.2
NGHTTP3_VERSION: v1.5.0
NGTCP2_VERSION: v1.7.0
WOLFSSL_VERSION: v5.7.2-stable
OPENSSL3_VERSION: 3.6.0
BORINGSSL_VERSION: db1a8456167249f95b854a1cd24c6b553d0f1567
AWSLC_VERSION: v1.62.0
NGHTTP3_VERSION: v1.12.0
NGTCP2_VERSION: v1.17.0
WOLFSSL_VERSION: v5.8.2-stable
jobs:
build-cache:
strategy:
matrix:
os: [ubuntu-22.04, macos-13, macos-14]
os: [ubuntu-24.04, macos-14, macos-15]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v5
- name: Restore libbpf cache
id: cache-libbpf
uses: actions/cache@v4
@@ -49,8 +49,8 @@ jobs:
uses: actions/cache@v4
with:
path: |
boringssl/build/crypto/libcrypto.a
boringssl/build/ssl/libssl.a
boringssl/build/libcrypto.a
boringssl/build/libssl.a
boringssl/include
key: ${{ matrix.os }}-boringssl-${{ env.BORINGSSL_VERSION }}
- name: Restore aws-lc cache
@@ -104,8 +104,6 @@ jobs:
run: |
sudo apt-get update
sudo apt-get install \
g++-12 \
clang-15 \
autoconf \
automake \
autotools-dev \
@@ -120,7 +118,6 @@ jobs:
brew install \
autoconf \
automake \
pkg-config \
libtool
- name: Build libbpf
if: steps.cache-libbpf.outputs.cache-hit != 'true' && runner.os == 'Linux'
@@ -136,12 +133,12 @@ jobs:
./config --prefix=$PWD/build
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)"
make install_sw
- name: Build quictls/openssl v3.x
- name: Build openssl/openssl v3.x
if: steps.cache-openssl3.outputs.cache-hit != 'true'
run: |
git clone --recursive --shallow-submodules --depth 1 -b openssl-${{ env.OPENSSL3_VERSION }} https://github.com/quictls/openssl openssl3
git clone --recursive --shallow-submodules --depth 1 -b openssl-${{ env.OPENSSL3_VERSION }} https://github.com/openssl/openssl openssl3
cd openssl3
./config enable-ktls --prefix=$PWD/build --libdir=$PWD/build/lib
./config enable-ktls --prefix=$PWD/build
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)"
make install_sw
- name: Build BoringSSL
@@ -193,7 +190,7 @@ jobs:
./configure --prefix=$PWD/build --enable-lib-only \
PKG_CONFIG_PATH="../openssl1/build/lib/pkgconfig:../wolfssl/build/lib/pkgconfig" \
BORINGSSL_CFLAGS="-I$PWD/../boringssl/include/" \
BORINGSSL_LIBS="-L$PWD/../boringssl/build/ssl -lssl -L$PWD/../boringssl/build/crypto -lcrypto" \
BORINGSSL_LIBS="-L$PWD/../boringssl/build -lssl -lcrypto" \
--disable-dependency-tracking \
--with-boringssl \
--with-wolfssl
@@ -206,7 +203,7 @@ jobs:
cd ngtcp2-openssl3
autoreconf -i
./configure --prefix=$PWD/build --enable-lib-only \
PKG_CONFIG_PATH="../openssl3/build/lib/pkgconfig" \
PKG_CONFIG_PATH="../openssl3/build/lib64/pkgconfig:../openssl3/build/lib/pkgconfig" \
BORINGSSL_CFLAGS="-I$PWD/../aws-lc/include/" \
BORINGSSL_LIBS="-L$PWD/../aws-lc/build/ssl -lssl -L$PWD/../aws-lc/build/crypto -lcrypto" \
--disable-dependency-tracking \
@@ -220,46 +217,42 @@ jobs:
strategy:
matrix:
os: [ubuntu-22.04, macos-13, macos-14]
os: [ubuntu-24.04, macos-14, macos-15]
compiler: [gcc, clang]
buildtool: [autotools, cmake]
http3: [http3, no-http3]
openssl: [openssl1, openssl3, boringssl, awslc, wolfssl]
exclude:
- os: macos-13
openssl: openssl3
- os: macos-14
openssl: openssl3
- http3: no-http3
openssl: openssl3
- os: macos-13
compiler: gcc
- os: macos-14
compiler: gcc
- # disable macos cmake because of include path issue
os: macos-13
buildtool: cmake
- os: macos-15
compiler: gcc
- # disable macos cmake because of include path issue
os: macos-14
buildtool: cmake
- os: macos-13
openssl: boringssl
- # disable macos cmake because of include path issue
os: macos-15
buildtool: cmake
- os: macos-14
openssl: boringssl
- os: macos-15
openssl: boringssl
- openssl: boringssl
buildtool: cmake
- openssl: boringssl
compiler: gcc
- os: macos-13
openssl: awslc
- os: macos-14
openssl: awslc
- os: macos-15
openssl: awslc
- openssl: awslc
buildtool: cmake
- openssl: awslc
compiler: gcc
include:
- os: ubuntu-22.04
- os: ubuntu-24.04
compiler: clang
buildtool: distcheck
http3: http3
@@ -269,7 +262,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
submodules: recursive
- name: Linux setup
@@ -277,8 +270,8 @@ jobs:
run: |
sudo apt-get update
sudo apt-get install \
g++-12 \
clang-15 \
g++-14 \
clang-19 \
autoconf \
automake \
autotools-dev \
@@ -317,8 +310,8 @@ jobs:
- name: Setup clang (Linux)
if: runner.os == 'Linux' && matrix.compiler == 'clang'
run: |
echo 'CC=clang-15' >> $GITHUB_ENV
echo 'CXX=clang++-15' >> $GITHUB_ENV
echo 'CC=clang-19' >> $GITHUB_ENV
echo 'CXX=clang++-19' >> $GITHUB_ENV
- name: Setup clang (MacOS)
if: runner.os == 'macOS' && matrix.compiler == 'clang'
run: |
@@ -327,8 +320,8 @@ jobs:
- name: Setup gcc (Linux)
if: runner.os == 'Linux' && matrix.compiler == 'gcc'
run: |
echo 'CC=gcc-12' >> $GITHUB_ENV
echo 'CXX=g++-12' >> $GITHUB_ENV
echo 'CC=gcc-14' >> $GITHUB_ENV
echo 'CXX=g++-14' >> $GITHUB_ENV
# g++-12 is known to produce false positive warnings.
echo 'CXXFLAGS=-Wno-restrict' >> $GITHUB_ENV
- name: Setup gcc (MacOS)
@@ -354,7 +347,7 @@ jobs:
echo 'EXTRA_AUTOTOOLS_OPTS='"$EXTRA_AUTOTOOLS_OPTS" >> $GITHUB_ENV
echo 'EXTRA_CMAKE_OPTS='"$EXTRA_CMAKE_OPTS" >> $GITHUB_ENV
- name: Setup libev variables
if: matrix.os == 'macos-14'
if: runner.os == 'macOS'
run: |
LIBEV_CFLAGS="-I/opt/homebrew/Cellar/libev/4.33/include"
LIBEV_LIBS="-L/opt/homebrew/Cellar/libev/4.33/lib -lev"
@@ -368,7 +361,7 @@ jobs:
path: openssl1/build
key: ${{ matrix.os }}-openssl-${{ env.OPENSSL1_VERSION }}
fail-on-cache-miss: true
- name: Restore quictls/openssl v3.x cache
- name: Restore openssl/openssl v3.x cache
uses: actions/cache/restore@v4
if: matrix.openssl == 'openssl3'
with:
@@ -380,8 +373,8 @@ jobs:
if: matrix.openssl == 'boringssl'
with:
path: |
boringssl/build/crypto/libcrypto.a
boringssl/build/ssl/libssl.a
boringssl/build/libcrypto.a
boringssl/build/libssl.a
boringssl/include
key: ${{ matrix.os }}-boringssl-${{ env.BORINGSSL_VERSION }}
fail-on-cache-miss: true
@@ -401,7 +394,7 @@ jobs:
cd boringssl
OPENSSL_CFLAGS="-I$PWD/include/"
OPENSSL_LIBS="-L$PWD/build/ssl -lssl -L$PWD/build/crypto -lcrypto -pthread"
OPENSSL_LIBS="-L$PWD/build -lssl -lcrypto -pthread"
EXTRA_AUTOTOOLS_OPTS="$EXTRA_AUTOTOOLS_OPTS --without-neverbleed --without-jemalloc --disable-examples"
echo 'OPENSSL_CFLAGS='"$OPENSSL_CFLAGS" >> $GITHUB_ENV
@@ -462,16 +455,16 @@ jobs:
- name: Setup extra environment variables
if: matrix.http3 == 'no-http3'
run: |
PKG_CONFIG_PATH="$PWD/openssl1/build/lib/pkgconfig:$PWD/openssl3/build/lib/pkgconfig:$PWD/wolfssl/build/lib/pkgconfig:$PKG_CONFIG_PATH"
LDFLAGS="$LDFLAGS -Wl,-rpath,$PWD/openssl1/build/lib -Wl,-rpath,$PWD/openssl3/build/lib"
PKG_CONFIG_PATH="$PWD/openssl1/build/lib/pkgconfig:$PWD/openssl3/build/lib64/pkgconfig:$PWD/openssl3/build/lib/pkgconfig:$PWD/wolfssl/build/lib/pkgconfig:$PKG_CONFIG_PATH"
LDFLAGS="$LDFLAGS -Wl,-rpath,$PWD/openssl1/build/lib -Wl,-rpath,$PWD/openssl3/build/lib64 -Wl,-rpath,$PWD/openssl3/build/lib"
echo 'PKG_CONFIG_PATH='"$PKG_CONFIG_PATH" >> $GITHUB_ENV
echo 'LDFLAGS='"$LDFLAGS" >> $GITHUB_ENV
- name: Setup extra environment variables for HTTP/3
if: matrix.http3 == 'http3'
run: |
PKG_CONFIG_PATH="$PWD/openssl1/build/lib/pkgconfig:$PWD/openssl3/build/lib/pkgconfig:$PWD/wolfssl/build/lib/pkgconfig:$PWD/nghttp3/build/lib/pkgconfig:$PWD/ngtcp2-openssl1/build/lib/pkgconfig:$PWD/ngtcp2-openssl3/build/lib/pkgconfig:$PWD/libbpf/build/lib64/pkgconfig:$PKG_CONFIG_PATH"
LDFLAGS="$LDFLAGS -Wl,-rpath,$PWD/openssl1/build/lib -Wl,-rpath,$PWD/openssl3/build/lib -Wl,-rpath,$PWD/libbpf/build/lib64"
PKG_CONFIG_PATH="$PWD/openssl1/build/lib/pkgconfig:$PWD/openssl3/build/lib64/pkgconfig:$PWD/openssl3/build/lib/pkgconfig:$PWD/wolfssl/build/lib/pkgconfig:$PWD/nghttp3/build/lib/pkgconfig:$PWD/ngtcp2-openssl1/build/lib/pkgconfig:$PWD/ngtcp2-openssl3/build/lib/pkgconfig:$PWD/libbpf/build/lib64/pkgconfig:$PKG_CONFIG_PATH"
LDFLAGS="$LDFLAGS -Wl,-rpath,$PWD/openssl1/build/lib -Wl,-rpath,$PWD/openssl3/build/lib64 -Wl,-rpath,$PWD/openssl3/build/lib -Wl,-rpath,$PWD/libbpf/build/lib64"
EXTRA_AUTOTOOLS_OPTS="$EXTRA_AUTOTOOLS_OPTS --enable-http3"
EXTRA_CMAKE_OPTS="$EXTRA_CMAKE_OPTS -DENABLE_HTTP3=1"
@@ -531,15 +524,16 @@ jobs:
cd $NGHTTP2_BUILD_DIR
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)"
make -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)" check
- uses: actions/setup-go@v5
- uses: actions/setup-go@v6
if: matrix.buildtool != 'distcheck'
with:
go-version: "1.22"
go-version: "1.24"
- name: Integration test
# Integration tests for nghttpx; autotools erases build
# artifacts.
if: matrix.buildtool != 'distcheck'
run: |
sudo sh -c 'echo "127.0.0.1 127.0.0.1.nip.io" >> /etc/hosts'
cd $NGHTTP2_BUILD_DIR/integration-tests
make it
@@ -548,19 +542,22 @@ jobs:
matrix:
host: [x86_64-w64-mingw32, i686-w64-mingw32]
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
env:
HOST: ${{ matrix.host }}
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
submodules: recursive
- name: Linux setup
- name: Prepare for i386
if: matrix.host == 'i686-w64-mingw32'
run: |
sudo dpkg --add-architecture i386
- name: Linux setup
run: |
sudo apt-get update
sudo apt-get install \
gcc-mingw-w64 \
@@ -581,9 +578,8 @@ jobs:
make -j$(nproc)
make -j$(nproc) check TESTS=""
- name: Run tests
if: matrix.host == 'x86_64-w64-mingw32'
run: |
export WINEPATH=/usr/x86_64-w64-mingw32/lib
export WINEPATH="/usr/${{ matrix.host }}/lib;$(winepath -w /usr/lib/x86_64-linux-gnu/wine/x86_64-windows)"
cd tests
wine main.exe
@@ -601,7 +597,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
submodules: recursive
- uses: microsoft/setup-msbuild@v2
@@ -623,10 +619,10 @@ jobs:
permissions:
contents: write
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
fetch-depth: 0
submodules: recursive
@@ -643,7 +639,7 @@ jobs:
GPG_KEY: ${{ secrets.GPG_KEY }}
GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
- name: Make release
uses: actions/github-script@v7
uses: actions/github-script@v8
with:
script: |
const fs = require('fs')

View File

@@ -11,10 +11,10 @@ permissions: read-all
jobs:
build:
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build

View File

@@ -6,15 +6,17 @@ on:
permissions:
issues: write
actions: write
jobs:
stale:
runs-on: ubuntu-22.04
runs-on: ubuntu-24.04
steps:
- uses: actions/stale@v9
- uses: actions/stale@v10
with:
stale-issue-message: 'This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 7 days.'
days-before-stale: 30
days-before-close: 7
days-before-pr-stale: -1
exempt-all-milestones: true

3
.gitmodules vendored
View File

@@ -8,3 +8,6 @@
[submodule "tests/munit"]
path = tests/munit
url = https://github.com/ngtcp2/munit
[submodule "third-party/urlparse"]
path = third-party/urlparse
url = https://github.com/ngtcp2/urlparse

10
AUTHORS
View File

@@ -47,6 +47,7 @@ David Beitey
David Korczynski
David Weekly
Deel
Deep Chordia
Dimitris Apostolou
Dmitri Tikhonov
Dmitriy Vetutnev
@@ -79,6 +80,7 @@ Jonas Kvinge
Josh Braegger
José F. Calcerrada
Kamil Dudka
Karthik Dasari
Kazuho Oku
Kenny (kang-yen) Peng
Kenny Peng
@@ -88,9 +90,11 @@ LazyHamster
Leo Neat
Lorenz Nickel
Lucas Pardue
Lukas Märdian
MATSUMOTO Ryosuke
Marc Bachmann
Marcelo Trylesinski
Mark Boddington
Matt Rudary
Matt Way
Michael Kaufmann
@@ -102,6 +106,7 @@ Nora Shoemaker
Paweł Wegner
Pedro Santos
Peeyush Aggarwal
Peng-Yu Chen
Peter Wu
Piotr Sikora
PufferOverflow
@@ -117,6 +122,7 @@ Ryan Carsten Schmidt
Ryo Ota
Scott Mitchell
Sebastiaan Deckers
Sergei Trofimovich
Sergey Fedorov
Shelley Vohr
Simon Frankenberger
@@ -140,18 +146,22 @@ Vernon Tang
Viacheslav Biriukov
Viktor Szakats
Viktor Szépe
Ville Vesilehto
Wenfeng Liu
William A Rowe Jr
Xiaoguang Sun
Zachary Turner
Zhuoyun Wei
acesso
ayanamist
bmarques1995
bxshi
clemahieu
dalf
dawg
es
fangdingjun
feicong
hrxi
jwchoi
kumagi

View File

@@ -24,13 +24,13 @@
cmake_minimum_required(VERSION 3.14)
# XXX using 1.8.90 instead of 1.9.0-DEV
project(nghttp2 VERSION 1.63.0 LANGUAGES C)
project(nghttp2 VERSION 1.68.0 LANGUAGES C)
# See versioning rule:
# https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
set(LT_CURRENT 42)
set(LT_CURRENT 43)
set(LT_REVISION 2)
set(LT_AGE 28)
set(LT_AGE 29)
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
include(Version)
@@ -71,20 +71,8 @@ if(WITH_WOLFSSL)
else()
find_package(OpenSSL 1.1.1)
endif()
find_package(Libngtcp2 1.0.0)
if(OPENSSL_FOUND)
find_package(Libngtcp2_crypto_quictls 1.0.0)
if(LIBNGTCP2_CRYPTO_QUICTLS_FOUND)
set(HAVE_LIBNGTCP2_CRYPTO_QUICTLS 1)
endif()
endif()
if(WOLFSSL_FOUND)
find_package(Libngtcp2_crypto_wolfssl 1.0.0)
if(LIBNGTCP2_CRYPTO_WOLFSSL_FOUND)
set(HAVE_LIBNGTCP2_CRYPTO_WOLFSSL 1)
endif()
endif()
find_package(Libnghttp3 1.1.0)
find_package(Libngtcp2 1.15.0)
find_package(Libnghttp3 1.11.0)
if(WITH_LIBBPF)
find_package(Libbpf 0.7.0)
if(NOT LIBBPF_FOUND)
@@ -155,10 +143,10 @@ if(NOT ENABLE_LIB_ONLY)
#include <vector>
#include <future>
int main() { std::vector<std::future<int>> v; }" HAVE_STD_FUTURE)
# Check that std::map::emplace is available for g++-4.7.
# Check that std::chrono::time_zone is available.
check_cxx_source_compiles("
#include <map>
int main() { std::map<int, int>().emplace(1, 2); }" HAVE_STD_MAP_EMPLACE)
#include <chrono>
int main() { auto tz = std::chrono::current_zone(); (void)tz; }" HAVE_STD_CHRONO_TIME_ZONE)
cmake_pop_check_state()
endif()
@@ -196,10 +184,14 @@ if(NOT ENABLE_LIB_ONLY AND OPENSSL_FOUND)
if(WIN32)
set(CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}" "ws2_32" "bcrypt")
endif()
check_symbol_exists("LIBRESSL_VERSION_NUMBER" "openssl/opensslv.h" LIBRESSL_FOUND)
if(ENABLE_HTTP3)
check_symbol_exists(SSL_provide_quic_data "openssl/ssl.h" HAVE_SSL_PROVIDE_QUIC_DATA)
if(NOT HAVE_SSL_PROVIDE_QUIC_DATA)
message(WARNING "OpenSSL in ${OPENSSL_LIBRARIES} does not have SSL_provide_quic_data. HTTP/3 support cannot be enabled")
check_symbol_exists(SSL_set_quic_tls_cbs "openssl/ssl.h" HAVE_SSL_SET_QUIC_TLS_CBS)
if(NOT HAVE_SSL_SET_QUIC_TLS_CBS)
message(WARNING "OpenSSL in ${OPENSSL_LIBRARIES} has neither SSL_provide_quic_data nor SSL_set_quic_tls_cbs. HTTP/3 support cannot be enabled")
endif()
endif()
endif()
cmake_pop_check_state()
@@ -279,12 +271,41 @@ if(ENABLE_APP AND NOT (ZLIB_FOUND AND (OPENSSL_FOUND OR WOLFSSL_FOUND) AND LIBEV
message(FATAL_ERROR "Applications were requested (ENABLE_APP=1) but dependencies are not met.")
endif()
# HTTP/3 requires libngtcp2 + (quictls/openssl +
# libngtcp2_crypto_quictls or wolfSSL + libngtcp2_crypto_wolfssl) and
# libnghttp3.
if(ENABLE_HTTP3)
if(HAVE_SSL_PROVIDE_QUIC_DATA AND NOT LIBRESSL_FOUND)
find_package(Libngtcp2_crypto_quictls 1.15.0)
if(LIBNGTCP2_CRYPTO_QUICTLS_FOUND)
set(HAVE_LIBNGTCP2_CRYPTO_QUICTLS 1)
endif()
elseif(HAVE_SSL_PROVIDE_QUIC_DATA AND LIBRESSL_FOUND)
find_package(Libngtcp2_crypto_libressl 1.15.0)
if(LIBNGTCP2_CRYPTO_LIBRESSL_FOUND)
set(HAVE_LIBNGTCP2_CRYPTO_LIBRESSL 1)
endif()
elseif(HAVE_WOLFSSL_SSL_PROVIDE_QUIC_DATA)
find_package(Libngtcp2_crypto_wolfssl 1.15.0)
if(LIBNGTCP2_CRYPTO_WOLFSSL_FOUND)
set(HAVE_LIBNGTCP2_CRYPTO_WOLFSSL 1)
endif()
elseif(HAVE_SSL_SET_QUIC_TLS_CBS)
find_package(Libngtcp2_crypto_ossl 1.15.0)
if(LIBNGTCP2_CRYPTO_OSSL_FOUND)
set(HAVE_LIBNGTCP2_CRYPTO_OSSL 1)
endif()
endif()
endif()
# HTTP/3 requires libngtcp2 + nghttp3 + one of:
#
# - quictls/openssl + libngtcp2_crypto_quictls
# - libressl + libngtcp2_crypto_libressl
# - wolfSSL + libngtcp2_crypto_wolfssl
# - openssl/openssl + libngtcp2_crypto_ossl
if(ENABLE_HTTP3 AND NOT (LIBNGTCP2_FOUND AND LIBNGHTTP3_FOUND AND
((HAVE_SSL_PROVIDE_QUIC_DATA AND LIBNGTCP2_CRYPTO_QUICTLS_FOUND) OR
(HAVE_WOLFSSL_SSL_PROVIDE_QUIC_DATA AND LIBNGTCP2_CRYPTO_WOLFSSL_FOUND))))
((HAVE_SSL_PROVIDE_QUIC_DATA AND NOT LIBRESSL_FOUND AND LIBNGTCP2_CRYPTO_QUICTLS_FOUND) OR
(HAVE_SSL_PROVIDE_QUIC_DATA AND LIBRESSL_FOUND AND LIBNGTCP2_CRYPTO_LIBRESSL_FOUND) OR
(HAVE_WOLFSSL_SSL_PROVIDE_QUIC_DATA AND LIBNGTCP2_CRYPTO_WOLFSSL_FOUND) OR
(HAVE_SSL_SET_QUIC_TLS_CBS AND LIBNGTCP2_CRYPTO_OSSL_FOUND))))
message(FATAL_ERROR "HTTP/3 was requested (ENABLE_HTTP3=1) but dependencies are not met.")
endif()
@@ -361,7 +382,7 @@ check_function_exists(clock_gettime HAVE_CLOCK_GETTIME)
check_function_exists(mkostemp HAVE_MKOSTEMP)
check_function_exists(pipe2 HAVE_PIPE2)
check_symbol_exists(GetTickCount64 sysinfoapi.h HAVE_GETTICKCOUNT64)
check_symbol_exists(GetTickCount64 "windows.h;sysinfoapi.h" HAVE_GETTICKCOUNT64)
include(CheckSymbolExists)
# XXX does this correctly detect initgroups (un)availability on cygwin?
@@ -478,7 +499,6 @@ if(ENABLE_DOC)
add_subdirectory(doc)
endif()
add_subdirectory(contrib)
add_subdirectory(script)
add_subdirectory(bpf)
@@ -512,6 +532,7 @@ message(STATUS "summary of build options:
Libc-ares: ${HAVE_LIBCARES} (LIBS='${LIBCARES_LIBRARIES}')
Libngtcp2: ${HAVE_LIBNGTCP2} (LIBS='${LIBNGTCP2_LIBRARIES}')
Libngtcp2_crypto_quictls: ${HAVE_LIBNGTCP2_CRYPTO_QUICTLS} (LIBS='${LIBNGTCP2_CRYPTO_QUICTLS_LIBRARIES}')
Libngtcp2_crypto_libressl: ${HAVE_LIBNGTCP2_CRYPTO_LIBRESSL} (LIBS='${LIBNGTCP2_CRYPTO_LIBRESSL_LIBRARIES}')
Libngtcp2_crypto_wolfssl: ${HAVE_LIBNGTCP2_CRYPTO_WOLFSSL} (LIBS='${LIBNGTCP2_CRYPTO_WOLFSSL_LIBRARIES}')
Libnghttp3: ${HAVE_LIBNGHTTP3} (LIBS='${LIBNGHTTP3_LIBRARIES}')
Libbpf: ${HAVE_LIBBPF} (LIBS='${LIBBPF_LIBRARIES}')

View File

@@ -12,21 +12,21 @@
# Only use standalone-toolchain for reduce size
FROM ubuntu:22.04
MAINTAINER Tatsuhiro Tsujikawa
FROM ubuntu:24.04
LABEL org.opencontainers.image.authors="Tatsuhiro Tsujikawa"
ENV NDK_VERSION r26d
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
ARG NDK_VERSION=r27c
ARG NDK=/root/android-ndk-$NDK_VERSION
ARG TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
ARG TARGET=aarch64-linux-android
ARG API=33
ARG AR=$TOOLCHAIN/bin/llvm-ar
ARG CC=$TOOLCHAIN/bin/$TARGET$API-clang
ARG CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
ARG LD=$TOOLCHAIN/bin/ld
ARG RANDLIB=$TOOLCHAIN/bin/llvm-ranlib
ARG STRIP=$TOOLCHAIN/bin/llvm-strip
ARG PREFIX=/root/usr/local
WORKDIR /root
RUN apt-get update && \
@@ -42,11 +42,11 @@ RUN curl -L -O https://dl.google.com/android/repository/android-ndk-$NDK_VERSION
rm android-ndk-$NDK_VERSION-linux.zip
# Setup version of libraries
ENV OPENSSL_VERSION 1.1.1w
ENV LIBEV_VERSION 4.33
ENV ZLIB_VERSION 1.3.1
ENV CARES_VERSION 1.18.1
ENV NGHTTP2_VERSION master
ARG OPENSSL_VERSION=1.1.1w
ARG LIBEV_VERSION=4.33
ARG ZLIB_VERSION=1.3.1
ARG CARES_VERSION=1.18.1
ARG NGHTTP2_VERSION=master
WORKDIR /root/build
RUN curl -L -O https://www.openssl.org/source/openssl-$OPENSSL_VERSION.tar.gz && \
@@ -105,7 +105,7 @@ RUN ./configure \
make install
WORKDIR /root/build
RUN git clone https://github.com/nghttp2/nghttp2 -b $NGHTTP2_VERSION --depth 1
RUN git clone --recursive --shallow-submodules https://github.com/nghttp2/nghttp2 -b $NGHTTP2_VERSION --depth 1
WORKDIR /root/build/nghttp2
RUN autoreconf -i && \
./configure \
@@ -119,6 +119,6 @@ RUN autoreconf -i && \
--disable-threads \
CPPFLAGS="-fPIE -I$PREFIX/include" \
PKG_CONFIG_LIBDIR="$PREFIX/lib/pkgconfig" \
LDFLAGS="-fPIE -pie -L$PREFIX/lib" && \
LDFLAGS="-static-libstdc++ -static-libgcc -fPIE -pie -L$PREFIX/lib" && \
make && \
$STRIP src/nghttpx src/nghttpd src/nghttp

View File

@@ -20,8 +20,8 @@
# 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 bpf examples tests integration-tests \
doc contrib script
SUBDIRS = lib tests third-party src bpf examples integration-tests \
doc contrib
ACLOCAL_AMFLAGS = -I m4
@@ -47,6 +47,7 @@ EXTRA_DIST = nghttpx.conf.sample proxy.pac.sample android-config android-env \
cmake/FindLibbrotlienc.cmake \
cmake/FindLibbrotlidec.cmake \
cmake/FindLibngtcp2_crypto_wolfssl.cmake \
cmake/FindLibngtcp2_crypto_ossl.cmake \
cmake/FindWolfSSL.cmake \
cmake/PickyWarningsC.cmake \
cmake/PickyWarningsCXX.cmake

View File

@@ -31,9 +31,8 @@ implementation.
* https://nghttp2.org/ (TLS + ALPN and HTTP/3)
This endpoint supports ``h2``, ``h2-16``, ``h2-14``, and
``http/1.1`` via ALPN and requires TLSv1.2 for HTTP/2
connection.
This endpoint supports ``h2`` and ``http/1.1`` via ALPN and requires
TLSv1.2 for HTTP/2 connection.
It also supports HTTP/3.
@@ -123,13 +122,13 @@ exploited. The neverbleed is disabled by default. To enable it, use
To enable the experimental HTTP/3 support for h2load and nghttpx, the
following libraries are required:
* `OpenSSL with QUIC support
* `quictls
<https://github.com/quictls/openssl/tree/OpenSSL_1_1_1w+quic>`_; or
wolfSSL; or LibreSSL (does not support 0RTT); or aws-lc; or
`BoringSSL <https://boringssl.googlesource.com/boringssl/>`_ (commit
e13f7e2ff5432205f09b4679c8a7715f1c130372)
* `ngtcp2 <https://github.com/ngtcp2/ngtcp2>`_ >= 1.4.0
* `nghttp3 <https://github.com/ngtcp2/nghttp3>`_ >= 1.1.0
db1a8456167249f95b854a1cd24c6b553d0f1567); or OpenSSL >= 3.5.0
* `ngtcp2 <https://github.com/ngtcp2/ngtcp2>`_ >= 1.16.0
* `nghttp3 <https://github.com/ngtcp2/nghttp3>`_ >= 1.12.0
Use ``--enable-http3`` configure option to enable HTTP/3 feature for
h2load and nghttpx.
@@ -151,7 +150,7 @@ 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,
C++20 compliant compiler is required. At least g++ >= 12 and
clang++ >= 15 are known to work.
clang++ >= 18 are known to work.
.. note::
@@ -341,7 +340,7 @@ Build aws-lc:
.. code-block:: text
$ git clone --depth 1 -b v1.34.2 https://github.com/aws/aws-lc
$ git clone --depth 1 -b v1.62.0 https://github.com/aws/aws-lc
$ cd aws-lc
$ cmake -B build -DDISABLE_GO=ON --install-prefix=$PWD/opt
$ make -j$(nproc) -C build
@@ -352,7 +351,7 @@ Build nghttp3:
.. code-block:: text
$ git clone --depth 1 -b v1.5.0 https://github.com/ngtcp2/nghttp3
$ git clone --depth 1 -b v1.12.0 https://github.com/ngtcp2/nghttp3
$ cd nghttp3
$ git submodule update --init --depth 1
$ autoreconf -i
@@ -365,7 +364,7 @@ Build ngtcp2:
.. code-block:: text
$ git clone --depth 1 -b v1.7.0 https://github.com/ngtcp2/ngtcp2
$ git clone --depth 1 -b v1.17.0 https://github.com/ngtcp2/ngtcp2
$ cd ngtcp2
$ git submodule update --init --depth 1
$ autoreconf -i
@@ -381,7 +380,7 @@ from source:
.. code-block:: text
$ git clone --depth 1 -b v1.4.5 https://github.com/libbpf/libbpf
$ git clone --depth 1 -b v1.6.2 https://github.com/libbpf/libbpf
$ cd libbpf
$ PREFIX=$PWD/build make -C src install
$ cd ..
@@ -395,7 +394,7 @@ Build nghttp2:
$ git submodule update --init
$ autoreconf -i
$ ./configure --with-mruby --enable-http3 --with-libbpf \
CC=clang-15 CXX=clang++-15 \
CC=clang-19 CXX=clang++-19 \
PKG_CONFIG_PATH="$PWD/../aws-lc/opt/lib/pkgconfig:$PWD/../nghttp3/build/lib/pkgconfig:$PWD/../ngtcp2/build/lib/pkgconfig:$PWD/../libbpf/build/lib64/pkgconfig" \
LDFLAGS="$LDFLAGS -Wl,-rpath,$PWD/../aws-lc/opt/lib -Wl,-rpath,$PWD/../libbpf/build/lib64"
$ make -j$(nproc)
@@ -847,10 +846,10 @@ to know how to migrate from earlier releases.
``nghttpx`` implements `important performance-oriented features
<https://istlsfastyet.com/#server-performance>`_ in TLS, such as
session IDs, session tickets (with automatic key rotation), OCSP
stapling, dynamic record sizing, ALPN, forward secrecy and HTTP/2.
``nghttpx`` also offers the functionality to share session cache and
ticket keys among multiple ``nghttpx`` instances via memcached.
session IDs, session tickets (with automatic key rotation), dynamic
record sizing, ALPN, forward secrecy and HTTP/2. ``nghttpx`` also
offers the functionality to share ticket keys among multiple
``nghttpx`` instances via memcached.
``nghttpx`` has 2 operation modes:

View File

@@ -63,28 +63,26 @@ typedef __u8 state_t[4][4];
dynamically trading ROM for RAM - This can be useful in (embedded)
bootloader applications, where ROM is often limited. */
static const __u8 rsbox[256] = {
0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e,
0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,
0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32,
0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49,
0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,
0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50,
0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05,
0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,
0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41,
0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8,
0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,
0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b,
0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59,
0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,
0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d,
0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63,
0x55, 0x21, 0x0c, 0x7d};
0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81,
0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e,
0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23,
0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66,
0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72,
0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65,
0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46,
0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a,
0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca,
0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91,
0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6,
0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8,
0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f,
0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2,
0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8,
0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93,
0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb,
0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6,
0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d};
/* This function adds the round key to state. The round key is added
to the state by an XOR function. */

View File

@@ -17,12 +17,18 @@ find_library(LIBCARES_LIBRARY
)
if(LIBCARES_INCLUDE_DIR)
set(_version_regex "^#define[ \t]+ARES_VERSION_STR[ \t]+\"([^\"]+)\".*")
file(STRINGS "${LIBCARES_INCLUDE_DIR}/ares_version.h"
LIBCARES_VERSION REGEX "${_version_regex}")
string(REGEX REPLACE "${_version_regex}" "\\1"
LIBCARES_VERSION "${LIBCARES_VERSION}")
unset(_version_regex)
file(READ "${LIBCARES_INCLUDE_DIR}/ares_version.h" _ares_version_h)
string(REGEX REPLACE ".*#define[ \t]+ARES_VERSION_MAJOR[ \t]+([0-9]+).*" "\\1"
_ares_version_major ${_ares_version_h})
string(REGEX REPLACE ".*#define[ \t]+ARES_VERSION_MINOR[ \t]+([0-9]+).*" "\\1"
_ares_version_minor ${_ares_version_h})
string(REGEX REPLACE ".*#define[ \t]+ARES_VERSION_PATCH[ \t]+([0-9]+).*" "\\1"
_ares_version_patch ${_ares_version_h})
set(LIBCARES_VERSION "${_ares_version_major}.${_ares_version_minor}.${_ares_version_patch}")
unset(_ares_version_patch)
unset(_ares_version_minor)
unset(_ares_version_major)
unset(_ares_version_h)
endif()
include(FindPackageHandleStandardArgs)

View File

@@ -0,0 +1,43 @@
# - Try to find libngtcp2_crypto_libressl
# Once done this will define
# LIBNGTCP2_CRYPTO_LIBRESSL_FOUND - System has libngtcp2_crypto_libressl
# LIBNGTCP2_CRYPTO_LIBRESSL_INCLUDE_DIRS - The libngtcp2_crypto_libressl include directories
# LIBNGTCP2_CRYPTO_LIBRESSL_LIBRARIES - The libraries needed to use libngtcp2_crypto_libressl
find_package(PkgConfig QUIET)
pkg_check_modules(PC_LIBNGTCP2_CRYPTO_LIBRESSL QUIET libngtcp2_crypto_libressl)
find_path(LIBNGTCP2_CRYPTO_LIBRESSL_INCLUDE_DIR
NAMES ngtcp2/ngtcp2_crypto_quictls.h
HINTS ${PC_LIBNGTCP2_CRYPTO_LIBRESSL_INCLUDE_DIRS}
)
find_library(LIBNGTCP2_CRYPTO_LIBRESSL_LIBRARY
NAMES ngtcp2_crypto_libressl
HINTS ${PC_LIBNGTCP2_CRYPTO_LIBRESSL_LIBRARY_DIRS}
)
if(LIBNGTCP2_CRYPTO_LIBRESSL_INCLUDE_DIR)
set(_version_regex "^#define[ \t]+NGTCP2_VERSION[ \t]+\"([^\"]+)\".*")
file(STRINGS "${LIBNGTCP2_CRYPTO_LIBRESSL_INCLUDE_DIR}/ngtcp2/version.h"
LIBNGTCP2_CRYPTO_LIBRESSL_VERSION REGEX "${_version_regex}")
string(REGEX REPLACE "${_version_regex}" "\\1"
LIBNGTCP2_CRYPTO_LIBRESSL_VERSION "${LIBNGTCP2_CRYPTO_LIBRESSL_VERSION}")
unset(_version_regex)
endif()
include(FindPackageHandleStandardArgs)
# handle the QUIETLY and REQUIRED arguments and set
# LIBNGTCP2_CRYPTO_LIBRESSL_FOUND to TRUE if all listed variables are
# TRUE and the requested version matches.
find_package_handle_standard_args(Libngtcp2_crypto_libressl REQUIRED_VARS
LIBNGTCP2_CRYPTO_LIBRESSL_LIBRARY
LIBNGTCP2_CRYPTO_LIBRESSL_INCLUDE_DIR
VERSION_VAR LIBNGTCP2_CRYPTO_LIBRESSL_VERSION)
if(LIBNGTCP2_CRYPTO_LIBRESSL_FOUND)
set(LIBNGTCP2_CRYPTO_LIBRESSL_LIBRARIES ${LIBNGTCP2_CRYPTO_LIBRESSL_LIBRARY})
set(LIBNGTCP2_CRYPTO_LIBRESSL_INCLUDE_DIRS ${LIBNGTCP2_CRYPTO_LIBRESSL_INCLUDE_DIR})
endif()
mark_as_advanced(LIBNGTCP2_CRYPTO_LIBRESSL_INCLUDE_DIR
LIBNGTCP2_CRYPTO_LIBRESSL_LIBRARY)

View File

@@ -0,0 +1,43 @@
# - Try to find libngtcp2_crypto_ossl
# Once done this will define
# LIBNGTCP2_CRYPTO_OSSL_FOUND - System has libngtcp2_crypto_ossl
# LIBNGTCP2_CRYPTO_OSSL_INCLUDE_DIRS - The libngtcp2_crypto_ossl include directories
# LIBNGTCP2_CRYPTO_OSSL_LIBRARIES - The libraries needed to use libngtcp2_crypto_ossl
find_package(PkgConfig QUIET)
pkg_check_modules(PC_LIBNGTCP2_CRYPTO_OSSL QUIET libngtcp2_crypto_ossl)
find_path(LIBNGTCP2_CRYPTO_OSSL_INCLUDE_DIR
NAMES ngtcp2/ngtcp2_crypto_ossl.h
HINTS ${PC_LIBNGTCP2_CRYPTO_OSSL_INCLUDE_DIRS}
)
find_library(LIBNGTCP2_CRYPTO_OSSL_LIBRARY
NAMES ngtcp2_crypto_ossl
HINTS ${PC_LIBNGTCP2_CRYPTO_OSSL_LIBRARY_DIRS}
)
if(LIBNGTCP2_CRYPTO_OSSL_INCLUDE_DIR)
set(_version_regex "^#define[ \t]+NGTCP2_VERSION[ \t]+\"([^\"]+)\".*")
file(STRINGS "${LIBNGTCP2_CRYPTO_OSSL_INCLUDE_DIR}/ngtcp2/version.h"
LIBNGTCP2_CRYPTO_OSSL_VERSION REGEX "${_version_regex}")
string(REGEX REPLACE "${_version_regex}" "\\1"
LIBNGTCP2_CRYPTO_OSSL_VERSION "${LIBNGTCP2_CRYPTO_OSSL_VERSION}")
unset(_version_regex)
endif()
include(FindPackageHandleStandardArgs)
# handle the QUIETLY and REQUIRED arguments and set
# LIBNGTCP2_CRYPTO_OSSL_FOUND to TRUE if all listed variables are
# TRUE and the requested version matches.
find_package_handle_standard_args(Libngtcp2_crypto_ossl REQUIRED_VARS
LIBNGTCP2_CRYPTO_OSSL_LIBRARY
LIBNGTCP2_CRYPTO_OSSL_INCLUDE_DIR
VERSION_VAR LIBNGTCP2_CRYPTO_OSSL_VERSION)
if(LIBNGTCP2_CRYPTO_OSSL_FOUND)
set(LIBNGTCP2_CRYPTO_OSSL_LIBRARIES ${LIBNGTCP2_CRYPTO_OSSL_LIBRARY})
set(LIBNGTCP2_CRYPTO_OSSL_INCLUDE_DIRS ${LIBNGTCP2_CRYPTO_OSSL_INCLUDE_DIR})
endif()
mark_as_advanced(LIBNGTCP2_CRYPTO_OSSL_INCLUDE_DIR
LIBNGTCP2_CRYPTO_OSSL_LIBRARY)

View File

@@ -58,6 +58,10 @@ if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID
list(APPEND WPICKY_ENABLE
${WPICKY_COMMON_OLD}
)
list(APPEND WPICKY_ENABLE
# clang++-18 warns this when building with wolfSSL >= v5.7.6-stable.
-Wno-extern-c-compat
)
# Enable based on compiler version
if((CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.6) OR
(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6.3))

View File

@@ -4,8 +4,8 @@
/* Define to `int' if <sys/types.h> does not define. */
#cmakedefine ssize_t @ssize_t@
/* Define to 1 if you have the `std::map::emplace`. */
#cmakedefine HAVE_STD_MAP_EMPLACE 1
/* Define to 1 if you have the `std::chrono::time_zone`. */
#cmakedefine HAVE_STD_CHRONO_TIME_ZONE 1
/* Define to 1 if you have `libjansson` library. */
#cmakedefine HAVE_JANSSON 1
@@ -100,6 +100,9 @@
/* Define to 1 if you have `libngtcp2_crypto_quictls` library. */
#cmakedefine HAVE_LIBNGTCP2_CRYPTO_QUICTLS
/* Define to 1 if you have `libngtcp2_crypto_libressl` library. */
#cmakedefine HAVE_LIBNGTCP2_CRYPTO_LIBRESSL
/* Define to 1 if you have `libngtcp2_crypto_wolfssl` library. */
#cmakedefine HAVE_LIBNGTCP2_CRYPTO_WOLFSSL 1

View File

@@ -25,7 +25,7 @@ dnl Do not change user variables!
dnl https://www.gnu.org/software/automake/manual/html_node/Flag-Variables-Ordering.html
AC_PREREQ(2.61)
AC_INIT([nghttp2], [1.63.0], [t-tujikawa@users.sourceforge.net])
AC_INIT([nghttp2], [1.68.0], [t-tujikawa@users.sourceforge.net])
AC_CONFIG_AUX_DIR([.])
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_HEADERS([config.h])
@@ -44,9 +44,9 @@ m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
dnl See versioning rule:
dnl https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
AC_SUBST(LT_CURRENT, 42)
AC_SUBST(LT_CURRENT, 43)
AC_SUBST(LT_REVISION, 2)
AC_SUBST(LT_AGE, 28)
AC_SUBST(LT_AGE, 29)
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"`
@@ -272,22 +272,6 @@ std::vector<std::future<int>> v;
[have_std_future=no
AC_MSG_RESULT([no])])
# Check that std::map::emplace is available for g++-4.7.
AC_MSG_CHECKING([whether std::map::emplace is available])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
[[
#include <map>
]],
[[
std::map<int, int>().emplace(1, 2);
]])],
[AC_DEFINE([HAVE_STD_MAP_EMPLACE], [1],
[Define to 1 if you have the `std::map::emplace`.])
have_std_map_emplace=yes
AC_MSG_RESULT([yes])],
[have_std_map_emplace=no
AC_MSG_RESULT([no])])
# Check that std::atomic<std::shared_ptr<T>> is supported.
AC_MSG_CHECKING([whether std::atomic<std::shared_ptr<T>> is supported])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
@@ -307,19 +291,21 @@ a.store(p);
[have_atomic_std_shared_ptr=no
AC_MSG_RESULT([no])])
# Check that thread_local storage specifier is available
AC_MSG_CHECKING([whether thread_local storage class specifier is available.])
# Check that std::chrono::time_zone is available.
AC_MSG_CHECKING([whether std::chrono::time_zone is available])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
,
[[
thread_local int a = 0;
(void)a;
#include <chrono>
]],
[[
auto tz = std::chrono::current_zone();
(void)tz;
]])],
[AC_DEFINE([HAVE_THREAD_LOCAL], [1],
[Define to 1 if you have thread_local storage specifier.])
have_thread_local=yes
[AC_DEFINE([HAVE_STD_CHRONO_TIME_ZONE], [1],
[Define to 1 if you have the `std::chrono::time_zone`.])
have_std_chrono_time_zone=yes
AC_MSG_RESULT([yes])],
[have_Thread_local=no
[have_std_chrono_time_zone=no
AC_MSG_RESULT([no])])
CXXFLAGS=$save_CXXFLAGS
@@ -450,6 +436,22 @@ if test "x${request_openssl}" != "xno" &&
[AC_MSG_RESULT([yes]); have_ssl_provide_quic_data=yes],
[AC_MSG_RESULT([no]); have_ssl_provide_quic_data=no])
# Check whether this is libressl or not
AC_CHECK_DECLS([LIBRESSL_VERSION_NUMBER],
[have_libressl=yes], [have_libressl=no],
[[
#include <openssl/opensslv.h>
]])
AC_MSG_CHECKING([for SSL_set_quic_tls_cbs])
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <openssl/ssl.h>
]], [[
SSL_set_quic_tls_cbs(NULL, NULL, NULL);
]])],
[AC_MSG_RESULT([yes]); have_ossl_quic=yes],
[AC_MSG_RESULT([no]); have_ossl_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([[
@@ -530,7 +532,7 @@ fi
# ngtcp2 (for src)
have_libngtcp2=no
if test "x${request_libngtcp2}" != "xno"; then
PKG_CHECK_MODULES([LIBNGTCP2], [libngtcp2 >= 1.4.0], [have_libngtcp2=yes],
PKG_CHECK_MODULES([LIBNGTCP2], [libngtcp2 >= 1.16.0], [have_libngtcp2=yes],
[have_libngtcp2=no])
if test "x${have_libngtcp2}" = "xno"; then
AC_MSG_NOTICE($LIBNGTCP2_PKG_ERRORS)
@@ -547,7 +549,7 @@ have_libngtcp2_crypto_wolfssl=no
if test "x${have_wolfssl_quic}" = "xyes" &&
test "x${request_libngtcp2}" != "xno"; then
PKG_CHECK_MODULES([LIBNGTCP2_CRYPTO_WOLFSSL],
[libngtcp2_crypto_wolfssl >= 1.0.0],
[libngtcp2_crypto_wolfssl >= 1.16.0],
[have_libngtcp2_crypto_wolfssl=yes],
[have_libngtcp2_crypto_wolfssl=no])
if test "x${have_libngtcp2_crypto_wolfssl}" = "xno"; then
@@ -567,10 +569,11 @@ fi
# ngtcp2_crypto_quictls (for src)
have_libngtcp2_crypto_quictls=no
if test "x${have_ssl_provide_quic_data}" = "xyes" &&
test "x${have_libressl}" != "xyes" &&
test "x${have_boringssl_quic}" != "xyes" &&
test "x${request_libngtcp2}" != "xno"; then
PKG_CHECK_MODULES([LIBNGTCP2_CRYPTO_QUICTLS],
[libngtcp2_crypto_quictls >= 1.0.0],
[libngtcp2_crypto_quictls >= 1.16.0],
[have_libngtcp2_crypto_quictls=yes],
[have_libngtcp2_crypto_quictls=no])
if test "x${have_libngtcp2_crypto_quictls}" = "xno"; then
@@ -582,12 +585,37 @@ if test "x${have_ssl_provide_quic_data}" = "xyes" &&
fi
if test "x${have_ssl_provide_quic_data}" = "xyes" &&
test "x${have_libressl}" != "xyes" &&
test "x${have_boringssl_quic}" != "xyes" &&
test "x${request_libngtcp2}" = "xyes" &&
test "x${have_libngtcp2_crypto_quictls}" != "xyes"; then
AC_MSG_ERROR([libngtcp2_crypto_quictls was requested (--with-libngtcp2) but not found])
fi
# ngtcp2_crypto_libressl (for src)
have_libngtcp2_crypto_libressl=no
if test "x${have_ssl_provide_quic_data}" = "xyes" &&
test "x${have_libressl}" = "xyes" &&
test "x${request_libngtcp2}" != "xno"; then
PKG_CHECK_MODULES([LIBNGTCP2_CRYPTO_LIBRESSL],
[libngtcp2_crypto_libressl >= 1.16.0],
[have_libngtcp2_crypto_libressl=yes],
[have_libngtcp2_crypto_libressl=no])
if test "x${have_libngtcp2_crypto_libressl}" = "xno"; then
AC_MSG_NOTICE($LIBNGTCP2_CRYPTO_LIBRESSL_PKG_ERRORS)
else
AC_DEFINE([HAVE_LIBNGTCP2_CRYPTO_LIBRESSL], [1],
[Define to 1 if you have `libngtcp2_crypto_libressl` library.])
fi
fi
if test "x${have_ssl_provide_quic_data}" = "xyes" &&
test "x${have_libressl}" = "xyes" &&
test "x${request_libngtcp2}" = "xyes" &&
test "x${have_libngtcp2_crypto_libressl}" != "xyes"; then
AC_MSG_ERROR([libngtcp2_crypto_libressl 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" &&
@@ -610,10 +638,32 @@ if test "x${have_boringssl_quic}" = "xyes" &&
AC_MSG_ERROR([libngtcp2_crypto_boringssl was requested (--with-libngtcp2) but not found])
fi
# ngtcp2_crypto_ossl (for src)
have_libngtcp2_crypto_ossl=no
if test "x${have_ossl_quic}" = "xyes" &&
test "x${request_libngtcp2}" != "xno"; then
PKG_CHECK_MODULES([LIBNGTCP2_CRYPTO_OSSL],
[libngtcp2_crypto_ossl >= 1.16.0],
[have_libngtcp2_crypto_ossl=yes],
[have_libngtcp2_crypto_ossl=no])
if test "x${have_libngtcp2_crypto_ossl}" = "xno"; then
AC_MSG_NOTICE($LIBNGTCP2_CRYPTO_OSSL_PKG_ERRORS)
else
AC_DEFINE([HAVE_LIBNGTCP2_CRYPTO_OSSL], [1],
[Define to 1 if you have `libngtcp2_crypto_ossl` library.])
fi
fi
if test "x${have_ossl_quic}" = "xyes" &&
test "x${request_libngtcp2}" = "xyes" &&
test "x${have_libngtcp2_crypto_ossl}" != "xyes"; then
AC_MSG_ERROR([libngtcp2_crypto_ossl was requested (--with-libngtcp2) but not found])
fi
# nghttp3 (for src)
have_libnghttp3=no
if test "x${request_libnghttp3}" != "xno"; then
PKG_CHECK_MODULES([LIBNGHTTP3], [libnghttp3 >= 1.1.0], [have_libnghttp3=yes],
PKG_CHECK_MODULES([LIBNGHTTP3], [libnghttp3 >= 1.12.0], [have_libnghttp3=yes],
[have_libnghttp3=no])
if test "x${have_libnghttp3}" = "xno"; then
AC_MSG_NOTICE($LIBNGHTTP3_PKG_ERRORS)
@@ -842,7 +892,9 @@ if test "x${request_http3}" != "xno" &&
test "x${have_libngtcp2}" = "xyes" &&
(test "x${have_libngtcp2_crypto_wolfssl}" = "xyes" ||
test "x${have_libngtcp2_crypto_quictls}" = "xyes" ||
test "x${have_libngtcp2_crypto_boringssl}" = "xyes") &&
test "x${have_libngtcp2_crypto_libressl}" = "xyes" ||
test "x${have_libngtcp2_crypto_boringssl}" = "xyes" ||
test "x${have_libngtcp2_crypto_ossl}" = "xyes") &&
test "x${have_libnghttp3}" = "xyes"; then
enable_http3=yes
AC_DEFINE([ENABLE_HTTP3], [1], [Define to 1 if HTTP/3 is enabled.])
@@ -1123,6 +1175,7 @@ if test "x$werror" != "xno"; then
# Only work with Clang for the moment
AX_CHECK_COMPILE_FLAG([-Wheader-guard], [CFLAGS="$CFLAGS -Wheader-guard"])
AX_CHECK_COMPILE_FLAG([-Wsometimes-uninitialized], [CFLAGS="$CFLAGS -Wsometimes-uninitialized"])
AX_CHECK_COMPILE_FLAG([-Wextra-semi], [CFLAGS="$CFLAGS -Wextra-semi"])
# This is required because we pass format string as "const char*.
AX_CHECK_COMPILE_FLAG([-Wno-format-nonliteral], [CFLAGS="$CFLAGS -Wno-format-nonliteral"])
@@ -1133,9 +1186,13 @@ if test "x$werror" != "xno"; then
AX_CHECK_COMPILE_FLAG([-Werror], [CXXFLAGS="$CXXFLAGS -Werror"])
AX_CHECK_COMPILE_FLAG([-Wformat-security], [CXXFLAGS="$CXXFLAGS -Wformat-security"])
AX_CHECK_COMPILE_FLAG([-Wsometimes-uninitialized], [CXXFLAGS="$CXXFLAGS -Wsometimes-uninitialized"])
AX_CHECK_COMPILE_FLAG([-Wextra-semi], [CXXFLAGS="$CXXFLAGS -Wextra-semi"])
AX_CHECK_COMPILE_FLAG([-Wconversion], [CXXFLAGS="$CXXFLAGS -Wconversion"])
# Disable noexcept-type warning of g++-7. This is not harmful as
# long as all source files are compiled with the same compiler.
AX_CHECK_COMPILE_FLAG([-Wno-noexcept-type], [CXXFLAGS="$CXXFLAGS -Wno-noexcept-type"])
# clang++-18 warns this when building with wolfSSL >= v5.7.6-stable.
AX_CHECK_COMPILE_FLAG([-Wno-extern-c-compat], [CXXFLAGS="$CXXFLAGS -Wno-extern-c-compat"])
AC_LANG_POP()
fi
@@ -1202,7 +1259,6 @@ AC_CONFIG_FILES([
doc/nghttp2ver.h.rst
doc/contribute.rst
contrib/Makefile
script/Makefile
])
AC_OUTPUT
@@ -1251,7 +1307,9 @@ 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_quictls: ${have_libngtcp2_crypto_quictls} (CFLAGS='${LIBNGTCP2_CRYPTO_QUICTLS_CFLAGS}' LIBS='${LIBNGTCP2_CRYPTO_QUICTLS_LIBS}')
libngtcp2_crypto_libressl: ${have_libngtcp2_crypto_libressl} (CFLAGS='${LIBNGTCP2_CRYPTO_LIBRESSL_CFLAGS}' LIBS='${LIBNGTCP2_CRYPTO_LIBRESSL_LIBS}')
libngtcp2_crypto_boringssl: ${have_libngtcp2_crypto_boringssl} (CFLAGS='${LIBNGTCP2_CRYPTO_BORINGSSL_CFLAGS}' LIBS='${LIBNGTCP2_CRYPTO_BORINGSSL_LIBS}')
libngtcp2_crypto_ossl: ${have_libngtcp2_crypto_ossl} (CFLAGS='${LIBNGTCP2_CRYPTO_OSSL_CFLAGS}' LIBS='${LIBNGTCP2_CRYPTO_OSSL_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}')

View File

@@ -81,6 +81,7 @@ APIDOCS= \
nghttp2_option_set_max_outbound_ack.rst \
nghttp2_option_set_max_settings.rst \
nghttp2_option_set_stream_reset_rate_limit.rst \
nghttp2_option_set_glitch_rate_limit.rst \
nghttp2_pack_settings_payload.rst \
nghttp2_pack_settings_payload2.rst \
nghttp2_priority_spec_check_default.rst \
@@ -114,6 +115,7 @@ APIDOCS= \
nghttp2_session_callbacks_set_on_stream_close_callback.rst \
nghttp2_session_callbacks_set_pack_extension_callback.rst \
nghttp2_session_callbacks_set_pack_extension_callback2.rst \
nghttp2_session_callbacks_set_rand_callback.rst \
nghttp2_session_callbacks_set_recv_callback.rst \
nghttp2_session_callbacks_set_recv_callback2.rst \
nghttp2_session_callbacks_set_select_padding_callback.rst \

View File

@@ -111,7 +111,7 @@ The example follows::
``@struct`` is used to refer to the struct. Currently, only struct
typedefs are supported. The comment block is used for the document for
the struct type itself.To document each member, put comment block
the struct type itself. To document each member, put comment block
starting with the line ``/**`` and ending with the ``*/`` just before
the member. When the line starts with ``}`` is encountered, the
``mkapiref.py`` extracts strings next to ``}`` as the name of struct.

View File

@@ -1,14 +0,0 @@
# -*- coding: utf-8 -*-
"""
sphinxcontrib
~~~~~~~~~~~~~
This package is a namespace package that contains all extensions
distributed in the ``sphinx-contrib`` distribution.
:copyright: Copyright 2007-2009 by the Sphinx team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
__import__('pkg_resources').declare_namespace(__name__)

View File

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

View File

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

View File

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

@@ -27,7 +27,7 @@ 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" "Aug 27, 2024" "1.63.0" "nghttp2"
.TH "H2LOAD" "1" "Oct 25, 2025" "1.68.0" "nghttp2"
.SH NAME
h2load \- HTTP/2 benchmarking tool
.SH SYNOPSIS
@@ -109,9 +109,9 @@ Default: \fB16K\fP
.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
For QUIC, <N> is capped to 26 (roughly 64MiB). It
defaults to 24 (16MiB) for QUIC, and 30 for other
protocols.
.UNINDENT
.INDENT 0.0
.TP
@@ -262,7 +262,7 @@ protocol comes first. The parameter must be delimited
by a single comma only and any white spaces are treated
as a part of protocol string.
.sp
Default: \fBh2,h2\-16,h2\-14,http/1.1\fP
Default: \fBh2,http/1.1\fP
.UNINDENT
.INDENT 0.0
.TP
@@ -388,7 +388,7 @@ The number of requests completed.
.TP
.B succeeded
The number of requests completed successfully. Only HTTP status
code 2xx or3xx are considered as success.
code 2xx or 3xx are considered as success.
.TP
.B failed
The number of requests failed, including HTTP level failures

View File

@@ -83,9 +83,9 @@ OPTIONS
.. 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``
For QUIC, <N> is capped to 26 (roughly 64MiB). It
defaults to 24 (16MiB) for QUIC, and 30 for other
protocols.
.. option:: -W, --connection-window-bits=<N>
@@ -221,7 +221,7 @@ OPTIONS
by a single comma only and any white spaces are treated
as a part of protocol string.
Default: ``h2,h2-16,h2-14,http/1.1``
Default: ``h2,http/1.1``
.. option:: --h1
@@ -331,7 +331,7 @@ requests
The number of requests completed.
succeeded
The number of requests completed successfully. Only HTTP status
code 2xx or3xx are considered as success.
code 2xx or 3xx are considered as success.
failed
The number of requests failed, including HTTP level failures
(non-successful HTTP status code).

View File

@@ -12,7 +12,7 @@ requests
The number of requests completed.
succeeded
The number of requests completed successfully. Only HTTP status
code 2xx or3xx are considered as success.
code 2xx or 3xx are considered as success.
failed
The number of requests failed, including HTTP level failures
(non-successful HTTP status code).

View File

@@ -27,7 +27,7 @@ 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" "Aug 27, 2024" "1.63.0" "nghttp2"
.TH "NGHTTP" "1" "Oct 25, 2025" "1.68.0" "nghttp2"
.SH NAME
nghttp \- HTTP/2 client
.SH SYNOPSIS
@@ -141,14 +141,15 @@ HTTP upgrade request is performed with OPTIONS method.
.UNINDENT
.INDENT 0.0
.TP
.B \-p, \-\-weight=<WEIGHT>
Sets weight of given URI. This option can be used
multiple times, and N\-th \fI\%\-p\fP option sets weight of N\-th
URI in the command line. If the number of \fI\%\-p\fP option is
less than the number of URI, the last \fI\%\-p\fP option value is
repeated. If there is no \fI\%\-p\fP option, default weight, 16,
is assumed. The valid value range is
[1, 256], inclusive.
.B \-\-extpri=<PRI>
Sets RFC 9218 priority of given URI. <PRI> must be the
wire format of priority header field (e.g., \(dqu=3,i\(dq).
This option can be used multiple times, and N\-th
\fI\%\-\-extpri\fP option sets priority of N\-th URI in the command
line. If the number of this option is less than the
number of URI, the last option value is repeated. If
there is no \fI\%\-\-extpri\fP option, urgency is 3, and
incremental is false.
.UNINDENT
.INDENT 0.0
.TP
@@ -205,11 +206,6 @@ Don\(aqt send content\-length header field.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-no\-dep
Don\(aqt send dependency based priority hint to server.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-hexdump
Display the incoming traffic in hexadecimal (Canonical
hex+ASCII display). If SSL/TLS is used, decrypted data
@@ -247,11 +243,6 @@ 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
@@ -268,63 +259,6 @@ The <DURATION> argument is an integer and an optional unit (e.g., 1s
is 1 second and 500ms is 500 milliseconds). Units are h, m, s or ms
(hours, minutes, seconds and milliseconds, respectively). If a unit
is omitted, a second is used as unit.
.SH DEPENDENCY BASED PRIORITY
.sp
nghttp sends priority hints to server by default unless
\fI\%\-\-no\-dep\fP is used. nghttp mimics the way Firefox employs to
manages dependency using idle streams. We follows the behaviour of
Firefox Nightly as of April, 2015, and nghttp\(aqs behaviour is very
static and could be different from Firefox in detail. But reproducing
the same behaviour of Firefox is not our goal. The goal is provide
the easy way to test out the dependency priority in server
implementation.
.sp
When connection is established, nghttp sends 5 PRIORITY frames to idle
streams 3, 5, 7, 9 and 11 to create \(dqanchor\(dq nodes in dependency
tree:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
+\-\-\-\-\-+
|id=0 |
+\-\-\-\-\-+
^ ^ ^
w=201 / | \e w=1
/ | \e
/ w=101| \e
+\-\-\-\-\-+ +\-\-\-\-\-+ +\-\-\-\-\-+
|id=3 | |id=5 | |id=7 |
+\-\-\-\-\-+ +\-\-\-\-\-+ +\-\-\-\-\-+
^ ^
w=1 | w=1 |
| |
+\-\-\-\-\-+ +\-\-\-\-\-+
|id=11| |id=9 |
+\-\-\-\-\-+ +\-\-\-\-\-+
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
In the above figure, \fBid\fP means stream ID, and \fBw\fP means weight.
The stream 0 is non\-existence stream, and forms the root of the tree.
The stream 7 and 9 are not used for now.
.sp
The URIs given in the command\-line depend on stream 11 with the weight
given in \fI\%\-p\fP option, which defaults to 16.
.sp
If \fI\%\-a\fP option is used, nghttp parses the resource pointed by
URI given in command\-line as html, and extracts resource links from
it. When requesting those resources, nghttp uses dependency according
to its resource type.
.sp
For CSS, and Javascript files inside \(dqhead\(dq element, they depend on
stream 3 with the weight 2. The Javascript files outside \(dqhead\(dq
element depend on stream 5 with the weight 2. The mages depend on
stream 11 with the weight 12. The other resources (e.g., icon) depend
on stream 11 with the weight 2.
.SH SEE ALSO
.sp
\fBnghttpd(1)\fP, \fBnghttpx(1)\fP, \fBh2load(1)\fP

View File

@@ -105,15 +105,16 @@ OPTIONS
if the request URI has https scheme. If :option:`-d` is used, the
HTTP upgrade request is performed with OPTIONS method.
.. option:: -p, --weight=<WEIGHT>
.. option:: --extpri=<PRI>
Sets weight of given URI. This option can be used
multiple times, and N-th :option:`-p` option sets weight of N-th
URI in the command line. If the number of :option:`-p` option is
less than the number of URI, the last :option:`-p` option value is
repeated. If there is no :option:`-p` option, default weight, 16,
is assumed. The valid value range is
[1, 256], inclusive.
Sets RFC 9218 priority of given URI. <PRI> must be the
wire format of priority header field (e.g., "u=3,i").
This option can be used multiple times, and N-th
:option:`--extpri` option sets priority of N-th URI in the command
line. If the number of this option is less than the
number of URI, the last option value is repeated. If
there is no :option:`--extpri` option, urgency is 3, and
incremental is false.
.. option:: -M, --peer-max-concurrent-streams=<N>
@@ -160,10 +161,6 @@ OPTIONS
Don't send content-length header field.
.. option:: --no-dep
Don't send dependency based priority hint to server.
.. option:: --hexdump
Display the incoming traffic in hexadecimal (Canonical
@@ -195,10 +192,6 @@ OPTIONS
Enable ktls.
.. option:: --no-rfc7540-pri
Disable RFC7540 priorities.
.. option:: --version
Display version information and exit.
@@ -217,59 +210,6 @@ is 1 second and 500ms is 500 milliseconds). Units are h, m, s or ms
(hours, minutes, seconds and milliseconds, respectively). If a unit
is omitted, a second is used as unit.
DEPENDENCY BASED PRIORITY
-------------------------
nghttp sends priority hints to server by default unless
:option:`--no-dep` is used. nghttp mimics the way Firefox employs to
manages dependency using idle streams. We follows the behaviour of
Firefox Nightly as of April, 2015, and nghttp's behaviour is very
static and could be different from Firefox in detail. But reproducing
the same behaviour of Firefox is not our goal. The goal is provide
the easy way to test out the dependency priority in server
implementation.
When connection is established, nghttp sends 5 PRIORITY frames to idle
streams 3, 5, 7, 9 and 11 to create "anchor" nodes in dependency
tree:
.. code-block:: text
+-----+
|id=0 |
+-----+
^ ^ ^
w=201 / | \ w=1
/ | \
/ w=101| \
+-----+ +-----+ +-----+
|id=3 | |id=5 | |id=7 |
+-----+ +-----+ +-----+
^ ^
w=1 | w=1 |
| |
+-----+ +-----+
|id=11| |id=9 |
+-----+ +-----+
In the above figure, ``id`` means stream ID, and ``w`` means weight.
The stream 0 is non-existence stream, and forms the root of the tree.
The stream 7 and 9 are not used for now.
The URIs given in the command-line depend on stream 11 with the weight
given in :option:`-p` option, which defaults to 16.
If :option:`-a` option is used, nghttp parses the resource pointed by
URI given in command-line as html, and extracts resource links from
it. When requesting those resources, nghttp uses dependency according
to its resource type.
For CSS, and Javascript files inside "head" element, they depend on
stream 3 with the weight 2. The Javascript files outside "head"
element depend on stream 5 with the weight 2. The mages depend on
stream 11 with the weight 12. The other resources (e.g., icon) depend
on stream 11 with the weight 2.
SEE ALSO
--------

View File

@@ -1,56 +1,3 @@
DEPENDENCY BASED PRIORITY
-------------------------
nghttp sends priority hints to server by default unless
:option:`--no-dep` is used. nghttp mimics the way Firefox employs to
manages dependency using idle streams. We follows the behaviour of
Firefox Nightly as of April, 2015, and nghttp's behaviour is very
static and could be different from Firefox in detail. But reproducing
the same behaviour of Firefox is not our goal. The goal is provide
the easy way to test out the dependency priority in server
implementation.
When connection is established, nghttp sends 5 PRIORITY frames to idle
streams 3, 5, 7, 9 and 11 to create "anchor" nodes in dependency
tree:
.. code-block:: text
+-----+
|id=0 |
+-----+
^ ^ ^
w=201 / | \ w=1
/ | \
/ w=101| \
+-----+ +-----+ +-----+
|id=3 | |id=5 | |id=7 |
+-----+ +-----+ +-----+
^ ^
w=1 | w=1 |
| |
+-----+ +-----+
|id=11| |id=9 |
+-----+ +-----+
In the above figure, ``id`` means stream ID, and ``w`` means weight.
The stream 0 is non-existence stream, and forms the root of the tree.
The stream 7 and 9 are not used for now.
The URIs given in the command-line depend on stream 11 with the weight
given in :option:`-p` option, which defaults to 16.
If :option:`-a` option is used, nghttp parses the resource pointed by
URI given in command-line as html, and extracts resource links from
it. When requesting those resources, nghttp uses dependency according
to its resource type.
For CSS, and Javascript files inside "head" element, they depend on
stream 3 with the weight 2. The Javascript files outside "head"
element depend on stream 5 with the weight 2. The mages depend on
stream 11 with the weight 12. The other resources (e.g., icon) depend
on stream 11 with the weight 2.
SEE ALSO
--------

View File

@@ -27,7 +27,7 @@ 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" "Aug 27, 2024" "1.63.0" "nghttp2"
.TH "NGHTTPD" "1" "Oct 25, 2025" "1.68.0" "nghttp2"
.SH NAME
nghttpd \- HTTP/2 server
.SH SYNOPSIS
@@ -204,13 +204,15 @@ Don\(aqt send content\-length header field.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-ktls
Enable ktls.
.B \-\-groups=<GROUPS>
Specify the supported groups.
.sp
Default: \fBX25519:P\-256:P\-384:P\-521\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-no\-rfc7540\-pri
Disable RFC7540 priorities.
.B \-\-ktls
Enable ktls.
.UNINDENT
.INDENT 0.0
.TP

View File

@@ -159,14 +159,16 @@ OPTIONS
Don't send content-length header field.
.. option:: --groups=<GROUPS>
Specify the supported groups.
Default: ``X25519:P-256:P-384:P-521``
.. option:: --ktls
Enable ktls.
.. option:: --no-rfc7540-pri
Disable RFC7540 priorities.
.. option:: --version
Display version information and exit.

View File

@@ -27,7 +27,7 @@ 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" "Aug 27, 2024" "1.63.0" "nghttp2"
.TH "NGHTTPX" "1" "Oct 25, 2025" "1.68.0" "nghttp2"
.SH NAME
nghttpx \- HTTP/2 proxy
.SH SYNOPSIS
@@ -46,8 +46,7 @@ Set path to server\(aqs private key. Required unless
.TP
.B <CERT>
Set path to server\(aqs certificate. Required unless
\(dqno\-tls\(dq parameter is used in \fI\%\-\-frontend\fP option. To
make OCSP stapling work, this must be an absolute path.
\(dqno\-tls\(dq parameter is used in \fI\%\-\-frontend\fP option.
.UNINDENT
.SH OPTIONS
.sp
@@ -688,8 +687,8 @@ Default: \fB2m\fP
.B \-\-ciphers=<SUITE>
Set allowed cipher list for frontend connection. The
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.
This option sets cipher suites for TLSv1.2. Use
\fI\%\-\-tls13\-ciphers\fP for TLSv1.3.
.sp
Default: \fBECDHE\-ECDSA\-AES128\-GCM\-SHA256:ECDHE\-RSA\-AES128\-GCM\-SHA256:ECDHE\-ECDSA\-AES256\-GCM\-SHA384:ECDHE\-RSA\-AES256\-GCM\-SHA384:ECDHE\-ECDSA\-CHACHA20\-POLY1305:ECDHE\-RSA\-CHACHA20\-POLY1305:DHE\-RSA\-AES128\-GCM\-SHA256:DHE\-RSA\-AES256\-GCM\-SHA384\fP
.UNINDENT
@@ -699,7 +698,7 @@ Default: \fBECDHE\-ECDSA\-AES128\-GCM\-SHA256:ECDHE\-RSA\-AES128\-GCM\-SHA256:EC
Set allowed cipher list for frontend connection. The
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.
\fI\%\-\-ciphers\fP for TLSv1.2.
.sp
Default: \fBTLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256\fP
.UNINDENT
@@ -708,8 +707,8 @@ Default: \fBTLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_
.B \-\-client\-ciphers=<SUITE>
Set allowed cipher list for backend connection. The
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.
This option sets cipher suites for TLSv1.2. Use
\fI\%\-\-tls13\-client\-ciphers\fP for TLSv1.3.
.sp
Default: \fBECDHE\-ECDSA\-AES128\-GCM\-SHA256:ECDHE\-RSA\-AES128\-GCM\-SHA256:ECDHE\-ECDSA\-AES256\-GCM\-SHA384:ECDHE\-RSA\-AES256\-GCM\-SHA384:ECDHE\-ECDSA\-CHACHA20\-POLY1305:ECDHE\-RSA\-CHACHA20\-POLY1305:DHE\-RSA\-AES128\-GCM\-SHA256:DHE\-RSA\-AES256\-GCM\-SHA384\fP
.UNINDENT
@@ -719,15 +718,15 @@ Default: \fBECDHE\-ECDSA\-AES128\-GCM\-SHA256:ECDHE\-RSA\-AES128\-GCM\-SHA256:EC
Set allowed cipher list for backend connection. The
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.
\fI\%\-\-client\-ciphers\fP for TLSv1.2.
.sp
Default: \fBTLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-ecdh\-curves=<LIST>
Set supported curve list for frontend connections.
<LIST> is a colon separated list of curve NID or names
.B \-\-groups=<LIST>
Set the supported group list for frontend connections.
<LIST> is a colon separated list of group NID or names
in the preference order. The supported curves depend on
the linked OpenSSL library. This function requires
OpenSSL >= 1.0.2.
@@ -745,12 +744,10 @@ enabled for backend connections.
.B \-\-cacert=<PATH>
Set path to trusted CA certificate file. It is used in
backend TLS connections to verify peer\(aqs certificate.
It is also used to verify OCSP response from the script
set by \fI\%\-\-fetch\-ocsp\-response\-file\fP\&. The file must be in
PEM format. It can contain multiple certificates. If
the linked OpenSSL is configured to load system wide
certificates, they are loaded at startup regardless of
this option.
The file must be in PEM format. It can contain multiple
certificates. If the linked OpenSSL is configured to
load system wide certificates, they are loaded at
startup regardless of this option.
.UNINDENT
.INDENT 0.0
.TP
@@ -765,13 +762,12 @@ password protected it\(aqll be requested interactively.
Specify additional certificate and private key file.
nghttpx will choose certificates based on the hostname
indicated by client using TLS SNI extension. If nghttpx
is built with OpenSSL >= 1.0.2, the shared elliptic
curves (e.g., P\-256) between client and server are also
taken into consideration. This allows nghttpx to send
ECDSA certificate to modern clients, while sending RSA
based certificate to older clients. This option can be
used multiple times. To make OCSP stapling work,
<CERTPATH> must be absolute path.
is built with OpenSSL >= 1.0.2, the signature algorithms
(e.g., ECDSA+SHA256) presented by client are also taken
into consideration. This allows nghttpx to send ML\-DSA
or ECDSA certificate to modern clients, while sending
RSA based certificate to older clients. This option can
be used multiple times.
.sp
Additional parameter can be specified in <PARAM>. The
available <PARAM> is \(dqsct\-dir=<DIR>\(dq.
@@ -798,7 +794,7 @@ protocol comes first. The parameter must be delimited
by a single comma only and any white spaces are treated
as a part of protocol string.
.sp
Default: \fBh2,h2\-16,h2\-14,http/1.1\fP
Default: \fBh2,http/1.1\fP
.UNINDENT
.INDENT 0.0
.TP
@@ -840,12 +836,8 @@ done in case\-insensitive manner. The versions between
\fI\%\-\-tls\-min\-proto\-version\fP and \fI\%\-\-tls\-max\-proto\-version\fP are
enabled. If the protocol list advertised by client does
not overlap this range, you will receive the error
message \(dqunknown protocol\(dq. If a protocol version lower
than TLSv1.2 is specified, make sure that the compatible
ciphers are included in \fI\%\-\-ciphers\fP option. The default
cipher list only includes ciphers compatible with
TLSv1.2 or above. The available versions are:
TLSv1.3, TLSv1.2, TLSv1.1, and TLSv1.0
message \(dqunknown protocol\(dq. The available versions are:
TLSv1.3 and TLSv1.2
.sp
Default: \fBTLSv1.2\fP
.UNINDENT
@@ -858,7 +850,7 @@ done in case\-insensitive manner. The versions between
enabled. If the protocol list advertised by client does
not overlap this range, you will receive the error
message \(dqunknown protocol\(dq. The available versions are:
TLSv1.3, TLSv1.2, TLSv1.1, and TLSv1.0
TLSv1.3 and TLSv1.2
.sp
Default: \fBTLSv1.3\fP
.UNINDENT
@@ -962,72 +954,6 @@ get TLS ticket keys.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-fetch\-ocsp\-response\-file=<PATH>
Path to fetch\-ocsp\-response script file. It should be
absolute path.
.sp
Default: \fB/usr/local/share/nghttp2/fetch\-ocsp\-response\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-ocsp\-update\-interval=<DURATION>
Set interval to update OCSP response cache.
.sp
Default: \fB4h\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-ocsp\-startup
Start accepting connections after initial attempts to
get OCSP responses finish. It does not matter some of
the attempts fail. This feature is useful if OCSP
responses must be available before accepting
connections.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-no\-verify\-ocsp
nghttpx does not verify OCSP response.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-no\-ocsp
Disable OCSP stapling.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-tls\-session\-cache\-memcached=<HOST>,<PORT>[;tls]
Specify address of memcached server to store session
cache. This enables shared session cache between
multiple nghttpx instances. Optionally, memcached
connection can be encrypted with TLS by specifying \(dqtls\(dq
parameter.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-tls\-session\-cache\-memcached\-address\-family=(auto|IPv4|IPv6)
Specify address family of memcached connections to store
session cache. If \(dqauto\(dq is given, both IPv4 and IPv6
are considered. If \(dqIPv4\(dq is given, only IPv4 address
is considered. If \(dqIPv6\(dq is given, only IPv6 address is
considered.
.sp
Default: \fBauto\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-tls\-session\-cache\-memcached\-cert\-file=<PATH>
Path to client certificate for memcached connections to
store session cache.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-tls\-session\-cache\-memcached\-private\-key\-file=<PATH>
Path to client private key for memcached connections to
store session cache.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-tls\-dyn\-rec\-warmup\-threshold=<SIZE>
Specify the threshold size for TLS dynamic record size
behaviour. During a TLS session, after the threshold
@@ -1135,8 +1061,7 @@ Default: \fB16K\fP
.INDENT 0.0
.TP
.B \-\-tls\-ktls
Enable ktls. For server, ktls is enable if
\fI\%\-\-tls\-session\-cache\-memcached\fP is not configured.
Enable ktls.
.UNINDENT
.SS HTTP/2
.INDENT 0.0
@@ -1675,7 +1600,7 @@ initial DNS query. For the 2nd and later queries,
server is given time based on this timeout, and it is
scaled linearly.
.sp
Default: \fB5s\fP
Default: \fB250ms\fP
.UNINDENT
.INDENT 0.0
.TP
@@ -1683,7 +1608,7 @@ Default: \fB5s\fP
Set the number of DNS query before nghttpx gives up name
lookup.
.sp
Default: \fB2\fP
Default: \fB3\fP
.UNINDENT
.INDENT 0.0
.TP
@@ -2003,11 +1928,9 @@ request header field, do this:
.INDENT 7.0
.INDENT 3.5
.sp
.nf
.ft C
.EX
add\-request\-header=foo: bar
.ft P
.fi
.EE
.UNINDENT
.UNINDENT
.sp
@@ -2015,11 +1938,9 @@ instead of:
.INDENT 7.0
.INDENT 3.5
.sp
.nf
.ft C
.EX
add\-request\-header=\(dqfoo: bar\(dq
.ft P
.fi
.EE
.UNINDENT
.UNINDENT
.sp
@@ -2124,12 +2045,10 @@ header field to initiate server push:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
.EX
Link: </fonts/font.woff>; rel=preload
Link: </css/theme.css>; rel=preload
.ft P
.fi
.EE
.UNINDENT
.UNINDENT
.sp
@@ -2160,35 +2079,6 @@ specified socket already exists in the file system, nghttpx first
deletes it. However, if SIGUSR2 is used to execute new binary and
both old and new configurations use same filename, new binary does not
delete the socket and continues to use it.
.SH OCSP STAPLING
.sp
OCSP query is done using external Python script
\fBfetch\-ocsp\-response\fP, which has been originally developed in Perl
as part of h2o project (\X'tty: link https://github.com/h2o/h2o'\fI\%https://github.com/h2o/h2o\fP\X'tty: link'), and was
translated into Python.
.sp
The script file is usually installed under
\fB$(prefix)/share/nghttp2/\fP directory. The actual path to script can
be customized using \fI\%\-\-fetch\-ocsp\-response\-file\fP option.
.sp
If OCSP query is failed, previous OCSP response, if any, is continued
to be used.
.sp
\fI\%\-\-fetch\-ocsp\-response\-file\fP option provides wide range of
possibility to manage OCSP response. It can take an arbitrary script
or executable. The requirement is that it supports the command\-line
interface of \fBfetch\-ocsp\-response\fP script, and it must return a
valid DER encoded OCSP response on success. It must return exit code
0 on success, and 75 for temporary error, and the other error code for
generic failure. For large cluster of servers, it is not efficient
for each server to perform OCSP query using \fBfetch\-ocsp\-response\fP\&.
Instead, you can retrieve OCSP response in some way, and store it in a
disk or a shared database. Then specify a program in
\fI\%\-\-fetch\-ocsp\-response\-file\fP to fetch it from those stores.
This could provide a way to share the OCSP response between fleet of
servers, and also any OCSP query strategy can be applied which may be
beyond the ability of nghttpx itself or \fBfetch\-ocsp\-response\fP
script.
.SH TLS SESSION RESUMPTION
.sp
nghttpx supports TLS session resumption through both session ID and
@@ -2196,16 +2086,6 @@ session ticket.
.SS SESSION ID RESUMPTION
.sp
By default, session ID is shared by all worker threads.
.sp
If \fI\%\-\-tls\-session\-cache\-memcached\fP is given, nghttpx will
insert serialized session data to memcached with
\fBnghttpx:tls\-session\-cache:\fP + lowercase hex string of session ID
as a memcached entry key, with expiry time 12 hours. Session timeout
is set to 12 hours.
.sp
By default, connections to memcached server are not encrypted. To
enable encryption, use \fBtls\fP keyword in
\fI\%\-\-tls\-session\-cache\-memcached\fP option.
.SS TLS SESSION TICKET RESUMPTION
.sp
By default, session ticket is shared by all worker threads. The
@@ -2224,8 +2104,7 @@ memcached is the binary format described below:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
.EX
+\-\-\-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+
| VERSION (4) |LEN (2)|KEY(48 or 80) ...
+\-\-\-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+
@@ -2233,8 +2112,7 @@ memcached is the binary format described below:
| |
+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+
(LEN, KEY) pair can be repeated
.ft P
.fi
.EE
.UNINDENT
.UNINDENT
.sp
@@ -2651,8 +2529,7 @@ Modify request path:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
.EX
class App
def on_req(env)
env.req.path = \(dq/apps#{env.req.path}\(dq
@@ -2660,8 +2537,7 @@ class App
end
App.new
.ft P
.fi
.EE
.UNINDENT
.UNINDENT
.sp
@@ -2672,8 +2548,7 @@ addresses:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
.EX
class App
def on_req(env)
allowed_clients = [\(dq127.0.0.1\(dq, \(dq::1\(dq]
@@ -2687,8 +2562,7 @@ class App
end
App.new
.ft P
.fi
.EE
.UNINDENT
.UNINDENT
.SH API ENDPOINTS

View File

@@ -25,8 +25,7 @@ A reverse proxy for HTTP/3, HTTP/2, and HTTP/1.
.. describe:: <CERT>
Set path to server's certificate. Required unless
"no-tls" parameter is used in :option:`--frontend` option. To
make OCSP stapling work, this must be an absolute path.
"no-tls" parameter is used in :option:`--frontend` option.
OPTIONS
@@ -644,8 +643,8 @@ SSL/TLS
Set allowed cipher list for frontend connection. The
format of the string is described in OpenSSL ciphers(1).
This option sets cipher suites for TLSv1.2 or earlier.
Use :option:`--tls13-ciphers` for TLSv1.3.
This option sets cipher suites for TLSv1.2. Use
:option:`--tls13-ciphers` for TLSv1.3.
Default: ``ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384``
@@ -654,7 +653,7 @@ SSL/TLS
Set allowed cipher list for frontend connection. The
format of the string is described in OpenSSL ciphers(1).
This option sets cipher suites for TLSv1.3. Use
:option:`--ciphers` for TLSv1.2 or earlier.
:option:`--ciphers` for TLSv1.2.
Default: ``TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256``
@@ -662,8 +661,8 @@ SSL/TLS
Set allowed cipher list for backend connection. The
format of the string is described in OpenSSL ciphers(1).
This option sets cipher suites for TLSv1.2 or earlier.
Use :option:`--tls13-client-ciphers` for TLSv1.3.
This option sets cipher suites for TLSv1.2. Use
:option:`--tls13-client-ciphers` for TLSv1.3.
Default: ``ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384``
@@ -672,14 +671,14 @@ SSL/TLS
Set allowed cipher list for backend connection. The
format of the string is described in OpenSSL ciphers(1).
This option sets cipher suites for TLSv1.3. Use
:option:`--tls13-client-ciphers` for TLSv1.2 or earlier.
:option:`--client-ciphers` for TLSv1.2.
Default: ``TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256``
.. option:: --ecdh-curves=<LIST>
.. option:: --groups=<LIST>
Set supported curve list for frontend connections.
<LIST> is a colon separated list of curve NID or names
Set the supported group list for frontend connections.
<LIST> is a colon separated list of group NID or names
in the preference order. The supported curves depend on
the linked OpenSSL library. This function requires
OpenSSL >= 1.0.2.
@@ -695,12 +694,10 @@ SSL/TLS
Set path to trusted CA certificate file. It is used in
backend TLS connections to verify peer's certificate.
It is also used to verify OCSP response from the script
set by :option:`--fetch-ocsp-response-file`\. The file must be in
PEM format. It can contain multiple certificates. If
the linked OpenSSL is configured to load system wide
certificates, they are loaded at startup regardless of
this option.
The file must be in PEM format. It can contain multiple
certificates. If the linked OpenSSL is configured to
load system wide certificates, they are loaded at
startup regardless of this option.
.. option:: --private-key-passwd-file=<PATH>
@@ -713,13 +710,12 @@ SSL/TLS
Specify additional certificate and private key file.
nghttpx will choose certificates based on the hostname
indicated by client using TLS SNI extension. If nghttpx
is built with OpenSSL >= 1.0.2, the shared elliptic
curves (e.g., P-256) between client and server are also
taken into consideration. This allows nghttpx to send
ECDSA certificate to modern clients, while sending RSA
based certificate to older clients. This option can be
used multiple times. To make OCSP stapling work,
<CERTPATH> must be absolute path.
is built with OpenSSL >= 1.0.2, the signature algorithms
(e.g., ECDSA+SHA256) presented by client are also taken
into consideration. This allows nghttpx to send ML-DSA
or ECDSA certificate to modern clients, while sending
RSA based certificate to older clients. This option can
be used multiple times.
Additional parameter can be specified in <PARAM>. The
available <PARAM> is "sct-dir=<DIR>".
@@ -744,7 +740,7 @@ SSL/TLS
by a single comma only and any white spaces are treated
as a part of protocol string.
Default: ``h2,h2-16,h2-14,http/1.1``
Default: ``h2,http/1.1``
.. option:: --verify-client
@@ -780,12 +776,8 @@ SSL/TLS
:option:`--tls-min-proto-version` and :option:`\--tls-max-proto-version` are
enabled. If the protocol list advertised by client does
not overlap this range, you will receive the error
message "unknown protocol". If a protocol version lower
than TLSv1.2 is specified, make sure that the compatible
ciphers are included in :option:`--ciphers` option. The default
cipher list only includes ciphers compatible with
TLSv1.2 or above. The available versions are:
TLSv1.3, TLSv1.2, TLSv1.1, and TLSv1.0
message "unknown protocol". The available versions are:
TLSv1.3 and TLSv1.2
Default: ``TLSv1.2``
@@ -797,7 +789,7 @@ SSL/TLS
enabled. If the protocol list advertised by client does
not overlap this range, you will receive the error
message "unknown protocol". The available versions are:
TLSv1.3, TLSv1.2, TLSv1.1, and TLSv1.0
TLSv1.3 and TLSv1.2
Default: ``TLSv1.3``
@@ -890,63 +882,6 @@ SSL/TLS
Path to client private key for memcached connections to
get TLS ticket keys.
.. option:: --fetch-ocsp-response-file=<PATH>
Path to fetch-ocsp-response script file. It should be
absolute path.
Default: ``/usr/local/share/nghttp2/fetch-ocsp-response``
.. option:: --ocsp-update-interval=<DURATION>
Set interval to update OCSP response cache.
Default: ``4h``
.. option:: --ocsp-startup
Start accepting connections after initial attempts to
get OCSP responses finish. It does not matter some of
the attempts fail. This feature is useful if OCSP
responses must be available before accepting
connections.
.. option:: --no-verify-ocsp
nghttpx does not verify OCSP response.
.. option:: --no-ocsp
Disable OCSP stapling.
.. option:: --tls-session-cache-memcached=<HOST>,<PORT>[;tls]
Specify address of memcached server to store session
cache. This enables shared session cache between
multiple nghttpx instances. Optionally, memcached
connection can be encrypted with TLS by specifying "tls"
parameter.
.. option:: --tls-session-cache-memcached-address-family=(auto|IPv4|IPv6)
Specify address family of memcached connections to store
session cache. If "auto" is given, both IPv4 and IPv6
are considered. If "IPv4" is given, only IPv4 address
is considered. If "IPv6" is given, only IPv6 address is
considered.
Default: ``auto``
.. option:: --tls-session-cache-memcached-cert-file=<PATH>
Path to client certificate for memcached connections to
store session cache.
.. option:: --tls-session-cache-memcached-private-key-file=<PATH>
Path to client private key for memcached connections to
store session cache.
.. option:: --tls-dyn-rec-warmup-threshold=<SIZE>
Specify the threshold size for TLS dynamic record size
@@ -1046,8 +981,7 @@ SSL/TLS
.. option:: --tls-ktls
Enable ktls. For server, ktls is enable if
:option:`--tls-session-cache-memcached` is not configured.
Enable ktls.
HTTP/2
@@ -1524,14 +1458,14 @@ DNS
server is given time based on this timeout, and it is
scaled linearly.
Default: ``5s``
Default: ``250ms``
.. option:: --dns-max-try=<N>
Set the number of DNS query before nghttpx gives up name
lookup.
Default: ``2``
Default: ``3``
.. option:: --frontend-max-requests=<N>
@@ -1971,37 +1905,6 @@ deletes it. However, if SIGUSR2 is used to execute new binary and
both old and new configurations use same filename, new binary does not
delete the socket and continues to use it.
OCSP STAPLING
-------------
OCSP query is done using external Python script
``fetch-ocsp-response``, which has been originally developed in Perl
as part of h2o project (https://github.com/h2o/h2o), and was
translated into Python.
The script file is usually installed under
``$(prefix)/share/nghttp2/`` directory. The actual path to script can
be customized using :option:`--fetch-ocsp-response-file` option.
If OCSP query is failed, previous OCSP response, if any, is continued
to be used.
:option:`--fetch-ocsp-response-file` option provides wide range of
possibility to manage OCSP response. It can take an arbitrary script
or executable. The requirement is that it supports the command-line
interface of ``fetch-ocsp-response`` script, and it must return a
valid DER encoded OCSP response on success. It must return exit code
0 on success, and 75 for temporary error, and the other error code for
generic failure. For large cluster of servers, it is not efficient
for each server to perform OCSP query using ``fetch-ocsp-response``.
Instead, you can retrieve OCSP response in some way, and store it in a
disk or a shared database. Then specify a program in
:option:`--fetch-ocsp-response-file` to fetch it from those stores.
This could provide a way to share the OCSP response between fleet of
servers, and also any OCSP query strategy can be applied which may be
beyond the ability of nghttpx itself or ``fetch-ocsp-response``
script.
TLS SESSION RESUMPTION
----------------------
@@ -2013,16 +1916,6 @@ SESSION ID RESUMPTION
By default, session ID is shared by all worker threads.
If :option:`--tls-session-cache-memcached` is given, nghttpx will
insert serialized session data to memcached with
``nghttpx:tls-session-cache:`` + lowercase hex string of session ID
as a memcached entry key, with expiry time 12 hours. Session timeout
is set to 12 hours.
By default, connections to memcached server are not encrypted. To
enable encryption, use ``tls`` keyword in
:option:`--tls-session-cache-memcached` option.
TLS SESSION TICKET RESUMPTION
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@@ -156,37 +156,6 @@ deletes it. However, if SIGUSR2 is used to execute new binary and
both old and new configurations use same filename, new binary does not
delete the socket and continues to use it.
OCSP STAPLING
-------------
OCSP query is done using external Python script
``fetch-ocsp-response``, which has been originally developed in Perl
as part of h2o project (https://github.com/h2o/h2o), and was
translated into Python.
The script file is usually installed under
``$(prefix)/share/nghttp2/`` directory. The actual path to script can
be customized using :option:`--fetch-ocsp-response-file` option.
If OCSP query is failed, previous OCSP response, if any, is continued
to be used.
:option:`--fetch-ocsp-response-file` option provides wide range of
possibility to manage OCSP response. It can take an arbitrary script
or executable. The requirement is that it supports the command-line
interface of ``fetch-ocsp-response`` script, and it must return a
valid DER encoded OCSP response on success. It must return exit code
0 on success, and 75 for temporary error, and the other error code for
generic failure. For large cluster of servers, it is not efficient
for each server to perform OCSP query using ``fetch-ocsp-response``.
Instead, you can retrieve OCSP response in some way, and store it in a
disk or a shared database. Then specify a program in
:option:`--fetch-ocsp-response-file` to fetch it from those stores.
This could provide a way to share the OCSP response between fleet of
servers, and also any OCSP query strategy can be applied which may be
beyond the ability of nghttpx itself or ``fetch-ocsp-response``
script.
TLS SESSION RESUMPTION
----------------------
@@ -198,16 +167,6 @@ SESSION ID RESUMPTION
By default, session ID is shared by all worker threads.
If :option:`--tls-session-cache-memcached` is given, nghttpx will
insert serialized session data to memcached with
``nghttpx:tls-session-cache:`` + lowercase hex string of session ID
as a memcached entry key, with expiry time 12 hours. Session timeout
is set to 12 hours.
By default, connections to memcached server are not encrypted. To
enable encryption, use ``tls`` keyword in
:option:`--tls-session-cache-memcached` option.
TLS SESSION TICKET RESUMPTION
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@@ -482,20 +482,22 @@ 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
The stream prioritization scheme described in :rfc:`7540`, which has
been formally deprecated by :rfc:`9113`, has been removed. An
application is advised to 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
value of 1 via `nghttp2_submit_settings()`, and migrate to
: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()` with
NGHTTP2_PRIORITY_UPDATE as type argument (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_request2()`. It
can also send PRIORITY_UPDATE frame via
@@ -503,24 +505,3 @@ can also send PRIORITY_UPDATE frame via
field in a request header field and updates the stream priority unless
HTTP messaging rule enforcement is disabled (see
`nghttp2_option_set_no_http_messaging()`).
For the purpose of smooth migration from RFC 7540 priorities, client
is advised to send
:enum:`nghttp2_settings_id.NGHTTP2_SETTINGS_NO_RFC7540_PRIORITIES` of
value of 1. Until it receives the first server SETTINGS frame, it can
send both RFC 7540 and RFC 9128 priority signals. If client receives
SETTINGS_NO_RFC7540_PRIORITIES of value of 0, or it is omitted ,
client stops sending PRIORITY_UPDATE frame. Priority header field
will be sent in anyway since it is an end-to-end signal. If
SETTINGS_NO_RFC7540_PRIORITIES of value of 1 is received, client stops
sending RFC 7540 priority signals. This is the advice described in
:rfc:`9218#section-2.1.1`.
Server has an optional mechanism to fallback to RFC 7540 priorities.
By default, if server sends SETTINGS_NO_RFC7540_PRIORITIES of value of
1, it completely disables RFC 7540 priorities and no fallback. By
setting nonzero value to
`nghttp2_option_set_server_fallback_rfc7540_priorities()`, server
falls back to RFC 7540 priorities if it sends
SETTINGS_NO_RFC7540_PRIORITIES value of value of 1, and client omits
SETTINGS_NO_RFC7540_PRIORITIES in its SETTINGS frame.

View File

@@ -26,7 +26,7 @@ Coding style
We use clang-format to format source code consistently. The
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-18.
between versions, we currently use clang-format-19.
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.

View File

@@ -167,8 +167,7 @@ Enable SSL/TLS on memcached connection
By default, memcached connection is not encrypted. To enable
encryption, use ``tls`` keyword in
:option:`--tls-ticket-key-memcached` for TLS ticket key, and
:option:`--tls-session-cache-memcached` for TLS session cache.
:option:`--tls-ticket-key-memcached`.
Specifying additional server certificates
-----------------------------------------

View File

@@ -63,7 +63,7 @@ structure is defined as follows::
/* The NULL-terminated URI string to retrieve. */
const char *uri;
/* Parsed result of the |uri| */
struct http_parser_url *u;
urlparse_url *u;
/* The authority portion of the |uri|, not NULL-terminated */
char *authority;
/* The path portion of the |uri|, including query, not
@@ -237,11 +237,11 @@ HTTP request in the ``submit_request()`` function::
int32_t stream_id;
http2_stream_data *stream_data = session_data->stream_data;
const char *uri = stream_data->uri;
const struct http_parser_url *u = stream_data->u;
const urlparse_url *u = stream_data->u;
nghttp2_nv hdrs[] = {
MAKE_NV2(":method", "GET"),
MAKE_NV(":scheme", &uri[u->field_data[UF_SCHEMA].off],
u->field_data[UF_SCHEMA].len),
MAKE_NV(":scheme", &uri[u->field_data[URLPARSE_SCHEMA].off],
u->field_data[URLPARSE_SCHEMA].len),
MAKE_NV(":authority", stream_data->authority, stream_data->authoritylen),
MAKE_NV(":path", stream_data->path, stream_data->pathlen)};
fprintf(stderr, "Request headers:\n");

View File

@@ -4,33 +4,36 @@ ARG NGHTTP2_BRANCH=master
RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
git clang make binutils autoconf automake autotools-dev libtool \
git clang-19 make binutils autoconf automake autotools-dev libtool \
pkg-config cmake cmake-data \
zlib1g-dev libev-dev libjemalloc-dev ruby-dev libc-ares-dev bison \
libelf-dev libbrotli-dev
RUN git clone --recursive --shallow-submodules --depth 1 -b v1.34.2 https://github.com/aws/aws-lc && \
RUN git clone --recursive --shallow-submodules --depth 1 -b v1.62.0 https://github.com/aws/aws-lc && \
cd aws-lc && \
export CC=clang-19 CXX=clang++-19 && \
cmake -B build -DDISABLE_GO=ON && \
make -j$(nproc) -C build && \
cmake --install build && \
cd .. && \
rm -rf aws-lc
RUN git clone --recursive --shallow-submodules --depth 1 -b v1.5.0 https://github.com/ngtcp2/nghttp3 && \
RUN git clone --recursive --shallow-submodules --depth 1 -b v1.12.0 https://github.com/ngtcp2/nghttp3 && \
cd nghttp3 && \
autoreconf -i && \
./configure --disable-dependency-tracking --enable-lib-only && \
./configure --disable-dependency-tracking --enable-lib-only \
CC=clang-19 CXX=clang++-19 && \
make -j$(nproc) && \
make install-strip && \
cd .. && \
rm -rf nghttp3
RUN git clone --recursive --shallow-submodules --depth 1 -b v1.7.0 https://github.com/ngtcp2/ngtcp2 && \
RUN git clone --recursive --shallow-submodules --depth 1 -b v1.17.0 https://github.com/ngtcp2/ngtcp2 && \
cd ngtcp2 && \
autoreconf -i && \
./configure --disable-dependency-tracking --enable-lib-only \
--with-boringssl \
CC=clang-19 CXX=clang++-19 \
LIBTOOL_LDFLAGS="-static-libtool-libs" \
BORINGSSL_LIBS="-l:libssl.a -l:libcrypto.a" \
PKG_CONFIG_PATH="/usr/local/lib64/pkgconfig" && \
@@ -39,9 +42,9 @@ RUN git clone --recursive --shallow-submodules --depth 1 -b v1.7.0 https://githu
cd .. && \
rm -rf ngtcp2
RUN git clone --depth 1 -b v1.4.5 https://github.com/libbpf/libbpf && \
RUN git clone --depth 1 -b v1.6.2 https://github.com/libbpf/libbpf && \
cd libbpf && \
PREFIX=/usr/local make -C src install && \
CC=clang-19 PREFIX=/usr/local make -C src install && \
cd .. && \
rm -rf libbpf
@@ -53,7 +56,7 @@ RUN git clone --recursive --shallow-submodules --depth 1 -b $NGHTTP2_BRANCH http
--with-mruby \
--enable-http3 --with-libbpf \
--with-libbrotlienc --with-libbrotlidec \
CC=clang CXX=clang++ \
CC=clang-19 CXX=clang++-19 \
LIBTOOL_LDFLAGS="-static-libtool-libs" \
OPENSSL_LIBS="-l:libssl.a -l:libcrypto.a" \
LIBEV_LIBS="-l:libev.a" \
@@ -71,9 +74,6 @@ RUN git clone --recursive --shallow-submodules --depth 1 -b $NGHTTP2_BRANCH http
FROM gcr.io/distroless/base-nossl-debian12
COPY --from=build --link \
/usr/local/share/nghttp2/ \
/usr/local/share/nghttp2/
COPY --from=build --link \
/usr/local/bin/h2load \
/usr/local/bin/nghttpx \

View File

@@ -8,7 +8,7 @@ if(ENABLE_EXAMPLES)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
"${CMAKE_CURRENT_SOURCE_DIR}/../third-party"
"${CMAKE_CURRENT_SOURCE_DIR}/../third-party/urlparse"
"${CMAKE_CURRENT_SOURCE_DIR}/../third-party/llhttp/include"
${LIBEVENT_INCLUDE_DIRS}
@@ -23,15 +23,15 @@ if(ENABLE_EXAMPLES)
)
add_executable(client client.c $<TARGET_OBJECTS:llhttp>
$<TARGET_OBJECTS:url-parser>
$<TARGET_OBJECTS:urlparse>
)
add_executable(libevent-client libevent-client.c $<TARGET_OBJECTS:llhttp>
$<TARGET_OBJECTS:url-parser>
$<TARGET_OBJECTS:urlparse>
)
add_executable(libevent-server libevent-server.c $<TARGET_OBJECTS:llhttp>
$<TARGET_OBJECTS:url-parser>
$<TARGET_OBJECTS:urlparse>
)
add_executable(deflate deflate.c $<TARGET_OBJECTS:llhttp>
$<TARGET_OBJECTS:url-parser>
$<TARGET_OBJECTS:urlparse>
)
endif()

View File

@@ -30,13 +30,13 @@ AM_CXXFLAGS = $(WARNCXXFLAGS) $(CXX1XCXXFLAGS)
AM_CPPFLAGS = \
-I$(top_srcdir)/lib/includes \
-I$(top_builddir)/lib/includes \
-I$(top_srcdir)/third-party \
-I$(top_srcdir)/third-party/urlparse \
@LIBEVENT_OPENSSL_CFLAGS@ \
@OPENSSL_CFLAGS@ \
@DEFS@
AM_LDFLAGS = @LIBTOOL_LDFLAGS@
LDADD = $(top_builddir)/lib/libnghttp2.la \
$(top_builddir)/third-party/liburl-parser.la \
$(top_builddir)/third-party/liburlparse.la \
@LIBEVENT_OPENSSL_LIBS@ \
@OPENSSL_LIBS@ \
@APPLDFLAGS@

View File

@@ -28,26 +28,26 @@
*/
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif /* HAVE_CONFIG_H */
#endif /* defined(HAVE_CONFIG_H) */
#include <inttypes.h>
#include <stdlib.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif /* HAVE_UNISTD_H */
#endif /* defined(HAVE_UNISTD_H) */
#ifdef HAVE_FCNTL_H
# include <fcntl.h>
#endif /* HAVE_FCNTL_H */
#endif /* defined(HAVE_FCNTL_H) */
#include <sys/types.h>
#ifdef HAVE_SYS_SOCKET_H
# include <sys/socket.h>
#endif /* HAVE_SYS_SOCKET_H */
#endif /* defined(HAVE_SYS_SOCKET_H) */
#ifdef HAVE_NETDB_H
# include <netdb.h>
#endif /* HAVE_NETDB_H */
#endif /* defined(HAVE_NETDB_H) */
#ifdef HAVE_NETINET_IN_H
# include <netinet/in.h>
#endif /* HAVE_NETINET_IN_H */
#endif /* defined(HAVE_NETINET_IN_H) */
#include <netinet/tcp.h>
#include <poll.h>
#include <signal.h>
@@ -67,14 +67,14 @@ enum { IO_NONE, WANT_READ, WANT_WRITE };
#define MAKE_NV(NAME, VALUE) \
{ \
(uint8_t *)NAME, (uint8_t *)VALUE, sizeof(NAME) - 1, \
sizeof(VALUE) - 1, NGHTTP2_NV_FLAG_NONE, \
(uint8_t *)NAME, (uint8_t *)VALUE, sizeof(NAME) - 1, \
sizeof(VALUE) - 1, NGHTTP2_NV_FLAG_NONE, \
}
#define MAKE_NV_CS(NAME, VALUE) \
{ \
(uint8_t *)NAME, (uint8_t *)VALUE, sizeof(NAME) - 1, \
strlen(VALUE), NGHTTP2_NV_FLAG_NONE, \
(uint8_t *)NAME, (uint8_t *)VALUE, sizeof(NAME) - 1, \
strlen(VALUE), NGHTTP2_NV_FLAG_NONE, \
}
struct Connection {
@@ -176,7 +176,7 @@ static nghttp2_ssize send_callback(nghttp2_session *session,
int err = SSL_get_error(connection->ssl, rv);
if (err == SSL_ERROR_WANT_WRITE || err == SSL_ERROR_WANT_READ) {
connection->want_io =
(err == SSL_ERROR_WANT_READ ? WANT_READ : WANT_WRITE);
(err == SSL_ERROR_WANT_READ ? WANT_READ : WANT_WRITE);
rv = NGHTTP2_ERR_WOULDBLOCK;
} else {
rv = NGHTTP2_ERR_CALLBACK_FAILURE;
@@ -207,7 +207,7 @@ static nghttp2_ssize recv_callback(nghttp2_session *session, uint8_t *buf,
int err = SSL_get_error(connection->ssl, rv);
if (err == SSL_ERROR_WANT_WRITE || err == SSL_ERROR_WANT_READ) {
connection->want_io =
(err == SSL_ERROR_WANT_READ ? WANT_READ : WANT_WRITE);
(err == SSL_ERROR_WANT_READ ? WANT_READ : WANT_WRITE);
rv = NGHTTP2_ERR_WOULDBLOCK;
} else {
rv = NGHTTP2_ERR_CALLBACK_FAILURE;
@@ -342,10 +342,10 @@ static void setup_nghttp2_callbacks(nghttp2_session_callbacks *callbacks) {
on_frame_recv_callback);
nghttp2_session_callbacks_set_on_stream_close_callback(
callbacks, on_stream_close_callback);
callbacks, on_stream_close_callback);
nghttp2_session_callbacks_set_on_data_chunk_recv_callback(
callbacks, on_data_chunk_recv_callback);
callbacks, on_data_chunk_recv_callback);
}
/*

View File

@@ -24,7 +24,7 @@
*/
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif /* !HAVE_CONFIG_H */
#endif /* defined(HAVE_CONFIG_H) */
#include <stdio.h>
#include <string.h>
@@ -34,8 +34,8 @@
#define MAKE_NV(K, V) \
{ \
(uint8_t *)K, (uint8_t *)V, sizeof(K) - 1, \
sizeof(V) - 1, NGHTTP2_NV_FLAG_NONE, \
(uint8_t *)K, (uint8_t *)V, sizeof(K) - 1, \
sizeof(V) - 1, NGHTTP2_NV_FLAG_NONE, \
}
static void deflate(nghttp2_hd_deflater *deflater,
@@ -51,9 +51,9 @@ int main(void) {
nghttp2_hd_inflater *inflater;
/* Define 1st header set. This is looks like a HTTP request. */
nghttp2_nv nva1[] = {
MAKE_NV(":scheme", "https"), MAKE_NV(":authority", "example.org"),
MAKE_NV(":path", "/"), MAKE_NV("user-agent", "libnghttp2"),
MAKE_NV("accept-encoding", "gzip, deflate")};
MAKE_NV(":scheme", "https"), MAKE_NV(":authority", "example.org"),
MAKE_NV(":path", "/"), MAKE_NV("user-agent", "libnghttp2"),
MAKE_NV("accept-encoding", "gzip, deflate")};
/* Define 2nd header set */
nghttp2_nv nva2[] = {MAKE_NV(":scheme", "https"),
MAKE_NV(":authority", "example.org"),
@@ -175,7 +175,7 @@ int inflate_header_block(nghttp2_hd_inflater *inflater, uint8_t *in,
size_t proclen;
rv =
nghttp2_hd_inflate_hd3(inflater, &nv, &inflate_flags, in, inlen, final);
nghttp2_hd_inflate_hd3(inflater, &nv, &inflate_flags, in, inlen, final);
if (rv < 0) {
fprintf(stderr, "inflate failed with error code %td", rv);

View File

@@ -31,26 +31,26 @@
}
# define warnx(format, args...) fprintf(stderr, format "\n", ##args)
char *strndup(const char *s, size_t size);
#endif
#endif /* defined(__sgi) */
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif /* HAVE_CONFIG_H */
#endif /* defined(HAVE_CONFIG_H) */
#include <sys/types.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif /* HAVE_UNISTD_H */
#endif /* defined(HAVE_UNISTD_H) */
#ifdef HAVE_SYS_SOCKET_H
# include <sys/socket.h>
#endif /* HAVE_SYS_SOCKET_H */
#endif /* defined(HAVE_SYS_SOCKET_H) */
#ifdef HAVE_NETINET_IN_H
# include <netinet/in.h>
#endif /* HAVE_NETINET_IN_H */
#endif /* defined(HAVE_NETINET_IN_H) */
#include <netinet/tcp.h>
#ifndef __sgi
# include <err.h>
#endif
#endif /* !defined(__sgi) */
#include <signal.h>
#include <string.h>
@@ -66,7 +66,7 @@ char *strndup(const char *s, size_t size);
#define NGHTTP2_NO_SSIZE_T
#include <nghttp2/nghttp2.h>
#include "url-parser/url_parser.h"
#include "urlparse.h"
#define ARRLEN(x) (sizeof(x) / sizeof(x[0]))
@@ -74,7 +74,7 @@ typedef struct {
/* The NULL-terminated URI string to retrieve. */
const char *uri;
/* Parsed result of the |uri| */
struct http_parser_url *u;
urlparse_url *u;
/* The authority portion of the |uri|, not NULL-terminated */
char *authority;
/* The path portion of the |uri|, including query, not
@@ -96,7 +96,7 @@ typedef struct {
} http2_session_data;
static http2_stream_data *create_http2_stream_data(const char *uri,
struct http_parser_url *u) {
urlparse_url *u) {
/* MAX 5 digits (max 65535) + 1 ':' + 1 NULL (because of snprintf) */
size_t extra = 7;
http2_stream_data *stream_data = malloc(sizeof(http2_stream_data));
@@ -105,39 +105,41 @@ static http2_stream_data *create_http2_stream_data(const char *uri,
stream_data->u = u;
stream_data->stream_id = -1;
stream_data->authoritylen = u->field_data[UF_HOST].len;
stream_data->authoritylen = u->field_data[URLPARSE_HOST].len;
stream_data->authority = malloc(stream_data->authoritylen + extra);
memcpy(stream_data->authority, &uri[u->field_data[UF_HOST].off],
u->field_data[UF_HOST].len);
if (u->field_set & (1 << UF_PORT)) {
stream_data->authoritylen +=
(size_t)snprintf(stream_data->authority + u->field_data[UF_HOST].len,
extra, ":%u", u->port);
memcpy(stream_data->authority, &uri[u->field_data[URLPARSE_HOST].off],
u->field_data[URLPARSE_HOST].len);
if (u->field_set & (1 << URLPARSE_PORT)) {
stream_data->authoritylen += (size_t)snprintf(
stream_data->authority + u->field_data[URLPARSE_HOST].len, extra, ":%u",
u->port);
}
/* If we don't have path in URI, we use "/" as path. */
stream_data->pathlen = 1;
if (u->field_set & (1 << UF_PATH)) {
stream_data->pathlen = u->field_data[UF_PATH].len;
if (u->field_set & (1 << URLPARSE_PATH)) {
stream_data->pathlen = u->field_data[URLPARSE_PATH].len;
}
if (u->field_set & (1 << UF_QUERY)) {
if (u->field_set & (1 << URLPARSE_QUERY)) {
/* +1 for '?' character */
stream_data->pathlen += (size_t)(u->field_data[UF_QUERY].len + 1);
stream_data->pathlen += (size_t)(u->field_data[URLPARSE_QUERY].len + 1);
}
stream_data->path = malloc(stream_data->pathlen);
if (u->field_set & (1 << UF_PATH)) {
memcpy(stream_data->path, &uri[u->field_data[UF_PATH].off],
u->field_data[UF_PATH].len);
if (u->field_set & (1 << URLPARSE_PATH)) {
memcpy(stream_data->path, &uri[u->field_data[URLPARSE_PATH].off],
u->field_data[URLPARSE_PATH].len);
} else {
stream_data->path[0] = '/';
}
if (u->field_set & (1 << UF_QUERY)) {
stream_data->path[stream_data->pathlen - u->field_data[UF_QUERY].len - 1] =
'?';
if (u->field_set & (1 << URLPARSE_QUERY)) {
stream_data
->path[stream_data->pathlen - u->field_data[URLPARSE_QUERY].len - 1] =
'?';
memcpy(stream_data->path + stream_data->pathlen -
u->field_data[UF_QUERY].len,
&uri[u->field_data[UF_QUERY].off], u->field_data[UF_QUERY].len);
u->field_data[URLPARSE_QUERY].len,
&uri[u->field_data[URLPARSE_QUERY].off],
u->field_data[URLPARSE_QUERY].len);
}
return stream_data;
@@ -318,10 +320,9 @@ static SSL_CTX *create_ssl_ctx(void) {
errx(1, "Could not create SSL/TLS context: %s",
ERR_error_string(ERR_get_error(), NULL));
}
SSL_CTX_set_options(ssl_ctx,
SSL_OP_ALL | SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 |
SSL_OP_NO_COMPRESSION |
SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION);
SSL_CTX_set_options(ssl_ctx, SSL_OP_ALL | SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 |
SSL_OP_NO_COMPRESSION |
SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION);
SSL_CTX_set_alpn_protos(ssl_ctx, (const unsigned char *)"\x02h2", 3);
@@ -350,16 +351,16 @@ static void initialize_nghttp2_session(http2_session_data *session_data) {
on_frame_recv_callback);
nghttp2_session_callbacks_set_on_data_chunk_recv_callback(
callbacks, on_data_chunk_recv_callback);
callbacks, on_data_chunk_recv_callback);
nghttp2_session_callbacks_set_on_stream_close_callback(
callbacks, on_stream_close_callback);
callbacks, on_stream_close_callback);
nghttp2_session_callbacks_set_on_header_callback(callbacks,
on_header_callback);
nghttp2_session_callbacks_set_on_begin_headers_callback(
callbacks, on_begin_headers_callback);
callbacks, on_begin_headers_callback);
nghttp2_session_client_new(&session_data->session, callbacks, session_data);
@@ -368,7 +369,7 @@ static void initialize_nghttp2_session(http2_session_data *session_data) {
static void send_client_connection_header(http2_session_data *session_data) {
nghttp2_settings_entry iv[1] = {
{NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS, 100}};
{NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS, 100}};
int rv;
/* client 24 bytes magic string will be sent by nghttp2 library */
@@ -381,14 +382,14 @@ static void send_client_connection_header(http2_session_data *session_data) {
#define MAKE_NV(NAME, VALUE, VALUELEN) \
{ \
(uint8_t *)NAME, (uint8_t *)VALUE, sizeof(NAME) - 1, \
VALUELEN, NGHTTP2_NV_FLAG_NONE, \
(uint8_t *)NAME, (uint8_t *)VALUE, sizeof(NAME) - 1, \
VALUELEN, NGHTTP2_NV_FLAG_NONE, \
}
#define MAKE_NV2(NAME, VALUE) \
{ \
(uint8_t *)NAME, (uint8_t *)VALUE, sizeof(NAME) - 1, \
sizeof(VALUE) - 1, NGHTTP2_NV_FLAG_NONE, \
(uint8_t *)NAME, (uint8_t *)VALUE, sizeof(NAME) - 1, \
sizeof(VALUE) - 1, NGHTTP2_NV_FLAG_NONE, \
}
/* Send HTTP request to the remote peer */
@@ -396,13 +397,13 @@ static void submit_request(http2_session_data *session_data) {
int32_t stream_id;
http2_stream_data *stream_data = session_data->stream_data;
const char *uri = stream_data->uri;
const struct http_parser_url *u = stream_data->u;
const urlparse_url *u = stream_data->u;
nghttp2_nv hdrs[] = {
MAKE_NV2(":method", "GET"),
MAKE_NV(":scheme", &uri[u->field_data[UF_SCHEMA].off],
u->field_data[UF_SCHEMA].len),
MAKE_NV(":authority", stream_data->authority, stream_data->authoritylen),
MAKE_NV(":path", stream_data->path, stream_data->pathlen)};
MAKE_NV2(":method", "GET"),
MAKE_NV(":scheme", &uri[u->field_data[URLPARSE_SCHEMA].off],
u->field_data[URLPARSE_SCHEMA].len),
MAKE_NV(":authority", stream_data->authority, stream_data->authoritylen),
MAKE_NV(":path", stream_data->path, stream_data->pathlen)};
fprintf(stderr, "Request headers:\n");
print_headers(stderr, hdrs, ARRLEN(hdrs));
stream_id = nghttp2_submit_request2(session_data->session, NULL, hdrs,
@@ -527,8 +528,8 @@ static void initiate_connection(struct event_base *evbase, SSL_CTX *ssl_ctx,
ssl = create_ssl(ssl_ctx);
bev = bufferevent_openssl_socket_new(
evbase, -1, ssl, BUFFEREVENT_SSL_CONNECTING,
BEV_OPT_DEFER_CALLBACKS | BEV_OPT_CLOSE_ON_FREE);
evbase, -1, ssl, BUFFEREVENT_SSL_CONNECTING,
BEV_OPT_DEFER_CALLBACKS | BEV_OPT_CLOSE_ON_FREE);
bufferevent_enable(bev, EV_READ | EV_WRITE);
bufferevent_setcb(bev, readcb, writecb, eventcb, session_data);
rv = bufferevent_socket_connect_hostname(bev, session_data->dnsbase,
@@ -543,7 +544,7 @@ static void initiate_connection(struct event_base *evbase, SSL_CTX *ssl_ctx,
/* Get resource denoted by the |uri|. The debug and error messages are
printed in stderr, while the response body is printed in stdout. */
static void run(const char *uri) {
struct http_parser_url u;
urlparse_url u;
char *host;
uint16_t port;
int rv;
@@ -552,12 +553,13 @@ static void run(const char *uri) {
http2_session_data *session_data;
/* Parse the |uri| and stores its components in |u| */
rv = http_parser_parse_url(uri, strlen(uri), 0, &u);
rv = urlparse_parse_url(uri, strlen(uri), 0, &u);
if (rv != 0) {
errx(1, "Could not parse URI %s", uri);
}
host = strndup(&uri[u.field_data[UF_HOST].off], u.field_data[UF_HOST].len);
if (!(u.field_set & (1 << UF_PORT))) {
host = strndup(&uri[u.field_data[URLPARSE_HOST].off],
u.field_data[URLPARSE_HOST].len);
if (!(u.field_set & (1 << URLPARSE_PORT))) {
port = 443;
} else {
port = u.port;

View File

@@ -30,35 +30,35 @@
}
# define warn(format, args...) warnx(format ": %s", ##args, strerror(errno))
# define warnx(format, args...) fprintf(stderr, format "\n", ##args)
#endif
#endif /* defined(__sgi) */
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif /* HAVE_CONFIG_H */
#endif /* defined(HAVE_CONFIG_H) */
#include <sys/types.h>
#ifdef HAVE_SYS_SOCKET_H
# include <sys/socket.h>
#endif /* HAVE_SYS_SOCKET_H */
#endif /* defined(HAVE_SYS_SOCKET_H) */
#ifdef HAVE_NETDB_H
# include <netdb.h>
#endif /* HAVE_NETDB_H */
#endif /* defined(HAVE_NETDB_H) */
#include <signal.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif /* HAVE_UNISTD_H */
#endif /* defined(HAVE_UNISTD_H) */
#include <sys/stat.h>
#ifdef HAVE_FCNTL_H
# include <fcntl.h>
#endif /* HAVE_FCNTL_H */
#endif /* defined(HAVE_FCNTL_H) */
#include <ctype.h>
#ifdef HAVE_NETINET_IN_H
# include <netinet/in.h>
#endif /* HAVE_NETINET_IN_H */
#endif /* defined(HAVE_NETINET_IN_H) */
#include <netinet/tcp.h>
#ifndef __sgi
# include <err.h>
#endif
#endif /* !defined(__sgi) */
#include <string.h>
#include <errno.h>
@@ -80,8 +80,8 @@
#define MAKE_NV(NAME, VALUE) \
{ \
(uint8_t *)NAME, (uint8_t *)VALUE, sizeof(NAME) - 1, \
sizeof(VALUE) - 1, NGHTTP2_NV_FLAG_NONE, \
(uint8_t *)NAME, (uint8_t *)VALUE, sizeof(NAME) - 1, \
sizeof(VALUE) - 1, NGHTTP2_NV_FLAG_NONE, \
}
struct app_context;
@@ -132,16 +132,15 @@ static SSL_CTX *create_ssl_ctx(const char *key_file, const char *cert_file) {
errx(1, "Could not create SSL/TLS context: %s",
ERR_error_string(ERR_get_error(), NULL));
}
SSL_CTX_set_options(ssl_ctx,
SSL_OP_ALL | SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 |
SSL_OP_NO_COMPRESSION |
SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION);
SSL_CTX_set_options(ssl_ctx, SSL_OP_ALL | SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 |
SSL_OP_NO_COMPRESSION |
SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION);
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
if (SSL_CTX_set1_curves_list(ssl_ctx, "P-256") != 1) {
errx(1, "SSL_CTX_set1_curves_list failed: %s",
if (SSL_CTX_set1_groups_list(ssl_ctx, "P-256") != 1) {
errx(1, "SSL_CTX_set1_groups_list failed: %s",
ERR_error_string(ERR_get_error(), NULL));
}
#else /* !(OPENSSL_VERSION_NUMBER >= 0x30000000L) */
#else /* OPENSSL_VERSION_NUMBER < 0x30000000L */
{
EC_KEY *ecdh;
ecdh = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
@@ -152,7 +151,7 @@ static SSL_CTX *create_ssl_ctx(const char *key_file, const char *cert_file) {
SSL_CTX_set_tmp_ecdh(ssl_ctx, ecdh);
EC_KEY_free(ecdh);
}
#endif /* !(OPENSSL_VERSION_NUMBER >= 0x30000000L) */
#endif /* OPENSSL_VERSION_NUMBER < 0x30000000L */
if (SSL_CTX_use_PrivateKey_file(ssl_ctx, key_file, SSL_FILETYPE_PEM) != 1) {
errx(1, "Could not read private key file %s", key_file);
@@ -233,8 +232,8 @@ static http2_session_data *create_http2_session_data(app_context *app_ctx,
session_data->app_ctx = app_ctx;
setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *)&val, sizeof(val));
session_data->bev = bufferevent_openssl_socket_new(
app_ctx->evbase, fd, ssl, BUFFEREVENT_SSL_ACCEPTING,
BEV_OPT_CLOSE_ON_FREE | BEV_OPT_DEFER_CALLBACKS);
app_ctx->evbase, fd, ssl, BUFFEREVENT_SSL_ACCEPTING,
BEV_OPT_CLOSE_ON_FREE | BEV_OPT_DEFER_CALLBACKS);
bufferevent_enable(session_data->bev, EV_READ | EV_WRITE);
rv = getnameinfo(addr, (socklen_t)addrlen, host, sizeof(host), NULL, 0,
NI_NUMERICHOST);
@@ -360,7 +359,7 @@ static char *percent_decode(const uint8_t *value, size_t valuelen) {
continue;
}
res[j++] =
(char)((hex_to_uint(value[i + 1]) << 4) + hex_to_uint(value[i + 2]));
(char)((hex_to_uint(value[i + 1]) << 4) + hex_to_uint(value[i + 2]));
i += 3;
}
memcpy(&res[j], &value[i], 2);
@@ -422,9 +421,9 @@ static int error_reply(nghttp2_session *session,
rv = pipe(pipefd);
if (rv != 0) {
warn("Could not create pipe");
rv = nghttp2_submit_rst_stream(session, NGHTTP2_FLAG_NONE,
stream_data->stream_id,
NGHTTP2_INTERNAL_ERROR);
rv =
nghttp2_submit_rst_stream(session, NGHTTP2_FLAG_NONE,
stream_data->stream_id, NGHTTP2_INTERNAL_ERROR);
if (rv != 0) {
warnx("Fatal error: %s", nghttp2_strerror(rv));
return -1;
@@ -467,7 +466,7 @@ static int on_header_callback(nghttp2_session *session,
break;
}
stream_data =
nghttp2_session_get_stream_user_data(session, frame->hd.stream_id);
nghttp2_session_get_stream_user_data(session, frame->hd.stream_id);
if (!stream_data || stream_data->request_path) {
break;
}
@@ -557,7 +556,7 @@ static int on_frame_recv_callback(nghttp2_session *session,
/* Check that the client request has finished */
if (frame->hd.flags & NGHTTP2_FLAG_END_STREAM) {
stream_data =
nghttp2_session_get_stream_user_data(session, frame->hd.stream_id);
nghttp2_session_get_stream_user_data(session, frame->hd.stream_id);
/* For DATA and HEADERS frame, this callback may be called after
on_stream_close_callback. Check that stream still alive. */
if (!stream_data) {
@@ -598,13 +597,13 @@ static void initialize_nghttp2_session(http2_session_data *session_data) {
on_frame_recv_callback);
nghttp2_session_callbacks_set_on_stream_close_callback(
callbacks, on_stream_close_callback);
callbacks, on_stream_close_callback);
nghttp2_session_callbacks_set_on_header_callback(callbacks,
on_header_callback);
nghttp2_session_callbacks_set_on_begin_headers_callback(
callbacks, on_begin_headers_callback);
callbacks, on_begin_headers_callback);
nghttp2_session_server_new(&session_data->session, callbacks, session_data);
@@ -615,7 +614,7 @@ static void initialize_nghttp2_session(http2_session_data *session_data) {
magic octets and SETTINGS frame */
static int send_server_connection_header(http2_session_data *session_data) {
nghttp2_settings_entry iv[1] = {
{NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS, 100}};
{NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS, 100}};
int rv;
rv = nghttp2_submit_settings(session_data->session, NGHTTP2_FLAG_NONE, iv,
@@ -728,7 +727,7 @@ static void start_listen(struct event_base *evbase, const char *service,
hints.ai_flags = AI_PASSIVE;
#ifdef AI_ADDRCONFIG
hints.ai_flags |= AI_ADDRCONFIG;
#endif /* AI_ADDRCONFIG */
#endif /* defined(AI_ADDRCONFIG) */
rv = getaddrinfo(NULL, service, &hints, &res);
if (rv != 0) {
@@ -737,8 +736,8 @@ static void start_listen(struct event_base *evbase, const char *service,
for (rp = res; rp; rp = rp->ai_next) {
struct evconnlistener *listener;
listener = evconnlistener_new_bind(
evbase, acceptcb, app_ctx, LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE,
16, rp->ai_addr, (int)rp->ai_addrlen);
evbase, acceptcb, app_ctx, LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE, 16,
rp->ai_addr, (int)rp->ai_addrlen);
if (listener) {
freeaddrinfo(res);

View File

@@ -62,8 +62,8 @@ void check_frame_pack_headers(FuzzedDataProvider *data_provider) {
nvlen = HEADERS_LENGTH;
nghttp2_priority_spec_default_init(&pri_spec);
nghttp2_frame_headers_init(
&frame, NGHTTP2_FLAG_END_STREAM | NGHTTP2_FLAG_END_HEADERS, 1000000007,
NGHTTP2_HCAT_REQUEST, &pri_spec, nva, nvlen);
&frame, NGHTTP2_FLAG_END_STREAM | NGHTTP2_FLAG_END_HEADERS, 1000000007,
NGHTTP2_HCAT_REQUEST, &pri_spec, nva, nvlen);
/* Perform a set of operations with the fuzz data */
rv = nghttp2_frame_pack_headers(&bufs, &frame, &deflater);

View File

@@ -56,11 +56,11 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
nghttp2_session_callbacks_set_on_frame_recv_callback(callbacks,
on_frame_recv_callback);
nghttp2_session_callbacks_set_on_begin_headers_callback(
callbacks, on_begin_headers_callback);
callbacks, on_begin_headers_callback);
nghttp2_session_callbacks_set_on_header_callback2(callbacks,
on_header_callback2);
nghttp2_session_callbacks_set_before_frame_send_callback(
callbacks, before_frame_send_callback);
callbacks, before_frame_send_callback);
nghttp2_session_callbacks_set_on_frame_send_callback(callbacks,
on_frame_send_callback);

View File

@@ -60,11 +60,11 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
nghttp2_session_callbacks_set_on_frame_recv_callback(callbacks,
on_frame_recv_callback);
nghttp2_session_callbacks_set_on_begin_headers_callback(
callbacks, on_begin_headers_callback);
callbacks, on_begin_headers_callback);
nghttp2_session_callbacks_set_on_header_callback2(callbacks,
on_header_callback2);
nghttp2_session_callbacks_set_before_frame_send_callback(
callbacks, before_frame_send_callback);
callbacks, before_frame_send_callback);
nghttp2_session_callbacks_set_on_frame_send_callback(callbacks,
on_frame_send_callback);

View File

@@ -204,6 +204,7 @@ OPTIONS = [
"frontend-header-timeout",
"frontend-http2-idle-timeout",
"frontend-http3-idle-timeout",
"groups",
]
LOGVARS = [

View File

@@ -35,7 +35,7 @@ enum {''')
def gen_index_header(tokens, prefix, comp_fun, return_type, fail_value):
print('''\
{} lookup_token(const StringRef &name) {{
{} lookup_token(const std::string_view &name) {{
switch (name.size()) {{'''.format(return_type))
b = build_header(tokens)
for size in sorted(b.keys()):
@@ -50,7 +50,7 @@ def gen_index_header(tokens, prefix, comp_fun, return_type, fail_value):
case '{}':'''.format(c))
for k in headers:
print('''\
if ({}("{}"_sr, name, {})) {{
if ({}("{}"sv, name.substr(0, {}))) {{
return {};
}}'''.format(comp_fun, k[:-1], size - 1, to_enum_hd(k, prefix)))
print('''\

24
go.mod
View File

@@ -1,24 +1,20 @@
module github.com/nghttp2/nghttp2
go 1.22.0
go 1.24.0
require (
github.com/bradfitz/gomemcache v0.0.0-20230905024940-24af94b03874
github.com/quic-go/quic-go v0.46.0
github.com/quic-go/quic-go v0.55.0
github.com/tatsuhiro-t/go-nghttp2 v0.0.0-20240121064059-46ccb0a462a8
golang.org/x/net v0.28.0
golang.org/x/net v0.46.0
)
require (
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect
github.com/onsi/ginkgo/v2 v2.9.5 // indirect
github.com/quic-go/qpack v0.4.0 // indirect
go.uber.org/mock v0.4.0 // indirect
golang.org/x/crypto v0.26.0 // indirect
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect
golang.org/x/mod v0.17.0 // indirect
golang.org/x/sys v0.23.0 // indirect
golang.org/x/text v0.17.0 // indirect
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect
github.com/quic-go/qpack v0.5.1 // indirect
golang.org/x/crypto v0.43.0 // indirect
golang.org/x/mod v0.28.0 // indirect
golang.org/x/sync v0.17.0 // indirect
golang.org/x/sys v0.37.0 // indirect
golang.org/x/text v0.30.0 // indirect
golang.org/x/tools v0.37.0 // indirect
)

71
go.sum
View File

@@ -1,61 +1,34 @@
github.com/bradfitz/gomemcache v0.0.0-20230905024940-24af94b03874 h1:N7oVaKyGp8bttX0bfZGmcGkjz7DLQXhAn3DNd3T0ous=
github.com/bradfitz/gomemcache v0.0.0-20230905024940-24af94b03874/go.mod h1:r5xuitiExdLAJ09PR7vBVENGvp4ZuTBeWTGtxuX3K+c=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE=
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q=
github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k=
github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE=
github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo=
github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A=
github.com/quic-go/quic-go v0.46.0 h1:uuwLClEEyk1DNvchH8uCByQVjo3yKL9opKulExNDs7Y=
github.com/quic-go/quic-go v0.46.0/go.mod h1:1dLehS7TIR64+vxGR70GDcatWTOtMX2PUtnKsjbTurI=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
github.com/quic-go/quic-go v0.55.0 h1:zccPQIqYCXDt5NmcEabyYvOnomjs8Tlwl7tISjJh9Mk=
github.com/quic-go/quic-go v0.55.0/go.mod h1:DR51ilwU1uE164KuWXhinFcKWGlEjzys2l8zUl5Ss1U=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/tatsuhiro-t/go-nghttp2 v0.0.0-20240121064059-46ccb0a462a8 h1:zKJxuRe+a0O34V81GAZWOrotuU6mveT30QLjJ7OPMMg=
github.com/tatsuhiro-t/go-nghttp2 v0.0.0-20240121064059-46ccb0a462a8/go.mod h1:gTqc3Q4boc+cKRlSFywTYdX9t6VGRcsThlNIWwaL3Dc=
go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU=
go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc=
golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw=
golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM=
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc=
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM=
golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko=
go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o=
golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04=
golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0=
golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U=
golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI=
golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4=
golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210=
golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=
golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=
golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k=
golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM=
golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE=
golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

View File

@@ -882,12 +882,39 @@ func TestH1H1CONNECTMethodFailure(t *testing.T) {
if _, err := io.ReadAll(resp.Body); err != nil {
t.Fatalf("Error io.ReadAll() = %v", err)
}
}
if _, err := io.WriteString(st.conn, "CONNECT 127.0.0.1:443 HTTP/1.1\r\nTest-Case: TestH1H1CONNECTMethodFailure\r\nHost: 127.0.0.1:443\r\nrequired-header: foo\r\n\r\n"); err != nil {
// TestH1H1CONNECTMethod tests that CONNECT request succeeds.
func TestH1H1CONNECTMethod(t *testing.T) {
opts := options{
handler: func(w http.ResponseWriter, r *http.Request) {
hj, ok := w.(http.Hijacker)
if !ok {
http.Error(w, "Could not hijack the connection", http.StatusInternalServerError)
return
}
_, bufrw, err := hj.Hijack()
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
if _, err := bufrw.WriteString("HTTP/1.1 200\r\n\r\n"); err != nil {
t.Fatalf("Error bufrw.WriteString() = %v", err)
}
bufrw.Flush()
},
}
st := newServerTester(t, opts)
defer st.Close()
if _, err := io.WriteString(st.conn, "CONNECT 127.0.0.1:443 HTTP/1.1\r\nTest-Case: TestH1H1CONNECTMethod\r\nHost: 127.0.0.1:443\r\n\r\n"); err != nil {
t.Fatalf("Error io.WriteString() = %v", err)
}
resp, err = http.ReadResponse(bufio.NewReader(st.conn), nil)
resp, err := http.ReadResponse(bufio.NewReader(st.conn), nil)
if err != nil {
t.Fatalf("Error http.ReadResponse() = %v", err)
}

View File

@@ -1334,7 +1334,6 @@ func TestH2H1Upgrade(t *testing.T) {
pair("HTTP2-Settings", "AAMAAABkAAQAAP__"),
},
})
if err != nil {
t.Fatalf("Error st.http1() = %v", err)
}

View File

@@ -161,7 +161,7 @@ func newServerTester(t *testing.T, opts options) *serverTester {
b := "-b"
if !externalDNS {
b += fmt.Sprintf("%v;", strings.Replace(backendURL.Host, ":", ",", -1))
b += fmt.Sprintf("%v;", strings.ReplaceAll(backendURL.Host, ":", ","))
} else {
sep := strings.LastIndex(backendURL.Host, ":")
if sep == -1 {
@@ -170,6 +170,8 @@ func newServerTester(t *testing.T, opts options) *serverTester {
// We use awesome service nip.io.
b += fmt.Sprintf("%v.nip.io,%v;", backendURL.Host[:sep], backendURL.Host[sep+1:])
// Make external DNS tests less flaky.
args = append(args, "--backend-address-family=IPv4")
}
if backendTLS {
@@ -206,7 +208,19 @@ func newServerTester(t *testing.T, opts options) *serverTester {
if opts.quic {
args = append(args,
fmt.Sprintf("-f127.0.0.1,%v;quic", serverPort),
"--no-quic-bpf")
"--no-quic-bpf",
// quic-go client just closes connection after
// receiving the first GOAWAY without any
// indication like sending CONNECTION_CLOSE if
// there is no active stream. If that
// happens, server keeps resending 2nd GOAWAY
// until idle timeout passes. If that happens
// during Close(), the process will be killed
// because the default idle timeout is longer
// than the close timeout. Shorten the idle
// timeout to prevent it from happening.
"--frontend-quic-idle-timeout=5",
)
}
authority := fmt.Sprintf("127.0.0.1:%v", opts.connectPort)
@@ -631,7 +645,7 @@ loop:
return res, err
}
sr, ok := streams[f.FrameHeader.StreamID]
sr, ok := streams[f.StreamID]
if !ok {
st.header = make(http.Header)
break
@@ -643,7 +657,7 @@ loop:
status, err = strconv.Atoi(sr.header.Get(":status"))
if err != nil {
return res, fmt.Errorf("Error parsing status code: %w", err)
return res, fmt.Errorf("could not parse :status: %w", err)
}
sr.status = status
@@ -664,7 +678,7 @@ loop:
streams[sr.streamID] = sr
case *http2.DataFrame:
sr, ok := streams[f.FrameHeader.StreamID]
sr, ok := streams[f.StreamID]
if !ok {
break
}
@@ -675,7 +689,7 @@ loop:
break loop
}
case *http2.RSTStreamFrame:
sr, ok := streams[f.FrameHeader.StreamID]
sr, ok := streams[f.StreamID]
if !ok {
break
}

View File

@@ -15,7 +15,7 @@ import (
)
func (st *serverTester) http3(rp requestParam) (*serverResponse, error) {
rt := &http3.RoundTripper{
rt := &http3.Transport{
TLSClientConfig: &tls.Config{
InsecureSkipVerify: true,
},

View File

@@ -47,7 +47,29 @@ if(WIN32)
set(NGHTTP2_RES ${CMAKE_CURRENT_BINARY_DIR}/version.rc)
endif()
set(EXPORT_SET "${PROJECT_NAME}-targets")
set(NGHTTP2_GENERATED_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated")
set(NGHTTP2_VERSION_CONFIG "${NGHTTP2_GENERATED_DIR}/${PROJECT_NAME}ConfigVersion.cmake")
set(NGHTTP2_PROJECT_CONFIG "${NGHTTP2_GENERATED_DIR}/${PROJECT_NAME}Config.cmake")
set(NGHTTP2_TARGETS_EXPORT_NAME "${PROJECT_NAME}Targets")
set(NGHTTP2_CONFIG_INSTALL_DIR "lib/cmake/${PROJECT_NAME}")
set(NGHTTP2_NAMESPACE "${PROJECT_NAME}::")
set(NGHTTP2_VERSION ${PROJECT_VERSION})
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
"${NGHTTP2_VERSION_CONFIG}" VERSION ${NGHTTP2_VERSION} COMPATIBILITY SameMajorVersion
)
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/config.cmake.in" "${NGHTTP2_PROJECT_CONFIG}" @ONLY)
# Install cmake config files
install(
FILES "${NGHTTP2_PROJECT_CONFIG}" "${NGHTTP2_VERSION_CONFIG}"
DESTINATION "${NGHTTP2_CONFIG_INSTALL_DIR}")
install(
EXPORT "${NGHTTP2_TARGETS_EXPORT_NAME}"
NAMESPACE "${NGHTTP2_NAMESPACE}"
DESTINATION "${NGHTTP2_CONFIG_INSTALL_DIR}")
# Public shared library
if(BUILD_SHARED_LIBS)
@@ -65,7 +87,11 @@ if(BUILD_SHARED_LIBS)
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)
install(TARGETS ${SHARED_LIB} EXPORT ${EXPORT_SET})
install(TARGETS ${SHARED_LIB}
EXPORT ${NGHTTP2_TARGETS_EXPORT_NAME}
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
list(APPEND nghttp2_exports ${SHARED_LIB})
endif()
@@ -87,7 +113,9 @@ if(BUILD_STATIC_LIBS)
target_compile_definitions(${STATIC_LIB} PUBLIC "-DNGHTTP2_STATICLIB")
install(TARGETS ${STATIC_LIB} EXPORT ${EXPORT_SET})
install(TARGETS ${STATIC_LIB}
EXPORT ${NGHTTP2_TARGETS_EXPORT_NAME}
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}")
list(APPEND nghttp2_exports ${STATIC_LIB})
endif()
@@ -97,11 +125,7 @@ else()
set(LIB_SELECTED ${STATIC_LIB})
endif()
add_library(${PROJECT_NAME}::nghttp2 ALIAS ${LIB_SELECTED})
add_library(nghttp2 ALIAS ${LIB_SELECTED})
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libnghttp2.pc"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
install(EXPORT ${EXPORT_SET}
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
NAMESPACE ${PROJECT_NAME}::)

View File

@@ -22,7 +22,7 @@
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
SUBDIRS = includes
EXTRA_DIST = Makefile.msvc CMakeLists.txt version.rc.in
EXTRA_DIST = Makefile.msvc CMakeLists.txt version.rc.in config.cmake.in
AM_CFLAGS = $(WARNCFLAGS) $(EXTRACFLAG)
AM_CPPFLAGS = -I$(srcdir)/includes -I$(builddir)/includes -DBUILDING_NGHTTP2 \

3
lib/config.cmake.in Normal file
View File

@@ -0,0 +1,3 @@
include(CMakeFindDependencyMacro)
include("${CMAKE_CURRENT_LIST_DIR}/@NGHTTP2_TARGETS_EXPORT_NAME@.cmake")

File diff suppressed because it is too large Load Diff

View File

@@ -27,8 +27,8 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif /* HAVE_CONFIG_H */
#endif /* defined(HAVE_CONFIG_H) */
#include <nghttp2/nghttp2.h>
#endif /* NGHTTP2_ALPN_H */
#endif /* !defined(NGHTTP2_ALPN_H) */

View File

@@ -27,7 +27,7 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif /* HAVE_CONFIG_H */
#endif /* defined(HAVE_CONFIG_H) */
#include <nghttp2/nghttp2.h>
@@ -409,4 +409,4 @@ int nghttp2_bufs_next_present(nghttp2_bufs *bufs);
*/
size_t nghttp2_bufs_len(nghttp2_bufs *bufs);
#endif /* NGHTTP2_BUF_H */
#endif /* !defined(NGHTTP2_BUF_H) */

View File

@@ -41,163 +41,168 @@ void nghttp2_session_callbacks_del(nghttp2_session_callbacks *callbacks) {
}
void nghttp2_session_callbacks_set_send_callback(
nghttp2_session_callbacks *cbs, nghttp2_send_callback send_callback) {
nghttp2_session_callbacks *cbs, nghttp2_send_callback send_callback) {
cbs->send_callback = send_callback;
}
void nghttp2_session_callbacks_set_send_callback2(
nghttp2_session_callbacks *cbs, nghttp2_send_callback2 send_callback) {
nghttp2_session_callbacks *cbs, nghttp2_send_callback2 send_callback) {
cbs->send_callback2 = send_callback;
}
void nghttp2_session_callbacks_set_recv_callback(
nghttp2_session_callbacks *cbs, nghttp2_recv_callback recv_callback) {
nghttp2_session_callbacks *cbs, nghttp2_recv_callback recv_callback) {
cbs->recv_callback = recv_callback;
}
void nghttp2_session_callbacks_set_recv_callback2(
nghttp2_session_callbacks *cbs, nghttp2_recv_callback2 recv_callback) {
nghttp2_session_callbacks *cbs, nghttp2_recv_callback2 recv_callback) {
cbs->recv_callback2 = recv_callback;
}
void nghttp2_session_callbacks_set_on_frame_recv_callback(
nghttp2_session_callbacks *cbs,
nghttp2_on_frame_recv_callback on_frame_recv_callback) {
nghttp2_session_callbacks *cbs,
nghttp2_on_frame_recv_callback on_frame_recv_callback) {
cbs->on_frame_recv_callback = on_frame_recv_callback;
}
void nghttp2_session_callbacks_set_on_invalid_frame_recv_callback(
nghttp2_session_callbacks *cbs,
nghttp2_on_invalid_frame_recv_callback on_invalid_frame_recv_callback) {
nghttp2_session_callbacks *cbs,
nghttp2_on_invalid_frame_recv_callback on_invalid_frame_recv_callback) {
cbs->on_invalid_frame_recv_callback = on_invalid_frame_recv_callback;
}
void nghttp2_session_callbacks_set_on_data_chunk_recv_callback(
nghttp2_session_callbacks *cbs,
nghttp2_on_data_chunk_recv_callback on_data_chunk_recv_callback) {
nghttp2_session_callbacks *cbs,
nghttp2_on_data_chunk_recv_callback on_data_chunk_recv_callback) {
cbs->on_data_chunk_recv_callback = on_data_chunk_recv_callback;
}
void nghttp2_session_callbacks_set_before_frame_send_callback(
nghttp2_session_callbacks *cbs,
nghttp2_before_frame_send_callback before_frame_send_callback) {
nghttp2_session_callbacks *cbs,
nghttp2_before_frame_send_callback before_frame_send_callback) {
cbs->before_frame_send_callback = before_frame_send_callback;
}
void nghttp2_session_callbacks_set_on_frame_send_callback(
nghttp2_session_callbacks *cbs,
nghttp2_on_frame_send_callback on_frame_send_callback) {
nghttp2_session_callbacks *cbs,
nghttp2_on_frame_send_callback on_frame_send_callback) {
cbs->on_frame_send_callback = on_frame_send_callback;
}
void nghttp2_session_callbacks_set_on_frame_not_send_callback(
nghttp2_session_callbacks *cbs,
nghttp2_on_frame_not_send_callback on_frame_not_send_callback) {
nghttp2_session_callbacks *cbs,
nghttp2_on_frame_not_send_callback on_frame_not_send_callback) {
cbs->on_frame_not_send_callback = on_frame_not_send_callback;
}
void nghttp2_session_callbacks_set_on_stream_close_callback(
nghttp2_session_callbacks *cbs,
nghttp2_on_stream_close_callback on_stream_close_callback) {
nghttp2_session_callbacks *cbs,
nghttp2_on_stream_close_callback on_stream_close_callback) {
cbs->on_stream_close_callback = on_stream_close_callback;
}
void nghttp2_session_callbacks_set_on_begin_headers_callback(
nghttp2_session_callbacks *cbs,
nghttp2_on_begin_headers_callback on_begin_headers_callback) {
nghttp2_session_callbacks *cbs,
nghttp2_on_begin_headers_callback on_begin_headers_callback) {
cbs->on_begin_headers_callback = on_begin_headers_callback;
}
void nghttp2_session_callbacks_set_on_header_callback(
nghttp2_session_callbacks *cbs,
nghttp2_on_header_callback on_header_callback) {
nghttp2_session_callbacks *cbs,
nghttp2_on_header_callback on_header_callback) {
cbs->on_header_callback = on_header_callback;
}
void nghttp2_session_callbacks_set_on_header_callback2(
nghttp2_session_callbacks *cbs,
nghttp2_on_header_callback2 on_header_callback2) {
nghttp2_session_callbacks *cbs,
nghttp2_on_header_callback2 on_header_callback2) {
cbs->on_header_callback2 = on_header_callback2;
}
void nghttp2_session_callbacks_set_on_invalid_header_callback(
nghttp2_session_callbacks *cbs,
nghttp2_on_invalid_header_callback on_invalid_header_callback) {
nghttp2_session_callbacks *cbs,
nghttp2_on_invalid_header_callback on_invalid_header_callback) {
cbs->on_invalid_header_callback = on_invalid_header_callback;
}
void nghttp2_session_callbacks_set_on_invalid_header_callback2(
nghttp2_session_callbacks *cbs,
nghttp2_on_invalid_header_callback2 on_invalid_header_callback2) {
nghttp2_session_callbacks *cbs,
nghttp2_on_invalid_header_callback2 on_invalid_header_callback2) {
cbs->on_invalid_header_callback2 = on_invalid_header_callback2;
}
void nghttp2_session_callbacks_set_select_padding_callback(
nghttp2_session_callbacks *cbs,
nghttp2_select_padding_callback select_padding_callback) {
nghttp2_session_callbacks *cbs,
nghttp2_select_padding_callback select_padding_callback) {
cbs->select_padding_callback = select_padding_callback;
}
void nghttp2_session_callbacks_set_select_padding_callback2(
nghttp2_session_callbacks *cbs,
nghttp2_select_padding_callback2 select_padding_callback) {
nghttp2_session_callbacks *cbs,
nghttp2_select_padding_callback2 select_padding_callback) {
cbs->select_padding_callback2 = select_padding_callback;
}
void nghttp2_session_callbacks_set_data_source_read_length_callback(
nghttp2_session_callbacks *cbs,
nghttp2_data_source_read_length_callback data_source_read_length_callback) {
nghttp2_session_callbacks *cbs,
nghttp2_data_source_read_length_callback data_source_read_length_callback) {
cbs->read_length_callback = data_source_read_length_callback;
}
void nghttp2_session_callbacks_set_data_source_read_length_callback2(
nghttp2_session_callbacks *cbs, nghttp2_data_source_read_length_callback2
data_source_read_length_callback) {
nghttp2_session_callbacks *cbs,
nghttp2_data_source_read_length_callback2 data_source_read_length_callback) {
cbs->read_length_callback2 = data_source_read_length_callback;
}
void nghttp2_session_callbacks_set_on_begin_frame_callback(
nghttp2_session_callbacks *cbs,
nghttp2_on_begin_frame_callback on_begin_frame_callback) {
nghttp2_session_callbacks *cbs,
nghttp2_on_begin_frame_callback on_begin_frame_callback) {
cbs->on_begin_frame_callback = on_begin_frame_callback;
}
void nghttp2_session_callbacks_set_send_data_callback(
nghttp2_session_callbacks *cbs,
nghttp2_send_data_callback send_data_callback) {
nghttp2_session_callbacks *cbs,
nghttp2_send_data_callback send_data_callback) {
cbs->send_data_callback = send_data_callback;
}
void nghttp2_session_callbacks_set_pack_extension_callback(
nghttp2_session_callbacks *cbs,
nghttp2_pack_extension_callback pack_extension_callback) {
nghttp2_session_callbacks *cbs,
nghttp2_pack_extension_callback pack_extension_callback) {
cbs->pack_extension_callback = pack_extension_callback;
}
void nghttp2_session_callbacks_set_pack_extension_callback2(
nghttp2_session_callbacks *cbs,
nghttp2_pack_extension_callback2 pack_extension_callback) {
nghttp2_session_callbacks *cbs,
nghttp2_pack_extension_callback2 pack_extension_callback) {
cbs->pack_extension_callback2 = pack_extension_callback;
}
void nghttp2_session_callbacks_set_unpack_extension_callback(
nghttp2_session_callbacks *cbs,
nghttp2_unpack_extension_callback unpack_extension_callback) {
nghttp2_session_callbacks *cbs,
nghttp2_unpack_extension_callback unpack_extension_callback) {
cbs->unpack_extension_callback = unpack_extension_callback;
}
void nghttp2_session_callbacks_set_on_extension_chunk_recv_callback(
nghttp2_session_callbacks *cbs,
nghttp2_on_extension_chunk_recv_callback on_extension_chunk_recv_callback) {
nghttp2_session_callbacks *cbs,
nghttp2_on_extension_chunk_recv_callback on_extension_chunk_recv_callback) {
cbs->on_extension_chunk_recv_callback = on_extension_chunk_recv_callback;
}
void nghttp2_session_callbacks_set_error_callback(
nghttp2_session_callbacks *cbs, nghttp2_error_callback error_callback) {
nghttp2_session_callbacks *cbs, nghttp2_error_callback error_callback) {
cbs->error_callback = error_callback;
}
void nghttp2_session_callbacks_set_error_callback2(
nghttp2_session_callbacks *cbs, nghttp2_error_callback2 error_callback2) {
nghttp2_session_callbacks *cbs, nghttp2_error_callback2 error_callback2) {
cbs->error_callback2 = error_callback2;
}
void nghttp2_session_callbacks_set_rand_callback(
nghttp2_session_callbacks *cbs, nghttp2_rand_callback rand_callback) {
cbs->rand_callback = rand_callback;
}

View File

@@ -27,7 +27,7 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif /* HAVE_CONFIG_H */
#endif /* defined(HAVE_CONFIG_H) */
#include <nghttp2/nghttp2.h>
@@ -151,6 +151,7 @@ struct nghttp2_session_callbacks {
nghttp2_on_extension_chunk_recv_callback on_extension_chunk_recv_callback;
nghttp2_error_callback error_callback;
nghttp2_error_callback2 error_callback2;
nghttp2_rand_callback rand_callback;
};
#endif /* NGHTTP2_CALLBACKS_H */
#endif /* !defined(NGHTTP2_CALLBACKS_H) */

View File

@@ -34,7 +34,7 @@ static void nghttp2_default_debug_vfprintf_callback(const char *fmt,
}
static nghttp2_debug_vprintf_callback static_debug_vprintf_callback =
nghttp2_default_debug_vfprintf_callback;
nghttp2_default_debug_vfprintf_callback;
void nghttp2_debug_vprintf(const char *format, ...) {
if (static_debug_vprintf_callback) {
@@ -46,15 +46,15 @@ void nghttp2_debug_vprintf(const char *format, ...) {
}
void nghttp2_set_debug_vprintf_callback(
nghttp2_debug_vprintf_callback debug_vprintf_callback) {
nghttp2_debug_vprintf_callback debug_vprintf_callback) {
static_debug_vprintf_callback = debug_vprintf_callback;
}
#else /* !DEBUGBUILD */
#else /* !defined(DEBUGBUILD) */
void nghttp2_set_debug_vprintf_callback(
nghttp2_debug_vprintf_callback debug_vprintf_callback) {
nghttp2_debug_vprintf_callback debug_vprintf_callback) {
(void)debug_vprintf_callback;
}
#endif /* !DEBUGBUILD */
#endif /* !defined(DEBUGBUILD) */

View File

@@ -27,17 +27,17 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif /* HAVE_CONFIG_H */
#endif /* defined(HAVE_CONFIG_H) */
#include <nghttp2/nghttp2.h>
#ifdef DEBUGBUILD
# define DEBUGF(...) nghttp2_debug_vprintf(__VA_ARGS__)
void nghttp2_debug_vprintf(const char *format, ...);
#else
#else /* !defined(DEBUGBUILD) */
# define DEBUGF(...) \
do { \
} while (0)
#endif
#endif /* !defined(DEBUGBUILD) */
#endif /* NGHTTP2_DEBUG_H */
#endif /* !defined(NGHTTP2_DEBUG_H) */

View File

@@ -28,7 +28,7 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif /* HAVE_CONFIG_H */
#endif /* defined(HAVE_CONFIG_H) */
#include <nghttp2/nghttp2.h>
@@ -62,4 +62,4 @@ void nghttp2_extpri_from_uint8(nghttp2_extpri *extpri, uint8_t u8extpri);
*/
#define nghttp2_extpri_uint8_inc(PRI) (((PRI) & NGHTTP2_EXTPRI_INC_MASK) != 0)
#endif /* NGHTTP2_EXTPRI_H */
#endif /* !defined(NGHTTP2_EXTPRI_H) */

View File

@@ -492,7 +492,7 @@ int nghttp2_frame_pack_settings(nghttp2_bufs *bufs, nghttp2_settings *frame) {
nghttp2_frame_pack_frame_hd(buf->pos, &frame->hd);
buf->last +=
nghttp2_frame_pack_settings_payload(buf->last, frame->iv, frame->niv);
nghttp2_frame_pack_settings_payload(buf->last, frame->iv, frame->niv);
return 0;
}
@@ -537,7 +537,7 @@ int nghttp2_frame_unpack_settings_payload2(nghttp2_settings_entry **iv_ptr,
}
*iv_ptr =
nghttp2_mem_malloc(mem, (*niv_ptr) * sizeof(nghttp2_settings_entry));
nghttp2_mem_malloc(mem, (*niv_ptr) * sizeof(nghttp2_settings_entry));
if (*iv_ptr == NULL) {
return NGHTTP2_ERR_NOMEM;
@@ -589,7 +589,7 @@ int nghttp2_frame_pack_push_promise(nghttp2_bufs *bufs,
void nghttp2_frame_unpack_push_promise_payload(nghttp2_push_promise *frame,
const uint8_t *payload) {
frame->promised_stream_id =
nghttp2_get_uint32(payload) & NGHTTP2_STREAM_ID_MASK;
nghttp2_get_uint32(payload) & NGHTTP2_STREAM_ID_MASK;
frame->nva = NULL;
frame->nvlen = 0;
}
@@ -608,7 +608,7 @@ void nghttp2_frame_pack_ping(nghttp2_bufs *bufs, nghttp2_ping *frame) {
nghttp2_frame_pack_frame_hd(buf->pos, &frame->hd);
buf->last =
nghttp2_cpymem(buf->last, frame->opaque_data, sizeof(frame->opaque_data));
nghttp2_cpymem(buf->last, frame->opaque_data, sizeof(frame->opaque_data));
}
void nghttp2_frame_unpack_ping_payload(nghttp2_ping *frame,
@@ -709,7 +709,7 @@ void nghttp2_frame_pack_window_update(nghttp2_bufs *bufs,
void nghttp2_frame_unpack_window_update_payload(nghttp2_window_update *frame,
const uint8_t *payload) {
frame->window_size_increment =
nghttp2_get_uint32(payload) & NGHTTP2_WINDOW_SIZE_INCREMENT_MASK;
nghttp2_get_uint32(payload) & NGHTTP2_WINDOW_SIZE_INCREMENT_MASK;
}
void nghttp2_frame_pack_altsvc(nghttp2_bufs *bufs, nghttp2_extension *frame) {
@@ -926,7 +926,7 @@ void nghttp2_frame_unpack_priority_update_payload(nghttp2_extension *frame,
priority_update = frame->payload;
priority_update->stream_id =
nghttp2_get_uint32(payload) & NGHTTP2_STREAM_ID_MASK;
nghttp2_get_uint32(payload) & NGHTTP2_STREAM_ID_MASK;
if (payloadlen > 4) {
priority_update->field_value = payload + 4;

View File

@@ -27,7 +27,7 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif /* HAVE_CONFIG_H */
#endif /* defined(HAVE_CONFIG_H) */
#include <nghttp2/nghttp2.h>
#include "nghttp2_hd.h"
@@ -634,4 +634,4 @@ int nghttp2_iv_check(const nghttp2_settings_entry *iv, size_t niv);
void nghttp2_frame_add_pad(nghttp2_bufs *bufs, nghttp2_frame_hd *hd,
size_t padlen, int framehd_only);
#endif /* NGHTTP2_FRAME_H */
#endif /* !defined(NGHTTP2_FRAME_H) */

View File

@@ -35,11 +35,11 @@
/* Make scalar initialization form of nghttp2_hd_entry */
#define MAKE_STATIC_ENT(N, V, T, H) \
{ \
{NULL, NULL, (uint8_t *)(N), sizeof((N)) - 1, -1}, \
{NULL, NULL, (uint8_t *)(V), sizeof((V)) - 1, -1}, \
{(uint8_t *)(N), (uint8_t *)(V), sizeof((N)) - 1, sizeof((V)) - 1, 0}, \
T, \
H, \
{NULL, NULL, (uint8_t *)(N), sizeof((N)) - 1, -1}, \
{NULL, NULL, (uint8_t *)(V), sizeof((V)) - 1, -1}, \
{(uint8_t *)(N), (uint8_t *)(V), sizeof((N)) - 1, sizeof((V)) - 1, 0}, \
T, \
H, \
}
/* Generated by mkstatictbl.py */
@@ -47,67 +47,67 @@
first enum value if same header names are repeated (e.g.,
:status). */
static const nghttp2_hd_static_entry static_table[] = {
MAKE_STATIC_ENT(":authority", "", 0, 3153725150u),
MAKE_STATIC_ENT(":method", "GET", 1, 695666056u),
MAKE_STATIC_ENT(":method", "POST", 1, 695666056u),
MAKE_STATIC_ENT(":path", "/", 3, 3292848686u),
MAKE_STATIC_ENT(":path", "/index.html", 3, 3292848686u),
MAKE_STATIC_ENT(":scheme", "http", 5, 2510477674u),
MAKE_STATIC_ENT(":scheme", "https", 5, 2510477674u),
MAKE_STATIC_ENT(":status", "200", 7, 4000288983u),
MAKE_STATIC_ENT(":status", "204", 7, 4000288983u),
MAKE_STATIC_ENT(":status", "206", 7, 4000288983u),
MAKE_STATIC_ENT(":status", "304", 7, 4000288983u),
MAKE_STATIC_ENT(":status", "400", 7, 4000288983u),
MAKE_STATIC_ENT(":status", "404", 7, 4000288983u),
MAKE_STATIC_ENT(":status", "500", 7, 4000288983u),
MAKE_STATIC_ENT("accept-charset", "", 14, 3664010344u),
MAKE_STATIC_ENT("accept-encoding", "gzip, deflate", 15, 3379649177u),
MAKE_STATIC_ENT("accept-language", "", 16, 1979086614u),
MAKE_STATIC_ENT("accept-ranges", "", 17, 1713753958u),
MAKE_STATIC_ENT("accept", "", 18, 136609321u),
MAKE_STATIC_ENT("access-control-allow-origin", "", 19, 2710797292u),
MAKE_STATIC_ENT("age", "", 20, 742476188u),
MAKE_STATIC_ENT("allow", "", 21, 2930878514u),
MAKE_STATIC_ENT("authorization", "", 22, 2436257726u),
MAKE_STATIC_ENT("cache-control", "", 23, 1355326669u),
MAKE_STATIC_ENT("content-disposition", "", 24, 3889184348u),
MAKE_STATIC_ENT("content-encoding", "", 25, 65203592u),
MAKE_STATIC_ENT("content-language", "", 26, 24973587u),
MAKE_STATIC_ENT("content-length", "", 27, 1308181789u),
MAKE_STATIC_ENT("content-location", "", 28, 2302364718u),
MAKE_STATIC_ENT("content-range", "", 29, 3555523146u),
MAKE_STATIC_ENT("content-type", "", 30, 4244048277u),
MAKE_STATIC_ENT("cookie", "", 31, 2007449791u),
MAKE_STATIC_ENT("date", "", 32, 3564297305u),
MAKE_STATIC_ENT("etag", "", 33, 113792960u),
MAKE_STATIC_ENT("expect", "", 34, 2530896728u),
MAKE_STATIC_ENT("expires", "", 35, 1049544579u),
MAKE_STATIC_ENT("from", "", 36, 2513272949u),
MAKE_STATIC_ENT("host", "", 37, 2952701295u),
MAKE_STATIC_ENT("if-match", "", 38, 3597694698u),
MAKE_STATIC_ENT("if-modified-since", "", 39, 2213050793u),
MAKE_STATIC_ENT("if-none-match", "", 40, 2536202615u),
MAKE_STATIC_ENT("if-range", "", 41, 2340978238u),
MAKE_STATIC_ENT("if-unmodified-since", "", 42, 3794814858u),
MAKE_STATIC_ENT("last-modified", "", 43, 3226950251u),
MAKE_STATIC_ENT("link", "", 44, 232457833u),
MAKE_STATIC_ENT("location", "", 45, 200649126u),
MAKE_STATIC_ENT("max-forwards", "", 46, 1826162134u),
MAKE_STATIC_ENT("proxy-authenticate", "", 47, 2709445359u),
MAKE_STATIC_ENT("proxy-authorization", "", 48, 2686392507u),
MAKE_STATIC_ENT("range", "", 49, 4208725202u),
MAKE_STATIC_ENT("referer", "", 50, 3969579366u),
MAKE_STATIC_ENT("refresh", "", 51, 3572655668u),
MAKE_STATIC_ENT("retry-after", "", 52, 3336180598u),
MAKE_STATIC_ENT("server", "", 53, 1085029842u),
MAKE_STATIC_ENT("set-cookie", "", 54, 1848371000u),
MAKE_STATIC_ENT("strict-transport-security", "", 55, 4138147361u),
MAKE_STATIC_ENT("transfer-encoding", "", 56, 3719590988u),
MAKE_STATIC_ENT("user-agent", "", 57, 606444526u),
MAKE_STATIC_ENT("vary", "", 58, 1085005381u),
MAKE_STATIC_ENT("via", "", 59, 1762798611u),
MAKE_STATIC_ENT("www-authenticate", "", 60, 779865858u),
MAKE_STATIC_ENT(":authority", "", 0, 3153725150u),
MAKE_STATIC_ENT(":method", "GET", 1, 695666056u),
MAKE_STATIC_ENT(":method", "POST", 1, 695666056u),
MAKE_STATIC_ENT(":path", "/", 3, 3292848686u),
MAKE_STATIC_ENT(":path", "/index.html", 3, 3292848686u),
MAKE_STATIC_ENT(":scheme", "http", 5, 2510477674u),
MAKE_STATIC_ENT(":scheme", "https", 5, 2510477674u),
MAKE_STATIC_ENT(":status", "200", 7, 4000288983u),
MAKE_STATIC_ENT(":status", "204", 7, 4000288983u),
MAKE_STATIC_ENT(":status", "206", 7, 4000288983u),
MAKE_STATIC_ENT(":status", "304", 7, 4000288983u),
MAKE_STATIC_ENT(":status", "400", 7, 4000288983u),
MAKE_STATIC_ENT(":status", "404", 7, 4000288983u),
MAKE_STATIC_ENT(":status", "500", 7, 4000288983u),
MAKE_STATIC_ENT("accept-charset", "", 14, 3664010344u),
MAKE_STATIC_ENT("accept-encoding", "gzip, deflate", 15, 3379649177u),
MAKE_STATIC_ENT("accept-language", "", 16, 1979086614u),
MAKE_STATIC_ENT("accept-ranges", "", 17, 1713753958u),
MAKE_STATIC_ENT("accept", "", 18, 136609321u),
MAKE_STATIC_ENT("access-control-allow-origin", "", 19, 2710797292u),
MAKE_STATIC_ENT("age", "", 20, 742476188u),
MAKE_STATIC_ENT("allow", "", 21, 2930878514u),
MAKE_STATIC_ENT("authorization", "", 22, 2436257726u),
MAKE_STATIC_ENT("cache-control", "", 23, 1355326669u),
MAKE_STATIC_ENT("content-disposition", "", 24, 3889184348u),
MAKE_STATIC_ENT("content-encoding", "", 25, 65203592u),
MAKE_STATIC_ENT("content-language", "", 26, 24973587u),
MAKE_STATIC_ENT("content-length", "", 27, 1308181789u),
MAKE_STATIC_ENT("content-location", "", 28, 2302364718u),
MAKE_STATIC_ENT("content-range", "", 29, 3555523146u),
MAKE_STATIC_ENT("content-type", "", 30, 4244048277u),
MAKE_STATIC_ENT("cookie", "", 31, 2007449791u),
MAKE_STATIC_ENT("date", "", 32, 3564297305u),
MAKE_STATIC_ENT("etag", "", 33, 113792960u),
MAKE_STATIC_ENT("expect", "", 34, 2530896728u),
MAKE_STATIC_ENT("expires", "", 35, 1049544579u),
MAKE_STATIC_ENT("from", "", 36, 2513272949u),
MAKE_STATIC_ENT("host", "", 37, 2952701295u),
MAKE_STATIC_ENT("if-match", "", 38, 3597694698u),
MAKE_STATIC_ENT("if-modified-since", "", 39, 2213050793u),
MAKE_STATIC_ENT("if-none-match", "", 40, 2536202615u),
MAKE_STATIC_ENT("if-range", "", 41, 2340978238u),
MAKE_STATIC_ENT("if-unmodified-since", "", 42, 3794814858u),
MAKE_STATIC_ENT("last-modified", "", 43, 3226950251u),
MAKE_STATIC_ENT("link", "", 44, 232457833u),
MAKE_STATIC_ENT("location", "", 45, 200649126u),
MAKE_STATIC_ENT("max-forwards", "", 46, 1826162134u),
MAKE_STATIC_ENT("proxy-authenticate", "", 47, 2709445359u),
MAKE_STATIC_ENT("proxy-authorization", "", 48, 2686392507u),
MAKE_STATIC_ENT("range", "", 49, 4208725202u),
MAKE_STATIC_ENT("referer", "", 50, 3969579366u),
MAKE_STATIC_ENT("refresh", "", 51, 3572655668u),
MAKE_STATIC_ENT("retry-after", "", 52, 3336180598u),
MAKE_STATIC_ENT("server", "", 53, 1085029842u),
MAKE_STATIC_ENT("set-cookie", "", 54, 1848371000u),
MAKE_STATIC_ENT("strict-transport-security", "", 55, 4138147361u),
MAKE_STATIC_ENT("transfer-encoding", "", 56, 3719590988u),
MAKE_STATIC_ENT("user-agent", "", 57, 606444526u),
MAKE_STATIC_ENT("vary", "", 58, 1085005381u),
MAKE_STATIC_ENT("via", "", 59, 1762798611u),
MAKE_STATIC_ENT("www-authenticate", "", 60, 779865858u),
};
static int memeq(const void *s1, const void *s2, size_t n) {
@@ -594,8 +594,19 @@ static void hd_map_remove(nghttp2_hd_map *map, nghttp2_hd_entry *ent) {
static int hd_ringbuf_init(nghttp2_hd_ringbuf *ringbuf, size_t bufsize,
nghttp2_mem *mem) {
size_t size;
const size_t max_size = SIZE_MAX / sizeof(nghttp2_hd_entry *);
if (bufsize > max_size) {
return NGHTTP2_ERR_NOMEM;
}
for (size = 1; size < bufsize; size <<= 1)
;
if (size > max_size) {
return NGHTTP2_ERR_NOMEM;
}
ringbuf->buffer = nghttp2_mem_malloc(mem, sizeof(nghttp2_hd_entry *) * size);
if (ringbuf->buffer == NULL) {
return NGHTTP2_ERR_NOMEM;
@@ -678,8 +689,8 @@ static int hd_context_init(nghttp2_hd_context *context, nghttp2_mem *mem) {
context->bad = 0;
context->hd_table_bufsize_max = NGHTTP2_HD_DEFAULT_MAX_BUFFER_SIZE;
rv = hd_ringbuf_init(
&context->hd_table,
context->hd_table_bufsize_max / NGHTTP2_HD_ENTRY_OVERHEAD, mem);
&context->hd_table,
context->hd_table_bufsize_max / NGHTTP2_HD_ENTRY_OVERHEAD, mem);
if (rv != 0) {
return rv;
}
@@ -696,7 +707,7 @@ static void hd_context_free(nghttp2_hd_context *context) {
int nghttp2_hd_deflate_init(nghttp2_hd_deflater *deflater, nghttp2_mem *mem) {
return nghttp2_hd_deflate_init2(
deflater, NGHTTP2_HD_DEFAULT_MAX_DEFLATE_BUFFER_SIZE, mem);
deflater, NGHTTP2_HD_DEFAULT_MAX_DEFLATE_BUFFER_SIZE, mem);
}
int nghttp2_hd_deflate_init2(nghttp2_hd_deflater *deflater,
@@ -1078,8 +1089,8 @@ static int emit_newname_block(nghttp2_bufs *bufs, const nghttp2_nv *nv,
int rv;
DEBUGF(
"deflatehd: emit newname namelen=%zu, valuelen=%zu, indexing_mode=%d\n",
nv->namelen, nv->valuelen, indexing_mode);
"deflatehd: emit newname namelen=%zu, valuelen=%zu, indexing_mode=%d\n",
nv->namelen, nv->valuelen, indexing_mode);
rv = nghttp2_bufs_addb(bufs, pack_first_byte(indexing_mode));
if (rv != 0) {
@@ -1112,12 +1123,11 @@ static int add_hd_table_incremental(nghttp2_hd_context *context,
while (context->hd_table_bufsize + room > context->hd_table_bufsize_max &&
context->hd_table.len > 0) {
size_t idx = context->hd_table.len - 1;
nghttp2_hd_entry *ent = hd_ringbuf_get(&context->hd_table, idx);
context->hd_table_bufsize -=
entry_room(ent->nv.name->len, ent->nv.value->len);
entry_room(ent->nv.name->len, ent->nv.value->len);
DEBUGF("hpack: remove item from header table: %s: %s\n",
(char *)ent->nv.name->base, (char *)ent->nv.value->base);
@@ -1233,7 +1243,7 @@ static void hd_context_shrink_table_size(nghttp2_hd_context *context,
size_t idx = context->hd_table.len - 1;
nghttp2_hd_entry *ent = hd_ringbuf_get(&context->hd_table, idx);
context->hd_table_bufsize -=
entry_room(ent->nv.name->len, ent->nv.value->len);
entry_room(ent->nv.name->len, ent->nv.value->len);
hd_ringbuf_pop_back(&context->hd_table);
if (map) {
hd_map_remove(map, ent);
@@ -1245,14 +1255,14 @@ static void hd_context_shrink_table_size(nghttp2_hd_context *context,
}
int nghttp2_hd_deflate_change_table_size(
nghttp2_hd_deflater *deflater, size_t settings_max_dynamic_table_size) {
nghttp2_hd_deflater *deflater, size_t settings_max_dynamic_table_size) {
size_t next_bufsize = nghttp2_min_size(
settings_max_dynamic_table_size, deflater->deflate_hd_table_bufsize_max);
settings_max_dynamic_table_size, deflater->deflate_hd_table_bufsize_max);
deflater->ctx.hd_table_bufsize_max = next_bufsize;
deflater->min_hd_table_bufsize_max =
nghttp2_min_size(deflater->min_hd_table_bufsize_max, next_bufsize);
nghttp2_min_size(deflater->min_hd_table_bufsize_max, next_bufsize);
deflater->notify_table_size_change = 1;
@@ -1261,7 +1271,7 @@ int nghttp2_hd_deflate_change_table_size(
}
int nghttp2_hd_inflate_change_table_size(
nghttp2_hd_inflater *inflater, size_t settings_max_dynamic_table_size) {
nghttp2_hd_inflater *inflater, size_t settings_max_dynamic_table_size) {
switch (inflater->state) {
case NGHTTP2_HD_STATE_EXPECT_TABLE_SIZE:
case NGHTTP2_HD_STATE_INFLATE_START:
@@ -1304,7 +1314,7 @@ nghttp2_hd_nv nghttp2_hd_table_get(nghttp2_hd_context *context, size_t idx) {
assert(INDEX_RANGE_VALID(context, idx));
if (idx >= NGHTTP2_STATIC_TABLE_LENGTH) {
return hd_ringbuf_get(&context->hd_table, idx - NGHTTP2_STATIC_TABLE_LENGTH)
->nv;
->nv;
} else {
const nghttp2_hd_static_entry *ent = &static_table[idx];
nghttp2_hd_nv nv = {(nghttp2_rcbuf *)&ent->name,
@@ -1320,7 +1330,7 @@ static const nghttp2_nv *nghttp2_hd_table_get2(nghttp2_hd_context *context,
if (idx >= NGHTTP2_STATIC_TABLE_LENGTH) {
return &hd_ringbuf_get(&context->hd_table,
idx - NGHTTP2_STATIC_TABLE_LENGTH)
->cnv;
->cnv;
}
return &static_table[idx].cnv;
@@ -1334,7 +1344,7 @@ static int hd_deflate_decide_indexing(nghttp2_hd_deflater *deflater,
token == NGHTTP2_TOKEN_IF_NONE_MATCH || token == NGHTTP2_TOKEN_LOCATION ||
token == NGHTTP2_TOKEN_SET_COOKIE ||
entry_room(nv->namelen, nv->valuelen) >
deflater->ctx.hd_table_bufsize_max * 3 / 4) {
deflater->ctx.hd_table_bufsize_max * 3 / 4) {
return NGHTTP2_HD_WITHOUT_INDEXING;
}
@@ -1367,12 +1377,11 @@ static int deflate_nv(nghttp2_hd_deflater *deflater, nghttp2_bufs *bufs,
entropy secret data (e.g., id/password). Also cookie header
field with less than 20 bytes value is also never indexed. This
is the same criteria used in Firefox codebase. */
indexing_mode =
token == NGHTTP2_TOKEN_AUTHORIZATION ||
(token == NGHTTP2_TOKEN_COOKIE && nv->valuelen < 20) ||
(nv->flags & NGHTTP2_NV_FLAG_NO_INDEX)
? NGHTTP2_HD_NEVER_INDEXING
: hd_deflate_decide_indexing(deflater, nv, token);
indexing_mode = token == NGHTTP2_TOKEN_AUTHORIZATION ||
(token == NGHTTP2_TOKEN_COOKIE && nv->valuelen < 20) ||
(nv->flags & NGHTTP2_NV_FLAG_NO_INDEX)
? NGHTTP2_HD_NEVER_INDEXING
: hd_deflate_decide_indexing(deflater, nv, token);
res = search_hd_table(&deflater->ctx, nv, token, indexing_mode,
&deflater->map, hash);
@@ -1380,7 +1389,6 @@ static int deflate_nv(nghttp2_hd_deflater *deflater, nghttp2_bufs *bufs,
idx = res.index;
if (res.name_value_match) {
DEBUGF("deflatehd: name/value match index=%td\n", idx);
rv = emit_indexed_block(bufs, (size_t)idx);
@@ -1458,7 +1466,6 @@ int nghttp2_hd_deflate_hd_bufs(nghttp2_hd_deflater *deflater,
deflater->min_hd_table_bufsize_max = UINT32_MAX;
if (deflater->ctx.hd_table_bufsize_max > min_hd_table_bufsize_max) {
rv = emit_table_size(bufs, min_hd_table_bufsize_max);
if (rv != 0) {
@@ -1962,9 +1969,9 @@ nghttp2_ssize nghttp2_hd_inflate_hd_nv(nghttp2_hd_inflater *inflater,
case NGHTTP2_HD_STATE_READ_TABLE_SIZE:
rfin = 0;
rv = hd_inflate_read_len(
inflater, &rfin, in, last, 5,
nghttp2_min_size(inflater->min_hd_table_bufsize_max,
inflater->settings_hd_table_bufsize_max));
inflater, &rfin, in, last, 5,
nghttp2_min_size(inflater->min_hd_table_bufsize_max,
inflater->settings_hd_table_bufsize_max));
if (rv < 0) {
goto fail;
}
@@ -2051,8 +2058,8 @@ nghttp2_ssize nghttp2_hd_inflate_hd_nv(nghttp2_hd_inflater *inflater,
inflater->state = NGHTTP2_HD_STATE_NEWNAME_READ_NAMEHUFF;
rv = nghttp2_rcbuf_new(&inflater->namercbuf, inflater->left * 2 + 1,
mem);
rv =
nghttp2_rcbuf_new(&inflater->namercbuf, inflater->left * 2 + 1, mem);
} else {
inflater->state = NGHTTP2_HD_STATE_NEWNAME_READ_NAME;
rv = nghttp2_rcbuf_new(&inflater->namercbuf, inflater->left + 1, mem);
@@ -2136,8 +2143,8 @@ nghttp2_ssize nghttp2_hd_inflate_hd_nv(nghttp2_hd_inflater *inflater,
inflater->state = NGHTTP2_HD_STATE_READ_VALUEHUFF;
rv = nghttp2_rcbuf_new(&inflater->valuercbuf, inflater->left * 2 + 1,
mem);
rv =
nghttp2_rcbuf_new(&inflater->valuercbuf, inflater->left * 2 + 1, mem);
} else {
inflater->state = NGHTTP2_HD_STATE_READ_VALUE;
@@ -2308,7 +2315,6 @@ void nghttp2_hd_inflate_del(nghttp2_hd_inflater *inflater) {
int nghttp2_hd_emit_indname_block(nghttp2_bufs *bufs, size_t idx,
nghttp2_nv *nv, int indexing_mode) {
return emit_indname_block(bufs, idx, nv, indexing_mode);
}

View File

@@ -27,7 +27,7 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif /* HAVE_CONFIG_H */
#endif /* defined(HAVE_CONFIG_H) */
#include <nghttp2/nghttp2.h>
@@ -439,4 +439,4 @@ nghttp2_ssize nghttp2_hd_huff_decode(nghttp2_hd_huff_decode_context *ctx,
*/
int nghttp2_hd_huff_decode_failure_state(nghttp2_hd_huff_decode_context *ctx);
#endif /* NGHTTP2_HD_H */
#endif /* !defined(NGHTTP2_HD_H) */

View File

@@ -94,7 +94,7 @@ int nghttp2_hd_huff_encode(nghttp2_bufs *bufs, const uint8_t *src,
if (nbits) {
rv = nghttp2_bufs_addb(
bufs, (uint8_t)((uint8_t)(code >> 56) | ((1 << (8 - nbits)) - 1)));
bufs, (uint8_t)((uint8_t)(code >> 56) | ((1 << (8 - nbits)) - 1)));
if (rv != 0) {
return rv;
}

View File

@@ -27,7 +27,7 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif /* HAVE_CONFIG_H */
#endif /* defined(HAVE_CONFIG_H) */
#include <nghttp2/nghttp2.h>
@@ -69,4 +69,4 @@ typedef struct {
extern const nghttp2_huff_sym huff_sym_table[];
extern const nghttp2_huff_decode huff_decode_table[][16];
#endif /* NGHTTP2_HD_HUFFMAN_H */
#endif /* !defined(NGHTTP2_HD_HUFFMAN_H) */

File diff suppressed because it is too large Load Diff

View File

@@ -53,70 +53,70 @@ uint32_t nghttp2_get_uint32(const uint8_t *data) {
/* Generated by gendowncasetbl.py */
static const uint8_t DOWNCASE_TBL[] = {
0 /* NUL */, 1 /* SOH */, 2 /* STX */, 3 /* ETX */,
4 /* EOT */, 5 /* ENQ */, 6 /* ACK */, 7 /* BEL */,
8 /* BS */, 9 /* HT */, 10 /* LF */, 11 /* VT */,
12 /* FF */, 13 /* CR */, 14 /* SO */, 15 /* SI */,
16 /* DLE */, 17 /* DC1 */, 18 /* DC2 */, 19 /* DC3 */,
20 /* DC4 */, 21 /* NAK */, 22 /* SYN */, 23 /* ETB */,
24 /* CAN */, 25 /* EM */, 26 /* SUB */, 27 /* ESC */,
28 /* FS */, 29 /* GS */, 30 /* RS */, 31 /* US */,
32 /* SPC */, 33 /* ! */, 34 /* " */, 35 /* # */,
36 /* $ */, 37 /* % */, 38 /* & */, 39 /* ' */,
40 /* ( */, 41 /* ) */, 42 /* * */, 43 /* + */,
44 /* , */, 45 /* - */, 46 /* . */, 47 /* / */,
48 /* 0 */, 49 /* 1 */, 50 /* 2 */, 51 /* 3 */,
52 /* 4 */, 53 /* 5 */, 54 /* 6 */, 55 /* 7 */,
56 /* 8 */, 57 /* 9 */, 58 /* : */, 59 /* ; */,
60 /* < */, 61 /* = */, 62 /* > */, 63 /* ? */,
64 /* @ */, 97 /* A */, 98 /* B */, 99 /* C */,
100 /* D */, 101 /* E */, 102 /* F */, 103 /* G */,
104 /* H */, 105 /* I */, 106 /* J */, 107 /* K */,
108 /* L */, 109 /* M */, 110 /* N */, 111 /* O */,
112 /* P */, 113 /* Q */, 114 /* R */, 115 /* S */,
116 /* T */, 117 /* U */, 118 /* V */, 119 /* W */,
120 /* X */, 121 /* Y */, 122 /* Z */, 91 /* [ */,
92 /* \ */, 93 /* ] */, 94 /* ^ */, 95 /* _ */,
96 /* ` */, 97 /* a */, 98 /* b */, 99 /* c */,
100 /* d */, 101 /* e */, 102 /* f */, 103 /* g */,
104 /* h */, 105 /* i */, 106 /* j */, 107 /* k */,
108 /* l */, 109 /* m */, 110 /* n */, 111 /* o */,
112 /* p */, 113 /* q */, 114 /* r */, 115 /* s */,
116 /* t */, 117 /* u */, 118 /* v */, 119 /* w */,
120 /* x */, 121 /* y */, 122 /* z */, 123 /* { */,
124 /* | */, 125 /* } */, 126 /* ~ */, 127 /* DEL */,
128 /* 0x80 */, 129 /* 0x81 */, 130 /* 0x82 */, 131 /* 0x83 */,
132 /* 0x84 */, 133 /* 0x85 */, 134 /* 0x86 */, 135 /* 0x87 */,
136 /* 0x88 */, 137 /* 0x89 */, 138 /* 0x8a */, 139 /* 0x8b */,
140 /* 0x8c */, 141 /* 0x8d */, 142 /* 0x8e */, 143 /* 0x8f */,
144 /* 0x90 */, 145 /* 0x91 */, 146 /* 0x92 */, 147 /* 0x93 */,
148 /* 0x94 */, 149 /* 0x95 */, 150 /* 0x96 */, 151 /* 0x97 */,
152 /* 0x98 */, 153 /* 0x99 */, 154 /* 0x9a */, 155 /* 0x9b */,
156 /* 0x9c */, 157 /* 0x9d */, 158 /* 0x9e */, 159 /* 0x9f */,
160 /* 0xa0 */, 161 /* 0xa1 */, 162 /* 0xa2 */, 163 /* 0xa3 */,
164 /* 0xa4 */, 165 /* 0xa5 */, 166 /* 0xa6 */, 167 /* 0xa7 */,
168 /* 0xa8 */, 169 /* 0xa9 */, 170 /* 0xaa */, 171 /* 0xab */,
172 /* 0xac */, 173 /* 0xad */, 174 /* 0xae */, 175 /* 0xaf */,
176 /* 0xb0 */, 177 /* 0xb1 */, 178 /* 0xb2 */, 179 /* 0xb3 */,
180 /* 0xb4 */, 181 /* 0xb5 */, 182 /* 0xb6 */, 183 /* 0xb7 */,
184 /* 0xb8 */, 185 /* 0xb9 */, 186 /* 0xba */, 187 /* 0xbb */,
188 /* 0xbc */, 189 /* 0xbd */, 190 /* 0xbe */, 191 /* 0xbf */,
192 /* 0xc0 */, 193 /* 0xc1 */, 194 /* 0xc2 */, 195 /* 0xc3 */,
196 /* 0xc4 */, 197 /* 0xc5 */, 198 /* 0xc6 */, 199 /* 0xc7 */,
200 /* 0xc8 */, 201 /* 0xc9 */, 202 /* 0xca */, 203 /* 0xcb */,
204 /* 0xcc */, 205 /* 0xcd */, 206 /* 0xce */, 207 /* 0xcf */,
208 /* 0xd0 */, 209 /* 0xd1 */, 210 /* 0xd2 */, 211 /* 0xd3 */,
212 /* 0xd4 */, 213 /* 0xd5 */, 214 /* 0xd6 */, 215 /* 0xd7 */,
216 /* 0xd8 */, 217 /* 0xd9 */, 218 /* 0xda */, 219 /* 0xdb */,
220 /* 0xdc */, 221 /* 0xdd */, 222 /* 0xde */, 223 /* 0xdf */,
224 /* 0xe0 */, 225 /* 0xe1 */, 226 /* 0xe2 */, 227 /* 0xe3 */,
228 /* 0xe4 */, 229 /* 0xe5 */, 230 /* 0xe6 */, 231 /* 0xe7 */,
232 /* 0xe8 */, 233 /* 0xe9 */, 234 /* 0xea */, 235 /* 0xeb */,
236 /* 0xec */, 237 /* 0xed */, 238 /* 0xee */, 239 /* 0xef */,
240 /* 0xf0 */, 241 /* 0xf1 */, 242 /* 0xf2 */, 243 /* 0xf3 */,
244 /* 0xf4 */, 245 /* 0xf5 */, 246 /* 0xf6 */, 247 /* 0xf7 */,
248 /* 0xf8 */, 249 /* 0xf9 */, 250 /* 0xfa */, 251 /* 0xfb */,
252 /* 0xfc */, 253 /* 0xfd */, 254 /* 0xfe */, 255 /* 0xff */,
0 /* NUL */, 1 /* SOH */, 2 /* STX */, 3 /* ETX */,
4 /* EOT */, 5 /* ENQ */, 6 /* ACK */, 7 /* BEL */,
8 /* BS */, 9 /* HT */, 10 /* LF */, 11 /* VT */,
12 /* FF */, 13 /* CR */, 14 /* SO */, 15 /* SI */,
16 /* DLE */, 17 /* DC1 */, 18 /* DC2 */, 19 /* DC3 */,
20 /* DC4 */, 21 /* NAK */, 22 /* SYN */, 23 /* ETB */,
24 /* CAN */, 25 /* EM */, 26 /* SUB */, 27 /* ESC */,
28 /* FS */, 29 /* GS */, 30 /* RS */, 31 /* US */,
32 /* SPC */, 33 /* ! */, 34 /* " */, 35 /* # */,
36 /* $ */, 37 /* % */, 38 /* & */, 39 /* ' */,
40 /* ( */, 41 /* ) */, 42 /* * */, 43 /* + */,
44 /* , */, 45 /* - */, 46 /* . */, 47 /* / */,
48 /* 0 */, 49 /* 1 */, 50 /* 2 */, 51 /* 3 */,
52 /* 4 */, 53 /* 5 */, 54 /* 6 */, 55 /* 7 */,
56 /* 8 */, 57 /* 9 */, 58 /* : */, 59 /* ; */,
60 /* < */, 61 /* = */, 62 /* > */, 63 /* ? */,
64 /* @ */, 97 /* A */, 98 /* B */, 99 /* C */,
100 /* D */, 101 /* E */, 102 /* F */, 103 /* G */,
104 /* H */, 105 /* I */, 106 /* J */, 107 /* K */,
108 /* L */, 109 /* M */, 110 /* N */, 111 /* O */,
112 /* P */, 113 /* Q */, 114 /* R */, 115 /* S */,
116 /* T */, 117 /* U */, 118 /* V */, 119 /* W */,
120 /* X */, 121 /* Y */, 122 /* Z */, 91 /* [ */,
92 /* \ */, 93 /* ] */, 94 /* ^ */, 95 /* _ */,
96 /* ` */, 97 /* a */, 98 /* b */, 99 /* c */,
100 /* d */, 101 /* e */, 102 /* f */, 103 /* g */,
104 /* h */, 105 /* i */, 106 /* j */, 107 /* k */,
108 /* l */, 109 /* m */, 110 /* n */, 111 /* o */,
112 /* p */, 113 /* q */, 114 /* r */, 115 /* s */,
116 /* t */, 117 /* u */, 118 /* v */, 119 /* w */,
120 /* x */, 121 /* y */, 122 /* z */, 123 /* { */,
124 /* | */, 125 /* } */, 126 /* ~ */, 127 /* DEL */,
128 /* 0x80 */, 129 /* 0x81 */, 130 /* 0x82 */, 131 /* 0x83 */,
132 /* 0x84 */, 133 /* 0x85 */, 134 /* 0x86 */, 135 /* 0x87 */,
136 /* 0x88 */, 137 /* 0x89 */, 138 /* 0x8a */, 139 /* 0x8b */,
140 /* 0x8c */, 141 /* 0x8d */, 142 /* 0x8e */, 143 /* 0x8f */,
144 /* 0x90 */, 145 /* 0x91 */, 146 /* 0x92 */, 147 /* 0x93 */,
148 /* 0x94 */, 149 /* 0x95 */, 150 /* 0x96 */, 151 /* 0x97 */,
152 /* 0x98 */, 153 /* 0x99 */, 154 /* 0x9a */, 155 /* 0x9b */,
156 /* 0x9c */, 157 /* 0x9d */, 158 /* 0x9e */, 159 /* 0x9f */,
160 /* 0xa0 */, 161 /* 0xa1 */, 162 /* 0xa2 */, 163 /* 0xa3 */,
164 /* 0xa4 */, 165 /* 0xa5 */, 166 /* 0xa6 */, 167 /* 0xa7 */,
168 /* 0xa8 */, 169 /* 0xa9 */, 170 /* 0xaa */, 171 /* 0xab */,
172 /* 0xac */, 173 /* 0xad */, 174 /* 0xae */, 175 /* 0xaf */,
176 /* 0xb0 */, 177 /* 0xb1 */, 178 /* 0xb2 */, 179 /* 0xb3 */,
180 /* 0xb4 */, 181 /* 0xb5 */, 182 /* 0xb6 */, 183 /* 0xb7 */,
184 /* 0xb8 */, 185 /* 0xb9 */, 186 /* 0xba */, 187 /* 0xbb */,
188 /* 0xbc */, 189 /* 0xbd */, 190 /* 0xbe */, 191 /* 0xbf */,
192 /* 0xc0 */, 193 /* 0xc1 */, 194 /* 0xc2 */, 195 /* 0xc3 */,
196 /* 0xc4 */, 197 /* 0xc5 */, 198 /* 0xc6 */, 199 /* 0xc7 */,
200 /* 0xc8 */, 201 /* 0xc9 */, 202 /* 0xca */, 203 /* 0xcb */,
204 /* 0xcc */, 205 /* 0xcd */, 206 /* 0xce */, 207 /* 0xcf */,
208 /* 0xd0 */, 209 /* 0xd1 */, 210 /* 0xd2 */, 211 /* 0xd3 */,
212 /* 0xd4 */, 213 /* 0xd5 */, 214 /* 0xd6 */, 215 /* 0xd7 */,
216 /* 0xd8 */, 217 /* 0xd9 */, 218 /* 0xda */, 219 /* 0xdb */,
220 /* 0xdc */, 221 /* 0xdd */, 222 /* 0xde */, 223 /* 0xdf */,
224 /* 0xe0 */, 225 /* 0xe1 */, 226 /* 0xe2 */, 227 /* 0xe3 */,
228 /* 0xe4 */, 229 /* 0xe5 */, 230 /* 0xe6 */, 231 /* 0xe7 */,
232 /* 0xe8 */, 233 /* 0xe9 */, 234 /* 0xea */, 235 /* 0xeb */,
236 /* 0xec */, 237 /* 0xed */, 238 /* 0xee */, 239 /* 0xef */,
240 /* 0xf0 */, 241 /* 0xf1 */, 242 /* 0xf2 */, 243 /* 0xf3 */,
244 /* 0xf4 */, 245 /* 0xf5 */, 246 /* 0xf6 */, 247 /* 0xf7 */,
248 /* 0xf8 */, 249 /* 0xf9 */, 250 /* 0xfa */, 251 /* 0xfb */,
252 /* 0xfc */, 253 /* 0xfd */, 254 /* 0xfe */, 255 /* 0xff */,
};
void nghttp2_downcase(uint8_t *s, size_t len) {
@@ -160,7 +160,7 @@ int nghttp2_adjust_local_window_size(int32_t *local_window_size_ptr,
int32_t recv_reduction_delta;
int32_t delta;
int32_t new_recv_window_size =
nghttp2_max_int32(0, *recv_window_size_ptr) - *delta_ptr;
nghttp2_max_int32(0, *recv_window_size_ptr) - *delta_ptr;
if (new_recv_window_size >= 0) {
*recv_window_size_ptr = new_recv_window_size;
@@ -345,70 +345,70 @@ const char *nghttp2_strerror(int error_code) {
/* Generated by gennmchartbl.py */
static const int VALID_HD_NAME_CHARS[] = {
0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */,
0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */,
0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */,
0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */,
0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */,
0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */,
0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */,
0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */,
0 /* SPC */, 1 /* ! */, 0 /* " */, 1 /* # */,
1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */,
0 /* ( */, 0 /* ) */, 1 /* * */, 1 /* + */,
0 /* , */, 1 /* - */, 1 /* . */, 0 /* / */,
1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */,
1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */,
1 /* 8 */, 1 /* 9 */, 0 /* : */, 0 /* ; */,
0 /* < */, 0 /* = */, 0 /* > */, 0 /* ? */,
0 /* @ */, 0 /* A */, 0 /* B */, 0 /* C */,
0 /* D */, 0 /* E */, 0 /* F */, 0 /* G */,
0 /* H */, 0 /* I */, 0 /* J */, 0 /* K */,
0 /* L */, 0 /* M */, 0 /* N */, 0 /* O */,
0 /* P */, 0 /* Q */, 0 /* R */, 0 /* S */,
0 /* T */, 0 /* U */, 0 /* V */, 0 /* W */,
0 /* X */, 0 /* Y */, 0 /* Z */, 0 /* [ */,
0 /* \ */, 0 /* ] */, 1 /* ^ */, 1 /* _ */,
1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */,
1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */,
1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */,
1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */,
1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */,
1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */,
1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */,
1 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */,
0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */,
0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */,
0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */,
0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */,
0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */,
0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */,
0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */,
0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */,
0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */,
0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */,
0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */,
0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */,
0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */,
0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */,
0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */,
0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */,
0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */,
0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */,
0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */,
0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */,
0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */,
0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */,
0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */,
0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */,
0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */,
0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */,
0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */,
0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */,
0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */,
0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */,
0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */,
0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */
0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */,
0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */,
0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */,
0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */,
0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */,
0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */,
0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */,
0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */,
0 /* SPC */, 1 /* ! */, 0 /* " */, 1 /* # */,
1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */,
0 /* ( */, 0 /* ) */, 1 /* * */, 1 /* + */,
0 /* , */, 1 /* - */, 1 /* . */, 0 /* / */,
1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */,
1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */,
1 /* 8 */, 1 /* 9 */, 0 /* : */, 0 /* ; */,
0 /* < */, 0 /* = */, 0 /* > */, 0 /* ? */,
0 /* @ */, 0 /* A */, 0 /* B */, 0 /* C */,
0 /* D */, 0 /* E */, 0 /* F */, 0 /* G */,
0 /* H */, 0 /* I */, 0 /* J */, 0 /* K */,
0 /* L */, 0 /* M */, 0 /* N */, 0 /* O */,
0 /* P */, 0 /* Q */, 0 /* R */, 0 /* S */,
0 /* T */, 0 /* U */, 0 /* V */, 0 /* W */,
0 /* X */, 0 /* Y */, 0 /* Z */, 0 /* [ */,
0 /* \ */, 0 /* ] */, 1 /* ^ */, 1 /* _ */,
1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */,
1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */,
1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */,
1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */,
1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */,
1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */,
1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */,
1 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */,
0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */,
0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */,
0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */,
0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */,
0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */,
0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */,
0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */,
0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */,
0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */,
0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */,
0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */,
0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */,
0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */,
0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */,
0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */,
0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */,
0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */,
0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */,
0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */,
0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */,
0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */,
0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */,
0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */,
0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */,
0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */,
0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */,
0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */,
0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */,
0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */,
0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */,
0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */,
0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */
};
int nghttp2_check_header_name(const uint8_t *name, size_t len) {
@@ -433,70 +433,70 @@ int nghttp2_check_header_name(const uint8_t *name, size_t len) {
/* Generated by genvchartbl.py */
static const int VALID_HD_VALUE_CHARS[] = {
0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */,
0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */,
0 /* BS */, 1 /* HT */, 0 /* LF */, 0 /* VT */,
0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */,
0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */,
0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */,
0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */,
0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */,
1 /* SPC */, 1 /* ! */, 1 /* " */, 1 /* # */,
1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */,
1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */,
1 /* , */, 1 /* - */, 1 /* . */, 1 /* / */,
1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */,
1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */,
1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */,
1 /* < */, 1 /* = */, 1 /* > */, 1 /* ? */,
1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */,
1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */,
1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */,
1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */,
1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */,
1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */,
1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */,
1 /* \ */, 1 /* ] */, 1 /* ^ */, 1 /* _ */,
1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */,
1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */,
1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */,
1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */,
1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */,
1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */,
1 /* x */, 1 /* y */, 1 /* z */, 1 /* { */,
1 /* | */, 1 /* } */, 1 /* ~ */, 0 /* DEL */,
1 /* 0x80 */, 1 /* 0x81 */, 1 /* 0x82 */, 1 /* 0x83 */,
1 /* 0x84 */, 1 /* 0x85 */, 1 /* 0x86 */, 1 /* 0x87 */,
1 /* 0x88 */, 1 /* 0x89 */, 1 /* 0x8a */, 1 /* 0x8b */,
1 /* 0x8c */, 1 /* 0x8d */, 1 /* 0x8e */, 1 /* 0x8f */,
1 /* 0x90 */, 1 /* 0x91 */, 1 /* 0x92 */, 1 /* 0x93 */,
1 /* 0x94 */, 1 /* 0x95 */, 1 /* 0x96 */, 1 /* 0x97 */,
1 /* 0x98 */, 1 /* 0x99 */, 1 /* 0x9a */, 1 /* 0x9b */,
1 /* 0x9c */, 1 /* 0x9d */, 1 /* 0x9e */, 1 /* 0x9f */,
1 /* 0xa0 */, 1 /* 0xa1 */, 1 /* 0xa2 */, 1 /* 0xa3 */,
1 /* 0xa4 */, 1 /* 0xa5 */, 1 /* 0xa6 */, 1 /* 0xa7 */,
1 /* 0xa8 */, 1 /* 0xa9 */, 1 /* 0xaa */, 1 /* 0xab */,
1 /* 0xac */, 1 /* 0xad */, 1 /* 0xae */, 1 /* 0xaf */,
1 /* 0xb0 */, 1 /* 0xb1 */, 1 /* 0xb2 */, 1 /* 0xb3 */,
1 /* 0xb4 */, 1 /* 0xb5 */, 1 /* 0xb6 */, 1 /* 0xb7 */,
1 /* 0xb8 */, 1 /* 0xb9 */, 1 /* 0xba */, 1 /* 0xbb */,
1 /* 0xbc */, 1 /* 0xbd */, 1 /* 0xbe */, 1 /* 0xbf */,
1 /* 0xc0 */, 1 /* 0xc1 */, 1 /* 0xc2 */, 1 /* 0xc3 */,
1 /* 0xc4 */, 1 /* 0xc5 */, 1 /* 0xc6 */, 1 /* 0xc7 */,
1 /* 0xc8 */, 1 /* 0xc9 */, 1 /* 0xca */, 1 /* 0xcb */,
1 /* 0xcc */, 1 /* 0xcd */, 1 /* 0xce */, 1 /* 0xcf */,
1 /* 0xd0 */, 1 /* 0xd1 */, 1 /* 0xd2 */, 1 /* 0xd3 */,
1 /* 0xd4 */, 1 /* 0xd5 */, 1 /* 0xd6 */, 1 /* 0xd7 */,
1 /* 0xd8 */, 1 /* 0xd9 */, 1 /* 0xda */, 1 /* 0xdb */,
1 /* 0xdc */, 1 /* 0xdd */, 1 /* 0xde */, 1 /* 0xdf */,
1 /* 0xe0 */, 1 /* 0xe1 */, 1 /* 0xe2 */, 1 /* 0xe3 */,
1 /* 0xe4 */, 1 /* 0xe5 */, 1 /* 0xe6 */, 1 /* 0xe7 */,
1 /* 0xe8 */, 1 /* 0xe9 */, 1 /* 0xea */, 1 /* 0xeb */,
1 /* 0xec */, 1 /* 0xed */, 1 /* 0xee */, 1 /* 0xef */,
1 /* 0xf0 */, 1 /* 0xf1 */, 1 /* 0xf2 */, 1 /* 0xf3 */,
1 /* 0xf4 */, 1 /* 0xf5 */, 1 /* 0xf6 */, 1 /* 0xf7 */,
1 /* 0xf8 */, 1 /* 0xf9 */, 1 /* 0xfa */, 1 /* 0xfb */,
1 /* 0xfc */, 1 /* 0xfd */, 1 /* 0xfe */, 1 /* 0xff */
0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */,
0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */,
0 /* BS */, 1 /* HT */, 0 /* LF */, 0 /* VT */,
0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */,
0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */,
0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */,
0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */,
0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */,
1 /* SPC */, 1 /* ! */, 1 /* " */, 1 /* # */,
1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */,
1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */,
1 /* , */, 1 /* - */, 1 /* . */, 1 /* / */,
1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */,
1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */,
1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */,
1 /* < */, 1 /* = */, 1 /* > */, 1 /* ? */,
1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */,
1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */,
1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */,
1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */,
1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */,
1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */,
1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */,
1 /* \ */, 1 /* ] */, 1 /* ^ */, 1 /* _ */,
1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */,
1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */,
1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */,
1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */,
1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */,
1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */,
1 /* x */, 1 /* y */, 1 /* z */, 1 /* { */,
1 /* | */, 1 /* } */, 1 /* ~ */, 0 /* DEL */,
1 /* 0x80 */, 1 /* 0x81 */, 1 /* 0x82 */, 1 /* 0x83 */,
1 /* 0x84 */, 1 /* 0x85 */, 1 /* 0x86 */, 1 /* 0x87 */,
1 /* 0x88 */, 1 /* 0x89 */, 1 /* 0x8a */, 1 /* 0x8b */,
1 /* 0x8c */, 1 /* 0x8d */, 1 /* 0x8e */, 1 /* 0x8f */,
1 /* 0x90 */, 1 /* 0x91 */, 1 /* 0x92 */, 1 /* 0x93 */,
1 /* 0x94 */, 1 /* 0x95 */, 1 /* 0x96 */, 1 /* 0x97 */,
1 /* 0x98 */, 1 /* 0x99 */, 1 /* 0x9a */, 1 /* 0x9b */,
1 /* 0x9c */, 1 /* 0x9d */, 1 /* 0x9e */, 1 /* 0x9f */,
1 /* 0xa0 */, 1 /* 0xa1 */, 1 /* 0xa2 */, 1 /* 0xa3 */,
1 /* 0xa4 */, 1 /* 0xa5 */, 1 /* 0xa6 */, 1 /* 0xa7 */,
1 /* 0xa8 */, 1 /* 0xa9 */, 1 /* 0xaa */, 1 /* 0xab */,
1 /* 0xac */, 1 /* 0xad */, 1 /* 0xae */, 1 /* 0xaf */,
1 /* 0xb0 */, 1 /* 0xb1 */, 1 /* 0xb2 */, 1 /* 0xb3 */,
1 /* 0xb4 */, 1 /* 0xb5 */, 1 /* 0xb6 */, 1 /* 0xb7 */,
1 /* 0xb8 */, 1 /* 0xb9 */, 1 /* 0xba */, 1 /* 0xbb */,
1 /* 0xbc */, 1 /* 0xbd */, 1 /* 0xbe */, 1 /* 0xbf */,
1 /* 0xc0 */, 1 /* 0xc1 */, 1 /* 0xc2 */, 1 /* 0xc3 */,
1 /* 0xc4 */, 1 /* 0xc5 */, 1 /* 0xc6 */, 1 /* 0xc7 */,
1 /* 0xc8 */, 1 /* 0xc9 */, 1 /* 0xca */, 1 /* 0xcb */,
1 /* 0xcc */, 1 /* 0xcd */, 1 /* 0xce */, 1 /* 0xcf */,
1 /* 0xd0 */, 1 /* 0xd1 */, 1 /* 0xd2 */, 1 /* 0xd3 */,
1 /* 0xd4 */, 1 /* 0xd5 */, 1 /* 0xd6 */, 1 /* 0xd7 */,
1 /* 0xd8 */, 1 /* 0xd9 */, 1 /* 0xda */, 1 /* 0xdb */,
1 /* 0xdc */, 1 /* 0xdd */, 1 /* 0xde */, 1 /* 0xdf */,
1 /* 0xe0 */, 1 /* 0xe1 */, 1 /* 0xe2 */, 1 /* 0xe3 */,
1 /* 0xe4 */, 1 /* 0xe5 */, 1 /* 0xe6 */, 1 /* 0xe7 */,
1 /* 0xe8 */, 1 /* 0xe9 */, 1 /* 0xea */, 1 /* 0xeb */,
1 /* 0xec */, 1 /* 0xed */, 1 /* 0xee */, 1 /* 0xef */,
1 /* 0xf0 */, 1 /* 0xf1 */, 1 /* 0xf2 */, 1 /* 0xf3 */,
1 /* 0xf4 */, 1 /* 0xf5 */, 1 /* 0xf6 */, 1 /* 0xf7 */,
1 /* 0xf8 */, 1 /* 0xf9 */, 1 /* 0xfa */, 1 /* 0xfb */,
1 /* 0xfc */, 1 /* 0xfd */, 1 /* 0xfe */, 1 /* 0xff */
};
int nghttp2_check_header_value(const uint8_t *value, size_t len) {
@@ -524,70 +524,70 @@ int nghttp2_check_header_value_rfc9113(const uint8_t *value, size_t len) {
/* Generated by genmethodchartbl.py */
static char VALID_METHOD_CHARS[] = {
0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */,
0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */,
0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */,
0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */,
0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */,
0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */,
0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */,
0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */,
0 /* SPC */, 1 /* ! */, 0 /* " */, 1 /* # */,
1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */,
0 /* ( */, 0 /* ) */, 1 /* * */, 1 /* + */,
0 /* , */, 1 /* - */, 1 /* . */, 0 /* / */,
1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */,
1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */,
1 /* 8 */, 1 /* 9 */, 0 /* : */, 0 /* ; */,
0 /* < */, 0 /* = */, 0 /* > */, 0 /* ? */,
0 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */,
1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */,
1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */,
1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */,
1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */,
1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */,
1 /* X */, 1 /* Y */, 1 /* Z */, 0 /* [ */,
0 /* \ */, 0 /* ] */, 1 /* ^ */, 1 /* _ */,
1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */,
1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */,
1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */,
1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */,
1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */,
1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */,
1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */,
1 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */,
0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */,
0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */,
0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */,
0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */,
0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */,
0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */,
0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */,
0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */,
0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */,
0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */,
0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */,
0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */,
0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */,
0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */,
0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */,
0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */,
0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */,
0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */,
0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */,
0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */,
0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */,
0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */,
0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */,
0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */,
0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */,
0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */,
0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */,
0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */,
0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */,
0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */,
0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */,
0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */
0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */,
0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */,
0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */,
0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */,
0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */,
0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */,
0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */,
0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */,
0 /* SPC */, 1 /* ! */, 0 /* " */, 1 /* # */,
1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */,
0 /* ( */, 0 /* ) */, 1 /* * */, 1 /* + */,
0 /* , */, 1 /* - */, 1 /* . */, 0 /* / */,
1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */,
1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */,
1 /* 8 */, 1 /* 9 */, 0 /* : */, 0 /* ; */,
0 /* < */, 0 /* = */, 0 /* > */, 0 /* ? */,
0 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */,
1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */,
1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */,
1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */,
1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */,
1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */,
1 /* X */, 1 /* Y */, 1 /* Z */, 0 /* [ */,
0 /* \ */, 0 /* ] */, 1 /* ^ */, 1 /* _ */,
1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */,
1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */,
1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */,
1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */,
1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */,
1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */,
1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */,
1 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */,
0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */,
0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */,
0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */,
0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */,
0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */,
0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */,
0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */,
0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */,
0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */,
0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */,
0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */,
0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */,
0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */,
0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */,
0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */,
0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */,
0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */,
0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */,
0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */,
0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */,
0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */,
0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */,
0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */,
0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */,
0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */,
0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */,
0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */,
0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */,
0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */,
0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */,
0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */,
0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */
};
int nghttp2_check_method(const uint8_t *value, size_t len) {
@@ -605,70 +605,70 @@ int nghttp2_check_method(const uint8_t *value, size_t len) {
/* Generated by genpathchartbl.py */
static char VALID_PATH_CHARS[] = {
0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */,
0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */,
0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */,
0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */,
0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */,
0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */,
0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */,
0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */,
0 /* SPC */, 1 /* ! */, 1 /* " */, 1 /* # */,
1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */,
1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */,
1 /* , */, 1 /* - */, 1 /* . */, 1 /* / */,
1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */,
1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */,
1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */,
1 /* < */, 1 /* = */, 1 /* > */, 1 /* ? */,
1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */,
1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */,
1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */,
1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */,
1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */,
1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */,
1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */,
1 /* \ */, 1 /* ] */, 1 /* ^ */, 1 /* _ */,
1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */,
1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */,
1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */,
1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */,
1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */,
1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */,
1 /* x */, 1 /* y */, 1 /* z */, 1 /* { */,
1 /* | */, 1 /* } */, 1 /* ~ */, 0 /* DEL */,
1 /* 0x80 */, 1 /* 0x81 */, 1 /* 0x82 */, 1 /* 0x83 */,
1 /* 0x84 */, 1 /* 0x85 */, 1 /* 0x86 */, 1 /* 0x87 */,
1 /* 0x88 */, 1 /* 0x89 */, 1 /* 0x8a */, 1 /* 0x8b */,
1 /* 0x8c */, 1 /* 0x8d */, 1 /* 0x8e */, 1 /* 0x8f */,
1 /* 0x90 */, 1 /* 0x91 */, 1 /* 0x92 */, 1 /* 0x93 */,
1 /* 0x94 */, 1 /* 0x95 */, 1 /* 0x96 */, 1 /* 0x97 */,
1 /* 0x98 */, 1 /* 0x99 */, 1 /* 0x9a */, 1 /* 0x9b */,
1 /* 0x9c */, 1 /* 0x9d */, 1 /* 0x9e */, 1 /* 0x9f */,
1 /* 0xa0 */, 1 /* 0xa1 */, 1 /* 0xa2 */, 1 /* 0xa3 */,
1 /* 0xa4 */, 1 /* 0xa5 */, 1 /* 0xa6 */, 1 /* 0xa7 */,
1 /* 0xa8 */, 1 /* 0xa9 */, 1 /* 0xaa */, 1 /* 0xab */,
1 /* 0xac */, 1 /* 0xad */, 1 /* 0xae */, 1 /* 0xaf */,
1 /* 0xb0 */, 1 /* 0xb1 */, 1 /* 0xb2 */, 1 /* 0xb3 */,
1 /* 0xb4 */, 1 /* 0xb5 */, 1 /* 0xb6 */, 1 /* 0xb7 */,
1 /* 0xb8 */, 1 /* 0xb9 */, 1 /* 0xba */, 1 /* 0xbb */,
1 /* 0xbc */, 1 /* 0xbd */, 1 /* 0xbe */, 1 /* 0xbf */,
1 /* 0xc0 */, 1 /* 0xc1 */, 1 /* 0xc2 */, 1 /* 0xc3 */,
1 /* 0xc4 */, 1 /* 0xc5 */, 1 /* 0xc6 */, 1 /* 0xc7 */,
1 /* 0xc8 */, 1 /* 0xc9 */, 1 /* 0xca */, 1 /* 0xcb */,
1 /* 0xcc */, 1 /* 0xcd */, 1 /* 0xce */, 1 /* 0xcf */,
1 /* 0xd0 */, 1 /* 0xd1 */, 1 /* 0xd2 */, 1 /* 0xd3 */,
1 /* 0xd4 */, 1 /* 0xd5 */, 1 /* 0xd6 */, 1 /* 0xd7 */,
1 /* 0xd8 */, 1 /* 0xd9 */, 1 /* 0xda */, 1 /* 0xdb */,
1 /* 0xdc */, 1 /* 0xdd */, 1 /* 0xde */, 1 /* 0xdf */,
1 /* 0xe0 */, 1 /* 0xe1 */, 1 /* 0xe2 */, 1 /* 0xe3 */,
1 /* 0xe4 */, 1 /* 0xe5 */, 1 /* 0xe6 */, 1 /* 0xe7 */,
1 /* 0xe8 */, 1 /* 0xe9 */, 1 /* 0xea */, 1 /* 0xeb */,
1 /* 0xec */, 1 /* 0xed */, 1 /* 0xee */, 1 /* 0xef */,
1 /* 0xf0 */, 1 /* 0xf1 */, 1 /* 0xf2 */, 1 /* 0xf3 */,
1 /* 0xf4 */, 1 /* 0xf5 */, 1 /* 0xf6 */, 1 /* 0xf7 */,
1 /* 0xf8 */, 1 /* 0xf9 */, 1 /* 0xfa */, 1 /* 0xfb */,
1 /* 0xfc */, 1 /* 0xfd */, 1 /* 0xfe */, 1 /* 0xff */
0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */,
0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */,
0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */,
0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */,
0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */,
0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */,
0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */,
0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */,
0 /* SPC */, 1 /* ! */, 1 /* " */, 1 /* # */,
1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */,
1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */,
1 /* , */, 1 /* - */, 1 /* . */, 1 /* / */,
1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */,
1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */,
1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */,
1 /* < */, 1 /* = */, 1 /* > */, 1 /* ? */,
1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */,
1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */,
1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */,
1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */,
1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */,
1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */,
1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */,
1 /* \ */, 1 /* ] */, 1 /* ^ */, 1 /* _ */,
1 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */,
1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */,
1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */,
1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */,
1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */,
1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */,
1 /* x */, 1 /* y */, 1 /* z */, 1 /* { */,
1 /* | */, 1 /* } */, 1 /* ~ */, 0 /* DEL */,
1 /* 0x80 */, 1 /* 0x81 */, 1 /* 0x82 */, 1 /* 0x83 */,
1 /* 0x84 */, 1 /* 0x85 */, 1 /* 0x86 */, 1 /* 0x87 */,
1 /* 0x88 */, 1 /* 0x89 */, 1 /* 0x8a */, 1 /* 0x8b */,
1 /* 0x8c */, 1 /* 0x8d */, 1 /* 0x8e */, 1 /* 0x8f */,
1 /* 0x90 */, 1 /* 0x91 */, 1 /* 0x92 */, 1 /* 0x93 */,
1 /* 0x94 */, 1 /* 0x95 */, 1 /* 0x96 */, 1 /* 0x97 */,
1 /* 0x98 */, 1 /* 0x99 */, 1 /* 0x9a */, 1 /* 0x9b */,
1 /* 0x9c */, 1 /* 0x9d */, 1 /* 0x9e */, 1 /* 0x9f */,
1 /* 0xa0 */, 1 /* 0xa1 */, 1 /* 0xa2 */, 1 /* 0xa3 */,
1 /* 0xa4 */, 1 /* 0xa5 */, 1 /* 0xa6 */, 1 /* 0xa7 */,
1 /* 0xa8 */, 1 /* 0xa9 */, 1 /* 0xaa */, 1 /* 0xab */,
1 /* 0xac */, 1 /* 0xad */, 1 /* 0xae */, 1 /* 0xaf */,
1 /* 0xb0 */, 1 /* 0xb1 */, 1 /* 0xb2 */, 1 /* 0xb3 */,
1 /* 0xb4 */, 1 /* 0xb5 */, 1 /* 0xb6 */, 1 /* 0xb7 */,
1 /* 0xb8 */, 1 /* 0xb9 */, 1 /* 0xba */, 1 /* 0xbb */,
1 /* 0xbc */, 1 /* 0xbd */, 1 /* 0xbe */, 1 /* 0xbf */,
1 /* 0xc0 */, 1 /* 0xc1 */, 1 /* 0xc2 */, 1 /* 0xc3 */,
1 /* 0xc4 */, 1 /* 0xc5 */, 1 /* 0xc6 */, 1 /* 0xc7 */,
1 /* 0xc8 */, 1 /* 0xc9 */, 1 /* 0xca */, 1 /* 0xcb */,
1 /* 0xcc */, 1 /* 0xcd */, 1 /* 0xce */, 1 /* 0xcf */,
1 /* 0xd0 */, 1 /* 0xd1 */, 1 /* 0xd2 */, 1 /* 0xd3 */,
1 /* 0xd4 */, 1 /* 0xd5 */, 1 /* 0xd6 */, 1 /* 0xd7 */,
1 /* 0xd8 */, 1 /* 0xd9 */, 1 /* 0xda */, 1 /* 0xdb */,
1 /* 0xdc */, 1 /* 0xdd */, 1 /* 0xde */, 1 /* 0xdf */,
1 /* 0xe0 */, 1 /* 0xe1 */, 1 /* 0xe2 */, 1 /* 0xe3 */,
1 /* 0xe4 */, 1 /* 0xe5 */, 1 /* 0xe6 */, 1 /* 0xe7 */,
1 /* 0xe8 */, 1 /* 0xe9 */, 1 /* 0xea */, 1 /* 0xeb */,
1 /* 0xec */, 1 /* 0xed */, 1 /* 0xee */, 1 /* 0xef */,
1 /* 0xf0 */, 1 /* 0xf1 */, 1 /* 0xf2 */, 1 /* 0xf3 */,
1 /* 0xf4 */, 1 /* 0xf5 */, 1 /* 0xf6 */, 1 /* 0xf7 */,
1 /* 0xf8 */, 1 /* 0xf9 */, 1 /* 0xfa */, 1 /* 0xfb */,
1 /* 0xfc */, 1 /* 0xfd */, 1 /* 0xfe */, 1 /* 0xff */
};
int nghttp2_check_path(const uint8_t *value, size_t len) {
@@ -683,70 +683,70 @@ int nghttp2_check_path(const uint8_t *value, size_t len) {
/* Generated by genauthoritychartbl.py */
static char VALID_AUTHORITY_CHARS[] = {
0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */,
0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */,
0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */,
0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */,
0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */,
0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */,
0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */,
0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */,
0 /* SPC */, 1 /* ! */, 0 /* " */, 0 /* # */,
1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */,
1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */,
1 /* , */, 1 /* - */, 1 /* . */, 0 /* / */,
1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */,
1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */,
1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */,
0 /* < */, 1 /* = */, 0 /* > */, 0 /* ? */,
1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */,
1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */,
1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */,
1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */,
1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */,
1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */,
1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */,
0 /* \ */, 1 /* ] */, 0 /* ^ */, 1 /* _ */,
0 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */,
1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */,
1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */,
1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */,
1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */,
1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */,
1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */,
0 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */,
0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */,
0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */,
0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */,
0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */,
0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */,
0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */,
0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */,
0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */,
0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */,
0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */,
0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */,
0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */,
0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */,
0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */,
0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */,
0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */,
0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */,
0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */,
0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */,
0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */,
0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */,
0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */,
0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */,
0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */,
0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */,
0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */,
0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */,
0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */,
0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */,
0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */,
0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */,
0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */
0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */,
0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */,
0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */,
0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */,
0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */,
0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */,
0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */,
0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */,
0 /* SPC */, 1 /* ! */, 0 /* " */, 0 /* # */,
1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */,
1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */,
1 /* , */, 1 /* - */, 1 /* . */, 0 /* / */,
1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */,
1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */,
1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */,
0 /* < */, 1 /* = */, 0 /* > */, 0 /* ? */,
1 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */,
1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */,
1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */,
1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */,
1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */,
1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */,
1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */,
0 /* \ */, 1 /* ] */, 0 /* ^ */, 1 /* _ */,
0 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */,
1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */,
1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */,
1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */,
1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */,
1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */,
1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */,
0 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */,
0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */,
0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */,
0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */,
0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */,
0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */,
0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */,
0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */,
0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */,
0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */,
0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */,
0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */,
0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */,
0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */,
0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */,
0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */,
0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */,
0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */,
0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */,
0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */,
0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */,
0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */,
0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */,
0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */,
0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */,
0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */,
0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */,
0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */,
0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */,
0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */,
0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */,
0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */,
0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */
};
int nghttp2_check_authority(const uint8_t *value, size_t len) {

View File

@@ -27,7 +27,7 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif /* HAVE_CONFIG_H */
#endif /* defined(HAVE_CONFIG_H) */
#include <string.h>
#include <stddef.h>
@@ -38,28 +38,28 @@
#define nghttp2_max_def(SUFFIX, T) \
static inline T nghttp2_max_##SUFFIX(T a, T b) { return a < b ? b : a; }
nghttp2_max_def(int8, int8_t);
nghttp2_max_def(int16, int16_t);
nghttp2_max_def(int32, int32_t);
nghttp2_max_def(int64, int64_t);
nghttp2_max_def(uint8, uint8_t);
nghttp2_max_def(uint16, uint16_t);
nghttp2_max_def(uint32, uint32_t);
nghttp2_max_def(uint64, uint64_t);
nghttp2_max_def(size, size_t);
nghttp2_max_def(int8, int8_t)
nghttp2_max_def(int16, int16_t)
nghttp2_max_def(int32, int32_t)
nghttp2_max_def(int64, int64_t)
nghttp2_max_def(uint8, uint8_t)
nghttp2_max_def(uint16, uint16_t)
nghttp2_max_def(uint32, uint32_t)
nghttp2_max_def(uint64, uint64_t)
nghttp2_max_def(size, size_t)
#define nghttp2_min_def(SUFFIX, T) \
static inline T nghttp2_min_##SUFFIX(T a, T b) { return a < b ? a : b; }
nghttp2_min_def(int8, int8_t);
nghttp2_min_def(int16, int16_t);
nghttp2_min_def(int32, int32_t);
nghttp2_min_def(int64, int64_t);
nghttp2_min_def(uint8, uint8_t);
nghttp2_min_def(uint16, uint16_t);
nghttp2_min_def(uint32, uint32_t);
nghttp2_min_def(uint64, uint64_t);
nghttp2_min_def(size, size_t);
nghttp2_min_def(int8, int8_t)
nghttp2_min_def(int16, int16_t)
nghttp2_min_def(int32, int32_t)
nghttp2_min_def(int64, int64_t)
nghttp2_min_def(uint8, uint8_t)
nghttp2_min_def(uint16, uint16_t)
nghttp2_min_def(uint32, uint32_t)
nghttp2_min_def(uint64, uint64_t)
nghttp2_min_def(size, size_t)
#define lstreq(A, B, N) ((sizeof((A)) - 1) == (N) && memcmp((A), (B), (N)) == 0)
@@ -142,4 +142,4 @@ int nghttp2_should_send_window_update(int32_t local_window_size,
*/
uint8_t *nghttp2_cpymem(uint8_t *dest, const void *src, size_t len);
#endif /* NGHTTP2_HELPER_H */
#endif /* !defined(NGHTTP2_HELPER_H) */

View File

@@ -207,7 +207,6 @@ static int http_request_on_header(nghttp2_stream *stream, nghttp2_hd_nv *nv,
if (!trailer &&
/* Do not parse the header field in PUSH_PROMISE. */
(stream->stream_id & 1) &&
(stream->flags & NGHTTP2_STREAM_FLAG_NO_RFC7540_PRIORITIES) &&
!(stream->http_flags & NGHTTP2_HTTP_FLAG_BAD_PRIORITY)) {
nghttp2_extpri_from_uint8(&extpri, stream->http_extpri);
if (nghttp2_http_parse_priority(&extpri, nv->value->base,
@@ -347,6 +346,84 @@ static int lws(const uint8_t *s, size_t n) {
return 1;
}
/* Generated by genauthoritychartbl.py, but '@' is not allowed */
static char VALID_AUTHORITY_CHARS[] = {
0 /* NUL */, 0 /* SOH */, 0 /* STX */, 0 /* ETX */,
0 /* EOT */, 0 /* ENQ */, 0 /* ACK */, 0 /* BEL */,
0 /* BS */, 0 /* HT */, 0 /* LF */, 0 /* VT */,
0 /* FF */, 0 /* CR */, 0 /* SO */, 0 /* SI */,
0 /* DLE */, 0 /* DC1 */, 0 /* DC2 */, 0 /* DC3 */,
0 /* DC4 */, 0 /* NAK */, 0 /* SYN */, 0 /* ETB */,
0 /* CAN */, 0 /* EM */, 0 /* SUB */, 0 /* ESC */,
0 /* FS */, 0 /* GS */, 0 /* RS */, 0 /* US */,
0 /* SPC */, 1 /* ! */, 0 /* " */, 0 /* # */,
1 /* $ */, 1 /* % */, 1 /* & */, 1 /* ' */,
1 /* ( */, 1 /* ) */, 1 /* * */, 1 /* + */,
1 /* , */, 1 /* - */, 1 /* . */, 0 /* / */,
1 /* 0 */, 1 /* 1 */, 1 /* 2 */, 1 /* 3 */,
1 /* 4 */, 1 /* 5 */, 1 /* 6 */, 1 /* 7 */,
1 /* 8 */, 1 /* 9 */, 1 /* : */, 1 /* ; */,
0 /* < */, 1 /* = */, 0 /* > */, 0 /* ? */,
0 /* @ */, 1 /* A */, 1 /* B */, 1 /* C */,
1 /* D */, 1 /* E */, 1 /* F */, 1 /* G */,
1 /* H */, 1 /* I */, 1 /* J */, 1 /* K */,
1 /* L */, 1 /* M */, 1 /* N */, 1 /* O */,
1 /* P */, 1 /* Q */, 1 /* R */, 1 /* S */,
1 /* T */, 1 /* U */, 1 /* V */, 1 /* W */,
1 /* X */, 1 /* Y */, 1 /* Z */, 1 /* [ */,
0 /* \ */, 1 /* ] */, 0 /* ^ */, 1 /* _ */,
0 /* ` */, 1 /* a */, 1 /* b */, 1 /* c */,
1 /* d */, 1 /* e */, 1 /* f */, 1 /* g */,
1 /* h */, 1 /* i */, 1 /* j */, 1 /* k */,
1 /* l */, 1 /* m */, 1 /* n */, 1 /* o */,
1 /* p */, 1 /* q */, 1 /* r */, 1 /* s */,
1 /* t */, 1 /* u */, 1 /* v */, 1 /* w */,
1 /* x */, 1 /* y */, 1 /* z */, 0 /* { */,
0 /* | */, 0 /* } */, 1 /* ~ */, 0 /* DEL */,
0 /* 0x80 */, 0 /* 0x81 */, 0 /* 0x82 */, 0 /* 0x83 */,
0 /* 0x84 */, 0 /* 0x85 */, 0 /* 0x86 */, 0 /* 0x87 */,
0 /* 0x88 */, 0 /* 0x89 */, 0 /* 0x8a */, 0 /* 0x8b */,
0 /* 0x8c */, 0 /* 0x8d */, 0 /* 0x8e */, 0 /* 0x8f */,
0 /* 0x90 */, 0 /* 0x91 */, 0 /* 0x92 */, 0 /* 0x93 */,
0 /* 0x94 */, 0 /* 0x95 */, 0 /* 0x96 */, 0 /* 0x97 */,
0 /* 0x98 */, 0 /* 0x99 */, 0 /* 0x9a */, 0 /* 0x9b */,
0 /* 0x9c */, 0 /* 0x9d */, 0 /* 0x9e */, 0 /* 0x9f */,
0 /* 0xa0 */, 0 /* 0xa1 */, 0 /* 0xa2 */, 0 /* 0xa3 */,
0 /* 0xa4 */, 0 /* 0xa5 */, 0 /* 0xa6 */, 0 /* 0xa7 */,
0 /* 0xa8 */, 0 /* 0xa9 */, 0 /* 0xaa */, 0 /* 0xab */,
0 /* 0xac */, 0 /* 0xad */, 0 /* 0xae */, 0 /* 0xaf */,
0 /* 0xb0 */, 0 /* 0xb1 */, 0 /* 0xb2 */, 0 /* 0xb3 */,
0 /* 0xb4 */, 0 /* 0xb5 */, 0 /* 0xb6 */, 0 /* 0xb7 */,
0 /* 0xb8 */, 0 /* 0xb9 */, 0 /* 0xba */, 0 /* 0xbb */,
0 /* 0xbc */, 0 /* 0xbd */, 0 /* 0xbe */, 0 /* 0xbf */,
0 /* 0xc0 */, 0 /* 0xc1 */, 0 /* 0xc2 */, 0 /* 0xc3 */,
0 /* 0xc4 */, 0 /* 0xc5 */, 0 /* 0xc6 */, 0 /* 0xc7 */,
0 /* 0xc8 */, 0 /* 0xc9 */, 0 /* 0xca */, 0 /* 0xcb */,
0 /* 0xcc */, 0 /* 0xcd */, 0 /* 0xce */, 0 /* 0xcf */,
0 /* 0xd0 */, 0 /* 0xd1 */, 0 /* 0xd2 */, 0 /* 0xd3 */,
0 /* 0xd4 */, 0 /* 0xd5 */, 0 /* 0xd6 */, 0 /* 0xd7 */,
0 /* 0xd8 */, 0 /* 0xd9 */, 0 /* 0xda */, 0 /* 0xdb */,
0 /* 0xdc */, 0 /* 0xdd */, 0 /* 0xde */, 0 /* 0xdf */,
0 /* 0xe0 */, 0 /* 0xe1 */, 0 /* 0xe2 */, 0 /* 0xe3 */,
0 /* 0xe4 */, 0 /* 0xe5 */, 0 /* 0xe6 */, 0 /* 0xe7 */,
0 /* 0xe8 */, 0 /* 0xe9 */, 0 /* 0xea */, 0 /* 0xeb */,
0 /* 0xec */, 0 /* 0xed */, 0 /* 0xee */, 0 /* 0xef */,
0 /* 0xf0 */, 0 /* 0xf1 */, 0 /* 0xf2 */, 0 /* 0xf3 */,
0 /* 0xf4 */, 0 /* 0xf5 */, 0 /* 0xf6 */, 0 /* 0xf7 */,
0 /* 0xf8 */, 0 /* 0xf9 */, 0 /* 0xfa */, 0 /* 0xfb */,
0 /* 0xfc */, 0 /* 0xfd */, 0 /* 0xfe */, 0 /* 0xff */
};
static int check_authority(const uint8_t *value, size_t len) {
const uint8_t *last;
for (last = value + len; value != last; ++value) {
if (!VALID_AUTHORITY_CHARS[*value]) {
return 0;
}
}
return 1;
}
int nghttp2_http_on_header(nghttp2_session *session, nghttp2_stream *stream,
nghttp2_frame *frame, nghttp2_hd_nv *nv,
int trailer) {
@@ -388,10 +465,10 @@ int nghttp2_http_on_header(nghttp2_session *session, nghttp2_stream *stream,
case NGHTTP2_TOKEN__AUTHORITY:
case NGHTTP2_TOKEN_HOST:
if (session->server || frame->hd.type == NGHTTP2_PUSH_PROMISE) {
rv = nghttp2_check_authority(nv->value->base, nv->value->len);
rv = check_authority(nv->value->base, nv->value->len);
} else if (
stream->flags &
NGHTTP2_STREAM_FLAG_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATION) {
stream->flags &
NGHTTP2_STREAM_FLAG_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATION) {
rv = nghttp2_check_header_value(nv->value->base, nv->value->len);
} else {
rv = nghttp2_check_header_value_rfc9113(nv->value->base, nv->value->len);
@@ -435,7 +512,7 @@ int nghttp2_http_on_header(nghttp2_session *session, nghttp2_stream *stream,
if (session->server || frame->hd.type == NGHTTP2_PUSH_PROMISE) {
return http_request_on_header(stream, nv, trailer,
session->server &&
session->pending_enable_connect_protocol);
session->pending_enable_connect_protocol);
}
return http_response_on_header(stream, nv, trailer);
@@ -453,7 +530,7 @@ int nghttp2_http_on_request_headers(nghttp2_stream *stream,
stream->content_length = -1;
} else {
if ((stream->http_flags & NGHTTP2_HTTP_FLAG_REQ_HEADERS) !=
NGHTTP2_HTTP_FLAG_REQ_HEADERS ||
NGHTTP2_HTTP_FLAG_REQ_HEADERS ||
(stream->http_flags &
(NGHTTP2_HTTP_FLAG__AUTHORITY | NGHTTP2_HTTP_FLAG_HOST)) == 0) {
return -1;
@@ -493,7 +570,7 @@ int nghttp2_http_on_response_headers(nghttp2_stream *stream) {
}
stream->http_flags =
stream->http_flags & (uint32_t)~NGHTTP2_HTTP_FLAG_EXPECT_FINAL_RESPONSE;
stream->http_flags & (uint32_t)~NGHTTP2_HTTP_FLAG_EXPECT_FINAL_RESPONSE;
if (!expect_response_body(stream)) {
stream->content_length = 0;
@@ -582,17 +659,17 @@ void nghttp2_http_record_request_method(nghttp2_stream *stream,
int nghttp2_http_parse_priority(nghttp2_extpri *dest, const uint8_t *value,
size_t valuelen) {
nghttp2_extpri pri = *dest;
sf_parser sfp;
sf_vec key;
sf_value val;
sfparse_parser sfp;
sfparse_vec key;
sfparse_value val;
int rv;
sf_parser_init(&sfp, value, valuelen);
sfparse_parser_init(&sfp, value, valuelen);
for (;;) {
rv = sf_parser_dict(&sfp, &key, &val);
rv = sfparse_parser_dict(&sfp, &key, &val);
if (rv != 0) {
if (rv == SF_ERR_EOF) {
if (rv == SFPARSE_ERR_EOF) {
break;
}
@@ -605,7 +682,7 @@ int nghttp2_http_parse_priority(nghttp2_extpri *dest, const uint8_t *value,
switch (key.base[0]) {
case 'i':
if (val.type != SF_TYPE_BOOLEAN) {
if (val.type != SFPARSE_TYPE_BOOLEAN) {
return NGHTTP2_ERR_INVALID_ARGUMENT;
}
@@ -613,7 +690,7 @@ int nghttp2_http_parse_priority(nghttp2_extpri *dest, const uint8_t *value,
break;
case 'u':
if (val.type != SF_TYPE_INTEGER ||
if (val.type != SFPARSE_TYPE_INTEGER ||
val.integer < NGHTTP2_EXTPRI_URGENCY_HIGH ||
NGHTTP2_EXTPRI_URGENCY_LOW < val.integer) {
return NGHTTP2_ERR_INVALID_ARGUMENT;

View File

@@ -27,7 +27,7 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif /* HAVE_CONFIG_H */
#endif /* defined(HAVE_CONFIG_H) */
#include <nghttp2/nghttp2.h>
#include "nghttp2_session.h"
@@ -97,4 +97,4 @@ void nghttp2_http_record_request_method(nghttp2_stream *stream,
int nghttp2_http_parse_priority(nghttp2_extpri *dest, const uint8_t *value,
size_t valuelen);
#endif /* NGHTTP2_HTTP_H */
#endif /* !defined(NGHTTP2_HTTP_H) */

View File

@@ -27,7 +27,7 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif /* HAVE_CONFIG_H */
#endif /* defined(HAVE_CONFIG_H) */
#include <nghttp2/nghttp2.h>
@@ -52,7 +52,11 @@ typedef enum {
* Unlike NGHTTP2_ERR_IGN_HTTP_HEADER, this does not invoke
* nghttp2_on_invalid_header_callback.
*/
NGHTTP2_ERR_REMOVE_HTTP_HEADER = -106
NGHTTP2_ERR_REMOVE_HTTP_HEADER = -106,
/*
* Cancel pushed stream.
*/
NGHTTP2_ERR_PUSH_CANCEL = -107,
} nghttp2_internal_error;
#endif /* NGHTTP2_INT_H */
#endif /* !defined(NGHTTP2_INT_H) */

View File

@@ -31,13 +31,13 @@
#include "nghttp2_helper.h"
#define NGHTTP2_INITIAL_TABLE_LENBITS 4
#define NGHTTP2_INITIAL_HASHBITS 4
void nghttp2_map_init(nghttp2_map *map, nghttp2_mem *mem) {
void nghttp2_map_init(nghttp2_map *map, uint32_t seed, nghttp2_mem *mem) {
map->mem = mem;
map->tablelen = 0;
map->tablelenbits = 0;
map->hashbits = 0;
map->table = NULL;
map->seed = seed;
map->size = 0;
}
@@ -49,33 +49,20 @@ void nghttp2_map_free(nghttp2_map *map) {
nghttp2_mem_free(map->mem, map->table);
}
void nghttp2_map_each_free(nghttp2_map *map, int (*func)(void *data, void *ptr),
void *ptr) {
uint32_t i;
nghttp2_map_bucket *bkt;
for (i = 0; i < map->tablelen; ++i) {
bkt = &map->table[i];
if (bkt->data == NULL) {
continue;
}
func(bkt->data, ptr);
}
}
int nghttp2_map_each(nghttp2_map *map, int (*func)(void *data, void *ptr),
int nghttp2_map_each(const nghttp2_map *map, int (*func)(void *data, void *ptr),
void *ptr) {
int rv;
uint32_t i;
size_t i;
nghttp2_map_bucket *bkt;
size_t tablelen;
if (map->size == 0) {
return 0;
}
for (i = 0; i < map->tablelen; ++i) {
tablelen = 1u << map->hashbits;
for (i = 0; i < tablelen; ++i) {
bkt = &map->table[i];
if (bkt->data == NULL) {
@@ -91,82 +78,70 @@ int nghttp2_map_each(nghttp2_map *map, int (*func)(void *data, void *ptr),
return 0;
}
static uint32_t hash(nghttp2_map_key_type key) {
return (uint32_t)key * 2654435769u;
static size_t map_hash(const nghttp2_map *map, nghttp2_map_key_type key) {
/* hasher from
https://github.com/rust-lang/rustc-hash/blob/dc5c33f1283de2da64d8d7a06401d91aded03ad4/src/lib.rs
We do not perform finalization here because we use top bits
anyway. */
uint32_t h = ((uint32_t)key + map->seed) * 0x93d765dd;
return (size_t)((h * 2654435769u) >> (32 - map->hashbits));
}
static size_t h2idx(uint32_t hash, uint32_t bits) {
return hash >> (32 - bits);
}
static void map_bucket_swap(nghttp2_map_bucket *a, nghttp2_map_bucket *b) {
nghttp2_map_bucket c = *a;
static size_t distance(uint32_t tablelen, uint32_t tablelenbits,
nghttp2_map_bucket *bkt, size_t idx) {
return (idx - h2idx(bkt->hash, tablelenbits)) & (tablelen - 1);
}
static void map_bucket_swap(nghttp2_map_bucket *bkt, uint32_t *phash,
nghttp2_map_key_type *pkey, void **pdata) {
uint32_t h = bkt->hash;
nghttp2_map_key_type key = bkt->key;
void *data = bkt->data;
bkt->hash = *phash;
bkt->key = *pkey;
bkt->data = *pdata;
*phash = h;
*pkey = key;
*pdata = data;
}
static void map_bucket_set_data(nghttp2_map_bucket *bkt, uint32_t hash,
nghttp2_map_key_type key, void *data) {
bkt->hash = hash;
bkt->key = key;
bkt->data = data;
*a = *b;
*b = c;
}
#ifndef WIN32
void nghttp2_map_print_distance(nghttp2_map *map) {
uint32_t i;
void nghttp2_map_print_distance(const nghttp2_map *map) {
size_t i;
size_t idx;
nghttp2_map_bucket *bkt;
size_t tablelen;
for (i = 0; i < map->tablelen; ++i) {
if (map->size == 0) {
return;
}
tablelen = 1u << map->hashbits;
for (i = 0; i < tablelen; ++i) {
bkt = &map->table[i];
if (bkt->data == NULL) {
fprintf(stderr, "@%u <EMPTY>\n", i);
fprintf(stderr, "@%zu <EMPTY>\n", i);
continue;
}
idx = h2idx(bkt->hash, map->tablelenbits);
fprintf(stderr, "@%u hash=%08x key=%d base=%zu distance=%zu\n", i,
bkt->hash, bkt->key, idx,
distance(map->tablelen, map->tablelenbits, bkt, idx));
idx = map_hash(map, bkt->key);
fprintf(stderr, "@%zu hash=%zu key=%d base=%zu distance=%u\n", i,
map_hash(map, bkt->key), bkt->key, idx, bkt->psl);
}
}
#endif /* !WIN32 */
#endif /* !defined(WIN32) */
static int insert(nghttp2_map_bucket *table, uint32_t tablelen,
uint32_t tablelenbits, uint32_t hash,
nghttp2_map_key_type key, void *data) {
size_t idx = h2idx(hash, tablelenbits);
size_t d = 0, dd;
static int map_insert(nghttp2_map *map, nghttp2_map_key_type key, void *data) {
size_t idx = map_hash(map, key);
nghttp2_map_bucket b = {
.key = key,
.data = data,
};
nghttp2_map_bucket *bkt;
size_t mask = (1u << map->hashbits) - 1;
for (;;) {
bkt = &table[idx];
bkt = &map->table[idx];
if (bkt->data == NULL) {
map_bucket_set_data(bkt, hash, key, data);
*bkt = b;
++map->size;
return 0;
}
dd = distance(tablelen, tablelenbits, bkt, idx);
if (d > dd) {
map_bucket_swap(bkt, &hash, &key, &data);
d = dd;
if (b.psl > bkt->psl) {
map_bucket_swap(bkt, &b);
} else if (bkt->key == key) {
/* TODO This check is just a waste after first swap or if this
function is called from map_resize. That said, there is no
@@ -175,42 +150,47 @@ static int insert(nghttp2_map_bucket *table, uint32_t tablelen,
return NGHTTP2_ERR_INVALID_ARGUMENT;
}
++d;
idx = (idx + 1) & (tablelen - 1);
++b.psl;
idx = (idx + 1) & mask;
}
}
/* new_tablelen must be power of 2 and new_tablelen == (1 <<
new_tablelenbits) must hold. */
static int map_resize(nghttp2_map *map, uint32_t new_tablelen,
uint32_t new_tablelenbits) {
uint32_t i;
nghttp2_map_bucket *new_table;
static int map_resize(nghttp2_map *map, size_t new_hashbits) {
size_t i;
nghttp2_map_bucket *bkt;
size_t tablelen;
int rv;
nghttp2_map new_map = {
.table = nghttp2_mem_calloc(map->mem, 1u << new_hashbits,
sizeof(nghttp2_map_bucket)),
.mem = map->mem,
.seed = map->seed,
.hashbits = new_hashbits,
};
(void)rv;
new_table =
nghttp2_mem_calloc(map->mem, new_tablelen, sizeof(nghttp2_map_bucket));
if (new_table == NULL) {
if (new_map.table == NULL) {
return NGHTTP2_ERR_NOMEM;
}
for (i = 0; i < map->tablelen; ++i) {
bkt = &map->table[i];
if (bkt->data == NULL) {
continue;
}
rv = insert(new_table, new_tablelen, new_tablelenbits, bkt->hash, bkt->key,
bkt->data);
if (map->size) {
tablelen = 1u << map->hashbits;
assert(0 == rv);
for (i = 0; i < tablelen; ++i) {
bkt = &map->table[i];
if (bkt->data == NULL) {
continue;
}
rv = map_insert(&new_map, bkt->key, bkt->data);
assert(0 == rv);
}
}
nghttp2_mem_free(map->mem, map->table);
map->tablelen = new_tablelen;
map->tablelenbits = new_tablelenbits;
map->table = new_table;
map->table = new_map.table;
map->hashbits = new_hashbits;
return 0;
}
@@ -220,49 +200,48 @@ int nghttp2_map_insert(nghttp2_map *map, nghttp2_map_key_type key, void *data) {
assert(data);
/* Load factor is 0.75 */
if ((map->size + 1) * 4 > map->tablelen * 3) {
if (map->tablelen) {
rv = map_resize(map, map->tablelen * 2, map->tablelenbits + 1);
/* Load factor is 7/8 */
/* Under the very initial condition, that is map->size == 0 and
map->hashbits == 0, 8 > 7 still holds nicely. */
if ((map->size + 1) * 8 > (1u << map->hashbits) * 7) {
if (map->hashbits) {
rv = map_resize(map, map->hashbits + 1);
if (rv != 0) {
return rv;
}
} else {
rv = map_resize(map, 1 << NGHTTP2_INITIAL_TABLE_LENBITS,
NGHTTP2_INITIAL_TABLE_LENBITS);
rv = map_resize(map, NGHTTP2_INITIAL_HASHBITS);
if (rv != 0) {
return rv;
}
}
}
rv = insert(map->table, map->tablelen, map->tablelenbits, hash(key), key,
data);
rv = map_insert(map, key, data);
if (rv != 0) {
return rv;
}
++map->size;
return 0;
}
void *nghttp2_map_find(nghttp2_map *map, nghttp2_map_key_type key) {
uint32_t h;
void *nghttp2_map_find(const nghttp2_map *map, nghttp2_map_key_type key) {
size_t idx;
nghttp2_map_bucket *bkt;
size_t d = 0;
size_t psl = 0;
size_t mask;
if (map->size == 0) {
return NULL;
}
h = hash(key);
idx = h2idx(h, map->tablelenbits);
idx = map_hash(map, key);
mask = (1u << map->hashbits) - 1;
for (;;) {
bkt = &map->table[idx];
if (bkt->data == NULL ||
d > distance(map->tablelen, map->tablelenbits, bkt, idx)) {
if (bkt->data == NULL || psl > bkt->psl) {
return NULL;
}
@@ -270,50 +249,47 @@ void *nghttp2_map_find(nghttp2_map *map, nghttp2_map_key_type key) {
return bkt->data;
}
++d;
idx = (idx + 1) & (map->tablelen - 1);
++psl;
idx = (idx + 1) & mask;
}
}
int nghttp2_map_remove(nghttp2_map *map, nghttp2_map_key_type key) {
uint32_t h;
size_t idx, didx;
nghttp2_map_bucket *bkt;
size_t d = 0;
size_t idx;
nghttp2_map_bucket *b, *bkt;
size_t psl = 0;
size_t mask;
if (map->size == 0) {
return NGHTTP2_ERR_INVALID_ARGUMENT;
}
h = hash(key);
idx = h2idx(h, map->tablelenbits);
idx = map_hash(map, key);
mask = (1u << map->hashbits) - 1;
for (;;) {
bkt = &map->table[idx];
if (bkt->data == NULL ||
d > distance(map->tablelen, map->tablelenbits, bkt, idx)) {
if (bkt->data == NULL || psl > bkt->psl) {
return NGHTTP2_ERR_INVALID_ARGUMENT;
}
if (bkt->key == key) {
map_bucket_set_data(bkt, 0, 0, NULL);
didx = idx;
idx = (idx + 1) & (map->tablelen - 1);
b = bkt;
idx = (idx + 1) & mask;
for (;;) {
bkt = &map->table[idx];
if (bkt->data == NULL ||
distance(map->tablelen, map->tablelenbits, bkt, idx) == 0) {
if (bkt->data == NULL || bkt->psl == 0) {
b->data = NULL;
break;
}
map->table[didx] = *bkt;
map_bucket_set_data(bkt, 0, 0, NULL);
didx = idx;
--bkt->psl;
*b = *bkt;
b = bkt;
idx = (idx + 1) & (map->tablelen - 1);
idx = (idx + 1) & mask;
}
--map->size;
@@ -321,18 +297,18 @@ int nghttp2_map_remove(nghttp2_map *map, nghttp2_map_key_type key) {
return 0;
}
++d;
idx = (idx + 1) & (map->tablelen - 1);
++psl;
idx = (idx + 1) & mask;
}
}
void nghttp2_map_clear(nghttp2_map *map) {
if (map->tablelen == 0) {
if (map->size == 0) {
return;
}
memset(map->table, 0, sizeof(*map->table) * map->tablelen);
memset(map->table, 0, sizeof(*map->table) * (1u << map->hashbits));
map->size = 0;
}
size_t nghttp2_map_size(nghttp2_map *map) { return map->size; }
size_t nghttp2_map_size(const nghttp2_map *map) { return map->size; }

View File

@@ -28,7 +28,7 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif /* HAVE_CONFIG_H */
#endif /* defined(HAVE_CONFIG_H) */
#include <nghttp2/nghttp2.h>
@@ -39,7 +39,7 @@
typedef int32_t nghttp2_map_key_type;
typedef struct nghttp2_map_bucket {
uint32_t hash;
uint32_t psl;
nghttp2_map_key_type key;
void *data;
} nghttp2_map_bucket;
@@ -47,34 +47,26 @@ typedef struct nghttp2_map_bucket {
typedef struct nghttp2_map {
nghttp2_map_bucket *table;
nghttp2_mem *mem;
uint32_t seed;
size_t size;
uint32_t tablelen;
uint32_t tablelenbits;
size_t hashbits;
} nghttp2_map;
/*
* Initializes the map |map|.
* nghttp2_map_init initializes the map |map|.
*/
void nghttp2_map_init(nghttp2_map *map, nghttp2_mem *mem);
void nghttp2_map_init(nghttp2_map *map, uint32_t seed, nghttp2_mem *mem);
/*
* Deallocates any resources allocated for |map|. The stored entries
* are not freed by this function. Use nghttp2_map_each_free() to free
* each entries.
* nghttp2_map_free deallocates any resources allocated for |map|.
* The stored entries are not freed by this function. Use
* nghttp2_map_each() to free each entry.
*/
void nghttp2_map_free(nghttp2_map *map);
/*
* Deallocates each entries using |func| function and any resources
* allocated for |map|. The |func| function is responsible for freeing
* given the |data| object. The |ptr| will be passed to the |func| as
* send argument. The return value of the |func| will be ignored.
*/
void nghttp2_map_each_free(nghttp2_map *map, int (*func)(void *data, void *ptr),
void *ptr);
/*
* Inserts the new |data| with the |key| to the map |map|.
* nghttp2_map_insert inserts the new |data| with the |key| to the map
* |map|.
*
* This function returns 0 if it succeeds, or one of the following
* negative error codes:
@@ -82,57 +74,56 @@ void nghttp2_map_each_free(nghttp2_map *map, int (*func)(void *data, void *ptr),
* NGHTTP2_ERR_INVALID_ARGUMENT
* The item associated by |key| already exists.
* NGHTTP2_ERR_NOMEM
* Out of memory
* Out of memory
*/
int nghttp2_map_insert(nghttp2_map *map, nghttp2_map_key_type key, void *data);
/*
* Returns the data associated by the key |key|. If there is no such
* data, this function returns NULL.
* nghttp2_map_find returns the entry associated by the key |key|. If
* there is no such entry, this function returns NULL.
*/
void *nghttp2_map_find(nghttp2_map *map, nghttp2_map_key_type key);
void *nghttp2_map_find(const nghttp2_map *map, nghttp2_map_key_type key);
/*
* Removes the data associated by the key |key| from the |map|. The
* removed data is not freed by this function.
* nghttp2_map_remove removes the entry associated by the key |key|
* from the |map|. The removed entry is not freed by this function.
*
* This function returns 0 if it succeeds, or one of the following
* negative error codes:
*
* NGHTTP2_ERR_INVALID_ARGUMENT
* The data associated by |key| does not exist.
* The entry associated by |key| does not exist.
*/
int nghttp2_map_remove(nghttp2_map *map, nghttp2_map_key_type key);
/*
* Removes all entries from |map|.
* nghttp2_map_clear removes all entries from |map|. The removed
* entry is not freed by this function.
*/
void nghttp2_map_clear(nghttp2_map *map);
/*
* Returns the number of items stored in the map |map|.
* nghttp2_map_size returns the number of items stored in the map
* |map|.
*/
size_t nghttp2_map_size(nghttp2_map *map);
size_t nghttp2_map_size(const nghttp2_map *map);
/*
* Applies the function |func| to each data in the |map| with the
* optional user supplied pointer |ptr|.
* nghttp2_map_each applies the function |func| to each entry in the
* |map| with the optional user supplied pointer |ptr|.
*
* If the |func| returns 0, this function calls the |func| with the
* next data. If the |func| returns nonzero, it will not call the
* next entry. If the |func| returns nonzero, it will not call the
* |func| for further entries and return the return value of the
* |func| immediately. Thus, this function returns 0 if all the
* invocations of the |func| return 0, or nonzero value which the last
* invocation of |func| returns.
*
* Don't use this function to free each data. Use
* nghttp2_map_each_free() instead.
*/
int nghttp2_map_each(nghttp2_map *map, int (*func)(void *data, void *ptr),
int nghttp2_map_each(const nghttp2_map *map, int (*func)(void *data, void *ptr),
void *ptr);
#ifndef WIN32
void nghttp2_map_print_distance(nghttp2_map *map);
#endif /* !WIN32 */
void nghttp2_map_print_distance(const nghttp2_map *map);
#endif /* !defined(WIN32) */
#endif /* NGHTTP2_MAP_H */
#endif /* !defined(NGHTTP2_MAP_H) */

View File

@@ -27,7 +27,7 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif /* HAVE_CONFIG_H */
#endif /* defined(HAVE_CONFIG_H) */
#include <nghttp2/nghttp2.h>
@@ -42,4 +42,4 @@ void nghttp2_mem_free2(nghttp2_free free_func, void *ptr, void *mem_user_data);
void *nghttp2_mem_calloc(nghttp2_mem *mem, size_t nmemb, size_t size);
void *nghttp2_mem_realloc(nghttp2_mem *mem, void *ptr, size_t size);
#endif /* NGHTTP2_MEM_H */
#endif /* !defined(NGHTTP2_MEM_H) */

View File

@@ -27,28 +27,28 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif /* HAVE_CONFIG_H */
#endif /* defined(HAVE_CONFIG_H) */
#ifdef HAVE_ARPA_INET_H
# include <arpa/inet.h>
#endif /* HAVE_ARPA_INET_H */
#endif /* defined(HAVE_ARPA_INET_H) */
#ifdef HAVE_NETINET_IN_H
# include <netinet/in.h>
#endif /* HAVE_NETINET_IN_H */
#endif /* defined(HAVE_NETINET_IN_H) */
#include <nghttp2/nghttp2.h>
#if defined(WIN32)
#ifdef WIN32
/* Windows requires ws2_32 library for ntonl family functions. We
define inline functions for those function so that we don't have
dependency on that lib. */
# ifdef _MSC_VER
# define STIN static __inline
# else
# else /* !defined(_MSC_VER) */
# define STIN static inline
# endif
# endif /* !defined(_MSC_VER) */
STIN uint32_t htonl(uint32_t hostlong) {
uint32_t res;
@@ -86,6 +86,6 @@ STIN uint16_t ntohs(uint16_t netshort) {
return res;
}
#endif /* WIN32 */
#endif /* defined(WIN32) */
#endif /* NGHTTP2_NET_H */
#endif /* !defined(NGHTTP2_NET_H) */

View File

@@ -132,15 +132,15 @@ void nghttp2_option_set_max_settings(nghttp2_option *option, size_t val) {
}
void nghttp2_option_set_server_fallback_rfc7540_priorities(
nghttp2_option *option, int val) {
nghttp2_option *option, int val) {
option->opt_set_mask |= NGHTTP2_OPT_SERVER_FALLBACK_RFC7540_PRIORITIES;
option->server_fallback_rfc7540_priorities = val;
}
void nghttp2_option_set_no_rfc9113_leading_and_trailing_ws_validation(
nghttp2_option *option, int val) {
nghttp2_option *option, int val) {
option->opt_set_mask |=
NGHTTP2_OPT_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATION;
NGHTTP2_OPT_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATION;
option->no_rfc9113_leading_and_trailing_ws_validation = val;
}
@@ -155,3 +155,10 @@ void nghttp2_option_set_max_continuations(nghttp2_option *option, size_t val) {
option->opt_set_mask |= NGHTTP2_OPT_MAX_CONTINUATIONS;
option->max_continuations = val;
}
void nghttp2_option_set_glitch_rate_limit(nghttp2_option *option,
uint64_t burst, uint64_t rate) {
option->opt_set_mask |= NGHTTP2_OPT_GLITCH_RATE_LIMIT;
option->glitch_burst = burst;
option->glitch_rate = rate;
}

View File

@@ -27,7 +27,7 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif /* HAVE_CONFIG_H */
#endif /* defined(HAVE_CONFIG_H) */
#include <nghttp2/nghttp2.h>
@@ -72,6 +72,7 @@ typedef enum {
NGHTTP2_OPT_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATION = 1 << 14,
NGHTTP2_OPT_STREAM_RESET_RATE_LIMIT = 1 << 15,
NGHTTP2_OPT_MAX_CONTINUATIONS = 1 << 16,
NGHTTP2_OPT_GLITCH_RATE_LIMIT = 1 << 17,
} nghttp2_option_flag;
/**
@@ -83,6 +84,11 @@ struct nghttp2_option {
*/
uint64_t stream_reset_burst;
uint64_t stream_reset_rate;
/**
* NGHTTP2_OPT_GLITCH_RATE_LIMIT
*/
uint64_t glitch_burst;
uint64_t glitch_rate;
/**
* NGHTTP2_OPT_MAX_SEND_HEADER_BLOCK_LENGTH
*/
@@ -154,4 +160,4 @@ struct nghttp2_option {
uint8_t user_recv_ext_types[32];
};
#endif /* NGHTTP2_OPTION_H */
#endif /* !defined(NGHTTP2_OPTION_H) */

View File

@@ -27,7 +27,7 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif /* HAVE_CONFIG_H */
#endif /* defined(HAVE_CONFIG_H) */
#include <nghttp2/nghttp2.h>
#include "nghttp2_frame.h"
@@ -186,4 +186,4 @@ void nghttp2_outbound_queue_pop(nghttp2_outbound_queue *q);
/* Returns the size of the queue */
#define nghttp2_outbound_queue_size(Q) ((Q)->n)
#endif /* NGHTTP2_OUTBOUND_ITEM_H */
#endif /* !defined(NGHTTP2_OUTBOUND_ITEM_H) */

View File

@@ -27,7 +27,7 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif /* HAVE_CONFIG_H */
#endif /* defined(HAVE_CONFIG_H) */
#include <nghttp2/nghttp2.h>
#include "nghttp2_int.h"
@@ -121,4 +121,4 @@ int nghttp2_pq_each(nghttp2_pq *pq, nghttp2_pq_item_cb fun, void *arg);
*/
void nghttp2_pq_remove(nghttp2_pq *pq, nghttp2_pq_entry *item);
#endif /* NGHTTP2_PQ_H */
#endif /* !defined(NGHTTP2_PQ_H) */

View File

@@ -27,7 +27,7 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif /* HAVE_CONFIG_H */
#endif /* defined(HAVE_CONFIG_H) */
#include <nghttp2/nghttp2.h>
@@ -39,4 +39,4 @@
*/
void nghttp2_priority_spec_normalize_weight(nghttp2_priority_spec *pri_spec);
#endif /* NGHTTP2_PRIORITY_SPEC_H */
#endif /* !defined(NGHTTP2_PRIORITY_SPEC_H) */

View File

@@ -46,7 +46,7 @@ void nghttp2_queue_free(nghttp2_queue *queue) {
int nghttp2_queue_push(nghttp2_queue *queue, void *data) {
nghttp2_queue_cell *new_cell =
(nghttp2_queue_cell *)malloc(sizeof(nghttp2_queue_cell));
(nghttp2_queue_cell *)malloc(sizeof(nghttp2_queue_cell));
if (!new_cell) {
return NGHTTP2_ERR_NOMEM;
}

View File

@@ -27,7 +27,7 @@
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif /* HAVE_CONFIG_H */
#endif /* defined(HAVE_CONFIG_H) */
#include <nghttp2/nghttp2.h>
@@ -48,4 +48,4 @@ void *nghttp2_queue_front(nghttp2_queue *queue);
void *nghttp2_queue_back(nghttp2_queue *queue);
int nghttp2_queue_empty(nghttp2_queue *queue);
#endif /* NGHTTP2_QUEUE_H */
#endif /* !defined(NGHTTP2_QUEUE_H) */

View File

@@ -27,7 +27,7 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif /* HAVE_CONFIG_H */
#endif /* defined(HAVE_CONFIG_H) */
#include <nghttp2/nghttp2.h>
@@ -54,4 +54,4 @@ void nghttp2_ratelim_update(nghttp2_ratelim *rl, uint64_t tstamp);
succeeds, or -1. */
int nghttp2_ratelim_drain(nghttp2_ratelim *rl, uint64_t n);
#endif /* NGHTTP2_RATELIM_H */
#endif /* !defined(NGHTTP2_RATELIM_H) */

View File

@@ -27,7 +27,7 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif /* HAVE_CONFIG_H */
#endif /* defined(HAVE_CONFIG_H) */
#include <nghttp2/nghttp2.h>
@@ -77,4 +77,4 @@ int nghttp2_rcbuf_new2(nghttp2_rcbuf **rcbuf_ptr, const uint8_t *src,
*/
void nghttp2_rcbuf_del(nghttp2_rcbuf *rcbuf);
#endif /* NGHTTP2_RCBUF_H */
#endif /* !defined(NGHTTP2_RCBUF_H) */

File diff suppressed because it is too large Load Diff

View File

@@ -27,7 +27,7 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif /* HAVE_CONFIG_H */
#endif /* defined(HAVE_CONFIG_H) */
#include <nghttp2/nghttp2.h>
#include "nghttp2_map.h"
@@ -45,6 +45,8 @@
preface handling. */
extern int nghttp2_enable_strict_preface;
extern nghttp2_stream nghttp2_stream_root;
/*
* Option flags.
*/
@@ -53,8 +55,6 @@ typedef enum {
NGHTTP2_OPTMASK_NO_RECV_CLIENT_MAGIC = 1 << 1,
NGHTTP2_OPTMASK_NO_HTTP_MESSAGING = 1 << 2,
NGHTTP2_OPTMASK_NO_AUTO_PING_ACK = 1 << 3,
NGHTTP2_OPTMASK_NO_CLOSED_STREAMS = 1 << 4,
NGHTTP2_OPTMASK_SERVER_FALLBACK_RFC7540_PRIORITIES = 1 << 5,
NGHTTP2_OPTMASK_NO_RFC9113_LEADING_AND_TRAILING_WS_VALIDATION = 1 << 6,
} nghttp2_optmask;
@@ -89,10 +89,6 @@ typedef struct {
/* The default maximum number of incoming reserved streams */
#define NGHTTP2_MAX_INCOMING_RESERVED_STREAMS 200
/* Even if we have less SETTINGS_MAX_CONCURRENT_STREAMS than this
number, we keep NGHTTP2_MIN_IDLE_STREAMS streams in idle state */
#define NGHTTP2_MIN_IDLE_STREAMS 16
/* The maximum number of items in outbound queue, which is considered
as flooding caused by peer. All frames are not considered here.
We only consider PING + ACK and SETTINGS + ACK. This is because
@@ -110,6 +106,10 @@ typedef struct {
#define NGHTTP2_DEFAULT_STREAM_RESET_BURST 1000
#define NGHTTP2_DEFAULT_STREAM_RESET_RATE 33
/* The default values for glitch rate limiter. */
#define NGHTTP2_DEFAULT_GLITCH_BURST 1000
#define NGHTTP2_DEFAULT_GLITCH_RATE 33
/* The default max number of CONTINUATION frames following an incoming
HEADER frame. */
#define NGHTTP2_DEFAULT_MAX_CONTINUATIONS 8
@@ -205,8 +205,6 @@ typedef struct nghttp2_inflight_settings nghttp2_inflight_settings;
struct nghttp2_session {
nghttp2_map /* <nghttp2_stream*> */ streams;
/* root of dependency tree*/
nghttp2_stream root;
/* Queue for outbound urgent frames (PING and SETTINGS) */
nghttp2_outbound_queue ob_urgent;
/* Queue for non-DATA frames */
@@ -229,26 +227,14 @@ struct nghttp2_session {
/* Memory allocator */
nghttp2_mem mem;
void *user_data;
/* Points to the latest incoming closed stream. NULL if there is no
closed stream. Only used when session is initialized as
server. */
nghttp2_stream *closed_stream_head;
/* Points to the oldest incoming closed stream. NULL if there is no
closed stream. Only used when session is initialized as
server. */
nghttp2_stream *closed_stream_tail;
/* Points to the latest idle stream. NULL if there is no idle
stream. Only used when session is initialized as server .*/
nghttp2_stream *idle_stream_head;
/* Points to the oldest idle stream. NULL if there is no idle
stream. Only used when session is initialized as erver. */
nghttp2_stream *idle_stream_tail;
/* Queue of In-flight SETTINGS values. SETTINGS bearing ACK is not
considered as in-flight. */
nghttp2_inflight_settings *inflight_settings_head;
/* Stream reset rate limiter. If receiving excessive amount of
stream resets, GOAWAY will be sent. */
nghttp2_ratelim stream_reset_ratelim;
/* Rate limiter for all kinds of glitches. */
nghttp2_ratelim glitch_ratelim;
/* Sequential number across all streams to process streams in
FIFO. */
uint64_t stream_seq;
@@ -276,10 +262,9 @@ struct nghttp2_session {
|closed_stream_head|. The current implementation only keeps
incoming streams and session is initialized as server. */
size_t num_closed_streams;
/* The number of idle streams kept in |streams| hash. The idle
streams can be accessed through doubly linked list
|idle_stream_head|. The current implementation only keeps idle
streams if session is initialized as server. */
/* The number of idle streams kept in |streams| hash. The current
implementation only keeps idle streams if session is initialized
as server. */
size_t num_idle_streams;
/* The number of bytes allocated for nvbuf */
size_t nvbuflen;
@@ -362,8 +347,6 @@ struct nghttp2_session {
/* Unacked local SETTINGS_NO_RFC7540_PRIORITIES value, which is
effective before it is acknowledged. */
uint8_t pending_no_rfc7540_priorities;
/* Turn on fallback to RFC 7540 priorities; for server use only. */
uint8_t fallback_rfc7540_priorities;
/* Nonzero if the session is server side. */
uint8_t server;
/* Flags indicating GOAWAY is sent and/or received. The flags are
@@ -425,6 +408,13 @@ int nghttp2_session_is_my_stream_id(nghttp2_session *session,
int nghttp2_session_add_item(nghttp2_session *session,
nghttp2_outbound_item *item);
/*
* This function wraps around nghttp2_session_add_rst_stream_continue
* with continue_without_stream = 1.
*/
int nghttp2_session_add_rst_stream(nghttp2_session *session, int32_t stream_id,
uint32_t error_code);
/*
* Adds RST_STREAM frame for the stream |stream_id| with the error
* code |error_code|. This is a convenient function built on top of
@@ -432,7 +422,9 @@ int nghttp2_session_add_item(nghttp2_session *session,
*
* This function simply returns 0 without adding RST_STREAM frame if
* given stream is in NGHTTP2_STREAM_CLOSING state, because multiple
* RST_STREAM for a stream is redundant.
* RST_STREAM for a stream is redundant. It also returns 0 without
* adding the frame if |continue_without_stream| is nonzero, and
* stream was already gone.
*
* This function returns 0 if it succeeds, or one of the following
* negative error codes:
@@ -440,8 +432,10 @@ int nghttp2_session_add_item(nghttp2_session *session,
* NGHTTP2_ERR_NOMEM
* Out of memory.
*/
int nghttp2_session_add_rst_stream(nghttp2_session *session, int32_t stream_id,
uint32_t error_code);
int nghttp2_session_add_rst_stream_continue(nghttp2_session *session,
int32_t stream_id,
uint32_t error_code,
int continue_without_stream);
/*
* Adds PING frame. This is a convenient function built on top of
@@ -527,15 +521,9 @@ int nghttp2_session_add_settings(nghttp2_session *session, uint8_t flags,
*
* This function returns a pointer to created new stream object, or
* NULL.
*
* This function adjusts neither the number of closed streams or idle
* streams. The caller should manually call
* nghttp2_session_adjust_closed_stream() or
* nghttp2_session_adjust_idle_stream() respectively.
*/
nghttp2_stream *nghttp2_session_open_stream(nghttp2_session *session,
int32_t stream_id, uint8_t flags,
nghttp2_priority_spec *pri_spec,
nghttp2_stream_state initial_state,
void *stream_user_data);
@@ -544,11 +532,6 @@ nghttp2_stream *nghttp2_session_open_stream(nghttp2_session *session,
* is indicated by the |error_code|. When closing the stream,
* on_stream_close_callback will be called.
*
* If the session is initialized as server and |stream| is incoming
* stream, stream is just marked closed and this function calls
* nghttp2_session_keep_closed_stream() with |stream|. Otherwise,
* |stream| will be deleted from memory.
*
* This function returns 0 if it succeeds, or one the following
* negative error codes:
*
@@ -565,63 +548,9 @@ int nghttp2_session_close_stream(nghttp2_session *session, int32_t stream_id,
/*
* Deletes |stream| from memory. After this function returns, stream
* cannot be accessed.
*
* This function returns 0 if it succeeds, or one the following
* negative error codes:
*
* NGHTTP2_ERR_NOMEM
* Out of memory
*/
int nghttp2_session_destroy_stream(nghttp2_session *session,
nghttp2_stream *stream);
/*
* Tries to keep incoming closed stream |stream|. Due to the
* limitation of maximum number of streams in memory, |stream| is not
* closed and just deleted from memory (see
* nghttp2_session_destroy_stream).
*/
void nghttp2_session_keep_closed_stream(nghttp2_session *session,
nghttp2_stream *stream);
/*
* Appends |stream| to linked list |session->idle_stream_head|. We
* apply fixed limit for list size. To fit into that limit, one or
* more oldest streams are removed from list as necessary.
*/
void nghttp2_session_keep_idle_stream(nghttp2_session *session,
nghttp2_stream *stream);
/*
* Detaches |stream| from idle streams linked list.
*/
void nghttp2_session_detach_idle_stream(nghttp2_session *session,
nghttp2_stream *stream);
/*
* Deletes closed stream to ensure that number of incoming streams
* including active and closed is in the maximum number of allowed
* stream.
*
* This function returns 0 if it succeeds, or one the following
* negative error codes:
*
* NGHTTP2_ERR_NOMEM
* Out of memory
*/
int nghttp2_session_adjust_closed_stream(nghttp2_session *session);
/*
* Deletes idle stream to ensure that number of idle streams is in
* certain limit.
*
* This function returns 0 if it succeeds, or one the following
* negative error codes:
*
* NGHTTP2_ERR_NOMEM
* Out of memory
*/
int nghttp2_session_adjust_idle_stream(nghttp2_session *session);
void nghttp2_session_destroy_stream(nghttp2_session *session,
nghttp2_stream *stream);
/*
* If further receptions and transmissions over the stream |stream_id|
@@ -915,24 +844,6 @@ int nghttp2_session_update_local_settings(nghttp2_session *session,
nghttp2_settings_entry *iv,
size_t niv);
/*
* Re-prioritize |stream|. The new priority specification is
* |pri_spec|. Caller must ensure that stream->hd.stream_id !=
* pri_spec->stream_id.
*
* This function does not adjust the number of idle streams. The
* caller should call nghttp2_session_adjust_idle_stream() later.
*
* This function returns 0 if it succeeds, or one of the following
* negative error codes:
*
* NGHTTP2_ERR_NOMEM
* Out of memory
*/
int nghttp2_session_reprioritize_stream(nghttp2_session *session,
nghttp2_stream *stream,
const nghttp2_priority_spec *pri_spec);
/*
* Terminates current |session| with the |error_code|. The |reason|
* is NULL-terminated debug string.
@@ -981,4 +892,4 @@ int nghttp2_session_update_recv_stream_window_size(nghttp2_session *session,
size_t delta_size,
int send_window_update);
#endif /* NGHTTP2_SESSION_H */
#endif /* !defined(NGHTTP2_SESSION_H) */

View File

@@ -25,45 +25,17 @@
#include "nghttp2_stream.h"
#include <assert.h>
#include <stdio.h>
#include "nghttp2_session.h"
#include "nghttp2_helper.h"
#include "nghttp2_debug.h"
#include "nghttp2_frame.h"
/* Maximum distance between any two stream's cycle in the same
priority queue. Imagine stream A's cycle is A, and stream B's
cycle is B, and A < B. The cycle is unsigned 32 bit integer, it
may get overflow. Because of how we calculate the next cycle
value, if B - A is less than or equals to
NGHTTP2_MAX_CYCLE_DISTANCE, A and B are in the same scale, in other
words, B is really greater than or equal to A. Otherwise, A is a
result of overflow, and it is actually A > B if we consider that
fact. */
#define NGHTTP2_MAX_CYCLE_DISTANCE \
((uint64_t)NGHTTP2_MAX_FRAME_SIZE_MAX * 256 + 255)
static int stream_less(const void *lhsx, const void *rhsx) {
const nghttp2_stream *lhs, *rhs;
lhs = nghttp2_struct_of(lhsx, nghttp2_stream, pq_entry);
rhs = nghttp2_struct_of(rhsx, nghttp2_stream, pq_entry);
if (lhs->cycle == rhs->cycle) {
return lhs->seq < rhs->seq;
}
return rhs->cycle - lhs->cycle <= NGHTTP2_MAX_CYCLE_DISTANCE;
}
void nghttp2_stream_init(nghttp2_stream *stream, int32_t stream_id,
uint8_t flags, nghttp2_stream_state initial_state,
int32_t weight, int32_t remote_initial_window_size,
int32_t remote_initial_window_size,
int32_t local_initial_window_size,
void *stream_user_data, nghttp2_mem *mem) {
nghttp2_pq_init(&stream->obq, stream_less, mem);
void *stream_user_data) {
stream->stream_id = stream_id;
stream->flags = flags;
stream->state = initial_state;
@@ -77,428 +49,36 @@ void nghttp2_stream_init(nghttp2_stream *stream, int32_t stream_id,
stream->recv_reduction = 0;
stream->window_update_queued = 0;
stream->dep_prev = NULL;
stream->dep_next = NULL;
stream->sib_prev = NULL;
stream->sib_next = NULL;
stream->closed_prev = NULL;
stream->closed_next = NULL;
stream->weight = weight;
stream->sum_dep_weight = 0;
stream->http_flags = NGHTTP2_HTTP_FLAG_NONE;
stream->content_length = -1;
stream->recv_content_length = 0;
stream->status_code = -1;
stream->queued = 0;
stream->descendant_last_cycle = 0;
stream->cycle = 0;
stream->pending_penalty = 0;
stream->descendant_next_seq = 0;
stream->seq = 0;
stream->last_writelen = 0;
stream->extpri = stream->http_extpri = NGHTTP2_EXTPRI_DEFAULT_URGENCY;
}
void nghttp2_stream_free(nghttp2_stream *stream) {
nghttp2_pq_free(&stream->obq);
/* We don't free stream->item. If it is assigned to aob, then
active_outbound_item_reset() will delete it. Otherwise,
nghttp2_stream_close() or session_del() will delete it. */
}
void nghttp2_stream_free(nghttp2_stream *stream) { (void)stream; }
void nghttp2_stream_shutdown(nghttp2_stream *stream, nghttp2_shut_flag flag) {
stream->shut_flags = (uint8_t)(stream->shut_flags | flag);
}
/*
* Returns nonzero if |stream| is active. This function does not take
* into account its descendants.
*/
static int stream_active(nghttp2_stream *stream) {
return stream->item &&
(stream->flags & NGHTTP2_STREAM_FLAG_DEFERRED_ALL) == 0;
}
/*
* Returns nonzero if |stream| or one of its descendants is active
*/
static int stream_subtree_active(nghttp2_stream *stream) {
return stream_active(stream) || !nghttp2_pq_empty(&stream->obq);
}
/*
* Returns next cycle for |stream|.
*/
static void stream_next_cycle(nghttp2_stream *stream, uint64_t last_cycle) {
uint64_t penalty;
penalty = (uint64_t)stream->last_writelen * NGHTTP2_MAX_WEIGHT +
stream->pending_penalty;
stream->cycle = last_cycle + penalty / (uint32_t)stream->weight;
stream->pending_penalty = (uint32_t)(penalty % (uint32_t)stream->weight);
}
static int stream_obq_push(nghttp2_stream *dep_stream, nghttp2_stream *stream) {
int rv;
for (; dep_stream && !stream->queued;
stream = dep_stream, dep_stream = dep_stream->dep_prev) {
stream_next_cycle(stream, dep_stream->descendant_last_cycle);
stream->seq = dep_stream->descendant_next_seq++;
DEBUGF("stream: stream=%d obq push cycle=%lu\n", stream->stream_id,
stream->cycle);
DEBUGF("stream: push stream %d to stream %d\n", stream->stream_id,
dep_stream->stream_id);
rv = nghttp2_pq_push(&dep_stream->obq, &stream->pq_entry);
if (rv != 0) {
return rv;
}
stream->queued = 1;
}
return 0;
}
/*
* Removes |stream| from parent's obq. If removal of |stream| makes
* parent's obq empty, and parent is not active, then parent is also
* removed. This process is repeated recursively.
*/
static void stream_obq_remove(nghttp2_stream *stream) {
nghttp2_stream *dep_stream;
dep_stream = stream->dep_prev;
if (!stream->queued) {
return;
}
for (; dep_stream; stream = dep_stream, dep_stream = dep_stream->dep_prev) {
DEBUGF("stream: remove stream %d from stream %d\n", stream->stream_id,
dep_stream->stream_id);
nghttp2_pq_remove(&dep_stream->obq, &stream->pq_entry);
assert(stream->queued);
stream->queued = 0;
stream->cycle = 0;
stream->pending_penalty = 0;
stream->descendant_last_cycle = 0;
stream->last_writelen = 0;
if (stream_subtree_active(dep_stream)) {
return;
}
}
}
/*
* Moves |stream| from |src|'s obq to |dest|'s obq. Removal from
* |src|'s obq is just done calling nghttp2_pq_remove(), so it does
* not recursively remove |src| and ancestors, like
* stream_obq_remove().
*/
static int stream_obq_move(nghttp2_stream *dest, nghttp2_stream *src,
nghttp2_stream *stream) {
if (!stream->queued) {
return 0;
}
DEBUGF("stream: remove stream %d from stream %d (move)\n", stream->stream_id,
src->stream_id);
nghttp2_pq_remove(&src->obq, &stream->pq_entry);
stream->queued = 0;
return stream_obq_push(dest, stream);
}
void nghttp2_stream_reschedule(nghttp2_stream *stream) {
nghttp2_stream *dep_stream;
assert(stream->queued);
dep_stream = stream->dep_prev;
for (; dep_stream; stream = dep_stream, dep_stream = dep_stream->dep_prev) {
nghttp2_pq_remove(&dep_stream->obq, &stream->pq_entry);
stream_next_cycle(stream, dep_stream->descendant_last_cycle);
stream->seq = dep_stream->descendant_next_seq++;
nghttp2_pq_push(&dep_stream->obq, &stream->pq_entry);
DEBUGF("stream: stream=%d obq resched cycle=%lu\n", stream->stream_id,
stream->cycle);
dep_stream->last_writelen = stream->last_writelen;
}
}
void nghttp2_stream_change_weight(nghttp2_stream *stream, int32_t weight) {
nghttp2_stream *dep_stream;
uint64_t last_cycle;
int32_t old_weight;
uint64_t wlen_penalty;
if (stream->weight == weight) {
return;
}
old_weight = stream->weight;
stream->weight = weight;
dep_stream = stream->dep_prev;
if (!dep_stream) {
return;
}
dep_stream->sum_dep_weight += weight - old_weight;
if (!stream->queued) {
return;
}
nghttp2_pq_remove(&dep_stream->obq, &stream->pq_entry);
wlen_penalty = (uint64_t)stream->last_writelen * NGHTTP2_MAX_WEIGHT;
/* Compute old stream->pending_penalty we used to calculate
stream->cycle */
stream->pending_penalty =
(uint32_t)((stream->pending_penalty + (uint32_t)old_weight -
(wlen_penalty % (uint32_t)old_weight)) %
(uint32_t)old_weight);
last_cycle = stream->cycle -
(wlen_penalty + stream->pending_penalty) / (uint32_t)old_weight;
/* Now we have old stream->pending_penalty and new stream->weight in
place */
stream_next_cycle(stream, last_cycle);
if (dep_stream->descendant_last_cycle - stream->cycle <=
NGHTTP2_MAX_CYCLE_DISTANCE) {
stream->cycle = dep_stream->descendant_last_cycle;
}
/* Continue to use same stream->seq */
nghttp2_pq_push(&dep_stream->obq, &stream->pq_entry);
DEBUGF("stream: stream=%d obq resched cycle=%lu\n", stream->stream_id,
stream->cycle);
}
static nghttp2_stream *stream_last_sib(nghttp2_stream *stream) {
for (; stream->sib_next; stream = stream->sib_next)
;
return stream;
}
int32_t nghttp2_stream_dep_distributed_weight(nghttp2_stream *stream,
int32_t weight) {
weight = stream->weight * weight / stream->sum_dep_weight;
return nghttp2_max_int32(1, weight);
}
#ifdef STREAM_DEP_DEBUG
static void ensure_inactive(nghttp2_stream *stream) {
nghttp2_stream *si;
if (stream->queued) {
fprintf(stderr, "stream(%p)=%d, stream->queued = 1; want 0\n", stream,
stream->stream_id);
assert(0);
}
if (stream_active(stream)) {
fprintf(stderr, "stream(%p)=%d, stream_active(stream) = 1; want 0\n",
stream, stream->stream_id);
assert(0);
}
if (!nghttp2_pq_empty(&stream->obq)) {
fprintf(stderr, "stream(%p)=%d, nghttp2_pq_size() = %zu; want 0\n", stream,
stream->stream_id, nghttp2_pq_size(&stream->obq));
assert(0);
}
for (si = stream->dep_next; si; si = si->sib_next) {
ensure_inactive(si);
}
}
static void check_queued(nghttp2_stream *stream) {
nghttp2_stream *si;
int queued;
if (stream->queued) {
if (!stream_subtree_active(stream)) {
fprintf(stderr,
"stream(%p)=%d, stream->queued == 1, but "
"stream_active() == %d and nghttp2_pq_size(&stream->obq) = %zu\n",
stream, stream->stream_id, stream_active(stream),
nghttp2_pq_size(&stream->obq));
assert(0);
}
if (!stream_active(stream)) {
queued = 0;
for (si = stream->dep_next; si; si = si->sib_next) {
if (si->queued) {
++queued;
}
}
if (queued == 0) {
fprintf(stderr,
"stream(%p)=%d, stream->queued == 1, and "
"!stream_active(), but no descendants is queued\n",
stream, stream->stream_id);
assert(0);
}
}
for (si = stream->dep_next; si; si = si->sib_next) {
check_queued(si);
}
} else {
if (stream_active(stream) || !nghttp2_pq_empty(&stream->obq)) {
fprintf(stderr,
"stream(%p) = %d, stream->queued == 0, but "
"stream_active(stream) == %d and "
"nghttp2_pq_size(&stream->obq) = %zu\n",
stream, stream->stream_id, stream_active(stream),
nghttp2_pq_size(&stream->obq));
assert(0);
}
for (si = stream->dep_next; si; si = si->sib_next) {
ensure_inactive(si);
}
}
}
static void check_sum_dep(nghttp2_stream *stream) {
nghttp2_stream *si;
int32_t n = 0;
for (si = stream->dep_next; si; si = si->sib_next) {
n += si->weight;
}
if (n != stream->sum_dep_weight) {
fprintf(stderr, "stream(%p)=%d, sum_dep_weight = %d; want %d\n", stream,
stream->stream_id, n, stream->sum_dep_weight);
assert(0);
}
for (si = stream->dep_next; si; si = si->sib_next) {
check_sum_dep(si);
}
}
static void check_dep_prev(nghttp2_stream *stream) {
nghttp2_stream *si;
for (si = stream->dep_next; si; si = si->sib_next) {
if (si->dep_prev != stream) {
fprintf(stderr, "si->dep_prev = %p; want %p\n", si->dep_prev, stream);
assert(0);
}
check_dep_prev(si);
}
}
#endif /* STREAM_DEP_DEBUG */
#ifdef STREAM_DEP_DEBUG
static void validate_tree(nghttp2_stream *stream) {
nghttp2_stream *si;
if (!stream) {
return;
}
for (; stream->dep_prev; stream = stream->dep_prev)
;
assert(stream->stream_id == 0);
assert(!stream->queued);
fprintf(stderr, "checking...\n");
if (nghttp2_pq_empty(&stream->obq)) {
fprintf(stderr, "root obq empty\n");
for (si = stream->dep_next; si; si = si->sib_next) {
ensure_inactive(si);
}
} else {
for (si = stream->dep_next; si; si = si->sib_next) {
check_queued(si);
}
}
check_sum_dep(stream);
check_dep_prev(stream);
}
#else /* !STREAM_DEP_DEBUG */
static void validate_tree(nghttp2_stream *stream) { (void)stream; }
#endif /* !STREAM_DEP_DEBUG*/
static int stream_update_dep_on_attach_item(nghttp2_stream *stream) {
int rv;
rv = stream_obq_push(stream->dep_prev, stream);
if (rv != 0) {
return rv;
}
validate_tree(stream);
return 0;
}
static void stream_update_dep_on_detach_item(nghttp2_stream *stream) {
if (nghttp2_pq_empty(&stream->obq)) {
stream_obq_remove(stream);
}
validate_tree(stream);
}
int nghttp2_stream_attach_item(nghttp2_stream *stream,
nghttp2_outbound_item *item) {
int rv;
void nghttp2_stream_attach_item(nghttp2_stream *stream,
nghttp2_outbound_item *item) {
assert((stream->flags & NGHTTP2_STREAM_FLAG_DEFERRED_ALL) == 0);
assert(stream->item == NULL);
DEBUGF("stream: stream=%d attach item=%p\n", stream->stream_id, item);
stream->item = item;
if (stream->flags & NGHTTP2_STREAM_FLAG_NO_RFC7540_PRIORITIES) {
return 0;
}
rv = stream_update_dep_on_attach_item(stream);
if (rv != 0) {
/* This may relave stream->queued == 1, but stream->item == NULL.
But only consequence of this error is fatal one, and session
destruction. In that execution path, these inconsistency does
not matter. */
stream->item = NULL;
return rv;
}
return 0;
}
void nghttp2_stream_detach_item(nghttp2_stream *stream) {
@@ -506,12 +86,6 @@ void nghttp2_stream_detach_item(nghttp2_stream *stream) {
stream->item = NULL;
stream->flags = (uint8_t)(stream->flags & ~NGHTTP2_STREAM_FLAG_DEFERRED_ALL);
if (stream->flags & NGHTTP2_STREAM_FLAG_NO_RFC7540_PRIORITIES) {
return;
}
stream_update_dep_on_detach_item(stream);
}
void nghttp2_stream_defer_item(nghttp2_stream *stream, uint8_t flags) {
@@ -521,31 +95,16 @@ void nghttp2_stream_defer_item(nghttp2_stream *stream, uint8_t flags) {
stream->item, flags);
stream->flags |= flags;
if (stream->flags & NGHTTP2_STREAM_FLAG_NO_RFC7540_PRIORITIES) {
return;
}
stream_update_dep_on_detach_item(stream);
}
int nghttp2_stream_resume_deferred_item(nghttp2_stream *stream, uint8_t flags) {
void nghttp2_stream_resume_deferred_item(nghttp2_stream *stream,
uint8_t flags) {
assert(stream->item);
DEBUGF("stream: stream=%d resume item=%p flags=%02x\n", stream->stream_id,
stream->item, flags);
stream->flags = (uint8_t)(stream->flags & ~flags);
if (stream->flags & NGHTTP2_STREAM_FLAG_DEFERRED_ALL) {
return 0;
}
if (stream->flags & NGHTTP2_STREAM_FLAG_NO_RFC7540_PRIORITIES) {
return 0;
}
return stream_update_dep_on_attach_item(stream);
}
int nghttp2_stream_check_deferred_item(nghttp2_stream *stream) {
@@ -571,16 +130,16 @@ static int update_initial_window_size(int32_t *window_size_ptr,
}
int nghttp2_stream_update_remote_initial_window_size(
nghttp2_stream *stream, int32_t new_initial_window_size,
int32_t old_initial_window_size) {
nghttp2_stream *stream, int32_t new_initial_window_size,
int32_t old_initial_window_size) {
return update_initial_window_size(&stream->remote_window_size,
new_initial_window_size,
old_initial_window_size);
}
int nghttp2_stream_update_local_initial_window_size(
nghttp2_stream *stream, int32_t new_initial_window_size,
int32_t old_initial_window_size) {
nghttp2_stream *stream, int32_t new_initial_window_size,
int32_t old_initial_window_size) {
return update_initial_window_size(&stream->local_window_size,
new_initial_window_size,
old_initial_window_size);
@@ -591,373 +150,11 @@ void nghttp2_stream_promise_fulfilled(nghttp2_stream *stream) {
stream->flags = (uint8_t)(stream->flags & ~NGHTTP2_STREAM_FLAG_PUSH);
}
int nghttp2_stream_dep_find_ancestor(nghttp2_stream *stream,
nghttp2_stream *target) {
for (; stream; stream = stream->dep_prev) {
if (stream == target) {
return 1;
}
}
return 0;
}
int nghttp2_stream_dep_insert(nghttp2_stream *dep_stream,
nghttp2_stream *stream) {
nghttp2_stream *si;
int rv;
DEBUGF("stream: dep_insert dep_stream(%p)=%d, stream(%p)=%d\n", dep_stream,
dep_stream->stream_id, stream, stream->stream_id);
stream->sum_dep_weight = dep_stream->sum_dep_weight;
dep_stream->sum_dep_weight = stream->weight;
if (dep_stream->dep_next) {
for (si = dep_stream->dep_next; si; si = si->sib_next) {
si->dep_prev = stream;
if (si->queued) {
rv = stream_obq_move(stream, dep_stream, si);
if (rv != 0) {
return rv;
}
}
}
if (stream_subtree_active(stream)) {
rv = stream_obq_push(dep_stream, stream);
if (rv != 0) {
return rv;
}
}
stream->dep_next = dep_stream->dep_next;
}
dep_stream->dep_next = stream;
stream->dep_prev = dep_stream;
validate_tree(stream);
return 0;
}
static void set_dep_prev(nghttp2_stream *stream, nghttp2_stream *dep) {
for (; stream; stream = stream->sib_next) {
stream->dep_prev = dep;
}
}
static void link_dep(nghttp2_stream *dep_stream, nghttp2_stream *stream) {
dep_stream->dep_next = stream;
if (stream) {
stream->dep_prev = dep_stream;
}
}
static void link_sib(nghttp2_stream *a, nghttp2_stream *b) {
a->sib_next = b;
if (b) {
b->sib_prev = a;
}
}
static void insert_link_dep(nghttp2_stream *dep_stream,
nghttp2_stream *stream) {
nghttp2_stream *sib_next;
assert(stream->sib_prev == NULL);
sib_next = dep_stream->dep_next;
link_sib(stream, sib_next);
link_dep(dep_stream, stream);
}
static void unlink_sib(nghttp2_stream *stream) {
nghttp2_stream *prev, *next, *dep_next;
prev = stream->sib_prev;
dep_next = stream->dep_next;
assert(prev);
if (dep_next) {
/*
* prev--stream(--sib_next--...)
* |
* dep_next
*/
link_sib(prev, dep_next);
set_dep_prev(dep_next, stream->dep_prev);
if (stream->sib_next) {
link_sib(stream_last_sib(dep_next), stream->sib_next);
}
} else {
/*
* prev--stream(--sib_next--...)
*/
next = stream->sib_next;
prev->sib_next = next;
if (next) {
next->sib_prev = prev;
}
}
}
static void unlink_dep(nghttp2_stream *stream) {
nghttp2_stream *prev, *next, *dep_next;
prev = stream->dep_prev;
dep_next = stream->dep_next;
assert(prev);
if (dep_next) {
/*
* prev
* |
* stream(--sib_next--...)
* |
* dep_next
*/
link_dep(prev, dep_next);
set_dep_prev(dep_next, stream->dep_prev);
if (stream->sib_next) {
link_sib(stream_last_sib(dep_next), stream->sib_next);
}
} else if (stream->sib_next) {
/*
* prev
* |
* stream--sib_next
*/
next = stream->sib_next;
next->sib_prev = NULL;
link_dep(prev, next);
} else {
prev->dep_next = NULL;
}
}
void nghttp2_stream_dep_add(nghttp2_stream *dep_stream,
nghttp2_stream *stream) {
DEBUGF("stream: dep_add dep_stream(%p)=%d, stream(%p)=%d\n", dep_stream,
dep_stream->stream_id, stream, stream->stream_id);
dep_stream->sum_dep_weight += stream->weight;
if (dep_stream->dep_next == NULL) {
link_dep(dep_stream, stream);
} else {
insert_link_dep(dep_stream, stream);
}
validate_tree(stream);
}
int nghttp2_stream_dep_remove(nghttp2_stream *stream) {
nghttp2_stream *dep_prev, *si;
int32_t sum_dep_weight_delta;
int rv;
DEBUGF("stream: dep_remove stream(%p)=%d\n", stream, stream->stream_id);
/* Distribute weight of |stream| to direct descendants */
sum_dep_weight_delta = -stream->weight;
for (si = stream->dep_next; si; si = si->sib_next) {
si->weight = nghttp2_stream_dep_distributed_weight(stream, si->weight);
sum_dep_weight_delta += si->weight;
if (si->queued) {
rv = stream_obq_move(stream->dep_prev, stream, si);
if (rv != 0) {
return rv;
}
}
}
assert(stream->dep_prev);
dep_prev = stream->dep_prev;
dep_prev->sum_dep_weight += sum_dep_weight_delta;
if (stream->queued) {
stream_obq_remove(stream);
}
if (stream->sib_prev) {
unlink_sib(stream);
} else {
unlink_dep(stream);
}
stream->sum_dep_weight = 0;
stream->dep_prev = NULL;
stream->dep_next = NULL;
stream->sib_prev = NULL;
stream->sib_next = NULL;
validate_tree(dep_prev);
return 0;
}
int nghttp2_stream_dep_insert_subtree(nghttp2_stream *dep_stream,
nghttp2_stream *stream) {
nghttp2_stream *last_sib;
nghttp2_stream *dep_next;
nghttp2_stream *si;
int rv;
DEBUGF("stream: dep_insert_subtree dep_stream(%p)=%d stream(%p)=%d\n",
dep_stream, dep_stream->stream_id, stream, stream->stream_id);
stream->sum_dep_weight += dep_stream->sum_dep_weight;
dep_stream->sum_dep_weight = stream->weight;
if (dep_stream->dep_next) {
dep_next = dep_stream->dep_next;
link_dep(dep_stream, stream);
if (stream->dep_next) {
last_sib = stream_last_sib(stream->dep_next);
link_sib(last_sib, dep_next);
} else {
link_dep(stream, dep_next);
}
for (si = dep_next; si; si = si->sib_next) {
si->dep_prev = stream;
if (si->queued) {
rv = stream_obq_move(stream, dep_stream, si);
if (rv != 0) {
return rv;
}
}
}
} else {
link_dep(dep_stream, stream);
}
if (stream_subtree_active(stream)) {
rv = stream_obq_push(dep_stream, stream);
if (rv != 0) {
return rv;
}
}
validate_tree(dep_stream);
return 0;
}
int nghttp2_stream_dep_add_subtree(nghttp2_stream *dep_stream,
nghttp2_stream *stream) {
int rv;
DEBUGF("stream: dep_add_subtree dep_stream(%p)=%d stream(%p)=%d\n",
dep_stream, dep_stream->stream_id, stream, stream->stream_id);
dep_stream->sum_dep_weight += stream->weight;
if (dep_stream->dep_next) {
insert_link_dep(dep_stream, stream);
} else {
link_dep(dep_stream, stream);
}
if (stream_subtree_active(stream)) {
rv = stream_obq_push(dep_stream, stream);
if (rv != 0) {
return rv;
}
}
validate_tree(dep_stream);
return 0;
}
void nghttp2_stream_dep_remove_subtree(nghttp2_stream *stream) {
nghttp2_stream *next, *dep_prev;
DEBUGF("stream: dep_remove_subtree stream(%p)=%d\n", stream,
stream->stream_id);
assert(stream->dep_prev);
dep_prev = stream->dep_prev;
if (stream->sib_prev) {
link_sib(stream->sib_prev, stream->sib_next);
} else {
next = stream->sib_next;
link_dep(dep_prev, next);
if (next) {
next->sib_prev = NULL;
}
}
dep_prev->sum_dep_weight -= stream->weight;
if (stream->queued) {
stream_obq_remove(stream);
}
validate_tree(dep_prev);
stream->sib_prev = NULL;
stream->sib_next = NULL;
stream->dep_prev = NULL;
}
int nghttp2_stream_in_dep_tree(nghttp2_stream *stream) {
return stream->dep_prev || stream->dep_next || stream->sib_prev ||
stream->sib_next;
}
nghttp2_outbound_item *
nghttp2_stream_next_outbound_item(nghttp2_stream *stream) {
nghttp2_pq_entry *ent;
nghttp2_stream *si;
for (;;) {
if (stream_active(stream)) {
/* Update ascendant's descendant_last_cycle here, so that we can
assure that new stream is scheduled based on it. */
for (si = stream; si->dep_prev; si = si->dep_prev) {
si->dep_prev->descendant_last_cycle = si->cycle;
}
return stream->item;
}
ent = nghttp2_pq_top(&stream->obq);
if (!ent) {
return NULL;
}
stream = nghttp2_struct_of(ent, nghttp2_stream, pq_entry);
}
}
nghttp2_stream_proto_state nghttp2_stream_get_state(nghttp2_stream *stream) {
if (stream == &nghttp2_stream_root) {
return NGHTTP2_STREAM_STATE_IDLE;
}
if (stream->flags & NGHTTP2_STREAM_FLAG_CLOSED) {
return NGHTTP2_STREAM_STATE_CLOSED;
}
@@ -988,27 +185,39 @@ nghttp2_stream_proto_state nghttp2_stream_get_state(nghttp2_stream *stream) {
}
nghttp2_stream *nghttp2_stream_get_parent(nghttp2_stream *stream) {
return stream->dep_prev;
(void)stream;
return NULL;
}
nghttp2_stream *nghttp2_stream_get_next_sibling(nghttp2_stream *stream) {
return stream->sib_next;
(void)stream;
return NULL;
}
nghttp2_stream *nghttp2_stream_get_previous_sibling(nghttp2_stream *stream) {
return stream->sib_prev;
(void)stream;
return NULL;
}
nghttp2_stream *nghttp2_stream_get_first_child(nghttp2_stream *stream) {
return stream->dep_next;
(void)stream;
return NULL;
}
int32_t nghttp2_stream_get_weight(nghttp2_stream *stream) {
return stream->weight;
(void)stream;
return NGHTTP2_DEFAULT_WEIGHT;
}
int32_t nghttp2_stream_get_sum_dependency_weight(nghttp2_stream *stream) {
return stream->sum_dep_weight;
(void)stream;
return 0;
}
int32_t nghttp2_stream_get_stream_id(nghttp2_stream *stream) {

View File

@@ -27,7 +27,7 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif /* HAVE_CONFIG_H */
#endif /* defined(HAVE_CONFIG_H) */
#include <nghttp2/nghttp2.h>
#include "nghttp2_outbound_item.h"
@@ -91,9 +91,6 @@ typedef enum {
/* bitwise OR of NGHTTP2_STREAM_FLAG_DEFERRED_FLOW_CONTROL and
NGHTTP2_STREAM_FLAG_DEFERRED_USER. */
NGHTTP2_STREAM_FLAG_DEFERRED_ALL = 0x0c,
/* Indicates that this stream is not subject to RFC7540
priorities scheme. */
NGHTTP2_STREAM_FLAG_NO_RFC7540_PRIORITIES = 0x10,
/* Ignore client RFC 9218 priority signal. */
NGHTTP2_STREAM_FLAG_IGNORE_CLIENT_PRIORITIES = 0x20,
/* Indicates that RFC 9113 leading and trailing white spaces
@@ -124,10 +121,9 @@ typedef enum {
NGHTTP2_HTTP_FLAG_METH_HEAD = 1 << 8,
NGHTTP2_HTTP_FLAG_METH_OPTIONS = 1 << 9,
NGHTTP2_HTTP_FLAG_METH_UPGRADE_WORKAROUND = 1 << 10,
NGHTTP2_HTTP_FLAG_METH_ALL = NGHTTP2_HTTP_FLAG_METH_CONNECT |
NGHTTP2_HTTP_FLAG_METH_HEAD |
NGHTTP2_HTTP_FLAG_METH_OPTIONS |
NGHTTP2_HTTP_FLAG_METH_UPGRADE_WORKAROUND,
NGHTTP2_HTTP_FLAG_METH_ALL =
NGHTTP2_HTTP_FLAG_METH_CONNECT | NGHTTP2_HTTP_FLAG_METH_HEAD |
NGHTTP2_HTTP_FLAG_METH_OPTIONS | NGHTTP2_HTTP_FLAG_METH_UPGRADE_WORKAROUND,
/* :path category */
/* path starts with "/" */
NGHTTP2_HTTP_FLAG_PATH_REGULAR = 1 << 11,
@@ -147,39 +143,18 @@ typedef enum {
} nghttp2_http_flag;
struct nghttp2_stream {
/* Entry for dep_prev->obq */
nghttp2_stream_state state;
nghttp2_pq_entry pq_entry;
/* Priority Queue storing direct descendant (nghttp2_stream). Only
streams which itself has some data to send, or has a descendant
which has some data to sent. */
nghttp2_pq obq;
/* Content-Length of request/response body. -1 if unknown. */
int64_t content_length;
/* Received body so far */
int64_t recv_content_length;
/* Base last_cycle for direct descendent streams. */
uint64_t descendant_last_cycle;
/* Next scheduled time to sent item */
uint64_t cycle;
/* Next seq used for direct descendant streams */
uint64_t descendant_next_seq;
/* Secondary key for prioritization to break a tie for cycle. This
value is monotonically increased for single parent stream. */
uint64_t seq;
/* pointers to form dependency tree. If multiple streams depend on
a stream, only one stream (left most) has non-NULL dep_prev which
points to the stream it depends on. The remaining streams are
linked using sib_prev and sib_next. The stream which has
non-NULL dep_prev always NULL sib_prev. The right most stream
has NULL sib_next. If this stream is a root of dependency tree,
dep_prev and sib_prev are NULL. */
nghttp2_stream *dep_prev, *dep_next;
nghttp2_stream *sib_prev, *sib_next;
/* When stream is kept after closure, it may be kept in doubly
linked list pointed by nghttp2_session closed_stream_head.
closed_next points to the next stream object if it is the element
of the list. */
nghttp2_stream *closed_prev, *closed_next;
nghttp2_stream *closed_next;
/* The arbitrary data provided by user for this stream. */
void *stream_user_data;
/* Item to send */
@@ -206,13 +181,8 @@ struct nghttp2_stream {
NGHTTP2_INITIAL_WINDOW_SIZE and could be increased/decreased by
submitting WINDOW_UPDATE. See nghttp2_submit_window_update(). */
int32_t local_window_size;
/* weight of this stream */
int32_t weight;
/* This is unpaid penalty (offset) when calculating cycle. */
uint32_t pending_penalty;
/* sum of weight of direct descendants */
int32_t sum_dep_weight;
nghttp2_stream_state state;
/* status code from remote server */
int16_t status_code;
/* Bitwise OR of zero or more nghttp2_http_flag values */
@@ -240,9 +210,9 @@ struct nghttp2_stream {
void nghttp2_stream_init(nghttp2_stream *stream, int32_t stream_id,
uint8_t flags, nghttp2_stream_state initial_state,
int32_t weight, int32_t remote_initial_window_size,
int32_t remote_initial_window_size,
int32_t local_initial_window_size,
void *stream_user_data, nghttp2_mem *mem);
void *stream_user_data);
void nghttp2_stream_free(nghttp2_stream *stream);
@@ -268,14 +238,8 @@ void nghttp2_stream_defer_item(nghttp2_stream *stream, uint8_t flags);
* NGHTTP2_STREAM_FLAG_DEFERRED_FLOW_CONTROL and given masks are
* cleared if they are set. So even if this function is called, if
* one of flag is still set, data does not become active.
*
* This function returns 0 if it succeeds, or one of the following
* negative error codes:
*
* NGHTTP2_ERR_NOMEM
* Out of memory
*/
int nghttp2_stream_resume_deferred_item(nghttp2_stream *stream, uint8_t flags);
void nghttp2_stream_resume_deferred_item(nghttp2_stream *stream, uint8_t flags);
/*
* Returns nonzero if item is deferred by whatever reason.
@@ -296,8 +260,8 @@ int nghttp2_stream_check_deferred_by_flow_control(nghttp2_stream *stream);
* overflow.
*/
int nghttp2_stream_update_remote_initial_window_size(
nghttp2_stream *stream, int32_t new_initial_window_size,
int32_t old_initial_window_size);
nghttp2_stream *stream, int32_t new_initial_window_size,
int32_t old_initial_window_size);
/*
* Updates the local window size with the new value
@@ -308,8 +272,8 @@ int nghttp2_stream_update_remote_initial_window_size(
* overflow.
*/
int nghttp2_stream_update_local_initial_window_size(
nghttp2_stream *stream, int32_t new_initial_window_size,
int32_t old_initial_window_size);
nghttp2_stream *stream, int32_t new_initial_window_size,
int32_t old_initial_window_size);
/*
* Call this function if promised stream |stream| is replied with
@@ -318,57 +282,11 @@ int nghttp2_stream_update_local_initial_window_size(
*/
void nghttp2_stream_promise_fulfilled(nghttp2_stream *stream);
/*
* Returns nonzero if |target| is an ancestor of |stream|.
*/
int nghttp2_stream_dep_find_ancestor(nghttp2_stream *stream,
nghttp2_stream *target);
/*
* Computes distributed weight of a stream of the |weight| under the
* |stream| if |stream| is removed from a dependency tree.
*/
int32_t nghttp2_stream_dep_distributed_weight(nghttp2_stream *stream,
int32_t weight);
/*
* Makes the |stream| depend on the |dep_stream|. This dependency is
* exclusive. All existing direct descendants of |dep_stream| become
* the descendants of the |stream|. This function assumes
* |stream->item| is NULL.
*
* This function returns 0 if it succeeds, or one of the following
* negative error codes:
*
* NGHTTP2_ERR_NOMEM
* Out of memory
*/
int nghttp2_stream_dep_insert(nghttp2_stream *dep_stream,
nghttp2_stream *stream);
/*
* Makes the |stream| depend on the |dep_stream|. This dependency is
* not exclusive. This function assumes |stream->item| is NULL.
*/
void nghttp2_stream_dep_add(nghttp2_stream *dep_stream, nghttp2_stream *stream);
/*
* Removes the |stream| from the current dependency tree. This
* function assumes |stream->item| is NULL.
*/
int nghttp2_stream_dep_remove(nghttp2_stream *stream);
/*
* Attaches |item| to |stream|.
*
* This function returns 0 if it succeeds, or one of the following
* negative error codes:
*
* NGHTTP2_ERR_NOMEM
* Out of memory
*/
int nghttp2_stream_attach_item(nghttp2_stream *stream,
nghttp2_outbound_item *item);
void nghttp2_stream_attach_item(nghttp2_stream *stream,
nghttp2_outbound_item *item);
/*
* Detaches |stream->item|. This function does not free
@@ -376,66 +294,4 @@ int nghttp2_stream_attach_item(nghttp2_stream *stream,
*/
void nghttp2_stream_detach_item(nghttp2_stream *stream);
/*
* Makes the |stream| depend on the |dep_stream|. This dependency is
* exclusive.
*
* This function returns 0 if it succeeds, or one of the following
* negative error codes:
*
* NGHTTP2_ERR_NOMEM
* Out of memory
*/
int nghttp2_stream_dep_insert_subtree(nghttp2_stream *dep_stream,
nghttp2_stream *stream);
/*
* Makes the |stream| depend on the |dep_stream|. This dependency is
* not exclusive.
*
* This function returns 0 if it succeeds, or one of the following
* negative error codes:
*
* NGHTTP2_ERR_NOMEM
* Out of memory
*/
int nghttp2_stream_dep_add_subtree(nghttp2_stream *dep_stream,
nghttp2_stream *stream);
/*
* Removes subtree whose root stream is |stream|. The
* effective_weight of streams in removed subtree is not updated.
*
* This function returns 0 if it succeeds, or one of the following
* negative error codes:
*
* NGHTTP2_ERR_NOMEM
* Out of memory
*/
void nghttp2_stream_dep_remove_subtree(nghttp2_stream *stream);
/*
* Returns nonzero if |stream| is in any dependency tree.
*/
int nghttp2_stream_in_dep_tree(nghttp2_stream *stream);
/*
* Schedules transmission of |stream|'s item, assuming stream->item is
* attached, and stream->last_writelen was updated.
*/
void nghttp2_stream_reschedule(nghttp2_stream *stream);
/*
* Changes |stream|'s weight to |weight|. If |stream| is queued, it
* will be rescheduled based on new weight.
*/
void nghttp2_stream_change_weight(nghttp2_stream *stream, int32_t weight);
/*
* Returns a stream which has highest priority, updating
* descendant_last_cycle of selected stream's ancestors.
*/
nghttp2_outbound_item *
nghttp2_stream_next_outbound_item(nghttp2_stream *stream);
#endif /* NGHTTP2_STREAM */
#endif /* !defined(NGHTTP2_STREAM_H) */

View File

@@ -32,42 +32,12 @@
#include "nghttp2_helper.h"
#include "nghttp2_priority_spec.h"
/*
* Detects the dependency error, that is stream attempted to depend on
* itself. If |stream_id| is -1, we use session->next_stream_id as
* stream ID.
*
* This function returns 0 if it succeeds, or one of the following
* error codes:
*
* NGHTTP2_ERR_INVALID_ARGUMENT
* Stream attempted to depend on itself.
*/
static int detect_self_dependency(nghttp2_session *session, int32_t stream_id,
const nghttp2_priority_spec *pri_spec) {
assert(pri_spec);
if (stream_id == -1) {
if ((int32_t)session->next_stream_id == pri_spec->stream_id) {
return NGHTTP2_ERR_INVALID_ARGUMENT;
}
return 0;
}
if (stream_id == pri_spec->stream_id) {
return NGHTTP2_ERR_INVALID_ARGUMENT;
}
return 0;
}
/* This function takes ownership of |nva_copy|. Regardless of the
return value, the caller must not free |nva_copy| after this
function returns. */
static int32_t submit_headers_shared(nghttp2_session *session, uint8_t flags,
int32_t stream_id,
const nghttp2_priority_spec *pri_spec,
nghttp2_nv *nva_copy, size_t nvlen,
int32_t stream_id, nghttp2_nv *nva_copy,
size_t nvlen,
const nghttp2_data_provider_wrap *dpw,
void *stream_user_data) {
int rv;
@@ -94,8 +64,8 @@ static int32_t submit_headers_shared(nghttp2_session *session, uint8_t flags,
item->aux_data.headers.stream_user_data = stream_user_data;
flags_copy =
(uint8_t)((flags & (NGHTTP2_FLAG_END_STREAM | NGHTTP2_FLAG_PRIORITY)) |
NGHTTP2_FLAG_END_HEADERS);
(uint8_t)((flags & (NGHTTP2_FLAG_END_STREAM | NGHTTP2_FLAG_PRIORITY)) |
NGHTTP2_FLAG_END_HEADERS);
if (stream_id == -1) {
if (session->next_stream_id > INT32_MAX) {
@@ -114,8 +84,8 @@ static int32_t submit_headers_shared(nghttp2_session *session, uint8_t flags,
frame = &item->frame;
nghttp2_frame_headers_init(&frame->headers, flags_copy, stream_id, hcat,
pri_spec, nva_copy, nvlen);
nghttp2_frame_headers_init(&frame->headers, flags_copy, stream_id, hcat, NULL,
nva_copy, nvlen);
rv = nghttp2_session_add_item(session, item);
@@ -141,31 +111,22 @@ fail2:
static int32_t submit_headers_shared_nva(nghttp2_session *session,
uint8_t flags, int32_t stream_id,
const nghttp2_priority_spec *pri_spec,
const nghttp2_nv *nva, size_t nvlen,
const nghttp2_data_provider_wrap *dpw,
void *stream_user_data) {
int rv;
nghttp2_nv *nva_copy;
nghttp2_priority_spec copy_pri_spec;
nghttp2_mem *mem;
mem = &session->mem;
if (pri_spec) {
copy_pri_spec = *pri_spec;
nghttp2_priority_spec_normalize_weight(&copy_pri_spec);
} else {
nghttp2_priority_spec_default_init(&copy_pri_spec);
}
rv = nghttp2_nv_array_copy(&nva_copy, nva, nvlen, mem);
if (rv < 0) {
return rv;
}
return submit_headers_shared(session, flags, stream_id, &copy_pri_spec,
nva_copy, nvlen, dpw, stream_user_data);
return submit_headers_shared(session, flags, stream_id, nva_copy, nvlen, dpw,
stream_user_data);
}
int nghttp2_submit_trailer(nghttp2_session *session, int32_t stream_id,
@@ -175,8 +136,7 @@ int nghttp2_submit_trailer(nghttp2_session *session, int32_t stream_id,
}
return (int)submit_headers_shared_nva(session, NGHTTP2_FLAG_END_STREAM,
stream_id, NULL, nva, nvlen, NULL,
NULL);
stream_id, nva, nvlen, NULL, NULL);
}
int32_t nghttp2_submit_headers(nghttp2_session *session, uint8_t flags,
@@ -184,7 +144,7 @@ int32_t nghttp2_submit_headers(nghttp2_session *session, uint8_t flags,
const nghttp2_priority_spec *pri_spec,
const nghttp2_nv *nva, size_t nvlen,
void *stream_user_data) {
int rv;
(void)pri_spec;
if (stream_id == -1) {
if (session->server) {
@@ -196,20 +156,8 @@ int32_t nghttp2_submit_headers(nghttp2_session *session, uint8_t flags,
flags &= NGHTTP2_FLAG_END_STREAM;
if (pri_spec && !nghttp2_priority_spec_check_default(pri_spec) &&
session->remote_settings.no_rfc7540_priorities != 1) {
rv = detect_self_dependency(session, stream_id, pri_spec);
if (rv != 0) {
return rv;
}
flags |= NGHTTP2_FLAG_PRIORITY;
} else {
pri_spec = NULL;
}
return submit_headers_shared_nva(session, flags, stream_id, pri_spec, nva,
nvlen, NULL, stream_user_data);
return submit_headers_shared_nva(session, flags, stream_id, nva, nvlen, NULL,
stream_user_data);
}
int nghttp2_submit_ping(nghttp2_session *session, uint8_t flags,
@@ -221,51 +169,10 @@ int nghttp2_submit_ping(nghttp2_session *session, uint8_t flags,
int nghttp2_submit_priority(nghttp2_session *session, uint8_t flags,
int32_t stream_id,
const nghttp2_priority_spec *pri_spec) {
int rv;
nghttp2_outbound_item *item;
nghttp2_frame *frame;
nghttp2_priority_spec copy_pri_spec;
nghttp2_mem *mem;
(void)session;
(void)flags;
mem = &session->mem;
if (session->remote_settings.no_rfc7540_priorities == 1) {
return 0;
}
if (stream_id == 0 || pri_spec == NULL) {
return NGHTTP2_ERR_INVALID_ARGUMENT;
}
if (stream_id == pri_spec->stream_id) {
return NGHTTP2_ERR_INVALID_ARGUMENT;
}
copy_pri_spec = *pri_spec;
nghttp2_priority_spec_normalize_weight(&copy_pri_spec);
item = nghttp2_mem_malloc(mem, sizeof(nghttp2_outbound_item));
if (item == NULL) {
return NGHTTP2_ERR_NOMEM;
}
nghttp2_outbound_item_init(item);
frame = &item->frame;
nghttp2_frame_priority_init(&frame->priority, stream_id, &copy_pri_spec);
rv = nghttp2_session_add_item(session, item);
if (rv != 0) {
nghttp2_frame_priority_free(&frame->priority);
nghttp2_mem_free(mem, item);
return rv;
}
(void)stream_id;
(void)pri_spec;
return 0;
}
@@ -278,7 +185,8 @@ int nghttp2_submit_rst_stream(nghttp2_session *session, uint8_t flags,
return NGHTTP2_ERR_INVALID_ARGUMENT;
}
return nghttp2_session_add_rst_stream(session, stream_id, error_code);
return nghttp2_session_add_rst_stream_continue(
session, stream_id, error_code, /* continue_without_stream = */ 0);
}
int nghttp2_submit_goaway(nghttp2_session *session, uint8_t flags,
@@ -389,8 +297,8 @@ int nghttp2_submit_window_update(nghttp2_session *session, uint8_t flags,
}
if (stream_id == 0) {
rv = nghttp2_adjust_local_window_size(
&session->local_window_size, &session->recv_window_size,
&session->recv_reduction, &window_size_increment);
&session->local_window_size, &session->recv_window_size,
&session->recv_reduction, &window_size_increment);
if (rv != 0) {
return rv;
}
@@ -401,8 +309,8 @@ int nghttp2_submit_window_update(nghttp2_session *session, uint8_t flags,
}
rv = nghttp2_adjust_local_window_size(
&stream->local_window_size, &stream->recv_window_size,
&stream->recv_reduction, &window_size_increment);
&stream->local_window_size, &stream->recv_window_size,
&stream->recv_reduction, &window_size_increment);
if (rv != 0) {
return rv;
}
@@ -411,10 +319,10 @@ int nghttp2_submit_window_update(nghttp2_session *session, uint8_t flags,
if (window_size_increment > 0) {
if (stream_id == 0) {
session->consumed_size =
nghttp2_max_int32(0, session->consumed_size - window_size_increment);
nghttp2_max_int32(0, session->consumed_size - window_size_increment);
} else {
stream->consumed_size =
nghttp2_max_int32(0, stream->consumed_size - window_size_increment);
nghttp2_max_int32(0, stream->consumed_size - window_size_increment);
}
return nghttp2_session_add_window_update(session, 0, stream_id,
@@ -444,13 +352,13 @@ int nghttp2_session_set_local_window_size(nghttp2_session *session,
if (window_size_increment < 0) {
return nghttp2_adjust_local_window_size(
&session->local_window_size, &session->recv_window_size,
&session->recv_reduction, &window_size_increment);
&session->local_window_size, &session->recv_window_size,
&session->recv_reduction, &window_size_increment);
}
rv = nghttp2_increase_local_window_size(
&session->local_window_size, &session->recv_window_size,
&session->recv_reduction, &window_size_increment);
&session->local_window_size, &session->recv_window_size,
&session->recv_reduction, &window_size_increment);
if (rv != 0) {
return rv;
@@ -477,13 +385,13 @@ int nghttp2_session_set_local_window_size(nghttp2_session *session,
if (window_size_increment < 0) {
return nghttp2_adjust_local_window_size(
&stream->local_window_size, &stream->recv_window_size,
&stream->recv_reduction, &window_size_increment);
&stream->local_window_size, &stream->recv_window_size,
&stream->recv_reduction, &window_size_increment);
}
rv = nghttp2_increase_local_window_size(
&stream->local_window_size, &stream->recv_window_size,
&stream->recv_reduction, &window_size_increment);
&stream->local_window_size, &stream->recv_window_size,
&stream->recv_reduction, &window_size_increment);
if (rv != 0) {
return rv;
@@ -579,7 +487,7 @@ int nghttp2_submit_altsvc(nghttp2_session *session, uint8_t flags,
return 0;
fail_item_malloc:
free(buf);
nghttp2_mem_free(mem, buf);
return rv;
}
@@ -614,7 +522,7 @@ int nghttp2_submit_origin(nghttp2_session *session, uint8_t flags,
/* The last nov is added for terminal NULL character. */
ov_copy =
nghttp2_mem_malloc(mem, nov * sizeof(nghttp2_origin_entry) + len + nov);
nghttp2_mem_malloc(mem, nov * sizeof(nghttp2_origin_entry) + len + nov);
if (ov_copy == NULL) {
return NGHTTP2_ERR_NOMEM;
}
@@ -662,7 +570,7 @@ int nghttp2_submit_origin(nghttp2_session *session, uint8_t flags,
return 0;
fail_item_malloc:
free(ov_copy);
nghttp2_mem_free(mem, ov_copy);
return rv;
}
@@ -734,51 +642,34 @@ int nghttp2_submit_priority_update(nghttp2_session *session, uint8_t flags,
return 0;
fail_item_malloc:
free(buf);
nghttp2_mem_free(mem, buf);
return rv;
}
static uint8_t set_request_flags(const nghttp2_priority_spec *pri_spec,
const nghttp2_data_provider_wrap *dpw) {
static uint8_t set_request_flags(const nghttp2_data_provider_wrap *dpw) {
uint8_t flags = NGHTTP2_FLAG_NONE;
if (dpw == NULL || dpw->data_prd.read_callback == NULL) {
flags |= NGHTTP2_FLAG_END_STREAM;
}
if (pri_spec) {
flags |= NGHTTP2_FLAG_PRIORITY;
}
return flags;
}
static int32_t submit_request_shared(nghttp2_session *session,
const nghttp2_priority_spec *pri_spec,
const nghttp2_nv *nva, size_t nvlen,
const nghttp2_data_provider_wrap *dpw,
void *stream_user_data) {
uint8_t flags;
int rv;
if (session->server) {
return NGHTTP2_ERR_PROTO;
}
if (pri_spec && !nghttp2_priority_spec_check_default(pri_spec) &&
session->remote_settings.no_rfc7540_priorities != 1) {
rv = detect_self_dependency(session, -1, pri_spec);
if (rv != 0) {
return rv;
}
} else {
pri_spec = NULL;
}
flags = set_request_flags(dpw);
flags = set_request_flags(pri_spec, dpw);
return submit_headers_shared_nva(session, flags, -1, pri_spec, nva, nvlen,
dpw, stream_user_data);
return submit_headers_shared_nva(session, flags, -1, nva, nvlen, dpw,
stream_user_data);
}
int32_t nghttp2_submit_request(nghttp2_session *session,
@@ -787,8 +678,9 @@ int32_t nghttp2_submit_request(nghttp2_session *session,
const nghttp2_data_provider *data_prd,
void *stream_user_data) {
nghttp2_data_provider_wrap dpw;
(void)pri_spec;
return submit_request_shared(session, pri_spec, nva, nvlen,
return submit_request_shared(session, nva, nvlen,
nghttp2_data_provider_wrap_v1(&dpw, data_prd),
stream_user_data);
}
@@ -799,8 +691,9 @@ int32_t nghttp2_submit_request2(nghttp2_session *session,
const nghttp2_data_provider2 *data_prd,
void *stream_user_data) {
nghttp2_data_provider_wrap dpw;
(void)pri_spec;
return submit_request_shared(session, pri_spec, nva, nvlen,
return submit_request_shared(session, nva, nvlen,
nghttp2_data_provider_wrap_v2(&dpw, data_prd),
stream_user_data);
}
@@ -827,8 +720,8 @@ static int submit_response_shared(nghttp2_session *session, int32_t stream_id,
}
flags = set_response_flags(dpw);
return submit_headers_shared_nva(session, flags, stream_id, NULL, nva, nvlen,
dpw, NULL);
return submit_headers_shared_nva(session, flags, stream_id, nva, nvlen, dpw,
NULL);
}
int nghttp2_submit_response(nghttp2_session *session, int32_t stream_id,
@@ -898,7 +791,7 @@ int nghttp2_submit_data(nghttp2_session *session, uint8_t flags,
assert(data_prd);
return nghttp2_submit_data_shared(
session, flags, stream_id, nghttp2_data_provider_wrap_v1(&dpw, data_prd));
session, flags, stream_id, nghttp2_data_provider_wrap_v1(&dpw, data_prd));
}
int nghttp2_submit_data2(nghttp2_session *session, uint8_t flags,
@@ -909,7 +802,7 @@ int nghttp2_submit_data2(nghttp2_session *session, uint8_t flags,
assert(data_prd);
return nghttp2_submit_data_shared(
session, flags, stream_id, nghttp2_data_provider_wrap_v2(&dpw, data_prd));
session, flags, stream_id, nghttp2_data_provider_wrap_v2(&dpw, data_prd));
}
ssize_t nghttp2_pack_settings_payload(uint8_t *buf, size_t buflen,

View File

@@ -27,7 +27,7 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif /* HAVE_CONFIG_H */
#endif /* defined(HAVE_CONFIG_H) */
#include <nghttp2/nghttp2.h>
@@ -37,4 +37,4 @@ int nghttp2_submit_data_shared(nghttp2_session *session, uint8_t flags,
int32_t stream_id,
const nghttp2_data_provider_wrap *dpw);
#endif /* NGHTTP2_SUBMIT_H */
#endif /* !defined(NGHTTP2_SUBMIT_H) */

View File

@@ -26,7 +26,7 @@
#ifdef HAVE_WINDOWS_H
# include <windows.h>
#endif /* HAVE_WINDOWS_H */
#endif /* defined(HAVE_WINDOWS_H) */
#include <time.h>
@@ -40,12 +40,11 @@ static uint64_t time_now_sec(void) {
return (uint64_t)t;
}
#endif /* !HAVE_GETTICKCOUNT64 || __CYGWIN__ */
#endif /* !defined(HAVE_GETTICKCOUNT64) || defined(__CYGWIN__) */
#if defined(HAVE_GETTICKCOUNT64) && !defined(__CYGWIN__)
uint64_t nghttp2_time_now_sec(void) { return GetTickCount64() / 1000; }
#elif defined(HAVE_CLOCK_GETTIME) && defined(HAVE_DECL_CLOCK_MONOTONIC) && \
HAVE_DECL_CLOCK_MONOTONIC
#elif defined(HAVE_CLOCK_GETTIME) && HAVE_DECL_CLOCK_MONOTONIC
uint64_t nghttp2_time_now_sec(void) {
struct timespec tp;
int rv = clock_gettime(CLOCK_MONOTONIC, &tp);
@@ -56,8 +55,8 @@ uint64_t nghttp2_time_now_sec(void) {
return (uint64_t)tp.tv_sec;
}
#else /* (!HAVE_CLOCK_GETTIME || !HAVE_DECL_CLOCK_MONOTONIC) && \
(!HAVE_GETTICKCOUNT64 || __CYGWIN__)) */
#else /* (!defined(HAVE_GETTICKCOUNT64) || !defined(__CYGWIN__)) && \
(!defined(HAVE_CLOCK_GETTIME) || !HAVE_DECL_CLOCK_MONOTONIC) */
uint64_t nghttp2_time_now_sec(void) { return time_now_sec(); }
#endif /* (!HAVE_CLOCK_GETTIME || !HAVE_DECL_CLOCK_MONOTONIC) && \
(!HAVE_GETTICKCOUNT64 || __CYGWIN__)) */
#endif /* (!defined(HAVE_GETTICKCOUNT64) || !defined(__CYGWIN__)) && \
(!defined(HAVE_CLOCK_GETTIME) || !HAVE_DECL_CLOCK_MONOTONIC) */

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