LCOV - code coverage report
Current view: top level - http/server - mime_types.cpp (source / functions) Coverage Total Hit
Test: coverage_filtered.info Lines: 100.0 % 11 11
Test Date: 2026-02-20 15:38:22 Functions: 100.0 % 1 1

            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              : }
        

Generated by: LCOV version 2.0-1