All files from this thread

File Name File Size   Posted by Date  
nginx__accept_and_unfold_multiline_headers.patch 6 KB open | download Piotr Sikora 09/20/2010 Read message
accept_and_unfold_multiline_headers.t 3.7 KB open | download Piotr Sikora 09/21/2010 Read message
accept_and_unfold_multiline_headers_v2.patch 6.2 KB open | download Piotr Sikora 09/21/2010 Read message
accept_and_unfold_multiline_headers_v3.patch 5.5 KB open | download Piotr Sikora 09/22/2010 Read message
August 26, 2009 04:36PM
Ok, not sure if this work is for naught... Here is the patch file (whitespace is dropped by the form):

--- nginx-0.7.61-clean/src/http/ngx_http_parse.c 2009-04-23 16:38:59.000000000 +0000
+++ nginx-0.7.61/src/http/ngx_http_parse.c 2009-08-12 18:50:47.000000000 +0000
@@ -699,6 +699,14 @@
}


+/* helper method that looks ahead one character to determine if the header is multiline */
+u_char
+next_char_indicates_multiline_header(u_char *p, ngx_buf_t *b) {
+ u_char next_char = ((p+1) < b->last ? *(p+1) : 0);
+ return (next_char && (next_char == ' ' || next_char == '\t'));
+}
+
+
ngx_int_t
ngx_http_parse_header_line(ngx_http_request_t *r, ngx_buf_t *b,
ngx_uint_t allow_underscores)
@@ -712,6 +720,7 @@
sw_value,
sw_space_after_value,
sw_ignore_line,
+ sw_almost_done_or_multiline_header,
sw_almost_done,
sw_header_almost_done
} state;
@@ -858,11 +867,13 @@
break;
case CR:
r->header_end = p;
- state = sw_almost_done;
+ state = sw_almost_done_or_multiline_header;
break;
case LF:
- r->header_end = p;
- goto done;
+ if (!next_char_indicates_multiline_header(p, b)) {
+ r->header_end = p;
+ goto done;
+ }
}
break;

@@ -872,10 +883,15 @@
case ' ':
break;
case CR:
- state = sw_almost_done;
+ state = sw_almost_done_or_multiline_header;
break;
case LF:
- goto done;
+ if (next_char_indicates_multiline_header(p, b)) {
+ state = sw_value;
+ } else {
+ goto done;
+ }
+ break;
default:
state = sw_value;
break;
@@ -893,6 +909,25 @@
}
break;

+ /* determine whether this is actually the end of the header or a multi-line header */
+ case sw_almost_done_or_multiline_header:
+ switch(ch) {
+ case LF:
+ if (next_char_indicates_multiline_header(p, b)) {
+ state = sw_value;
+ } else {
+ /* not a multi-line header, so rewind the current character and enter sw_almost_done state */
+ p--;
+ state = sw_almost_done;
+ }
+ break;
+ default:
+ /* not a multi-line header, so rewind the current character and enter sw_almost_done state */
+ p--;
+ state = sw_almost_done;
+ }
+ break;
+
/* end of header line */
case sw_almost_done:
switch (ch) {
Subject Author Posted

Multi-line headers patch

algorist August 12, 2009 06:51PM

Re: Multi-line headers patch

algorist August 13, 2009 05:52PM

Re: Multi-line headers patch

edogawaconan August 14, 2009 12:26AM

Re: Multi-line headers patch

algorist August 26, 2009 04:36PM

Re: Multi-line headers patch

Cliff Wells August 26, 2009 05:24PM

Re: Multi-line headers patch

Maxim Dounin August 26, 2009 07:21PM

Re: Multi-line headers patch Attachments

Piotr Sikora September 20, 2010 03:30PM

Re: Multi-line headers patch Attachments

Piotr Sikora September 21, 2010 09:42PM

Re: Multi-line headers patch

Maxim Dounin September 21, 2010 11:14PM

Re: Multi-line headers patch

Piotr Sikora September 22, 2010 12:46AM

Re: Multi-line headers patch Attachments

Piotr Sikora September 22, 2010 02:36AM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 155
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready