e27f427561241ab8dd9e881f082c1e68007e6dfe
hiram
  Wed Mar 20 09:48:44 2019 -0700
correctly exclude vars for hgwdev-api URL functions refs #18869

diff --git src/hg/hubApi/hubApi.c src/hg/hubApi/hubApi.c
index a58944f..d85ec80 100644
--- src/hg/hubApi/hubApi.c
+++ src/hg/hubApi/hubApi.c
@@ -682,31 +682,31 @@
    {
    *nameReturn = cloneString(row[0]);
    length = sqlLongLong(row[1]);
    }
 sqlFreeResult(&sr);
 hFreeConn(&conn);
 return length;
 }
 
 static void tracksForUcscDb(char *db)
 /* scan the specified database for all tracks */
 {
 struct hash *countTracks = hashNew(0);
 char *chromName = NULL;
 long long chromSize = largestChrom(db, &chromName);
-hPrintf("<p>Tracks in UCSC genome: '%s', longest chrom: %s:%lld<br>\n", db, chromName, chromSize);
+hPrintf("<h4>Tracks in UCSC genome: '%s', longest chrom: %s:%lld</h4>\n", db, chromName, chromSize);
 struct trackDb *tdbList = obtainTdb(NULL, db);
 struct trackDb *tdb;
 hPrintf("<ul>\n");
 hPrintf("<li>%s:%lld</li>\n", chromName, chromSize);
 for (tdb = tdbList; tdb != NULL; tdb = tdb->next )
     {
     countOneTdb(db, tdb, NULL, countTracks, chromName, chromSize);
     if (timeOutReached())
 	break;
     }
 int trackCount = ptToInt(hashFindVal(countTracks, "track count"));
 /* elCount - 1 since the 'track count' element isn't a track */
 hPrintf("    <li>%d total tracks counted, %d different track types</li>\n", trackCount, countTracks->elCount - 1);
 if (countTracks->elCount)
     {
@@ -839,32 +839,30 @@
 /* Set up globals and make web page */
 {
 cart = theCart;
 measureTiming = hPrintStatus() && isNotEmpty(cartOptionalString(cart, "measureTiming"));
 measureTiming = TRUE;
 char *database = NULL;
 char *genome = NULL;
 
 cgiVarSet("ignoreCookie", "1");
 
 getDbAndGenome(cart, &database, &genome, oldVars);
 initGenbankTableNames(database);
 initSupportedTypes();
 initUrlPrefix();
 
-char *docRoot = cfgOptionDefault("browser.documentRoot", DOCUMENT_ROOT);
-
 int timeout = cartUsualInt(cart, "udcTimeout", 300);
 if (udcCacheTimeout() < timeout)
     udcSetCacheTimeout(timeout);
 knetUdcInstall();
 
 char *pathInfo = getenv("PATH_INFO");
 /* nothing on incoming path, then display the WEB page instead */
 if (sameOk("/",pathInfo))
     pathInfo = NULL;
 
 boolean commandError = FALSE;
 /*expect no more than MAX_PATH_INFO number of words*/
 char *words[MAX_PATH_INFO];
 
 if (isNotEmpty(pathInfo))
@@ -896,137 +894,178 @@
 int listSize = slCount(dbList);
 AllocArray(ucscDbList, listSize);
 struct dbDb *el = dbList;
 int ucscDataBaseCount = 0;
 int maxDbNameWidth = 0;
 for ( ; el != NULL; el = el->next )
     {
     ucscDbList[ucscDataBaseCount++] = el->name;
     if (strlen(el->name) > maxDbNameWidth)
 	maxDbNameWidth = strlen(el->name);
     }
 maxDbNameWidth += 1;
 
 cartWebStart(cart, database, "UCSC API v"CGI_VERSION);
 
+if (debug)
+    {
+    char *envVar = getenv("BROWSER_HOST");
+    hPrintf("<h4>BROWSER_HOST:%s</h4>\n", envVar);
+    envVar = getenv("CONTEXT_DOCUMENT_ROOT");
+    hPrintf("<h4>CONTEXT_DOCUMENT_ROOT:%s</h4>\n", envVar);
+    envVar = getenv("CONTEXT_PREFIX");
+    hPrintf("<h4>CONTEXT_PREFIX:%s</h4>\n", envVar);
+    envVar = getenv("DOCUMENT_ROOT");
+    hPrintf("<h4>DOCUMENT_ROOT:%s</h4>\n", envVar);
+    envVar = getenv("HTTP_HOST");
+    hPrintf("<h4>HTTP_HOST:%s</h4>\n", envVar);
+    envVar = getenv("REQUEST_URI");
+    hPrintf("<h4>REQUEST_URI:%s</h4>\n", envVar);
+    envVar = getenv("SCRIPT_FILENAME");
+    hPrintf("<h4>SCRIPT_FILENAME:%s</h4>\n", envVar);
+    envVar = getenv("SCRIPT_NAME");
+    hPrintf("<h4>SCRIPT_NAME:%s</h4>\n", envVar);
+    envVar = getenv("SCRIPT_URI");
+    hPrintf("<h4>SCRIPT_URI:%s</h4>\n", envVar);
+    envVar = getenv("SCRIPT_URL");
+    hPrintf("<h4>SCRIPT_URL:%s</h4>\n", envVar);
+    envVar = getenv("SERVER_NAME");
+    hPrintf("<h4>SERVER_NAME:%s</h4>\n", envVar);
+    }
+
+
 char *goOtherHub = cartUsualString(cart, "goOtherHub", defaultHub);
 char *goUcscDb = cartUsualString(cart, "goUcscDb", "");
 char *otherHubUrl = cartUsualString(cart, "urlHub", defaultHub);
 char *goPublicHub = cartUsualString(cart, "goPublicHub", defaultHub);
 char *hubDropDown = cartUsualString(cart, "publicHubs", defaultHub);
 char *urlDropDown = urlFromShortLabel(hubDropDown);
 char *ucscDb = cartUsualString(cart, "ucscGenomes", defaultDb);
 char *urlInput = urlDropDown;	/* assume public hub */
 if (sameWord("go", goOtherHub))	/* requested other hub URL */
     urlInput = otherHubUrl;
+else if (isEmpty(otherHubUrl))
+    otherHubUrl = urlInput;
 
 if (commandError)
   {
   hPrintf("<h3>ERROR: no such command: '%s/%s' for endpoint '%s'</h3>", words[0], words[1], pathInfo);
   }
 
 long lastTime = clock1000();
 struct trackHub *hub = errCatchTrackHubOpen(urlInput);
 if (measureTiming)
     {
     long thisTime = clock1000();
     if (debug)
     hPrintf("<em>hub open time: %ld millis</em><br>\n", thisTime - lastTime);
     }
 
 // hPrintf("<h3>ucscDb: '%s'</h2>\n", ucscDb);
 
 struct trackHubGenome *hubGenome = hub->genomeList;
 
 introductionText();
 
 showExamples(urlInput, hubGenome, ucscDb);
 
 if (debug)
     showCartDump();
 
 hPrintf("<h2>Explore hub or database assemblies and tracks</h2>\n");
 
-hPrintf("<form action='%s' name='hubApiUrl' id='hubApiUrl' method='GET'>\n\n", "../cgi-bin/hubApi");
+// hPrintf("<form action='%s' name='hubApiUrl' id='hubApiUrl' method='GET'>\n\n", "../cgi-bin/hubApi");
+hPrintf("<form action='%s' name='hubApiUrl' id='hubApiUrl' method='GET'>\n\n", urlPrefix);
+
+#ifdef NOT
+if (isEmpty(urlPrefix))
+    {
+    char *scriptUri = getenv("SCRIPT_URI");
+    hPrintf("<form action='%s' name='hubApiUrl' id='hubApiUrl' method='GET'>\n\n", scriptUri);
+    }
+else
+    hPrintf("<form action='%s' name='hubApiUrl' id='hubApiUrl' method='GET'>\n\n", urlPrefix);
+#endif
 
 hPrintf("<b>Select public hub:&nbsp;</b>");
 #define JBUFSIZE 2048
 #define SMALLBUF 256
 char javascript[JBUFSIZE];
 struct slPair *events = NULL;
 safef(javascript, sizeof(javascript), "this.lastIndex=this.selectedIndex;");
 slPairAdd(&events, "focus", cloneString(javascript));
 
 cgiMakeDropListClassWithIdStyleAndJavascript("publicHubs", "publicHubs",
     shortLabels, publicHubCount, hubDropDown, NULL, "width: 400px", events);
 
 hWrites("&nbsp;");
 hButton("goPublicHub", "go");
 
 hPrintf("<br>Or, enter a hub URL:&nbsp;");
-hPrintf("<input type='text' name='urlHub' id='urlHub' size='60' value='%s'>\n", urlInput);
+hPrintf("<input type='text' name='urlHub' id='urlHub' size='60' value='%s'>\n", otherHubUrl);
 hWrites("&nbsp;");
 hButton("goOtherHub", "go");
 
 hPrintf("<br>Or, select a UCSC database name:&nbsp;");
 maxDbNameWidth *= 9;  // 9 should be font width here
 char widthPx[SMALLBUF];
 safef(widthPx, sizeof(widthPx), "width: %dpx", maxDbNameWidth);
 cgiMakeDropListClassWithIdStyleAndJavascript("ucscGenomes", "ucscGenomes",
     ucscDbList, ucscDataBaseCount, ucscDb, NULL, widthPx, events);
 hWrites("&nbsp;");
 hButton("goUcscDb", "go");
 
 boolean depthSearch = cartUsualBoolean(cart, "depthSearch", FALSE);
 hPrintf("<br>\n&nbsp;&nbsp;");
 hCheckBox("depthSearch", cartUsualBoolean(cart, "depthSearch", FALSE));
 hPrintf("&nbsp;perform full bbi file measurement : %s (will time out if taking longer than %ld seconds)<br>\n", depthSearch ? "TRUE" : "FALSE", timeOutSeconds);
 hPrintf("\n&nbsp;&nbsp;");
 allTrackSettings = cartUsualBoolean(cart, "allTrackSettings", FALSE);
 hCheckBox("allTrackSettings", allTrackSettings);
 hPrintf("&nbsp;display all track settings for each track : %s<br>\n", allTrackSettings ? "TRUE" : "FALSE");
 
 hPrintf("<br>\n</form>\n");
 
+hPrintf("<p>\n");
 if (sameWord("go", goUcscDb))	/* requested UCSC db track list */
     {
     tracksForUcscDb(ucscDb);
     }
 else
     {
-    if (debug)
-	{
-	hPrintf("<p>URL: %s - %s<br>\n", urlInput, sameWord("go",goPublicHub) ? "public hub" : "other hub");
-	hPrintf("name: %s<br>\n", hub->shortLabel);
-	hPrintf("description: %s<br>\n", hub->longLabel);
-	hPrintf("default db: '%s'<br>\n", isEmpty(hub->defaultDb) ? "(none available)" : hub->defaultDb);
-	printf("docRoot:'%s'<br>\n", docRoot);
-	}
+    hPrintf("<h4>Examine %s at: %s</h4>\n", sameWord("go",goPublicHub) ? "public hub" : "other hub", urlInput);
+    hPrintf("<ul>\n");
+    hPrintf("<li>%s</li>\n", hub->shortLabel);
+    hPrintf("<li>%s</li>\n", hub->longLabel);
+    if (isNotEmpty(hub->defaultDb))
+        hPrintf("<li>%s - default database</li>\n", hub->defaultDb);
+    hPrintf("</ul>\n");
 
     if (hub->genomeList)
 	(void) genomeList(hub, NULL, NULL);	/* ignore returned list */
-    hPrintf("</p>\n");
     }
 
 if (timedOut)
     hPrintf("<h1>Reached time out %ld seconds</h1>", timeOutSeconds);
 if (measureTiming)
     hPrintf("<em>Overall total time: %ld millis</em><br>\n", clock1000() - enteredMainTime);
 
+hPrintf("</p>\n");
+
 cartWebEnd();
 }	/*	void doMiddle(struct cart *theCart)	*/
 
 /* Null terminated list of CGI Variables we don't want to save
  * permanently. */
-static char *excludeVars[] = {"Submit", "submit", NULL,};
+static char *excludeVars[] = {"Submit", "submit", "goOtherHub", "goPublicHub", "goUcscDb", "ucscGenomes", "publicHubs", NULL,};
 
 int main(int argc, char *argv[])
 /* Process command line. */
 {
 enteredMainTime = clock1000();
 cgiSpoof(&argc, argv);
 measureTiming = TRUE;
 verboseTimeInit();
 trackCounter = hashNew(0);
 cartEmptyShellNoContent(doMiddle, hUserCookie(), excludeVars, oldVars);
 return 0;
 }