Svetlin wrote on github
According to RFC2616, all header field names in both HTTP requests and HTTP responses are case-insensitive. But libwebsockets uses a case-sensitive compare.
Reproduce:
Run libwebsockets against a server that sends all of its HTTP header field names in lower-case (for example: https://github.com/extend/cowboy). libwebsockets reports an error. The expected behavior is no errors reported and a successful handshake procedure.
This changes the parser reference table in minilex to all lower case.
The code to walk the parser tables then just forces a tolower on the incoming chars.
This (and minilex tables) only applies to header names.
Reported-by: svetlin-mladnov <?@github>
Signed-off-by: Andy Green <andy.green@linaro.org>
Clean up minilex
Move the header output to stdout
Introduce lexfile.h as the header output
Use lexfile.h in both minilex itself and lws
Add the following header support
"Accept:",
"If-Modified-Since:",
"Accept-Encoding:",
"Accept-Language:",
"Pragma:",
"Cache-Control:",
"Authorization:",
"Cookie:",
"Content-Type:",
"Date:",
"Range:",
"Referer:"
Signed-off-by: Andy Green <andy.green@linaro.org>
Profiling what happens during the ab test, one of the hotspots
was strcasecmp in a loop looking for header name matches each time.
This patch introduces a lexical parser that creates a state machine
in 276 bytes that encodes all the known header names. The fsm is
walked bytewise as chaacters come in... most states do not need any
recursion to match or fail.
The state machine output is cut-and-pasted into parsers.c as an
unsigned char array.
The fsm generator is a bit rough and ready, included in the tree but
not built since normal mortals won't need to touch it.
Signed-off-by: Andy Green <andy.green@linaro.org>