@@ -237,29 +237,22 @@ class ConnectionStateMachineTests: XCTestCase {
237237
238238 assertBadStreamStateTransition ( type: . halfOpenRemoteLocalIdle, self . server. sendData ( streamID: streamOne, contentLength: 0 , flowControlledBytes: 0 , isEndStreamSet: false ) )
239239 self . server = savedServerState
240-
241- assertBadStreamStateTransition ( type: . halfOpenRemoteLocalIdle, self . server. receivePushPromise ( originalStreamID: streamOne, childStreamID: streamTwo, headers: testHeaders) )
242- self . server = savedServerState
243240
244241 // Move state to fullyOpen
245242 let testSendHeaders : HPACKHeaders = [ " :status " : " y " ]
246243 assertSucceeds ( self . server. sendHeaders ( streamID: streamOne, headers: testSendHeaders, isEndStreamSet: false ) )
247244 savedServerState = self . server
248245
249- let testPushPromiseHeaders : HPACKHeaders = [ " test " : " value " ]
250- assertBadStreamStateTransition ( type: . fullyOpen, self . server. receivePushPromise ( originalStreamID: streamOne, childStreamID: streamTwo, headers: testPushPromiseHeaders) )
251- self . server = savedServerState
252-
253246 // Move state to halfClosedLocalPeerActive
254247 assertSucceeds ( self . server. sendData ( streamID: streamOne, contentLength: 0 , flowControlledBytes: 0 , isEndStreamSet: true ) )
255248 savedServerState = self . server
256249
257250 assertBadStreamStateTransition ( type: . halfClosedLocalPeerActive, self . server. sendData ( streamID: streamOne, contentLength: 0 , flowControlledBytes: 0 , isEndStreamSet: true ) )
258251 self . server = savedServerState
252+
253+ let testPushPromiseHeaders : HPACKHeaders = [ " test " : " value " ]
259254 assertBadStreamStateTransition ( type: . halfClosedLocalPeerActive, self . server. sendPushPromise ( originalStreamID: streamOne, childStreamID: streamTwo, headers: testPushPromiseHeaders) )
260255 self . server = savedServerState
261- assertBadStreamStateTransition ( type: . halfClosedLocalPeerActive, self . server. receivePushPromise ( originalStreamID: streamOne, childStreamID: streamTwo, headers: testPushPromiseHeaders) )
262- self . server = savedServerState
263256 let lastBadStreamStateTransition = assertBadStreamStateTransition ( type: . halfClosedLocalPeerActive, self . server. sendHeaders ( streamID: streamOne, headers: testPushPromiseHeaders, isEndStreamSet: false ) )
264257 self . server = savedServerState
265258
@@ -1778,6 +1771,27 @@ class ConnectionStateMachineTests: XCTestCase {
17781771 self . server. receiveSettings ( . settings( [ HTTP2Setting ( parameter: . enablePush, value: 2 ) ] ) , frameEncoder: & self . serverEncoder, frameDecoder: & self . serverDecoder) )
17791772 }
17801773
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+
17811795 func testRatchetingGoawayEvenWhenFullyQueisced( ) {
17821796 let streamOne = HTTP2StreamID ( 1 )
17831797 let streamThree = HTTP2StreamID ( 3 )
0 commit comments