/** * Send out headers * */ int ngx_http_lua_ngx_send_headers(lua_State *l) { ngx_http_request_t *r; ngx_http_lua_ctx_t *ctx; lua_getglobal(l, GLOBALS_SYMBOL_REQUEST); r = lua_touserdata(l, -1); lua_pop(l, 1); if(r) { ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module); if(ctx != NULL && ctx->headers_sent == 0) { ngx_http_lua_send_header_if_needed(r, ctx); } } else { dd("(lua-ngx-send-headers) can't find nginx request object!"); } return 0; }
/** * Send out headers * */ static int ngx_http_lua_ngx_send_headers(lua_State *L) { ngx_int_t rc; ngx_http_request_t *r; ngx_http_lua_ctx_t *ctx; r = ngx_http_lua_get_req(L); if (r == NULL) { return luaL_error(L, "no request found"); } ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module); if (ctx == NULL) { return luaL_error(L, "no ctx found"); } ngx_http_lua_check_context(L, ctx, NGX_HTTP_LUA_CONTEXT_REWRITE | NGX_HTTP_LUA_CONTEXT_ACCESS | NGX_HTTP_LUA_CONTEXT_CONTENT); if (!r->header_sent && !ctx->header_sent) { ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "lua send headers"); rc = ngx_http_lua_send_header_if_needed(r, ctx); if (rc == NGX_ERROR || rc > NGX_OK) { lua_pushnil(L); lua_pushliteral(L, "nginx output filter error"); return 2; } } lua_pushinteger(L, 1); return 1; }
ngx_int_t ngx_http_lua_send_chain_link(ngx_http_request_t *r, ngx_http_lua_ctx_t *ctx, ngx_chain_t *cl) { ngx_int_t rc; size_t size; ngx_chain_t *p; rc = ngx_http_lua_send_header_if_needed(r, ctx); if (r->header_only || rc >= NGX_HTTP_SPECIAL_RESPONSE) { return rc; } if (r->http_version < NGX_HTTP_VERSION_11 && !ctx->headers_sent) { ctx->headers_sent = 1; size = 0; for (p = cl; p; p = p->next) { if (p->buf->memory) { size += p->buf->last - p->buf->pos; } } r->headers_out.content_length_n = (off_t) size; if (r->headers_out.content_length) { r->headers_out.content_length->hash = 0; } r->headers_out.content_length = NULL; rc = ngx_http_send_header(r); if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { return rc; } } if (cl == NULL) { #if defined(nginx_version) && nginx_version <= 8004 /* earlier versions of nginx does not allow subrequests to send last_buf themselves */ if (r != r->main) { return NGX_OK; } #endif rc = ngx_http_send_special(r, NGX_HTTP_LAST); if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { return rc; } return NGX_OK; } return ngx_http_output_filter(r, cl); }
ngx_int_t ngx_http_lua_send_chain_link(ngx_http_request_t *r, ngx_http_lua_ctx_t *ctx, ngx_chain_t *in) { ngx_int_t rc; size_t size; ngx_chain_t *cl; #if 1 if (ctx->eof) { dd("ctx->eof already set"); return NGX_OK; } #endif rc = ngx_http_lua_send_header_if_needed(r, ctx); if (r->header_only || rc >= NGX_HTTP_SPECIAL_RESPONSE) { ctx->eof = 1; return rc; } if (r->http_version < NGX_HTTP_VERSION_11 && !ctx->headers_sent) { ctx->headers_sent = 1; size = 0; for (cl = in; cl; cl = cl->next) { size += ngx_buf_size(cl->buf); if (cl->next == NULL) { cl->buf->last_buf = 1; } } r->headers_out.content_length_n = (off_t) size; if (r->headers_out.content_length) { r->headers_out.content_length->hash = 0; } r->headers_out.content_length = NULL; dd("setting ctx->eof = 1"); ctx->eof = 1; rc = ngx_http_send_header(r); if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) { return rc; } } if (in == NULL) { #if defined(nginx_version) && nginx_version <= 8004 /* earlier versions of nginx does not allow subrequests to send last_buf themselves */ if (r != r->main) { return NGX_OK; } #endif ctx->eof = 1; dd("send special buf"); rc = ngx_http_send_special(r, NGX_HTTP_LAST); if (rc >= NGX_HTTP_SPECIAL_RESPONSE) { return rc; } return NGX_OK; } return ngx_http_output_filter(r, in); }
ngx_int_t ngx_http_lua_send_chain_link(ngx_http_request_t *r, ngx_http_lua_ctx_t *ctx, ngx_chain_t *in) { ngx_int_t rc; ngx_chain_t *cl; ngx_chain_t **ll; #if 1 if (ctx->eof) { dd("ctx->eof already set"); return NGX_OK; } #endif rc = ngx_http_lua_send_header_if_needed(r, ctx); if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) { return rc; } if (r->header_only) { ctx->eof = 1; if (r->http_version < NGX_HTTP_VERSION_11) { return ngx_http_lua_send_http10_headers(r, ctx); } return rc; } if (in == NULL) { if (r->http_version < NGX_HTTP_VERSION_11) { rc = ngx_http_lua_send_http10_headers(r, ctx); if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) { return rc; } if (ctx->out) { rc = ngx_http_output_filter(r, ctx->out); if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) { return rc; } ctx->out = NULL; } } #if defined(nginx_version) && nginx_version <= 8004 /* earlier versions of nginx does not allow subrequests to send last_buf themselves */ if (r != r->main) { return NGX_OK; } #endif ctx->eof = 1; dd("send special buf"); rc = ngx_http_send_special(r, NGX_HTTP_LAST); if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) { return rc; } return NGX_OK; } /* in != NULL */ if (r->http_version < NGX_HTTP_VERSION_11 && !ctx->headers_sent) { /* we buffer all the output bufs for HTTP 1.0 */ for (cl = ctx->out, ll = &ctx->out; cl; cl = cl->next) { ll = &cl->next; } *ll = in; return NGX_OK; } return ngx_http_output_filter(r, in); }