/* handle_hook * Fires on TS_EVENT_HTTP_READ_REQUEST_HDR events, gets the effectiveUrl * finds the host, gets the generation ID, gen_id, for the host * and runs TSCacheUrlSet to change the cache key for the read */ static int handle_hook(TSCont *contp, TSEvent event, void *edata) { TSHttpTxn txnp = (TSHttpTxn)edata; char *url = NULL, *host = NULL; int url_length; int gen_id; int ok = 1; switch (event) { case TS_EVENT_HTTP_READ_REQUEST_HDR: TSDebug(PLUGIN_NAME, "handling TS_EVENT_HTTP_READ_REQUEST_HDR"); if (ok) { url = TSHttpTxnEffectiveUrlStringGet(txnp, &url_length); if (!url) { TSError("[%s] could not retrieve request url", PLUGIN_NAME); ok = 0; } } if (ok) { get_genid_host(&host, url); if (!host) { TSError("[%s] could not retrieve request host", PLUGIN_NAME); ok = 0; } } if (ok) { TSDebug(PLUGIN_NAME, "From url (%s) discovered host (%s)", url, host); if ((gen_id = get_genid(host)) != 0) { if (TSHttpTxnConfigIntSet(txnp, TS_CONFIG_HTTP_CACHE_GENERATION, gen_id) != TS_SUCCESS) { TSDebug(PLUGIN_NAME, "Error, unable to modify cache url"); TSError("[%s] Unable to set cache generation for %s to %d", PLUGIN_NAME, url, gen_id); ok = 0; } } } /* Clean up */ if (url) { TSfree(url); } if (host) { TSfree(host); } TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE); break; default: TSAssert(!"Unexpected event"); ok = 0; break; } return ok; }
static int ts_lua_http_config_int_set(lua_State *L) { int conf; int value; ts_lua_http_ctx *http_ctx; GET_HTTP_CONTEXT(http_ctx, L); conf = luaL_checkinteger(L, 1); value = luaL_checkinteger(L, 2); TSHttpTxnConfigIntSet(http_ctx->txnp, conf, value); return 0; }
static int global_plugin(TSCont contp ATS_UNUSED, TSEvent event, void *edata) { TSDebug(PLUGIN_NAME, "transform_plugin starting"); TSHttpTxn txnp = (TSHttpTxn)edata; switch (event) { case TS_EVENT_HTTP_READ_REQUEST_HDR: if (is_post_request(txnp)) { TSHttpTxnConfigIntSet(txnp, TS_CONFIG_HTTP_REQUEST_BUFFER_ENABLED, 1); TSHttpTxnHookAdd(txnp, TS_HTTP_REQUEST_BUFFER_READ_COMPLETE_HOOK, TSContCreate(request_buffer_plugin, TSMutexCreate())); } TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE); return 0; default: break; } return 0; }
static void handle_purge(TSHttpTxn txnp, PurgeInstance *purge) { TSMBuffer reqp; TSMLoc hdr_loc = NULL, url_loc = NULL; bool should_purge = false; if (TS_SUCCESS == TSHttpTxnClientReqGet(txnp, &reqp, &hdr_loc)) { int method_len = 0; const char *method = TSHttpHdrMethodGet(reqp, hdr_loc, &method_len); if ((TS_HTTP_METHOD_PURGE == method) || ((TS_HTTP_METHOD_GET == method) && purge->allow_get)) { /* First see if we require the "secret" to be passed in a header, and then use that */ if (purge->header) { TSMLoc field_loc = TSMimeHdrFieldFind(reqp, hdr_loc, purge->header, purge->header_len); if (field_loc) { const char *header; int header_len; header = TSMimeHdrFieldValueStringGet(reqp, hdr_loc, field_loc, -1, &header_len); TSDebug(PLUGIN_NAME, "Checking for %.*s == %s ?", header_len, header, purge->secret); if (header && (header_len == purge->secret_len) && !memcmp(header, purge->secret, header_len)) { should_purge = true; } TSHandleMLocRelease(reqp, hdr_loc, field_loc); } } else { /* We are matching on the path component instead of a header */ if (TS_SUCCESS == TSHttpHdrUrlGet(reqp, hdr_loc, &url_loc)) { int path_len = 0; const char *path = TSUrlPathGet(reqp, url_loc, &path_len); TSDebug(PLUGIN_NAME, "Checking PATH = %.*s", path_len, path); if (path && (path_len >= purge->secret_len)) { int s_path = path_len - 1; while ((s_path >= 0) && ('/' != path[s_path])) { /* No memrchr in OSX */ --s_path; } if (!memcmp(s_path > 0 ? path + s_path + 1 : path, purge->secret, purge->secret_len)) { should_purge = true; } } TSHandleMLocRelease(reqp, hdr_loc, url_loc); } } } TSHandleMLocRelease(reqp, TS_NULL_MLOC, hdr_loc); } /* Setup the continuation to handle this request if appropriate, if not, set the GenID if needed */ if (should_purge) { TSCont cont = TSContCreate(purge_cont, TSMutexCreate()); TSContDataSet(cont, purge); TSHttpTxnHookAdd(txnp, TS_HTTP_CACHE_LOOKUP_COMPLETE_HOOK, cont); TSHttpTxnHookAdd(txnp, TS_HTTP_SEND_RESPONSE_HDR_HOOK, cont); } else if (purge->gen_id > 0) { TSHttpTxnConfigIntSet(txnp, TS_CONFIG_HTTP_CACHE_GENERATION, purge->gen_id); } }