On Thu, May 21, 2020 at 08:40:08PM +0000, David Santiago wrote:
> Can someone explain me why my grammar isn't working? Unfortunately i
> can't figure it out :-(
> 
> |  headers
> |  |  header
> |  |  * MATCH "Proxy-Connection"
> |  |  header-value
> |  |  * MATCH "keep-alive\n"
> |  |  crlf
> |  |  * FAIL
> |  * FAIL
> * FAIL
> Nil

Notice how <header-value> is capturing the newline in "keep-alive\n"?  That 
means there's not a newline for the <.crlf> subrule that follows, and thus the 
match fails.

Try changing "rule header-value" to be a "token" instead.  That will prevent it 
from consuming any whitespace immediately following the <graph>+ sequence.  
When I tried your script with header-value defined as a token, it got a lot 
farther into the match:

  $ rakudo test.raku
  TOP
  |  request-line
  |  |  method
  |  |  * MATCH "CONNECT"
  |  |  request-uri
  |  |  * MATCH "ssl.gstatic.com:443"
  |  |  http-version
  |  |  * MATCH "HTTP/1.1"
  |  |  crlf
  |  |  * MATCH "\n"
  |  * MATCH "CONNECT ssl.gstatic.com:443 HTTP/1.1\n"
  |  headers
  |  |  header
  |  |  * MATCH "Proxy-Connection"
  |  |  header-value
  |  |  * MATCH "keep-alive"
  |  |  crlf
  |  |  * MATCH "\n"
  |  * MATCH "Proxy-Connection: keep-alive\n"
  * MATCH "CONNECT ssl.gstatic.com:443 HTTP/1.1\nProxy-Connection: keep-"
  Nil


Personally, I would likely define <header-value> to be something more like

    token header-value { \N+ }

which gets any sequence of non-newline characters, since some of the headers 
coming afterwards contain spaces and characters which aren't part of <graph>.

Pm

Reply via email to