36f8f6fb024b20cc523cdf9ebde7491eca84fd7c
markd
  Sun Dec 6 20:33:20 2020 -0800
multiple request per connect works except hgBlat

diff --git src/jkOwnLib/gfWebLib.c src/jkOwnLib/gfWebLib.c
index 46f80e7..a312fe8 100644
--- src/jkOwnLib/gfWebLib.c
+++ src/jkOwnLib/gfWebLib.c
@@ -1,117 +1,120 @@
 /* gfWebLib - some helper routines for the webBlat and webPcr.
  * Copyright 2004-2005 Jim Kent.  All rights reserved. */
 #include "common.h"
 #include "linefile.h"
 #include "hash.h"
 #include "cheapcgi.h"
 #include "gfWebLib.h"
 
 
 struct gfServerAt *gfWebFindServer(struct gfServerAt *serverList, char *varName)
 /* Find active server (that matches contents of CGI variable varName). */
 {
 struct gfServerAt *server = serverList;
 if (cgiVarExists(varName))
      {
      char *db = cgiString(varName);
      for (server = serverList; server != NULL; server = server->next)
           {
 	  if (sameString(db, server->name))
 	      break;
 	  }
      if (server == NULL)
           errAbort("%s %s not found", varName, db);
      }
 return server;
 }
 
 static void checkForDup(struct gfServerAt *server, char *type, struct lineFile *lf,
                         struct hash *hash)
 /* check for duplicate server specification and record this one */
 {
 if (hashLookup(hash, server->name))
     errAbort("Duplicate %s name %s line %d of %s",
              type, server->name, lf->lineIx, lf->fileName);
 hashAdd(hash, server->name, NULL);
 }
 
 static void addServer(struct gfWebConfig *cfg, char *type, struct lineFile *lf,
                       char *line, struct hash *uniqHash, struct hash *uniqTransHash)
 /* add a server parsed from the config */
 {
 struct gfServerAt *server;
 boolean isDynamic = sameString(type, "dynServer");
 char *dupe = cloneString(line);
 AllocVar(server);
 server->host = nextWord(&dupe);
 server->port = nextWord(&dupe);
 if (isDynamic)
+    {
+    server->genome = nextWord(&dupe);
     server->dynGenomeDir = nextWord(&dupe);
+    }
 server->seqDir = nextWord(&dupe);
 server->name = trimSpaces(dupe);
 if (server->name == NULL || server->name[0] == 0)
     errAbort("Badly formed gfServer command line %d of %s:\n%s",
         lf->lineIx, lf->fileName, line);
 if (isDynamic)
     {
     slAddTail(&cfg->serverList, server);
     checkForDup(server, type, lf, uniqHash);
     struct gfServerAt *serverCp = cloneMem(server, sizeof(struct gfServerAt));
     slAddTail(&cfg->transServerList, serverCp);
     checkForDup(serverCp, type, lf, uniqTransHash);
     }
 else if (sameString("gfServerTrans", type))
     {
     slAddTail(&cfg->transServerList, server);
     checkForDup(server, type, lf, uniqTransHash);
     }
 else
     {
     slAddTail(&cfg->serverList, server);
     checkForDup(server, type, lf, uniqHash);
     }
 }
 
 
 struct gfWebConfig *gfWebConfigRead(char *fileName)
 /* Read configuration file into globals. */
 {
 struct gfWebConfig *cfg;
 struct lineFile *lf = lineFileOpen(fileName, TRUE);
 char *line, *word;
 struct hash *uniqHash = newHash(0), *uniqTransHash = newHash(0);
 
 AllocVar(cfg);
 cfg->company = "";
 while (lineFileNextReal(lf, &line))
     {
     word = nextWord(&line);
     if (sameWord("company", word))
         {
 	cfg->company = cloneString(trimSpaces(line));
 	}
     else if (sameWord("gfServer", word) || sameWord("gfServerTrans", word) || sameWord("dynServer", word))
         {
         addServer(cfg, word, lf, line, uniqHash, uniqTransHash);
 	}
     else if (sameWord("tempDir", word))
         {
 	cfg->tempDir = cloneString(trimSpaces(line));
 	}
     else if (sameWord("background", word))
         {
 	cfg->background = cloneString(trimSpaces(line));
 	}
     else
         {
 	errAbort("Unrecognized command %s line %d of  %s", word, lf->lineIx, fileName);
 	}
     }
 
 if (cfg->serverList == NULL && cfg->transServerList == NULL)
     errAbort("no gfServer's specified in %s", fileName);
 freeHash(&uniqHash);
 freeHash(&uniqTransHash);
 return cfg;
 }