Swiftpack.co - Package - apple/swift-nio-http2


This project contains HTTP/2 support for Swift projects using SwiftNIO. To get started, check the API docs.


swift-nio-http2 is a SwiftPM project and can be built and tested very simply:

$ swift build
$ swift test


Just like the rest of the SwiftNIO family, swift-nio-http2 follows SemVer 2.0.0 with a separate document declaring SwiftNIO's Public API.

swift-nio-http2 1.x

swift-nio-http2 versions 1.x are a pure-Swift implementation of the HTTP/2 protocol for SwiftNIO. It's part of the SwiftNIO 2 family of repositories and does not have any dependencies besides swift-nio and Swift 5. As the latest version, it lives on the master branch.

To depend on swift-nio-http2, put the following in the dependencies of your Package.swift:

.package(url: "https://github.com/apple/swift-nio-http2.git", from: "1.5.0"),

swift-nio-http2 0.x

The legacy swift-nio-http 0.x is part of the SwiftNIO 1 family of repositories and works on Swift 4.1 and newer but requires nghttp2 to be installed on your system. The source code can be found on the nghttp2-support-branch.

Developing SwiftNIO HTTP/2

For the most part, SwiftNIO development is as straightforward as any other SwiftPM project. With that said, we do have a few processes that are worth understanding before you contribute. For details, please see CONTRIBUTING.md in this repository.


Stars: 291


Used By

Total: 0


SwiftNIO HTTP/2 1.12.1 - 2020-06-01 10:26:13

Semver Patch

  • Fixed a bug where custom target window sizes were not used for remotely-initiated streams, only locally-initiated ones. (#205)
  • Better testing for HTTP/2 GREASE. (#204)

SwiftNIO HTTP/2 1.12.0 - 2020-05-12 15:22:56

Semver Minor

  • Made HTTP2StreamMultiplexer's target inbound flow control window size configurable. (#202) (Patch credit to @johnkassebaum)

Semver Patch

  • Improved debugging output for a number of types. (#197, #198)
  • Fixed a thread-safety issue with Channel.isActive, which could not safely be called from off the event loop with HTTP/2 child channels. (#199)
  • Fixed some warnings. (#203)
  • Improved README. (#200) (Patch credit to @MaxDesiatov)
  • Fixed broken docker setup. (#196, #201)
  • Improved docs. (#195)

SwiftNIO HTTP/2 1.11.0 - 2020-03-21 08:16:41

Semver Minor

  • Made Channel.configureHTTP2SecureUpgrade public, as it was accidentally left internal. (#194, credit to @jshier)

SwiftNIO HTTP/2 1.10.0 - 2020-03-19 17:51:45

Semver Minor

  • Added pipeline helper for configuring a HTTP server that uses both HTTP/1 and HTTP/2. (#193, credit to @mariosangiorgio)
  • Deprecated ChannelPipeline.configureHTTP2SecureUpgrade as it was essentially unusable, replaced with Channel.configureHTTP2SecureUpgrade instead. (#193, credit to @mariosangiorgio)

Semver Patch

  • Correctly exert backpressure using the stream flow control window. (#191)
  • Added podspec helpers. (#184, #185, #189, credit to @Jake-Prickett)
  • Doc generation updates. (#187)
  • Improvement to testing code. (#192, credit to @shekhar-rajak)

SwiftNIO HTTP/2 1.9.1 - 2020-02-13 19:55:10

SemVer Patch

  • stream channel initialiser: allow closed & failed (#183)
  • improve docker security (#180)

SwiftNIO HTTP/2 1.9.0 - 2019-12-10 12:50:14

SemVer Minor

  • fix new Swift and SwiftNIO warnings, and update SwiftNIO dependency to 2.11.0 (#179)

SwiftNIO HTTP/2 1.8.0 - 2019-12-09 14:40:48

SemVer Minor

  • Issue #151 Update BadStreamStateTransition to have stream state (#175, patch credit to @blueeor)
  • Add a subscript to HPACKHeaders to return the first value with a matching name (#178)

SemVer Patch

  • Update Code of Conduct project maintainer email address (#176)
  • Account for window size of stream closing frames (#174)

SwiftNIO HTTP/2 1.7.2 - 2019-11-19 16:39:33

SemVer Patch

  • fix new warnings in very new Swift compilers (#172)
  • tolerate multiple RST_STREAMs for same stream (#171)

SwiftNIO HTTP/2 1.7.1 - 2019-11-14 11:02:32

Semver Patch

  • Fixed an issue where non-indexed and never-indexed headers would be encoded inefficiently. (#168)
  • Improved code generation in HPACK implementation. (#170)
  • Added extra performance benchmarks. (#167)

SwiftNIO HTTP/2 1.7.0 - 2019-11-06 17:37:50

SemVer Minor

  • namespace ChannelOptions & fix deprecations (#166)

SemVer Patch

  • api breakage detection (#163)
  • swift 5.1 docker setup (#158)
  • Fix small documentation error (#157, patch credit to @adtrevor)

SwiftNIO HTTP/2 1.6.1 - 2019-09-12 19:20:18

SemVer Patch

  • remove hpack-test-case submodule (only used for integration tests) #156

SwiftNIO HTTP/2 1.6.0 - 2019-09-10 15:12:18

SemVer Patch

  • Allow adding a sequence of headeers to HPACKHeaders (#155, patch credit to @glbrntt)

SemVer Minor

  • fix dependencies: require NIO 2.3.0 (#154, reported by @glbrntt)
  • accept more valid-in-HTTP/1 but invalid-in-H2 messages (#153, reported by @Csloan7597)

SwiftNIO HTTP/2 1.5.0 - 2019-08-13 17:04:36

This patch contains security content: please update to it immediately.

Semver Minor

  • Added multiple denial of service resistance vectors, and APIs for controlling them. See https://github.com/apple/swift-nio-http2/security/advisories/GHSA-jchv-x857-q8fq for more. (https://github.com/apple/swift-nio-http2/commit/86ce1dcd0df501401eb1a0d445dbd90aaad84a64)

SwiftNIO HTTP/2 1.4.0 - 2019-07-22 16:50:34

Semver Minor

  • Added support for network-exerted backpressure to HTTP2Channel. (#142)

Semver Patch

  • Fixed an issue where servers sending a PUSH_PROMISE frame before HEADERS would cause streams to be reset. (#145)
  • Fixed an issue where unexpected per-stream frames would crash HTTP2ToHTTP1Codec. (#146)
  • Miscellaneous testing improvements. (#141)

SwiftNIO HTTP/2 1.3.0 - 2019-06-19 17:18:44

Semver Minor

  • Made HTTP2StreamID conform to Strideable. (#133)

Semver Patch

  • Fixed issue where promises for buffered outbound frames could be incorrectly lost when closing connections. (#135)
  • Improved performance by coalescing flushes from child channels in some circumstances. (#132)
  • Improved performance by minimising channelReadComplete calls. (#136)

SwiftNIO HTTP/2 1.2.1 - 2019-05-22 17:22:32

Semver Patch

  • Fixed an issue where stream channels would not be closed if the underlying transport vanished. (#131)
  • Fixed an issue where flushed frames could very rarely get "stuck" and not emitted until the next flush. (#125)
  • Fixed an issue where flow controlled inbound frames could have their flow control state counted more than once. (#114)
  • Improved performance by removing indirection between stream channels and the stream multiplexer. (#126)
  • Fixed up system for notifying stream channels that they've become active, avoiding issues when setting up such channels. (#124)
  • Correctly notify the outbound frame buffer of changes to the remote peer's value of SETTINGS_MAX_CONCURRENT_STREAMS. (#113)
  • Allow closing idle stream channels that have never been used. (#123)
  • Improved performance by removing unnecessary future callbacks in stream channel setup. (#116)
  • Reduced heap allocations when creating stream channels. (#115)
  • Reduced heap allocations when decoding HPACK header blocks. (#118)
  • Reduced copying when transforming between HTTP/1 and HTTP/2 header blocks. (#112)
  • Removed an inadvertent copy-on-write when buffering inbound frame bytes. (#111)
  • Boxed some cases of HTTP2Frame.FramePayload to avoid the costs of copying the data about. (#110)
  • Improved test setup. (#129, #130)
  • Added allocation tests. (#122)
  • Added performance tests. (#117)
  • Turned on warnings as errors in CI. (#127)

SwiftNIO HTTP/2 1.2.0 - 2019-05-02 14:39:18

Semver Minor

  • Added support for policing correct content length headers, with support for disabling these checks if needed. (#98)

Semver Patch

  • Fixed an off-by-one error when calculating the valid bounds of certain HTTP/2 settings. (#97)
  • Fixed an issue where we'd incorrectly reject headers that were larger than the dynamic table size, instead of flushing the table. (#99)
  • Fixed an issue where max stream ID was forbidden in GOAWAY when sent by servers. (#102)
  • Removed unnecessary memory copies in the state machine. (#104)
  • Avoided unnecessary heap allocation when parsing frame headers. (#107)
  • Fixed an issue where NIO would consider WINDOW_UPDATE frames on closed streams to be a connection error of type PROTOCOL_ERROR. (#109)
  • Added "Show on Github" link to API docs. (#108)

SwiftNIO HTTP/2 1.1.0 - 2019-04-12 15:52:29

Semver Minor

  • Added additional validation for inbound and outbound HPACK headers. This change adds a number of new errors and a new API to NIOHTTP2Handler to disable this validation. (#84, #90, #91, #94, #95)
  • Rewrote the representation of HPACK headers for a substantial performance improvement. (#89)

Semver Patch

  • Fixed a bug where zero-length SETTINGS frames would be treated as an error. (#88)
  • Substantially decreased the allocation overhead of encoding HTTP headers. (#86)
  • Documentation cleanups. (#82, #82)

SwiftNIO HTTP/2 1.0.1 - 2019-03-27 18:37:11

Semver Patch

  • Added validation to enforce that END_STREAM is set on HEADERS frames containing trailers. (#81)
  • Forced HTTP2StreamMultiplexer to forward on channelActive to the parent channel. (#80)
  • Miscellaneous docs fixes. (#76, #77, #78)

SwiftNIO HTTP/2 1.0.0 - 2019-03-27 18:35:13

This is the first major release of SwiftNIO HTTP/2. It substantially changes the API and moves the implementation to a pure-Swift model. As the changes are so large, we do not have release notes here: please consider the 1.0 revision as an entirely clean slate.

SwiftNIO HTTP/2 0.2.1 - 2019-01-09 16:13:15

Semver Patch

  • Initiate HTTP/2 parser on handlerAdded as well as on channelActive, to facilitate adding HTTP/2 handlers to pipelines after setup. (#36)

SwiftNIO HTTP/2 0.2.0 - 2018-12-10 15:48:37

Semver Major

  • Changed around the types used on HTTP2Frame. (#16)
  • Formally required Swift 4.1, though Swift 4.0 never worked with this repo. (#21)

Semver Minor

  • Added support for newish nghttp2 versions. (#23)
  • Added support for old nghttp2 versions. (#29)

Semver Patch

  • Laid some groundwork for pure-Swift implementation. (#10, #14)
  • Fixed issue where child channels would not be correctly activated. (#27)
  • Fixed issue where trailers would fail to be sent. (#25)
  • Prevented crashes when the client preamble was invalid. (#12)
  • Prevented crashes when SETTINGS_MAX_CONCURRENT_STREAMS was set to be higher than the cache of old streams. (#13)
  • Prevented crashes due to discarding active streams instead of invalid ones. (#11)
  • Cleaned up submodule checkout. (#20)
  • Documentation improvements. (#18)
  • Many test improvements (#8, #9, #15)