@@ -20,6 +20,84 @@ namespace Microsoft.AspNetCore.Server.HttpSys.FunctionalTests
20
20
{
21
21
public class Http2Tests
22
22
{
23
+ // TODO: Remove when the regression is fixed.
24
+ // https://github.com/dotnet/aspnetcore/issues/23164#issuecomment-652646163
25
+ private static readonly Version Win10_Regressed_DataFrame = new Version ( 10 , 0 , 20145 , 0 ) ;
26
+
27
+ [ ConditionalFact ]
28
+ [ MinimumOSVersion ( OperatingSystems . Windows , WindowsVersions . Win10 , SkipReason = "Http2 requires Win10" ) ]
29
+ public async Task EmptyResponse_200 ( )
30
+ {
31
+ using var server = Utilities . CreateDynamicHttpsServer ( out var address , httpContext =>
32
+ {
33
+ // Default 200
34
+ return Task . CompletedTask ;
35
+ } ) ;
36
+
37
+ await new HostBuilder ( )
38
+ . UseHttp2Cat ( address , async h2Connection =>
39
+ {
40
+ await h2Connection . InitializeConnectionAsync ( ) ;
41
+
42
+ h2Connection . Logger . LogInformation ( "Initialized http2 connection. Starting stream 1." ) ;
43
+
44
+ await h2Connection . StartStreamAsync ( 1 , Http2Utilities . BrowserRequestHeaders , endStream : true ) ;
45
+
46
+ await h2Connection . ReceiveHeadersAsync ( 1 , decodedHeaders =>
47
+ {
48
+ Assert . Equal ( "200" , decodedHeaders [ HeaderNames . Status ] ) ;
49
+ } ) ;
50
+
51
+ var dataFrame = await h2Connection . ReceiveFrameAsync ( ) ;
52
+ if ( Environment . OSVersion . Version >= Win10_Regressed_DataFrame )
53
+ {
54
+ // TODO: Remove when the regression is fixed.
55
+ // https://github.com/dotnet/aspnetcore/issues/23164#issuecomment-652646163
56
+ Http2Utilities . VerifyDataFrame ( dataFrame , 1 , endOfStream : false , length : 0 ) ;
57
+
58
+ dataFrame = await h2Connection . ReceiveFrameAsync ( ) ;
59
+ }
60
+ Http2Utilities . VerifyDataFrame ( dataFrame , 1 , endOfStream : true , length : 0 ) ;
61
+
62
+ h2Connection . Logger . LogInformation ( "Connection stopped." ) ;
63
+ } )
64
+ . Build ( ) . RunAsync ( ) ;
65
+ }
66
+
67
+ [ ConditionalFact ]
68
+ [ MinimumOSVersion ( OperatingSystems . Windows , WindowsVersions . Win10 , SkipReason = "Http2 requires Win10" ) ]
69
+ public async Task ResponseWithData_Success ( )
70
+ {
71
+ using var server = Utilities . CreateDynamicHttpsServer ( out var address , httpContext =>
72
+ {
73
+ return httpContext . Response . WriteAsync ( "Hello World" ) ;
74
+ } ) ;
75
+
76
+ await new HostBuilder ( )
77
+ . UseHttp2Cat ( address , async h2Connection =>
78
+ {
79
+ await h2Connection . InitializeConnectionAsync ( ) ;
80
+
81
+ h2Connection . Logger . LogInformation ( "Initialized http2 connection. Starting stream 1." ) ;
82
+
83
+ await h2Connection . StartStreamAsync ( 1 , Http2Utilities . BrowserRequestHeaders , endStream : true ) ;
84
+
85
+ await h2Connection . ReceiveHeadersAsync ( 1 , decodedHeaders =>
86
+ {
87
+ Assert . Equal ( "200" , decodedHeaders [ HeaderNames . Status ] ) ;
88
+ } ) ;
89
+
90
+ var dataFrame = await h2Connection . ReceiveFrameAsync ( ) ;
91
+ Http2Utilities . VerifyDataFrame ( dataFrame , 1 , endOfStream : false , length : 11 ) ;
92
+
93
+ dataFrame = await h2Connection . ReceiveFrameAsync ( ) ;
94
+ Http2Utilities . VerifyDataFrame ( dataFrame , 1 , endOfStream : true , length : 0 ) ;
95
+
96
+ h2Connection . Logger . LogInformation ( "Connection stopped." ) ;
97
+ } )
98
+ . Build ( ) . RunAsync ( ) ;
99
+ }
100
+
23
101
[ ConditionalFact ( Skip = "https://github.com/dotnet/aspnetcore/issues/17420" ) ]
24
102
[ MinimumOSVersion ( OperatingSystems . Windows , WindowsVersions . Win10 , SkipReason = "Http2 requires Win10" ) ]
25
103
[ MaximumOSVersion ( OperatingSystems . Windows , WindowsVersions . Win10_19H1 , SkipReason = "This is last version without GoAway support" ) ]
@@ -95,6 +173,14 @@ await h2Connection.ReceiveHeadersAsync(1, decodedHeaders =>
95
173
} ) ;
96
174
97
175
var dataFrame = await h2Connection . ReceiveFrameAsync ( ) ;
176
+ if ( Environment . OSVersion . Version >= Win10_Regressed_DataFrame )
177
+ {
178
+ // TODO: Remove when the regression is fixed.
179
+ // https://github.com/dotnet/aspnetcore/issues/23164#issuecomment-652646163
180
+ Http2Utilities . VerifyDataFrame ( dataFrame , 1 , endOfStream : false , length : 0 ) ;
181
+
182
+ dataFrame = await h2Connection . ReceiveFrameAsync ( ) ;
183
+ }
98
184
Http2Utilities . VerifyDataFrame ( dataFrame , 1 , endOfStream : true , length : 0 ) ;
99
185
100
186
// Http.Sys doesn't send a final GoAway unless we ignore the first one and send 200 additional streams.
@@ -135,6 +221,14 @@ await h2Connection.ReceiveHeadersAsync(streamId, decodedHeaders =>
135
221
} ) ;
136
222
137
223
var dataFrame = await h2Connection . ReceiveFrameAsync ( ) ;
224
+ if ( Environment . OSVersion . Version >= Win10_Regressed_DataFrame )
225
+ {
226
+ // TODO: Remove when the regression is fixed.
227
+ // https://github.com/dotnet/aspnetcore/issues/23164#issuecomment-652646163
228
+ Http2Utilities . VerifyDataFrame ( dataFrame , 1 , endOfStream : false , length : 0 ) ;
229
+
230
+ dataFrame = await h2Connection . ReceiveFrameAsync ( ) ;
231
+ }
138
232
Http2Utilities . VerifyDataFrame ( dataFrame , streamId , endOfStream : true , length : 0 ) ;
139
233
140
234
// Http.Sys doesn't send a final GoAway unless we ignore the first one and send 200 additional streams.
@@ -152,6 +246,14 @@ await h2Connection.ReceiveHeadersAsync(streamId, decodedHeaders =>
152
246
} ) ;
153
247
154
248
dataFrame = await h2Connection . ReceiveFrameAsync ( ) ;
249
+ if ( Environment . OSVersion . Version >= Win10_Regressed_DataFrame )
250
+ {
251
+ // TODO: Remove when the regression is fixed.
252
+ // https://github.com/dotnet/aspnetcore/issues/23164#issuecomment-652646163
253
+ Http2Utilities . VerifyDataFrame ( dataFrame , streamId , endOfStream : false , length : 0 ) ;
254
+
255
+ dataFrame = await h2Connection . ReceiveFrameAsync ( ) ;
256
+ }
155
257
Http2Utilities . VerifyDataFrame ( dataFrame , streamId , endOfStream : true , length : 0 ) ;
156
258
}
157
259
@@ -171,6 +273,14 @@ await h2Connection.ReceiveHeadersAsync(streamId, decodedHeaders =>
171
273
} ) ;
172
274
173
275
dataFrame = await h2Connection . ReceiveFrameAsync ( ) ;
276
+ if ( Environment . OSVersion . Version >= Win10_Regressed_DataFrame )
277
+ {
278
+ // TODO: Remove when the regression is fixed.
279
+ // https://github.com/dotnet/aspnetcore/issues/23164#issuecomment-652646163
280
+ Http2Utilities . VerifyDataFrame ( dataFrame , streamId , endOfStream : false , length : 0 ) ;
281
+
282
+ dataFrame = await h2Connection . ReceiveFrameAsync ( ) ;
283
+ }
174
284
Http2Utilities . VerifyDataFrame ( dataFrame , streamId , endOfStream : true , length : 0 ) ;
175
285
176
286
h2Connection . Logger . LogInformation ( "Connection stopped." ) ;
@@ -180,7 +290,7 @@ await h2Connection.ReceiveHeadersAsync(streamId, decodedHeaders =>
180
290
181
291
[ ConditionalFact ]
182
292
[ MinimumOSVersion ( OperatingSystems . Windows , WindowsVersions . Win10 , SkipReason = "Http2 requires Win10" ) ]
183
- public async Task AppException_BeforeHeaders_500 ( )
293
+ public async Task AppException_BeforeResponseHeaders_500 ( )
184
294
{
185
295
using var server = Utilities . CreateDynamicHttpsServer ( out var address , httpContext =>
186
296
{
@@ -202,6 +312,14 @@ await h2Connection.ReceiveHeadersAsync(1, decodedHeaders =>
202
312
} ) ;
203
313
204
314
var dataFrame = await h2Connection . ReceiveFrameAsync ( ) ;
315
+ if ( Environment . OSVersion . Version >= Win10_Regressed_DataFrame )
316
+ {
317
+ // TODO: Remove when the regression is fixed.
318
+ // https://github.com/dotnet/aspnetcore/issues/23164#issuecomment-652646163
319
+ Http2Utilities . VerifyDataFrame ( dataFrame , 1 , endOfStream : false , length : 0 ) ;
320
+
321
+ dataFrame = await h2Connection . ReceiveFrameAsync ( ) ;
322
+ }
205
323
Http2Utilities . VerifyDataFrame ( dataFrame , 1 , endOfStream : true , length : 0 ) ;
206
324
207
325
h2Connection . Logger . LogInformation ( "Connection stopped." ) ;
@@ -266,8 +384,16 @@ await h2Connection.ReceiveHeadersAsync(1, decodedHeaders =>
266
384
Assert . Equal ( "200" , decodedHeaders [ HeaderNames . Status ] ) ;
267
385
} ) ;
268
386
269
- var resetFrame = await h2Connection . ReceiveFrameAsync ( ) ;
270
- Http2Utilities . VerifyResetFrame ( resetFrame , expectedStreamId : 1 , Http2ErrorCode . INTERNAL_ERROR ) ;
387
+ var frame = await h2Connection . ReceiveFrameAsync ( ) ;
388
+ if ( Environment . OSVersion . Version >= Win10_Regressed_DataFrame )
389
+ {
390
+ // TODO: Remove when the regression is fixed.
391
+ // https://github.com/dotnet/aspnetcore/issues/23164#issuecomment-652646163
392
+ Http2Utilities . VerifyDataFrame ( frame , 1 , endOfStream : false , length : 0 ) ;
393
+
394
+ frame = await h2Connection . ReceiveFrameAsync ( ) ;
395
+ }
396
+ Http2Utilities . VerifyResetFrame ( frame , expectedStreamId : 1 , Http2ErrorCode . INTERNAL_ERROR ) ;
271
397
272
398
h2Connection . Logger . LogInformation ( "Connection stopped." ) ;
273
399
} )
@@ -395,6 +521,9 @@ await h2Connection.ReceiveHeadersAsync(1, decodedHeaders =>
395
521
Assert . Equal ( "200" , decodedHeaders [ HeaderNames . Status ] ) ;
396
522
} ) ;
397
523
524
+ var dataFrame = await h2Connection . ReceiveFrameAsync ( ) ;
525
+ Http2Utilities . VerifyDataFrame ( dataFrame , expectedStreamId : 1 , endOfStream : false , length : 0 ) ;
526
+
398
527
var resetFrame = await h2Connection . ReceiveFrameAsync ( ) ;
399
528
Http2Utilities . VerifyResetFrame ( resetFrame , expectedStreamId : 1 , expectedErrorCode : ( Http2ErrorCode ) 1111 ) ;
400
529
@@ -648,6 +777,14 @@ await h2Connection.ReceiveHeadersAsync(1, decodedHeaders =>
648
777
} ) ;
649
778
650
779
var dataFrame = await h2Connection . ReceiveFrameAsync ( ) ;
780
+ if ( Environment . OSVersion . Version >= Win10_Regressed_DataFrame )
781
+ {
782
+ // TODO: Remove when the regression is fixed.
783
+ // https://github.com/dotnet/aspnetcore/issues/23164#issuecomment-652646163
784
+ Http2Utilities . VerifyDataFrame ( dataFrame , 1 , endOfStream : false , length : 0 ) ;
785
+
786
+ dataFrame = await h2Connection . ReceiveFrameAsync ( ) ;
787
+ }
651
788
Http2Utilities . VerifyDataFrame ( dataFrame , 1 , endOfStream : true , length : 0 ) ;
652
789
653
790
var resetFrame = await h2Connection . ReceiveFrameAsync ( ) ;
0 commit comments