|
@@ -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
|