a9fde73d32daf74780765442de44324061b01d66
markd
  Sun Jan 22 22:13:52 2023 -0800
Add URL resolver plugin functionality to allow an external program to convert
cloud URLs (s3:, gs: drs:, or really any non-HTTP RUL) to http/https URLs.
This can include signed URLs.  The cloud URL is used to index the UDC cache
rather than the resolved URL.  This allows for re-resolving signed URLs
if they time out.

Joint work by Max and Markd

diff --git src/hg/lib/trackHub.c src/hg/lib/trackHub.c
index 60351b7..dcbbfdb 100644
--- src/hg/lib/trackHub.c
+++ src/hg/lib/trackHub.c
@@ -1176,31 +1176,31 @@
 {
 /* html setting should always be set because we set it at load time */
 char *htmlName = trackDbSetting(tdb, "html");
 if (htmlName == NULL)
     return;
 
 char *simpleName = hubConnectSkipHubPrefix(htmlName);
 char *url = trackHubRelativeUrl(trackDbFile, simpleName);
 char buffer[10*1024];
 char *fixedUrl = url;
 if (!endsWith(url, ".html"))
     {
     safef(buffer, sizeof buffer, "%s.html", url);
     fixedUrl = buffer;
     }
-tdb->html = netReadTextFileIfExists(fixedUrl);
+tdb->html = udcFileReadAllIfExists(fixedUrl, NULL, 0, NULL);
 freez(&url);
 }
 
 void trackHubAddDescription(char *trackDbFile, struct trackDb *tdb)
 /* Fetch tdb->track's html description (or nearest ancestor's non-empty description)
  * and store in tdb->html. */
 {
 trackHubAddOneDescription(trackDbFile, tdb);
 if (isEmpty(tdb->html))
     {
     struct trackDb *parent;
     for (parent = tdb->parent;  isEmpty(tdb->html) && parent != NULL;  parent = parent->parent)
 	{
 	trackHubAddOneDescription(trackDbFile, parent);
 	if (isNotEmpty(parent->html))