LCOV - code coverage report
Current view: top level - http_proto/service/impl - mime_types_service.ipp (source / functions) Hit Total Coverage
Test: coverage_filtered.info Lines: 0 30 0.0 %
Date: 2023-01-09 16:11:12 Functions: 0 5 0.0 %

          Line data    Source code
       1             : //
       2             : // Copyright (c) 2021 Vinnie Falco (vinnie dot falco at gmail dot com)
       3             : //
       4             : // Distributed under the Boost Software License, Version 1.0. (See accompanying
       5             : // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
       6             : //
       7             : // Official repository: https://github.com/CPPAlliance/http_proto
       8             : //
       9             : 
      10             : #ifndef BOOST_HTTP_PROTO_SERVICE_IMPL_MIME_TYPES_SERVICE_IPP
      11             : #define BOOST_HTTP_PROTO_SERVICE_IMPL_MIME_TYPES_SERVICE_IPP
      12             : 
      13             : #include <boost/http_proto/service/mime_types_service.hpp>
      14             : #include <boost/http_proto/context.hpp>
      15             : #include <boost/url/grammar/ci_string.hpp>
      16             : #include <string>
      17             : #include <unordered_map>
      18             : 
      19             : namespace boost {
      20             : namespace http_proto {
      21             : 
      22             : namespace detail {
      23             : 
      24             : class mime_types_service_impl
      25             :     : public mime_types_service
      26             :     , public service
      27             : {
      28             :     struct element
      29             :     {
      30             :         std::string value;
      31             :         std::size_t prefix;
      32             :     };
      33             : 
      34             :     std::unordered_map<
      35             :         std::string,
      36             :         element,
      37             :         grammar::ci_hash,
      38             :         grammar::ci_equal> t_;
      39             : 
      40             : public:
      41             :     using key_type = mime_types_service;
      42             : 
      43             :     BOOST_STATIC_ASSERT(
      44             :         std::is_same<
      45             :             get_key_type<mime_types_service_impl>,
      46             :             mime_types_service>::value);
      47             : 
      48             :     struct param
      49             :     {
      50             :         string_view ext;
      51             :         string_view type;
      52             :         string_view subtype;
      53             :     };
      54             : 
      55             :     explicit
      56           0 :     mime_types_service_impl(
      57             :         context&) noexcept
      58           0 :     {
      59           0 :         init({
      60             :             { "htm",  "text", "html" },
      61             :             { "html", "text", "html" },
      62             :             { "php",  "text", "html" },
      63             :             { "css",  "text", "css" },
      64             :             { "txt",  "text", "plain" },
      65             :             { "js",   "application", "javascript" },
      66             :             { "json", "application", "json" },
      67             :             { "xml",  "application", "xml" },
      68             :             { "swf",  "application", "x-shockwave-flash" },
      69             :             { "flv",  "video", "x-flv" },
      70             :             { "png",  "image", "png" },
      71             :             { "jpe",  "image", "jpeg" },
      72             :             { "jpeg", "image", "jpeg" },
      73             :             { "jpg",  "image", "jpeg" },
      74             :             { "gif",  "image", "gif" },
      75             :             { "bmp",  "image", "bmp" },
      76             :             { "ico",  "image", "vnd.microsoft.icon" },
      77             :             { "tiff", "image", "tiff" },
      78             :             { "tif",  "image", "tiff" },
      79             :             { "svg",  "image", "svg+xml" },
      80             :             { "svgz", "image", "svg+xml" },
      81             :             //return "application/text" } // default
      82             :             });
      83           0 :     }
      84             : 
      85             :     void
      86           0 :     init(std::initializer_list<
      87             :         param> init)
      88             :     {
      89           0 :         for(auto v : init)
      90           0 :             insert(
      91             :                 v.ext,
      92             :                 v.type,
      93             :                 v.subtype);
      94           0 :     }
      95             : 
      96             :     void
      97           0 :     insert(
      98             :         string_view ext,
      99             :         string_view type,
     100             :         string_view subtype)
     101             :     {
     102           0 :         std::string s;
     103           0 :         s.reserve(
     104           0 :             type.size() + 1 +
     105           0 :             subtype.size());
     106             :         s.append(
     107             :             type.data(),
     108           0 :             type.size());
     109           0 :         s.push_back('/');
     110             :         s.append(
     111             :             subtype.data(),
     112           0 :             subtype.size());
     113             :         t_.insert({
     114           0 :             std::string(ext),
     115           0 :             element {
     116           0 :                 std::move(s),
     117           0 :                 type.size() }});
     118           0 :     }
     119             : 
     120             :     mime_type
     121           0 :     find(
     122             :         string_view ext) const noexcept override
     123             :     {
     124           0 :         auto it = t_.find(ext);
     125           0 :         if(it == t_.end())
     126           0 :             return {};
     127           0 :         string_view v = it->second.value;
     128             :         return {
     129             :             v,
     130           0 :             v.substr(0, it->second.prefix),
     131           0 :             v.substr(it->second.prefix + 1) };
     132             :     }
     133             : };
     134             : 
     135             : } // detail
     136             : 
     137             : mime_types_service&
     138           0 : install_mime_types_service(
     139             :     context& ctx)
     140             : {
     141             :     return ctx.make_service<
     142           0 :         detail::mime_types_service_impl>();
     143             : }
     144             : 
     145             : } // http_proto
     146             : } // boost
     147             : 
     148             : #endif

Generated by: LCOV version 1.15