mirror of
https://github.com/nginx/nginx.git
synced 2024-12-12 10:19:00 +08:00
refactor fastcgi stderr handling
This commit is contained in:
parent
b7a09c5523
commit
45ec56bdca
@ -1065,9 +1065,10 @@ ngx_http_fastcgi_reinit_request(ngx_http_request_t *r)
|
|||||||
static ngx_int_t
|
static ngx_int_t
|
||||||
ngx_http_fastcgi_process_header(ngx_http_request_t *r)
|
ngx_http_fastcgi_process_header(ngx_http_request_t *r)
|
||||||
{
|
{
|
||||||
u_char *p, *start, *last, *part_start, *part_end;
|
u_char *p, *msg, *start, *last,
|
||||||
|
*part_start, *part_end;
|
||||||
size_t size;
|
size_t size;
|
||||||
ngx_str_t *status_line, line, *pattern;
|
ngx_str_t *status_line, *pattern;
|
||||||
ngx_int_t rc, status;
|
ngx_int_t rc, status;
|
||||||
ngx_buf_t buf;
|
ngx_buf_t buf;
|
||||||
ngx_uint_t i;
|
ngx_uint_t i;
|
||||||
@ -1151,40 +1152,39 @@ ngx_http_fastcgi_process_header(ngx_http_request_t *r)
|
|||||||
if (f->type == NGX_HTTP_FASTCGI_STDERR) {
|
if (f->type == NGX_HTTP_FASTCGI_STDERR) {
|
||||||
|
|
||||||
if (f->length) {
|
if (f->length) {
|
||||||
line.data = u->buffer.pos;
|
msg = u->buffer.pos;
|
||||||
|
|
||||||
if (u->buffer.pos + f->length <= u->buffer.last) {
|
if (u->buffer.pos + f->length <= u->buffer.last) {
|
||||||
line.len = f->length;
|
|
||||||
u->buffer.pos += f->length;
|
u->buffer.pos += f->length;
|
||||||
f->length = 0;
|
f->length = 0;
|
||||||
f->state = ngx_http_fastcgi_st_padding;
|
f->state = ngx_http_fastcgi_st_padding;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
line.len = u->buffer.last - u->buffer.pos;
|
|
||||||
f->length -= u->buffer.last - u->buffer.pos;
|
f->length -= u->buffer.last - u->buffer.pos;
|
||||||
u->buffer.pos = u->buffer.last;
|
u->buffer.pos = u->buffer.last;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (line.data[line.len - 1] == LF
|
for (p = u->buffer.pos - 1; msg < p; p--) {
|
||||||
|| line.data[line.len - 1] == CR
|
if (*p != LF && *p != CR && *p != '.' && *p != ' ') {
|
||||||
|| line.data[line.len - 1] == '.'
|
break;
|
||||||
|| line.data[line.len - 1] == ' ')
|
}
|
||||||
{
|
|
||||||
line.len--;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p++;
|
||||||
|
|
||||||
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
|
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
|
||||||
"FastCGI sent in stderr: \"%V\"", &line);
|
"FastCGI sent in stderr: \"%*s\"", p - msg, msg);
|
||||||
|
|
||||||
flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module);
|
flcf = ngx_http_get_module_loc_conf(r, ngx_http_fastcgi_module);
|
||||||
|
|
||||||
if (flcf->catch_stderr) {
|
if (flcf->catch_stderr) {
|
||||||
pattern = flcf->catch_stderr->elts;
|
pattern = flcf->catch_stderr->elts;
|
||||||
|
|
||||||
line.data[line.len - 1] = '\0';
|
|
||||||
|
|
||||||
for (i = 0; i < flcf->catch_stderr->nelts; i++) {
|
for (i = 0; i < flcf->catch_stderr->nelts; i++) {
|
||||||
if (ngx_strstr(line.data, pattern[i].data)) {
|
if (ngx_strnstr(msg, (char *) pattern[i].data,
|
||||||
|
p - msg)
|
||||||
|
!= NULL)
|
||||||
|
{
|
||||||
return NGX_HTTP_UPSTREAM_INVALID_HEADER;
|
return NGX_HTTP_UPSTREAM_INVALID_HEADER;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1452,9 +1452,9 @@ ngx_http_fastcgi_process_header(ngx_http_request_t *r)
|
|||||||
static ngx_int_t
|
static ngx_int_t
|
||||||
ngx_http_fastcgi_input_filter(ngx_event_pipe_t *p, ngx_buf_t *buf)
|
ngx_http_fastcgi_input_filter(ngx_event_pipe_t *p, ngx_buf_t *buf)
|
||||||
{
|
{
|
||||||
|
u_char *m, *msg;
|
||||||
ngx_int_t rc;
|
ngx_int_t rc;
|
||||||
ngx_buf_t *b, **prev;
|
ngx_buf_t *b, **prev;
|
||||||
ngx_str_t line;
|
|
||||||
ngx_chain_t *cl;
|
ngx_chain_t *cl;
|
||||||
ngx_http_request_t *r;
|
ngx_http_request_t *r;
|
||||||
ngx_http_fastcgi_ctx_t *f;
|
ngx_http_fastcgi_ctx_t *f;
|
||||||
@ -1538,30 +1538,27 @@ ngx_http_fastcgi_input_filter(ngx_event_pipe_t *p, ngx_buf_t *buf)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
line.data = f->pos;
|
msg = f->pos;
|
||||||
|
|
||||||
if (f->pos + f->length <= f->last) {
|
if (f->pos + f->length <= f->last) {
|
||||||
line.len = f->length;
|
|
||||||
f->pos += f->length;
|
f->pos += f->length;
|
||||||
f->length = 0;
|
f->length = 0;
|
||||||
f->state = ngx_http_fastcgi_st_padding;
|
f->state = ngx_http_fastcgi_st_padding;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
line.len = f->last - f->pos;
|
|
||||||
f->length -= f->last - f->pos;
|
f->length -= f->last - f->pos;
|
||||||
f->pos = f->last;
|
f->pos = f->last;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (line.data[line.len - 1] == LF
|
for (m = f->pos - 1; msg < m; m--) {
|
||||||
|| line.data[line.len - 1] == CR
|
if (*m != LF && *m != CR && *m != '.' && *m != ' ') {
|
||||||
|| line.data[line.len - 1] == '.'
|
break;
|
||||||
|| line.data[line.len - 1] == ' ')
|
}
|
||||||
{
|
|
||||||
line.len--;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ngx_log_error(NGX_LOG_ERR, p->log, 0,
|
ngx_log_error(NGX_LOG_ERR, p->log, 0,
|
||||||
"FastCGI sent in stderr: \"%V\"", &line);
|
"FastCGI sent in stderr: \"%*s\"",
|
||||||
|
m + 1 - msg, msg);
|
||||||
|
|
||||||
if (f->pos == f->last) {
|
if (f->pos == f->last) {
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user