lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


It was thus said that the Great Albert Chan once stated:
> On Aug 17, 2018, at 8:33 PM, Sean Conner <sean@conman.org> wrote:
> 
> > The following code presents the bug:
> > 
> > url  = require "org.conman.parsers.url.url"
> > lpeg = require "lpeg"
> > 
> > x = url * lpeg.Cp()
> > 
> > a,b = x:match "/status"   print(b) -- prints 8, okay
> > a,b = x:match "/status/"  print(b) -- prints 9, okay
> > a,b = x:match "/status "  print(b) -- prints 8, okay
> > a,b = x:match "/status/ " print(b) -- prints 8, WAT?
> 
> Hi, Sean
> 
> Is the expected result  9 ? 10 ?

  The expected result is nine.

  I found the error trying to parse HTTP requests as such:

local request = Ct(
                       Cg(Method, 'method')   * abnf.WSP
                     * Cg(url,    'location') * abnf.WSP
                       -- ^^^ this is org.conman.parsers.url.url
                     * Cg(version,'version')
		)

  It was a piece of a larger expression.  It worked fine when the request
was:

		GET /status HTTP/1.1

but failed to parse

		GET /status/ HTTP/1.1

since the pieces being parsed were:

		"GET"		captured
		" "		parsed but ignored
		"/status"	captured
		" "		parsed but ignored
		"/ HTTP/1.1"	oops, this isn't a valid version ...

  With the help from Daurnimator, I was able to get the parse correct, but
it revealed an issue I didn't see (but is obvious in hindsight) due to how I
store that part of the URL structure. [1].

  Thank you for your try at this.

  -spc

[1]	Now that I think about it, I think I can live with the result.