Commit defce20dcae96b5f1fab685d17add69fa65b3405

Authored by Cédric RICARD
1 parent b206a5d0

Improving MIME type

calexium_lib/web/CXM_mime.anubis
... ... @@ -15,52 +15,47 @@ read tools/basis.anubis
15 15 read system/string.anubis
16 16  
17 17 public type MIME:
18   - mime(String name,
19   - String file_extension).
  18 + mime(String type,
  19 + String sybtype,
  20 + List(String) file_extensions).
  21 +
  22 +
  23 +public define Bool
  24 + MIME x = MIME y
  25 + =
  26 + if x is mime(x_type, x_subtype, _) then
  27 + if y is mime(y_type, y_subtype, _) then
  28 + insensitive_equal(x_type, y_type) & insensitive_equal(x_subtype, y_subtype).
20 29  
21 30 public define List(MIME)
22 31 known_mime_types
23 32 =
24 33 [
25   - mime("application/octet-stream", ".exe"),
26   - mime("application/x-pdf", ".pdf"),
27   - mime("application/x-pdf", ".PDF"),
28   - mime("image/bmp", ".bmp"),
29   - mime("image/gif", ".gif"),
30   - mime("image/gif", ".GIF"),
31   - mime("image/jpeg", ".jpg"),
32   - mime("image/jpeg", ".JPG"),
33   - mime("image/jpeg", ".jpeg"),
34   - mime("image/png", ".png"),
35   - mime("image/png", ".PNG"),
36   - mime("image/x-icon", ".ico"),
37   - mime("text/html", ".html"),
38   - mime("text/html", ".htm"),
39   - mime("text/css", ".css"),
40   - mime("text/javascript", ".js"),
41   - mime("text/plain", ".txt"),
42   - mime("text/plain", ".anubis"),
43   - mime("text/plain", ".c"),
44   - mime("text/plain", ".h"),
45   - mime("text/plain", ".y"),
46   - mime("text/plain", "/Makefile"),
47   - mime("text/comma-separated-values", ".csv"),
48   - mime("application/msword", ".doc"),
49   - mime("application/octet-stream", ".emz"),
50   - mime("application/octet-stream", ".xml"),
51   - mime("application/octet-stream", ".mso"),
52   - mime("application/octet-stream", ".wmf"),
53   - mime("application/octet-stream", ".gz"),
54   - mime("application/octet-stream", ".rar"),
55   - mime("application/octet-stream", ".zip"),
56   - mime("application/octet-stream", ".card"),
57   - mime("application/octet-stream", ".ankh"),
58   - mime("application/octet-stream", ".adm"),
59   - mime("application/octet-stream", ".swf"),
60   - mime("application/octet-stream", ".downloaded"),
61   - mime("audio/x-mpeg", ".mp3"),
62   - mime("video/x-msvideo", ".avi"),
  34 + mime("application", "octet-stream", [".exe"]),
  35 + mime("application", "x-pdf", [".pdf"]),
  36 + mime("image", "bmp", [".bmp"]),
  37 + mime("image", "gif", [".gif"]),
  38 + mime("image", "jpeg", [".jpg", ".jpeg"]),
  39 + mime("image", "png", [".png"]),
  40 + mime("image", "x-icon", [".ico"]),
  41 + mime("text", "html", [".html", ".htm"]),
  42 + mime("text", "css", [".css"]),
  43 + mime("text", "javascript", [".js"]),
  44 + mime("text", "plain", [".txt", ".anubis", ".c", ".h", ".y", "/Makefile"]),
  45 + mime("text", "comma-separated-values", [".csv"]),
  46 + mime("application", "msword", [".doc"]),
  47 + mime("application", "octet-stream", [".emz", ".xml", ".mso", ".wmf", ".gz", ".rar", ".zip", ".card", ".ankh", ".adm", ".swf", ".downloaded"]),
  48 + mime("audio", "x-mpeg", [".mp3"]),
  49 + mime("video", "x-msvideo", [".avi"]),
63 50 ].
  51 +
  52 +public define String
  53 + to_String
  54 + (
  55 + MIME mime_type
  56 + ) =
  57 + if mime_type is mime(type, subtype, _) then
  58 + type + "/" + subtype.
64 59  
65 60 public define String
66 61 to_MIME_text
... ...
calexium_lib/web/CXM_multihost_http_server.anubis
... ... @@ -166,6 +166,7 @@ read CXM_common.anubis
166 166 read tools/basis.anubis
167 167 read system/string.anubis
168 168 read system/files.anubis
  169 +read system/lists.anubis
169 170 read CXM_mime.anubis
170 171  
171 172  
... ... @@ -1904,9 +1905,22 @@ public define String
1904 1905 get_uri_extension_aux(uri,
1905 1906 length(uri)-1). // search starts at the right end
1906 1907  
  1908 +public define Bool
  1909 + contains_no_case
  1910 + (
  1911 + List(String) l,
  1912 + String val
  1913 + ) =
  1914 + if l is
  1915 + {
  1916 + [] then false,
  1917 + [h . t] then
  1918 + if insensitive_equal(h, val) then true
  1919 + else contains_no_case(t, val)
  1920 + }.
1907 1921  
1908 1922  
1909   -define Maybe(String)
  1923 +define Maybe(MIME)
1910 1924 recognize_mime_type_from_ext
1911 1925 (
1912 1926 String ext,
... ... @@ -1914,14 +1928,14 @@ define Maybe(String)
1914 1928 ) =
1915 1929 if l is
1916 1930 {
1917   - [ ] then success("application/octet-stream"), // failure,
1918   - [h . t] then if h is mime(mime_type,extension) then
1919   - if ext = extension
1920   - then success(mime_type)
  1931 + [ ] then success(mime("application", "octet-stream", [])), // failure,
  1932 + [h . t] then if h is mime(type, subtype, extensions) then
  1933 + if contains_no_case(extensions, ext)
  1934 + then success(h)
1921 1935 else recognize_mime_type_from_ext(ext,t)
1922 1936 }.
1923 1937  
1924   -define Maybe(String)
  1938 +define Maybe(MIME)
1925 1939 recognize_mime_type_from_uri
1926 1940 (
1927 1941 Web_Site_Description desc,
... ... @@ -2023,14 +2037,14 @@ public define String
2023 2037 define List(HTTP_header)
2024 2038 headers_for_send_file
2025 2039 (
2026   - String mime_type,
  2040 + MIME mime_type,
2027 2041 Int size,
2028 2042 String etag,
2029 2043 Maybe(FileTimes) mb_ftimes,
2030 2044 ) =
2031 2045 with headers = (List(HTTP_header))
2032 2046 [
2033   - http_header("Content-Type",mime_type),
  2047 + http_header("Content-Type", to_String(mime_type)),
2034 2048 http_header("Etag", etag),
2035 2049 http_header("Content-Length",to_decimal(size)),
2036 2050 ],
... ... @@ -2108,8 +2122,8 @@ define One
2108 2122 Int size,
2109 2123 Connection file,
2110 2124 String filename,
2111   - String full_path,
2112   - String mime_type,
  2125 + String full_path,
  2126 + MIME mime_type,
2113 2127 One -> One action_before_send_file
2114 2128 ) =
2115 2129 action_before_send_file(unique);
... ... @@ -2202,7 +2216,7 @@ define One
2202 2216 success(f) then with size = file_size(f),
2203 2217 mime_type = if recognize_mime_type_from_uri(desc,uri) is
2204 2218 {
2205   - failure then "application/octet-stream"
  2219 + failure then mime("application", "octet-stream", []),
2206 2220 success(mime_type) then mime_type
2207 2221 },
2208 2222 send_file(desc,
... ...