@@ -423,6 +423,86 @@ public function testInvalidHttpVersion()
423423 $ this ->assertSame ('Received request with invalid protocol version ' , $ error ->getMessage ());
424424 }
425425
426+ public function testInvalidContentLengthRequestHeaderWillEmitError ()
427+ {
428+ $ error = null ;
429+
430+ $ parser = new RequestHeaderParser ();
431+ $ parser ->on ('headers ' , $ this ->expectCallableNever ());
432+ $ parser ->on ('error ' , function ($ message ) use (&$ error ) {
433+ $ error = $ message ;
434+ });
435+
436+ $ connection = $ this ->getMockBuilder ('React\Socket\Connection ' )->disableOriginalConstructor ()->setMethods (null )->getMock ();
437+ $ parser ->handle ($ connection );
438+
439+ $ connection ->emit ('data ' , array ("GET / HTTP/1.1 \r\nContent-Length: foo \r\n\r\n" ));
440+
441+ $ this ->assertInstanceOf ('InvalidArgumentException ' , $ error );
442+ $ this ->assertSame (400 , $ error ->getCode ());
443+ $ this ->assertSame ('The value of `Content-Length` is not valid ' , $ error ->getMessage ());
444+ }
445+
446+ public function testInvalidRequestWithMultipleContentLengthRequestHeadersWillEmitError ()
447+ {
448+ $ error = null ;
449+
450+ $ parser = new RequestHeaderParser ();
451+ $ parser ->on ('headers ' , $ this ->expectCallableNever ());
452+ $ parser ->on ('error ' , function ($ message ) use (&$ error ) {
453+ $ error = $ message ;
454+ });
455+
456+ $ connection = $ this ->getMockBuilder ('React\Socket\Connection ' )->disableOriginalConstructor ()->setMethods (null )->getMock ();
457+ $ parser ->handle ($ connection );
458+
459+ $ connection ->emit ('data ' , array ("GET / HTTP/1.1 \r\nContent-Length: 4 \r\nContent-Length: 5 \r\n\r\n" ));
460+
461+ $ this ->assertInstanceOf ('InvalidArgumentException ' , $ error );
462+ $ this ->assertSame (400 , $ error ->getCode ());
463+ $ this ->assertSame ('The value of `Content-Length` is not valid ' , $ error ->getMessage ());
464+ }
465+
466+ public function testInvalidTransferEncodingRequestHeaderWillEmitError ()
467+ {
468+ $ error = null ;
469+
470+ $ parser = new RequestHeaderParser ();
471+ $ parser ->on ('headers ' , $ this ->expectCallableNever ());
472+ $ parser ->on ('error ' , function ($ message ) use (&$ error ) {
473+ $ error = $ message ;
474+ });
475+
476+ $ connection = $ this ->getMockBuilder ('React\Socket\Connection ' )->disableOriginalConstructor ()->setMethods (null )->getMock ();
477+ $ parser ->handle ($ connection );
478+
479+ $ connection ->emit ('data ' , array ("GET / HTTP/1.1 \r\nTransfer-Encoding: foo \r\n\r\n" ));
480+
481+ $ this ->assertInstanceOf ('InvalidArgumentException ' , $ error );
482+ $ this ->assertSame (501 , $ error ->getCode ());
483+ $ this ->assertSame ('Only chunked-encoding is allowed for Transfer-Encoding ' , $ error ->getMessage ());
484+ }
485+
486+ public function testInvalidRequestWithBothTransferEncodingAndContentLengthWillEmitError ()
487+ {
488+ $ error = null ;
489+
490+ $ parser = new RequestHeaderParser ();
491+ $ parser ->on ('headers ' , $ this ->expectCallableNever ());
492+ $ parser ->on ('error ' , function ($ message ) use (&$ error ) {
493+ $ error = $ message ;
494+ });
495+
496+ $ connection = $ this ->getMockBuilder ('React\Socket\Connection ' )->disableOriginalConstructor ()->setMethods (null )->getMock ();
497+ $ parser ->handle ($ connection );
498+
499+ $ connection ->emit ('data ' , array ("GET / HTTP/1.1 \r\nTransfer-Encoding: chunked \r\nContent-Length: 0 \r\n\r\n" ));
500+
501+ $ this ->assertInstanceOf ('InvalidArgumentException ' , $ error );
502+ $ this ->assertSame (400 , $ error ->getCode ());
503+ $ this ->assertSame ('Using both `Transfer-Encoding: chunked` and `Content-Length` is not allowed ' , $ error ->getMessage ());
504+ }
505+
426506 public function testServerParamsWillBeSetOnHttpsRequest ()
427507 {
428508 $ request = null ;
0 commit comments