Line data Source code
1 : #include "mime_types.hpp"
2 :
3 : #include <unordered_map>
4 : #include <iostream>
5 : #include <algorithm>
6 :
7 : namespace thinger::http::mime_types{
8 :
9 38 : const std::string& extension_to_type(const std::string& extension)
10 : {
11 : static const std::unordered_map<std::string, std::string> extension_map = {
12 : {"*3gpp", "audio/3gpp"},
13 : {"*jpm", "video/jpm"},
14 : {"*mp3", "audio/mp3"},
15 : {"*rtf", "text/rtf"},
16 : {"*wav", "audio/wave"},
17 : {"*xml", "text/xml"},
18 : {"3g2", "video/3gpp2"},
19 : {"3gp", "video/3gpp"},
20 : {"3gpp", "video/3gpp"},
21 : {"ac", "application/pkix-attr-cert"},
22 : {"adp", "audio/adpcm"},
23 : {"ai", "application/postscript"},
24 : {"apng", "image/apng"},
25 : {"appcache", "text/cache-manifest"},
26 : {"asc", "application/pgp-signature"},
27 : {"atom", "application/atom+xml"},
28 : {"atomcat", "application/atomcat+xml"},
29 : {"atomsvc", "application/atomsvc+xml"},
30 : {"au", "audio/basic"},
31 : {"aw", "application/applixware"},
32 : {"bdoc", "application/bdoc"},
33 : {"bin", "application/octet-stream"},
34 : {"bmp", "image/bmp"},
35 : {"bpk", "application/octet-stream"},
36 : {"buffer", "application/octet-stream"},
37 : {"ccxml", "application/ccxml+xml"},
38 : {"cdmia", "application/cdmi-capability"},
39 : {"cdmic", "application/cdmi-container"},
40 : {"cdmid", "application/cdmi-domain"},
41 : {"cdmio", "application/cdmi-object"},
42 : {"cdmiq", "application/cdmi-queue"},
43 : {"cer", "application/pkix-cert"},
44 : {"cgm", "image/cgm"},
45 : {"class", "application/java-vm"},
46 : {"coffee", "text/coffeescript"},
47 : {"conf", "text/plain"},
48 : {"cpt", "application/mac-compactpro"},
49 : {"crl", "application/pkix-crl"},
50 : {"css", "text/css"},
51 : {"csv", "text/csv"},
52 : {"cu", "application/cu-seeme"},
53 : {"davmount", "application/davmount+xml"},
54 : {"dbk", "application/docbook+xml"},
55 : {"deb", "application/octet-stream"},
56 : {"def", "text/plain"},
57 : {"deploy", "application/octet-stream"},
58 : {"disposition-notification", "message/disposition-notification"},
59 : {"dist", "application/octet-stream"},
60 : {"distz", "application/octet-stream"},
61 : {"dll", "application/octet-stream"},
62 : {"dmg", "application/octet-stream"},
63 : {"dms", "application/octet-stream"},
64 : {"doc", "application/msword"},
65 : {"dot", "application/msword"},
66 : {"drle", "image/dicom-rle"},
67 : {"dssc", "application/dssc+der"},
68 : {"dtd", "application/xml-dtd"},
69 : {"dump", "application/octet-stream"},
70 : {"ear", "application/java-archive"},
71 : {"ecma", "application/ecmascript"},
72 : {"elc", "application/octet-stream"},
73 : {"emf", "image/emf"},
74 : {"eml", "message/rfc822"},
75 : {"emma", "application/emma+xml"},
76 : {"eps", "application/postscript"},
77 : {"epub", "application/epub+zip"},
78 : {"es", "application/ecmascript"},
79 : {"exe", "application/octet-stream"},
80 : {"exi", "application/exi"},
81 : {"exr", "image/aces"},
82 : {"ez", "application/andrew-inset"},
83 : {"fits", "image/fits"},
84 : {"g3", "image/g3fax"},
85 : {"gbr", "application/rpki-ghostbusters"},
86 : {"geojson", "application/geo+json"},
87 : {"gif", "image/gif"},
88 : {"glb", "model/gltf-binary"},
89 : {"gltf", "model/gltf+json"},
90 : {"gml", "application/gml+xml"},
91 : {"gpx", "application/gpx+xml"},
92 : {"gram", "application/srgs"},
93 : {"grxml", "application/srgs+xml"},
94 : {"gxf", "application/gxf"},
95 : {"gz", "application/gzip"},
96 : {"h261", "video/h261"},
97 : {"h263", "video/h263"},
98 : {"h264", "video/h264"},
99 : {"heic", "image/heic"},
100 : {"heics", "image/heic-sequence"},
101 : {"heif", "image/heif"},
102 : {"heifs", "image/heif-sequence"},
103 : {"hjson", "application/hjson"},
104 : {"hlp", "application/winhlp"},
105 : {"hqx", "application/mac-binhex40"},
106 : {"htm", "text/html"},
107 : {"html", "text/html"},
108 : {"ics", "text/calendar"},
109 : {"ief", "image/ief"},
110 : {"ifb", "text/calendar"},
111 : {"iges", "model/iges"},
112 : {"igs", "model/iges"},
113 : {"img", "application/octet-stream"},
114 : {"in", "text/plain"},
115 : {"ini", "text/plain"},
116 : {"ink", "application/inkml+xml"},
117 : {"inkml", "application/inkml+xml"},
118 : {"ipfix", "application/ipfix"},
119 : {"iso", "application/octet-stream"},
120 : {"jade", "text/jade"},
121 : {"jar", "application/java-archive"},
122 : {"jls", "image/jls"},
123 : {"jp2", "image/jp2"},
124 : {"jpe", "image/jpeg"},
125 : {"jpeg", "image/jpeg"},
126 : {"jpf", "image/jpx"},
127 : {"jpg", "image/jpeg"},
128 : {"jpg2", "image/jp2"},
129 : {"jpgm", "video/jpm"},
130 : {"jpgv", "video/jpeg"},
131 : {"jpm", "image/jpm"},
132 : {"jpx", "image/jpx"},
133 : {"js", "application/javascript"},
134 : {"json", "application/json"},
135 : {"json5", "application/json5"},
136 : {"jsonld", "application/ld+json"},
137 : {"jsonml", "application/jsonml+json"},
138 : {"jsx", "text/jsx"},
139 : {"kar", "audio/midi"},
140 : {"ktx", "image/ktx"},
141 : {"less", "text/less"},
142 : {"list", "text/plain"},
143 : {"litcoffee", "text/coffeescript"},
144 : {"log", "text/plain"},
145 : {"lostxml", "application/lost+xml"},
146 : {"lrf", "application/octet-stream"},
147 : {"m1v", "video/mpeg"},
148 : {"m21", "application/mp21"},
149 : {"m2a", "audio/mpeg"},
150 : {"m2v", "video/mpeg"},
151 : {"m3a", "audio/mpeg"},
152 : {"m4a", "audio/mp4"},
153 : {"m4p", "application/mp4"},
154 : {"ma", "application/mathematica"},
155 : {"mads", "application/mads+xml"},
156 : {"man", "text/troff"},
157 : {"manifest", "text/cache-manifest"},
158 : {"map", "application/json"},
159 : {"mar", "application/octet-stream"},
160 : {"markdown", "text/markdown"},
161 : {"mathml", "application/mathml+xml"},
162 : {"mb", "application/mathematica"},
163 : {"mbox", "application/mbox"},
164 : {"md", "text/markdown"},
165 : {"me", "text/troff"},
166 : {"mesh", "model/mesh"},
167 : {"meta4", "application/metalink4+xml"},
168 : {"metalink", "application/metalink+xml"},
169 : {"mets", "application/mets+xml"},
170 : {"mft", "application/rpki-manifest"},
171 : {"mid", "audio/midi"},
172 : {"midi", "audio/midi"},
173 : {"mime", "message/rfc822"},
174 : {"mj2", "video/mj2"},
175 : {"mjp2", "video/mj2"},
176 : {"mjs", "application/javascript"},
177 : {"mml", "text/mathml"},
178 : {"mods", "application/mods+xml"},
179 : {"mov", "video/quicktime"},
180 : {"mp2", "audio/mpeg"},
181 : {"mp21", "application/mp21"},
182 : {"mp2a", "audio/mpeg"},
183 : {"mp3", "audio/mpeg"},
184 : {"mp4", "video/mp4"},
185 : {"mp4a", "audio/mp4"},
186 : {"mp4s", "application/mp4"},
187 : {"mp4v", "video/mp4"},
188 : {"mpd", "application/dash+xml"},
189 : {"mpe", "video/mpeg"},
190 : {"mpeg", "video/mpeg"},
191 : {"mpg", "video/mpeg"},
192 : {"mpg4", "video/mp4"},
193 : {"mpga", "audio/mpeg"},
194 : {"mrc", "application/marc"},
195 : {"mrcx", "application/marcxml+xml"},
196 : {"ms", "text/troff"},
197 : {"mscml", "application/mediaservercontrol+xml"},
198 : {"msh", "model/mesh"},
199 : {"msi", "application/octet-stream"},
200 : {"msm", "application/octet-stream"},
201 : {"msp", "application/octet-stream"},
202 : {"mxf", "application/mxf"},
203 : {"mxml", "application/xv+xml"},
204 : {"n3", "text/n3"},
205 : {"nb", "application/mathematica"},
206 : {"oda", "application/oda"},
207 : {"oga", "audio/ogg"},
208 : {"ogg", "audio/ogg"},
209 : {"ogv", "video/ogg"},
210 : {"ogx", "application/ogg"},
211 : {"omdoc", "application/omdoc+xml"},
212 : {"onepkg", "application/onenote"},
213 : {"onetmp", "application/onenote"},
214 : {"onetoc", "application/onenote"},
215 : {"onetoc2", "application/onenote"},
216 : {"opf", "application/oebps-package+xml"},
217 : {"otf", "font/otf"},
218 : {"owl", "application/rdf+xml"},
219 : {"oxps", "application/oxps"},
220 : {"p10", "application/pkcs10"},
221 : {"p7c", "application/pkcs7-mime"},
222 : {"p7m", "application/pkcs7-mime"},
223 : {"p7s", "application/pkcs7-signature"},
224 : {"p8", "application/pkcs8"},
225 : {"pdf", "application/pdf"},
226 : {"pfr", "application/font-tdpfr"},
227 : {"pgp", "application/pgp-encrypted"},
228 : {"pkg", "application/octet-stream"},
229 : {"pki", "application/pkixcmp"},
230 : {"pkipath", "application/pkix-pkipath"},
231 : {"pls", "application/pls+xml"},
232 : {"png", "image/png"},
233 : {"prf", "application/pics-rules"},
234 : {"ps", "application/postscript"},
235 : {"pskcxml", "application/pskc+xml"},
236 : {"qt", "video/quicktime"},
237 : {"raml", "application/raml+yaml"},
238 : {"rdf", "application/rdf+xml"},
239 : {"rif", "application/reginfo+xml"},
240 : {"rl", "application/resource-lists+xml"},
241 : {"rld", "application/resource-lists-diff+xml"},
242 : {"rmi", "audio/midi"},
243 : {"rnc", "application/relax-ng-compact-syntax"},
244 : {"rng", "application/xml"},
245 : {"roa", "application/rpki-roa"},
246 : {"roff", "text/troff"},
247 : {"rq", "application/sparql-query"},
248 : {"rs", "application/rls-services+xml"},
249 : {"rsd", "application/rsd+xml"},
250 : {"rss", "application/rss+xml"},
251 : {"rtf", "application/rtf"},
252 : {"rtx", "text/richtext"},
253 : {"s3m", "audio/s3m"},
254 : {"sbml", "application/sbml+xml"},
255 : {"scq", "application/scvp-cv-request"},
256 : {"scs", "application/scvp-cv-response"},
257 : {"sdp", "application/sdp"},
258 : {"ser", "application/java-serialized-object"},
259 : {"setpay", "application/set-payment-initiation"},
260 : {"setreg", "application/set-registration-initiation"},
261 : {"sgi", "image/sgi"},
262 : {"sgm", "text/sgml"},
263 : {"sgml", "text/sgml"},
264 : {"shex", "text/shex"},
265 : {"shf", "application/shf+xml"},
266 : {"shtml", "text/html"},
267 : {"sig", "application/pgp-signature"},
268 : {"sil", "audio/silk"},
269 : {"silo", "model/mesh"},
270 : {"slim", "text/slim"},
271 : {"slm", "text/slim"},
272 : {"smi", "application/smil+xml"},
273 : {"smil", "application/smil+xml"},
274 : {"snd", "audio/basic"},
275 : {"so", "application/octet-stream"},
276 : {"spp", "application/scvp-vp-response"},
277 : {"spq", "application/scvp-vp-request"},
278 : {"spx", "audio/ogg"},
279 : {"sru", "application/sru+xml"},
280 : {"srx", "application/sparql-results+xml"},
281 : {"ssdl", "application/ssdl+xml"},
282 : {"ssml", "application/ssml+xml"},
283 : {"stk", "application/hyperstudio"},
284 : {"styl", "text/stylus"},
285 : {"stylus", "text/stylus"},
286 : {"svg", "image/svg+xml"},
287 : {"svgz", "image/svg+xml"},
288 : {"t", "text/troff"},
289 : {"t38", "image/t38"},
290 : {"tei", "application/tei+xml"},
291 : {"teicorpus", "application/tei+xml"},
292 : {"text", "text/plain"},
293 : {"tfi", "application/thraud+xml"},
294 : {"tfx", "image/tiff-fx"},
295 : {"tif", "image/tiff"},
296 : {"tiff", "image/tiff"},
297 : {"tr", "text/troff"},
298 : {"ts", "video/mp2t"},
299 : {"tsd", "application/timestamped-data"},
300 : {"tsv", "text/tab-separated-values"},
301 : {"ttc", "font/collection"},
302 : {"ttf", "font/ttf"},
303 : {"ttl", "text/turtle"},
304 : {"txt", "text/plain"},
305 : {"u8dsn", "message/global-delivery-status"},
306 : {"u8hdr", "message/global-headers"},
307 : {"u8mdn", "message/global-disposition-notification"},
308 : {"u8msg", "message/global"},
309 : {"uri", "text/uri-list"},
310 : {"uris", "text/uri-list"},
311 : {"urls", "text/uri-list"},
312 : {"vcard", "text/vcard"},
313 : {"vrml", "model/vrml"},
314 : {"vtt", "text/vtt"},
315 : {"vxml", "application/voicexml+xml"},
316 : {"war", "application/java-archive"},
317 : {"wasm", "application/wasm"},
318 : {"wav", "audio/wav"},
319 : {"weba", "audio/webm"},
320 : {"webm", "video/webm"},
321 : {"webmanifest", "application/manifest+json"},
322 : {"webp", "image/webp"},
323 : {"wgt", "application/widget"},
324 : {"wmf", "image/wmf"},
325 : {"woff", "font/woff"},
326 : {"woff2", "font/woff2"},
327 : {"wrl", "model/vrml"},
328 : {"wsdl", "application/wsdl+xml"},
329 : {"wspolicy", "application/wspolicy+xml"},
330 : {"x3d", "model/x3d+xml"},
331 : {"x3db", "model/x3d+binary"},
332 : {"x3dbz", "model/x3d+binary"},
333 : {"x3dv", "model/x3d+vrml"},
334 : {"x3dvz", "model/x3d+vrml"},
335 : {"x3dz", "model/x3d+xml"},
336 : {"xaml", "application/xaml+xml"},
337 : {"xdf", "application/xcap-diff+xml"},
338 : {"xdssc", "application/dssc+xml"},
339 : {"xenc", "application/xenc+xml"},
340 : {"xer", "application/patch-ops-error+xml"},
341 : {"xht", "application/xhtml+xml"},
342 : {"xhtml", "application/xhtml+xml"},
343 : {"xhvml", "application/xv+xml"},
344 : {"xm", "audio/xm"},
345 : {"xml", "application/xml"},
346 : {"xop", "application/xop+xml"},
347 : {"xpl", "application/xproc+xml"},
348 : {"xsd", "application/xml"},
349 : {"xsl", "application/xml"},
350 : {"xslt", "application/xslt+xml"},
351 : {"xspf", "application/xspf+xml"},
352 : {"xvm", "application/xv+xml"},
353 : {"xvml", "application/xv+xml"},
354 : {"yaml", "text/yaml"},
355 : {"yang", "application/yang"},
356 : {"yin", "application/yin+xml"},
357 : {"yml", "text/yaml"},
358 : {"zip", "application/zip"}
359 2132 : };
360 :
361 : // strip leading dot and convert to lowercase
362 38 : std::string ext(extension);
363 38 : if (!ext.empty() && ext[0] == '.') {
364 36 : ext.erase(0, 1);
365 : }
366 38 : std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower);
367 :
368 : // find and search
369 38 : auto it = extension_map.find(ext);
370 38 : if(it != extension_map.end()){
371 34 : return it->second;
372 : }
373 4 : return text_plain;
374 44 : }
375 :
376 : }
|