@@ -46,23 +46,30 @@ public function feed($data)
4646
4747 if (false !== $ endOfHeader ) {
4848 try {
49- $ this ->parseAndEmitRequest ();
49+ $ this ->parseAndEmitRequest ($ endOfHeader );
5050 } catch (Exception $ exception ) {
5151 $ this ->emit ('error ' , array ($ exception ));
5252 }
5353 $ this ->removeAllListeners ();
5454 }
5555 }
5656
57- private function parseAndEmitRequest ()
57+ private function parseAndEmitRequest ($ endOfHeader )
5858 {
59- list ($ request , $ bodyBuffer ) = $ this ->parseRequest ($ this ->buffer );
59+ $ request = $ this ->parseRequest ((string )substr ($ this ->buffer , 0 , $ endOfHeader ));
60+ $ bodyBuffer = isset ($ this ->buffer [$ endOfHeader + 4 ]) ? substr ($ this ->buffer , $ endOfHeader + 4 ) : '' ;
6061 $ this ->emit ('headers ' , array ($ request , $ bodyBuffer ));
6162 }
6263
63- private function parseRequest ($ data )
64+ private function parseRequest ($ headers )
6465 {
65- list ($ headers , $ bodyBuffer ) = explode ("\r\n\r\n" , $ data , 2 );
66+ // additional, stricter safe-guard for request line
67+ // because request parser doesn't properly cope with invalid ones
68+ if (!preg_match ('#^[^ ]+ [^ ]+ HTTP/\d\.\d#m ' , $ headers )) {
69+ throw new \InvalidArgumentException ('Unable to parse invalid request-line ' );
70+ }
71+
72+ $ lines = explode ("\r\n" , $ headers );
6673
6774 // parser does not support asterisk-form and authority-form
6875 // remember original target and temporarily replace and re-apply below
@@ -213,6 +220,6 @@ private function parseRequest($data)
213220 // always sanitize Host header because it contains critical routing information
214221 $ request = $ request ->withUri ($ request ->getUri ()->withUserInfo ('u ' )->withUserInfo ('' ));
215222
216- return array ( $ request, $ bodyBuffer ) ;
223+ return $ request ;
217224 }
218225}
0 commit comments