+static void fake_header(struct io *io, int fd) {
+ struct stat st;
+ int code = 200, rv;
+ char *message, codestr[5], length[32];
+ struct tls_buffer *hdr = &io->response;
+
+ if (fd == -1) {
+ switch (errno) {
+ case EACCES: code = 403; break;
+ case ENOENT: code = 404; break;
+ default: code = 500; break;
+ }
+ } else {
+ rv = fstat(fd, &st);
+ if (rv == -1) {
+ code = 500;
+ }
+ }
+
+ if (io->last_modified >= st.st_mtime) {
+ code = 304;
+ }
+
+ switch (code) {
+ case 200: message = "OK"; break;
+ case 304: message = "Not Modified"; break;
+ case 403: message = "Forbidden"; break;
+ case 404: message = "Not Found"; break;
+ case 500: message = "Internal Server Error"; break;
+ default: break;
+ }
+ sprintf(codestr, "%0.3d ", code);
+ tls_buffer_append(hdr, "HTTP/1.1 ", 9);
+ tls_buffer_append(hdr, codestr, 4);
+ tls_buffer_append_str(hdr, message);
+ tls_buffer_append(hdr, "\r\n", 2);
+
+ append_timeheader(hdr, "Date", time(NULL));
+ append_header(hdr, "Server", "zpm-fetchurl/0.9");
+ if (code < 400) {
+ append_timeheader(hdr, "Last-Modified", st.st_mtime);
+ sprintf(length, "%zu", st.st_size);
+ append_header(hdr, "Content-Length", length);
+ }
+
+ append_header(hdr, "Connection", "close");
+ append_header(hdr, "Content-Type", "application/octet-stream");
+ tls_buffer_append(hdr, "\r\n", 2);
+}
+