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_dns(TSHttpTxn txnp, TSCont contp) { TSMBuffer bufp; TSMLoc hdr_loc; TSMLoc url_loc; const char *host; int i; int host_length; 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; } /* We need to lock the sites_mutex as that is the mutex that is protecting the global list of all blacklisted sites. */ if (TSMutexLockTry(sites_mutex) != TS_SUCCESS) { TSDebug(PLUGIN_NAME, "Unable to get lock. Will retry after some time"); TSHandleMLocRelease(bufp, hdr_loc, url_loc); TSHandleMLocRelease(bufp, TS_NULL_MLOC, hdr_loc); TSContSchedule(contp, RETRY_TIME, TS_THREAD_POOL_DEFAULT); return; } for (i = 0; i < nsites; i++) { if (strncmp(host, sites[i], host_length) == 0) { if (log) { TSTextLogObjectWrite(log, "blacklisting site: %s", sites[i]); } else { TSDebug(PLUGIN_NAME, "blacklisting site: %s", sites[i]); } TSHttpTxnHookAdd(txnp, TS_HTTP_SEND_RESPONSE_HDR_HOOK, contp); TSHandleMLocRelease(bufp, hdr_loc, url_loc); TSHandleMLocRelease(bufp, TS_NULL_MLOC, hdr_loc); TSHttpTxnReenable(txnp, TS_EVENT_HTTP_ERROR); TSMutexUnlock(sites_mutex); return; } } TSMutexUnlock(sites_mutex); TSHandleMLocRelease(bufp, hdr_loc, url_loc); TSHandleMLocRelease(bufp, TS_NULL_MLOC, hdr_loc); done: 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); }