- char buf[BUFSIZ];
-
- /* Fill in the HTTP Status */
- sprintf(buf, "HTTP/1.0 %s", rsp->status ? rsp->status : "200 OK");
- enlist_first(rsp->headers, buf);
-
- /* Set the Content-Length */
- if (rsp->content_length == 0)
- {
- rsp->content_length = rsp->body ? strlen(rsp->body) : 0;
- }
-
-
- sprintf(buf, "Content-Length: %d", rsp->content_length);
- enlist(rsp->headers, buf);
-
- /* Fill in the default headers FIXME: Are these correct? sequence OK? check rfc! */
- enlist_unique(rsp->headers, "Pragma: no-cache", 7);
- enlist_unique(rsp->headers, "Last-Modified: Thu Jul 31, 1997 07:42:22 pm GMT", 14);
- enlist_unique(rsp->headers, "Expires: Thu Jul 31, 1997 07:42:22 pm GMT", 8);
- enlist_unique(rsp->headers, "Content-Type: text/html", 13);
- enlist(rsp->headers, "");
-
-
- /* Write the head */
- if (NULL == (rsp->head = list_to_text(rsp->headers)))
- {
- free_http_response(rsp);
- return(0);
- }
-
- return(strlen(rsp->head));
+ jb_err err;
+ struct http_response *rsp;
+ struct map * exports = default_exports(csp, NULL);
+ if (exports == NULL)
+ {
+ return cgi_error_memory();
+ }
+
+ if (NULL == (rsp = alloc_http_response()))
+ {
+ free_map(exports);
+ return cgi_error_memory();
+ }
+
+ err = map(exports, "host-html", 1, html_encode(csp->http->host), 0)
+ || map(exports, "hostport", 1, csp->http->hostport, 1)
+ || map(exports, "hostport-html", 1, html_encode(csp->http->hostport), 0)
+ || map(exports, "path", 1, csp->http->path, 1)
+ || map(exports, "path-html", 1, html_encode(csp->http->path), 0)
+ || map(exports, "error", 1, safe_strerror(sys_err), 0)
+ || map(exports, "host-ip", 1, csp->http->host_ip_addr_str, 1);
+
+ if (err)
+ {
+ free_map(exports);
+ free_http_response(rsp);
+ return cgi_error_memory();
+ }
+
+ if (!strcmp(templatename, "no-such-domain"))
+ {
+ rsp->status = strdup("404 No such domain");
+ if (rsp->status == NULL)
+ {
+ free_map(exports);
+ free_http_response(rsp);
+ return cgi_error_memory();
+ }
+ }
+ else if (!strcmp(templatename, "connect-failed"))
+ {
+ rsp->status = strdup("503 Connect failed");
+ if (rsp->status == NULL)
+ {
+ free_map(exports);
+ free_http_response(rsp);
+ return cgi_error_memory();
+ }
+ }
+
+ err = template_fill_for_cgi(csp, templatename, exports, rsp);
+ if (err)
+ {
+ free_http_response(rsp);
+ return cgi_error_memory();
+ }
+
+ return finish_http_response(rsp);