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)
     {