From: "Jyri J. Virkki" Date: Sun, 6 Jan 2013 02:21:09 -0800 Subject: =?UTF-8?q?Fix=20header=20parsing=20to=20compare=20HTTP=20header=20f?= =?UTF-8?q?ield=20names=20case=0Ainsensitively.=20This=20fixes=20the=20probl?= =?UTF-8?q?em=20where=20responses=20get=20incorrectly=0Amarked=20as=20errors?= =?UTF-8?q?=20if=20the=20response=20header=20field=20name=20case=20doesn't=20?= =?UTF-8?q?happen=0Ato=20match=20to=20what=20is=20in=20the=20code.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also compare connection and transfer-encoding tokens case insensitively. (Reference: RFC 2616: header field names are not case sensitive.) Co-authored-by: Stefan Bühler --- src/client.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/client.c b/src/client.c index f8875e4..dd48265 100644 --- a/src/client.c +++ b/src/client.c @@ -379,26 +379,24 @@ static uint8_t client_parse(Client *client, int size) { str = &client->buffer[client->parser_offset]; //printf("checking header: '%s'\n", str); - if (strncmp(str, "Content-Length: ", sizeof("Content-Length: ")-1) == 0) { + if (strncasecmp(str, "Content-Length: ", sizeof("Content-Length: ")-1) == 0) { /* content length header */ client->content_length = str_to_uint64(str + sizeof("Content-Length: ") - 1); - } else if (strncmp(str, "Connection: ", sizeof("Connection: ")-1) == 0) { + } else if (strncasecmp(str, "Connection: ", sizeof("Connection: ")-1) == 0) { /* connection header */ str += sizeof("Connection: ") - 1; - if (strncmp(str, "close", sizeof("close")-1) == 0) + if (strncasecmp(str, "close", sizeof("close")-1) == 0) client->keepalive = 0; - else if (strncmp(str, "Keep-Alive", sizeof("Keep-Alive")-1) == 0) - client->keepalive = client->worker->config->keep_alive; - else if (strncmp(str, "keep-alive", sizeof("keep-alive")-1) == 0) + else if (strncasecmp(str, "keep-alive", sizeof("keep-alive")-1) == 0) client->keepalive = client->worker->config->keep_alive; else return 0; - } else if (strncmp(str, "Transfer-Encoding: ", sizeof("Transfer-Encoding: ")-1) == 0) { + } else if (strncasecmp(str, "Transfer-Encoding: ", sizeof("Transfer-Encoding: ")-1) == 0) { /* transfer encoding header */ str += sizeof("Transfer-Encoding: ") - 1; - if (strncmp(str, "chunked", sizeof("chunked")-1) == 0) + if (strncasecmp(str, "chunked", sizeof("chunked")-1) == 0) client->chunked = 1; else return 0;