763252113893b5fa89e1b08a8a306e396770592a
hiram
  Fri Apr 7 12:47:11 2023 -0700
correct header output for plain text and add comment lines as per standard JSON output, TODO: manage error outputs refs #23589

diff --git src/hg/hubApi/apiUtils.c src/hg/hubApi/apiUtils.c
index b2928a1..4f1a77d 100644
--- src/hg/hubApi/apiUtils.c
+++ src/hg/hubApi/apiUtils.c
@@ -710,25 +710,40 @@
 dyStringPrintf(genArkPath, "%s/", tmpBuf);
 safencpy(tmpBuf, sizeof(tmpBuf), genome+7, 3);
 dyStringPrintf(genArkPath, "%s/", tmpBuf);
 safencpy(tmpBuf, sizeof(tmpBuf), genome+10, 3);
 dyStringPrintf(genArkPath, "%s", tmpBuf);
 
 return dyStringCannibalize(&genArkPath);
 }
 
 static struct dyString *textOutput = NULL;
 
 void textLineOut(char *lineOut)
 /* accumulate text lines for output in the dyString textOutput */
 {
 if (NULL == textOutput)
+    {
+    char outString[1024];
     textOutput = dyStringNew(0);
+    time_t timeNow = time(NULL);
+    struct tm tm;
+    gmtime_r(&timeNow, &tm);
+    safef(outString, sizeof(outString),
+       "# downloadTime: \"%d:%02d:%02dT%02d:%02d:%02dZ\"",
+        1900+tm.tm_year, tm.tm_mon+1, tm.tm_mday, tm.tm_hour, tm.tm_min,
+         tm.tm_sec);
+    dyStringPrintf(textOutput, "%s\n", outString);
+    safef(outString, sizeof(outString), "# downloadTimeStamp: %lld",
+        (long long) timeNow);
+    dyStringPrintf(textOutput, "%s\n", outString);
+    }
+
 dyStringPrintf(textOutput, "%s\n", lineOut);
 }
 
 void textFinishOutput()
 /* all done with text output, print it all out */
 {
-puts("Content-Type:text/plain");
+puts("Content-Type:text/plain\n");
 printf("%s", dyStringCannibalize(&textOutput));
 }