1515 */
1616package io .netty .handler .codec .http ;
1717
18+ import io .netty .buffer .ByteBuf ;
1819import io .netty .buffer .Unpooled ;
1920import io .netty .channel .embedded .EmbeddedChannel ;
2021import io .netty .handler .codec .TooLongFrameException ;
@@ -357,6 +358,75 @@ public void testTooLargeHeaders() {
357358 assertFalse (channel .finish ());
358359 }
359360
361+ @ Test
362+ public void testHeaderNameStartsWithControlChar1c () {
363+ testHeaderNameStartsWithControlChar (0x1c );
364+ }
365+
366+ @ Test
367+ public void testHeaderNameStartsWithControlChar1d () {
368+ testHeaderNameStartsWithControlChar (0x1d );
369+ }
370+
371+ @ Test
372+ public void testHeaderNameStartsWithControlChar1e () {
373+ testHeaderNameStartsWithControlChar (0x1e );
374+ }
375+
376+ @ Test
377+ public void testHeaderNameStartsWithControlChar1f () {
378+ testHeaderNameStartsWithControlChar (0x1f );
379+ }
380+
381+ @ Test
382+ public void testHeaderNameStartsWithControlChar0c () {
383+ testHeaderNameStartsWithControlChar (0x0c );
384+ }
385+
386+ private void testHeaderNameStartsWithControlChar (int controlChar ) {
387+ ByteBuf requestBuffer = Unpooled .buffer ();
388+ requestBuffer .writeCharSequence ("GET /some/path HTTP/1.1\r \n " +
389+ "Host: netty.io\r \n " , CharsetUtil .US_ASCII );
390+ requestBuffer .writeByte (controlChar );
391+ requestBuffer .writeCharSequence ("Transfer-Encoding: chunked\r \n \r \n " , CharsetUtil .US_ASCII );
392+ testInvalidHeaders0 (requestBuffer );
393+ }
394+
395+ @ Test
396+ public void testHeaderNameEndsWithControlChar1c () {
397+ testHeaderNameEndsWithControlChar (0x1c );
398+ }
399+
400+ @ Test
401+ public void testHeaderNameEndsWithControlChar1d () {
402+ testHeaderNameEndsWithControlChar (0x1d );
403+ }
404+
405+ @ Test
406+ public void testHeaderNameEndsWithControlChar1e () {
407+ testHeaderNameEndsWithControlChar (0x1e );
408+ }
409+
410+ @ Test
411+ public void testHeaderNameEndsWithControlChar1f () {
412+ testHeaderNameEndsWithControlChar (0x1f );
413+ }
414+
415+ @ Test
416+ public void testHeaderNameEndsWithControlChar0c () {
417+ testHeaderNameEndsWithControlChar (0x0c );
418+ }
419+
420+ private void testHeaderNameEndsWithControlChar (int controlChar ) {
421+ ByteBuf requestBuffer = Unpooled .buffer ();
422+ requestBuffer .writeCharSequence ("GET /some/path HTTP/1.1\r \n " +
423+ "Host: netty.io\r \n " , CharsetUtil .US_ASCII );
424+ requestBuffer .writeCharSequence ("Transfer-Encoding" , CharsetUtil .US_ASCII );
425+ requestBuffer .writeByte (controlChar );
426+ requestBuffer .writeCharSequence (": chunked\r \n \r \n " , CharsetUtil .US_ASCII );
427+ testInvalidHeaders0 (requestBuffer );
428+ }
429+
360430 @ Test
361431 public void testWhitespace () {
362432 String requestStr = "GET /some/path HTTP/1.1\r \n " +
@@ -366,19 +436,19 @@ public void testWhitespace() {
366436 }
367437
368438 @ Test
369- public void testWhitespaceBeforeTransferEncoding01 () {
439+ public void testWhitespaceInTransferEncoding01 () {
370440 String requestStr = "GET /some/path HTTP/1.1\r \n " +
371- " Transfer-Encoding : chunked\r \n " +
441+ "Transfer-Encoding : chunked\r \n " +
372442 "Content-Length: 1\r \n " +
373443 "Host: netty.io\r \n \r \n " +
374444 "a" ;
375445 testInvalidHeaders0 (requestStr );
376446 }
377447
378448 @ Test
379- public void testWhitespaceBeforeTransferEncoding02 () {
449+ public void testWhitespaceInTransferEncoding02 () {
380450 String requestStr = "POST / HTTP/1.1" +
381- " Transfer-Encoding : chunked\r \n " +
451+ "Transfer-Encoding : chunked\r \n " +
382452 "Host: target.com" +
383453 "Content-Length: 65\r \n \r \n " +
384454 "0\r \n \r \n " +
@@ -475,6 +545,7 @@ public void testContentLengthHeaderAndChunked() {
475545 assertTrue (request .headers ().contains ("Transfer-Encoding" , "chunked" , false ));
476546 assertFalse (request .headers ().contains ("Content-Length" ));
477547 LastHttpContent c = channel .readInbound ();
548+ c .release ();
478549 assertFalse (channel .finish ());
479550 }
480551
@@ -499,11 +570,15 @@ public void testHttpMessageDecoderResult() {
499570 }
500571
501572 private static void testInvalidHeaders0 (String requestStr ) {
573+ testInvalidHeaders0 (Unpooled .copiedBuffer (requestStr , CharsetUtil .US_ASCII ));
574+ }
575+
576+ private static void testInvalidHeaders0 (ByteBuf requestBuffer ) {
502577 EmbeddedChannel channel = new EmbeddedChannel (new HttpRequestDecoder ());
503- assertTrue (channel .writeInbound (Unpooled . copiedBuffer ( requestStr , CharsetUtil . US_ASCII ) ));
578+ assertTrue (channel .writeInbound (requestBuffer ));
504579 HttpRequest request = channel .readInbound ();
580+ assertThat (request .decoderResult ().cause (), instanceOf (IllegalArgumentException .class ));
505581 assertTrue (request .decoderResult ().isFailure ());
506- assertTrue (request .decoderResult ().cause () instanceof IllegalArgumentException );
507582 assertFalse (channel .finish ());
508583 }
509584}
0 commit comments