Skip to content

synchronized with lua-nginx-module #fbb8919. #65

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 16 additions & 63 deletions src/http/ngx_http_lua_headers.c
Original file line number Diff line number Diff line change
Expand Up @@ -497,7 +497,6 @@ ngx_http_lua_ngx_resp_get_headers(lua_State *L)
ngx_table_elt_t *header;
ngx_http_request_t *r;
ngx_http_lua_ctx_t *ctx;
ngx_int_t rc;
u_char *lowcase_key = NULL;
size_t lowcase_key_sz = 0;
ngx_uint_t i;
Expand Down Expand Up @@ -534,17 +533,6 @@ ngx_http_lua_ngx_resp_get_headers(lua_State *L)
return luaL_error(L, "no ctx found");
}

if (!ctx->headers_set) {
rc = ngx_http_lua_set_content_type(r);
if (rc != NGX_OK) {
return luaL_error(L,
"failed to set default content type: %d",
(int) rc);
}

ctx->headers_set = 1;
}

ngx_http_lua_check_fake_request(L, r);

part = &r->headers_out.headers.part;
Expand Down Expand Up @@ -675,7 +663,6 @@ ngx_http_lua_ngx_header_get(lua_State *L)
size_t len;
ngx_http_lua_loc_conf_t *llcf;
ngx_http_lua_ctx_t *ctx;
ngx_int_t rc;

r = ngx_http_lua_get_req(L);
if (r == NULL) {
Expand Down Expand Up @@ -718,18 +705,7 @@ ngx_http_lua_ngx_header_get(lua_State *L)

key.len = len;

if (!ctx->headers_set) {
rc = ngx_http_lua_set_content_type(r);
if (rc != NGX_OK) {
return luaL_error(L,
"failed to set default content type: %d",
(int) rc);
}

ctx->headers_set = 1;
}

return ngx_http_lua_get_output_header(L, r, &key);
return ngx_http_lua_get_output_header(L, r, ctx, &key);
}


Expand Down Expand Up @@ -792,16 +768,7 @@ ngx_http_lua_ngx_header_set(lua_State *L)
}
}

if (!ctx->headers_set) {
rc = ngx_http_lua_set_content_type(r);
if (rc != NGX_OK) {
return luaL_error(L,
"failed to set default content type: %d",
(int) rc);
}

ctx->headers_set = 1;
}
ctx->headers_set = 1;

if (lua_type(L, 3) == LUA_TNIL) {
ngx_str_null(&value);
Expand All @@ -826,7 +793,7 @@ ngx_http_lua_ngx_header_set(lua_State *L)
ngx_memcpy(value.data, p, len);
value.len = len;

rc = ngx_http_lua_set_output_header(r, key, value,
rc = ngx_http_lua_set_output_header(r, ctx, key, value,
i == 1 /* override */);

if (rc == NGX_ERROR) {
Expand All @@ -853,7 +820,7 @@ ngx_http_lua_ngx_header_set(lua_State *L)
dd("key: %.*s, value: %.*s",
(int) key.len, key.data, (int) value.len, value.data);

rc = ngx_http_lua_set_output_header(r, key, value, 1 /* override */);
rc = ngx_http_lua_set_output_header(r, ctx, key, value, 1 /* override */);

if (rc == NGX_ERROR) {
return luaL_error(L, "failed to set header %s (error: %d)",
Expand Down Expand Up @@ -1169,7 +1136,8 @@ ngx_http_lua_ffi_req_get_headers(ngx_http_request_t *r,
int
ngx_http_lua_ffi_set_resp_header(ngx_http_request_t *r, const u_char *key_data,
size_t key_len, int is_nil, const u_char *sval, size_t sval_len,
ngx_http_lua_ffi_str_t *mvals, size_t mvals_len, char **errmsg)
ngx_http_lua_ffi_str_t *mvals, size_t mvals_len, int override,
char **errmsg)
{
u_char *p;
ngx_str_t value, key;
Expand Down Expand Up @@ -1216,15 +1184,7 @@ ngx_http_lua_ffi_set_resp_header(ngx_http_request_t *r, const u_char *key_data,
}
}

if (!ctx->headers_set) {
rc = ngx_http_lua_set_content_type(r);
if (rc != NGX_OK) {
*errmsg = "failed to set default content type";
return NGX_ERROR;
}

ctx->headers_set = 1;
}
ctx->headers_set = 1;

if (is_nil) {
value.data = NULL;
Expand All @@ -1251,8 +1211,8 @@ ngx_http_lua_ffi_set_resp_header(ngx_http_request_t *r, const u_char *key_data,
ngx_memcpy(value.data, p, len);
value.len = len;

rc = ngx_http_lua_set_output_header(r, key, value,
i == 0 /* override */);
rc = ngx_http_lua_set_output_header(r, ctx, key, value,
override && i == 0);

if (rc == NGX_ERROR) {
*errmsg = "failed to set header";
Expand All @@ -1277,7 +1237,7 @@ ngx_http_lua_ffi_set_resp_header(ngx_http_request_t *r, const u_char *key_data,
dd("key: %.*s, value: %.*s",
(int) key.len, key.data, (int) value.len, value.data);

rc = ngx_http_lua_set_output_header(r, key, value, 1 /* override */);
rc = ngx_http_lua_set_output_header(r, ctx, key, value, override);

if (rc == NGX_ERROR) {
*errmsg = "failed to set header";
Expand Down Expand Up @@ -1345,7 +1305,8 @@ ngx_http_lua_ffi_req_header_set_single_value(ngx_http_request_t *r,
int
ngx_http_lua_ffi_get_resp_header(ngx_http_request_t *r,
const u_char *key, size_t key_len,
u_char *key_buf, ngx_http_lua_ffi_str_t *values, int max_nvalues)
u_char *key_buf, ngx_http_lua_ffi_str_t *values, int max_nvalues,
char **errmsg)
{
int found;
u_char c, *p;
Expand All @@ -1362,19 +1323,10 @@ ngx_http_lua_ffi_get_resp_header(ngx_http_request_t *r,

ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);
if (ctx == NULL) {
/* *errmsg = "no ctx found"; */
*errmsg = "no ctx found";
return NGX_ERROR;
}

if (!ctx->headers_set) {
if (ngx_http_lua_set_content_type(r) != NGX_OK) {
/* *errmsg = "failed to set default content type"; */
return NGX_ERROR;
}

ctx->headers_set = 1;
}

llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);
if (llcf->transform_underscores_in_resp_headers
&& memchr(key, '_', key_len) != NULL)
Expand All @@ -1400,6 +1352,7 @@ ngx_http_lua_ffi_get_resp_header(ngx_http_request_t *r,
{
p = ngx_palloc(r->pool, NGX_OFF_T_LEN);
if (p == NULL) {
*errmsg = "no memory";
return NGX_ERROR;
}

Expand All @@ -1413,8 +1366,8 @@ ngx_http_lua_ffi_get_resp_header(ngx_http_request_t *r,
break;

case 12:
if (r->headers_out.content_type.len
&& ngx_strncasecmp(key_buf, (u_char *) "Content-Type", 12) == 0)
if (ngx_strncasecmp(key_buf, (u_char *) "Content-Type", 12) == 0
&& r->headers_out.content_type.len)
{
values[0].data = r->headers_out.content_type.data;
values[0].len = r->headers_out.content_type.len;
Expand Down
14 changes: 9 additions & 5 deletions src/http/ngx_http_lua_headers_out.c
Original file line number Diff line number Diff line change
Expand Up @@ -476,8 +476,8 @@ ngx_http_clear_builtin_header(ngx_http_request_t *r,


ngx_int_t
ngx_http_lua_set_output_header(ngx_http_request_t *r, ngx_str_t key,
ngx_str_t value, unsigned override)
ngx_http_lua_set_output_header(ngx_http_request_t *r, ngx_http_lua_ctx_t *ctx,
ngx_str_t key, ngx_str_t value, unsigned override)
{
ngx_http_lua_header_val_t hv;
ngx_http_lua_set_header_t *handlers = ngx_http_lua_set_handlers;
Expand Down Expand Up @@ -508,6 +508,10 @@ ngx_http_lua_set_output_header(ngx_http_request_t *r, ngx_str_t key,
hv.offset = handlers[i].offset;
hv.handler = handlers[i].handler;

if (hv.handler == ngx_http_set_content_type_header) {
ctx->mime_set = 1;
}

break;
}

Expand All @@ -528,7 +532,7 @@ ngx_http_lua_set_output_header(ngx_http_request_t *r, ngx_str_t key,

int
ngx_http_lua_get_output_header(lua_State *L, ngx_http_request_t *r,
ngx_str_t *key)
ngx_http_lua_ctx_t *ctx, ngx_str_t *key)
{
ngx_table_elt_t *h;
ngx_list_part_t *part;
Expand All @@ -550,8 +554,8 @@ ngx_http_lua_get_output_header(lua_State *L, ngx_http_request_t *r,
break;

case 12:
if (r->headers_out.content_type.len
&& ngx_strncasecmp(key->data, (u_char *) "Content-Type", 12) == 0)
if (ngx_strncasecmp(key->data, (u_char *) "Content-Type", 12) == 0
&& r->headers_out.content_type.len)
{
lua_pushlstring(L, (char *) r->headers_out.content_type.data,
r->headers_out.content_type.len);
Expand Down
6 changes: 3 additions & 3 deletions src/http/ngx_http_lua_headers_out.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@
#include "ngx_http_lua_common.h"


ngx_int_t ngx_http_lua_set_output_header(ngx_http_request_t *r, ngx_str_t key,
ngx_str_t value, unsigned override);
ngx_int_t ngx_http_lua_set_output_header(ngx_http_request_t *r,
ngx_http_lua_ctx_t *ctx, ngx_str_t key, ngx_str_t value, unsigned override);
int ngx_http_lua_get_output_header(lua_State *L, ngx_http_request_t *r,
ngx_str_t *key);
ngx_http_lua_ctx_t *ctx, ngx_str_t *key);


#endif /* _NGX_HTTP_LUA_HEADERS_OUT_H_INCLUDED_ */
Expand Down
8 changes: 8 additions & 0 deletions src/http/ngx_http_lua_subrequest.c
Original file line number Diff line number Diff line change
Expand Up @@ -1031,6 +1031,14 @@ ngx_http_lua_post_subrequest(ngx_http_request_t *r, void *data, ngx_int_t rc)
dd("pr_coctx status: %d", (int) pr_coctx->sr_statuses[ctx->index]);

/* copy subrequest response headers */
if (ctx->headers_set) {
rc = ngx_http_lua_set_content_type(r, ctx);
if (rc != NGX_OK) {
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
"failed to set default content type: %i", rc);
return NGX_ERROR;
}
}

pr_coctx->sr_headers[ctx->index] = &r->headers_out;

Expand Down
4 changes: 4 additions & 0 deletions src/subsys/ngx_subsys_lua_common.h.tt2
Original file line number Diff line number Diff line change
Expand Up @@ -704,6 +704,10 @@ typedef struct ngx_[% subsys %]_lua_ctx_s {

unsigned headers_set:1; /* whether the user has set custom
response headers */
[% IF http_subsys %]
unsigned mime_set:1; /* whether the user has set Content-Type
response header */
[% END %]

[% IF http_subsys %]
unsigned entered_rewrite_phase:1;
Expand Down
4 changes: 3 additions & 1 deletion src/subsys/ngx_subsys_lua_util.c.tt2
Original file line number Diff line number Diff line change
Expand Up @@ -442,7 +442,9 @@ ngx_[% subsys %]_lua_send_header_if_needed([% req_type %] *r,
r->headers_out.status = NGX_HTTP_OK;
}

if (!ctx->headers_set && ngx_[% subsys %]_lua_set_content_type(r) != NGX_OK) {
if (!ctx->mime_set
&& ngx_[% subsys %]_lua_set_content_type(r, ctx) != NGX_OK)
{
return NGX_ERROR;
}

Expand Down
5 changes: 4 additions & 1 deletion src/subsys/ngx_subsys_lua_util.h.tt2
Original file line number Diff line number Diff line change
Expand Up @@ -514,10 +514,13 @@ ngx_[% subsys %]_lua_hash_str(u_char *src, size_t n)

[% IF http_subsys %]
static ngx_inline ngx_int_t
ngx_[% subsys %]_lua_set_content_type([% req_type %] *r)
ngx_[% subsys %]_lua_set_content_type([% req_type %] *r,
ngx_[% subsys %]_lua_ctx_t *ctx)
{
ngx_[% subsys %]_lua_loc_conf_t *llcf;

ctx->mime_set = 1;

llcf = ngx_[% req_subsys %]_get_module_loc_conf(r, ngx_[% subsys %]_lua_module);
if (llcf->use_default_type
&& r->headers_out.status != NGX_HTTP_NOT_MODIFIED)
Expand Down