# HG changeset patch # User Maxim Dounin # Date 1562935165 -10800 # Node ID fd9252844ec1ce3d617e94be86219558b45198d4 # Parent d758d04e07900e95dbe8d892a2580213ba01bd1a Perl: avoid returning 500 if header was already sent. Returning NGX_HTTP_INTERNAL_SERVER_ERROR if a perl code died after sending header will lead to a "header already sent" alert. To avoid it, we now check if header was already sent, and return NGX_ERROR instead if it was. diff --git a/src/http/modules/perl/nginx.xs b/src/http/modules/perl/nginx.xs --- a/src/http/modules/perl/nginx.xs +++ b/src/http/modules/perl/nginx.xs @@ -164,6 +164,8 @@ send_http_header(r, ...) } } + ctx->header_sent = 1; + r->disable_not_modified = 1; rc = ngx_http_send_header(r); diff --git a/src/http/modules/perl/ngx_http_perl_module.c b/src/http/modules/perl/ngx_http_perl_module.c --- a/src/http/modules/perl/ngx_http_perl_module.c +++ b/src/http/modules/perl/ngx_http_perl_module.c @@ -780,6 +780,10 @@ ngx_http_perl_call_handler(pTHX_ ngx_htt ctx->redirect_uri.len = 0; + if (ctx->header_sent) { + return NGX_ERROR; + } + return NGX_HTTP_INTERNAL_SERVER_ERROR; } diff --git a/src/http/modules/perl/ngx_http_perl_module.h b/src/http/modules/perl/ngx_http_perl_module.h --- a/src/http/modules/perl/ngx_http_perl_module.h +++ b/src/http/modules/perl/ngx_http_perl_module.h @@ -34,6 +34,7 @@ typedef struct { unsigned done:1; unsigned error:1; unsigned variable:1; + unsigned header_sent:1; ngx_array_t *variables; /* array of ngx_http_perl_var_t */