static void free_request_state(StateInfo *state) { #if defined(DEBUG) int verify = 1; #else int verify = TSIsDebugTagSet(PLUGIN_NAME); #endif // Verify that the effective URL of this state object has been removed before we delete the state. if (verify) { void *ptr; TSMutexLock(state->plugin_config->troot_mutex); ptr = tfind(state->req_info->effective_url, &(state->plugin_config->troot), xstrcmp); TSMutexUnlock(state->plugin_config->troot_mutex); if (ptr) { TSReleaseAssert(ptr != state->req_info->effective_url); } } if (state->resp_info) { free_response_info(state->resp_info); } free_request_info(state->req_info); TSfree(state); }
void TSPluginInit(int argc, const char *argv[]) { const char prefix[] = "http://"; int uri_len; TSPluginRegistrationInfo info; info.plugin_name = "redirect-1"; info.vendor_name = "MyCompany"; info.support_email = "*****@*****.**"; if (TSPluginRegister(TS_SDK_VERSION_3_0, &info) != TS_SUCCESS) { TSError("Plugin registration failed.\n"); } if (!check_ts_version()) { TSError("Plugin requires Traffic Server 3.0 or later\n"); return; } if (argc == 3) { block_ip = TSstrdup(argv[1]); /* * The Location header must contain an absolute URI: */ url_redirect = TSstrdup(argv[2]); uri_len = strlen(prefix) + strlen(url_redirect) + 1; uri_redirect = TSmalloc(uri_len); TSstrlcpy(uri_redirect, prefix, uri_len); TSstrlcat(uri_redirect, url_redirect, uri_len); } else { TSError("Incorrect syntax in plugin.conf: correct usage is" "redirect-1.so ip_deny url_redirect"); return; } ip_deny = inet_addr(block_ip); TSDebug("redirect_init", "initializing stats..."); init_stats(); TSHttpHookAdd(TS_HTTP_READ_REQUEST_HDR_HOOK, TSContCreate(redirect_plugin, NULL)); TSDebug("redirect_init", "block_ip is %s, url_redirect is %s, and uri_redirect is %s", block_ip, url_redirect, uri_redirect); // ToDo: Should figure out how to print IPs which are IPv4 / v6. // TSDebug("redirect_init", "ip_deny is %ld\n", ip_deny); /* * Demonstrate another tracing function. This can be used to * enable debug calculations and other work that should only * be done in debug mode. */ if (TSIsDebugTagSet("redirect_demo")) TSDebug("redirect_init", "The redirect_demo tag is set"); else TSDebug("redirect_init", "The redirect_demo tag is not set"); }
void TSPluginInit(int argc, const char *argv[]) { const char prefix[] = "http://"; int uri_len; TSPluginRegistrationInfo info; info.plugin_name = PLUGIN_NAME; info.vendor_name = "Apache Software Foundation"; info.support_email = "*****@*****.**"; if (TSPluginRegister(&info) != TS_SUCCESS) { TSError("[%s] Plugin registration failed", PLUGIN_NAME); } if (argc == 3) { block_ip = TSstrdup(argv[1]); /* * The Location header must contain an absolute URI: */ url_redirect = TSstrdup(argv[2]); uri_len = strlen(prefix) + strlen(url_redirect) + 1; uri_redirect = TSmalloc(uri_len); TSstrlcpy(uri_redirect, prefix, uri_len); TSstrlcat(uri_redirect, url_redirect, uri_len); } else { TSError("[%s] Incorrect syntax in plugin.conf: correct usage is", PLUGIN_NAME "redirect_1.so ip_deny url_redirect"); return; } ip_deny = inet_addr(block_ip); TSDebug(PLUGIN_NAME, "initializing stats"); init_stats(); TSHttpHookAdd(TS_HTTP_READ_REQUEST_HDR_HOOK, TSContCreate(redirect_plugin, NULL)); TSDebug(PLUGIN_NAME ".init", "block_ip is %s, url_redirect is %s, and uri_redirect is %s", block_ip, url_redirect, uri_redirect); /* * Demonstrate another tracing function. This can be used to * enable debug calculations and other work that should only * be done in debug mode. */ if (TSIsDebugTagSet(PLUGIN_NAME ".demo")) { TSDebug(PLUGIN_NAME ".init", "The redirect_demo tag is set"); } else { TSDebug(PLUGIN_NAME ".init", "The redirect_demo tag is not set"); } }
static void handle_client_lookup(TSHttpTxn txnp, TSCont contp) { TSMBuffer bufp; TSMLoc hdr_loc, url_loc; int host_length; in_addr_t clientip = 0; const char *host; if (TSIsDebugTagSet("redirect")) { struct sockaddr const *addr = TSHttpTxnClientAddrGet(txnp); if (addr) { socklen_t addr_size = 0; if (addr->sa_family == AF_INET) { addr_size = sizeof(struct sockaddr_in); } else if (addr->sa_family == AF_INET6) { addr_size = sizeof(struct sockaddr_in6); } if (addr_size > 0) { char clientstring[INET6_ADDRSTRLEN]; if (NULL != inet_ntop(addr->sa_family, addr, clientstring, addr_size)) { TSDebug(PLUGIN_NAME, "clientip is %s and block_ip is %s", clientstring, block_ip); } } } } if (TSHttpTxnClientReqGet(txnp, &bufp, &hdr_loc) != TS_SUCCESS) { TSError("[%s] Couldn't retrieve client request header", PLUGIN_NAME); goto done; } if (TSHttpHdrUrlGet(bufp, hdr_loc, &url_loc) != TS_SUCCESS) { TSError("[%s] Couldn't retrieve request url", PLUGIN_NAME); TSHandleMLocRelease(bufp, TS_NULL_MLOC, hdr_loc); goto done; } host = TSUrlHostGet(bufp, url_loc, &host_length); if (!host) { TSError("[%s] Couldn't retrieve request hostname", PLUGIN_NAME); TSHandleMLocRelease(bufp, hdr_loc, url_loc); TSHandleMLocRelease(bufp, TS_NULL_MLOC, hdr_loc); goto done; } /* * Check to see if the client is already headed to the redirect site. */ if (strncmp(host, url_redirect, host_length) == 0) { TSHandleMLocRelease(bufp, hdr_loc, url_loc); TSHandleMLocRelease(bufp, TS_NULL_MLOC, hdr_loc); goto done; } /* TODO: This is odd, clientip is never set ... */ if (ip_deny == clientip) { TSHttpTxnHookAdd(txnp, TS_HTTP_SEND_RESPONSE_HDR_HOOK, contp); update_redirected_method_stats(bufp, hdr_loc); TSHandleMLocRelease(bufp, hdr_loc, url_loc); TSHandleMLocRelease(bufp, TS_NULL_MLOC, hdr_loc); /* * Increment the local redirect stat and do global update: */ TSStatIntIncrement(requests_redirects, 1); TSHttpTxnReenable(txnp, TS_EVENT_HTTP_ERROR); return; } done: // Increment the local number unchanged stat and do global update: TSStatIntIncrement(requests_unchanged, 1); TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE); }
static void handle_client_lookup(TSHttpTxn txnp, TSCont contp) { TSMBuffer bufp; TSMLoc hdr_loc, url_loc; int host_length; in_addr_t clientip = 0; const char *host; /* * Here we declare local coupled statistics variables: */ INKCoupledStat local_request_outcomes; INKStat local_requests_all; INKStat local_requests_redirects; INKStat local_requests_unchanged; /* * Create local copy of the global coupled stat category: */ local_request_outcomes = INKStatCoupledLocalCopyCreate("local_request_outcomes", request_outcomes); /* * Create the local copies of the global coupled stats: */ local_requests_all = INKStatCoupledLocalAdd(local_request_outcomes, "requests.all.local", INKSTAT_TYPE_FLOAT); local_requests_redirects = INKStatCoupledLocalAdd(local_request_outcomes, "requests.redirects.local", INKSTAT_TYPE_INT64); local_requests_unchanged = INKStatCoupledLocalAdd(local_request_outcomes, "requests.unchanged.local", INKSTAT_TYPE_INT64); /* * Increment the count of total requests: * (it is more natural to treat the number of requests as an * integer, but we declare this a FLOAT in order to demonstrate * how to increment coupled FLOAT stats) */ INKStatFloatAddTo(local_requests_all, 1.0); if (TSIsDebugTagSet("redirect")) { struct sockaddr const* addr = TSHttpTxnClientAddrGet(txnp); if (addr) { socklen_t addr_size = 0; if (addr->sa_family == AF_INET) addr_size = sizeof(struct sockaddr_in); else if (addr->sa_family == AF_INET6) addr_size = sizeof(struct sockaddr_in6); if (addr_size > 0) { char clientstring[INET6_ADDRSTRLEN]; if (NULL != inet_ntop(addr->sa_family, addr, clientstring, addr_size)) TSDebug("redirect", "clientip is %s and block_ip is %s", clientstring, block_ip); } } } if (TSHttpTxnClientReqGet(txnp, &bufp, &hdr_loc) != TS_SUCCESS) { TSError("couldn't retrieve client request header\n"); goto done; } if (TSHttpHdrUrlGet(bufp, hdr_loc, &url_loc) != TS_SUCCESS) { TSError("couldn't retrieve request url\n"); TSHandleMLocRelease(bufp, TS_NULL_MLOC, hdr_loc); goto done; } host = TSUrlHostGet(bufp, url_loc, &host_length); if (!host) { TSError("couldn't retrieve request hostname\n"); TSHandleMLocRelease(bufp, hdr_loc, url_loc); TSHandleMLocRelease(bufp, TS_NULL_MLOC, hdr_loc); goto done; } /* * Check to see if the client is already headed to the redirect site. */ if (strncmp(host, url_redirect, host_length) == 0) { TSHandleMLocRelease(bufp, hdr_loc, url_loc); TSHandleMLocRelease(bufp, TS_NULL_MLOC, hdr_loc); goto done; } /* TODO: This is odd, clientip is never set ... */ if (ip_deny == clientip) { TSHttpTxnHookAdd(txnp, TS_HTTP_SEND_RESPONSE_HDR_HOOK, contp); update_redirected_method_stats(bufp, hdr_loc); TSHandleMLocRelease(bufp, hdr_loc, url_loc); TSHandleMLocRelease(bufp, TS_NULL_MLOC, hdr_loc); /* * Increment the local redirect stat and do global update: */ INKStatIncrement(local_requests_redirects); INKStatsCoupledUpdate(local_request_outcomes); INKStatCoupledLocalCopyDestroy(local_request_outcomes); TSHttpTxnReenable(txnp, TS_EVENT_HTTP_ERROR); return; } done: /* * Increment the local number unchanged stat and do global update: */ INKStatIncrement(local_requests_unchanged); INKStatsCoupledUpdate(local_request_outcomes); INKStatCoupledLocalCopyDestroy(local_request_outcomes); TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE); }