static int ts_lua_server_request_header_get(lua_State *L) { const char *key; const char *val; int val_len; size_t key_len; int count; TSMLoc field_loc, next_field_loc; ts_lua_http_ctx *http_ctx; GET_HTTP_CONTEXT(http_ctx, L); /* we skip the first argument that is the table */ key = luaL_checklstring(L, 2, &key_len); if (!http_ctx->server_request_hdrp) { if (TSHttpTxnServerReqGet(http_ctx->txnp, &http_ctx->server_request_bufp, &http_ctx->server_request_hdrp) != TS_SUCCESS) { lua_pushnil(L); return 1; } } if (key && key_len) { field_loc = TSMimeHdrFieldFind(http_ctx->server_request_bufp, http_ctx->server_request_hdrp, key, key_len); if (field_loc != TS_NULL_MLOC) { count = 0; while (field_loc != TS_NULL_MLOC) { val = TSMimeHdrFieldValueStringGet(http_ctx->server_request_bufp, http_ctx->server_request_hdrp, field_loc, -1, &val_len); next_field_loc = TSMimeHdrFieldNextDup(http_ctx->server_request_bufp, http_ctx->server_request_hdrp, field_loc); lua_pushlstring(L, val, val_len); count++; // multiple headers with the same name must be semantically the same as one value which is comma seperated if (next_field_loc != TS_NULL_MLOC) { lua_pushlstring(L, ",", 1); count++; } TSHandleMLocRelease(http_ctx->server_request_bufp, http_ctx->server_request_hdrp, field_loc); field_loc = next_field_loc; } lua_concat(L, count); } else { lua_pushnil(L); } } else { lua_pushnil(L); } return 1; }
static CachedHeaderInfo * get_cached_header_info(TSHttpTxn txn) { CachedHeaderInfo *chi; TSMBuffer cr_buf; TSMLoc cr_hdr_loc, cr_date_loc, cr_cache_control_loc, cr_cache_control_dup_loc; int cr_cache_control_count, val_len, i; char *value, *ptr; chi = (CachedHeaderInfo *)TSmalloc(sizeof(CachedHeaderInfo)); memset(chi, 0, sizeof(CachedHeaderInfo)); if (TSHttpTxnCachedRespGet(txn, &cr_buf, &cr_hdr_loc) == TS_SUCCESS) { cr_date_loc = TSMimeHdrFieldFind(cr_buf, cr_hdr_loc, TS_MIME_FIELD_DATE, TS_MIME_LEN_DATE); if (cr_date_loc != TS_NULL_MLOC) { TSDebug(PLUGIN_NAME, "Found a date"); chi->date = TSMimeHdrFieldValueDateGet(cr_buf, cr_hdr_loc, cr_date_loc); TSHandleMLocRelease(cr_buf, cr_hdr_loc, cr_date_loc); } cr_cache_control_loc = TSMimeHdrFieldFind(cr_buf, cr_hdr_loc, TS_MIME_FIELD_CACHE_CONTROL, TS_MIME_LEN_CACHE_CONTROL); while (cr_cache_control_loc != TS_NULL_MLOC) { TSDebug(PLUGIN_NAME, "Found cache-control"); cr_cache_control_count = TSMimeHdrFieldValuesCount(cr_buf, cr_hdr_loc, cr_cache_control_loc); for (i = 0; i < cr_cache_control_count; i++) { value = (char *)TSMimeHdrFieldValueStringGet(cr_buf, cr_hdr_loc, cr_cache_control_loc, i, &val_len); ptr = value; if (strncmp(value, TS_HTTP_VALUE_MAX_AGE, TS_HTTP_LEN_MAX_AGE) == 0) { TSDebug(PLUGIN_NAME, "Found max-age"); ptr += TS_HTTP_LEN_MAX_AGE; if (*ptr == '=') { ptr++; chi->max_age = atol(ptr); } else { ptr = TSstrndup(value, TS_HTTP_LEN_MAX_AGE + 2); TSDebug(PLUGIN_NAME, "This is what I found: %s", ptr); TSfree(ptr); } } else if (strncmp(value, HTTP_VALUE_STALE_WHILE_REVALIDATE, strlen(HTTP_VALUE_STALE_WHILE_REVALIDATE)) == 0) { TSDebug(PLUGIN_NAME, "Found stale-while-revalidate"); ptr += strlen(HTTP_VALUE_STALE_WHILE_REVALIDATE); if (*ptr == '=') { ptr++; chi->stale_while_revalidate = atol(ptr); } } else if (strncmp(value, HTTP_VALUE_STALE_IF_ERROR, strlen(HTTP_VALUE_STALE_IF_ERROR)) == 0) { TSDebug(PLUGIN_NAME, "Found stale-on-error"); ptr += strlen(HTTP_VALUE_STALE_IF_ERROR); if (*ptr == '=') { ptr++; chi->stale_on_error = atol(ptr); } } else { TSDebug(PLUGIN_NAME, "Unknown field value"); } } cr_cache_control_dup_loc = TSMimeHdrFieldNextDup(cr_buf, cr_hdr_loc, cr_cache_control_loc); TSHandleMLocRelease(cr_buf, cr_hdr_loc, cr_cache_control_loc); cr_cache_control_loc = cr_cache_control_dup_loc; } TSHandleMLocRelease(cr_buf, TS_NULL_MLOC, cr_hdr_loc); } return chi; }
static int ts_lua_server_request_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); } if (!http_ctx->server_request_hdrp) { if (TSHttpTxnServerReqGet(http_ctx->txnp, &http_ctx->server_request_bufp, &http_ctx->server_request_hdrp) != TS_SUCCESS) { return 0; } } field_loc = TSMimeHdrFieldFind(http_ctx->server_request_bufp, http_ctx->server_request_hdrp, key, key_len); if (remove) { while (field_loc != TS_NULL_MLOC) { tmp = TSMimeHdrFieldNextDup(http_ctx->server_request_bufp, http_ctx->server_request_hdrp, field_loc); TSMimeHdrFieldDestroy(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 = tmp; } } else if (field_loc != TS_NULL_MLOC) { first = 1; while (field_loc != TS_NULL_MLOC) { tmp = TSMimeHdrFieldNextDup(http_ctx->server_request_bufp, http_ctx->server_request_hdrp, field_loc); if (first) { first = 0; TSMimeHdrFieldValueStringSet(http_ctx->server_request_bufp, http_ctx->server_request_hdrp, field_loc, -1, val, val_len); } else { TSMimeHdrFieldDestroy(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 = tmp; } } else if (TSMimeHdrFieldCreateNamed(http_ctx->server_request_bufp, http_ctx->server_request_hdrp, key, key_len, &field_loc) != TS_SUCCESS) { TSError("[ts_lua][%s] TSMimeHdrFieldCreateNamed error", __FUNCTION__); return 0; } else { TSMimeHdrFieldValueStringSet(http_ctx->server_request_bufp, http_ctx->server_request_hdrp, field_loc, -1, val, val_len); TSMimeHdrFieldAppend(http_ctx->server_request_bufp, http_ctx->server_request_hdrp, field_loc); } if (field_loc != TS_NULL_MLOC) { TSHandleMLocRelease(http_ctx->server_request_bufp, http_ctx->server_request_hdrp, field_loc); } return 0; }