Compare commits

...

3 커밋

작성자 SHA1 메시지 날짜
Ben Brown c24b5051c0 User-Agent header no longer needs a leading space 2013-02-23 12:22:33 +01:00
Ben Brown 23181d6f4f Corrected Host header handling (fixes #2477) 2013-02-19 20:03:57 +00:00
Jyri J. Virkki b720a89d55 Fix header parsing to compare HTTP header field names case
insensitively. This fixes the problem where responses get incorrectly
marked as errors if the response header field name case doesn't happen
to match to what is in the code.

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 <stbuehler@web.de>
2013-01-07 15:08:05 +01:00
2개의 변경된 파일37개의 추가작업 그리고 12개의 파일을 삭제

파일 보기

@ -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;

파일 보기

@ -76,9 +76,11 @@ static char *forge_request(char *url, char keep_alive, char **host, uint16_t *po
uint32_t len;
uint8_t i;
uint8_t have_user_agent;
char *header_host;
*host = NULL;
*port = 0;
header_host = NULL;
if (strncmp(url, "http://", 7) == 0)
url += 7;
@ -137,8 +139,27 @@ static char *forge_request(char *url, char keep_alive, char **host, uint16_t *po
have_user_agent = 0;
for (i = 0; i < headers_num; i++) {
if (strncmp(headers[i], "Host:", sizeof("Host:")-1) == 0) {
if (header_host) {
W_ERROR("%s", "Duplicate Host header");
free(*host);
return NULL;
}
header_host = headers[i] + 5;
if (*header_host == ' ')
header_host++;
if (strlen(header_host) == 0) {
W_ERROR("%s", "Invalid Host header");
free(*host);
return NULL;
}
len += strlen(header_host);
continue;
}
len += strlen(headers[i]) + strlen("\r\n");
if (strncmp(headers[i], "User-Agent: ", sizeof("User-Agent: ")-1) == 0)
if (strncmp(headers[i], "User-Agent:", sizeof("User-Agent:")-1) == 0)
have_user_agent = 1;
}
@ -150,9 +171,13 @@ static char *forge_request(char *url, char keep_alive, char **host, uint16_t *po
strcpy(req, "GET ");
strcat(req, url);
strcat(req, " HTTP/1.1\r\nHost: ");
strcat(req, *host);
if (*port != 80)
sprintf(req + strlen(req), ":%"PRIu16, *port);
if (header_host) {
strcat(req, header_host);
} else {
strcat(req, *host);
if (*port != 80)
sprintf(req + strlen(req), ":%"PRIu16, *port);
}
strcat(req, "\r\n");
@ -160,6 +185,8 @@ static char *forge_request(char *url, char keep_alive, char **host, uint16_t *po
sprintf(req + strlen(req), "User-Agent: weighttp/" VERSION "\r\n");
for (i = 0; i < headers_num; i++) {
if (strncmp(headers[i], "Host:", sizeof("Host:")-1) == 0)
continue;
strcat(req, headers[i]);
strcat(req, "\r\n");
}