{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":123651404,"defaultBranch":"main","name":"swift-nio-http2","ownerLogin":"apple","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2018-03-03T02:20:22.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/10639145?v=4","public":true,"private":false,"isOrgOwned":true},"refInfo":{"name":"","listCacheKey":"v0:1722249988.0","currentOid":""},"activityList":{"items":[{"before":"6693a604329ed6e521669b3c26085598233e9aa6","after":"eaa71bb6ae082eee5a07407b1ad0cbd8f48f9dca","ref":"refs/heads/main","pushedAt":"2024-09-18T17:30:35.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"glbrntt","name":"George Barnett","path":"/glbrntt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/5047671?s=80&v=4"},"commit":{"message":"Add an article about multiplexing (#465)\n\nMotivation:\r\n\r\nIt's hard to keep track of all the pieces that do multiplexing. When\r\nmaking some changes I found myself writing down what each piece did and\r\nhow they fit together. I think this is generally useful information for\r\nanyone maintaining the library.\r\n\r\nModifications:\r\n\r\n- Add a DocC article about the different multiplexing approaches that's\r\naimed at _maintainers_ of NIOHTTP2.\r\n\r\nResult:\r\n\r\nEasier to learn about how multiplexing is done\r\n\r\n---------\r\n\r\nCo-authored-by: Cory Benfield ","shortMessageHtmlLink":"Add an article about multiplexing (#465)"}},{"before":"8e667f8070756c263c6b274512442541ea7c3020","after":"6693a604329ed6e521669b3c26085598233e9aa6","ref":"refs/heads/main","pushedAt":"2024-09-18T06:02:54.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"glbrntt","name":"George Barnett","path":"/glbrntt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/5047671?s=80&v=4"},"commit":{"message":"Propagate ChannelShouldQuiesceEvent to child channels (#464)\n\nMotivation:\r\n\r\nNIO has a 'ChannelShouldQuiesceEvent' which channels can listen for in\r\norder to know when they should quiesce. This is typically used to\r\ninitiate a graceful shutdown of an HTTP/2 server. However, child\r\nchannels aren't notified of this event so HTTP/2 servers must keep track\r\nof streams separately in order to notify them when the server is\r\nquiescing.\r\n\r\nModifications:\r\n\r\n- Propagate the `ChannelShouldQuiesceEvent` to child channels\r\n\r\nResult:\r\n\r\nChild channels can watch for `ChannelShouldQuiesceEvent`s","shortMessageHtmlLink":"Propagate ChannelShouldQuiesceEvent to child channels (#464)"}},{"before":"376312d334391080f34cd921566c76926371dc22","after":"8e667f8070756c263c6b274512442541ea7c3020","ref":"refs/heads/main","pushedAt":"2024-09-06T11:55:50.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"FranzBusch","name":"Franz Busch","path":"/FranzBusch","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3491887?s=80&v=4"},"commit":{"message":"Update release.yml (#459)","shortMessageHtmlLink":"Update release.yml (#459)"}},{"before":"9f6d865c8113ad1cf703ef4a51594d18652c731f","after":"376312d334391080f34cd921566c76926371dc22","ref":"refs/heads/main","pushedAt":"2024-09-06T10:59:15.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"glbrntt","name":"George Barnett","path":"/glbrntt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/5047671?s=80&v=4"},"commit":{"message":"Handle race condition between sending GOAWAY and HEADERS (#457)\n\nMotivation:\r\n\r\nA potential race exists between a server sending a GOAWAY frame and a\r\nclient opening a new stream (i.e., sending a HEADERS frame before\r\nreceiving an already sent GOAWAY frame). If there are no open streams\r\nwhen the server sends the GOAWAY frame, the connection state on the\r\nserver transitions to being fully quiesced, which throws a connection\r\nerror on receipt of a HEADERS frame.\r\n\r\nModifications:\r\n\r\n- Adjust the connection state machine on the server to throw a stream\r\nerror (instead of a connection error), and consequently, send a\r\nRST_STREAM frame to the client.\r\n\r\nResult:\r\n\r\nThis condition will be treated as a stream-level error instead.","shortMessageHtmlLink":"Handle race condition between sending GOAWAY and HEADERS (#457)"}},{"before":"88c3fc8b0520651cb779a21340f17cd44b4df2e4","after":"9f6d865c8113ad1cf703ef4a51594d18652c731f","ref":"refs/heads/main","pushedAt":"2024-08-30T10:50:01.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"gjcairo","name":"Gus Cairo","path":"/gjcairo","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/5359423?s=80&v=4"},"commit":{"message":"Accept PING frames even when fully quiesced (#455)\n\nMotivation:\r\n\r\nWhen the connection is fully quiesced, an endpoint responds with a\r\nconnection error when it receives or tries to respond to a PING frame.\r\nThis behaviour is unnecessary.\r\n\r\nModifications:\r\n\r\n- Adjust `HTTP2ConnectionStateMachine` to successfully receive and send\r\nPING frames even when the connection is fully quiesced.\r\n\r\nResult:\r\n\r\nWhen the connection is fully quiesced, an endpoint will treat receipt\r\nand sending of a PING frame as it would when the connection is active.","shortMessageHtmlLink":"Accept PING frames even when fully quiesced (#455)"}},{"before":"ee1d1aa09bef05b14a5acd14261ff0438abc994d","after":"88c3fc8b0520651cb779a21340f17cd44b4df2e4","ref":"refs/heads/main","pushedAt":"2024-08-30T08:30:38.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Lukasa","name":"Cory Benfield","path":"/Lukasa","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1382556?s=80&v=4"},"commit":{"message":"Remove upper bound for swift-docc-plugin version (#458)\n\nUpdates the swift-docc-plugin dependency to remove the upper bound\r\n(fixed by https://github.com/swiftlang/swift-docc-plugin/pull/96).\r\n\r\n~~This PR is in a draft state so that we can verify that\r\nhttps://github.com/swiftlang/swift-docc-plugin/pull/96 resolves this\r\nissue in this project before merging and creating a tag.~~\r\n\r\nWe've created the tag and I updated the PR.","shortMessageHtmlLink":"Remove upper bound for swift-docc-plugin version (#458)"}},{"before":"b5f7062b60e4add1e8c343ba4eb8da2e324b3a94","after":"ee1d1aa09bef05b14a5acd14261ff0438abc994d","ref":"refs/heads/main","pushedAt":"2024-08-28T08:45:47.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"gjcairo","name":"Gus Cairo","path":"/gjcairo","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/5359423?s=80&v=4"},"commit":{"message":"Upper-bound swift-docc-plugin dependency version (#456)\n\nMotivation:\r\n\r\nBuilding swift-nio-http2 with Swift 5.8 fails due to a compiler error\r\nwhen building swift-docc-plugin\r\n(https://github.com/swiftlang/swift-docc-plugin/issues/94).\r\n\r\nModifications:\r\n\r\n- Adjust the dependency version of swift-docc-plugin from `from:\r\n\"1.0.0\"` to `\"1.0.0\"..<\"1.4.0\"`.\r\n\r\nResult:\r\n\r\nBuilding swift-nio-http2 with Swift 5.8 will now be successful.","shortMessageHtmlLink":"Upper-bound swift-docc-plugin dependency version (#456)"}},{"before":"192c2f5ae8f2c6ec9ca6082e44c7f9a7eb8ecdb9","after":"b5f7062b60e4add1e8c343ba4eb8da2e324b3a94","ref":"refs/heads/main","pushedAt":"2024-07-29T10:18:51.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"glbrntt","name":"George Barnett","path":"/glbrntt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/5047671?s=80&v=4"},"commit":{"message":"Adopt `release.yml` (#452)\n\n# Motivation\r\n\r\nWe want to start using the GH based release notes drafting to make it easier for publishing new releases.\r\n\r\n# Modification\r\n\r\nThis PR adds the `release.yml` and configured the correct labels","shortMessageHtmlLink":"Adopt release.yml (#452)"}},{"before":"35b0b8f7e5f08fc7fae6616785e3e30a5b637bfb","after":"192c2f5ae8f2c6ec9ca6082e44c7f9a7eb8ecdb9","ref":"refs/heads/main","pushedAt":"2024-07-29T10:08:25.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"glbrntt","name":"George Barnett","path":"/glbrntt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/5047671?s=80&v=4"},"commit":{"message":"Update allocation limits (#454)\n\nMotivation:\r\n\r\nThe most recent NIO release reduce allocations, now our limits are too\r\nhigh.\r\n\r\nModifications:\r\n\r\n- Update alloc limits\r\n\r\nResult:\r\n\r\nCI passes","shortMessageHtmlLink":"Update allocation limits (#454)"}},{"before":"ab04d05c6f2e6db7f360436d5892ed2980290a8a","after":"35b0b8f7e5f08fc7fae6616785e3e30a5b637bfb","ref":"refs/heads/main","pushedAt":"2024-07-18T13:55:30.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"glbrntt","name":"George Barnett","path":"/glbrntt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/5047671?s=80&v=4"},"commit":{"message":"Fix bug where client ignores HEADERS frames on open stream when locally quiescing (#445)\n\nMotivation:\r\n\r\nCurrently, HEADERS frames are ignored by the client on a client-initiated stream after the client sends a GOAWAY.\r\n\r\nAs per [Section 6.8 (GOAWAY) in RFC 9113](https://httpwg.org/specs/rfc9113#GOAWAY):\r\n_\"Once the GOAWAY is sent, the sender will ignore frames sent on streams **initiated by the receiver** if the stream has an identifier higher than the included last stream identifier.\"_\r\n\r\nIn this case, the client (sender) should **not** ignore the HEADERS frame as the stream is initiated by the _client_, not the receiver.\r\n\r\nModifications:\r\n\r\nFixed the condition in the `receiveHeaders` function (given `LocallyQuiescingState`) in `ReceivingHeadersState.swift` to work for _both_ the client and server roles -- before this change, the condition is only correct when `self.role == ConnectionRole.server`\r\n\r\nResult:\r\n\r\nHEADERS frames are not ignored by the client on a client-initiated stream when locally quiescing.","shortMessageHtmlLink":"Fix bug where client ignores HEADERS frames on open stream when local…"}},{"before":"a2b4d284f4c02931476bae9e5200edb12f29e0cb","after":"ab04d05c6f2e6db7f360436d5892ed2980290a8a","ref":"refs/heads/main","pushedAt":"2024-07-18T08:13:16.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"glbrntt","name":"George Barnett","path":"/glbrntt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/5047671?s=80&v=4"},"commit":{"message":"Reduce allocs in HTTP2StreamChannel (#449)\n\nMotivation:\r\n\r\nThe HTTP2StreamChannel stores two atomic booleans for whether the\r\nchannel is active and writable. These are only accessed externally and\r\naccess is relatively infrequent. Each atomic requires an allocation,\r\ninstead we can just protect each with a single lock.\r\n\r\nModifications:\r\n\r\n- Combine the two atomics into a single 'flags' struct protected by a\r\n locked value box\r\n\r\nResult:\r\n\r\nFewer allocations","shortMessageHtmlLink":"Reduce allocs in HTTP2StreamChannel (#449)"}},{"before":"79802e0b69c57641cd11665c54deef32d0071a9a","after":"a2b4d284f4c02931476bae9e5200edb12f29e0cb","ref":"refs/heads/main","pushedAt":"2024-07-17T16:00:49.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"gjcairo","name":"Gus Cairo","path":"/gjcairo","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/5359423?s=80&v=4"},"commit":{"message":"Make HEADERS frame payload non-indirect (#428)\n\n* Make HEADERS frame payload non-indirect\r\n\r\nMotivation:\r\n\r\nIn previous patches we shrank the size of HTTP2Frame by\r\nmaking various data types indirect in the frame payload.\r\nThis included HEADERS, which is unfortunte as HEADERS frames\r\nare quite common.\r\n\r\nThis patch changes the layout of the HEADERS frame to remove the\r\nindirect case.\r\n\r\nModifications:\r\n\r\n- Move END_STREAM into an OptionSet.\r\n- Turn the two optional bits into flags in the aforementioned\r\n OptionSet\r\n- Replace the properties with computed properties.\r\n- Remove the indirect case\r\n\r\nResult:\r\n\r\nHEADERS frames are cheaper.\r\n\r\n* Update alloc limits\r\n\r\n---------\r\n\r\nCo-authored-by: George Barnett \r\nCo-authored-by: Gustavo Cairo ","shortMessageHtmlLink":"Make HEADERS frame payload non-indirect (#428)"}},{"before":"aab0f121e58d242b2f217ceccf775abf6b9086af","after":"79802e0b69c57641cd11665c54deef32d0071a9a","ref":"refs/heads/main","pushedAt":"2024-07-16T14:29:05.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"glbrntt","name":"George Barnett","path":"/glbrntt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/5047671?s=80&v=4"},"commit":{"message":"Reduce allocations on `InlineStreamMultiplexer/createStreamChannel` (#450)\n\n## Motivation\r\nWhen creating stream channels on the `InlineStreamMultiplexer`, we are currently performing a `flatSubmit` on two different codepaths. This allocates two ELFs: one on `submit`, and one on `flatMap`. This is unnecessary, as we could do with just one allocation.\r\n\r\n## Modifications\r\nCreate a single ELP and call `execute` on the EL instead of using `flatSubmit`.\r\n\r\n## Result\r\nFewer allocations","shortMessageHtmlLink":"Reduce allocations on InlineStreamMultiplexer/createStreamChannel (#…"}},{"before":"cbdbc9c80802b0e357f503fb1c23900dde47213c","after":"aab0f121e58d242b2f217ceccf775abf6b9086af","ref":"refs/heads/main","pushedAt":"2024-07-16T13:36:38.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"glbrntt","name":"George Barnett","path":"/glbrntt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/5047671?s=80&v=4"},"commit":{"message":"Add alloc tests for alternative stream creation API (#451)\n\nAllocation tests currently use a func that takes a promise to create the stream multiplexer.\r\nHowever, we also provide a different API that doesn't require a promise and instead returns an `EventLoopFuture`.\r\nWe don't currently have allocation tests for the latter, so this PR duplicates the current H2 tests but uses the non-promise API to create the multiplexer.\r\nI also had to add a new method on the old H2 multiplexer to conform to a test protocol.","shortMessageHtmlLink":"Add alloc tests for alternative stream creation API (#451)"}},{"before":"ac2a15cc8810825cab4986f12f2ad65625fa98fb","after":"cbdbc9c80802b0e357f503fb1c23900dde47213c","ref":"refs/heads/main","pushedAt":"2024-07-15T07:15:54.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"glbrntt","name":"George Barnett","path":"/glbrntt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/5047671?s=80&v=4"},"commit":{"message":"Use Bionic module from new Android overlay in Swift 6 instead (#448)","shortMessageHtmlLink":"Use Bionic module from new Android overlay in Swift 6 instead (#448)"}},{"before":"ed8a31548973f4fe70f71cefe8da1497dc898e7c","after":"ac2a15cc8810825cab4986f12f2ad65625fa98fb","ref":"refs/heads/main","pushedAt":"2024-07-08T08:26:52.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"glbrntt","name":"George Barnett","path":"/glbrntt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/5047671?s=80&v=4"},"commit":{"message":"Keep capacity when dropping pending reads in the stream channel (#447)\n\nMotivation:\r\n\r\nWhen the stream channel has closed it drops all of its pending reads. It\r\ndoes this by calling 'removeAll()' on its CircularBuffer. The buffers\r\nunderlying storage is emptied and then a `nil` is appended (internally\r\nCircularBuffer is never empty) which triggers an allocation.\r\n\r\nModifications:\r\n\r\n- Remove all but keep capacity\r\n\r\nResult:\r\n\r\nFewer allocations","shortMessageHtmlLink":"Keep capacity when dropping pending reads in the stream channel (#447)"}},{"before":"d629013a6eb60a8abd81d9859d2ebee6b0d93875","after":"ed8a31548973f4fe70f71cefe8da1497dc898e7c","ref":"refs/heads/main","pushedAt":"2024-07-05T12:35:46.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"glbrntt","name":"George Barnett","path":"/glbrntt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/5047671?s=80&v=4"},"commit":{"message":"Reduce error allocations (#446)\n\nMotivation:\r\n\r\nExistential errors are unconditionally boxed. We typically create and\r\nuse errors to fail promises when performing cleanup work. One example\r\nof this is failing pending writes when a stream channel is closed,\r\nhowever this is done unconditionally which means every stream channel\r\nincurs an allocation when it closes.\r\n\r\nModifications:\r\n\r\n- Statically create some existential errors ahead of time\r\n\r\nResult:\r\n\r\nFewer allocations","shortMessageHtmlLink":"Reduce error allocations (#446)"}},{"before":"a0224f3d20438635dd59c9fcc593520d80d131d0","after":"d629013a6eb60a8abd81d9859d2ebee6b0d93875","ref":"refs/heads/main","pushedAt":"2024-07-04T13:13:49.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"FranzBusch","name":"Franz Busch","path":"/FranzBusch","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/3491887?s=80&v=4"},"commit":{"message":"Reject long sequences of CONTINUATION frames (#443)\n\n* Reject long sequences of CONTINUATION frames\r\n\r\nMotivation:\r\n\r\nLong sequences of CONTINUATION frames can be used to mount attacks by attempting to get a remote peer to consume large amounts of memory.\r\n\r\nModifications:\r\n\r\n- Add a limit to the number of sequential CONTINUATION frames that can be received. This limit is configurable by users at the NIOHTTP2Handler level and has a default value of 5. When this limit is exceeded, the recipient responds with a GOAWAY frame and an \"Enhance Your Calm\" error of a newly created type `ExcessiveContinuationFrames`.\r\n\r\nResult:\r\n\r\nLong sequences of CONTINUATION frames are now rejected by the recipient.\r\n\r\n* Refactor implementation\r\n\r\n* Minor adjustments\r\n\r\n* Implement adjustments\r\n\r\n- Refactor implementation\r\n- Revert unnecessary diffs\r\n\r\n* Implement adjustments\r\n\r\n- Change `public let maximumSequentialContinuationFrames` to `public var`.\r\n- Refactor implementation.\r\n\r\n* Implement minor adjustments\r\n\r\n* Store the default `maximumSequentialContinuationFrames` in a `private static let`\r\n\r\n---------\r\n\r\nCo-authored-by: George Barnett ","shortMessageHtmlLink":"Reject long sequences of CONTINUATION frames (#443)"}},{"before":"6af2cf64cb0430e204645c7b095a21622bf87b66","after":"a0224f3d20438635dd59c9fcc593520d80d131d0","ref":"refs/heads/main","pushedAt":"2024-06-29T12:20:48.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Lukasa","name":"Cory Benfield","path":"/Lukasa","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1382556?s=80&v=4"},"commit":{"message":"Discard read bytes when accumulating continuation frames (#444)\n\nMotivation:\r\n\r\nWhen accumulating sequences of CONTINUATION frames, each frame is parsed\r\nfrom a buffer. These bytes are read when the CONTINUATION frame is\r\nparsed, but if more CONTINUATION frames follow then the buffer isn't\r\nreset. This means that long sequences of CONTINUATION frames can result\r\nin a larger than necessary buffer where most of the contents have\r\nalready been read.\r\n\r\nModifications:\r\n\r\n- Discard the bytes of the accumulation buffer when transitioning back\r\n to AccumulatingHeaderBlockFragmentsParserState if more than half of\r\n the buffer has been read.\r\n\r\nResult:\r\n\r\nLower memory footprint when parsing sequences of CONTINUATION frames.","shortMessageHtmlLink":"Discard read bytes when accumulating continuation frames (#444)"}},{"before":"0a3fcea35db04f230aedd986a925abd51ec2b712","after":"6af2cf64cb0430e204645c7b095a21622bf87b66","ref":"refs/heads/main","pushedAt":"2024-06-24T07:33:39.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"glbrntt","name":"George Barnett","path":"/glbrntt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/5047671?s=80&v=4"},"commit":{"message":"Implement RFC8441 Extended CONNECT (#441)\n\nImplement RFC8441 Extended CONNECT","shortMessageHtmlLink":"Implement RFC8441 Extended CONNECT (#441)"}},{"before":"8d8eb609929aee75336a0a3d2417280786265868","after":"0a3fcea35db04f230aedd986a925abd51ec2b712","ref":"refs/heads/main","pushedAt":"2024-06-21T16:36:39.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"glbrntt","name":"George Barnett","path":"/glbrntt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/5047671?s=80&v=4"},"commit":{"message":"Update soundness, it is 2024 now (#442)","shortMessageHtmlLink":"Update soundness, it is 2024 now (#442)"}},{"before":"356a3af761e0e2b2cc6dc103ec42471f2e1451b4","after":"8d8eb609929aee75336a0a3d2417280786265868","ref":"refs/heads/main","pushedAt":"2024-05-16T13:12:57.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"glbrntt","name":"George Barnett","path":"/glbrntt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/5047671?s=80&v=4"},"commit":{"message":"Add a variant of configureAsyncHTTP2Pipeline which takes a stream delegate (#439)\n\nMotivation:\r\n\r\n`configureAsyncHTTP2Pipeline` doesn't allow a stream delegate to be\r\nspecified. As the async pipeline uses the \"inline\" stream multiplexer\r\nthere's no way to account for streams within the connection channel.\r\n\r\nModifications:\r\n\r\n- Add a sync and async variants of `configureAsyncHTTP2Pipeline` which\r\n accepts an optional stream delegate\r\n- Rewrite the existing helpers in terms of the new one\r\n\r\nResult:\r\n\r\nUsers can configure an async http pipeline with a stream delegate.","shortMessageHtmlLink":"Add a variant of configureAsyncHTTP2Pipeline which takes a stream del…"}},{"before":"c6afe04165c865faaa687b42c32ed76dfcc91076","after":"356a3af761e0e2b2cc6dc103ec42471f2e1451b4","ref":"refs/heads/main","pushedAt":"2024-05-09T11:59:05.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Lukasa","name":"Cory Benfield","path":"/Lukasa","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1382556?s=80&v=4"},"commit":{"message":"test compiler not language version (#440)","shortMessageHtmlLink":"test compiler not language version (#440)"}},{"before":"a0c580be160af313d1d7d3bf5dda874b9abd025b","after":"c6afe04165c865faaa687b42c32ed76dfcc91076","ref":"refs/heads/main","pushedAt":"2024-04-17T08:08:28.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"glbrntt","name":"George Barnett","path":"/glbrntt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/5047671?s=80&v=4"},"commit":{"message":"Avoid CoW while processing the next state when HTTP2FrameDecoder decodes (#438)\n\nMotivation:\r\n\r\nCoWs appear when switching over the current state of the parser and holding it while also modifying it - inside `processNExtState()`. Following `append(bytes: ByteBuffer)`'s pattern, we should use a function that sets the state to an intermediary one with no associated data, before making the transformations.\r\n\r\nModifications:\r\n- created the `avoidParserCoW()` helper function for the throwing functions\r\n- used it in the switch cases inside `processNextState()`\r\n\r\nResult:\r\n\r\nCoW will be avoided when changing the state of the HTTP2FrameDecoder when decoding, so we won't have unnecessary heap allocations.","shortMessageHtmlLink":"Avoid CoW while processing the next state when HTTP2FrameDecoder deco…"}},{"before":"75c10ea32e520403dfed857dc35788a00dcf6537","after":"a0c580be160af313d1d7d3bf5dda874b9abd025b","ref":"refs/heads/main","pushedAt":"2024-03-11T08:48:54.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Lukasa","name":"Cory Benfield","path":"/Lukasa","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1382556?s=80&v=4"},"commit":{"message":"Raise minimum swift version to 5.8 (#436)","shortMessageHtmlLink":"Raise minimum swift version to 5.8 (#436)"}},{"before":"0904bf0feb5122b7e5c3f15db7df0eabe623dd87","after":"75c10ea32e520403dfed857dc35788a00dcf6537","ref":"refs/heads/main","pushedAt":"2024-02-27T09:07:58.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Lukasa","name":"Cory Benfield","path":"/Lukasa","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1382556?s=80&v=4"},"commit":{"message":"Update documentation for configureAsyncHTTPServerPipeline (#435)","shortMessageHtmlLink":"Update documentation for configureAsyncHTTPServerPipeline (#435)"}},{"before":"d47899f82fa5df8a92d1d78010517a9405937087","after":"0904bf0feb5122b7e5c3f15db7df0eabe623dd87","ref":"refs/heads/main","pushedAt":"2024-01-22T13:11:53.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Lukasa","name":"Cory Benfield","path":"/Lukasa","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1382556?s=80&v=4"},"commit":{"message":"Adopt the Swift CoC (#398)\n\nMotivation:\r\n\r\nWe're centralizing on the Swift code of conduct, so we'll x-reference\r\nthat instead of holding our own.\r\n\r\nModifications:\r\n\r\nHyperlink out to Swift.\r\n\r\nResult:\r\n\r\nShared CoC across the projects.","shortMessageHtmlLink":"Adopt the Swift CoC (#398)"}},{"before":"69e838fb2206512b68c7fd755f895a3459d88c2c","after":"d47899f82fa5df8a92d1d78010517a9405937087","ref":"refs/heads/main","pushedAt":"2024-01-08T16:25:38.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"glbrntt","name":"George Barnett","path":"/glbrntt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/5047671?s=80&v=4"},"commit":{"message":"fix Bench1Conn10kRequests crash (#434)\n\nMotivation:\r\n\r\n`Bench1Conn10kRequests` performance tester incorrectly used a `NIOLoopBound` to access the `HTTP2StreamMultiplexer` to create streams.\r\n\r\nModifications:\r\n\r\nAccess the multiplexer by safely obtaining a reference to the handler.\r\n\r\nResult:\r\n\r\n- `Bench1Conn10kRequests` are not broken","shortMessageHtmlLink":"fix Bench1Conn10kRequests crash (#434)"}},{"before":"94ab10b5af5580d64dd074ab4095a3f4974dbf97","after":"69e838fb2206512b68c7fd755f895a3459d88c2c","ref":"refs/heads/main","pushedAt":"2023-12-20T14:57:41.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Lukasa","name":"Cory Benfield","path":"/Lukasa","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1382556?s=80&v=4"},"commit":{"message":"Remove precondition: yielding to terminated AsyncSequence (#432)\n\nMotivation:\r\n\r\nIf a task iterating over inbound streams using the new async API is\r\ncancelled then it can lead to the process crashing as we hit a\r\nprecondition which guards against yielding to a terminated\r\nNIOHTTP2AsyncSequence.\r\n\r\nModifications:\r\n\r\nRemove the precondition.\r\n\r\nResult:\r\n\r\nThe code no longer crashes, instead it silently drops the yielded value.\r\n\r\nDoing more than this such as closing the connection requires rethinking\r\nmore of the API.\r\n\r\n---------\r\n\r\nCo-authored-by: Cory Benfield ","shortMessageHtmlLink":"Remove precondition: yielding to terminated AsyncSequence (#432)"}},{"before":"28a91a3b09416436d249356c22bf3c0f11e87d14","after":"94ab10b5af5580d64dd074ab4095a3f4974dbf97","ref":"refs/heads/main","pushedAt":"2023-12-18T15:11:15.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"glbrntt","name":"George Barnett","path":"/glbrntt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/5047671?s=80&v=4"},"commit":{"message":"Use explicit 64-bit UInt64 to support 32-bit platforms (#430)","shortMessageHtmlLink":"Use explicit 64-bit UInt64 to support 32-bit platforms (#430)"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"Y3Vyc29yOnYyOpK7MjAyNC0wOS0xOFQxNzozMDozNS4wMDAwMDBazwAAAAS5_QZN","startCursor":"Y3Vyc29yOnYyOpK7MjAyNC0wOS0xOFQxNzozMDozNS4wMDAwMDBazwAAAAS5_QZN","endCursor":"Y3Vyc29yOnYyOpK7MjAyMy0xMi0xOFQxNToxMToxNS4wMDAwMDBazwAAAAPNAMiu"}},"title":"Activity · apple/swift-nio-http2"}