diff --git a/include/webassets.hpp b/include/webassets.hpp
index 988af76..7845d71 100644
--- a/include/webassets.hpp
+++ b/include/webassets.hpp
@@ -14,35 +14,38 @@
 namespace webassets {
 
 namespace filesystem = std::experimental::filesystem;
-static const char* gzip_string = "gzip";
-static const char* none_string = "none";
-static const char* if_none_match_string = "If-None-Match";
-static const char* content_encoding_string = "Content-Encoding";
-static const char* content_type_string = "Content-Type";
-static const char* etag_string = "ETag";
+
+struct cmp_str {
+  bool operator()(const char* a, const char* b) const {
+    return std::strcmp(a, b) < 0;
+  }
+};
 
 static boost::container::flat_set<std::string> routes;
 
 template <typename... Middlewares>
 void request_routes(Crow<Middlewares...>& app) {
-  const static boost::container::flat_map<const char*, const char*> content_types{
-      {{".css", "text/css;charset=UTF-8"},
-       {".html", "text/html;charset=UTF-8"},
-       {".js", "text/html;charset=UTF-8"},
-       {".png", "image/png;charset=UTF-8"},
-       {".woff", "application/x-font-woff"},
-       {".woff2", "application/x-font-woff2"},
-       {".ttf", "application/x-font-ttf"},
-       {".svg", "image/svg+xml"},
-       {".eot", "application/vnd.ms-fontobject"},
-       // dev tools don't care about map type, setting to json causes
-       // browser to show as text
-       // https://stackoverflow.com/questions/19911929/what-mime-type-should-i-use-for-javascript-source-map-files
-       {".map", "application/json"}}};
+  const static boost::container::flat_map<const char*, const char*, cmp_str>
+      content_types{
+          {{".css", "text/css;charset=UTF-8"},
+           {".html", "text/html;charset=UTF-8"},
+           {".js", "text/html;charset=UTF-8"},
+           {".png", "image/png;charset=UTF-8"},
+           {".woff", "application/x-font-woff"},
+           {".woff2", "application/x-font-woff2"},
+           {".ttf", "application/x-font-ttf"},
+           {".svg", "image/svg+xml"},
+           {".eot", "application/vnd.ms-fontobject"},
+           {".xml", "application/xml"},
+           // dev tools don't care about map type, setting to json causes
+           // browser to show as text
+           // https://stackoverflow.com/questions/19911929/what-mime-type-should-i-use-for-javascript-source-map-files
+           {".map", "application/json"}}};
   auto rootpath = filesystem::path("/usr/share/www/");
   auto dir_iter = filesystem::recursive_directory_iterator(rootpath);
   for (auto& dir : dir_iter) {
     auto absolute_path = dir.path();
+    auto absolute_path_str = dir.path().string();
     auto relative_path = filesystem::path(
         absolute_path.string().substr(rootpath.string().size() - 1));
     // make sure we don't recurse into certain directories
@@ -63,39 +66,42 @@
 
       if (webpath.filename() == "index.html") {
         webpath = webpath.parent_path();
+        if (webpath.string() != "/") {
+          webpath += "/";
+        }
       }
 
       routes.insert(webpath.string());
 
       std::string absolute_path_str = absolute_path.string();
       const char* content_type = nullptr;
-      auto content_type_it =
-          content_types.find(relative_path.extension().c_str());
+      auto content_type_it = content_types.find(webpath.extension().c_str());
       if (content_type_it != content_types.end()) {
         content_type = content_type_it->second;
       }
       app.route_dynamic(std::string(webpath.string()))(
           [is_gzip, absolute_path_str, content_type](const crow::request& req,
                                                      crow::response& res) {
-            if (is_gzip) {
-              res.add_header(content_encoding_string, gzip_string);
-            } else {
-              res.add_header(content_encoding_string, none_string);
-            }
+            static const char* content_type_string = "Content-Type";
             // std::string sha1("a576dc96a5c605b28afb032f3103630d61ac1068");
-            // res.add_header(etag_string, sha1);
+            // res.add_header("ETag", sha1);
 
-            // if (req.get_header_value(if_none_match_string) == sha1) {
+            // if (req.get_header_value("If-None-Match") == sha1) {
             //  res.code = 304;
             //} else {
             //  res.code = 200;
             // TODO, if you have a browser from the dark ages that doesn't
             // support
             // gzip, unzip it before sending based on Accept-Encoding header
-            //  res.add_header(content_encoding_string, gzip_string);
+            //  res.add_header("Content-Encoding", gzip_string);
             if (content_type != nullptr) {
               res.add_header(content_type_string, content_type);
             }
+
+            if (is_gzip) {
+              res.add_header("Content-Encoding", "gzip");
+            }
+
             // res.set_header("Cache-Control", "public, max-age=86400");
             std::ifstream inf(absolute_path_str);
             if (!inf) {
