@@ -60,8 +60,8 @@ public Http2Stream(uint streamId, uint initialWindowSize, Http2Connection connec
60
60
RequestEndHeaders = false ;
61
61
_requestHeaders = new HeaderCollection ( ) ;
62
62
_requestContentPipe = new ( new PipeOptions ( MemoryPool < byte > . Shared ) ) ;
63
- _requestContentPipeReader = new ( _requestContentPipe . Reader , ReleaseFlowControl ) ;
64
- _requestContentPipeWriter = new ( _requestContentPipe . Writer , ConsumeFlowControl ) ;
63
+ _requestContentPipeReader = new ( _requestContentPipe . Reader , ReleaseServerFlowControl ) ;
64
+ _requestContentPipeWriter = new ( _requestContentPipe . Writer , ConsumeServerFlowControl ) ;
65
65
66
66
_responseContentPipe = new ( new PipeOptions ( MemoryPool < byte > . Shared ) ) ;
67
67
_responseContentPipeWriter = new ( _responseContentPipe . Writer , size =>
@@ -160,30 +160,29 @@ public void Abort()
160
160
161
161
public void CompleteRequestStream ( )
162
162
{
163
- _requestContentPipe . Writer . Complete ( ) ;
163
+ _requestContentPipeWriter . Complete ( ) ;
164
164
_state = StreamState . HalfOpenRemote ;
165
165
}
166
166
167
- private void ReleaseFlowControl ( int size )
167
+ private void ReleaseServerFlowControl ( int size )
168
168
{
169
169
if ( size > Http2Connection . MaxWindowUpdateSize || size < 0 )
170
170
throw new Http2FlowControlException ( ) ;
171
+ if ( size == 0 )
172
+ return ;
171
173
uint windowSize = ( uint ) size ;
172
174
_serverWindowSize . ReleaseSize ( windowSize ) ;
173
175
174
176
// Release Read FlowControl Window for the stream and the connection.
175
177
_writer . ScheduleWriteWindowUpdate ( this , windowSize ) ;
176
178
}
177
179
178
- private void ConsumeFlowControl ( uint size )
180
+ private void ConsumeServerFlowControl ( int size )
179
181
{
180
182
if ( size > Http2Connection . MaxWindowUpdateSize || size < 0 )
181
183
throw new Http2FlowControlException ( ) ;
182
184
uint windowSize = ( uint ) size ;
183
185
_serverWindowSize . TryUse ( windowSize ) ;
184
-
185
- // Release Read FlowControl Window for the stream and the connection.
186
- _writer . ScheduleWriteWindowUpdate ( this , windowSize ) ;
187
186
}
188
187
}
189
188
@@ -298,7 +297,11 @@ public async Task CompleteAsync()
298
297
{
299
298
var task = _responseWritingTask ;
300
299
if ( task == null )
300
+ {
301
301
await StartAsync ( ) ;
302
+ }
303
+ // Make sure the thread can complete if it is waiting on write.
304
+ _applicationStartedResponse . Release ( 1 ) ;
302
305
await _responseWritingTask ! ;
303
306
}
304
307
0 commit comments