@@ -3001,6 +3001,149 @@ class ConnectionStateMachineTests: XCTestCase {
3001
3001
assertIgnored ( self . client. receiveOrigin ( origins: [ " one " , " two " ] ) )
3002
3002
assertIgnored ( self . server. receiveOrigin ( origins: [ " one " , " two " ] ) )
3003
3003
}
3004
+
3005
+ func testContentLengthForStatus304( ) {
3006
+ let streamOne = HTTP2StreamID ( 1 )
3007
+
3008
+ self . server = . init( role: . server)
3009
+ self . client = . init( role: . client)
3010
+
3011
+ self . exchangePreamble ( )
3012
+
3013
+ let responseHeaders = HPACKHeaders ( [ ( " :status " , " 304 " ) , ( " content-length " , " 25 " ) ] )
3014
+
3015
+ // Set up the connection
3016
+ assertSucceeds ( self . client. sendHeaders ( streamID: streamOne, headers: ConnectionStateMachineTests . requestHeaders, isEndStreamSet: true ) )
3017
+ assertSucceeds ( self . server. receiveHeaders ( streamID: streamOne, headers: ConnectionStateMachineTests . requestHeaders, isEndStreamSet: true ) )
3018
+
3019
+ // The server responds
3020
+ assertSucceeds ( self . server. sendHeaders ( streamID: streamOne, headers: responseHeaders, isEndStreamSet: false ) )
3021
+ assertSucceeds ( self . client. receiveHeaders ( streamID: streamOne, headers: responseHeaders, isEndStreamSet: false ) )
3022
+
3023
+ // Send in 0 bytes over two sets
3024
+ assertSucceeds ( self . server. sendData ( streamID: streamOne, contentLength: 0 , flowControlledBytes: 0 , isEndStreamSet: true ) )
3025
+ assertSucceeds ( self . client. receiveData ( streamID: streamOne, contentLength: 0 , flowControlledBytes: 0 , isEndStreamSet: true ) )
3026
+ }
3027
+
3028
+ func testContentLengthForStatus304Failure( ) {
3029
+ let streamOne = HTTP2StreamID ( 1 )
3030
+
3031
+ self . server = . init( role: . server)
3032
+ self . client = . init( role: . client)
3033
+
3034
+ self . exchangePreamble ( )
3035
+
3036
+ let responseHeaders = HPACKHeaders ( [ ( " :status " , " 304 " ) , ( " content-length " , " 25 " ) ] )
3037
+
3038
+ // Set up the connection
3039
+ assertSucceeds ( self . client. sendHeaders ( streamID: streamOne, headers: ConnectionStateMachineTests . requestHeaders, isEndStreamSet: true ) )
3040
+ assertSucceeds ( self . server. receiveHeaders ( streamID: streamOne, headers: ConnectionStateMachineTests . requestHeaders, isEndStreamSet: true ) )
3041
+
3042
+ // The server responds
3043
+ assertSucceeds ( self . server. sendHeaders ( streamID: streamOne, headers: responseHeaders, isEndStreamSet: false ) )
3044
+ assertSucceeds ( self . client. receiveHeaders ( streamID: streamOne, headers: responseHeaders, isEndStreamSet: false ) )
3045
+
3046
+ // Send in 1 byte over one frame
3047
+ assertStreamError ( type: HTTP2ErrorCode . protocolError, self . server. sendData ( streamID: streamOne, contentLength: 1 , flowControlledBytes: 1 , isEndStreamSet: true ) )
3048
+ assertStreamError ( type: HTTP2ErrorCode . protocolError, self . client. receiveData ( streamID: streamOne, contentLength: 1 , flowControlledBytes: 1 , isEndStreamSet: true ) )
3049
+ }
3050
+
3051
+ func testContentLengthForMethodHead( ) {
3052
+ let streamOne = HTTP2StreamID ( 1 )
3053
+
3054
+ self . server = . init( role: . server)
3055
+ self . client = . init( role: . client)
3056
+
3057
+ self . exchangePreamble ( )
3058
+
3059
+ let requestHeaders = HPACKHeaders ( [ ( " :method " , " HEAD " ) , ( " :authority " , " localhost " ) , ( " :scheme " , " https " ) , ( " :path " , " / " ) , ( " user-agent " , " test " ) ] )
3060
+ let responseHeaders = HPACKHeaders ( [ ( " :status " , " 200 " ) , ( " content-length " , " 25 " ) ] )
3061
+
3062
+ // Set up the connection
3063
+ assertSucceeds ( self . client. sendHeaders ( streamID: streamOne, headers: requestHeaders, isEndStreamSet: true ) )
3064
+ assertSucceeds ( self . server. receiveHeaders ( streamID: streamOne, headers: requestHeaders, isEndStreamSet: true ) )
3065
+
3066
+ // The server responds
3067
+ assertSucceeds ( self . server. sendHeaders ( streamID: streamOne, headers: responseHeaders, isEndStreamSet: false ) )
3068
+ assertSucceeds ( self . client. receiveHeaders ( streamID: streamOne, headers: responseHeaders, isEndStreamSet: false ) )
3069
+
3070
+ // Send in 0 bytes over one frame
3071
+ assertSucceeds ( self . server. sendData ( streamID: streamOne, contentLength: 0 , flowControlledBytes: 0 , isEndStreamSet: true ) )
3072
+ assertSucceeds ( self . client. receiveData ( streamID: streamOne, contentLength: 0 , flowControlledBytes: 0 , isEndStreamSet: true ) )
3073
+ }
3074
+
3075
+ func testContentLengthForHeadFailure( ) {
3076
+ let streamOne = HTTP2StreamID ( 1 )
3077
+
3078
+ self . server = . init( role: . server)
3079
+ self . client = . init( role: . client)
3080
+
3081
+ self . exchangePreamble ( )
3082
+
3083
+ let requestHeaders = HPACKHeaders ( [ ( " :method " , " HEAD " ) , ( " :authority " , " localhost " ) , ( " :scheme " , " https " ) , ( " :path " , " / " ) , ( " user-agent " , " test " ) ] )
3084
+ let responseHeaders = HPACKHeaders ( [ ( " :status " , " 200 " ) , ( " content-length " , " 25 " ) ] )
3085
+
3086
+ // Set up the connection
3087
+ assertSucceeds ( self . client. sendHeaders ( streamID: streamOne, headers: requestHeaders, isEndStreamSet: true ) )
3088
+ assertSucceeds ( self . server. receiveHeaders ( streamID: streamOne, headers: requestHeaders, isEndStreamSet: true ) )
3089
+
3090
+ // The server responds
3091
+ assertSucceeds ( self . server. sendHeaders ( streamID: streamOne, headers: responseHeaders, isEndStreamSet: false ) )
3092
+ assertSucceeds ( self . client. receiveHeaders ( streamID: streamOne, headers: responseHeaders, isEndStreamSet: false ) )
3093
+
3094
+ // Send in 1 byte over 1 frame
3095
+ assertStreamError ( type: HTTP2ErrorCode . protocolError, self . server. sendData ( streamID: streamOne, contentLength: 1 , flowControlledBytes: 1 , isEndStreamSet: true ) )
3096
+ assertStreamError ( type: HTTP2ErrorCode . protocolError, self . client. receiveData ( streamID: streamOne, contentLength: 1 , flowControlledBytes: 1 , isEndStreamSet: true ) )
3097
+ }
3098
+
3099
+ func testPushHeadRequestFailure( ) {
3100
+ let streamOne = HTTP2StreamID ( 1 )
3101
+ let streamTwo = HTTP2StreamID ( 2 )
3102
+
3103
+ self . exchangePreamble ( )
3104
+
3105
+ let requestHeaders = HPACKHeaders ( [ ( " :method " , " HEAD " ) , ( " :authority " , " localhost " ) , ( " :scheme " , " https " ) , ( " :path " , " / " ) , ( " user-agent " , " test " ) ] )
3106
+ let responseHeaders = HPACKHeaders ( [ ( " :status " , " 200 " ) , ( " content-length " , " 25 " ) ] )
3107
+
3108
+ assertSucceeds ( self . client. sendHeaders ( streamID: streamOne, headers: ConnectionStateMachineTests . requestHeaders, isEndStreamSet: true ) )
3109
+ assertSucceeds ( self . server. receiveHeaders ( streamID: streamOne, headers: ConnectionStateMachineTests . requestHeaders, isEndStreamSet: true ) )
3110
+
3111
+ // Server can push right away
3112
+ assertSucceeds ( self . server. sendPushPromise ( originalStreamID: streamOne, childStreamID: streamTwo, headers: requestHeaders) )
3113
+ assertSucceeds ( self . client. receivePushPromise ( originalStreamID: streamOne, childStreamID: streamTwo, headers: requestHeaders) )
3114
+
3115
+ // The server responds
3116
+ assertSucceeds ( self . server. sendHeaders ( streamID: streamTwo, headers: responseHeaders, isEndStreamSet: false ) )
3117
+ assertSucceeds ( self . client. receiveHeaders ( streamID: streamTwo, headers: responseHeaders, isEndStreamSet: false ) )
3118
+
3119
+ // Send in 1 byte over one frame
3120
+ assertStreamError ( type: HTTP2ErrorCode . protocolError, self . server. sendData ( streamID: streamTwo, contentLength: 1 , flowControlledBytes: 1 , isEndStreamSet: true ) )
3121
+ assertStreamError ( type: HTTP2ErrorCode . protocolError, self . client. receiveData ( streamID: streamTwo, contentLength: 1 , flowControlledBytes: 1 , isEndStreamSet: true ) )
3122
+ }
3123
+
3124
+ func testPushHeadRequest( ) {
3125
+ let streamOne = HTTP2StreamID ( 1 )
3126
+ let streamTwo = HTTP2StreamID ( 2 )
3127
+
3128
+ self . exchangePreamble ( )
3129
+
3130
+ let requestHeaders = HPACKHeaders ( [ ( " :method " , " HEAD " ) , ( " :authority " , " localhost " ) , ( " :scheme " , " https " ) , ( " :path " , " / " ) , ( " user-agent " , " test " ) ] )
3131
+ let responseHeaders = HPACKHeaders ( [ ( " :status " , " 200 " ) , ( " content-length " , " 25 " ) ] )
3132
+
3133
+ assertSucceeds ( self . client. sendHeaders ( streamID: streamOne, headers: ConnectionStateMachineTests . requestHeaders, isEndStreamSet: true ) )
3134
+ assertSucceeds ( self . server. receiveHeaders ( streamID: streamOne, headers: ConnectionStateMachineTests . requestHeaders, isEndStreamSet: true ) )
3135
+
3136
+ // Server can push right away
3137
+ assertSucceeds ( self . server. sendPushPromise ( originalStreamID: streamOne, childStreamID: streamTwo, headers: requestHeaders) )
3138
+ assertSucceeds ( self . client. receivePushPromise ( originalStreamID: streamOne, childStreamID: streamTwo, headers: requestHeaders) )
3139
+
3140
+ // The server responds
3141
+ assertSucceeds ( self . server. sendHeaders ( streamID: streamTwo, headers: responseHeaders, isEndStreamSet: false ) )
3142
+ assertSucceeds ( self . client. receiveHeaders ( streamID: streamTwo, headers: responseHeaders, isEndStreamSet: false ) )
3143
+
3144
+ // Send in 0 bytes over one frame
3145
+ assertSucceeds ( self . client. receiveData ( streamID: streamTwo, contentLength: 0 , flowControlledBytes: 0 , isEndStreamSet: true ) )
3146
+ }
3004
3147
}
3005
3148
3006
3149
0 commit comments