322
315
max = NGX_HTTP_LUA_MAX_HEADERS;
325
lua_pushlightuserdata(L, &ngx_http_lua_request_key);
326
lua_rawget(L, LUA_GLOBALSINDEX);
327
r = lua_touserdata(L, -1);
318
r = ngx_http_lua_get_req(L);
331
320
return luaL_error(L, "no request object found");
334
323
ngx_http_lua_check_fake_request(L, r);
336
lua_createtable(L, 0, 4);
325
part = &r->headers_in.headers.part;
329
count += part->nelts;
332
if (max > 0 && count > max) {
334
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
335
"lua exceeding request header limit %d", max);
338
lua_createtable(L, 0, count);
339
341
lua_pushlightuserdata(L, &ngx_http_lua_req_get_headers_metatable_key);
416
411
dd("key: %.*s, len %d", (int) len, p, (int) len);
413
key.data = ngx_palloc(r->pool, len + 1);
414
if (key.data == NULL) {
415
return luaL_error(L, "out of memory");
418
ngx_memcpy(key.data, p, len);
418
420
llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);
420
422
if (llcf->transform_underscores_in_resp_headers) {
421
423
/* replace "_" with "-" */
422
424
for (i = 0; i < len; i++) {
425
if (key.data[i] == '_') {
429
key.data = ngx_palloc(r->pool, len + 1);
430
if (key.data == NULL) {
431
return luaL_error(L, "out of memory");
434
ngx_memcpy(key.data, p, len);
436
431
key.data[len] = '\0';
619
lua_pushlightuserdata(L, &ngx_http_lua_request_key);
620
lua_rawget(L, LUA_GLOBALSINDEX);
621
r = lua_touserdata(L, -1);
610
r = ngx_http_lua_get_req(L);
625
612
return luaL_error(L, "no request object found");
628
615
ngx_http_lua_check_fake_request(L, r);
617
if (r->http_version < NGX_HTTP_VERSION_10) {
630
621
p = (u_char *) luaL_checklstring(L, 1, &len);
632
623
dd("key: %.*s, len %d", (int) len, p, (int) len);
634
626
/* replace "_" with "-" */
635
627
for (i = 0; i < len; i++) {
636
628
if (p[i] == '_') {
641
634
key.data = ngx_palloc(r->pool, len + 1);
642
635
if (key.data == NULL) {
786
779
lua_rawset(L, LUA_REGISTRYINDEX);
783
#ifndef NGX_HTTP_LUA_NO_FFI_API
785
ngx_http_lua_ffi_req_get_headers_count(ngx_http_request_t *r, int max)
788
ngx_list_part_t *part;
790
if (r->connection->fd == -1) {
791
return NGX_HTTP_LUA_FFI_BAD_CONTEXT;
795
max = NGX_HTTP_LUA_MAX_HEADERS;
798
part = &r->headers_in.headers.part;
802
count += part->nelts;
805
if (max > 0 && count > max) {
807
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
808
"lua exceeding request header limit %d", max);
816
ngx_http_lua_ffi_req_get_headers(ngx_http_request_t *r,
817
ngx_http_lua_ffi_table_elt_t *out, int count, int raw)
821
ngx_list_part_t *part;
822
ngx_table_elt_t *header;
829
part = &r->headers_in.headers.part;
832
for (i = 0; /* void */; i++) {
834
if (i >= part->nelts) {
835
if (part->next == NULL) {
845
out[n].key.data = header[i].key.data;
846
out[n].key.len = (int) header[i].key.len;
849
out[n].key.data = header[i].lowcase_key;
850
out[n].key.len = (int) header[i].key.len;
853
out[n].value.data = header[i].value.data;
854
out[n].value.len = (int) header[i].value.len;
866
ngx_http_lua_ffi_set_resp_header(ngx_http_request_t *r, const u_char *key_data,
867
size_t key_len, int is_nil, const u_char *sval, size_t sval_len,
868
ngx_str_t *mvals, size_t mvals_len, char **errmsg)
871
ngx_str_t value, key;
874
ngx_http_lua_ctx_t *ctx;
876
ngx_http_lua_loc_conf_t *llcf;
878
ctx = ngx_http_get_module_ctx(r, ngx_http_lua_module);
880
return NGX_HTTP_LUA_FFI_NO_REQ_CTX;
883
if (r->connection->fd == -1) {
884
return NGX_HTTP_LUA_FFI_BAD_CONTEXT;
887
if (r->header_sent) {
888
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "attempt to "
889
"set ngx.header.HEADER after sending out "
894
key.data = ngx_palloc(r->pool, key_len + 1);
895
if (key.data == NULL) {
899
ngx_memcpy(key.data, key_data, key_len);
900
key.data[key_len] = '\0';
903
llcf = ngx_http_get_module_loc_conf(r, ngx_http_lua_module);
905
if (llcf->transform_underscores_in_resp_headers) {
906
/* replace "_" with "-" */
908
for (i = 0; i < key_len; i++) {
915
if (!ctx->headers_set) {
916
rc = ngx_http_lua_set_content_type(r);
918
*errmsg = "failed to set default content type";
922
ctx->headers_set = 1;
931
if (mvals_len == 0) {
936
for (i = 0; i < mvals_len; i++) {
937
dd("header value table index %d", (int) i);
942
value.data = ngx_palloc(r->pool, len);
943
if (value.data == NULL) {
947
ngx_memcpy(value.data, p, len);
950
rc = ngx_http_lua_set_output_header(r, key, value,
951
i == 0 /* override */);
953
if (rc == NGX_ERROR) {
954
*errmsg = "failed to set header";
964
value.data = ngx_palloc(r->pool, sval_len);
965
if (value.data == NULL) {
969
ngx_memcpy(value.data, p, sval_len);
970
value.len = sval_len;
973
dd("key: %.*s, value: %.*s",
974
(int) key.len, key.data, (int) value.len, value.data);
976
rc = ngx_http_lua_set_output_header(r, key, value, 1 /* override */);
978
if (rc == NGX_ERROR) {
979
*errmsg = "failed to set header";
987
*errmsg = "no memory";
990
#endif /* NGX_HTTP_LUA_NO_FFI_API */
789
993
/* vi:set ft=c ts=4 sw=4 et fdm=marker: */