static int ts_lua_server_response_header_get(lua_State * L) { const char *key; const char *val; int val_len; size_t key_len; TSMLoc field_loc; ts_lua_http_ctx *http_ctx; http_ctx = ts_lua_get_http_ctx(L); /* we skip the first argument that is the table */ key = luaL_checklstring(L, 2, &key_len); TS_LUA_CHECK_SERVER_RESPONSE_HDR(http_ctx); if (key && key_len) { field_loc = TSMimeHdrFieldFind(http_ctx->server_response_bufp, http_ctx->server_response_hdrp, key, key_len); if (field_loc) { val = TSMimeHdrFieldValueStringGet(http_ctx->server_response_bufp, http_ctx->server_response_hdrp, field_loc, -1, &val_len); lua_pushlstring(L, val, val_len); TSHandleMLocRelease(http_ctx->server_response_bufp, http_ctx->server_response_hdrp, field_loc); } else { lua_pushnil(L); } } else { lua_pushnil(L); } return 1; }
static int ts_lua_server_response_set_status(lua_State * L) { int status; const char *reason; int reason_len; ts_lua_http_ctx *http_ctx; http_ctx = ts_lua_get_http_ctx(L); TS_LUA_CHECK_SERVER_RESPONSE_HDR(http_ctx); status = luaL_checkint(L, 1); reason = TSHttpHdrReasonLookup(status); reason_len = strlen(reason); TSHttpHdrStatusSet(http_ctx->server_response_bufp, http_ctx->server_response_hdrp, status); TSHttpHdrReasonSet(http_ctx->server_response_bufp, http_ctx->server_response_hdrp, reason, reason_len); return 0; }
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; }
static int ts_lua_server_response_header_set(lua_State *L) { const char *key; const char *val; size_t val_len; size_t key_len; int remove; int first; TSMLoc field_loc, tmp; ts_lua_http_ctx *http_ctx; GET_HTTP_CONTEXT(http_ctx, L); remove = 0; val = NULL; /* we skip the first argument that is the table */ key = luaL_checklstring(L, 2, &key_len); if (lua_isnil(L, 3)) { remove = 1; } else { val = luaL_checklstring(L, 3, &val_len); } TS_LUA_CHECK_SERVER_RESPONSE_HDR(http_ctx); field_loc = TSMimeHdrFieldFind(http_ctx->server_response_bufp, http_ctx->server_response_hdrp, key, key_len); if (remove) { while (field_loc != TS_NULL_MLOC) { tmp = TSMimeHdrFieldNextDup(http_ctx->server_response_bufp, http_ctx->server_response_hdrp, field_loc); TSMimeHdrFieldDestroy(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 = tmp; } } else if (field_loc != TS_NULL_MLOC) { first = 1; while (field_loc != TS_NULL_MLOC) { tmp = TSMimeHdrFieldNextDup(http_ctx->server_response_bufp, http_ctx->server_response_hdrp, field_loc); if (first) { first = 0; TSMimeHdrFieldValueStringSet(http_ctx->server_response_bufp, http_ctx->server_response_hdrp, field_loc, -1, val, val_len); } else { TSMimeHdrFieldDestroy(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 = tmp; } } else if (TSMimeHdrFieldCreateNamed(http_ctx->server_response_bufp, http_ctx->server_response_hdrp, key, key_len, &field_loc) != TS_SUCCESS) { TSError("[ts_lua][%s] TSMimeHdrFieldCreateNamed error", __FUNCTION__); return 0; } else { TSMimeHdrFieldValueStringSet(http_ctx->server_response_bufp, http_ctx->server_response_hdrp, field_loc, -1, val, val_len); TSMimeHdrFieldAppend(http_ctx->server_response_bufp, http_ctx->server_response_hdrp, field_loc); } if (field_loc != TS_NULL_MLOC) { TSHandleMLocRelease(http_ctx->server_response_bufp, http_ctx->server_response_hdrp, field_loc); } return 0; }