commit - 6edd9a00dba749f4c342824a9cf42d5c48dd3d52
commit + 1337dc2bc98a9a6d161b79058055acf7f2670c07
blob - c192c840644ec600051f3c6300971e856f19b2aa
blob + f0058d29c2ed3c7c719290df0fe5160273580827
--- proxy.c
+++ proxy.c
size_t len;
if (clt->clt_headersdone) {
- copy:
if (clt->clt_translate)
proxy_translate_gemtext(clt);
else
!isdigit((unsigned char)hdr[1]) ||
hdr[2] != ' ') {
log_warnx("invalid ");
- free(hdr);
proxy_error(bev, EV_READ, clt);
- return;
+ goto err;
}
switch (hdr[0]) {
break;
default:
if (clt_puts(clt, "Status: 501\r\n") == -1)
- return;
+ goto err;
if (clt_puts(clt,
"Content-Type: text/plain;charset=utf8\r\n") == -1)
- return;
+ goto err;
if (clt_puts(clt, "\r\n") == -1)
- return;
+ goto err;
if (clt_printf(clt, "Request failed with code %c%c\n\n",
hdr[0], hdr[1]) == -1)
- return;
+ goto err;
if (clt_printf(clt, "The server says: %s\n", &hdr[3]) == -1)
- return;
+ goto err;
fcgi_end_request(clt, 1);
- return;
+ goto err;
}
mime = hdr + 2 + strspn(hdr + 2, " \t");
if (parse_mime(clt, mime, lang, sizeof(lang)) == -1) {
if (clt_puts(clt, "Status: 501\r\n") == -1)
- return;
+ goto err;
if (clt_puts(clt,
"Content-Type: text/plain;charset=utf8\r\n") == -1)
- return;
+ goto err;
if (clt_puts(clt, "\r\n") == -1)
- return;
+ goto err;
if (clt_printf(clt, "Failed to parse the Gemini response\n")
== -1)
fcgi_end_request(clt, 1);
- return;
+ goto err;
}
if (clt->clt_translate)
ctype = mime;
if (clt_printf(clt, "Content-Type: %s\r\n\r\n", ctype) == -1)
- return;
+ goto err;
clt->clt_headersdone = 1;
if (clt->clt_translate) {
if (clt_puts(clt, "<!doctype html><html") == -1)
- return;
+ goto err;
if (*lang != '\0') {
if (clt_puts(clt, " lang='") == -1 ||
printurl(clt, lang) == -1 ||
clt_puts(clt, "'") == -1)
- return;
+ goto err;
}
if (clt_puts(clt, "><head>") == -1)
- return;
+ goto err;
if (*pc->stylesheet != '\0' &&
clt_printf(clt, "<link rel='stylesheet' href='%s' />",
pc->stylesheet) == -1)
- return;
+ goto err;
if (clt_puts(clt, "</head><body>") == -1)
- return;
+ goto err;
}
- goto copy;
+ /*
+ * Trigger the read again so we proceed with the response
+ * body, if any.
+ */
+ free(hdr);
+ proxy_read(bev, d);
+ return;
+
+err:
+ free(hdr);
}
void