@@ -29,7 +29,7 @@ public void BeginEncodeHeaders_Status302_NewIndexValue()
2929 enumerator . Initialize ( headers ) ;
3030
3131 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 ) ) ;
3333
3434 var result = buffer . Slice ( 0 , length ) . ToArray ( ) ;
3535 var hex = BitConverter . ToString ( result ) ;
@@ -52,7 +52,7 @@ public void BeginEncodeHeaders_CacheControlPrivate_NewIndexValue()
5252 enumerator . Initialize ( headers ) ;
5353
5454 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 ) ) ;
5656
5757 var result = buffer . Slice ( 5 , length - 5 ) . ToArray ( ) ;
5858 var hex = BitConverter . ToString ( result ) ;
@@ -81,7 +81,7 @@ public void BeginEncodeHeaders_MaxHeaderTableSizeExceeded_EvictionsToFit()
8181
8282 // First response
8383 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 ) ) ;
8585
8686 var result = buffer . Slice ( 0 , length ) . ToArray ( ) ;
8787 var hex = BitConverter . ToString ( result ) ;
@@ -123,7 +123,7 @@ public void BeginEncodeHeaders_MaxHeaderTableSizeExceeded_EvictionsToFit()
123123
124124 // Second response
125125 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 ) ) ;
127127
128128 result = buffer . Slice ( 0 , length ) . ToArray ( ) ;
129129 hex = BitConverter . ToString ( result ) ;
@@ -164,7 +164,7 @@ public void BeginEncodeHeaders_MaxHeaderTableSizeExceeded_EvictionsToFit()
164164 headers . SetCookie = "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1" ;
165165
166166 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 ) ) ;
168168
169169 result = buffer . Slice ( 0 , length ) . ToArray ( ) ;
170170 hex = BitConverter . ToString ( result ) ;
@@ -225,7 +225,7 @@ public void BeginEncodeHeadersCustomEncoding_MaxHeaderTableSizeExceeded_Eviction
225225
226226 // First response
227227 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 ) ) ;
229229
230230 var result = buffer . Slice ( 0 , length ) . ToArray ( ) ;
231231 var hex = BitConverter . ToString ( result ) ;
@@ -267,7 +267,7 @@ public void BeginEncodeHeadersCustomEncoding_MaxHeaderTableSizeExceeded_Eviction
267267
268268 // Second response
269269 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 ) ) ;
271271
272272 result = buffer . Slice ( 0 , length ) . ToArray ( ) ;
273273 hex = BitConverter . ToString ( result ) ;
@@ -308,7 +308,7 @@ public void BeginEncodeHeadersCustomEncoding_MaxHeaderTableSizeExceeded_Eviction
308308 headers . SetCookie = "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1" ;
309309
310310 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 ) ) ;
312312
313313 result = buffer . Slice ( 0 , length ) . ToArray ( ) ;
314314 hex = BitConverter . ToString ( result ) ;
@@ -366,7 +366,7 @@ public void BeginEncodeHeaders_ExcludedHeaders_NotAddedToTable(string headerName
366366 enumerator . Initialize ( headers ) ;
367367
368368 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 _ ) ) ;
370370
371371 if ( neverIndex )
372372 {
@@ -392,7 +392,7 @@ public void BeginEncodeHeaders_HeaderExceedHeaderTableSize_NoIndexAndNoHeaderEnt
392392 enumerator . Initialize ( headers ) ;
393393
394394 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 ) ) ;
396396
397397 Assert . Empty ( GetHeaderEntries ( hpackEncoder ) ) ;
398398 }
@@ -482,11 +482,11 @@ public void EncodesHeadersInSinglePayloadWhenSpaceAvailable(KeyValuePair<string,
482482 var length = 0 ;
483483 if ( statusCode . HasValue )
484484 {
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 ) ) ;
486486 }
487487 else
488488 {
489- Assert . True ( HPackHeaderWriter . BeginEncodeHeaders ( hpackEncoder , GetHeadersEnumerator ( headers ) , payload , out length ) ) ;
489+ Assert . Equal ( HeaderWriteResult . Done , HPackHeaderWriter . BeginEncodeHeaders ( hpackEncoder , GetHeadersEnumerator ( headers ) , payload , out length ) ) ;
490490 }
491491 Assert . Equal ( expectedPayload . Length , length ) ;
492492
@@ -548,28 +548,28 @@ public void EncodesHeadersInMultiplePayloadsWhenSpaceNotAvailable(bool exactSize
548548
549549 // When !exactSize, slices are one byte short of fitting the next header
550550 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 ) ) ;
552552 Assert . Equal ( expectedStatusCodePayload . Length , length ) ;
553553 Assert . Equal ( expectedStatusCodePayload , payload . Slice ( 0 , length ) . ToArray ( ) ) ;
554554
555555 offset += length ;
556556
557557 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 ) ) ;
559559 Assert . Equal ( expectedDateHeaderPayload . Length , length ) ;
560560 Assert . Equal ( expectedDateHeaderPayload , payload . Slice ( offset , length ) . ToArray ( ) ) ;
561561
562562 offset += length ;
563563
564564 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 ) ) ;
566566 Assert . Equal ( expectedContentTypeHeaderPayload . Length , length ) ;
567567 Assert . Equal ( expectedContentTypeHeaderPayload , payload . Slice ( offset , length ) . ToArray ( ) ) ;
568568
569569 offset += length ;
570570
571571 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 ) ) ;
573573 Assert . Equal ( expectedServerHeaderPayload . Length , length ) ;
574574 Assert . Equal ( expectedServerHeaderPayload , payload . Slice ( offset , length ) . ToArray ( ) ) ;
575575 }
@@ -586,7 +586,7 @@ public void BeginEncodeHeaders_MaxHeaderTableSizeUpdated_SizeUpdateInHeaders()
586586
587587 // First request
588588 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 ) ) ;
590590
591591 Assert . Equal ( 2 , length ) ;
592592
@@ -600,11 +600,69 @@ public void BeginEncodeHeaders_MaxHeaderTableSizeUpdated_SizeUpdateInHeaders()
600600
601601 // Second request
602602 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 ) ) ;
604604
605605 Assert . Equal ( 0 , length ) ;
606606 }
607607
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+
637+ [ Fact ]
638+ public void WithStatusCode_JustFittingHeaderNoSpace_ReturnsNotDone ( )
639+ {
640+ Span < byte > buffer = new byte [ 1024 * 16 ] ;
641+
642+ IHeaderDictionary headers = new HttpResponseHeaders ( ) ;
643+ headers . Cookie = new string ( 'a' , buffer . Length - 1 ) ;
644+ var enumerator = new Http2HeadersEnumerator ( ) ;
645+ enumerator . Initialize ( headers ) ;
646+
647+ var hpackEncoder = new DynamicHPackEncoder ( ) ;
648+ Assert . Equal ( HeaderWriteResult . MoreHeaders , HPackHeaderWriter . BeginEncodeHeaders ( 200 , hpackEncoder , enumerator , buffer , out var length ) ) ;
649+ }
650+
651+ [ Fact ]
652+ public void NoStatusCode_JustFittingHeaderNoSpace_ReturnsNotDone ( )
653+ {
654+ Span < byte > buffer = new byte [ 1024 * 16 ] ;
655+
656+ IHeaderDictionary headers = new HttpResponseHeaders ( ) ;
657+ headers . Accept = "application/json;" ;
658+ headers . Cookie = new string ( 'a' , buffer . Length - 1 ) ;
659+ var enumerator = new Http2HeadersEnumerator ( ) ;
660+ enumerator . Initialize ( headers ) ;
661+
662+ var hpackEncoder = new DynamicHPackEncoder ( ) ;
663+ Assert . Equal ( HeaderWriteResult . MoreHeaders , HPackHeaderWriter . BeginEncodeHeaders ( hpackEncoder , enumerator , buffer , out var length ) ) ;
664+ }
665+
608666 private static Http2HeadersEnumerator GetHeadersEnumerator ( IEnumerable < KeyValuePair < string , string > > headers )
609667 {
610668 var groupedHeaders = headers
0 commit comments