cb99f0b11bdeee5dfa76064d38b6410da0f4a709 max Thu Sep 10 00:55:21 2026 -0700 Centralize CGI Content-Type printing in one cgiPrintContentType() helper Around 90 places across the tree hand-rolled the CGI response header, each with its own spelling: "Content-Type:" or "Content-type:", \n or \r\n, and the terminating blank line written as part of the same string, as a separate puts("\n") (which emits two newlines, so a stray blank line led the body) or as printf("\r\n\r\n") (two blank lines). A handful forgot the terminator entirely and relied on a following header to supply it. cgiPrintContentType() in lib/cheapcgi.c now writes the Content-Type line and the blank line that ends the header. Header lines are not ordered, so the callers that also send Status, Set-Cookie, Content-Disposition, Content-Length or X-Sendfile write those first and call this last to close the header; that keeps it to a single helper rather than a print-the-line / end-the-header pair that a caller can half-use. cart.c's existing httpHeaders list already worked this way. Only the CGI response path is touched. The dyStringPrintf("Content-type: ...") calls that build outgoing HTTP *requests* (genomeSpace, oauthLogin, eapMetaSync, edwWebAuthLogin, ga4ghToBed) are unrelated and left alone. Also fills out the apiKey error message in botDelay.c to say where to create a key and that keys are server-specific. No behavior change on the wire beyond dropping those stray blank lines and adding the missing newline after Retry-After. diff --git src/ameme/amemeFloat.c src/ameme/amemeFloat.c index 96b61c76437..5de0eb9de3d 100644 --- src/ameme/amemeFloat.c +++ src/ameme/amemeFloat.c @@ -2266,28 +2266,28 @@ isFromWeb = cgiIsOnWeb(); if (!isFromWeb && !cgiSpoof(&argc, argv)) { errAbort("ameme - find common patterns in DNA\n" "usage\n" " ameme good=goodIn.fa [bad=badIn.fa] [numMotifs=2] [background=m1] [maxOcc=2]\n" "where goodIn.fa is a multi-sequence fa file containing instances\n" "of the motif you want to find, badIn.fa is a file containing similar\n" "sequences but lacking the motif, numMotifs is the number of motifs\n" "to scan for, background is m0,m1, or m2 for various levels of Markov\n" "models, and maxOcc is the maximum occurrences of the motif you \n" "expect to find in a single sequence\n"); } /* Print out html header. Make background color brilliant white. */ -puts("Content-Type:text/html\n"); +cgiPrintContentType("text/html"); printf("
\n