c14f04a77954e2abf3747d2943c42e4a499d0f6b hiram Mon Sep 20 10:03:35 2021 -0700 restore obsolete botDelay code required by hgPhyloPlace and do not set variables that are in environment diff --git src/hg/lib/botDelay.c src/hg/lib/botDelay.c index 534c793..6086423 100644 --- src/hg/lib/botDelay.c +++ src/hg/lib/botDelay.c @@ -100,59 +100,126 @@ return user; } char *getBotCheckString(char *ip, double fraction) /* compose "user.ip fraction" string for bot check */ { char *user = getCookieUser(); char *botCheckString = needMem(256); if (user) safef(botCheckString, 256, "%s.%s %f", user, ip, fraction); else safef(botCheckString, 256, "%s %f", ip, fraction); return botCheckString; } +void botDelayCgi(char *host, int port, boolean noWarn, double fraction) +/* Connect with bottleneck server and sleep the + * amount it suggests for IP address calling CGI script, + * after imposing the specified fraction of the access penalty. */ +{ +int millis; +char *ip = getenv("REMOTE_ADDR"); +if (ip != NULL) + { + char *botCheckString = getBotCheckString(ip, fraction); + millis = botDelayTime(host, port, botCheckString); + freeMem(botCheckString); + if (millis > 0) + { + if (millis > 10000) + { + if (millis > 20000) + botTerminateMessage(ip, millis); + else + { + if (!noWarn) + botDelayMessage(ip, millis); + } + } + sleep1000(millis); + } + } +} + boolean botException() /* check if the remote ip address is on the exceptions list */ { char *exceptIps = cfgOption("bottleneck.except"); if (exceptIps) { char *remoteAddr = getenv("REMOTE_ADDR"); if (remoteAddr) { char *s = exceptIps; boolean found = FALSE; while (s && !found) { char *e = strchr(s, ' '); if (e) *e = 0; if (sameString(remoteAddr, s)) found = TRUE; if (e) *e++ = ' '; s = e; } if (found) return TRUE; } } return FALSE; } +static void hgBotDelayExt(boolean noWarn, double fraction) +/* High level bot delay call - looks up bottleneck server + * in hg.conf. */ +{ +if (botException()) + return; + +char *host = cfgOption("bottleneck.host"); +char *port = cfgOption("bottleneck.port"); + +if (host != NULL && port != NULL) + botDelayCgi(host, atoi(port), noWarn, fraction); +} + +void hgBotDelay() +/* High level bot delay call - for use with regular webpage output */ +{ +hgBotDelayExt(FALSE, defaultDelayFrac); +} + +void hgBotDelayFrac(double fraction) +/* Like hgBotDelay, but imposes a fraction of the standard access penalty */ +{ +hgBotDelayExt(FALSE, fraction); +} + +void hgBotDelayNoWarn() +/* High level bot delay call without warning - for use with non-webpage outputs */ +{ +hgBotDelayExt(TRUE, defaultDelayFrac); +} + +void hgBotDelayNoWarnFrac(double fraction) +/* Like hgBotDelayNoWarn, but imposes a fraction of the standard access penalty */ +{ +hgBotDelayExt(TRUE, fraction); +} + int hgBotDelayTime() { return hgBotDelayTimeFrac(defaultDelayFrac); } int hgBotDelayTimeFrac(double fraction) /* Get suggested delay time from cgi using the standard penalty. */ { char *ip = getenv("REMOTE_ADDR"); char *host = cfgOption("bottleneck.host"); char *port = cfgOption("bottleneck.port"); int delay = 0; if (host != NULL && port != NULL && ip != NULL) {