static int ts_lua_server_request_get_headers(lua_State *L) { const char *name; const char *value; int name_len; int value_len; TSMLoc field_loc; TSMLoc next_field_loc; const char *tvalue; size_t tvalue_len; ts_lua_http_ctx *http_ctx; GET_HTTP_CONTEXT(http_ctx, L); TS_LUA_CHECK_SERVER_REQUEST_HDR(http_ctx); lua_newtable(L); field_loc = TSMimeHdrFieldGet(http_ctx->server_request_bufp, http_ctx->server_request_hdrp, 0); while (field_loc != TS_NULL_MLOC) { name = TSMimeHdrFieldNameGet(http_ctx->server_request_bufp, http_ctx->server_request_hdrp, field_loc, &name_len); if (name && name_len) { // retrieve the header name from table lua_pushlstring(L, name, name_len); lua_gettable(L, -2); if (lua_isnil(L, -1)) { // if header name does not exist in the table, insert it lua_pop(L, 1); value = TSMimeHdrFieldValueStringGet(http_ctx->server_request_bufp, http_ctx->server_request_hdrp, field_loc, -1, &value_len); lua_pushlstring(L, name, name_len); lua_pushlstring(L, value, value_len); lua_rawset(L, -3); } else { // if header name exists in the table, append a command and the new value to the end of the existing value tvalue = lua_tolstring(L, -1, &tvalue_len); lua_pop(L, 1); value = TSMimeHdrFieldValueStringGet(http_ctx->server_request_bufp, http_ctx->server_request_hdrp, field_loc, -1, &value_len); lua_pushlstring(L, name, name_len); lua_pushlstring(L, tvalue, tvalue_len); lua_pushlstring(L, ",", 1); lua_pushlstring(L, value, value_len); lua_concat(L, 3); lua_rawset(L, -3); } } next_field_loc = TSMimeHdrFieldNext(http_ctx->server_request_bufp, http_ctx->server_request_hdrp, field_loc); TSHandleMLocRelease(http_ctx->server_request_bufp, http_ctx->server_request_hdrp, field_loc); field_loc = next_field_loc; } return 1; }
static int ts_lua_server_response_get_headers(lua_State * L) { const char *name; const char *value; int name_len; int value_len; TSMLoc field_loc; TSMLoc next_field_loc; ts_lua_http_ctx *http_ctx; http_ctx = ts_lua_get_http_ctx(L); TS_LUA_CHECK_SERVER_RESPONSE_HDR(http_ctx); lua_newtable(L); field_loc = TSMimeHdrFieldGet(http_ctx->server_response_bufp, http_ctx->server_response_hdrp, 0); while (field_loc) { name = TSMimeHdrFieldNameGet(http_ctx->server_response_bufp, http_ctx->server_response_hdrp, field_loc, &name_len); if (name && name_len) { value = TSMimeHdrFieldValueStringGet(http_ctx->server_response_bufp, http_ctx->server_response_hdrp, field_loc, -1, &value_len); lua_pushlstring(L, name, name_len); lua_pushlstring(L, value, value_len); lua_rawset(L, -3); } next_field_loc = TSMimeHdrFieldNext(http_ctx->server_response_bufp, http_ctx->server_response_hdrp, field_loc); TSHandleMLocRelease(http_ctx->server_response_bufp, http_ctx->server_response_hdrp, field_loc); field_loc = next_field_loc; } return 1; }