c99b62d7865a828f8f41c6e82dd36cbd2dd26780
markd
  Wed Jul 1 21:45:43 2020 -0700
hgBlat mostly works

diff --git src/hg/lib/trackHub.c src/hg/lib/trackHub.c
index 6f7d1a0..8222eb1 100644
--- src/hg/lib/trackHub.c
+++ src/hg/lib/trackHub.c
@@ -1153,52 +1153,63 @@
 void trackHubFindPos(struct cart *cart, char *db, char *term, struct hgPositions *hgp)
 /* Look for term in track hubs.  Update hgp if found */
 {
 struct trackDb *tdbList = NULL;
 if (trackHubDatabase(db))
     {
     struct trackHubGenome *genome = trackHubGetGenome(db);
     tdbList = trackHubTracksForGenome(genome->trackHub, genome);
     }
 else
     tdbList = hubCollectTracks(db, NULL);
 
 findBigBedPosInTdbList(cart, db, tdbList, term, hgp, NULL);
 }
 
-boolean trackHubGetBlatParams(char *database, boolean isTrans, char **pHost, char **pPort)
+boolean trackHubGetBlatParams(char *database, boolean isTrans, char **pHost, char **pPort, boolean* pDynamic)
 {
-char *hostPort;
+char *setting;
 
 if (isTrans)
     {
-    hostPort = trackHubAssemblyField(database, "transBlat");
+    setting = trackHubAssemblyField(database, "transBlat");
     }
 else
     {
-    hostPort = trackHubAssemblyField(database, "blat");
+    setting = trackHubAssemblyField(database, "blat");
     }
 
-if (hostPort == NULL)
+if (setting == NULL)
     return FALSE;
    
-hostPort = cloneString(hostPort);
+char *conf = trimSpaces(cloneString(setting));
+int numWords = chopByWhite(conf, NULL, 4);
+if ((numWords < 2) || (numWords > 3))
+    errAbort("invalid configuration for hub BLAT server, expect 2 or 3 words: %s", setting);
+char *words[3];
+chopByWhite(conf, words, numWords);
 
-*pHost = nextWord(&hostPort);
-if (hostPort == NULL)
-    return FALSE;
-*pPort = hostPort;
+*pHost = words[0];
+*pPort = words[1];
+if (numWords > 2)
+    {
+    if (!sameString(words[2], "dynamic"))
+        errAbort("invalid configuration for hub BLAT server, third argument should be 'dynamic' or omitted, got: %s", words[2]);
+    *pDynamic = TRUE;
+    }
+else
+    *pDynamic = FALSE;
 
 return TRUE;
 }
 
 void hubCheckBigDataUrl(struct trackHub *hub, struct trackHubGenome *genome, struct trackDb *tdb)
 /* Check remote file exists and is of correct type. Wrap this in error catcher */
 {
 char *relativeUrl = trackDbSetting(tdb, "bigDataUrl");
 if (relativeUrl != NULL)
     {
     char *type = trackDbRequiredSetting(tdb, "type");
     char *bigDataUrl = trackHubRelativeUrl(genome->trackDbFile, relativeUrl);
 
     char *bigDataIndex = NULL;
     char *relIdxUrl = trackDbSetting(tdb, "bigDataIndex");