@@ -18,7 +18,7 @@ import NIOHPACK
18
18
/// can validly send headers.
19
19
///
20
20
/// This protocol should only be conformed to by states for the HTTP/2 connection state machine.
21
- protocol SendingHeadersState : HasFlowControlWindows {
21
+ protocol SendingHeadersState : HasFlowControlWindows , HasLocalExtendedConnectSettings , HasRemoteExtendedConnectSettings {
22
22
var role : HTTP2ConnectionStateMachine . ConnectionRole { get }
23
23
24
24
var headerBlockValidation : HTTP2ConnectionStateMachine . ValidationState { get }
@@ -38,22 +38,24 @@ extension SendingHeadersState {
38
38
let result : StateMachineResultWithStreamEffect
39
39
let validateHeaderBlock = self . headerBlockValidation == . enabled
40
40
let validateContentLength = self . contentLengthValidation == . enabled
41
+ let localSupportsExtendedConnect = self . localSupportsExtendedConnect
42
+ let remoteSupportsExtendedConnect = self . remoteSupportsExtendedConnect
41
43
42
44
if self . role == . client && streamID. mayBeInitiatedBy ( . client) {
43
45
do {
44
46
result = try self . streamState. modifyStreamStateCreateIfNeeded ( streamID: streamID,
45
47
localRole: . client,
46
48
localInitialWindowSize: self . localInitialWindowSize,
47
49
remoteInitialWindowSize: self . remoteInitialWindowSize) {
48
- $0. sendHeaders ( headers: headers, validateHeaderBlock: validateHeaderBlock, validateContentLength: validateContentLength, isEndStreamSet: endStream)
50
+ $0. sendHeaders ( headers: headers, validateHeaderBlock: validateHeaderBlock, validateContentLength: validateContentLength, localSupportsExtendedConnect : localSupportsExtendedConnect , remoteSupportsExtendedConnect : remoteSupportsExtendedConnect , isEndStreamSet: endStream)
49
51
}
50
52
} catch {
51
53
return StateMachineResultWithEffect ( result: . connectionError( underlyingError: error, type: . protocolError) , effect: nil )
52
54
}
53
55
} else {
54
56
// HEADERS cannot create streams for servers, so this must be for a stream we already know about.
55
57
result = self . streamState. modifyStreamState ( streamID: streamID, ignoreRecentlyReset: false ) {
56
- $0. sendHeaders ( headers: headers, validateHeaderBlock: validateHeaderBlock, validateContentLength: validateContentLength, isEndStreamSet: endStream)
58
+ $0. sendHeaders ( headers: headers, validateHeaderBlock: validateHeaderBlock, validateContentLength: validateContentLength, localSupportsExtendedConnect : localSupportsExtendedConnect , remoteSupportsExtendedConnect : remoteSupportsExtendedConnect , isEndStreamSet: endStream)
57
59
}
58
60
}
59
61
@@ -70,14 +72,16 @@ extension SendingHeadersState where Self: RemotelyQuiescingState {
70
72
mutating func sendHeaders( streamID: HTTP2StreamID , headers: HPACKHeaders , isEndStreamSet endStream: Bool ) -> StateMachineResultWithEffect {
71
73
let validateHeaderBlock = self . headerBlockValidation == . enabled
72
74
let validateContentLength = self . contentLengthValidation == . enabled
75
+ let localSupportsExtendedConnect = self . localSupportsExtendedConnect
76
+ let remoteSupportsExtendedConnect = self . remoteSupportsExtendedConnect
73
77
if streamID. mayBeInitiatedBy ( . client) &&
74
78
self . role == . client &&
75
79
streamID > self . streamState. lastClientStreamID {
76
80
let error = NIOHTTP2Errors . createdStreamAfterGoaway ( )
77
81
return StateMachineResultWithEffect ( result: . connectionError( underlyingError: error, type: . protocolError) , effect: nil )
78
82
}
79
83
let result = self . streamState. modifyStreamState ( streamID: streamID, ignoreRecentlyReset: false ) {
80
- $0. sendHeaders ( headers: headers, validateHeaderBlock: validateHeaderBlock, validateContentLength: validateContentLength, isEndStreamSet: endStream)
84
+ $0. sendHeaders ( headers: headers, validateHeaderBlock: validateHeaderBlock, validateContentLength: validateContentLength, localSupportsExtendedConnect : localSupportsExtendedConnect , remoteSupportsExtendedConnect : remoteSupportsExtendedConnect , isEndStreamSet: endStream)
81
85
}
82
86
return StateMachineResultWithEffect ( result,
83
87
inboundFlowControlWindow: self . inboundFlowControlWindow,
0 commit comments