Mercurial > hg > nginx
changeset 7531:ede052c67512
Perl: additional ctx->header_sent checks.
As we now have ctx->header_sent flag, it is further used to prevent
duplicate $r->send_http_header() calls, prevent output before sending
header, and $r->internal_redirect() after sending header.
Further, $r->send_http_header() protected from calls after
$r->internal_redirect().
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Fri, 12 Jul 2019 15:39:25 +0300 |
parents | fd9252844ec1 |
children | 975d7ab37b39 |
files | src/http/modules/perl/nginx.xs src/http/modules/perl/ngx_http_perl_module.c |
diffstat | 2 files changed, 25 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/http/modules/perl/nginx.xs Fri Jul 12 15:39:25 2019 +0300 +++ b/src/http/modules/perl/nginx.xs Fri Jul 12 15:39:25 2019 +0300 @@ -141,6 +141,14 @@ croak("send_http_header(): cannot be used in variable handler"); } + if (ctx->header_sent) { + croak("send_http_header(): header already sent"); + } + + if (ctx->redirect_uri.len) { + croak("send_http_header(): cannot be used with internal_redirect()"); + } + if (r->headers_out.status == 0) { r->headers_out.status = NGX_HTTP_OK; } @@ -666,6 +674,10 @@ croak("print(): cannot be used in variable handler"); } + if (!ctx->header_sent) { + croak("print(): header not sent"); + } + if (items == 2) { /* @@ -780,6 +792,10 @@ croak("sendfile(): cannot be used in variable handler"); } + if (!ctx->header_sent) { + croak("sendfile(): header not sent"); + } + filename = SvPV_nolen(ST(1)); if (filename == NULL) { @@ -886,6 +902,10 @@ croak("flush(): cannot be used in variable handler"); } + if (!ctx->header_sent) { + croak("flush(): header not sent"); + } + b = ngx_calloc_buf(r->pool); if (b == NULL) { ctx->error = 1; @@ -921,6 +941,10 @@ croak("internal_redirect(): cannot be used in variable handler"); } + if (ctx->header_sent) { + croak("internal_redirect(): header already sent"); + } + uri = ST(1); if (ngx_http_perl_sv2str(aTHX_ r, &ctx->redirect_uri, uri) != NGX_OK) {
--- a/src/http/modules/perl/ngx_http_perl_module.c Fri Jul 12 15:39:25 2019 +0300 +++ b/src/http/modules/perl/ngx_http_perl_module.c Fri Jul 12 15:39:25 2019 +0300 @@ -394,6 +394,7 @@ pmcf = ngx_http_get_module_main_conf(r, ngx_http_perl_module); ctx->ssi = ssi_ctx; + ctx->header_sent = 1; handler = params[NGX_HTTP_PERL_SSI_SUB]; handler->data[handler->len] = '\0';