@@ -237,29 +237,22 @@ class ConnectionStateMachineTests: XCTestCase {
237
237
238
238
assertBadStreamStateTransition ( type: . halfOpenRemoteLocalIdle, self . server. sendData ( streamID: streamOne, contentLength: 0 , flowControlledBytes: 0 , isEndStreamSet: false ) )
239
239
self . server = savedServerState
240
-
241
- assertBadStreamStateTransition ( type: . halfOpenRemoteLocalIdle, self . server. receivePushPromise ( originalStreamID: streamOne, childStreamID: streamTwo, headers: testHeaders) )
242
- self . server = savedServerState
243
240
244
241
// Move state to fullyOpen
245
242
let testSendHeaders : HPACKHeaders = [ " :status " : " y " ]
246
243
assertSucceeds ( self . server. sendHeaders ( streamID: streamOne, headers: testSendHeaders, isEndStreamSet: false ) )
247
244
savedServerState = self . server
248
245
249
- let testPushPromiseHeaders : HPACKHeaders = [ " test " : " value " ]
250
- assertBadStreamStateTransition ( type: . fullyOpen, self . server. receivePushPromise ( originalStreamID: streamOne, childStreamID: streamTwo, headers: testPushPromiseHeaders) )
251
- self . server = savedServerState
252
-
253
246
// Move state to halfClosedLocalPeerActive
254
247
assertSucceeds ( self . server. sendData ( streamID: streamOne, contentLength: 0 , flowControlledBytes: 0 , isEndStreamSet: true ) )
255
248
savedServerState = self . server
256
249
257
250
assertBadStreamStateTransition ( type: . halfClosedLocalPeerActive, self . server. sendData ( streamID: streamOne, contentLength: 0 , flowControlledBytes: 0 , isEndStreamSet: true ) )
258
251
self . server = savedServerState
252
+
253
+ let testPushPromiseHeaders : HPACKHeaders = [ " test " : " value " ]
259
254
assertBadStreamStateTransition ( type: . halfClosedLocalPeerActive, self . server. sendPushPromise ( originalStreamID: streamOne, childStreamID: streamTwo, headers: testPushPromiseHeaders) )
260
255
self . server = savedServerState
261
- assertBadStreamStateTransition ( type: . halfClosedLocalPeerActive, self . server. receivePushPromise ( originalStreamID: streamOne, childStreamID: streamTwo, headers: testPushPromiseHeaders) )
262
- self . server = savedServerState
263
256
let lastBadStreamStateTransition = assertBadStreamStateTransition ( type: . halfClosedLocalPeerActive, self . server. sendHeaders ( streamID: streamOne, headers: testPushPromiseHeaders, isEndStreamSet: false ) )
264
257
self . server = savedServerState
265
258
@@ -1778,6 +1771,27 @@ class ConnectionStateMachineTests: XCTestCase {
1778
1771
self . server. receiveSettings ( . settings( [ HTTP2Setting ( parameter: . enablePush, value: 2 ) ] ) , frameEncoder: & self . serverEncoder, frameDecoder: & self . serverDecoder) )
1779
1772
}
1780
1773
1774
+ func testClientsCannotPush( ) {
1775
+ let streamOne = HTTP2StreamID ( 1 )
1776
+ let streamTwo = HTTP2StreamID ( 2 )
1777
+
1778
+ // Default settings.
1779
+ assertSucceeds ( self . client. sendSettings ( [ ] ) )
1780
+ assertSucceeds ( self . server. receiveSettings ( . settings( [ ] ) , frameEncoder: & self . serverEncoder, frameDecoder: & self . serverDecoder) )
1781
+ assertSucceeds ( self . server. sendSettings ( [ ] ) )
1782
+ assertSucceeds ( self . client. receiveSettings ( . settings( [ ] ) , frameEncoder: & self . clientEncoder, frameDecoder: & self . clientDecoder) )
1783
+ assertSucceeds ( self . client. receiveSettings ( . ack, frameEncoder: & self . clientEncoder, frameDecoder: & self . clientDecoder) )
1784
+ assertSucceeds ( self . server. receiveSettings ( . ack, frameEncoder: & self . serverEncoder, frameDecoder: & self . serverDecoder) )
1785
+
1786
+ // Client attempts to push, using a _server_ stream ID, with stream one not open. This should fail on both server and client.
1787
+ assertConnectionError ( type: . protocolError, self . client. sendPushPromise ( originalStreamID: streamOne, childStreamID: streamTwo, headers: ConnectionStateMachineTests . requestHeaders) )
1788
+ assertConnectionError ( type: . protocolError, self . server. receivePushPromise ( originalStreamID: streamOne, childStreamID: streamTwo, headers: ConnectionStateMachineTests . requestHeaders) )
1789
+
1790
+ // Client then sends a HEADERS frame on the stream it just pushed. This should also fail.
1791
+ assertConnectionError ( type: . protocolError, self . client. sendHeaders ( streamID: streamTwo, headers: ConnectionStateMachineTests . requestHeaders, isEndStreamSet: false ) )
1792
+ assertConnectionError ( type: . protocolError, self . server. receiveHeaders ( streamID: streamTwo, headers: ConnectionStateMachineTests . requestHeaders, isEndStreamSet: false ) )
1793
+ }
1794
+
1781
1795
func testRatchetingGoawayEvenWhenFullyQueisced( ) {
1782
1796
let streamOne = HTTP2StreamID ( 1 )
1783
1797
let streamThree = HTTP2StreamID ( 3 )
0 commit comments