diff --git a/mongoose.c b/mongoose.c index 478bb813..0ec25588 100644 --- a/mongoose.c +++ b/mongoose.c @@ -1707,58 +1707,76 @@ static const struct { const char *extension; size_t ext_len; const char *mime_type; - size_t mime_type_len; } builtin_mime_types[] = { - {".html", 5, "text/html", 9}, - {".htm", 4, "text/html", 9}, - {".shtm", 5, "text/html", 9}, - {".shtml", 6, "text/html", 9}, - {".css", 4, "text/css", 8}, - {".js", 3, "application/x-javascript", 24}, - {".ico", 4, "image/x-icon", 12}, - {".gif", 4, "image/gif", 9}, - {".jpg", 4, "image/jpeg", 10}, - {".jpeg", 5, "image/jpeg", 10}, - {".png", 4, "image/png", 9}, - {".svg", 4, "image/svg+xml", 13}, - {".torrent", 8, "application/x-bittorrent", 24}, - {".wav", 4, "audio/x-wav", 11}, - {".mp3", 4, "audio/x-mp3", 11}, - {".mid", 4, "audio/mid", 9}, - {".m3u", 4, "audio/x-mpegurl", 15}, - {".ram", 4, "audio/x-pn-realaudio", 20}, - {".xml", 4, "text/xml", 8}, - {".xslt", 5, "application/xml", 15}, - {".ra", 3, "audio/x-pn-realaudio", 20}, - {".doc", 4, "application/msword", 19}, - {".exe", 4, "application/octet-stream", 24}, - {".zip", 4, "application/x-zip-compressed", 28}, - {".xls", 4, "application/excel", 17}, - {".tgz", 4, "application/x-tar-gz", 20}, - {".tar", 4, "application/x-tar", 17}, - {".gz", 3, "application/x-gunzip", 20}, - {".arj", 4, "application/x-arj-compressed", 28}, - {".rar", 4, "application/x-arj-compressed", 28}, - {".rtf", 4, "application/rtf", 15}, - {".pdf", 4, "application/pdf", 15}, - {".swf", 4, "application/x-shockwave-flash",29}, - {".mpg", 4, "video/mpeg", 10}, - {".mpeg", 5, "video/mpeg", 10}, - {".mp4", 4, "video/mp4", 9}, - {".m4v", 4, "video/x-m4v", 11}, - {".asf", 4, "video/x-ms-asf", 14}, - {".avi", 4, "video/x-msvideo", 15}, - {".bmp", 4, "image/bmp", 9}, - {NULL, 0, NULL, 0} + {".html", 5, "text/html"}, + {".htm", 4, "text/html"}, + {".shtm", 5, "text/html"}, + {".shtml", 6, "text/html"}, + {".css", 4, "text/css"}, + {".js", 3, "application/x-javascript"}, + {".ico", 4, "image/x-icon"}, + {".gif", 4, "image/gif"}, + {".jpg", 4, "image/jpeg"}, + {".jpeg", 5, "image/jpeg"}, + {".png", 4, "image/png"}, + {".svg", 4, "image/svg+xml"}, + {".txt", 4, "text/plain"}, + {".torrent", 8, "application/x-bittorrent"}, + {".wav", 4, "audio/x-wav"}, + {".mp3", 4, "audio/x-mp3"}, + {".mid", 4, "audio/mid"}, + {".m3u", 4, "audio/x-mpegurl"}, + {".ram", 4, "audio/x-pn-realaudio"}, + {".xml", 4, "text/xml"}, + {".xslt", 5, "application/xml"}, + {".ra", 3, "audio/x-pn-realaudio"}, + {".doc", 4, "application/msword"}, + {".exe", 4, "application/octet-stream"}, + {".zip", 4, "application/x-zip-compressed"}, + {".xls", 4, "application/excel"}, + {".tgz", 4, "application/x-tar-gz"}, + {".tar", 4, "application/x-tar"}, + {".gz", 3, "application/x-gunzip"}, + {".arj", 4, "application/x-arj-compressed"}, + {".rar", 4, "application/x-arj-compressed"}, + {".rtf", 4, "application/rtf"}, + {".pdf", 4, "application/pdf"}, + {".swf", 4, "application/x-shockwave-flash"}, + {".mpg", 4, "video/mpeg"}, + {".webm", 5, "video/webm"}, + {".mpeg", 5, "video/mpeg"}, + {".mp4", 4, "video/mp4"}, + {".m4v", 4, "video/x-m4v"}, + {".asf", 4, "video/x-ms-asf"}, + {".avi", 4, "video/x-msvideo"}, + {".bmp", 4, "image/bmp"}, + {NULL, 0, NULL} }; +const char *mg_get_builtin_mime_type(const char *path) { + const char *ext; + size_t i, path_len; + + path_len = strlen(path); + + for (i = 0; builtin_mime_types[i].extension != NULL; i++) { + ext = path + (path_len - builtin_mime_types[i].ext_len); + if (path_len > builtin_mime_types[i].ext_len && + mg_strcasecmp(ext, builtin_mime_types[i].extension) == 0) { + return builtin_mime_types[i].mime_type; + } + } + + return "text/plain"; +} + // Look at the "path" extension and figure what mime type it has. // Store mime type in the vector. static void get_mime_type(struct mg_context *ctx, const char *path, struct vec *vec) { struct vec ext_vec, mime_vec; const char *list, *ext; - size_t i, path_len; + size_t path_len; path_len = strlen(path); @@ -1774,20 +1792,8 @@ static void get_mime_type(struct mg_context *ctx, const char *path, } } - // Now scan built-in mime types - for (i = 0; builtin_mime_types[i].extension != NULL; i++) { - ext = path + (path_len - builtin_mime_types[i].ext_len); - if (path_len > builtin_mime_types[i].ext_len && - mg_strcasecmp(ext, builtin_mime_types[i].extension) == 0) { - vec->ptr = builtin_mime_types[i].mime_type; - vec->len = builtin_mime_types[i].mime_type_len; - return; - } - } - - // Nothing found. Fall back to "text/plain" - vec->ptr = "text/plain"; - vec->len = 10; + vec->ptr = mg_get_builtin_mime_type(path); + vec->len = strlen(vec->ptr); } #ifndef HAVE_MD5 diff --git a/mongoose.h b/mongoose.h index 7aa42e60..3c3a33c4 100644 --- a/mongoose.h +++ b/mongoose.h @@ -250,6 +250,11 @@ typedef void * (*mg_thread_func_t)(void *); int mg_start_thread(mg_thread_func_t f, void *p); +// Return builtin mime type for the given file name. +// For unrecognized extensions, "text/plain" is returned. +const char *mg_get_builtin_mime_type(const char *file_name); + + // Platform independent string utility functions. void mg_strlcpy(char *dst, const char *src, size_t n); int mg_strncasecmp(const char *s1, const char *s2, size_t len);