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 main 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: 322


Used By

Total: 0


SwiftNIO HTTP/2 1.16.0 -

SemVer Minor

  • Add properties to HTTP2StreamID to determine stream initiator (#259)

SemVer Patch

  • Reduce allocations in OutboundFlowControlBuffer. (#257)
  • Implement StreamMap and replace Dictionary (#258)
  • Improve bulk stream teardown. (#261)
  • Use proper String unsafeUninitializedCapacity initializer. (#263)
  • Cheaper calculation of flushes. (#264)

Other Changes

  • Add watchOS deployment to PodSpec build script (#251)
  • Fix 'heder' typo (#252)
  • Add additional benchmarks and allocation tests. (#256, #260)
  • Move the huffman benchmark base64 out of init (#262)

SwiftNIO HTTP/2 1.15.0 -

SemVer Minor

  • Add a location to each of the 'NIOHTTP2Errors' (#247)

SemVer Patch

  • Shrink NIOHTTP2WindowUpdatedEvent to reduce allocations. (#239)
  • Make HTTP2StreamChannel non-generic (#242)
  • Remove a few unnecessary allocations. (#243)
  • Reduce allocations when peeking pseudo-headers. (#246)

Other Changes

  • Various improvements to testing infrastructure (#238, #248, #249)
  • Switch to main as the default development branch. (#250)

SwiftNIO HTTP/2 1.14.2 -

Semver Patch

  • Fixed an issue where we would get BadStreamStateTransition on certain I/O patterns. (#236)
  • Removed needless branch in HPACK compact integer decode. (#234)

SwiftNIO HTTP/2 1.14.1 -

SemVer Patch

  • Fixed a bug where extraneous WINDOW_UPDATE frames could be emitted when a stream is closed resulting in a connection error (#233)

SwiftNIO HTTP/2 1.14.0 -

Semver Minor

  • Bring HPACKHeaders functionality closer to HTTPHeaders from NIOHTTP1. (#232)

Semver Patch

  • Fixed an issue where autoRead in HTTP/2 child channels would not cause read to propagate through the pipeline, making it impossible to exert backpressure. (#231)


  • Fixed the -f option in build_podspecs.sh. (#229) (patch credit to @MrMage)

SwiftNIO HTTP/2 1.13.0 -

Notable Changes

The release contains a fix for an ergonomic issue which could result in a connection error when first writing on streams in an order different to the order in which they were created. The issue is detailed in #214 and associated pull requests.

The fix required that HTTP/2 stream channels created by the local peer be assigned stream IDs when they first emit writes rather than when they are initialized. As such, HTTP/2 stream channels will now operate on HTTP2Frame.FramePayload when created using the new API. The old behaviour, where stream channels operate on HTTP2Frame, remains but is now deprecated.

The following functions were deprecated and replaced with equivalents which do not accept an HTTP2StreamID in the stream initializer closure:

  • HTTP2StreamMultiplexer.init,
  • HTTP2StreamMultiplexer.createStreamChannel,
  • Channel.configureHTTP2Pipeline,

In addition, the HTTP2 to HTTP1 codecs were also deprecated:

  • HTTP2ToHTTP1ClientCodec is deprecated in favor of HTTP2FramePayloadClientCodec
  • HTTP2ToHTTP1ServerCodec is deprecated in favor of HTTP2FramePayloadServerCodec

SemVer Minor

  • Fixed an ergonomics issue which could result in a connection error when writing on streams in an order different to their creation order (#215, #216, #217, #218, #219, #221, #222, #224, #225, #226, #227, #228).

Other Changes

  • Various changes to CI and testing (#211, #212, #223)

SwiftNIO HTTP/2 1.12.3 -

SemVer Patch

  • Fix various warnings emitted by new compilers (#208, #209, #210)

SwiftNIO HTTP/2 1.12.2 -

SemVer Patch

  • Update the podspec build script to not use exact version numbers (#206, #207)

SwiftNIO HTTP/2 1.12.1 -

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 -

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 -

Semver Minor

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

SwiftNIO HTTP/2 1.10.0 -

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 -

SemVer Patch

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

SwiftNIO HTTP/2 1.9.0 -

SemVer Minor

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

SwiftNIO HTTP/2 1.8.0 -

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 -

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 -

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 -

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 -

SemVer Patch

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

SwiftNIO HTTP/2 1.6.0 -

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 -

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

Semver Minor

SwiftNIO HTTP/2 1.4.0 -

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 -

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 -

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 -

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 -

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 -

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 -

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 -

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 -

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)