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