int http_server_sendfile2(const char *filename, const char *additional_headers, const char *ext) { if (0 == *filename) filename = "."; struct http_server_context *ctx = http_server_get_context(); int ffd = open(filename, O_RDONLY); if (ffd < 0) return HTTP_SERVER_NOT_FOUND; struct stat st; if (0 > fstat(ffd, &st)) { LOGGER_PERROR(filename); close(ffd); return HTTP_SERVER_NOT_FOUND; } if (S_ISDIR(st.st_mode)) { close(ffd); return 1; } vmbuf_reset(&ctx->header); if (NULL != ext) http_server_header_start(HTTP_STATUS_200, mime_types_by_ext(ext)); else http_server_header_start(HTTP_STATUS_200, mime_types_by_filename(filename)); vmbuf_sprintf(&ctx->header, "%s%lu", CONTENT_LENGTH, st.st_size); if (additional_headers) vmbuf_strcpy(&ctx->header, additional_headers); http_server_header_close(); int res = http_server_sendfile_payload(ffd, st.st_size); close(ffd); if (0 > res) LOGGER_PERROR(filename); return res; }
const char *mime_types_by_filename(const char *filename) { const char *p = strrchr(filename, '.'); if (p) return mime_types_by_ext(p + 1); return DEFAULT_MIME_TYPE; }