Comments (3)
From a quick look this looks like a reentrancy problem where as you pointed out we can re-order reads. This is a bit of an interesting one since anything can potentially happen between these two method calls
channel.configureInboundStream(initializer: self.inboundStreamStateInitializer)
channel.receiveInboundFrame(frame)
I am wondering if we could just reorder those two calls so that the read gets buffered before we configure the stream channel; however, I am deferring this to @Lukasa who is more familiar with the insides of our H2 stack.
from swift-nio-http2.
Note that tryToAutoRead
does not itself end up triggering a call to HTTP2CommonInboundStreamMultiplexer.receivedFrame
. This can only happen if we hit the following series of events:
HTTP2StreamChannel.read0
unsatisfiedRead
isfalse
, so we set it totrue
.self.pendingReads.count == 0
- Leading to a call to
self.parent?.read()
- This calls
read
on the parent channel.
So I think the reason this hasn't happened to anyone else is that it's very uncommon for read()
to actually unbuffer a channelRead
message. Typically it only sets flags that are operated on the next EL spin. This is not always true, however: some channel handlers will buffer up data that is freed on a read
call, which might be happening to you. However, as most HTTP/2 handlers operate directly on socket channels, read
is not going to synchronously trigger a read
system call, and so will not emit more data directly.
Franz's suggestion of a fix seems appropriate: we can safely buffer up that headers frame and then hit the configure flow. @qusc would you like to write a test for this? You'll need to use a custom ChannelHandler
to trigger the re-entrancy on read
. You're then also welcome to fix the issue.
from swift-nio-http2.
Thanks for your support! Let me know if the fix and test case I added to my pull request are implemented appropriately @Lukasa
from swift-nio-http2.
Related Issues (20)
- HPACKHeaders.peekPseudoHeader allocates awkward temporary array
- HTTP2ChannelHandler.wroteFrame is never returned to false
- Consider returning [Substring] from HPACKHeaders.subscript(canonicalForm:)
- Provide API for adding pseudo headers to HPACKHeaders
- OutboundFlowControlBuffer probably allocates unnecessarily
- Suport HTTP Protocol Upgrade Mechanism HOT 7
- Improve performance of `Substring._trimWhitespace()` HOT 1
- Suppress writes triggered by EOF reads
- Remote pushes with invalid headers leave a stream dangling
- Push latest versions to CocoaPods? HOT 1
- `NIOHTTP2Handler` should handle `ChannelShouldQuiesceEvent` HOT 1
- Reconsider implementation of Equatable and Hashable for HPACKHeaders HOT 2
- Remove @unchecked Sendable when NIOCore adopts Sendable
- Produce a better error when sending HEADERS on a quiesced connection
- StreamMap slow? HOT 7
- Failed assertion in change from 1.24.1 to 1.25.0 HOT 5
- The new HPACK header test for RemoveAll() fails on Android HOT 2
- Content-Length in responses on HEAD method produce error HOT 3
- Support close mode when closing HTTP2StreamChannel HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from swift-nio-http2.