@@ -29,7 +29,7 @@ public void BeginEncodeHeaders_Status302_NewIndexValue()
29
29
enumerator . Initialize ( headers ) ;
30
30
31
31
var hpackEncoder = new DynamicHPackEncoder ( ) ;
32
- Assert . True ( HPackHeaderWriter . BeginEncodeHeaders ( 302 , hpackEncoder , enumerator , buffer , out var length ) ) ;
32
+ Assert . Equal ( HeaderWriteResult . Done , HPackHeaderWriter . BeginEncodeHeaders ( 302 , hpackEncoder , enumerator , buffer , out var length ) ) ;
33
33
34
34
var result = buffer . Slice ( 0 , length ) . ToArray ( ) ;
35
35
var hex = BitConverter . ToString ( result ) ;
@@ -52,7 +52,7 @@ public void BeginEncodeHeaders_CacheControlPrivate_NewIndexValue()
52
52
enumerator . Initialize ( headers ) ;
53
53
54
54
var hpackEncoder = new DynamicHPackEncoder ( ) ;
55
- Assert . True ( HPackHeaderWriter . BeginEncodeHeaders ( 302 , hpackEncoder , enumerator , buffer , out var length ) ) ;
55
+ Assert . Equal ( HeaderWriteResult . Done , HPackHeaderWriter . BeginEncodeHeaders ( 302 , hpackEncoder , enumerator , buffer , out var length ) ) ;
56
56
57
57
var result = buffer . Slice ( 5 , length - 5 ) . ToArray ( ) ;
58
58
var hex = BitConverter . ToString ( result ) ;
@@ -81,7 +81,7 @@ public void BeginEncodeHeaders_MaxHeaderTableSizeExceeded_EvictionsToFit()
81
81
82
82
// First response
83
83
enumerator . Initialize ( headers ) ;
84
- Assert . True ( HPackHeaderWriter . BeginEncodeHeaders ( 302 , hpackEncoder , enumerator , buffer , out var length ) ) ;
84
+ Assert . Equal ( HeaderWriteResult . Done , HPackHeaderWriter . BeginEncodeHeaders ( 302 , hpackEncoder , enumerator , buffer , out var length ) ) ;
85
85
86
86
var result = buffer . Slice ( 0 , length ) . ToArray ( ) ;
87
87
var hex = BitConverter . ToString ( result ) ;
@@ -123,7 +123,7 @@ public void BeginEncodeHeaders_MaxHeaderTableSizeExceeded_EvictionsToFit()
123
123
124
124
// Second response
125
125
enumerator . Initialize ( headers ) ;
126
- Assert . True ( HPackHeaderWriter . BeginEncodeHeaders ( 307 , hpackEncoder , enumerator , buffer , out length ) ) ;
126
+ Assert . Equal ( HeaderWriteResult . Done , HPackHeaderWriter . BeginEncodeHeaders ( 307 , hpackEncoder , enumerator , buffer , out length ) ) ;
127
127
128
128
result = buffer . Slice ( 0 , length ) . ToArray ( ) ;
129
129
hex = BitConverter . ToString ( result ) ;
@@ -164,7 +164,7 @@ public void BeginEncodeHeaders_MaxHeaderTableSizeExceeded_EvictionsToFit()
164
164
headers . SetCookie = "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1" ;
165
165
166
166
enumerator . Initialize ( headers ) ;
167
- Assert . True ( HPackHeaderWriter . BeginEncodeHeaders ( 200 , hpackEncoder , enumerator , buffer , out length ) ) ;
167
+ Assert . Equal ( HeaderWriteResult . Done , HPackHeaderWriter . BeginEncodeHeaders ( 200 , hpackEncoder , enumerator , buffer , out length ) ) ;
168
168
169
169
result = buffer . Slice ( 0 , length ) . ToArray ( ) ;
170
170
hex = BitConverter . ToString ( result ) ;
@@ -225,7 +225,7 @@ public void BeginEncodeHeadersCustomEncoding_MaxHeaderTableSizeExceeded_Eviction
225
225
226
226
// First response
227
227
enumerator . Initialize ( ( HttpResponseHeaders ) headers ) ;
228
- Assert . True ( HPackHeaderWriter . BeginEncodeHeaders ( 302 , hpackEncoder , enumerator , buffer , out var length ) ) ;
228
+ Assert . Equal ( HeaderWriteResult . Done , HPackHeaderWriter . BeginEncodeHeaders ( 302 , hpackEncoder , enumerator , buffer , out var length ) ) ;
229
229
230
230
var result = buffer . Slice ( 0 , length ) . ToArray ( ) ;
231
231
var hex = BitConverter . ToString ( result ) ;
@@ -267,7 +267,7 @@ public void BeginEncodeHeadersCustomEncoding_MaxHeaderTableSizeExceeded_Eviction
267
267
268
268
// Second response
269
269
enumerator . Initialize ( headers ) ;
270
- Assert . True ( HPackHeaderWriter . BeginEncodeHeaders ( 307 , hpackEncoder , enumerator , buffer , out length ) ) ;
270
+ Assert . Equal ( HeaderWriteResult . Done , HPackHeaderWriter . BeginEncodeHeaders ( 307 , hpackEncoder , enumerator , buffer , out length ) ) ;
271
271
272
272
result = buffer . Slice ( 0 , length ) . ToArray ( ) ;
273
273
hex = BitConverter . ToString ( result ) ;
@@ -308,7 +308,7 @@ public void BeginEncodeHeadersCustomEncoding_MaxHeaderTableSizeExceeded_Eviction
308
308
headers . SetCookie = "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1" ;
309
309
310
310
enumerator . Initialize ( headers ) ;
311
- Assert . True ( HPackHeaderWriter . BeginEncodeHeaders ( 200 , hpackEncoder , enumerator , buffer , out length ) ) ;
311
+ Assert . Equal ( HeaderWriteResult . Done , HPackHeaderWriter . BeginEncodeHeaders ( 200 , hpackEncoder , enumerator , buffer , out length ) ) ;
312
312
313
313
result = buffer . Slice ( 0 , length ) . ToArray ( ) ;
314
314
hex = BitConverter . ToString ( result ) ;
@@ -366,7 +366,7 @@ public void BeginEncodeHeaders_ExcludedHeaders_NotAddedToTable(string headerName
366
366
enumerator . Initialize ( headers ) ;
367
367
368
368
var hpackEncoder = new DynamicHPackEncoder ( maxHeaderTableSize : Http2PeerSettings . DefaultHeaderTableSize ) ;
369
- Assert . True ( HPackHeaderWriter . BeginEncodeHeaders ( hpackEncoder , enumerator , buffer , out _ ) ) ;
369
+ Assert . Equal ( HeaderWriteResult . Done , HPackHeaderWriter . BeginEncodeHeaders ( hpackEncoder , enumerator , buffer , out _ ) ) ;
370
370
371
371
if ( neverIndex )
372
372
{
@@ -392,7 +392,7 @@ public void BeginEncodeHeaders_HeaderExceedHeaderTableSize_NoIndexAndNoHeaderEnt
392
392
enumerator . Initialize ( headers ) ;
393
393
394
394
var hpackEncoder = new DynamicHPackEncoder ( ) ;
395
- Assert . True ( HPackHeaderWriter . BeginEncodeHeaders ( 200 , hpackEncoder , enumerator , buffer , out var length ) ) ;
395
+ Assert . Equal ( HeaderWriteResult . Done , HPackHeaderWriter . BeginEncodeHeaders ( 200 , hpackEncoder , enumerator , buffer , out var length ) ) ;
396
396
397
397
Assert . Empty ( GetHeaderEntries ( hpackEncoder ) ) ;
398
398
}
@@ -482,11 +482,11 @@ public void EncodesHeadersInSinglePayloadWhenSpaceAvailable(KeyValuePair<string,
482
482
var length = 0 ;
483
483
if ( statusCode . HasValue )
484
484
{
485
- Assert . True ( HPackHeaderWriter . BeginEncodeHeaders ( statusCode . Value , hpackEncoder , GetHeadersEnumerator ( headers ) , payload , out length ) ) ;
485
+ Assert . Equal ( HeaderWriteResult . Done , HPackHeaderWriter . BeginEncodeHeaders ( statusCode . Value , hpackEncoder , GetHeadersEnumerator ( headers ) , payload , out length ) ) ;
486
486
}
487
487
else
488
488
{
489
- Assert . True ( HPackHeaderWriter . BeginEncodeHeaders ( hpackEncoder , GetHeadersEnumerator ( headers ) , payload , out length ) ) ;
489
+ Assert . Equal ( HeaderWriteResult . Done , HPackHeaderWriter . BeginEncodeHeaders ( hpackEncoder , GetHeadersEnumerator ( headers ) , payload , out length ) ) ;
490
490
}
491
491
Assert . Equal ( expectedPayload . Length , length ) ;
492
492
@@ -548,28 +548,28 @@ public void EncodesHeadersInMultiplePayloadsWhenSpaceNotAvailable(bool exactSize
548
548
549
549
// When !exactSize, slices are one byte short of fitting the next header
550
550
var sliceLength = expectedStatusCodePayload . Length + ( exactSize ? 0 : expectedDateHeaderPayload . Length - 1 ) ;
551
- Assert . False ( HPackHeaderWriter . BeginEncodeHeaders ( statusCode , hpackEncoder , headerEnumerator , payload . Slice ( offset , sliceLength ) , out var length ) ) ;
551
+ Assert . Equal ( HeaderWriteResult . MoreHeaders , HPackHeaderWriter . BeginEncodeHeaders ( statusCode , hpackEncoder , headerEnumerator , payload . Slice ( offset , sliceLength ) , out var length ) ) ;
552
552
Assert . Equal ( expectedStatusCodePayload . Length , length ) ;
553
553
Assert . Equal ( expectedStatusCodePayload , payload . Slice ( 0 , length ) . ToArray ( ) ) ;
554
554
555
555
offset += length ;
556
556
557
557
sliceLength = expectedDateHeaderPayload . Length + ( exactSize ? 0 : expectedContentTypeHeaderPayload . Length - 1 ) ;
558
- Assert . False ( HPackHeaderWriter . ContinueEncodeHeaders ( hpackEncoder , headerEnumerator , payload . Slice ( offset , sliceLength ) , out length ) ) ;
558
+ Assert . Equal ( HeaderWriteResult . MoreHeaders , HPackHeaderWriter . ContinueEncodeHeaders ( hpackEncoder , headerEnumerator , payload . Slice ( offset , sliceLength ) , out length ) ) ;
559
559
Assert . Equal ( expectedDateHeaderPayload . Length , length ) ;
560
560
Assert . Equal ( expectedDateHeaderPayload , payload . Slice ( offset , length ) . ToArray ( ) ) ;
561
561
562
562
offset += length ;
563
563
564
564
sliceLength = expectedContentTypeHeaderPayload . Length + ( exactSize ? 0 : expectedServerHeaderPayload . Length - 1 ) ;
565
- Assert . False ( HPackHeaderWriter . ContinueEncodeHeaders ( hpackEncoder , headerEnumerator , payload . Slice ( offset , sliceLength ) , out length ) ) ;
565
+ Assert . Equal ( HeaderWriteResult . MoreHeaders , HPackHeaderWriter . ContinueEncodeHeaders ( hpackEncoder , headerEnumerator , payload . Slice ( offset , sliceLength ) , out length ) ) ;
566
566
Assert . Equal ( expectedContentTypeHeaderPayload . Length , length ) ;
567
567
Assert . Equal ( expectedContentTypeHeaderPayload , payload . Slice ( offset , length ) . ToArray ( ) ) ;
568
568
569
569
offset += length ;
570
570
571
571
sliceLength = expectedServerHeaderPayload . Length ;
572
- Assert . True ( HPackHeaderWriter . ContinueEncodeHeaders ( hpackEncoder , headerEnumerator , payload . Slice ( offset , sliceLength ) , out length ) ) ;
572
+ Assert . Equal ( HeaderWriteResult . Done , HPackHeaderWriter . ContinueEncodeHeaders ( hpackEncoder , headerEnumerator , payload . Slice ( offset , sliceLength ) , out length ) ) ;
573
573
Assert . Equal ( expectedServerHeaderPayload . Length , length ) ;
574
574
Assert . Equal ( expectedServerHeaderPayload , payload . Slice ( offset , length ) . ToArray ( ) ) ;
575
575
}
@@ -586,7 +586,7 @@ public void BeginEncodeHeaders_MaxHeaderTableSizeUpdated_SizeUpdateInHeaders()
586
586
587
587
// First request
588
588
enumerator . Initialize ( new Dictionary < string , StringValues > ( ) ) ;
589
- Assert . True ( HPackHeaderWriter . BeginEncodeHeaders ( hpackEncoder , enumerator , buffer , out var length ) ) ;
589
+ Assert . Equal ( HeaderWriteResult . Done , HPackHeaderWriter . BeginEncodeHeaders ( hpackEncoder , enumerator , buffer , out var length ) ) ;
590
590
591
591
Assert . Equal ( 2 , length ) ;
592
592
@@ -600,11 +600,68 @@ public void BeginEncodeHeaders_MaxHeaderTableSizeUpdated_SizeUpdateInHeaders()
600
600
601
601
// Second request
602
602
enumerator . Initialize ( new Dictionary < string , StringValues > ( ) ) ;
603
- Assert . True ( HPackHeaderWriter . BeginEncodeHeaders ( hpackEncoder , enumerator , buffer , out length ) ) ;
603
+ Assert . Equal ( HeaderWriteResult . Done , HPackHeaderWriter . BeginEncodeHeaders ( hpackEncoder , enumerator , buffer , out length ) ) ;
604
604
605
605
Assert . Equal ( 0 , length ) ;
606
606
}
607
607
608
+ [ Fact ]
609
+ public void WithStatusCode_TooLargeHeader_ReturnsNotDone ( )
610
+ {
611
+ Span < byte > buffer = new byte [ 1024 * 16 ] ;
612
+
613
+ IHeaderDictionary headers = new HttpResponseHeaders ( ) ;
614
+ headers . Cookie = new string ( 'a' , buffer . Length + 1 ) ;
615
+ var enumerator = new Http2HeadersEnumerator ( ) ;
616
+ enumerator . Initialize ( headers ) ;
617
+
618
+ var hpackEncoder = new DynamicHPackEncoder ( ) ;
619
+ Assert . Equal ( HeaderWriteResult . MoreHeaders , HPackHeaderWriter . BeginEncodeHeaders ( 200 , hpackEncoder , enumerator , buffer , out var length ) ) ;
620
+ }
621
+
622
+ [ Fact ]
623
+ public void NoStatusCodeLargeHeader_ReturnsOversized ( )
624
+ {
625
+ Span < byte > buffer = new byte [ 1024 * 16 ] ;
626
+
627
+ IHeaderDictionary headers = new HttpResponseHeaders ( ) ;
628
+ headers . Cookie = new string ( 'a' , buffer . Length + 1 ) ;
629
+ var enumerator = new Http2HeadersEnumerator ( ) ;
630
+ enumerator . Initialize ( headers ) ;
631
+
632
+ var hpackEncoder = new DynamicHPackEncoder ( ) ;
633
+ Assert . Equal ( HeaderWriteResult . BufferTooSmall , HPackHeaderWriter . BeginEncodeHeaders ( hpackEncoder , enumerator , buffer , out var length ) ) ;
634
+ }
635
+
636
+ [ Fact ]
637
+ public void WithStatusCode_JustFittingHeaderNoSpace_ReturnsNotDone ( )
638
+ {
639
+ Span < byte > buffer = new byte [ 1024 * 16 ] ;
640
+
641
+ IHeaderDictionary headers = new HttpResponseHeaders ( ) ;
642
+ headers . Cookie = new string ( 'a' , buffer . Length - 1 ) ;
643
+ var enumerator = new Http2HeadersEnumerator ( ) ;
644
+ enumerator . Initialize ( headers ) ;
645
+
646
+ var hpackEncoder = new DynamicHPackEncoder ( ) ;
647
+ Assert . Equal ( HeaderWriteResult . MoreHeaders , HPackHeaderWriter . BeginEncodeHeaders ( 200 , hpackEncoder , enumerator , buffer , out var length ) ) ;
648
+ }
649
+
650
+ [ Fact ]
651
+ public void NoStatusCode_JustFittingHeaderNoSpace_ReturnsNotDone ( )
652
+ {
653
+ Span < byte > buffer = new byte [ 1024 * 16 ] ;
654
+
655
+ IHeaderDictionary headers = new HttpResponseHeaders ( ) ;
656
+ headers . Accept = "application/json;" ;
657
+ headers . Cookie = new string ( 'a' , buffer . Length - 1 ) ;
658
+ var enumerator = new Http2HeadersEnumerator ( ) ;
659
+ enumerator . Initialize ( headers ) ;
660
+
661
+ var hpackEncoder = new DynamicHPackEncoder ( ) ;
662
+ Assert . Equal ( HeaderWriteResult . MoreHeaders , HPackHeaderWriter . BeginEncodeHeaders ( hpackEncoder , enumerator , buffer , out var length ) ) ;
663
+ }
664
+
608
665
private static Http2HeadersEnumerator GetHeadersEnumerator ( IEnumerable < KeyValuePair < string , string > > headers )
609
666
{
610
667
var groupedHeaders = headers
0 commit comments