Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: implicit *LWS ?
On Thu, Oct 07, 2010 at 08:07:37PM +0400, Maxim Dounin wrote:
> > >
> > > Это фича, LWS не поддерживаются, да и в HTTPbis они deprecated.
> >
> > thanks.
> > Хотя, jimho, не поддерживать deprecated и not recommended headers - это
> > все-таки нарушение robustness principle (be liberal in what you accept).
>
> Кто ж спорит (хотя на самом деле с robustness principle нужно быть
> очень осторожным, ибо он любит оборачиваться security flaws). Но
> хорошего патча нет, а приоритет у этой задачи всилу описанных
> обстоятельств, скажем так, низкий.
но если будет сторонний патч, который удовлетворит критерию
"хорошести", он имеет шансы на интеграцию (например, в 0.9) ?
> > б) изменить логику чтения запроса, разрешив чтение в случае когда
> > буферизовано менее двух байт.
>
> Так нельзя - эти два байта вполне могут, скажем, вообще завершать
> запрос.
Убедили. Существует use-case, в котором такое поведение все ломает.
Второй вариант, модифицирующий только state machine, в аттаче.
--
In theory, there is no difference between theory and practice.
But, in practice, there is.
--- src/http/ngx_http_parse.c.orig 2010-10-06 21:37:13.000000000 +0400
+++ src/http/ngx_http_parse.c 2010-10-08 16:51:15.000000000 +0400
@@ -762,6 +762,9 @@
sw_space_before_value,
sw_value,
sw_space_after_value,
+ sw_CR_after_value,
+ sw_LF_after_value,
+ sw_CRLF_after_value,
sw_ignore_line,
sw_almost_done,
sw_header_almost_done
@@ -909,11 +912,12 @@
break;
case CR:
r->header_end = p;
- state = sw_almost_done;
+ state = sw_CR_after_value;
break;
case LF:
r->header_end = p;
- goto done;
+ state = sw_LF_after_value;
+ break;
}
break;
@@ -923,10 +927,11 @@
case ' ':
break;
case CR:
- state = sw_almost_done;
+ state = sw_CR_after_value;
break;
case LF:
- goto done;
+ state = sw_LF_after_value;
+ break;
default:
state = sw_value;
break;
@@ -944,6 +949,57 @@
}
break;
+ /* CR after value */
+ case sw_CR_after_value:
+ switch (ch) {
+ case ' ': case '\t':
+ *(p-1) = ' ';
+ state = sw_space_after_value;
+ break;
+ case LF:
+ state = sw_CRLF_after_value;
+ break;
+ default:
+ /* any other char means next header */
+ goto done_notlws;
+ }
+ break;
+
+ /* LF after value */
+ case sw_LF_after_value:
+ switch(ch) {
+ case ' ': case '\t':
+ *(p-1) = ' ';
+ state = sw_space_after_value;
+ break;
+ case LF :
+ /* whole header is done actually. reporting prev header */
+ goto done_notlws;
+ case CR :
+ /* value LF CR.... Not LWS anyway */
+ goto done_notlws;
+ default:
+ /* any other char means next header */
+ goto done_notlws;
+ }
+ break;
+
+ case sw_CRLF_after_value:
+ switch(ch) {
+ case ' ': case '\t':
+ *(p-2) = ' ';
+ *(p-1) = ' ';
+ state = sw_space_after_value;
+ break;
+ case CR : case LF:
+ /* whole header is done, actually. reporting prev header */
+ goto done_notlws;
+ default :
+ /* next header most likely. reporting prev header done */
+ goto done_notlws;
+ }
+ break;
+
/* end of header line */
case sw_almost_done:
switch (ch) {
@@ -983,6 +1039,15 @@
return NGX_OK;
+done_notlws:
+
+ b->pos = p;
+ r->state = sw_start;
+ r->header_hash = hash;
+ r->lowcase_index = i;
+
+ return NGX_OK;
+
header_done:
b->pos = p + 1;
_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://nginx.org/mailman/listinfo/nginx-ru
|