diff --git a/CMakeLists.txt b/CMakeLists.txt
index 72002f2..5cb1a04 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -79,10 +79,9 @@
 add_definitions(-DBOOST_ALL_NO_LIB)
 add_definitions(-DBOOST_NO_RTTI)
 add_definitions(-DBOOST_NO_TYPEID)
-# set(Boost_USE_STATIC_LIBS ON)
 
-#find_package(Boost 1.66 REQUIRED)
-include_directories(${CMAKE_BINARY_DIR}/boost-src)
+find_package(Boost 1.66 REQUIRED)
+include_directories(${BOOST_SRC_DIR})
 
 # sdbusplus
 if(NOT ${YOCTO_DEPENDENCIES})
@@ -159,7 +158,6 @@
       src/ast_jpeg_decoder_test.cpp
       src/kvm_websocket_test.cpp
       src/msan_test.cpp
-      src/ci_map_tests.cpp
       src/ast_video_puller_test.cpp
       ${CMAKE_BINARY_DIR}/generated/blns.hpp) # big list of naughty strings
   add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/generated/blns.hpp
diff --git a/crow/include/crow.h b/crow/include/crow.h
index 94e7995..28d46b6 100644
--- a/crow/include/crow.h
+++ b/crow/include/crow.h
@@ -1,22 +1,17 @@
 #pragma once
 #include "crow/query_string.h"
-#include "crow/http_parser_merged.h"
-#include "crow/ci_map.h"
-#include "crow/TinySHA1.hpp"
 #include "crow/settings.h"
 #include "crow/socket_adaptors.h"
-#include "crow/mustache.h"
 #include "crow/logging.h"
-#include "crow/dumb_timer_queue.h"
+#include "crow/timer_queue.h"
 #include "crow/utility.h"
 #include "crow/common.h"
 #include "crow/http_request.h"
 #include "crow/websocket.h"
-#include "crow/parser.h"
 #include "crow/http_response.h"
-#include "crow/middleware.h"
 #include "crow/routing.h"
 #include "crow/middleware_context.h"
 #include "crow/http_connection.h"
 #include "crow/http_server.h"
-#include "crow/app.h"
\ No newline at end of file
+#include "crow/app.h"
+#include "boost/beast/core.hpp"
diff --git a/crow/include/crow/TinySHA1.hpp b/crow/include/crow/TinySHA1.hpp
deleted file mode 100644
index 273f3a6..0000000
--- a/crow/include/crow/TinySHA1.hpp
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- *
- * TinySHA1 - a header only implementation of the SHA1 algorithm in C++. Based
- * on the implementation in boost::uuid::details.
- *
- * SHA1 Wikipedia Page: http://en.wikipedia.org/wiki/SHA-1
- *
- * Copyright (c) 2012-22 SAURAV MOHAPATRA <mohaps@gmail.com>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-#ifndef _TINY_SHA1_HPP_
-#define _TINY_SHA1_HPP_
-#include <cstdint>
-#include <cstdio>
-#include <cstdlib>
-#include <cstring>
-namespace sha1 {
-class SHA1 {
- public:
-  using digest32_t = uint32_t [5];
-  using digest8_t = uint8_t [20];
-  inline static uint32_t LeftRotate(uint32_t value, size_t count) {
-    return (value << count) ^ (value >> (32 - count));
-  }
-  SHA1() { reset(); }
-  virtual ~SHA1() = default;
-  SHA1(const SHA1& s) { *this = s; }
-  const SHA1& operator=(const SHA1& s) {
-    memcpy(m_digest, s.m_digest, 5 * sizeof(uint32_t));
-    memcpy(m_block, s.m_block, 64);
-    m_blockByteIndex = s.m_blockByteIndex;
-    m_byteCount = s.m_byteCount;
-    return *this;
-  }
-  SHA1& reset() {
-    m_digest[0] = 0x67452301;
-    m_digest[1] = 0xEFCDAB89;
-    m_digest[2] = 0x98BADCFE;
-    m_digest[3] = 0x10325476;
-    m_digest[4] = 0xC3D2E1F0;
-    m_blockByteIndex = 0;
-    m_byteCount = 0;
-    return *this;
-  }
-  SHA1& processByte(uint8_t octet) {
-    this->m_block[this->m_blockByteIndex++] = octet;
-    ++this->m_byteCount;
-    if (m_blockByteIndex == 64) {
-      this->m_blockByteIndex = 0;
-      processBlock();
-    }
-    return *this;
-  }
-  SHA1& processBlock(const void* const start, const void* const end) {
-    const auto* begin = static_cast<const uint8_t*>(start);
-    const auto* finish = static_cast<const uint8_t*>(end);
-    while (begin != finish) {
-      processByte(*begin);
-      begin++;
-    }
-    return *this;
-  }
-  SHA1& processBytes(const void* const data, size_t len) {
-    const auto* block = static_cast<const uint8_t*>(data);
-    processBlock(block, block + len);
-    return *this;
-  }
-  const uint32_t* getDigest(digest32_t digest) {
-    size_t bitCount = this->m_byteCount * 8;
-    processByte(0x80);
-    if (this->m_blockByteIndex > 56) {
-      while (m_blockByteIndex != 0) {
-        processByte(0);
-      }
-      while (m_blockByteIndex < 56) {
-        processByte(0);
-      }
-    } else {
-      while (m_blockByteIndex < 56) {
-        processByte(0);
-      }
-    }
-    processByte(0);
-    processByte(0);
-    processByte(0);
-    processByte(0);
-    processByte(static_cast<unsigned char>((bitCount >> 24) & 0xFF));
-    processByte(static_cast<unsigned char>((bitCount >> 16) & 0xFF));
-    processByte(static_cast<unsigned char>((bitCount >> 8) & 0xFF));
-    processByte(static_cast<unsigned char>((bitCount)&0xFF));
-
-    memcpy(digest, m_digest, 5 * sizeof(uint32_t));
-    return digest;
-  }
-  const uint8_t* getDigestBytes(digest8_t digest) {
-    digest32_t d32;
-    getDigest(d32);
-    size_t di = 0;
-    digest[di++] = ((d32[0] >> 24) & 0xFF);
-    digest[di++] = ((d32[0] >> 16) & 0xFF);
-    digest[di++] = ((d32[0] >> 8) & 0xFF);
-    digest[di++] = ((d32[0]) & 0xFF);
-
-    digest[di++] = ((d32[1] >> 24) & 0xFF);
-    digest[di++] = ((d32[1] >> 16) & 0xFF);
-    digest[di++] = ((d32[1] >> 8) & 0xFF);
-    digest[di++] = ((d32[1]) & 0xFF);
-
-    digest[di++] = ((d32[2] >> 24) & 0xFF);
-    digest[di++] = ((d32[2] >> 16) & 0xFF);
-    digest[di++] = ((d32[2] >> 8) & 0xFF);
-    digest[di++] = ((d32[2]) & 0xFF);
-
-    digest[di++] = ((d32[3] >> 24) & 0xFF);
-    digest[di++] = ((d32[3] >> 16) & 0xFF);
-    digest[di++] = ((d32[3] >> 8) & 0xFF);
-    digest[di++] = ((d32[3]) & 0xFF);
-
-    digest[di++] = ((d32[4] >> 24) & 0xFF);
-    digest[di++] = ((d32[4] >> 16) & 0xFF);
-    digest[di++] = ((d32[4] >> 8) & 0xFF);
-    digest[di++] = ((d32[4]) & 0xFF);
-    return digest;
-  }
-
- protected:
-  void processBlock() {
-    uint32_t w[80];
-    for (size_t i = 0; i < 16; i++) {
-      w[i] = (m_block[i * 4 + 0] << 24);
-      w[i] |= (m_block[i * 4 + 1] << 16);
-      w[i] |= (m_block[i * 4 + 2] << 8);
-      w[i] |= (m_block[i * 4 + 3]);
-    }
-    for (size_t i = 16; i < 80; i++) {
-      w[i] = LeftRotate((w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16]), 1);
-    }
-
-    uint32_t a = m_digest[0];
-    uint32_t b = m_digest[1];
-    uint32_t c = m_digest[2];
-    uint32_t d = m_digest[3];
-    uint32_t e = m_digest[4];
-
-    for (std::size_t i = 0; i < 80; ++i) {
-      uint32_t f = 0;
-      uint32_t k = 0;
-
-      if (i < 20) {
-        f = (b & c) | (~b & d);
-        k = 0x5A827999;
-      } else if (i < 40) {
-        f = b ^ c ^ d;
-        k = 0x6ED9EBA1;
-      } else if (i < 60) {
-        f = (b & c) | (b & d) | (c & d);
-        k = 0x8F1BBCDC;
-      } else {
-        f = b ^ c ^ d;
-        k = 0xCA62C1D6;
-      }
-      uint32_t temp = LeftRotate(a, 5) + f + e + k + w[i];
-      e = d;
-      d = c;
-      c = LeftRotate(b, 30);
-      b = a;
-      a = temp;
-    }
-
-    m_digest[0] += a;
-    m_digest[1] += b;
-    m_digest[2] += c;
-    m_digest[3] += d;
-    m_digest[4] += e;
-  }
-
- private:
-  digest32_t m_digest{};
-  uint8_t m_block[64]{};
-  size_t m_blockByteIndex{};
-  size_t m_byteCount{};
-};
-} // namespace sha1
-#endif
diff --git a/crow/include/crow/app.h b/crow/include/crow/app.h
index be5523e..bb5a33b 100644
--- a/crow/include/crow/app.h
+++ b/crow/include/crow/app.h
@@ -7,7 +7,6 @@
 #include <memory>
 #include <string>
 #include <thread>
-#include <type_traits>
 #include <utility>
 #include "crow/http_request.h"
 #include "crow/http_server.h"
diff --git a/crow/include/crow/ci_map.h b/crow/include/crow/ci_map.h
deleted file mode 100644
index ce5176f..0000000
--- a/crow/include/crow/ci_map.h
+++ /dev/null
@@ -1,32 +0,0 @@
-#pragma once
-
-#include <algorithm>
-#include <iostream>
-#include <string>
-#include <boost/algorithm/string/predicate.hpp>
-#include <boost/container/flat_map.hpp>
-#include <boost/functional/hash.hpp>
-
-namespace crow {
-
-struct ci_key_eq {
-  bool operator()(const std::string& left, const std::string& right) const {
-    size_t lsz = left.size();
-    size_t rsz = right.size();
-    for (size_t i = 0; i < std::min(lsz, rsz); ++i) {
-      auto lchar = tolower(left[i]);
-      auto rchar = tolower(right[i]);
-      if (lchar != rchar) {
-        return lchar < rchar;
-      }
-    }
-
-    if (rsz != lsz) {
-      return lsz < rsz;
-    }
-    return 0;
-  }
-};
-
-using ci_map = boost::container::flat_map<std::string, std::string, ci_key_eq>;
-} // namespace crow
diff --git a/crow/include/crow/common.h b/crow/include/crow/common.h
index 1a4b0fb..63fd002 100644
--- a/crow/include/crow/common.h
+++ b/crow/include/crow/common.h
@@ -5,6 +5,7 @@
 #include <string>
 #include <vector>
 #include "crow/utility.h"
+#include <boost/beast/http/verb.hpp>
 
 namespace crow {
 enum class HTTPMethod {
@@ -31,25 +32,25 @@
   Patch = 24,
 };
 
-inline std::string method_name(HTTPMethod method) {
+inline std::string method_name(boost::beast::http::verb method) {
   switch (method) {
-    case HTTPMethod::Delete:
+    case boost::beast::http::verb::delete_:
       return "DELETE";
-    case HTTPMethod::Get:
+    case boost::beast::http::verb::get:
       return "GET";
-    case HTTPMethod::Head:
+    case boost::beast::http::verb::head:
       return "HEAD";
-    case HTTPMethod::Post:
+    case boost::beast::http::verb::post:
       return "POST";
-    case HTTPMethod::Put:
+    case boost::beast::http::verb::put:
       return "PUT";
-    case HTTPMethod::Connect:
+    case boost::beast::http::verb::connect:
       return "CONNECT";
-    case HTTPMethod::Options:
+    case boost::beast::http::verb::options:
       return "OPTIONS";
-    case HTTPMethod::Trace:
+    case boost::beast::http::verb::trace:
       return "TRACE";
-    case HTTPMethod::Patch:
+    case boost::beast::http::verb::patch:
       return "PATCH";
   }
   return "invalid";
@@ -114,39 +115,24 @@
 inline std::string routing_params::get<std::string>(unsigned index) const {
   return string_params[index];
 }
+
 }  // namespace crow
 
-constexpr crow::HTTPMethod operator"" _method(const char* str, size_t /*len*/) {
-  return crow::black_magic::is_equ_p(str, "GET", 3)
-             ? crow::HTTPMethod::Get
-             : crow::black_magic::is_equ_p(str, "DELETE", 6)
-                   ? crow::HTTPMethod::Delete
-                   : crow::black_magic::is_equ_p(str, "HEAD", 4)
-                         ? crow::HTTPMethod::Head
-                         : crow::black_magic::is_equ_p(str, "POST", 4)
-                               ? crow::HTTPMethod::Post
-                               : crow::black_magic::is_equ_p(str, "PUT", 3)
-                                     ? crow::HTTPMethod::Put
-                                     : crow::black_magic::is_equ_p(str,
-                                                                   "OPTIONS", 7)
-                                           ? crow::HTTPMethod::Options
-                                           : crow::black_magic::is_equ_p(
-                                                 str, "CONNECT", 7)
-                                                 ? crow::HTTPMethod::Connect
-                                                 : crow::black_magic::is_equ_p(
-                                                       str, "TRACE", 5)
-                                                       ? crow::HTTPMethod::Trace
-                                                       : crow::black_magic::
-                                                                 is_equ_p(
-                                                                     str,
-                                                                     "PATCH", 5)
-                                                             ? crow::
-                                                                   HTTPMethod::
-                                                                       Patch
-                                                             : throw std::
-                                                                   runtime_error(
-                                                                       "invalid"
-                                                                       " http "
-                                                                       "metho"
-                                                                       "d");
-}
+constexpr boost::beast::http::verb operator"" _method(const char* str,
+                                                      size_t /*len*/) {
+  using verb = boost::beast::http::verb;
+  // clang-format off
+  return
+    crow::black_magic::is_equ_p(str, "GET", 3) ? verb::get :
+    crow::black_magic::is_equ_p(str, "DELETE", 6) ? verb::delete_ :
+    crow::black_magic::is_equ_p(str, "HEAD", 4) ? verb::head :
+    crow::black_magic::is_equ_p(str, "POST", 4) ? verb::post :
+    crow::black_magic::is_equ_p(str, "PUT", 3) ? verb::put :
+    crow::black_magic::is_equ_p(str, "OPTIONS", 7) ? verb::options :
+    crow::black_magic::is_equ_p(str, "CONNECT", 7) ? verb::connect :
+    crow::black_magic::is_equ_p(str, "TRACE", 5) ? verb::trace :
+    crow::black_magic::is_equ_p(str, "PATCH", 5) ? verb::patch :
+    crow::black_magic::is_equ_p(str, "PURGE", 5) ? verb::purge :
+    throw std::runtime_error("invalid http method");
+  // clang-format on
+}
\ No newline at end of file
diff --git a/crow/include/crow/dumb_timer_queue.h b/crow/include/crow/dumb_timer_queue.h
deleted file mode 100644
index c463e54..0000000
--- a/crow/include/crow/dumb_timer_queue.h
+++ /dev/null
@@ -1,73 +0,0 @@
-#pragma once
-
-#include <chrono>
-#include <deque>
-#include <functional>
-#include <thread>
-#include <boost/asio.hpp>
-
-#include "crow/logging.h"
-
-namespace crow {
-namespace detail {
-// fast timer queue for fixed tick value.
-class dumb_timer_queue {
- public:
-  using key = std::pair<dumb_timer_queue*, int>;
-
-  void cancel(key& k) {
-    auto self = k.first;
-    k.first = nullptr;
-    if (self == nullptr) {
-      return;
-    }
-
-    auto index = static_cast<unsigned int>(k.second - self->step_);
-    if (index < self->dq_.size()) {
-      self->dq_[index].second = nullptr;
-    }
-  }
-
-  key add(std::function<void()> f) {
-    dq_.emplace_back(std::chrono::steady_clock::now(), std::move(f));
-    int ret = step_ + dq_.size() - 1;
-
-    CROW_LOG_DEBUG << "timer add inside: " << this << ' ' << ret;
-    return {this, ret};
-  }
-
-  void process() {
-    if (io_service_ == nullptr) {
-      return;
-    }
-
-    auto now = std::chrono::steady_clock::now();
-    while (!dq_.empty()) {
-      auto& x = dq_.front();
-      if (now - x.first < std::chrono::seconds(tick)) {
-        break;
-      }
-      if (x.second) {
-        CROW_LOG_DEBUG << "timer call: " << this << ' ' << step_;
-        // we know that timer handlers are very simple currenty; call here
-        x.second();
-      }
-      dq_.pop_front();
-      step_++;
-    }
-  }
-
-  void set_io_service(boost::asio::io_service& io_service) {
-    io_service_ = &io_service;
-  }
-
- private:
-  int tick{5};
-  boost::asio::io_service* io_service_{};
-  std::deque<std::pair<decltype(std::chrono::steady_clock::now()),
-                       std::function<void()>>>
-      dq_;
-  int step_{};
-};
-}  // namespace detail
-}  // namespace crow
diff --git a/crow/include/crow/http_codes.h b/crow/include/crow/http_codes.h
deleted file mode 100644
index c1e5e5a..0000000
--- a/crow/include/crow/http_codes.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#pragma once
-
-enum class HttpRespCode {
-  OK = 200,
-  CREATED = 201,
-  ACCEPTED = 202,
-  NO_CONTENT = 204,
-  BAD_REQUEST = 400,
-  UNAUTHORIZED = 401,
-  FORBIDDEN = 403,
-  NOT_FOUND = 404,
-  METHOD_NOT_ALLOWED = 405,
-  INTERNAL_ERROR = 500
-};
diff --git a/crow/include/crow/http_connection.h b/crow/include/crow/http_connection.h
index cab9861..97b49d7 100644
--- a/crow/include/crow/http_connection.h
+++ b/crow/include/crow/http_connection.h
@@ -4,19 +4,18 @@
 #include <chrono>
 #include <regex>
 #include <vector>
-#include "crow/dumb_timer_queue.h"
-#include "crow/http_parser_merged.h"
 #include "crow/http_response.h"
 #include "crow/logging.h"
 #include "crow/middleware_context.h"
-#include "crow/parser.h"
 #include "crow/settings.h"
 #include "crow/socket_adaptors.h"
+#include "crow/timer_queue.h"
+#include <boost/algorithm/string.hpp>
 #include <boost/algorithm/string/predicate.hpp>
-#include <boost/array.hpp>
 #include <boost/asio.hpp>
-#include <boost/container/flat_map.hpp>
-#include <boost/lexical_cast.hpp>
+#include <boost/beast/core.hpp>
+#include <boost/beast/http.hpp>
+#include <boost/beast/websocket.hpp>
 
 #ifdef CROW_ENABLE_SSL
 #include <boost/asio/ssl.hpp>
@@ -25,7 +24,7 @@
 namespace crow {
 
 inline bool is_browser(const crow::request& req) {
-  const std::string& header = req.get_header_value("accept");
+  boost::string_view header = req.get_header_value("accept");
   std::vector<std::string> encodings;
   // chrome currently sends 6 accepts headers, firefox sends 4.
   encodings.reserve(6);
@@ -34,8 +33,7 @@
   for (const std::string& encoding : encodings) {
     if (encoding == "text/html") {
       return true;
-    }
-    else if (encoding == "application/json"){
+    } else if (encoding == "application/json") {
       return false;
     }
   }
@@ -43,24 +41,39 @@
 }
 
 inline void escape_html(std::string& data) {
-    std::string buffer;
-    // less than 5% of characters should be larger, so reserve a buffer of the right size
-    buffer.reserve(data.size() * 1.05);
-    for(size_t pos = 0; pos != data.size(); ++pos) {
-        switch(data[pos]) {
-            case '&':  buffer.append("&amp;");       break;
-            case '\"': buffer.append("&quot;");      break;
-            case '\'': buffer.append("&apos;");      break;
-            case '<':  buffer.append("&lt;");        break;
-            case '>':  buffer.append("&gt;");        break;
-            default:   buffer.append(&data[pos], 1); break;
-        }
+  std::string buffer;
+  // less than 5% of characters should be larger, so reserve a buffer of the
+  // right size
+  buffer.reserve(data.size() * 1.05);
+  for (size_t pos = 0; pos != data.size(); ++pos) {
+    switch (data[pos]) {
+      case '&':
+        buffer.append("&amp;");
+        break;
+      case '\"':
+        buffer.append("&quot;");
+        break;
+      case '\'':
+        buffer.append("&apos;");
+        break;
+      case '<':
+        buffer.append("&lt;");
+        break;
+      case '>':
+        buffer.append("&gt;");
+        break;
+      default:
+        buffer.append(&data[pos], 1);
+        break;
     }
-    data.swap(buffer);
+  }
+  data.swap(buffer);
 }
 
 inline void convert_to_links(std::string& s) {
-  const static std::regex r{"(&quot;@odata\\.((id)|(context))&quot;[ \\n]*:[ \\n]*)(&quot;((?!&quot;).*)&quot;)"};
+  const static std::regex r{
+      "(&quot;@odata\\.((id)|(context))&quot;[ \\n]*:[ "
+      "\\n]*)(&quot;((?!&quot;).*)&quot;)"};
   s = std::regex_replace(s, r, "$1<a href=\"$6\">$5</a>");
 }
 
@@ -68,7 +81,7 @@
   std::string value = res.json_value.dump(4);
   escape_html(value);
   convert_to_links(value);
-  res.body =
+  res.body() =
       "<html>\n"
       "<head>\n"
       "<title>Redfish API</title>\n"
@@ -79,7 +92,8 @@
       "</head>\n"
       "<body>\n"
       "<div style=\"max-width: 576px;margin:0 auto;\">\n"
-      "<img src=\"/DMTF_Redfish_logo_2017.svg\" alt=\"redfish\" height=\"406px\" "
+      "<img src=\"/DMTF_Redfish_logo_2017.svg\" alt=\"redfish\" "
+      "height=\"406px\" "
       "width=\"576px\">\n"
       "<br>\n"
       "<pre>\n"
@@ -250,7 +264,7 @@
 }  // namespace detail
 
 #ifdef CROW_ENABLE_DEBUG
-static int connectionCount;
+static std::atomic<int> connectionCount;
 #endif
 template <typename Adaptor, typename Handler, typename... Middlewares>
 class Connection {
@@ -259,19 +273,21 @@
              const std::string& server_name,
              std::tuple<Middlewares...>* middlewares,
              std::function<std::string()>& get_cached_date_str_f,
-             detail::dumb_timer_queue& timer_queue,
+             detail::timer_queue& timer_queue,
              typename Adaptor::context* adaptor_ctx_)
       : adaptor_(io_service, adaptor_ctx_),
         handler_(handler),
-        parser_(this),
         server_name_(server_name),
         middlewares_(middlewares),
         get_cached_date_str(get_cached_date_str_f),
         timer_queue(timer_queue) {
+    parser_.emplace(std::piecewise_construct, std::make_tuple());
+
+    parser_->body_limit(1024 * 1024 * 1);  // 1MB
+    req_.emplace(parser_->get());
 #ifdef CROW_ENABLE_DEBUG
     connectionCount++;
-    CROW_LOG_DEBUG << "Connection open, total " << connectionCount << ", "
-                   << this;
+    CROW_LOG_DEBUG << this << " Connection open, total " << connectionCount;
 #endif
   }
 
@@ -280,8 +296,7 @@
     cancel_deadline_timer();
 #ifdef CROW_ENABLE_DEBUG
     connectionCount--;
-    CROW_LOG_DEBUG << "Connection closed, total " << connectionCount << ", "
-                   << this;
+    CROW_LOG_DEBUG << this << " Connection closed, total " << connectionCount;
 #endif
   }
 
@@ -294,65 +309,31 @@
       if (!ec) {
         start_deadline();
 
-        do_read();
+        do_read_headers();
       } else {
         check_destroy();
       }
     });
   }
 
-  void handle_header() {
-    // HTTP 1.1 Expect: 100-continue
-    if (parser_.check_version(1, 1) && parser_.headers.count("expect") &&
-        get_header_value(parser_.headers, "expect") == "100-continue") {
-      buffers_.clear();
-      static std::string expect_100_continue = "HTTP/1.1 100 Continue\r\n\r\n";
-      buffers_.emplace_back(expect_100_continue.data(),
-                            expect_100_continue.size());
-      do_write();
-    }
-  }
-
   void handle() {
     cancel_deadline_timer();
     bool is_invalid_request = false;
-    add_keep_alive_ = false;
+    const boost::string_view connection =
+        req_->get_header_value(boost::beast::http::field::connection);
 
-    req_ = std::move(parser_.to_request());
-    request& req = req_;
-    req.is_secure = Adaptor::secure::value;
-
-    if (parser_.check_version(1, 0)) {
-      // HTTP/1.0
-      if (req.headers.count("connection") != 0u) {
-        if (boost::iequals(req.get_header_value("connection"), "Keep-Alive")) {
-          add_keep_alive_ = true;
-        }
-      } else {
-        close_connection_ = true;
-      }
-    } else if (parser_.check_version(1, 1)) {
-      // HTTP/1.1
-      if (req.headers.count("connection") != 0u) {
-        if (req.get_header_value("connection") == "close") {
-          close_connection_ = true;
-        } else if (boost::iequals(req.get_header_value("connection"),
-                                  "Keep-Alive")) {
-          add_keep_alive_ = true;
-        }
-      }
-      if (req.headers.count("Host") == 0u) {
+    // Check for HTTP version 1.1.
+    if (req_->version() == 11) {
+      if (req_->get_header_value(boost::beast::http::field::host).empty()) {
         is_invalid_request = true;
-        res = response(400);
+        res = response(boost::beast::http::status::bad_request);
       }
     }
 
-    CROW_LOG_INFO << "Request: "
-                  << boost::lexical_cast<std::string>(
-                         adaptor_.remote_endpoint())
-                  << " " << this << " HTTP/" << parser_.http_major << "."
-                  << parser_.http_minor << ' ' << method_name(req.method) << " "
-                  << req.url;
+    CROW_LOG_INFO << "Request: " << adaptor_.remote_endpoint() << " " << this
+                  << " HTTP/" << req_->version() / 10 << "."
+                  << req_->version() % 10 << ' ' << req_->method_string() << " "
+                  << req_->target();
 
     need_to_call_after_handlers_ = false;
 
@@ -361,23 +342,24 @@
       res.is_alive_helper_ = [this]() -> bool { return adaptor_.is_open(); };
 
       ctx_ = detail::context<Middlewares...>();
-      req.middleware_context = (void*)&ctx_;
-      req.io_service = &adaptor_.get_io_service();
+      req_->middleware_context = (void*)&ctx_;
+      req_->io_service = &adaptor_.get_io_service();
       detail::middleware_call_helper<0, decltype(ctx_), decltype(*middlewares_),
-                                     Middlewares...>(*middlewares_, req, res,
+                                     Middlewares...>(*middlewares_, *req_, res,
                                                      ctx_);
 
       if (!res.completed_) {
-        if (parser_.is_upgrade() &&
-            boost::iequals(req.get_header_value("upgrade"), "websocket")) {
-          close_connection_ = true;
-          handler_->handle_upgrade(req, res, std::move(adaptor_));
+        if (req_->is_upgrade() &&
+            boost::iequals(
+                req_->get_header_value(boost::beast::http::field::upgrade),
+                "websocket")) {
+          handler_->handle_upgrade(*req_, res, std::move(adaptor_));
           return;
         }
         res.complete_request_handler_ = [this] { this->complete_request(); };
         need_to_call_after_handlers_ = true;
-        handler_->handle(req, res);
-        if (add_keep_alive_) {
+        handler_->handle(*req_, res);
+        if (req_->keep_alive()) {
           res.add_header("connection", "Keep-Alive");
         }
       } else {
@@ -389,8 +371,8 @@
   }
 
   void complete_request() {
-    CROW_LOG_INFO << "Response: " << this << ' ' << req_.raw_url << ' '
-                  << res.code << ' ' << close_connection_;
+    CROW_LOG_INFO << "Response: " << this << ' ' << req_->url << ' '
+                  << res.result_int() << " keepalive=" << req_->keep_alive();
 
     if (need_to_call_after_handlers_) {
       need_to_call_after_handlers_ = false;
@@ -399,7 +381,7 @@
       detail::after_handlers_call_helper<((int)sizeof...(Middlewares) - 1),
                                          decltype(ctx_),
                                          decltype(*middlewares_)>(
-          *middlewares_, ctx_, req_, res);
+          *middlewares_, ctx_, *req_, res);
     }
 
     // auto self = this->shared_from_this();
@@ -411,141 +393,101 @@
       // delete this;
       return;
     }
-
-    static boost::container::flat_map<int, std::string> statusCodes = {
-        {200, "HTTP/1.1 200 OK\r\n"},
-        {201, "HTTP/1.1 201 Created\r\n"},
-        {202, "HTTP/1.1 202 Accepted\r\n"},
-        {204, "HTTP/1.1 204 No Content\r\n"},
-
-        {300, "HTTP/1.1 300 Multiple Choices\r\n"},
-        {301, "HTTP/1.1 301 Moved Permanently\r\n"},
-        {302, "HTTP/1.1 302 Moved Temporarily\r\n"},
-        {304, "HTTP/1.1 304 Not Modified\r\n"},
-
-        {400, "HTTP/1.1 400 Bad Request\r\n"},
-        {401, "HTTP/1.1 401 Unauthorized\r\n"},
-        {403, "HTTP/1.1 403 Forbidden\r\n"},
-        {404, "HTTP/1.1 404 Not Found\r\n"},
-        {405, "HTTP/1.1 405 Method Not Allowed\r\n"},
-
-        {500, "HTTP/1.1 500 Internal Server Error\r\n"},
-        {501, "HTTP/1.1 501 Not Implemented\r\n"},
-        {502, "HTTP/1.1 502 Bad Gateway\r\n"},
-        {503, "HTTP/1.1 503 Service Unavailable\r\n"},
-    };
-
-    buffers_.clear();
-    buffers_.reserve(20);
-
-    if (res.body.empty() && !res.json_value.empty()) {
-      if (is_browser(req_)) {
+    if (res.body().empty() && !res.json_value.empty()) {
+      if (is_browser(*req_)) {
         pretty_print_json(res);
       } else {
         res.json_mode();
-        res.body = res.json_value.dump(4);
+        res.body() = res.json_value.dump(2);
       }
     }
 
-    if (!statusCodes.count(res.code)) {
-      res.code = 500;
+    if (res.result_int() >= 400 && res.body().empty()) {
+      res.body() = std::string(res.reason());
     }
-    {
-      auto& status = statusCodes.find(res.code)->second;
-      buffers_.emplace_back(status.data(), status.size());
-    }
+    res.add_header(boost::beast::http::field::server, server_name_);
+    res.add_header(boost::beast::http::field::date, get_cached_date_str());
 
-    if (res.code >= 400 && res.body.empty()) {
-      res.body = statusCodes[res.code].substr(9);
-    }
-
-    const static std::string crlf = "\r\n";
-    content_length_ = std::to_string(res.body.size());
-    static const std::string content_length_tag = "Content-Length";
-    res.add_header(content_length_tag, content_length_);
-
-    static const std::string server_tag = "Server: ";
-    res.add_header(server_tag, server_name_);
-
-    static const std::string date_tag = "Date: ";
-    date_str_ = get_cached_date_str();
-    res.add_header(date_tag, date_str_);
-
-    if (add_keep_alive_) {
-      static const std::string keep_alive_tag = "Connection";
-      static const std::string keep_alive_value = "Keep-Alive";
-      res.add_header(keep_alive_tag, keep_alive_value);
-    }
-
-    buffers_.emplace_back(res.headers.data(), res.headers.size());
-
-    buffers_.emplace_back(crlf.data(), crlf.size());
-    buffers_.emplace_back(res.body.data(), res.body.size());
+    res.keep_alive(req_->keep_alive());
 
     do_write();
-
-    if (need_to_start_read_after_complete_) {
-      need_to_start_read_after_complete_ = false;
-      start_deadline();
-      do_read();
-    }
   }
 
  private:
+  void do_read_headers() {
+    // auto self = this->shared_from_this();
+    is_reading = true;
+    CROW_LOG_DEBUG << this << " do_read_headers";
+
+    // Clean up any previous connection.
+    boost::beast::http::async_read_header(
+        adaptor_.socket(), buffer_, *parser_,
+        [this](const boost::system::error_code& ec,
+               std::size_t bytes_transferred) {
+          is_reading = false;
+          CROW_LOG_ERROR << this << " async_read_header " << bytes_transferred
+                         << " Bytes";
+          bool error_while_reading = false;
+          if (ec) {
+            error_while_reading = true;
+            CROW_LOG_ERROR << this << " Error while reading: " << ec.message();
+          } else {
+            // if the adaptor isn't open anymore, and wasn't handed to a
+            // websocket, treat as an error
+            if (!adaptor_.is_open() && !req_->is_upgrade()) {
+              error_while_reading = true;
+            }
+          }
+
+          if (error_while_reading) {
+            cancel_deadline_timer();
+            adaptor_.close();
+            CROW_LOG_DEBUG << this << " from read(1)";
+            check_destroy();
+            return;
+          }
+
+          // Compute the url parameters for the request
+          req_->url = req_->target();
+          std::size_t index = req_->url.find("?");
+          if (index != boost::string_view::npos) {
+            req_->url = req_->url.substr(0, index - 1);
+          }
+          req_->url_params = query_string(std::string(req_->target()));
+          do_read();
+        });
+  }
+
   void do_read() {
     // auto self = this->shared_from_this();
     is_reading = true;
-    adaptor_.socket().async_read_some(
-        boost::asio::buffer(buffer_),
+    CROW_LOG_DEBUG << this << " do_read";
+
+    boost::beast::http::async_read(
+        adaptor_.socket(), buffer_, *parser_,
         [this](const boost::system::error_code& ec,
                std::size_t bytes_transferred) {
-          CROW_LOG_ERROR << "Read " << bytes_transferred << " Bytes";
-          bool error_while_reading = true;
-          if (!ec) {
-            bool ret = parser_.feed(buffer_.data(), bytes_transferred);
-            if (parser_.upgrade) {
-              error_while_reading = false;
-            } else {
-              if (ret && adaptor_.is_open()) {
-                error_while_reading = false;
-              }
-            }
-          } else {
+          CROW_LOG_ERROR << this << " async_read " << bytes_transferred
+                         << " Bytes";
+          is_reading = false;
+
+          bool error_while_reading = false;
+          if (ec) {
             CROW_LOG_ERROR << "Error while reading: " << ec.message();
-#ifdef CROW_ENABLE_SSL
-            if (ec.category() == boost::asio::error::get_ssl_category()) {
-              auto err = std::string(" (") +
-                         std::to_string(ERR_GET_LIB(ec.value())) + "," +
-                         std::to_string(ERR_GET_FUNC(ec.value())) + "," +
-                         std::to_string(ERR_GET_REASON(ec.value())) + ") ";
-              // ERR_PACK /* crypto/err/err.h */
-              char buf[128];
-              ::ERR_error_string_n(ec.value(), buf, sizeof(buf));
-              err += buf;
-              CROW_LOG_ERROR << err;
+            error_while_reading = true;
+          } else {
+            if (!adaptor_.is_open()) {
+              error_while_reading = true;
             }
-#endif
           }
           if (error_while_reading) {
             cancel_deadline_timer();
-            parser_.done();
             adaptor_.close();
-            is_reading = false;
             CROW_LOG_DEBUG << this << " from read(1)";
             check_destroy();
-          } else if (close_connection_) {
-            cancel_deadline_timer();
-            parser_.done();
-            is_reading = false;
-            check_destroy();
-            // adaptor will close after write
-          } else if (!need_to_call_after_handlers_) {
-            start_deadline();
-            do_read();
-          } else {
-            // res will be completed later by user
-            need_to_start_read_after_complete_ = true;
+            return;
           }
+          handle();
         });
   }
 
@@ -553,25 +495,36 @@
     // auto self = this->shared_from_this();
     is_writing = true;
     CROW_LOG_DEBUG << "Doing Write";
-    boost::asio::async_write(adaptor_.socket(), buffers_,
-                             [&](const boost::system::error_code& ec,
-                                 std::size_t bytes_transferred) {
-                               CROW_LOG_DEBUG << "Wrote " << bytes_transferred
-                                              << "bytes";
+    res.prepare_payload();
+    serializer_.emplace(*res.string_response);
+    boost::beast::http::async_write(
+        adaptor_.socket(), *serializer_,
+        [&](const boost::system::error_code& ec,
+            std::size_t bytes_transferred) {
+          is_writing = false;
+          CROW_LOG_DEBUG << this << " Wrote " << bytes_transferred << " bytes";
 
-                               is_writing = false;
-                               res.clear();
-                               if (!ec) {
-                                 if (close_connection_) {
-                                   adaptor_.close();
-                                   CROW_LOG_DEBUG << this << " from write(1)";
-                                   check_destroy();
-                                 }
-                               } else {
-                                 CROW_LOG_DEBUG << this << " from write(2)";
-                                 check_destroy();
-                               }
-                             });
+          if (ec) {
+            CROW_LOG_DEBUG << this << " from write(2)";
+            check_destroy();
+            return;
+          }
+          if (!req_->keep_alive()) {
+            adaptor_.close();
+            CROW_LOG_DEBUG << this << " from write(1)";
+            check_destroy();
+            return;
+          }
+
+          serializer_.reset();
+          CROW_LOG_DEBUG << this << " Clearing response";
+          res.clear();
+          parser_.emplace(std::piecewise_construct, std::make_tuple());
+          buffer_.consume(buffer_.size());
+
+          req_.emplace(parser_->get());
+          do_read_headers();
+        });
   }
 
   void check_destroy() {
@@ -584,12 +537,12 @@
   }
 
   void cancel_deadline_timer() {
-    CROW_LOG_DEBUG << this << " timer cancelled: " << timer_cancel_key_.first
-                   << ' ' << timer_cancel_key_.second;
+    CROW_LOG_DEBUG << this << " timer cancelled: " << &timer_queue << ' '
+                   << timer_cancel_key_;
     timer_queue.cancel(timer_cancel_key_);
   }
 
-  void start_deadline(/*int timeout = 5*/) {
+  void start_deadline() {
     cancel_deadline_timer();
 
     timer_cancel_key_ = timer_queue.add([this] {
@@ -598,30 +551,32 @@
       }
       adaptor_.close();
     });
-    CROW_LOG_DEBUG << this << " timer added: " << timer_cancel_key_.first << ' '
-                   << timer_cancel_key_.second;
+    CROW_LOG_DEBUG << this << " timer added: " << &timer_queue << ' '
+                   << timer_cancel_key_;
   }
 
  private:
   Adaptor adaptor_;
   Handler* handler_;
 
-  std::array<char, 4096> buffer_{};
+  // Making this a boost::optional allows it to be efficiently destroyed and
+  // re-created on connection reset
+  boost::optional<
+      boost::beast::http::request_parser<boost::beast::http::string_body>>
+      parser_;
 
-  HTTPParser<Connection> parser_;
-  request req_;
-  response res;
+  boost::beast::flat_buffer buffer_{8192};
 
-  bool close_connection_ = false;
+  boost::optional<
+      boost::beast::http::response_serializer<boost::beast::http::string_body>>
+      serializer_;
+
+  boost::optional<crow::request> req_;
+  crow::response res;
 
   const std::string& server_name_;
-  std::vector<boost::asio::const_buffer> buffers_;
 
-  std::string content_length_;
-  std::string date_str_;
-
-  // boost::asio::deadline_timer deadline_;
-  detail::dumb_timer_queue::key timer_cancel_key_;
+  int timer_cancel_key_;
 
   bool is_reading{};
   bool is_writing{};
@@ -633,6 +588,6 @@
   detail::context<Middlewares...> ctx_;
 
   std::function<std::string()>& get_cached_date_str;
-  detail::dumb_timer_queue& timer_queue;
-};
+  detail::timer_queue& timer_queue;
+};  // namespace crow
 }  // namespace crow
diff --git a/crow/include/crow/http_parser_merged.h b/crow/include/crow/http_parser_merged.h
deleted file mode 100644
index 030e8a4..0000000
--- a/crow/include/crow/http_parser_merged.h
+++ /dev/null
@@ -1,2639 +0,0 @@
-/* merged revision: 5b951d74bd66ec9d38448e0a85b1cf8b85d97db3 */
-/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-#ifndef CROW_http_parser_h
-#define CROW_http_parser_h
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Also update SONAME in the Makefile whenever you change these. */
-#define CROW_HTTP_PARSER_VERSION_MAJOR 2
-#define CROW_HTTP_PARSER_VERSION_MINOR 3
-#define CROW_HTTP_PARSER_VERSION_PATCH 0
-
-#include <sys/types.h>
-#if defined(_WIN32) && !defined(__MINGW32__) && \
-    (!defined(_MSC_VER) || _MSC_VER < 1600)
-#include <BaseTsd.h>
-#include <stddef.h>
-typedef __int8 int8_t;
-typedef unsigned __int8 uint8_t;
-typedef __int16 int16_t;
-typedef unsigned __int16 uint16_t;
-typedef __int32 int32_t;
-typedef unsigned __int32 uint32_t;
-typedef __int64 int64_t;
-typedef unsigned __int64 uint64_t;
-#else
-#include <cstdint>
-#endif
-
-/* Compile with -DHTTP_PARSER_STRICT=0 to make less checks, but run
- * faster
- */
-#ifndef CROW_HTTP_PARSER_STRICT
-#define CROW_HTTP_PARSER_STRICT 1
-#endif
-
-/* Maximium header size allowed. If the macro is not defined
- * before including this header then the default is used. To
- * change the maximum header size, define the macro in the build
- * environment (e.g. -DHTTP_MAX_HEADER_SIZE=<value>). To remove
- * the effective limit on the size of the header, define the macro
- * to a very large number (e.g. -DHTTP_MAX_HEADER_SIZE=0x7fffffff)
- */
-#ifndef CROW_HTTP_MAX_HEADER_SIZE
-#define CROW_HTTP_MAX_HEADER_SIZE (80 * 1024)
-#endif
-
-using http_parser = struct http_parser;
-using http_parser_settings = struct http_parser_settings;
-
-/* Callbacks should return non-zero to indicate an error. The parser will
- * then halt execution.
- *
- * The one exception is on_headers_complete. In a HTTP_RESPONSE parser
- * returning '1' from on_headers_complete will tell the parser that it
- * should not expect a body. This is used when receiving a response to a
- * HEAD request which may contain 'Content-Length' or 'Transfer-Encoding:
- * chunked' headers that indicate the presence of a body.
- *
- * http_data_cb does not return data chunks. It will be call arbitrarally
- * many times for each string. E.G. you might get 10 callbacks for "on_url"
- * each providing just a few characters more data.
- */
-using http_data_cb = int (*)(http_parser *, const char *, size_t);
-using http_cb = int (*)(http_parser *);
-
-/* Request Methods */
-#define CROW_HTTP_METHOD_MAP(CROW_XX)   \
-  CROW_XX(0, DELETE, DELETE)            \
-  CROW_XX(1, GET, GET)                  \
-  CROW_XX(2, HEAD, HEAD)                \
-  CROW_XX(3, POST, POST)                \
-  CROW_XX(4, PUT, PUT)                  \
-  /* pathological */                    \
-  CROW_XX(5, CONNECT, CONNECT)          \
-  CROW_XX(6, OPTIONS, OPTIONS)          \
-  CROW_XX(7, TRACE, TRACE)              \
-  /* webdav */                          \
-  CROW_XX(8, COPY, COPY)                \
-  CROW_XX(9, LOCK, LOCK)                \
-  CROW_XX(10, MKCOL, MKCOL)             \
-  CROW_XX(11, MOVE, MOVE)               \
-  CROW_XX(12, PROPFIND, PROPFIND)       \
-  CROW_XX(13, PROPPATCH, PROPPATCH)     \
-  CROW_XX(14, SEARCH, SEARCH)           \
-  CROW_XX(15, UNLOCK, UNLOCK)           \
-  /* subversion */                      \
-  CROW_XX(16, REPORT, REPORT)           \
-  CROW_XX(17, MKACTIVITY, MKACTIVITY)   \
-  CROW_XX(18, CHECKOUT, CHECKOUT)       \
-  CROW_XX(19, MERGE, MERGE)             \
-  /* upnp */                            \
-  CROW_XX(20, MSEARCH, M - SEARCH)      \
-  CROW_XX(21, NOTIFY, NOTIFY)           \
-  CROW_XX(22, SUBSCRIBE, SUBSCRIBE)     \
-  CROW_XX(23, UNSUBSCRIBE, UNSUBSCRIBE) \
-  /* RFC-5789 */                        \
-  CROW_XX(24, PATCH, PATCH)             \
-  CROW_XX(25, PURGE, PURGE)             \
-  /* CalDAV */                          \
-  CROW_XX(26, MKCALENDAR, MKCALENDAR)
-
-enum http_method {
-#define CROW_XX(num, name, string) HTTP_##name = num,
-  CROW_HTTP_METHOD_MAP(CROW_XX)
-#undef CROW_XX
-};
-
-enum http_parser_type { HTTP_REQUEST, HTTP_RESPONSE, HTTP_BOTH };
-
-/* Flag values for http_parser.flags field */
-enum flags {
-  F_CHUNKED = 1 << 0,
-  F_CONNECTION_KEEP_ALIVE = 1 << 1,
-  F_CONNECTION_CLOSE = 1 << 2,
-  F_TRAILING = 1 << 3,
-  F_UPGRADE = 1 << 4,
-  F_SKIPBODY = 1 << 5
-};
-
-/* Map for errno-related constants
- *
- * The provided argument should be a macro that takes 2 arguments.
- */
-#define CROW_HTTP_ERRNO_MAP(CROW_XX)                                        \
-  /* No error */                                                            \
-  CROW_XX(OK, "success")                                                    \
-                                                                            \
-  /* Callback-related errors */                                             \
-  CROW_XX(CB_message_begin, "the on_message_begin callback failed")         \
-  CROW_XX(CB_url, "the on_url callback failed")                             \
-  CROW_XX(CB_header_field, "the on_header_field callback failed")           \
-  CROW_XX(CB_header_value, "the on_header_value callback failed")           \
-  CROW_XX(CB_headers_complete, "the on_headers_complete callback failed")   \
-  CROW_XX(CB_body, "the on_body callback failed")                           \
-  CROW_XX(CB_message_complete, "the on_message_complete callback failed")   \
-  CROW_XX(CB_status, "the on_status callback failed")                       \
-                                                                            \
-  /* Parsing-related errors */                                              \
-  CROW_XX(INVALID_EOF_STATE, "stream ended at an unexpected time")          \
-  CROW_XX(HEADER_OVERFLOW, "too many header bytes seen; overflow detected") \
-  CROW_XX(CLOSED_CONNECTION,                                                \
-          "data received after completed connection: close message")        \
-  CROW_XX(INVALID_VERSION, "invalid HTTP version")                          \
-  CROW_XX(INVALID_STATUS, "invalid HTTP status code")                       \
-  CROW_XX(INVALID_METHOD, "invalid HTTP method")                            \
-  CROW_XX(INVALID_URL, "invalid URL")                                       \
-  CROW_XX(INVALID_HOST, "invalid host")                                     \
-  CROW_XX(INVALID_PORT, "invalid port")                                     \
-  CROW_XX(INVALID_PATH, "invalid path")                                     \
-  CROW_XX(INVALID_QUERY_STRING, "invalid query string")                     \
-  CROW_XX(INVALID_FRAGMENT, "invalid fragment")                             \
-  CROW_XX(LF_EXPECTED, "CROW_LF character expected")                        \
-  CROW_XX(INVALID_HEADER_TOKEN, "invalid character in header")              \
-  CROW_XX(INVALID_CONTENT_LENGTH,                                           \
-          "invalid character in content-length header")                     \
-  CROW_XX(INVALID_CHUNK_SIZE, "invalid character in chunk size header")     \
-  CROW_XX(INVALID_CONSTANT, "invalid constant string")                      \
-  CROW_XX(INVALID_INTERNAL_STATE, "encountered unexpected internal state")  \
-  CROW_XX(STRICT, "strict mode assertion failed")                           \
-  CROW_XX(PAUSED, "parser is paused")                                       \
-  CROW_XX(UNKNOWN, "an unknown error occurred")
-
-/* Define HPE_* values for each errno value above */
-#define CROW_HTTP_ERRNO_GEN(n, s) HPE_##n,
-enum http_errno { CROW_HTTP_ERRNO_MAP(CROW_HTTP_ERRNO_GEN) };
-#undef CROW_HTTP_ERRNO_GEN
-
-/* Get an http_errno value from an http_parser */
-#define CROW_HTTP_PARSER_ERRNO(p) ((enum http_errno)(p)->http_errno)
-
-struct http_parser {
-  /** PRIVATE **/
-  unsigned int type : 2;         /* enum http_parser_type */
-  unsigned int flags : 6;        /* F_* values from 'flags' enum; semi-public */
-  unsigned int state : 8;        /* enum state from http_parser.c */
-  unsigned int header_state : 8; /* enum header_state from http_parser.c */
-  unsigned int index : 8;        /* index into current matcher */
-
-  uint32_t nread;          /* # bytes read in various scenarios */
-  uint64_t content_length; /* # bytes in body (0 if no Content-Length header) */
-
-  /** READ-ONLY **/
-  unsigned short http_major;
-  unsigned short http_minor;
-  unsigned int status_code : 16; /* responses only */
-  unsigned int method : 8;       /* requests only */
-  unsigned int http_errno : 7;
-
-  /* 1 = Upgrade header was present and the parser has exited because of that.
-   * 0 = No upgrade header present.
-   * Should be checked when http_parser_execute() returns in addition to
-   * error checking.
-   */
-  unsigned int upgrade : 1;
-
-  /** PUBLIC **/
-  void *data; /* A pointer to get hook to the "connection" or "socket" object */
-};
-
-struct http_parser_settings {
-  http_cb on_message_begin;
-  http_data_cb on_url;
-  http_data_cb on_status;
-  http_data_cb on_header_field;
-  http_data_cb on_header_value;
-  http_cb on_headers_complete;
-  http_data_cb on_body;
-  http_cb on_message_complete;
-};
-
-enum http_parser_url_fields {
-  UF_SCHEMA = 0,
-  UF_HOST = 1,
-  UF_PORT = 2,
-  UF_PATH = 3,
-  UF_QUERY = 4,
-  UF_FRAGMENT = 5,
-  UF_USERINFO = 6,
-  UF_MAX = 7
-};
-
-/* Result structure for http_parser_parse_url().
- *
- * Callers should index into field_data[] with UF_* values iff field_set
- * has the relevant (1 << UF_*) bit set. As a courtesy to clients (and
- * because we probably have padding left over), we convert any port to
- * a uint16_t.
- */
-struct http_parser_url {
-  uint16_t field_set; /* Bitmask of (1 << UF_*) values */
-  uint16_t port;      /* Converted UF_PORT string */
-
-  struct {
-    uint16_t off; /* Offset into buffer in which field starts */
-    uint16_t len; /* Length of run in buffer */
-  } field_data[UF_MAX];
-};
-
-/* Returns the library version. Bits 16-23 contain the major version number,
- * bits 8-15 the minor version number and bits 0-7 the patch level.
- * Usage example:
- *
- *   unsigned long version = http_parser_version();
- *   unsigned major = (version >> 16) & 255;
- *   unsigned minor = (version >> 8) & 255;
- *   unsigned patch = version & 255;
- *   printf("http_parser v%u.%u.%u\n", major, minor, version);
- */
-unsigned long http_parser_version(void);
-
-void http_parser_init(http_parser *parser, enum http_parser_type type);
-
-size_t http_parser_execute(http_parser *parser,
-                           const http_parser_settings *settings,
-                           const char *data, size_t len);
-
-/* If http_should_keep_alive() in the on_headers_complete or
- * on_message_complete callback returns 0, then this should be
- * the last message on the connection.
- * If you are the server, respond with the "Connection: close" header.
- * If you are the client, close the connection.
- */
-int http_should_keep_alive(const http_parser *parser);
-
-/* Returns a string version of the HTTP method. */
-const char *http_method_str(enum http_method m);
-
-/* Return a string name of the given error */
-const char *http_errno_name(enum http_errno err);
-
-/* Return a string description of the given error */
-const char *http_errno_description(enum http_errno err);
-
-/* Parse a URL; return nonzero on failure */
-int http_parser_parse_url(const char *buf, size_t buflen, int is_connect,
-                          struct http_parser_url *u);
-
-/* Pause or un-pause the parser; a nonzero value pauses */
-void http_parser_pause(http_parser *parser, int paused);
-
-/* Checks if this is the final chunk of the body. */
-int http_body_is_final(const http_parser *parser);
-
-/*#include "http_parser.h"*/
-/* Based on src/http/ngx_http_parse.c from NGINX copyright Igor Sysoev
- *
- * Additional changes are licensed under the same terms as NGINX and
- * copyright Joyent, Inc. and other Node contributors. All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-#include <cassert>
-#include <cctype>
-#include <climits>
-#include <cstddef>
-#include <cstdlib>
-#include <cstring>
-
-#ifndef CROW_ULLONG_MAX
-#define CROW_ULLONG_MAX ((uint64_t)-1) /* 2^64-1 */
-#endif
-
-#ifndef CROW_MIN
-#define CROW_MIN(a, b) ((a) < (b) ? (a) : (b))
-#endif
-
-#ifndef CROW_ARRAY_SIZE
-#define CROW_ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
-#endif
-
-#ifndef CROW_BIT_AT
-#define CROW_BIT_AT(a, i) \
-  (!!((unsigned int)(a)[(unsigned int)(i) >> 3] & (1 << ((unsigned int)(i)&7))))
-#endif
-
-#ifndef CROW_ELEM_AT
-#define CROW_ELEM_AT(a, i, v) \
-  ((unsigned int)(i) < CROW_ARRAY_SIZE(a) ? (a)[(i)] : (v))
-#endif
-
-#define CROW_SET_ERRNO(e)     \
-  do {                        \
-    parser->http_errno = (e); \
-  } while (0)
-
-/* Run the notify callback FOR, returning ER if it fails */
-#define CROW_CALLBACK_NOTIFY_(FOR, ER)                     \
-  do {                                                     \
-    assert(CROW_HTTP_PARSER_ERRNO(parser) == HPE_OK);      \
-                                                           \
-    if (settings->on_##FOR) {                              \
-      if (0 != settings->on_##FOR(parser)) {               \
-        CROW_SET_ERRNO(HPE_CB_##FOR);                      \
-      }                                                    \
-                                                           \
-      /* We either errored above or got paused; get out */ \
-      if (CROW_HTTP_PARSER_ERRNO(parser) != HPE_OK) {      \
-        return (ER);                                       \
-      }                                                    \
-    }                                                      \
-  } while (0)
-
-/* Run the notify callback FOR and consume the current byte */
-#define CROW_CALLBACK_NOTIFY(FOR) CROW_CALLBACK_NOTIFY_(FOR, p - data + 1)
-
-/* Run the notify callback FOR and don't consume the current byte */
-#define CROW_CALLBACK_NOTIFY_NOADVANCE(FOR) CROW_CALLBACK_NOTIFY_(FOR, p - data)
-
-/* Run data callback FOR with LEN bytes, returning ER if it fails */
-#define CROW_CALLBACK_DATA_(FOR, LEN, ER)                         \
-  do {                                                            \
-    assert(CROW_HTTP_PARSER_ERRNO(parser) == HPE_OK);             \
-                                                                  \
-    if (FOR##_mark) {                                             \
-      if (settings->on_##FOR) {                                   \
-        if (0 != settings->on_##FOR(parser, FOR##_mark, (LEN))) { \
-          CROW_SET_ERRNO(HPE_CB_##FOR);                           \
-        }                                                         \
-                                                                  \
-        /* We either errored above or got paused; get out */      \
-        if (CROW_HTTP_PARSER_ERRNO(parser) != HPE_OK) {           \
-          return (ER);                                            \
-        }                                                         \
-      }                                                           \
-      FOR##_mark = NULL;                                          \
-    }                                                             \
-  } while (0)
-
-/* Run the data callback FOR and consume the current byte */
-#define CROW_CALLBACK_DATA(FOR) \
-  CROW_CALLBACK_DATA_(FOR, p - FOR##_mark, p - data + 1)
-
-/* Run the data callback FOR and don't consume the current byte */
-#define CROW_CALLBACK_DATA_NOADVANCE(FOR) \
-  CROW_CALLBACK_DATA_(FOR, p - FOR##_mark, p - data)
-
-/* Set the mark FOR; non-destructive if mark is already set */
-#define CROW_MARK(FOR) \
-  do {                 \
-    if (!FOR##_mark) { \
-      FOR##_mark = p;  \
-    }                  \
-  } while (0)
-
-#define CROW_PROXY_CONNECTION "proxy-connection"
-#define CROW_CONNECTION "connection"
-#define CROW_CONTENT_LENGTH "content-length"
-#define CROW_TRANSFER_ENCODING "transfer-encoding"
-#define CROW_UPGRADE "upgrade"
-#define CROW_CHUNKED "chunked"
-#define CROW_KEEP_ALIVE "keep-alive"
-#define CROW_CLOSE "close"
-
-enum state {
-  s_dead = 1 /* important that this is > 0 */
-
-  ,
-  s_start_req_or_res,
-  s_res_or_resp_H,
-  s_start_res,
-  s_res_H,
-  s_res_HT,
-  s_res_HTT,
-  s_res_HTTP,
-  s_res_first_http_major,
-  s_res_http_major,
-  s_res_first_http_minor,
-  s_res_http_minor,
-  s_res_first_status_code,
-  s_res_status_code,
-  s_res_status_start,
-  s_res_status,
-  s_res_line_almost_done
-
-  ,
-  s_start_req
-
-  ,
-  s_req_method,
-  s_req_spaces_before_url,
-  s_req_schema,
-  s_req_schema_slash,
-  s_req_schema_slash_slash,
-  s_req_server_start,
-  s_req_server,
-  s_req_server_with_at,
-  s_req_path,
-  s_req_query_string_start,
-  s_req_query_string,
-  s_req_fragment_start,
-  s_req_fragment,
-  s_req_http_start,
-  s_req_http_H,
-  s_req_http_HT,
-  s_req_http_HTT,
-  s_req_http_HTTP,
-  s_req_first_http_major,
-  s_req_http_major,
-  s_req_first_http_minor,
-  s_req_http_minor,
-  s_req_line_almost_done
-
-  ,
-  s_header_field_start,
-  s_header_field,
-  s_header_value_discard_ws,
-  s_header_value_discard_ws_almost_done,
-  s_header_value_discard_lws,
-  s_header_value_start,
-  s_header_value,
-  s_header_value_lws
-
-  ,
-  s_header_almost_done
-
-  ,
-  s_chunk_size_start,
-  s_chunk_size,
-  s_chunk_parameters,
-  s_chunk_size_almost_done
-
-  ,
-  s_headers_almost_done,
-  s_headers_done
-
-  /* Important: 's_headers_done' must be the last 'header' state. All
-   * states beyond this must be 'body' states. It is used for overflow
-   * checking. See the CROW_PARSING_HEADER() macro.
-   */
-
-  ,
-  s_chunk_data,
-  s_chunk_data_almost_done,
-  s_chunk_data_done
-
-  ,
-  s_body_identity,
-  s_body_identity_eof
-
-  ,
-  s_message_done
-};
-
-#define CROW_PARSING_HEADER(state) ((state) <= s_headers_done)
-
-enum header_states {
-  h_general = 0,
-  h_C,
-  h_CO,
-  h_CON
-
-  ,
-  h_matching_connection,
-  h_matching_proxy_connection,
-  h_matching_content_length,
-  h_matching_transfer_encoding,
-  h_matching_upgrade
-
-  ,
-  h_connection,
-  h_content_length,
-  h_transfer_encoding,
-  h_upgrade
-
-  ,
-  h_matching_transfer_encoding_chunked,
-  h_matching_connection_keep_alive,
-  h_matching_connection_close
-
-  ,
-  h_transfer_encoding_chunked,
-  h_connection_keep_alive,
-  h_connection_close
-};
-
-enum http_host_state {
-  s_http_host_dead = 1,
-  s_http_userinfo_start,
-  s_http_userinfo,
-  s_http_host_start,
-  s_http_host_v6_start,
-  s_http_host,
-  s_http_host_v6,
-  s_http_host_v6_end,
-  s_http_host_port_start,
-  s_http_host_port
-};
-
-/* Macros for character classes; depends on strict-mode  */
-#define CROW_CR '\r'
-#define CROW_LF '\n'
-#define CROW_LOWER(c) (unsigned char)((c) | 0x20)
-#define CROW_IS_ALPHA(c) (CROW_LOWER(c) >= 'a' && CROW_LOWER(c) <= 'z')
-#define CROW_IS_NUM(c) ((c) >= '0' && (c) <= '9')
-#define CROW_IS_ALPHANUM(c) (CROW_IS_ALPHA(c) || CROW_IS_NUM(c))
-#define CROW_IS_HEX(c) \
-  (CROW_IS_NUM(c) || (CROW_LOWER(c) >= 'a' && CROW_LOWER(c) <= 'f'))
-#define CROW_IS_MARK(c)                                                  \
-  ((c) == '-' || (c) == '_' || (c) == '.' || (c) == '!' || (c) == '~' || \
-   (c) == '*' || (c) == '\'' || (c) == '(' || (c) == ')')
-#define CROW_IS_USERINFO_CHAR(c)                                         \
-  (CROW_IS_ALPHANUM(c) || CROW_IS_MARK(c) || (c) == '%' || (c) == ';' || \
-   (c) == ':' || (c) == '&' || (c) == '=' || (c) == '+' || (c) == '$' || \
-   (c) == ',')
-
-#if CROW_HTTP_PARSER_STRICT
-#define CROW_TOKEN(c) (tokens[(unsigned char)(c)])
-#define CROW_IS_URL_CHAR(c) (CROW_BIT_AT(normal_url_char, (unsigned char)(c)))
-#define CROW_IS_HOST_CHAR(c) (CROW_IS_ALPHANUM(c) || (c) == '.' || (c) == '-')
-#else
-#define CROW_TOKEN(c) ((c == ' ') ? ' ' : tokens[(unsigned char)c])
-#define CROW_IS_URL_CHAR(c) \
-  (CROW_BIT_AT(normal_url_char, (unsigned char)c) || ((c)&0x80))
-#define CROW_IS_HOST_CHAR(c) \
-  (CROW_IS_ALPHANUM(c) || (c) == '.' || (c) == '-' || (c) == '_')
-#endif
-
-#define CROW_start_state \
-  (parser->type == HTTP_REQUEST ? s_start_req : s_start_res)
-
-#if CROW_HTTP_PARSER_STRICT
-#define CROW_STRICT_CHECK(cond)   \
-  do {                            \
-    if (cond) {                   \
-      CROW_SET_ERRNO(HPE_STRICT); \
-      goto error;                 \
-    }                             \
-  } while (0)
-#define CROW_NEW_MESSAGE() \
-  (http_should_keep_alive(parser) ? CROW_start_state : s_dead)
-#else
-#define CROW_STRICT_CHECK(cond)
-#define CROW_NEW_MESSAGE() CROW_start_state
-#endif
-
-int http_message_needs_eof(const http_parser *parser);
-
-/* Our URL parser.
- *
- * This is designed to be shared by http_parser_execute() for URL validation,
- * hence it has a state transition + byte-for-byte interface. In addition, it
- * is meant to be embedded in http_parser_parse_url(), which does the dirty
- * work of turning state transitions URL components for its API.
- *
- * This function should only be invoked with non-space characters. It is
- * assumed that the caller cares about (and can detect) the transition between
- * URL and non-URL states by looking for these.
- */
-inline enum state parse_url_char(enum state s, const char ch) {
-#if CROW_HTTP_PARSER_STRICT
-#define CROW_T(v) 0
-#else
-#define CROW_T(v) v
-#endif
-
-  static const uint8_t normal_url_char[32] = {
-      /*   0 nul    1 soh    2 stx    3 etx    4 eot    5 enq    6
-         ack    7 bel  */
-      0 | 0 | 0 | 0 | 0 | 0 | 0 | 0,
-      /*   8 bs     9 ht    10 nl    11 vt    12 np    13 cr    14
-         so    15 si   */
-      0 | CROW_T(2) | 0 | 0 | CROW_T(16) | 0 | 0 | 0,
-      /*  16 dle   17 dc1   18 dc2   19 dc3   20 dc4   21 nak   22
-         syn   23 etb */
-      0 | 0 | 0 | 0 | 0 | 0 | 0 | 0,
-      /*  24 can   25 em    26 sub   27 esc   28 fs    29 gs    30
-         rs    31 us  */
-      0 | 0 | 0 | 0 | 0 | 0 | 0 | 0,
-      /*  32 sp    33  !    34  "    35  #    36  $    37  %    38
-         &    39  '  */
-      0 | 2 | 4 | 0 | 16 | 32 | 64 | 128,
-      /*  40  (    41  )    42  *    43  +    44  ,    45  -    46
-         .    47  /  */
-      1 | 2 | 4 | 8 | 16 | 32 | 64 | 128,
-      /*  48  0    49  1    50  2    51  3    52  4    53  5    54
-         6    55  7  */
-      1 | 2 | 4 | 8 | 16 | 32 | 64 | 128,
-      /*  56  8    57  9    58  :    59  ;    60  <    61  =    62
-         >    63  ?  */
-      1 | 2 | 4 | 8 | 16 | 32 | 64 | 0,
-      /*  64  @    65  A    66  B    67  C    68  D    69  E    70
-         F    71  G  */
-      1 | 2 | 4 | 8 | 16 | 32 | 64 | 128,
-      /*  72  H    73  I    74  J    75  K    76  L    77  M    78
-         N    79  O  */
-      1 | 2 | 4 | 8 | 16 | 32 | 64 | 128,
-      /*  80  P    81  Q    82  R    83  S    84  CROW_T    85  U
-         86  V    87  W  */
-      1 | 2 | 4 | 8 | 16 | 32 | 64 | 128,
-      /*  88  X    89  Y    90  Z    91  [    92  \    93  ]    94
-         ^    95  _  */
-      1 | 2 | 4 | 8 | 16 | 32 | 64 | 128,
-      /*  96  `    97  a    98  b    99  c   100  d   101  e   102
-         f   103  g  */
-      1 | 2 | 4 | 8 | 16 | 32 | 64 | 128,
-      /* 104  h   105  i   106  j   107  k   108  l   109  m   110
-         n   111  o  */
-      1 | 2 | 4 | 8 | 16 | 32 | 64 | 128,
-      /* 112  p   113  q   114  r   115  s   116  t   117  u   118
-         v   119  w  */
-      1 | 2 | 4 | 8 | 16 | 32 | 64 | 128,
-      /* 120  x   121  y   122  z   123  {   124  |   125  }   126
-         ~   127 del */
-      1 | 2 | 4 | 8 | 16 | 32 | 64 | 0,
-  };
-
-#undef CROW_T
-
-  if (ch == ' ' || ch == '\r' || ch == '\n') {
-    return s_dead;
-  }
-
-#if CROW_HTTP_PARSER_STRICT
-  if (ch == '\t' || ch == '\f') {
-    return s_dead;
-  }
-#endif
-
-  switch (s) {
-    case s_req_spaces_before_url:
-      /* Proxied requests are followed by scheme of an absolute URI (alpha).
-       * All methods except CONNECT are followed by '/' or '*'.
-       */
-
-      if (ch == '/' || ch == '*') {
-        return s_req_path;
-      }
-
-      if (CROW_IS_ALPHA(ch)) {
-        return s_req_schema;
-      }
-
-      break;
-
-    case s_req_schema:
-      if (CROW_IS_ALPHA(ch)) {
-        return s;
-      }
-
-      if (ch == ':') {
-        return s_req_schema_slash;
-      }
-
-      break;
-
-    case s_req_schema_slash:
-      if (ch == '/') {
-        return s_req_schema_slash_slash;
-      }
-
-      break;
-
-    case s_req_schema_slash_slash:
-      if (ch == '/') {
-        return s_req_server_start;
-      }
-
-      break;
-
-    case s_req_server_with_at:
-      if (ch == '@') {
-        return s_dead;
-      }
-
-    /* FALLTHROUGH */
-    case s_req_server_start:
-    case s_req_server:
-      if (ch == '/') {
-        return s_req_path;
-      }
-
-      if (ch == '?') {
-        return s_req_query_string_start;
-      }
-
-      if (ch == '@') {
-        return s_req_server_with_at;
-      }
-
-      if (CROW_IS_USERINFO_CHAR(ch) || ch == '[' || ch == ']') {
-        return s_req_server;
-      }
-
-      break;
-
-    case s_req_path:
-      if (CROW_IS_URL_CHAR(ch)) {
-        return s;
-      }
-
-      switch (ch) {
-        case '?':
-          return s_req_query_string_start;
-
-        case '#':
-          return s_req_fragment_start;
-      }
-
-      break;
-
-    case s_req_query_string_start:
-    case s_req_query_string:
-      if (CROW_IS_URL_CHAR(ch)) {
-        return s_req_query_string;
-      }
-
-      switch (ch) {
-        case '?':
-          /* allow extra '?' in query string */
-          return s_req_query_string;
-
-        case '#':
-          return s_req_fragment_start;
-      }
-
-      break;
-
-    case s_req_fragment_start:
-      if (CROW_IS_URL_CHAR(ch)) {
-        return s_req_fragment;
-      }
-
-      switch (ch) {
-        case '?':
-          return s_req_fragment;
-
-        case '#':
-          return s;
-      }
-
-      break;
-
-    case s_req_fragment:
-      if (CROW_IS_URL_CHAR(ch)) {
-        return s;
-      }
-
-      switch (ch) {
-        case '?':
-        case '#':
-          return s;
-      }
-
-      break;
-
-    default:
-      break;
-  }
-
-  /* We should never fall out of the switch above unless there's an error */
-  return s_dead;
-}
-
-inline size_t http_parser_execute(http_parser *parser,
-                                  const http_parser_settings *settings,
-                                  const char *data, size_t len) {
-  static const char *method_strings[] = {
-#define CROW_XX(num, name, string) #string,
-      CROW_HTTP_METHOD_MAP(CROW_XX)
-#undef CROW_XX
-  };
-
-  /* Tokens as defined by rfc 2616. Also lowercases them.
-   *        token       = 1*<any CHAR except CTLs or separators>
-   *     separators     = "(" | ")" | "<" | ">" | "@"
-   *                    | "," | ";" | ":" | "\" | <">
-   *                    | "/" | "[" | "]" | "?" | "="
-   *                    | "{" | "}" | SP | HT
-   */
-  static const char tokens[256] = {
-      /*   0 nul    1 soh    2 stx    3 etx    4 eot    5 enq
-         6 ack    7 bel  */
-      0, 0, 0, 0, 0, 0, 0, 0,
-      /*   8 bs     9 ht    10 nl    11 vt    12 np    13 cr
-         14 so    15 si   */
-      0, 0, 0, 0, 0, 0, 0, 0,
-      /*  16 dle   17 dc1   18 dc2   19 dc3   20 dc4   21 nak
-         22 syn   23 etb */
-      0, 0, 0, 0, 0, 0, 0, 0,
-      /*  24 can   25 em    26 sub   27 esc   28 fs    29 gs
-         30 rs    31 us  */
-      0, 0, 0, 0, 0, 0, 0, 0,
-      /*  32 sp    33  !    34  "    35  #    36  $    37  %
-         38  &    39  '  */
-      0, '!', 0, '#', '$', '%', '&', '\'',
-      /*  40  (    41  )    42  *    43  +    44  ,    45  -
-         46  .    47  /  */
-      0, 0, '*', '+', 0, '-', '.', 0,
-      /*  48  0    49  1    50  2    51  3    52  4    53  5
-         54  6    55  7  */
-      '0', '1', '2', '3', '4', '5', '6', '7',
-      /*  56  8    57  9    58  :    59  ;    60  <    61  =
-         62  >    63  ?  */
-      '8', '9', 0, 0, 0, 0, 0, 0,
-      /*  64  @    65  A    66  B    67  C    68  D    69  E
-         70  F    71  G  */
-      0, 'a', 'b', 'c', 'd', 'e', 'f', 'g',
-      /*  72  H    73  I    74  J    75  K    76  L    77  M
-         78  N    79  O  */
-      'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
-      /*  80  P    81  Q    82  R    83  S    84  T    85  U
-         86  V    87  W  */
-      'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
-      /*  88  X    89  Y    90  Z    91  [    92  \    93  ]
-         94  ^    95  _  */
-      'x', 'y', 'z', 0, 0, 0, '^', '_',
-      /*  96  `    97  a    98  b    99  c   100  d   101  e
-         102  f   103  g  */
-      '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
-      /* 104  h   105  i   106  j   107  k   108  l   109  m
-         110  n   111  o  */
-      'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
-      /* 112  p   113  q   114  r   115  s   116  t   117  u
-         118  v   119  w  */
-      'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
-      /* 120  x   121  y   122  z   123  {   124  |   125  }
-         126  ~   127 del */
-      'x', 'y', 'z', 0, '|', 0, '~', 0};
-
-  static const int8_t unhex[256] = {
-      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-      0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  -1, -1, -1, -1, -1, -1,
-      -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-      -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
-
-  char c, ch;
-  int8_t unhex_val;
-  const char *p = data;
-  const char *header_field_mark = 0;
-  const char *header_value_mark = 0;
-  const char *url_mark = 0;
-  const char *body_mark = 0;
-  const char *status_mark = 0;
-
-  /* We're in an error state. Don't bother doing anything. */
-  if (CROW_HTTP_PARSER_ERRNO(parser) != HPE_OK) {
-    return 0;
-  }
-
-  if (len == 0) {
-    switch (parser->state) {
-      case s_body_identity_eof:
-        /* Use of CROW_CALLBACK_NOTIFY() here would erroneously return 1 byte
-         * read if
-         * we got paused.
-         */
-        CROW_CALLBACK_NOTIFY_NOADVANCE(message_complete);
-        return 0;
-
-      case s_dead:
-      case s_start_req_or_res:
-      case s_start_res:
-      case s_start_req:
-        return 0;
-
-      default:
-        CROW_SET_ERRNO(HPE_INVALID_EOF_STATE);
-        return 1;
-    }
-  }
-
-  if (parser->state == s_header_field) {
-    header_field_mark = data;
-  }
-  if (parser->state == s_header_value) {
-    header_value_mark = data;
-  }
-  switch (parser->state) {
-    case s_req_path:
-    case s_req_schema:
-    case s_req_schema_slash:
-    case s_req_schema_slash_slash:
-    case s_req_server_start:
-    case s_req_server:
-    case s_req_server_with_at:
-    case s_req_query_string_start:
-    case s_req_query_string:
-    case s_req_fragment_start:
-    case s_req_fragment:
-      url_mark = data;
-      break;
-    case s_res_status:
-      status_mark = data;
-      break;
-  }
-
-  for (p = data; p != data + len; p++) {
-    ch = *p;
-
-    if (CROW_PARSING_HEADER(parser->state)) {
-      ++parser->nread;
-      /* Don't allow the total size of the HTTP headers (including the status
-       * line) to exceed CROW_HTTP_MAX_HEADER_SIZE.  This check is here to
-       * protect
-       * embedders against denial-of-service attacks where the attacker feeds
-       * us a never-ending header that the embedder keeps buffering.
-       *
-       * This check is arguably the responsibility of embedders but we're doing
-       * it on the embedder's behalf because most won't bother and this way we
-       * make the web a little safer.  CROW_HTTP_MAX_HEADER_SIZE is still far
-       * bigger
-       * than any reasonable request or response so this should never affect
-       * day-to-day operation.
-       */
-      if (parser->nread > (CROW_HTTP_MAX_HEADER_SIZE)) {
-        CROW_SET_ERRNO(HPE_HEADER_OVERFLOW);
-        goto error;
-      }
-    }
-
-  reexecute_byte:
-    switch (parser->state) {
-      case s_dead:
-        /* this state is used after a 'Connection: close' message
-         * the parser will error out if it reads another message
-         */
-        if (ch == CROW_CR || ch == CROW_LF) {
-          break;
-        }
-
-        CROW_SET_ERRNO(HPE_CLOSED_CONNECTION);
-        goto error;
-
-      case s_start_req_or_res: {
-        if (ch == CROW_CR || ch == CROW_LF) {
-          break;
-        }
-        parser->flags = 0;
-        parser->content_length = CROW_ULLONG_MAX;
-
-        if (ch == 'H') {
-          parser->state = s_res_or_resp_H;
-
-          CROW_CALLBACK_NOTIFY(message_begin);
-        } else {
-          parser->type = HTTP_REQUEST;
-          parser->state = s_start_req;
-          goto reexecute_byte;
-        }
-
-        break;
-      }
-
-      case s_res_or_resp_H:
-        if (ch == 'T') {
-          parser->type = HTTP_RESPONSE;
-          parser->state = s_res_HT;
-        } else {
-          if (ch != 'E') {
-            CROW_SET_ERRNO(HPE_INVALID_CONSTANT);
-            goto error;
-          }
-
-          parser->type = HTTP_REQUEST;
-          parser->method = HTTP_HEAD;
-          parser->index = 2;
-          parser->state = s_req_method;
-        }
-        break;
-
-      case s_start_res: {
-        parser->flags = 0;
-        parser->content_length = CROW_ULLONG_MAX;
-
-        switch (ch) {
-          case 'H':
-            parser->state = s_res_H;
-            break;
-
-          case CROW_CR:
-          case CROW_LF:
-            break;
-
-          default:
-            CROW_SET_ERRNO(HPE_INVALID_CONSTANT);
-            goto error;
-        }
-
-        CROW_CALLBACK_NOTIFY(message_begin);
-        break;
-      }
-
-      case s_res_H:
-        CROW_STRICT_CHECK(ch != 'T');
-        parser->state = s_res_HT;
-        break;
-
-      case s_res_HT:
-        CROW_STRICT_CHECK(ch != 'T');
-        parser->state = s_res_HTT;
-        break;
-
-      case s_res_HTT:
-        CROW_STRICT_CHECK(ch != 'P');
-        parser->state = s_res_HTTP;
-        break;
-
-      case s_res_HTTP:
-        CROW_STRICT_CHECK(ch != '/');
-        parser->state = s_res_first_http_major;
-        break;
-
-      case s_res_first_http_major:
-        if (ch < '0' || ch > '9') {
-          CROW_SET_ERRNO(HPE_INVALID_VERSION);
-          goto error;
-        }
-
-        parser->http_major = ch - '0';
-        parser->state = s_res_http_major;
-        break;
-
-      /* major HTTP version or dot */
-      case s_res_http_major: {
-        if (ch == '.') {
-          parser->state = s_res_first_http_minor;
-          break;
-        }
-
-        if (!CROW_IS_NUM(ch)) {
-          CROW_SET_ERRNO(HPE_INVALID_VERSION);
-          goto error;
-        }
-
-        parser->http_major *= 10;
-        parser->http_major += ch - '0';
-
-        if (parser->http_major > 999) {
-          CROW_SET_ERRNO(HPE_INVALID_VERSION);
-          goto error;
-        }
-
-        break;
-      }
-
-      /* first digit of minor HTTP version */
-      case s_res_first_http_minor:
-        if (!CROW_IS_NUM(ch)) {
-          CROW_SET_ERRNO(HPE_INVALID_VERSION);
-          goto error;
-        }
-
-        parser->http_minor = ch - '0';
-        parser->state = s_res_http_minor;
-        break;
-
-      /* minor HTTP version or end of request line */
-      case s_res_http_minor: {
-        if (ch == ' ') {
-          parser->state = s_res_first_status_code;
-          break;
-        }
-
-        if (!CROW_IS_NUM(ch)) {
-          CROW_SET_ERRNO(HPE_INVALID_VERSION);
-          goto error;
-        }
-
-        parser->http_minor *= 10;
-        parser->http_minor += ch - '0';
-
-        if (parser->http_minor > 999) {
-          CROW_SET_ERRNO(HPE_INVALID_VERSION);
-          goto error;
-        }
-
-        break;
-      }
-
-      case s_res_first_status_code: {
-        if (!CROW_IS_NUM(ch)) {
-          if (ch == ' ') {
-            break;
-          }
-
-          CROW_SET_ERRNO(HPE_INVALID_STATUS);
-          goto error;
-        }
-        parser->status_code = ch - '0';
-        parser->state = s_res_status_code;
-        break;
-      }
-
-      case s_res_status_code: {
-        if (!CROW_IS_NUM(ch)) {
-          switch (ch) {
-            case ' ':
-              parser->state = s_res_status_start;
-              break;
-            case CROW_CR:
-              parser->state = s_res_line_almost_done;
-              break;
-            case CROW_LF:
-              parser->state = s_header_field_start;
-              break;
-            default:
-              CROW_SET_ERRNO(HPE_INVALID_STATUS);
-              goto error;
-          }
-          break;
-        }
-
-        parser->status_code *= 10;
-        parser->status_code += ch - '0';
-
-        if (parser->status_code > 999) {
-          CROW_SET_ERRNO(HPE_INVALID_STATUS);
-          goto error;
-        }
-
-        break;
-      }
-
-      case s_res_status_start: {
-        if (ch == CROW_CR) {
-          parser->state = s_res_line_almost_done;
-          break;
-        }
-
-        if (ch == CROW_LF) {
-          parser->state = s_header_field_start;
-          break;
-        }
-
-        CROW_MARK(status);
-        parser->state = s_res_status;
-        parser->index = 0;
-        break;
-      }
-
-      case s_res_status:
-        if (ch == CROW_CR) {
-          parser->state = s_res_line_almost_done;
-          CROW_CALLBACK_DATA(status);
-          break;
-        }
-
-        if (ch == CROW_LF) {
-          parser->state = s_header_field_start;
-          CROW_CALLBACK_DATA(status);
-          break;
-        }
-
-        break;
-
-      case s_res_line_almost_done:
-        CROW_STRICT_CHECK(ch != CROW_LF);
-        parser->state = s_header_field_start;
-        break;
-
-      case s_start_req: {
-        if (ch == CROW_CR || ch == CROW_LF) {
-          break;
-        }
-        parser->flags = 0;
-        parser->content_length = CROW_ULLONG_MAX;
-
-        if (!CROW_IS_ALPHA(ch)) {
-          CROW_SET_ERRNO(HPE_INVALID_METHOD);
-          goto error;
-        }
-
-        parser->method = (enum http_method)0;
-        parser->index = 1;
-        switch (ch) {
-          case 'C':
-            parser->method = HTTP_CONNECT; /* or COPY, CHECKOUT */
-            break;
-          case 'D':
-            parser->method = HTTP_DELETE;
-            break;
-          case 'G':
-            parser->method = HTTP_GET;
-            break;
-          case 'H':
-            parser->method = HTTP_HEAD;
-            break;
-          case 'L':
-            parser->method = HTTP_LOCK;
-            break;
-          case 'M':
-            parser->method = HTTP_MKCOL; /* or MOVE, MKACTIVITY, MERGE,
-                                            M-SEARCH, MKCALENDAR */
-            break;
-          case 'N':
-            parser->method = HTTP_NOTIFY;
-            break;
-          case 'O':
-            parser->method = HTTP_OPTIONS;
-            break;
-          case 'P':
-            parser->method = HTTP_POST;
-            /* or PROPFIND|PROPPATCH|PUT|PATCH|PURGE */
-            break;
-          case 'R':
-            parser->method = HTTP_REPORT;
-            break;
-          case 'S':
-            parser->method = HTTP_SUBSCRIBE; /* or SEARCH */
-            break;
-          case 'T':
-            parser->method = HTTP_TRACE;
-            break;
-          case 'U':
-            parser->method = HTTP_UNLOCK; /* or UNSUBSCRIBE */
-            break;
-          default:
-            CROW_SET_ERRNO(HPE_INVALID_METHOD);
-            goto error;
-        }
-        parser->state = s_req_method;
-
-        CROW_CALLBACK_NOTIFY(message_begin);
-
-        break;
-      }
-
-      case s_req_method: {
-        const char *matcher;
-        if (ch == '\0') {
-          CROW_SET_ERRNO(HPE_INVALID_METHOD);
-          goto error;
-        }
-
-        matcher = method_strings[parser->method];
-        if (ch == ' ' && matcher[parser->index] == '\0') {
-          parser->state = s_req_spaces_before_url;
-        } else if (ch == matcher[parser->index]) {
-          ; /* nada */
-        } else if (parser->method == HTTP_CONNECT) {
-          if (parser->index == 1 && ch == 'H') {
-            parser->method = HTTP_CHECKOUT;
-          } else if (parser->index == 2 && ch == 'P') {
-            parser->method = HTTP_COPY;
-          } else {
-            CROW_SET_ERRNO(HPE_INVALID_METHOD);
-            goto error;
-          }
-        } else if (parser->method == HTTP_MKCOL) {
-          if (parser->index == 1 && ch == 'O') {
-            parser->method = HTTP_MOVE;
-          } else if (parser->index == 1 && ch == 'E') {
-            parser->method = HTTP_MERGE;
-          } else if (parser->index == 1 && ch == '-') {
-            parser->method = HTTP_MSEARCH;
-          } else if (parser->index == 2 && ch == 'A') {
-            parser->method = HTTP_MKACTIVITY;
-          } else if (parser->index == 3 && ch == 'A') {
-            parser->method = HTTP_MKCALENDAR;
-          } else {
-            CROW_SET_ERRNO(HPE_INVALID_METHOD);
-            goto error;
-          }
-        } else if (parser->method == HTTP_SUBSCRIBE) {
-          if (parser->index == 1 && ch == 'E') {
-            parser->method = HTTP_SEARCH;
-          } else {
-            CROW_SET_ERRNO(HPE_INVALID_METHOD);
-            goto error;
-          }
-        } else if (parser->index == 1 && parser->method == HTTP_POST) {
-          if (ch == 'R') {
-            parser->method = HTTP_PROPFIND; /* or HTTP_PROPPATCH */
-          } else if (ch == 'U') {
-            parser->method = HTTP_PUT; /* or HTTP_PURGE */
-          } else if (ch == 'A') {
-            parser->method = HTTP_PATCH;
-          } else {
-            CROW_SET_ERRNO(HPE_INVALID_METHOD);
-            goto error;
-          }
-        } else if (parser->index == 2) {
-          if (parser->method == HTTP_PUT) {
-            if (ch == 'R') {
-              parser->method = HTTP_PURGE;
-            } else {
-              CROW_SET_ERRNO(HPE_INVALID_METHOD);
-              goto error;
-            }
-          } else if (parser->method == HTTP_UNLOCK) {
-            if (ch == 'S') {
-              parser->method = HTTP_UNSUBSCRIBE;
-            } else {
-              CROW_SET_ERRNO(HPE_INVALID_METHOD);
-              goto error;
-            }
-          } else {
-            CROW_SET_ERRNO(HPE_INVALID_METHOD);
-            goto error;
-          }
-        } else if (parser->index == 4 && parser->method == HTTP_PROPFIND &&
-                   ch == 'P') {
-          parser->method = HTTP_PROPPATCH;
-        } else {
-          CROW_SET_ERRNO(HPE_INVALID_METHOD);
-          goto error;
-        }
-
-        ++parser->index;
-        break;
-      }
-
-      case s_req_spaces_before_url: {
-        if (ch == ' ') {
-          break;
-        }
-
-        CROW_MARK(url);
-        if (parser->method == HTTP_CONNECT) {
-          parser->state = s_req_server_start;
-        }
-
-        parser->state = parse_url_char((enum state)parser->state, ch);
-        if (parser->state == s_dead) {
-          CROW_SET_ERRNO(HPE_INVALID_URL);
-          goto error;
-        }
-
-        break;
-      }
-
-      case s_req_schema:
-      case s_req_schema_slash:
-      case s_req_schema_slash_slash:
-      case s_req_server_start: {
-        switch (ch) {
-          /* No whitespace allowed here */
-          case ' ':
-          case CROW_CR:
-          case CROW_LF:
-            CROW_SET_ERRNO(HPE_INVALID_URL);
-            goto error;
-          default:
-            parser->state = parse_url_char((enum state)parser->state, ch);
-            if (parser->state == s_dead) {
-              CROW_SET_ERRNO(HPE_INVALID_URL);
-              goto error;
-            }
-        }
-
-        break;
-      }
-
-      case s_req_server:
-      case s_req_server_with_at:
-      case s_req_path:
-      case s_req_query_string_start:
-      case s_req_query_string:
-      case s_req_fragment_start:
-      case s_req_fragment: {
-        switch (ch) {
-          case ' ':
-            parser->state = s_req_http_start;
-            CROW_CALLBACK_DATA(url);
-            break;
-          case CROW_CR:
-          case CROW_LF:
-            parser->http_major = 0;
-            parser->http_minor = 9;
-            parser->state =
-                (ch == CROW_CR) ? s_req_line_almost_done : s_header_field_start;
-            CROW_CALLBACK_DATA(url);
-            break;
-          default:
-            parser->state = parse_url_char((enum state)parser->state, ch);
-            if (parser->state == s_dead) {
-              CROW_SET_ERRNO(HPE_INVALID_URL);
-              goto error;
-            }
-        }
-        break;
-      }
-
-      case s_req_http_start:
-        switch (ch) {
-          case 'H':
-            parser->state = s_req_http_H;
-            break;
-          case ' ':
-            break;
-          default:
-            CROW_SET_ERRNO(HPE_INVALID_CONSTANT);
-            goto error;
-        }
-        break;
-
-      case s_req_http_H:
-        CROW_STRICT_CHECK(ch != 'T');
-        parser->state = s_req_http_HT;
-        break;
-
-      case s_req_http_HT:
-        CROW_STRICT_CHECK(ch != 'T');
-        parser->state = s_req_http_HTT;
-        break;
-
-      case s_req_http_HTT:
-        CROW_STRICT_CHECK(ch != 'P');
-        parser->state = s_req_http_HTTP;
-        break;
-
-      case s_req_http_HTTP:
-        CROW_STRICT_CHECK(ch != '/');
-        parser->state = s_req_first_http_major;
-        break;
-
-      /* first digit of major HTTP version */
-      case s_req_first_http_major:
-        if (ch < '1' || ch > '9') {
-          CROW_SET_ERRNO(HPE_INVALID_VERSION);
-          goto error;
-        }
-
-        parser->http_major = ch - '0';
-        parser->state = s_req_http_major;
-        break;
-
-      /* major HTTP version or dot */
-      case s_req_http_major: {
-        if (ch == '.') {
-          parser->state = s_req_first_http_minor;
-          break;
-        }
-
-        if (!CROW_IS_NUM(ch)) {
-          CROW_SET_ERRNO(HPE_INVALID_VERSION);
-          goto error;
-        }
-
-        parser->http_major *= 10;
-        parser->http_major += ch - '0';
-
-        if (parser->http_major > 999) {
-          CROW_SET_ERRNO(HPE_INVALID_VERSION);
-          goto error;
-        }
-
-        break;
-      }
-
-      /* first digit of minor HTTP version */
-      case s_req_first_http_minor:
-        if (!CROW_IS_NUM(ch)) {
-          CROW_SET_ERRNO(HPE_INVALID_VERSION);
-          goto error;
-        }
-
-        parser->http_minor = ch - '0';
-        parser->state = s_req_http_minor;
-        break;
-
-      /* minor HTTP version or end of request line */
-      case s_req_http_minor: {
-        if (ch == CROW_CR) {
-          parser->state = s_req_line_almost_done;
-          break;
-        }
-
-        if (ch == CROW_LF) {
-          parser->state = s_header_field_start;
-          break;
-        }
-
-        /* XXX allow spaces after digit? */
-
-        if (!CROW_IS_NUM(ch)) {
-          CROW_SET_ERRNO(HPE_INVALID_VERSION);
-          goto error;
-        }
-
-        parser->http_minor *= 10;
-        parser->http_minor += ch - '0';
-
-        if (parser->http_minor > 999) {
-          CROW_SET_ERRNO(HPE_INVALID_VERSION);
-          goto error;
-        }
-
-        break;
-      }
-
-      /* end of request line */
-      case s_req_line_almost_done: {
-        if (ch != CROW_LF) {
-          CROW_SET_ERRNO(HPE_LF_EXPECTED);
-          goto error;
-        }
-
-        parser->state = s_header_field_start;
-        break;
-      }
-
-      case s_header_field_start: {
-        if (ch == CROW_CR) {
-          parser->state = s_headers_almost_done;
-          break;
-        }
-
-        if (ch == CROW_LF) {
-          /* they might be just sending \n instead of \r\n so this would be
-           * the second \n to denote the end of headers*/
-          parser->state = s_headers_almost_done;
-          goto reexecute_byte;
-        }
-
-        c = CROW_TOKEN(ch);
-
-        if (c == 0) {
-          CROW_SET_ERRNO(HPE_INVALID_HEADER_TOKEN);
-          goto error;
-        }
-
-        CROW_MARK(header_field);
-
-        parser->index = 0;
-        parser->state = s_header_field;
-
-        switch (c) {
-          case 'c':
-            parser->header_state = h_C;
-            break;
-
-          case 'p':
-            parser->header_state = h_matching_proxy_connection;
-            break;
-
-          case 't':
-            parser->header_state = h_matching_transfer_encoding;
-            break;
-
-          case 'u':
-            parser->header_state = h_matching_upgrade;
-            break;
-
-          default:
-            parser->header_state = h_general;
-            break;
-        }
-        break;
-      }
-
-      case s_header_field: {
-        c = CROW_TOKEN(ch);
-
-        if (c != 0) {
-          switch (parser->header_state) {
-            case h_general:
-              break;
-
-            case h_C:
-              parser->index++;
-              parser->header_state = (c == 'o' ? h_CO : h_general);
-              break;
-
-            case h_CO:
-              parser->index++;
-              parser->header_state = (c == 'n' ? h_CON : h_general);
-              break;
-
-            case h_CON:
-              parser->index++;
-              switch (c) {
-                case 'n':
-                  parser->header_state = h_matching_connection;
-                  break;
-                case 't':
-                  parser->header_state = h_matching_content_length;
-                  break;
-                default:
-                  parser->header_state = h_general;
-                  break;
-              }
-              break;
-
-            /* connection */
-
-            case h_matching_connection:
-              parser->index++;
-              if (parser->index > sizeof(CROW_CONNECTION) - 1 ||
-                  c != CROW_CONNECTION[parser->index]) {
-                parser->header_state = h_general;
-              } else if (parser->index == sizeof(CROW_CONNECTION) - 2) {
-                parser->header_state = h_connection;
-              }
-              break;
-
-            /* proxy-connection */
-
-            case h_matching_proxy_connection:
-              parser->index++;
-              if (parser->index > sizeof(CROW_PROXY_CONNECTION) - 1 ||
-                  c != CROW_PROXY_CONNECTION[parser->index]) {
-                parser->header_state = h_general;
-              } else if (parser->index == sizeof(CROW_PROXY_CONNECTION) - 2) {
-                parser->header_state = h_connection;
-              }
-              break;
-
-            /* content-length */
-
-            case h_matching_content_length:
-              parser->index++;
-              if (parser->index > sizeof(CROW_CONTENT_LENGTH) - 1 ||
-                  c != CROW_CONTENT_LENGTH[parser->index]) {
-                parser->header_state = h_general;
-              } else if (parser->index == sizeof(CROW_CONTENT_LENGTH) - 2) {
-                parser->header_state = h_content_length;
-              }
-              break;
-
-            /* transfer-encoding */
-
-            case h_matching_transfer_encoding:
-              parser->index++;
-              if (parser->index > sizeof(CROW_TRANSFER_ENCODING) - 1 ||
-                  c != CROW_TRANSFER_ENCODING[parser->index]) {
-                parser->header_state = h_general;
-              } else if (parser->index == sizeof(CROW_TRANSFER_ENCODING) - 2) {
-                parser->header_state = h_transfer_encoding;
-              }
-              break;
-
-            /* upgrade */
-
-            case h_matching_upgrade:
-              parser->index++;
-              if (parser->index > sizeof(CROW_UPGRADE) - 1 ||
-                  c != CROW_UPGRADE[parser->index]) {
-                parser->header_state = h_general;
-              } else if (parser->index == sizeof(CROW_UPGRADE) - 2) {
-                parser->header_state = h_upgrade;
-              }
-              break;
-
-            case h_connection:
-            case h_content_length:
-            case h_transfer_encoding:
-            case h_upgrade:
-              if (ch != ' ') {
-                parser->header_state = h_general;
-              }
-              break;
-
-            default:
-              assert(0 && "Unknown header_state");
-              break;
-          }
-          break;
-        }
-
-        if (ch == ':') {
-          parser->state = s_header_value_discard_ws;
-          CROW_CALLBACK_DATA(header_field);
-          break;
-        }
-
-        if (ch == CROW_CR) {
-          parser->state = s_header_almost_done;
-          CROW_CALLBACK_DATA(header_field);
-          break;
-        }
-
-        if (ch == CROW_LF) {
-          parser->state = s_header_field_start;
-          CROW_CALLBACK_DATA(header_field);
-          break;
-        }
-
-        CROW_SET_ERRNO(HPE_INVALID_HEADER_TOKEN);
-        goto error;
-      }
-
-      case s_header_value_discard_ws:
-        if (ch == ' ' || ch == '\t') {
-          break;
-        }
-
-        if (ch == CROW_CR) {
-          parser->state = s_header_value_discard_ws_almost_done;
-          break;
-        }
-
-        if (ch == CROW_LF) {
-          parser->state = s_header_value_discard_lws;
-          break;
-        }
-
-      /* FALLTHROUGH */
-
-      case s_header_value_start: {
-        CROW_MARK(header_value);
-
-        parser->state = s_header_value;
-        parser->index = 0;
-
-        c = CROW_LOWER(ch);
-
-        switch (parser->header_state) {
-          case h_upgrade:
-            parser->flags |= F_UPGRADE;
-            parser->header_state = h_general;
-            break;
-
-          case h_transfer_encoding:
-            /* looking for 'Transfer-Encoding: chunked' */
-            if ('c' == c) {
-              parser->header_state = h_matching_transfer_encoding_chunked;
-            } else {
-              parser->header_state = h_general;
-            }
-            break;
-
-          case h_content_length:
-            if (!CROW_IS_NUM(ch)) {
-              CROW_SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);
-              goto error;
-            }
-
-            parser->content_length = ch - '0';
-            break;
-
-          case h_connection:
-            /* looking for 'Connection: keep-alive' */
-            if (c == 'k') {
-              parser->header_state = h_matching_connection_keep_alive;
-              /* looking for 'Connection: close' */
-            } else if (c == 'c') {
-              parser->header_state = h_matching_connection_close;
-            } else {
-              parser->header_state = h_general;
-            }
-            break;
-
-          default:
-            parser->header_state = h_general;
-            break;
-        }
-        break;
-      }
-
-      case s_header_value: {
-        if (ch == CROW_CR) {
-          parser->state = s_header_almost_done;
-          CROW_CALLBACK_DATA(header_value);
-          break;
-        }
-
-        if (ch == CROW_LF) {
-          parser->state = s_header_almost_done;
-          CROW_CALLBACK_DATA_NOADVANCE(header_value);
-          goto reexecute_byte;
-        }
-
-        c = CROW_LOWER(ch);
-
-        switch (parser->header_state) {
-          case h_general:
-            break;
-
-          case h_connection:
-          case h_transfer_encoding:
-            assert(0 && "Shouldn't get here.");
-            break;
-
-          case h_content_length: {
-            uint64_t t;
-
-            if (ch == ' ') {
-              break;
-            }
-
-            if (!CROW_IS_NUM(ch)) {
-              CROW_SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);
-              goto error;
-            }
-
-            t = parser->content_length;
-            t *= 10;
-            t += ch - '0';
-
-            /* Overflow? Test against a conservative limit for simplicity. */
-            if ((CROW_ULLONG_MAX - 10) / 10 < parser->content_length) {
-              CROW_SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);
-              goto error;
-            }
-
-            parser->content_length = t;
-            break;
-          }
-
-          /* Transfer-Encoding: chunked */
-          case h_matching_transfer_encoding_chunked:
-            parser->index++;
-            if (parser->index > sizeof(CROW_CHUNKED) - 1 ||
-                c != CROW_CHUNKED[parser->index]) {
-              parser->header_state = h_general;
-            } else if (parser->index == sizeof(CROW_CHUNKED) - 2) {
-              parser->header_state = h_transfer_encoding_chunked;
-            }
-            break;
-
-          /* looking for 'Connection: keep-alive' */
-          case h_matching_connection_keep_alive:
-            parser->index++;
-            if (parser->index > sizeof(CROW_KEEP_ALIVE) - 1 ||
-                c != CROW_KEEP_ALIVE[parser->index]) {
-              parser->header_state = h_general;
-            } else if (parser->index == sizeof(CROW_KEEP_ALIVE) - 2) {
-              parser->header_state = h_connection_keep_alive;
-            }
-            break;
-
-          /* looking for 'Connection: close' */
-          case h_matching_connection_close:
-            parser->index++;
-            if (parser->index > sizeof(CROW_CLOSE) - 1 ||
-                c != CROW_CLOSE[parser->index]) {
-              parser->header_state = h_general;
-            } else if (parser->index == sizeof(CROW_CLOSE) - 2) {
-              parser->header_state = h_connection_close;
-            }
-            break;
-
-          case h_transfer_encoding_chunked:
-          case h_connection_keep_alive:
-          case h_connection_close:
-            if (ch != ' ') {
-              parser->header_state = h_general;
-            }
-            break;
-
-          default:
-            parser->state = s_header_value;
-            parser->header_state = h_general;
-            break;
-        }
-        break;
-      }
-
-      case s_header_almost_done: {
-        CROW_STRICT_CHECK(ch != CROW_LF);
-
-        parser->state = s_header_value_lws;
-        break;
-      }
-
-      case s_header_value_lws: {
-        if (ch == ' ' || ch == '\t') {
-          parser->state = s_header_value_start;
-          goto reexecute_byte;
-        }
-
-        /* finished the header */
-        switch (parser->header_state) {
-          case h_connection_keep_alive:
-            parser->flags |= F_CONNECTION_KEEP_ALIVE;
-            break;
-          case h_connection_close:
-            parser->flags |= F_CONNECTION_CLOSE;
-            break;
-          case h_transfer_encoding_chunked:
-            parser->flags |= F_CHUNKED;
-            break;
-          default:
-            break;
-        }
-
-        parser->state = s_header_field_start;
-        goto reexecute_byte;
-      }
-
-      case s_header_value_discard_ws_almost_done: {
-        CROW_STRICT_CHECK(ch != CROW_LF);
-        parser->state = s_header_value_discard_lws;
-        break;
-      }
-
-      case s_header_value_discard_lws: {
-        if (ch == ' ' || ch == '\t') {
-          parser->state = s_header_value_discard_ws;
-          break;
-        }
-        /* header value was empty */
-        CROW_MARK(header_value);
-        parser->state = s_header_field_start;
-        CROW_CALLBACK_DATA_NOADVANCE(header_value);
-        goto reexecute_byte;
-      }
-
-      case s_headers_almost_done: {
-        CROW_STRICT_CHECK(ch != CROW_LF);
-
-        if ((parser->flags & F_TRAILING) != 0) {
-          /* End of a chunked request */
-          parser->state = CROW_NEW_MESSAGE();
-          CROW_CALLBACK_NOTIFY(message_complete);
-          break;
-        }
-
-        parser->state = s_headers_done;
-
-        /* Set this here so that on_headers_complete() callbacks can see it */
-        parser->upgrade =
-            static_cast<unsigned int>(((parser->flags & F_UPGRADE) != 0) ||
-                                      parser->method == HTTP_CONNECT);
-
-        /* Here we call the headers_complete callback. This is somewhat
-         * different than other callbacks because if the user returns 1, we
-         * will interpret that as saying that this message has no body. This
-         * is needed for the annoying case of recieving a response to a HEAD
-         * request.
-         *
-         * We'd like to use CROW_CALLBACK_NOTIFY_NOADVANCE() here but we cannot,
-         * so
-         * we have to simulate it by handling a change in errno below.
-         */
-        if (settings->on_headers_complete != nullptr) {
-          switch (settings->on_headers_complete(parser)) {
-            case 0:
-              break;
-
-            case 1:
-              parser->flags |= F_SKIPBODY;
-              break;
-
-            default:
-              CROW_SET_ERRNO(HPE_CB_headers_complete);
-              return p - data; /* Error */
-          }
-        }
-
-        if (CROW_HTTP_PARSER_ERRNO(parser) != HPE_OK) {
-          return p - data;
-        }
-
-        goto reexecute_byte;
-      }
-
-      case s_headers_done: {
-        CROW_STRICT_CHECK(ch != CROW_LF);
-
-        parser->nread = 0;
-
-        /* Exit, the rest of the connect is in a different protocol. */
-        if (parser->upgrade != 0u) {
-          parser->state = CROW_NEW_MESSAGE();
-          CROW_CALLBACK_NOTIFY(message_complete);
-          return (p - data) + 1;
-        }
-
-        if ((parser->flags & F_SKIPBODY) != 0) {
-          parser->state = CROW_NEW_MESSAGE();
-          CROW_CALLBACK_NOTIFY(message_complete);
-        } else if ((parser->flags & F_CHUNKED) != 0) {
-          /* chunked encoding - ignore Content-Length header */
-          parser->state = s_chunk_size_start;
-        } else {
-          if (parser->content_length == 0) {
-            /* Content-Length header given but zero: Content-Length: 0\r\n */
-            parser->state = CROW_NEW_MESSAGE();
-            CROW_CALLBACK_NOTIFY(message_complete);
-          } else if (parser->content_length != CROW_ULLONG_MAX) {
-            /* Content-Length header given and non-zero */
-            parser->state = s_body_identity;
-          } else {
-            if (parser->type == HTTP_REQUEST ||
-                (http_message_needs_eof(parser) == 0)) {
-              /* Assume content-length 0 - read the next */
-              parser->state = CROW_NEW_MESSAGE();
-              CROW_CALLBACK_NOTIFY(message_complete);
-            } else {
-              /* Read body until EOF */
-              parser->state = s_body_identity_eof;
-            }
-          }
-        }
-
-        break;
-      }
-
-      case s_body_identity: {
-        uint64_t to_read =
-            CROW_MIN(parser->content_length, (uint64_t)((data + len) - p));
-
-        assert(parser->content_length != 0 &&
-               parser->content_length != CROW_ULLONG_MAX);
-
-        /* The difference between advancing content_length and p is because
-         * the latter will automaticaly advance on the next loop iteration.
-         * Further, if content_length ends up at 0, we want to see the last
-         * byte again for our message complete callback.
-         */
-        CROW_MARK(body);
-        parser->content_length -= to_read;
-        p += to_read - 1;
-
-        if (parser->content_length == 0) {
-          parser->state = s_message_done;
-
-          /* Mimic CROW_CALLBACK_DATA_NOADVANCE() but with one extra byte.
-           *
-           * The alternative to doing this is to wait for the next byte to
-           * trigger the data callback, just as in every other case. The
-           * problem with this is that this makes it difficult for the test
-           * harness to distinguish between complete-on-EOF and
-           * complete-on-length. It's not clear that this distinction is
-           * important for applications, but let's keep it for now.
-           */
-          CROW_CALLBACK_DATA_(body, p - body_mark + 1, p - data);
-          goto reexecute_byte;
-        }
-
-        break;
-      }
-
-      /* read until EOF */
-      case s_body_identity_eof:
-        CROW_MARK(body);
-        p = data + len - 1;
-
-        break;
-
-      case s_message_done:
-        parser->state = CROW_NEW_MESSAGE();
-        CROW_CALLBACK_NOTIFY(message_complete);
-        break;
-
-      case s_chunk_size_start: {
-        assert(parser->nread == 1);
-        assert(parser->flags & F_CHUNKED);
-
-        unhex_val = unhex[(unsigned char)ch];
-        if (unhex_val == -1) {
-          CROW_SET_ERRNO(HPE_INVALID_CHUNK_SIZE);
-          goto error;
-        }
-
-        parser->content_length = unhex_val;
-        parser->state = s_chunk_size;
-        break;
-      }
-
-      case s_chunk_size: {
-        uint64_t t;
-
-        assert(parser->flags & F_CHUNKED);
-
-        if (ch == CROW_CR) {
-          parser->state = s_chunk_size_almost_done;
-          break;
-        }
-
-        unhex_val = unhex[(unsigned char)ch];
-
-        if (unhex_val == -1) {
-          if (ch == ';' || ch == ' ') {
-            parser->state = s_chunk_parameters;
-            break;
-          }
-
-          CROW_SET_ERRNO(HPE_INVALID_CHUNK_SIZE);
-          goto error;
-        }
-
-        t = parser->content_length;
-        t *= 16;
-        t += unhex_val;
-
-        /* Overflow? Test against a conservative limit for simplicity. */
-        if ((CROW_ULLONG_MAX - 16) / 16 < parser->content_length) {
-          CROW_SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);
-          goto error;
-        }
-
-        parser->content_length = t;
-        break;
-      }
-
-      case s_chunk_parameters: {
-        assert(parser->flags & F_CHUNKED);
-        /* just ignore this shit. TODO check for overflow */
-        if (ch == CROW_CR) {
-          parser->state = s_chunk_size_almost_done;
-          break;
-        }
-        break;
-      }
-
-      case s_chunk_size_almost_done: {
-        assert(parser->flags & F_CHUNKED);
-        CROW_STRICT_CHECK(ch != CROW_LF);
-
-        parser->nread = 0;
-
-        if (parser->content_length == 0) {
-          parser->flags |= F_TRAILING;
-          parser->state = s_header_field_start;
-        } else {
-          parser->state = s_chunk_data;
-        }
-        break;
-      }
-
-      case s_chunk_data: {
-        uint64_t to_read =
-            CROW_MIN(parser->content_length, (uint64_t)((data + len) - p));
-
-        assert(parser->flags & F_CHUNKED);
-        assert(parser->content_length != 0 &&
-               parser->content_length != CROW_ULLONG_MAX);
-
-        /* See the explanation in s_body_identity for why the content
-         * length and data pointers are managed this way.
-         */
-        CROW_MARK(body);
-        parser->content_length -= to_read;
-        p += to_read - 1;
-
-        if (parser->content_length == 0) {
-          parser->state = s_chunk_data_almost_done;
-        }
-
-        break;
-      }
-
-      case s_chunk_data_almost_done:
-        assert(parser->flags & F_CHUNKED);
-        assert(parser->content_length == 0);
-        CROW_STRICT_CHECK(ch != CROW_CR);
-        parser->state = s_chunk_data_done;
-        CROW_CALLBACK_DATA(body);
-        break;
-
-      case s_chunk_data_done:
-        assert(parser->flags & F_CHUNKED);
-        CROW_STRICT_CHECK(ch != CROW_LF);
-        parser->nread = 0;
-        parser->state = s_chunk_size_start;
-        break;
-
-      default:
-        assert(0 && "unhandled state");
-        CROW_SET_ERRNO(HPE_INVALID_INTERNAL_STATE);
-        goto error;
-    }
-  }
-
-  /* Run callbacks for any marks that we have leftover after we ran our of
-   * bytes. There should be at most one of these set, so it's OK to invoke
-   * them in series (unset marks will not result in callbacks).
-   *
-   * We use the NOADVANCE() variety of callbacks here because 'p' has already
-   * overflowed 'data' and this allows us to correct for the off-by-one that
-   * we'd otherwise have (since CROW_CALLBACK_DATA() is meant to be run with a
-   * 'p'
-   * value that's in-bounds).
-   */
-
-  assert(((header_field_mark ? 1 : 0) + (header_value_mark ? 1 : 0) +
-          (url_mark ? 1 : 0) + (body_mark ? 1 : 0) + (status_mark ? 1 : 0)) <=
-         1);
-
-  CROW_CALLBACK_DATA_NOADVANCE(header_field);
-  CROW_CALLBACK_DATA_NOADVANCE(header_value);
-  CROW_CALLBACK_DATA_NOADVANCE(url);
-  CROW_CALLBACK_DATA_NOADVANCE(body);
-  CROW_CALLBACK_DATA_NOADVANCE(status);
-
-  return len;
-
-error:
-  if (CROW_HTTP_PARSER_ERRNO(parser) == HPE_OK) {
-    CROW_SET_ERRNO(HPE_UNKNOWN);
-  }
-
-  return (p - data);
-}
-
-/* Does the parser need to see an EOF to find the end of the message? */
-inline int http_message_needs_eof(const http_parser *parser) {
-  if (parser->type == HTTP_REQUEST) {
-    return 0;
-  }
-
-  /* See RFC 2616 section 4.4 */
-  if (parser->status_code / 100 == 1 ||      /* 1xx e.g. Continue */
-      parser->status_code == 204 ||          /* No Content */
-      parser->status_code == 304 ||          /* Not Modified */
-      ((parser->flags & F_SKIPBODY) != 0)) { /* response to a HEAD request */
-    return 0;
-  }
-
-  if (((parser->flags & F_CHUNKED) != 0) ||
-      parser->content_length != CROW_ULLONG_MAX) {
-    return 0;
-  }
-
-  return 1;
-}
-
-inline int http_should_keep_alive(const http_parser *parser) {
-  if (parser->http_major > 0 && parser->http_minor > 0) {
-    /* HTTP/1.1 */
-    if ((parser->flags & F_CONNECTION_CLOSE) != 0) {
-      return 0;
-    }
-  } else {
-    /* HTTP/1.0 or earlier */
-    if ((parser->flags & F_CONNECTION_KEEP_ALIVE) == 0) {
-      return 0;
-    }
-  }
-
-  return !http_message_needs_eof(parser);
-}
-
-inline const char *http_method_str(enum http_method m) {
-  static const char *method_strings[] = {
-#define CROW_XX(num, name, string) #string,
-      CROW_HTTP_METHOD_MAP(CROW_XX)
-#undef CROW_XX
-  };
-  return CROW_ELEM_AT(method_strings, m, "<unknown>");
-}
-
-inline void http_parser_init(http_parser *parser, enum http_parser_type type) {
-  void *data = parser->data; /* preserve application data */
-  memset(parser, 0, sizeof(*parser));
-  parser->data = data;
-  parser->type = type;
-  parser->state =
-      (type == HTTP_REQUEST
-           ? s_start_req
-           : (type == HTTP_RESPONSE ? s_start_res : s_start_req_or_res));
-  parser->http_errno = HPE_OK;
-}
-
-inline const char *http_errno_name(enum http_errno err) {
-/* Map errno values to strings for human-readable output */
-#define CROW_HTTP_STRERROR_GEN(n, s) {"HPE_" #n, s},
-  static struct {
-    const char *name;
-    const char *description;
-  } http_strerror_tab[] = {CROW_HTTP_ERRNO_MAP(CROW_HTTP_STRERROR_GEN)};
-#undef CROW_HTTP_STRERROR_GEN
-  assert(err < (sizeof(http_strerror_tab) / sizeof(http_strerror_tab[0])));
-  return http_strerror_tab[err].name;
-}
-
-inline const char *http_errno_description(enum http_errno err) {
-/* Map errno values to strings for human-readable output */
-#define CROW_HTTP_STRERROR_GEN(n, s) {"HPE_" #n, s},
-  static struct {
-    const char *name;
-    const char *description;
-  } http_strerror_tab[] = {CROW_HTTP_ERRNO_MAP(CROW_HTTP_STRERROR_GEN)};
-#undef CROW_HTTP_STRERROR_GEN
-  assert(err < (sizeof(http_strerror_tab) / sizeof(http_strerror_tab[0])));
-  return http_strerror_tab[err].description;
-}
-
-inline static enum http_host_state http_parse_host_char(enum http_host_state s,
-                                                        const char ch) {
-  switch (s) {
-    case s_http_userinfo:
-    case s_http_userinfo_start:
-      if (ch == '@') {
-        return s_http_host_start;
-      }
-
-      if (CROW_IS_USERINFO_CHAR(ch)) {
-        return s_http_userinfo;
-      }
-      break;
-
-    case s_http_host_start:
-      if (ch == '[') {
-        return s_http_host_v6_start;
-      }
-
-      if (CROW_IS_HOST_CHAR(ch)) {
-        return s_http_host;
-      }
-
-      break;
-
-    case s_http_host:
-      if (CROW_IS_HOST_CHAR(ch)) {
-        return s_http_host;
-      }
-
-    /* FALLTHROUGH */
-    case s_http_host_v6_end:
-      if (ch == ':') {
-        return s_http_host_port_start;
-      }
-
-      break;
-
-    case s_http_host_v6:
-      if (ch == ']') {
-        return s_http_host_v6_end;
-      }
-
-    /* FALLTHROUGH */
-    case s_http_host_v6_start:
-      if (CROW_IS_HEX(ch) || ch == ':' || ch == '.') {
-        return s_http_host_v6;
-      }
-
-      break;
-
-    case s_http_host_port:
-    case s_http_host_port_start:
-      if (CROW_IS_NUM(ch)) {
-        return s_http_host_port;
-      }
-
-      break;
-
-    default:
-      break;
-  }
-  return s_http_host_dead;
-}
-
-inline int http_parse_host(const char *buf, struct http_parser_url *u,
-                           int found_at) {
-  enum http_host_state s;
-
-  const char *p;
-  size_t buflen = u->field_data[UF_HOST].off + u->field_data[UF_HOST].len;
-
-  u->field_data[UF_HOST].len = 0;
-
-  s = found_at != 0 ? s_http_userinfo_start : s_http_host_start;
-
-  for (p = buf + u->field_data[UF_HOST].off; p < buf + buflen; p++) {
-    enum http_host_state new_s = http_parse_host_char(s, *p);
-
-    if (new_s == s_http_host_dead) {
-      return 1;
-    }
-
-    switch (new_s) {
-      case s_http_host:
-        if (s != s_http_host) {
-          u->field_data[UF_HOST].off = p - buf;
-        }
-        u->field_data[UF_HOST].len++;
-        break;
-
-      case s_http_host_v6:
-        if (s != s_http_host_v6) {
-          u->field_data[UF_HOST].off = p - buf;
-        }
-        u->field_data[UF_HOST].len++;
-        break;
-
-      case s_http_host_port:
-        if (s != s_http_host_port) {
-          u->field_data[UF_PORT].off = p - buf;
-          u->field_data[UF_PORT].len = 0;
-          u->field_set |= (1 << UF_PORT);
-        }
-        u->field_data[UF_PORT].len++;
-        break;
-
-      case s_http_userinfo:
-        if (s != s_http_userinfo) {
-          u->field_data[UF_USERINFO].off = p - buf;
-          u->field_data[UF_USERINFO].len = 0;
-          u->field_set |= (1 << UF_USERINFO);
-        }
-        u->field_data[UF_USERINFO].len++;
-        break;
-
-      default:
-        break;
-    }
-    s = new_s;
-  }
-
-  /* Make sure we don't end somewhere unexpected */
-  switch (s) {
-    case s_http_host_start:
-    case s_http_host_v6_start:
-    case s_http_host_v6:
-    case s_http_host_port_start:
-    case s_http_userinfo:
-    case s_http_userinfo_start:
-      return 1;
-    default:
-      break;
-  }
-
-  return 0;
-}
-
-inline int http_parser_parse_url(const char *buf, size_t buflen, int is_connect,
-                                 struct http_parser_url *u) {
-  enum state s;
-  const char *p;
-  enum http_parser_url_fields uf, old_uf;
-  int found_at = 0;
-
-  u->port = u->field_set = 0;
-  s = is_connect != 0 ? s_req_server_start : s_req_spaces_before_url;
-  old_uf = UF_MAX;
-
-  for (p = buf; p < buf + buflen; p++) {
-    s = parse_url_char(s, *p);
-
-    /* Figure out the next field that we're operating on */
-    switch (s) {
-      case s_dead:
-        return 1;
-
-      /* Skip delimeters */
-      case s_req_schema_slash:
-      case s_req_schema_slash_slash:
-      case s_req_server_start:
-      case s_req_query_string_start:
-      case s_req_fragment_start:
-        continue;
-
-      case s_req_schema:
-        uf = UF_SCHEMA;
-        break;
-
-      case s_req_server_with_at:
-        found_at = 1;
-
-      /* FALLTROUGH */
-      case s_req_server:
-        uf = UF_HOST;
-        break;
-
-      case s_req_path:
-        uf = UF_PATH;
-        break;
-
-      case s_req_query_string:
-        uf = UF_QUERY;
-        break;
-
-      case s_req_fragment:
-        uf = UF_FRAGMENT;
-        break;
-
-      default:
-        assert(!"Unexpected state");
-        return 1;
-    }
-
-    /* Nothing's changed; soldier on */
-    if (uf == old_uf) {
-      u->field_data[uf].len++;
-      continue;
-    }
-
-    u->field_data[uf].off = p - buf;
-    u->field_data[uf].len = 1;
-
-    u->field_set |= (1 << uf);
-    old_uf = uf;
-  }
-
-  /* host must be present if there is a schema */
-  /* parsing http:///toto will fail */
-  if ((u->field_set & ((1 << UF_SCHEMA) | (1 << UF_HOST))) != 0) {
-    if (http_parse_host(buf, u, found_at) != 0) {
-      return 1;
-    }
-  }
-
-  /* CONNECT requests can only contain "hostname:port" */
-  if ((is_connect != 0) && u->field_set != ((1 << UF_HOST) | (1 << UF_PORT))) {
-    return 1;
-  }
-
-  if ((u->field_set & (1 << UF_PORT)) != 0) {
-    /* Don't bother with endp; we've already validated the string */
-    unsigned long v = strtoul(buf + u->field_data[UF_PORT].off, NULL, 10);
-
-    /* Ports have a max value of 2^16 */
-    if (v > 0xffff) {
-      return 1;
-    }
-
-    u->port = (uint16_t)v;
-  }
-
-  return 0;
-}
-
-inline void http_parser_pause(http_parser *parser, int paused) {
-  /* Users should only be pausing/unpausing a parser that is not in an error
-   * state. In non-debug builds, there's not much that we can do about this
-   * other than ignore it.
-   */
-  if (CROW_HTTP_PARSER_ERRNO(parser) == HPE_OK ||
-      CROW_HTTP_PARSER_ERRNO(parser) == HPE_PAUSED) {
-    CROW_SET_ERRNO((paused) ? HPE_PAUSED : HPE_OK);
-  } else {
-    assert(0 && "Attempting to pause parser in error state");
-  }
-}
-
-inline int http_body_is_final(const struct http_parser *parser) {
-  return static_cast<int>(parser->state == s_message_done);
-}
-
-inline unsigned long http_parser_version(void) {
-  return CROW_HTTP_PARSER_VERSION_MAJOR * 0x10000 |
-         CROW_HTTP_PARSER_VERSION_MINOR * 0x00100 |
-         CROW_HTTP_PARSER_VERSION_PATCH * 0x00001;
-}
-
-#undef CROW_HTTP_METHOD_MAP
-#undef CROW_HTTP_ERRNO_MAP
-#undef CROW_SET_ERRNO
-#undef CROW_CALLBACK_NOTIFY_
-#undef CROW_CALLBACK_NOTIFY
-#undef CROW_CALLBACK_NOTIFY_NOADVANCE
-#undef CROW_CALLBACK_DATA_
-#undef CROW_CALLBACK_DATA
-#undef CROW_CALLBACK_DATA_NOADVANCE
-#undef CROW_MARK
-#undef CROW_PROXY_CONNECTION
-#undef CROW_CONNECTION
-#undef CROW_CONTENT_LENGTH
-#undef CROW_TRANSFER_ENCODING
-#undef CROW_UPGRADE
-#undef CROW_CHUNKED
-#undef CROW_KEEP_ALIVE
-#undef CROW_CLOSE
-#undef CROW_PARSING_HEADER
-#undef CROW_CR
-#undef CROW_LF
-#undef CROW_LOWER
-#undef CROW_IS_ALPHA
-#undef CROW_IS_NUM
-#undef CROW_IS_ALPHANUM
-#undef CROW_IS_HEX
-#undef CROW_IS_MARK
-#undef CROW_IS_USERINFO_CHAR
-#undef CROW_TOKEN
-#undef CROW_IS_URL_CHAR
-#undef CROW_IS_HOST_CHAR
-#undef CROW_start_state
-#undef CROW_STRICT_CHECK
-#undef CROW_NEW_MESSAGE
-
-#ifdef __cplusplus
-}
-#endif
-#endif
diff --git a/crow/include/crow/http_request.h b/crow/include/crow/http_request.h
index 89dd0f0..eb3e01c 100644
--- a/crow/include/crow/http_request.h
+++ b/crow/include/crow/http_request.h
@@ -1,51 +1,53 @@
 #pragma once
 
 #include <boost/asio.hpp>
+#include <boost/beast/http.hpp>
+#include <boost/beast/websocket.hpp>
 
-#include "crow/ci_map.h"
 #include "crow/common.h"
 #include "crow/query_string.h"
 
 namespace crow {
-template <typename T>
-inline const std::string& get_header_value(const T& headers,
-                                           const std::string& key) {
-  if (headers.count(key)) {
-    return headers.find(key)->second;
-  }
-  static std::string empty;
-  return empty;
-}
 
 struct request {
-  HTTPMethod method{HTTPMethod::Get};
-  std::string raw_url;
-  std::string url;
-  query_string url_params;
-  ci_map headers;
-  std::string body;
+  boost::string_view url{};
+  query_string url_params{};
   bool is_secure{false};
 
+  const std::string& body;
+
   void* middleware_context{};
   boost::asio::io_service* io_service{};
 
-  request() {}
+  request(boost::beast::http::request<boost::beast::http::string_body>& req)
+      : req(req), body(req.body()) {}
 
-  request(HTTPMethod method, std::string raw_url, std::string url,
-          query_string url_params, ci_map headers, std::string body)
-      : method(method),
-        raw_url(std::move(raw_url)),
-        url(std::move(url)),
-        url_params(std::move(url_params)),
-        headers(std::move(headers)),
-        body(std::move(body)) {}
+  const boost::beast::http::verb method() const { return req.method(); }
 
-  void add_header(std::string key, std::string value) {
-    headers.emplace(std::move(key), std::move(value));
+  const boost::string_view get_header_value(
+      boost::string_view key) const {
+    return req[key];
   }
 
-  const std::string& get_header_value(const std::string& key) const {
-    return crow::get_header_value(headers, key);
+  const boost::string_view get_header_value(
+      boost::beast::http::field key) const {
+    return req[key];
   }
+
+  const boost::string_view method_string() const {
+    return req.method_string();
+  }
+
+  const boost::string_view target() const { return req.target(); }
+
+  unsigned version() { return req.version(); }
+
+  bool is_upgrade() { return boost::beast::websocket::is_upgrade(req); }
+
+  bool keep_alive() { return req.keep_alive(); }
+
+ private:
+  boost::beast::http::request<boost::beast::http::string_body>& req;
 };
+
 }  // namespace crow
diff --git a/crow/include/crow/http_response.h b/crow/include/crow/http_response.h
index e90bfdc..d3fdd03 100644
--- a/crow/include/crow/http_response.h
+++ b/crow/include/crow/http_response.h
@@ -2,53 +2,48 @@
 #include <string>
 
 #include "nlohmann/json.hpp"
-#include "crow/ci_map.h"
 #include "crow/http_request.h"
 #include "crow/logging.h"
+#include <boost/beast/http.hpp>
 
 namespace crow {
+
 template <typename Adaptor, typename Handler, typename... Middlewares>
 class Connection;
 
 struct response {
   template <typename Adaptor, typename Handler, typename... Middlewares>
   friend class crow::Connection;
+  using response_type =
+      boost::beast::http::response<boost::beast::http::string_body>;
 
-  int code{200};
-  std::string body;
+  boost::optional<response_type> string_response;
+
   nlohmann::json json_value;
 
-  std::shared_ptr<std::string> body_ptr;
-
-  std::string headers;
-
-  void add_header(const std::string& key, const std::string& value) {
-    const static std::string seperator = ": ";
-    const static std::string crlf = "\r\n";
-    headers.append(key);
-    headers.append(seperator);
-    headers.append(value);
-    headers.append(crlf);
+  void add_header(const boost::string_view key,
+                  const boost::string_view value) {
+    string_response->set(key, value);
   }
 
-  response() = default;
-  explicit response(int code) : code(code) {}
-  explicit response(std::string body) : body(std::move(body)) {}
-  explicit response(const char* body) : body(body) {}
-  explicit response(nlohmann::json&& json_value)
-      : json_value(std::move(json_value)) {
-    json_mode();
+  void add_header(boost::beast::http::field key, boost::string_view value) {
+    string_response->set(key, value);
   }
-  response(int code, const char* body) : code(code), body(body) {}
-  response(int code, std::string body) : code(code), body(std::move(body)) {}
-  // TODO(ed) make pretty printing JSON configurable
-  explicit response(const nlohmann::json& json_value)
-      : body(json_value.dump(4)) {
-    json_mode();
+
+  response() : string_response(response_type{}) {}
+
+  explicit response(boost::beast::http::status code)
+      : string_response(response_type{}) {}
+
+  explicit response(boost::string_view body_)
+      : string_response(response_type{}) {
+    string_response->body() = std::string(body_);
   }
-  response(int code, const nlohmann::json& json_value)
-      : code(code), body(json_value.dump(4)) {
-    json_mode();
+
+  response(boost::beast::http::status code, boost::string_view s)
+      : string_response(response_type{}) {
+    string_response->result(code);
+    string_response->body() = std::string(s);
   }
 
   response(response&& r) {
@@ -56,33 +51,45 @@
     *this = std::move(r);
   }
 
-  ~response() { CROW_LOG_DEBUG << "Destroying response"; }
+  ~response() { CROW_LOG_DEBUG << this << " Destroying response"; }
 
   response& operator=(const response& r) = delete;
 
   response& operator=(response&& r) noexcept {
     CROW_LOG_DEBUG << "Moving response containers";
-    body = std::move(r.body);
+    string_response = std::move(r.string_response);
+    r.string_response.emplace(response_type{});
     json_value = std::move(r.json_value);
-    code = r.code;
-    headers = std::move(r.headers);
     completed_ = r.completed_;
     return *this;
   }
 
+  void result(boost::beast::http::status v) { string_response->result(v); }
+
+  boost::beast::http::status result() { return string_response->result(); }
+
+  unsigned result_int() { return string_response->result_int(); }
+
+  boost::string_view reason() { return string_response->reason(); }
+
   bool is_completed() const noexcept { return completed_; }
 
+  std::string& body() { return string_response->body(); }
+
+  void keep_alive(bool k) { string_response->keep_alive(k); }
+
+  void prepare_payload() { string_response->prepare_payload(); };
+
   void clear() {
-    CROW_LOG_DEBUG << "Clearing response containers";
-    body.clear();
+    CROW_LOG_DEBUG << this << " Clearing response containers";
+    string_response.emplace(response_type{});
     json_value.clear();
-    code = 200;
-    headers.clear();
     completed_ = false;
-    body_ptr.reset();
   }
 
-  void write(const std::string& body_part) { body += body_part; }
+  void write(boost::string_view body_part) {
+    string_response->body() += std::string(body_part);
+  }
 
   void end() {
     if (!completed_) {
@@ -94,8 +101,8 @@
     }
   }
 
-  void end(const std::string& body_part) {
-    body += body_part;
+  void end(boost::string_view body_part) {
+    write(body_part);
     end();
   }
 
diff --git a/crow/include/crow/http_server.h b/crow/include/crow/http_server.h
index e770195..86bf54b 100644
--- a/crow/include/crow/http_server.h
+++ b/crow/include/crow/http_server.h
@@ -7,7 +7,7 @@
 #include <memory>
 #include <utility>
 #include <vector>
-#include "crow/dumb_timer_queue.h"
+#include "crow/timer_queue.h"
 #include "crow/http_connection.h"
 #include "crow/logging.h"
 #include <boost/asio.hpp>
@@ -69,7 +69,7 @@
     tick_timer_.expires_from_now(
         boost::posix_time::milliseconds(tick_interval_.count()));
     tick_timer_.async_wait([this](const boost::system::error_code& ec) {
-      if (ec != nullptr) {
+      if (ec) {
         return;
       }
       on_tick();
@@ -105,13 +105,12 @@
       return this->date_str;
     };
 
-    timer_queue_.set_io_service(*io_service_);
     boost::asio::deadline_timer timer(*io_service_);
     timer.expires_from_now(boost::posix_time::seconds(1));
 
     std::function<void(const boost::system::error_code& ec)> handler;
     handler = [&](const boost::system::error_code& ec) {
-      if (ec != nullptr) {
+      if (ec) {
         return;
       }
       timer_queue_.process();
@@ -124,7 +123,7 @@
       tick_timer_.expires_from_now(
           boost::posix_time::milliseconds(tick_interval_.count()));
       tick_timer_.async_wait([this](const boost::system::error_code& ec) {
-        if (ec != nullptr) {
+        if (ec) {
           return;
         }
         on_tick();
@@ -159,7 +158,7 @@
 
  private:
   std::shared_ptr<asio::io_service> io_service_;
-  detail::dumb_timer_queue timer_queue_;
+  detail::timer_queue timer_queue_;
   std::function<std::string()> get_cached_date_str_;
   std::unique_ptr<tcp::acceptor> acceptor_;
   boost::asio::signal_set signals_;
diff --git a/crow/include/crow/json.h b/crow/include/crow/json.h
deleted file mode 100644
index 9b21d97..0000000
--- a/crow/include/crow/json.h
+++ /dev/null
@@ -1,1299 +0,0 @@
-#pragma once
-
-//#define CROW_JSON_NO_ERROR_CHECK
-
-#include <algorithm>
-#include <iostream>
-#include <memory>
-#include <string>
-#include <vector>
-#include <boost/algorithm/string/predicate.hpp>
-#include <boost/container/flat_map.hpp>
-#include <boost/lexical_cast.hpp>
-#include <boost/operators.hpp>
-
-#include "crow/settings.h"
-
-#if defined(__GNUG__) || defined(__clang__)
-#define crow_json_likely(x) __builtin_expect(x, 1)
-#define crow_json_unlikely(x) __builtin_expect(x, 0)
-#else
-#define crow_json_likely(x) x
-#define crow_json_unlikely(x) x
-#endif
-
-namespace crow {
-namespace mustache {
-class template_t;
-}  // namespace mustache
-
-namespace json {
-inline void escape(const std::string& str, std::string& ret) {
-  ret.reserve(ret.size() + str.size() + str.size() / 4);
-  for (char c : str) {
-    switch (c) {
-      case '"':
-        ret += "\\\"";
-        break;
-      case '\\':
-        ret += "\\\\";
-        break;
-      case '\n':
-        ret += "\\n";
-        break;
-      case '\b':
-        ret += "\\b";
-        break;
-      case '\f':
-        ret += "\\f";
-        break;
-      case '\r':
-        ret += "\\r";
-        break;
-      case '\t':
-        ret += "\\t";
-        break;
-      default:
-        if (0 <= c && c < 0x20) {
-          ret += "\\u00";
-          auto to_hex = [](char c) {
-            c = c & 0xf;
-            if (c < 10) {
-              return '0' + c;
-            }
-            return 'a' + c - 10;
-          };
-          ret += std::to_string(to_hex(c / 16));
-          ret += std::to_string(to_hex(c % 16));
-        } else {
-          ret += c;
-        }
-        break;
-    }
-  }
-}
-inline std::string escape(const std::string& str) {
-  std::string ret;
-  escape(str, ret);
-  return ret;
-}
-
-enum class type : char {
-  Null,
-  False,
-  True,
-  Number,
-  String,
-  List,
-  Object,
-};
-
-inline const char* get_type_str(type t) {
-  switch (t) {
-    case type::Number:
-      return "Number";
-    case type::False:
-      return "False";
-    case type::True:
-      return "True";
-    case type::List:
-      return "List";
-    case type::String:
-      return "String";
-    case type::Object:
-      return "Object";
-    default:
-      return "Unknown";
-  }
-}
-
-class rvalue;
-rvalue load(const char* data, size_t size);
-
-namespace detail {
-
-struct r_string : boost::less_than_comparable<r_string>,
-                  boost::less_than_comparable<r_string, std::string>,
-                  boost::equality_comparable<r_string>,
-                  boost::equality_comparable<r_string, std::string> {
-  r_string(){};
-
-  r_string(char* s, char* e) : s_(s), e_(e){};
-  ~r_string() {
-    if (owned_ != 0u) {
-      delete[] s_;
-    }
-  }
-
-  r_string(const r_string& r) { *this = r; }
-
-  r_string(r_string&& r) { *this = r; }
-
-  r_string& operator=(r_string&& r) {
-    s_ = r.s_;
-    e_ = r.e_;
-    owned_ = r.owned_;
-    if (r.owned_ != 0u) {
-      r.owned_ = 0;
-    }
-    return *this;
-  }
-
-  r_string& operator=(const r_string& r) {
-    s_ = r.s_;
-    e_ = r.e_;
-    owned_ = 0;
-    return *this;
-  }
-
-  operator std::string() const { return std::string(s_, e_); }
-
-  const char* begin() const { return s_; }
-  const char* end() const { return e_; }
-  size_t size() const { return end() - begin(); }
-
-  using iterator = const char*;
-  using const_iterator = const char*;
-
-  char* s_{};
-  mutable char* e_{};
-  uint8_t owned_{0};
-  friend std::ostream& operator<<(std::ostream& os, const r_string& s) {
-    os << static_cast<std::string>(s);
-    return os;
-  }
-
- private:
-  void force(char* s, uint32_t /*length*/) {
-    s_ = s;
-    owned_ = 1;
-  }
-  friend rvalue crow::json::load(const char* data, size_t size);
-};
-
-inline bool operator<(const r_string& l, const r_string& r) {
-  return boost::lexicographical_compare(l, r);
-}
-
-inline bool operator<(const r_string& l, const std::string& r) {
-  return boost::lexicographical_compare(l, r);
-}
-
-inline bool operator>(const r_string& l, const std::string& r) {
-  return boost::lexicographical_compare(r, l);
-}
-
-inline bool operator==(const r_string& l, const r_string& r) {
-  return boost::equals(l, r);
-}
-
-inline bool operator==(const r_string& l, const std::string& r) {
-  return boost::equals(l, r);
-}
-}  // namespace detail
-
-class rvalue {
-  static const int cached_bit = 2;
-  static const int error_bit = 4;
-
- public:
-  rvalue() noexcept : option_{error_bit} {}
-  rvalue(type t) noexcept : lsize_{}, lremain_{}, t_{t} {}
-  rvalue(type t, char* s, char* e) noexcept : start_{s}, end_{e}, t_{t} {}
-
-  rvalue(const rvalue& r)
-      : start_(r.start_),
-        end_(r.end_),
-        key_(r.key_),
-        t_(r.t_),
-        option_(r.option_) {
-    copy_l(r);
-  }
-
-  rvalue(rvalue&& r) noexcept { *this = std::move(r); }
-
-  rvalue& operator=(const rvalue& r) {
-    start_ = r.start_;
-    end_ = r.end_;
-    key_ = r.key_;
-    copy_l(r);
-    t_ = r.t_;
-    option_ = r.option_;
-    return *this;
-  }
-  rvalue& operator=(rvalue&& r) noexcept {
-    start_ = r.start_;
-    end_ = r.end_;
-    key_ = std::move(r.key_);
-    l_ = std::move(r.l_);
-    lsize_ = r.lsize_;
-    lremain_ = r.lremain_;
-    t_ = r.t_;
-    option_ = r.option_;
-    return *this;
-  }
-
-  explicit operator bool() const noexcept { return (option_ & error_bit) == 0; }
-
-  explicit operator int64_t() const { return i(); }
-
-  explicit operator uint64_t() const { return u(); }
-
-  explicit operator int() const { return static_cast<int>(i()); }
-
-  type t() const {
-#ifndef CROW_JSON_NO_ERROR_CHECK
-    if ((option_ & error_bit) != 0) {
-      throw std::runtime_error("invalid json object");
-    }
-#endif
-    return t_;
-  }
-
-  int64_t i() const {
-#ifndef CROW_JSON_NO_ERROR_CHECK
-    switch (t()) {
-      case type::Number:
-      case type::String:
-        return boost::lexical_cast<int64_t>(start_, end_ - start_);
-      default:
-        const std::string msg =
-            "expected number, got: " + std::string(get_type_str(t()));
-        throw std::runtime_error(msg);
-    }
-#endif
-    return boost::lexical_cast<int64_t>(start_, end_ - start_);
-  }
-
-  uint64_t u() const {
-#ifndef CROW_JSON_NO_ERROR_CHECK
-    switch (t()) {
-      case type::Number:
-      case type::String:
-        return boost::lexical_cast<uint64_t>(start_, end_ - start_);
-      default:
-        throw std::runtime_error(std::string("expected number, got: ") +
-                                 get_type_str(t()));
-    }
-#endif
-    return boost::lexical_cast<uint64_t>(start_, end_ - start_);
-  }
-
-  double d() const {
-#ifndef CROW_JSON_NO_ERROR_CHECK
-    if (t() != type::Number) {
-      throw std::runtime_error("value is not number");
-    }
-#endif
-    return boost::lexical_cast<double>(start_, end_ - start_);
-  }
-
-  bool b() const {
-#ifndef CROW_JSON_NO_ERROR_CHECK
-    if (t() != type::True && t() != type::False) {
-      throw std::runtime_error("value is not boolean");
-    }
-#endif
-    return t() == type::True;
-  }
-
-  void unescape() const {
-    if (*(start_ - 1) != 0) {
-      char* head = start_;
-      char* tail = start_;
-      while (head != end_) {
-        if (*head == '\\') {
-          switch (*++head) {
-            case '"':
-              *tail++ = '"';
-              break;
-            case '\\':
-              *tail++ = '\\';
-              break;
-            case '/':
-              *tail++ = '/';
-              break;
-            case 'b':
-              *tail++ = '\b';
-              break;
-            case 'f':
-              *tail++ = '\f';
-              break;
-            case 'n':
-              *tail++ = '\n';
-              break;
-            case 'r':
-              *tail++ = '\r';
-              break;
-            case 't':
-              *tail++ = '\t';
-              break;
-            case 'u': {
-              auto from_hex = [](char c) {
-                if (c >= 'a') {
-                  return c - 'a' + 10;
-                }
-                if (c >= 'A') {
-                  return c - 'A' + 10;
-                }
-                return c - '0';
-              };
-              unsigned int code = (from_hex(head[1]) << 12) +
-                                  (from_hex(head[2]) << 8) +
-                                  (from_hex(head[3]) << 4) + from_hex(head[4]);
-              if (code >= 0x800) {
-                *tail++ = 0xE0 | (code >> 12);
-                *tail++ = 0x80 | ((code >> 6) & 0x3F);
-                *tail++ = 0x80 | (code & 0x3F);
-              } else if (code >= 0x80) {
-                *tail++ = 0xC0 | (code >> 6);
-                *tail++ = 0x80 | (code & 0x3F);
-              } else {
-                *tail++ = code;
-              }
-              head += 4;
-            } break;
-          }
-        } else {
-          *tail++ = *head;
-        }
-        head++;
-      }
-      end_ = tail;
-      *end_ = 0;
-      *(start_ - 1) = 0;
-    }
-  }
-
-  detail::r_string s() const {
-#ifndef CROW_JSON_NO_ERROR_CHECK
-    if (t() != type::String) {
-      throw std::runtime_error("value is not string");
-    }
-#endif
-    unescape();
-    return detail::r_string{start_, end_};
-  }
-
-  bool has(const char* str) const { return has(std::string(str)); }
-
-  bool has(const std::string& str) const {
-    struct Pred {
-      bool operator()(const rvalue& l, const rvalue& r) const {
-        return l.key_ < r.key_;
-      };
-      bool operator()(const rvalue& l, const std::string& r) const {
-        return l.key_ < r;
-      };
-      bool operator()(const std::string& l, const rvalue& r) const {
-        return l < r.key_;
-      };
-    };
-    if (!is_cached()) {
-      std::sort(begin(), end(), Pred());
-      set_cached();
-    }
-    auto it = lower_bound(begin(), end(), str, Pred());
-    return it != end() && it->key_ == str;
-  }
-
-  int count(const std::string& str) { return has(str) ? 1 : 0; }
-
-  rvalue* begin() const {
-#ifndef CROW_JSON_NO_ERROR_CHECK
-    if (t() != type::Object && t() != type::List) {
-      throw std::runtime_error("value is not a container");
-    }
-#endif
-    return l_.get();
-  }
-  rvalue* end() const {
-#ifndef CROW_JSON_NO_ERROR_CHECK
-    if (t() != type::Object && t() != type::List) {
-      throw std::runtime_error("value is not a container");
-    }
-#endif
-    return l_.get() + lsize_;
-  }
-
-  const detail::r_string& key() const { return key_; }
-
-  size_t size() const {
-    if (t() == type::String) {
-      return s().size();
-    }
-#ifndef CROW_JSON_NO_ERROR_CHECK
-    if (t() != type::Object && t() != type::List) {
-      throw std::runtime_error("value is not a container");
-    }
-#endif
-    return lsize_;
-  }
-
-  const rvalue& operator[](int index) const {
-#ifndef CROW_JSON_NO_ERROR_CHECK
-    if (t() != type::List) {
-      throw std::runtime_error("value is not a list");
-    }
-    if (index >= static_cast<int>(lsize_) || index < 0) {
-      throw std::runtime_error("list out of bound");
-    }
-#endif
-    return l_[index];
-  }
-
-  const rvalue& operator[](size_t index) const {
-#ifndef CROW_JSON_NO_ERROR_CHECK
-    if (t() != type::List) {
-      throw std::runtime_error("value is not a list");
-    }
-    if (index >= lsize_) {
-      throw std::runtime_error("list out of bound");
-    }
-#endif
-    return l_[index];
-  }
-
-  const rvalue& operator[](const char* str) const {
-    return this->operator[](std::string(str));
-  }
-
-  const rvalue& operator[](const std::string& str) const {
-#ifndef CROW_JSON_NO_ERROR_CHECK
-    if (t() != type::Object) {
-      throw std::runtime_error("value is not an object");
-    }
-#endif
-    struct Pred {
-      bool operator()(const rvalue& l, const rvalue& r) const {
-        return l.key_ < r.key_;
-      };
-      bool operator()(const rvalue& l, const std::string& r) const {
-        return l.key_ < r;
-      };
-      bool operator()(const std::string& l, const rvalue& r) const {
-        return l < r.key_;
-      };
-    };
-    if (!is_cached()) {
-      std::sort(begin(), end(), Pred());
-      set_cached();
-    }
-    auto it = lower_bound(begin(), end(), str, Pred());
-    if (it != end() && it->key_ == str) {
-      return *it;
-    }
-#ifndef CROW_JSON_NO_ERROR_CHECK
-    throw std::runtime_error("cannot find key");
-#else
-    static rvalue nullValue;
-    return nullValue;
-#endif
-  }
-
-  void set_error() { option_ |= error_bit; }
-
-  bool error() const { return (option_ & error_bit) != 0; }
-
- private:
-  bool is_cached() const { return (option_ & cached_bit) != 0; }
-  void set_cached() const { option_ |= cached_bit; }
-  void copy_l(const rvalue& r) {
-    if (r.t() != type::Object && r.t() != type::List) {
-      return;
-    }
-    lsize_ = r.lsize_;
-    lremain_ = 0;
-    l_.reset(new rvalue[lsize_]);
-    std::copy(r.begin(), r.end(), begin());
-  }
-
-  void emplace_back(rvalue&& v) {
-    if (lremain_ == 0u) {
-      int new_size = lsize_ + lsize_;
-      if (new_size - lsize_ > 60000) {
-        new_size = lsize_ + 60000;
-      }
-      if (new_size < 4) {
-        new_size = 4;
-      }
-      auto* p = new rvalue[new_size];
-      rvalue* p2 = p;
-      for (auto& x : *this) {
-        *p2++ = std::move(x);
-      }
-      l_.reset(p);
-      lremain_ = new_size - lsize_;
-    }
-    l_[lsize_++] = std::move(v);
-    lremain_--;
-  }
-
-  mutable char* start_{};
-  mutable char* end_{};
-  detail::r_string key_;
-  std::unique_ptr<rvalue[]> l_;
-  uint32_t lsize_{};
-  uint16_t lremain_{};
-  type t_;
-  mutable uint8_t option_{0};
-
-  friend rvalue load_nocopy_internal(char* data, size_t size);
-  friend rvalue load(const char* data, size_t size);
-
-  friend std::ostream& operator<<(std::ostream& os, const rvalue& r) {
-    switch (r.t_) {
-      case type::Null:
-        os << "null";
-        break;
-      case type::False:
-        os << "false";
-        break;
-      case type::True:
-        os << "true";
-        break;
-      case type::Number:
-        os << r.d();
-        break;
-      case type::String:
-        os << '"' << r.s() << '"';
-        break;
-      case type::List: {
-        os << '[';
-        bool first = true;
-        for (auto& x : r) {
-          if (!first) {
-            os << ',';
-          }
-          first = false;
-          os << x;
-        }
-        os << ']';
-      } break;
-      case type::Object: {
-        os << '{';
-        bool first = true;
-        for (auto& x : r) {
-          if (!first) {
-            os << ',';
-          }
-          os << '"' << escape(x.key_) << "\":";
-          first = false;
-          os << x;
-        }
-        os << '}';
-      } break;
-    }
-    return os;
-  }
-};
-namespace detail {}
-
-inline bool operator==(const rvalue& l, const std::string& r) {
-  return l.s() == r;
-}
-
-inline bool operator==(const std::string& l, const rvalue& r) {
-  return l == r.s();
-}
-
-inline bool operator!=(const rvalue& l, const std::string& r) {
-  return l.s() != r;
-}
-
-inline bool operator!=(const std::string& l, const rvalue& r) {
-  return l != r.s();
-}
-
-inline bool operator==(const rvalue& l, double r) { return l.d() == r; }
-
-inline bool operator==(double l, const rvalue& r) { return l == r.d(); }
-
-inline bool operator!=(const rvalue& l, double r) { return l.d() != r; }
-
-inline bool operator!=(double l, const rvalue& r) { return l != r.d(); }
-
-inline rvalue load_nocopy_internal(char* data, size_t size) {
-  // static const char* escaped = "\"\\/\b\f\n\r\t";
-  struct Parser {
-    Parser(char* data, size_t /*size*/) : data(data) {}
-
-    bool consume(char c) {
-      if (crow_json_unlikely(*data != c)) {
-        return false;
-      }
-      data++;
-      return true;
-    }
-
-    void ws_skip() {
-      while (*data == ' ' || *data == '\t' || *data == '\r' || *data == '\n') {
-        ++data;
-      }
-    };
-
-    rvalue decode_string() {
-      if (crow_json_unlikely(!consume('"'))) {
-        return {};
-      }
-      char* start = data;
-      uint8_t has_escaping = 0;
-      while (1) {
-        if (crow_json_likely(*data != '"' && *data != '\\' && *data != '\0')) {
-          data++;
-        } else if (*data == '"') {
-          *data = 0;
-          *(start - 1) = has_escaping;
-          data++;
-          return {type::String, start, data - 1};
-        } else if (*data == '\\') {
-          has_escaping = 1;
-          data++;
-          switch (*data) {
-            case 'u': {
-              auto check = [](char c) {
-                return ('0' <= c && c <= '9') || ('a' <= c && c <= 'f') ||
-                       ('A' <= c && c <= 'F');
-              };
-              if (!(check(*(data + 1)) && check(*(data + 2)) &&
-                    check(*(data + 3)) && check(*(data + 4)))) {
-                return {};
-              }
-            }
-              data += 5;
-              break;
-            case '"':
-            case '\\':
-            case '/':
-            case 'b':
-            case 'f':
-            case 'n':
-            case 'r':
-            case 't':
-              data++;
-              break;
-            default:
-              return {};
-          }
-        } else {
-          return {};
-        }
-      }
-      return {};
-    }
-
-    rvalue decode_list() {
-      rvalue ret(type::List);
-      if (crow_json_unlikely(!consume('['))) {
-        ret.set_error();
-        return ret;
-      }
-      ws_skip();
-      if (crow_json_unlikely(*data == ']')) {
-        data++;
-        return ret;
-      }
-
-      while (1) {
-        auto v = decode_value();
-        if (crow_json_unlikely(!v)) {
-          ret.set_error();
-          break;
-        }
-        ws_skip();
-        ret.emplace_back(std::move(v));
-        if (*data == ']') {
-          data++;
-          break;
-        }
-        if (crow_json_unlikely(!consume(','))) {
-          ret.set_error();
-          break;
-        }
-        ws_skip();
-      }
-      return ret;
-    }
-
-    rvalue decode_number() {
-      char* start = data;
-
-      enum NumberParsingState {
-        Minus,
-        AfterMinus,
-        ZeroFirst,
-        Digits,
-        DigitsAfterPoints,
-        E,
-        DigitsAfterE,
-        Invalid,
-      } state{Minus};
-      while (crow_json_likely(state != Invalid)) {
-        switch (*data) {
-          case '0':
-            state = static_cast<NumberParsingState>("\2\2\7\3\4\6\6"[state]);
-            /*if (state == NumberParsingState::Minus || state ==
-            NumberParsingState::AfterMinus)
-            {
-                state = NumberParsingState::ZeroFirst;
-            }
-            else if (state == NumberParsingState::Digits ||
-                state == NumberParsingState::DigitsAfterE ||
-                state == NumberParsingState::DigitsAfterPoints)
-            {
-                // ok; pass
-            }
-            else if (state == NumberParsingState::E)
-            {
-                state = NumberParsingState::DigitsAfterE;
-            }
-            else
-                return {};*/
-            break;
-          case '1':
-          case '2':
-          case '3':
-          case '4':
-          case '5':
-          case '6':
-          case '7':
-          case '8':
-          case '9':
-            state = static_cast<NumberParsingState>("\3\3\7\3\4\6\6"[state]);
-            while (*(data + 1) >= '0' && *(data + 1) <= '9') {
-              data++;
-            }
-            /*if (state == NumberParsingState::Minus || state ==
-            NumberParsingState::AfterMinus)
-            {
-                state = NumberParsingState::Digits;
-            }
-            else if (state == NumberParsingState::Digits ||
-                state == NumberParsingState::DigitsAfterE ||
-                state == NumberParsingState::DigitsAfterPoints)
-            {
-                // ok; pass
-            }
-            else if (state == NumberParsingState::E)
-            {
-                state = NumberParsingState::DigitsAfterE;
-            }
-            else
-                return {};*/
-            break;
-          case '.':
-            state = static_cast<NumberParsingState>("\7\7\4\4\7\7\7"[state]);
-            /*
-            if (state == NumberParsingState::Digits || state ==
-            NumberParsingState::ZeroFirst)
-            {
-                state = NumberParsingState::DigitsAfterPoints;
-            }
-            else
-                return {};
-            */
-            break;
-          case '-':
-            state = static_cast<NumberParsingState>("\1\7\7\7\7\6\7"[state]);
-            /*if (state == NumberParsingState::Minus)
-            {
-                state = NumberParsingState::AfterMinus;
-            }
-            else if (state == NumberParsingState::E)
-            {
-                state = NumberParsingState::DigitsAfterE;
-            }
-            else
-                return {};*/
-            break;
-          case '+':
-            state = static_cast<NumberParsingState>("\7\7\7\7\7\6\7"[state]);
-            /*if (state == NumberParsingState::E)
-            {
-                state = NumberParsingState::DigitsAfterE;
-            }
-            else
-                return {};*/
-            break;
-          case 'e':
-          case 'E':
-            state = static_cast<NumberParsingState>("\7\7\7\5\5\7\7"[state]);
-            /*if (state == NumberParsingState::Digits ||
-                state == NumberParsingState::DigitsAfterPoints)
-            {
-                state = NumberParsingState::E;
-            }
-            else
-                return {};*/
-            break;
-          default:
-            if (crow_json_likely(state == NumberParsingState::ZeroFirst ||
-                                 state == NumberParsingState::Digits ||
-                                 state ==
-                                     NumberParsingState::DigitsAfterPoints ||
-                                 state == NumberParsingState::DigitsAfterE)) {
-              return {type::Number, start, data};
-            } else {
-              return {};
-            }
-        }
-        data++;
-      }
-
-      return {};
-    }
-
-    rvalue decode_value() {
-      switch (*data) {
-        case '[':
-          return decode_list();
-        case '{':
-          return decode_object();
-        case '"':
-          return decode_string();
-        case 't':
-          if (  // e-data >= 4 &&
-              data[1] == 'r' && data[2] == 'u' && data[3] == 'e') {
-            data += 4;
-            return {type::True};
-          } else {
-            return {};
-          }
-        case 'f':
-          if (  // e-data >= 5 &&
-              data[1] == 'a' && data[2] == 'l' && data[3] == 's' &&
-              data[4] == 'e') {
-            data += 5;
-            return {type::False};
-          } else {
-            return {};
-          }
-        case 'n':
-          if (  // e-data >= 4 &&
-              data[1] == 'u' && data[2] == 'l' && data[3] == 'l') {
-            data += 4;
-            return {type::Null};
-          } else {
-            return {};
-          }
-        // case '1': case '2': case '3':
-        // case '4': case '5': case '6':
-        // case '7': case '8': case '9':
-        // case '0': case '-':
-        default:
-          return decode_number();
-      }
-      return {};
-    }
-
-    rvalue decode_object() {
-      rvalue ret(type::Object);
-      if (crow_json_unlikely(!consume('{'))) {
-        ret.set_error();
-        return ret;
-      }
-
-      ws_skip();
-
-      if (crow_json_unlikely(*data == '}')) {
-        data++;
-        return ret;
-      }
-
-      while (1) {
-        auto t = decode_string();
-        if (crow_json_unlikely(!t)) {
-          ret.set_error();
-          break;
-        }
-
-        ws_skip();
-        if (crow_json_unlikely(!consume(':'))) {
-          ret.set_error();
-          break;
-        }
-
-        // TODO caching key to speed up (flyweight?)
-        auto key = t.s();
-
-        ws_skip();
-        auto v = decode_value();
-        if (crow_json_unlikely(!v)) {
-          ret.set_error();
-          break;
-        }
-        ws_skip();
-
-        v.key_ = std::move(key);
-        ret.emplace_back(std::move(v));
-        if (crow_json_unlikely(*data == '}')) {
-          data++;
-          break;
-        }
-        if (crow_json_unlikely(!consume(','))) {
-          ret.set_error();
-          break;
-        }
-        ws_skip();
-      }
-      return ret;
-    }
-
-    rvalue parse() {
-      ws_skip();
-      auto ret = decode_value();  // or decode object?
-      ws_skip();
-      if (ret && *data != '\0') {
-        ret.set_error();
-      }
-      return ret;
-    }
-
-    char* data;
-  };
-  return Parser(data, size).parse();
-}
-inline rvalue load(const char* data, size_t size) {
-  auto* s = new char[size + 1];
-  memcpy(s, data, size);
-  s[size] = 0;
-  auto ret = load_nocopy_internal(s, size);
-  if (ret) {
-    ret.key_.force(s, size);
-  } else {
-    delete[] s;
-  }
-  return ret;
-}
-
-inline rvalue load(const char* data) { return load(data, strlen(data)); }
-
-inline rvalue load(const std::string& str) {
-  return load(str.data(), str.size());
-}
-
-class wvalue {
-  friend class crow::mustache::template_t;
-
- public:
-  type t() const { return t_; }
-
- private:
-  type t_{type::Null};
-  double d{};
-  std::string s;
-  std::unique_ptr<std::vector<wvalue>> l;
-  std::unique_ptr<boost::container::flat_map<std::string, wvalue>> o;
-
- public:
-  wvalue() = default;
-
-  wvalue(const rvalue& r) {
-    t_ = r.t();
-    switch (r.t()) {
-      case type::Null:
-      case type::False:
-      case type::True:
-        return;
-      case type::Number:
-        d = r.d();
-        return;
-      case type::String:
-        s = r.s();
-        return;
-      case type::List:
-        l = std::make_unique<std::vector<wvalue>>();
-        l->reserve(r.size());
-        for (auto& it : r) {
-          l->emplace_back(it);
-        }
-        return;
-      case type::Object:
-        o = std::make_unique<boost::container::flat_map<std::string, wvalue>>();
-        for (auto& it : r) {
-          o->emplace(it.key(), it);
-        }
-        return;
-    }
-  }
-
-  wvalue(wvalue&& r) { *this = std::move(r); }
-
-  wvalue& operator=(wvalue&& r) {
-    t_ = r.t_;
-    d = r.d;
-    s = std::move(r.s);
-    l = std::move(r.l);
-    o = std::move(r.o);
-    return *this;
-  }
-
-  void clear() {
-    t_ = type::Null;
-    l.reset();
-    o.reset();
-  }
-
-  void reset() {
-    t_ = type::Null;
-    l.reset();
-    o.reset();
-  }
-
-  wvalue& operator=(std::nullptr_t) {
-    reset();
-    return *this;
-  }
-  wvalue& operator=(bool value) {
-    reset();
-    if (value) {
-      t_ = type::True;
-    } else {
-      t_ = type::False;
-    }
-    return *this;
-  }
-
-  wvalue& operator=(double value) {
-    reset();
-    t_ = type::Number;
-    d = value;
-    return *this;
-  }
-
-  wvalue& operator=(unsigned short value) {
-    reset();
-    t_ = type::Number;
-    d = static_cast<double>(value);
-    return *this;
-  }
-
-  wvalue& operator=(short value) {
-    reset();
-    t_ = type::Number;
-    d = static_cast<double>(value);
-    return *this;
-  }
-
-  wvalue& operator=(long long value) {
-    reset();
-    t_ = type::Number;
-    d = static_cast<double>(value);
-    return *this;
-  }
-
-  wvalue& operator=(long value) {
-    reset();
-    t_ = type::Number;
-    d = static_cast<double>(value);
-    return *this;
-  }
-
-  wvalue& operator=(int value) {
-    reset();
-    t_ = type::Number;
-    d = static_cast<double>(value);
-    return *this;
-  }
-
-  wvalue& operator=(unsigned long long value) {
-    reset();
-    t_ = type::Number;
-    d = static_cast<double>(value);
-    return *this;
-  }
-
-  wvalue& operator=(unsigned long value) {
-    reset();
-    t_ = type::Number;
-    d = static_cast<double>(value);
-    return *this;
-  }
-
-  wvalue& operator=(unsigned int value) {
-    reset();
-    t_ = type::Number;
-    d = static_cast<double>(value);
-    return *this;
-  }
-
-  wvalue& operator=(const char* str) {
-    reset();
-    t_ = type::String;
-    s = str;
-    return *this;
-  }
-
-  wvalue& operator=(const std::string& str) {
-    reset();
-    t_ = type::String;
-    s = str;
-    return *this;
-  }
-
-  template <typename T>
-  wvalue& operator=(const std::vector<T>& v) {
-    if (t_ != type::List) {
-      reset();
-    }
-    t_ = type::List;
-    if (!l) {
-      l = std::make_unique<std::vector<wvalue>>();
-    }
-    l->clear();
-    l->resize(v.size());
-    size_t idx = 0;
-    for (auto& x : v) {
-      (*l)[idx++] = x;
-    }
-    return *this;
-  }
-
-  wvalue& operator[](unsigned index) {
-    if (t_ != type::List) {
-      reset();
-    }
-    t_ = type::List;
-    if (!l) {
-      l = std::make_unique<std::vector<wvalue>>();
-    }
-    if (l->size() < index + 1) {
-      l->resize(index + 1);
-    }
-    return (*l)[index];
-  }
-
-  int count(const std::string& str) {
-    if (t_ != type::Object) {
-      return 0;
-    }
-    if (!o) {
-      return 0;
-    }
-    return o->count(str);
-  }
-
-  wvalue& operator[](const std::string& str) {
-    if (t_ != type::Object) {
-      reset();
-    }
-    t_ = type::Object;
-    if (!o) {
-      o = std::make_unique<boost::container::flat_map<std::string, wvalue>>();
-    }
-    return (*o)[str];
-  }
-
-  size_t estimate_length() const {
-    switch (t_) {
-      case type::Null:
-        return 4;
-      case type::False:
-        return 5;
-      case type::True:
-        return 4;
-      case type::Number:
-        return 30;
-      case type::String:
-        return 2 + s.size() + s.size() / 2;
-      case type::List: {
-        size_t sum{};
-        if (l) {
-          for (auto& x : *l) {
-            sum += 1;
-            sum += x.estimate_length();
-          }
-        }
-        return sum + 2;
-      }
-      case type::Object: {
-        size_t sum{};
-        if (o) {
-          for (auto& kv : *o) {
-            sum += 2;
-            sum += 2 + kv.first.size() + kv.first.size() / 2;
-            sum += kv.second.estimate_length();
-          }
-        }
-        return sum + 2;
-      }
-    }
-    return 1;
-  }
-
-  friend void dump_internal(const wvalue& v, std::string& out);
-  friend std::string dump(const wvalue& v);
-};
-
-inline void dump_string(const std::string& str, std::string& out) {
-  out.push_back('"');
-  escape(str, out);
-  out.push_back('"');
-}
-inline void dump_internal(const wvalue& v, std::string& out) {
-  switch (v.t_) {
-    case type::Null:
-      out += "null";
-      break;
-    case type::False:
-      out += "false";
-      break;
-    case type::True:
-      out += "true";
-      break;
-    case type::Number: {
-      char outbuf[128];
-      sprintf(outbuf, "%g", v.d);
-      out += outbuf;
-    } break;
-    case type::String:
-      dump_string(v.s, out);
-      break;
-    case type::List: {
-      out.push_back('[');
-      if (v.l) {
-        bool first = true;
-        for (auto& x : *v.l) {
-          if (!first) {
-            out.push_back(',');
-          }
-          first = false;
-          dump_internal(x, out);
-        }
-      }
-      out.push_back(']');
-    } break;
-    case type::Object: {
-      out.push_back('{');
-      if (v.o) {
-        bool first = true;
-        for (auto& kv : *v.o) {
-          if (!first) {
-            out.push_back(',');
-          }
-          first = false;
-          dump_string(kv.first, out);
-          out.push_back(':');
-          dump_internal(kv.second, out);
-        }
-      }
-      out.push_back('}');
-    } break;
-  }
-}
-
-inline std::string dump(const wvalue& v) {
-  std::string ret;
-  ret.reserve(v.estimate_length());
-  dump_internal(v, ret);
-  return ret;
-}
-
-// std::vector<boost::asio::const_buffer> dump_ref(wvalue& v)
-//{
-//}
-}  // namespace json
-}  // namespace crow
-
-#undef crow_json_likely
-#undef crow_json_unlikely
diff --git a/crow/include/crow/middleware.h b/crow/include/crow/middleware.h
deleted file mode 100644
index a73641a..0000000
--- a/crow/include/crow/middleware.h
+++ /dev/null
@@ -1,178 +0,0 @@
-#pragma once
-
-#include "crow/http_request.h"
-#include "crow/http_response.h"
-#include <boost/algorithm/string/trim.hpp>
-#include <boost/container/flat_map.hpp>
-
-namespace crow {
-// Any middleware requires following 3 members:
-
-// struct context;
-//      storing data for the middleware; can be read from another middleware or
-//      handlers
-
-// before_handle
-//      called before handling the request.
-//      if res.end() is called, the operation is halted.
-//      (still call after_handle of this middleware)
-//      2 signatures:
-//      void before_handle(request& req, response& res, context& ctx)
-//          if you only need to access this middlewares context.
-//      template <typename AllContext>
-//      void before_handle(request& req, response& res, context& ctx,
-//      AllContext& all_ctx)
-//          you can access another middlewares' context by calling
-//          `all_ctx.template get<MW>()'
-//          ctx == all_ctx.template get<CurrentMiddleware>()
-
-// after_handle
-//      called after handling the request.
-//      void after_handle(request& req, response& res, context& ctx)
-//      template <typename AllContext>
-//      void after_handle(request& req, response& res, context& ctx, AllContext&
-//      all_ctx)
-
-struct CookieParser {
-  struct context {
-    boost::container::flat_map<std::string, std::string> jar;
-    boost::container::flat_map<std::string, std::string> cookies_to_add;
-
-    std::string get_cookie(const std::string& key) {
-      if (jar.count(key) != 0u) {
-        return jar[key];
-      }
-      return {};
-    }
-
-    void set_cookie(const std::string& key, const std::string& value) {
-      cookies_to_add.emplace(key, value);
-    }
-  };
-
-  void before_handle(request& req, response& res, context& ctx) {
-    int count = req.headers.count("Cookie");
-    if (count == 0) {
-      return;
-    }
-    if (count > 1) {
-      res.code = 400;
-      res.end();
-      return;
-    }
-    std::string cookies = req.get_header_value("Cookie");
-    size_t pos = 0;
-    while (pos < cookies.size()) {
-      size_t pos_equal = cookies.find('=', pos);
-      if (pos_equal == cookies.npos) {
-        break;
-      }
-      std::string name = cookies.substr(pos, pos_equal - pos);
-      boost::trim(name);
-      pos = pos_equal + 1;
-      while (pos < cookies.size() && cookies[pos] == ' ') {
-        pos++;
-      }
-      if (pos == cookies.size()) {
-        break;
-      }
-
-      std::string value;
-
-      if (cookies[pos] == '"') {
-        int dquote_meet_count = 0;
-        pos++;
-        size_t pos_dquote = pos - 1;
-        do {
-          pos_dquote = cookies.find('"', pos_dquote + 1);
-          dquote_meet_count++;
-        } while (pos_dquote < cookies.size() &&
-                 cookies[pos_dquote - 1] == '\\');
-        if (pos_dquote == cookies.npos) {
-          break;
-        }
-
-        if (dquote_meet_count == 1) {
-          value = cookies.substr(pos, pos_dquote - pos);
-        } else {
-          value.clear();
-          value.reserve(pos_dquote - pos);
-          for (size_t p = pos; p < pos_dquote; p++) {
-            // FIXME minimal escaping
-            if (cookies[p] == '\\' && p + 1 < pos_dquote) {
-              p++;
-              if (cookies[p] == '\\' || cookies[p] == '"') {
-                value += cookies[p];
-              } else {
-                value += '\\';
-                value += cookies[p];
-              }
-            } else {
-              value += cookies[p];
-            }
-          }
-        }
-
-        ctx.jar.emplace(std::move(name), std::move(value));
-        pos = cookies.find(';', pos_dquote + 1);
-        if (pos == cookies.npos) {
-          break;
-        }
-        pos++;
-        while (pos < cookies.size() && cookies[pos] == ' ') {
-          pos++;
-        }
-        if (pos == cookies.size()) {
-          break;
-        }
-      } else {
-        size_t pos_semicolon = cookies.find(';', pos);
-        value = cookies.substr(pos, pos_semicolon - pos);
-        boost::trim(value);
-        ctx.jar.emplace(std::move(name), std::move(value));
-        pos = pos_semicolon;
-        if (pos == cookies.npos) {
-          break;
-        }
-        pos++;
-        while (pos < cookies.size() && cookies[pos] == ' ') {
-          pos++;
-        }
-        if (pos == cookies.size()) {
-          break;
-        }
-      }
-    }
-  }
-
-  void after_handle(request& /*req*/, response& res, context& ctx) {
-    for (auto& cookie : ctx.cookies_to_add) {
-      res.add_header("Set-Cookie", cookie.first + "=" + cookie.second);
-    }
-  }
-};
-
-/*
-App<CookieParser, AnotherJarMW> app;
-A B C
-A::context
-    int aa;
-
-ctx1 : public A::context
-ctx2 : public ctx1, public B::context
-ctx3 : public ctx2, public C::context
-
-C depends on A
-
-C::handle
-    context.aaa
-
-App::context : private CookieParser::contetx, ...
-{
-    jar
-
-}
-
-SimpleApp
-*/
-}  // namespace crow
diff --git a/crow/include/crow/mustache.h b/crow/include/crow/mustache.h
deleted file mode 100644
index 01d969d..0000000
--- a/crow/include/crow/mustache.h
+++ /dev/null
@@ -1,576 +0,0 @@
-#pragma once
-#include <fstream>
-#include <functional>
-#include <iterator>
-#include <string>
-#include <vector>
-#include "crow/json.h"
-namespace crow {
-namespace mustache {
-using context = json::wvalue;
-
-template_t load(const std::string& filename);
-
-class invalid_template_exception : public std::exception {
- public:
-  explicit invalid_template_exception(const std::string& msg)
-      : msg("crow::mustache error: " + msg) {}
-  const char* what() const throw() override { return msg.c_str(); }
-  std::string msg;
-};
-
-enum class ActionType {
-  Ignore,
-  Tag,
-  UnescapeTag,
-  OpenBlock,
-  CloseBlock,
-  ElseBlock,
-  Partial,
-};
-
-struct Action {
-  int start;
-  int end;
-  int pos;
-  ActionType t;
-  Action(ActionType t, int start, int end, int pos = 0)
-      : start(start), end(end), pos(pos), t(t) {}
-};
-
-class template_t {
- public:
-  explicit template_t(std::string body) : body_(std::move(body)) {
-    // {{ {{# {{/ {{^ {{! {{> {{=
-    parse();
-  }
-
- private:
-  std::string tag_name(const Action& action) {
-    return body_.substr(action.start, action.end - action.start);
-  }
-  auto find_context(const std::string& name, const std::vector<context*>& stack)
-      -> std::pair<bool, context&> {
-    if (name == ".") {
-      return {true, *stack.back()};
-    }
-    int dotPosition = name.find('.');
-    if (dotPosition == static_cast<int>(name.npos)) {
-      for (auto it = stack.rbegin(); it != stack.rend(); ++it) {
-        if ((*it)->t() == json::type::Object) {
-          if ((*it)->count(name) != 0) {
-            return {true, (**it)[name]};
-          }
-        }
-      }
-    } else {
-      std::vector<int> dotPositions;
-      dotPositions.push_back(-1);
-      while (dotPosition != static_cast<int>(name.npos)) {
-        dotPositions.push_back(dotPosition);
-        dotPosition = name.find('.', dotPosition + 1);
-      }
-      dotPositions.push_back(name.size());
-      std::vector<std::string> names;
-      names.reserve(dotPositions.size() - 1);
-      for (int i = 1; i < static_cast<int>(dotPositions.size()); i++) {
-        names.emplace_back(
-            name.substr(dotPositions[i - 1] + 1,
-                        dotPositions[i] - dotPositions[i - 1] - 1));
-      }
-
-      for (auto it = stack.rbegin(); it != stack.rend(); ++it) {
-        context* view = *it;
-        bool found = true;
-        for (auto& name : names) {
-          if (view->t() == json::type::Object && (view->count(name) != 0)) {
-            view = &(*view)[name];
-          } else {
-            found = false;
-            break;
-          }
-        }
-        if (found) {
-          return { true, *view };
-        }
-      }
-    }
-
-    static json::wvalue empty_str;
-    empty_str = "";
-    return {false, empty_str};
-  }
-
-  void escape(const std::string& in, std::string& out) {
-    out.reserve(out.size() + in.size());
-    for (char it : in) {
-      switch (it) {
-        case '&':
-          out += "&amp;";
-          break;
-        case '<':
-          out += "&lt;";
-          break;
-        case '>':
-          out += "&gt;";
-          break;
-        case '"':
-          out += "&quot;";
-          break;
-        case '\'':
-          out += "&#39;";
-          break;
-        case '/':
-          out += "&#x2F;";
-          break;
-        default:
-          out += it;
-          break;
-      }
-    }
-  }
-
-  void render_internal(int actionBegin, int actionEnd,
-                       std::vector<context*>& stack, std::string& out,
-                       int indent) {
-    int current = actionBegin;
-
-    if (indent != 0) {
-      out.insert(out.size(), indent, ' ');
-    }
-
-    while (current < actionEnd) {
-      auto& fragment = fragments_[current];
-      auto& action = actions_[current];
-      render_fragment(fragment, indent, out);
-      switch (action.t) {
-        case ActionType::Ignore:
-          // do nothing
-          break;
-        case ActionType::Partial: {
-          std::string partial_name = tag_name(action);
-          auto partial_templ = load(partial_name);
-          int partial_indent = action.pos;
-          partial_templ.render_internal(
-              0, partial_templ.fragments_.size() - 1, stack, out,
-              partial_indent != 0 ? indent + partial_indent : 0);
-        } break;
-        case ActionType::UnescapeTag:
-        case ActionType::Tag: {
-          auto optional_ctx = find_context(tag_name(action), stack);
-          auto& ctx = optional_ctx.second;
-          switch (ctx.t()) {
-            case json::type::Number:
-              out += json::dump(ctx);
-              break;
-            case json::type::String:
-              if (action.t == ActionType::Tag) {
-                escape(ctx.s, out);
-              } else {
-                out += ctx.s;
-              }
-              break;
-            default:
-              throw std::runtime_error(
-                  "not implemented tag type" +
-                  std::to_string(static_cast<int>(ctx.t())));
-          }
-        } break;
-        case ActionType::ElseBlock: {
-          static context nullContext;
-          auto optional_ctx = find_context(tag_name(action), stack);
-          if (!optional_ctx.first) {
-            stack.emplace_back(&nullContext);
-            break;
-          }
-
-          auto& ctx = optional_ctx.second;
-          switch (ctx.t()) {
-            case json::type::List:
-              if (ctx.l && !ctx.l->empty()) {
-                current = action.pos;
-              } else {
-                stack.emplace_back(&nullContext);
-              }
-              break;
-            case json::type::False:
-            case json::type::Null:
-              stack.emplace_back(&nullContext);
-              break;
-            default:
-              current = action.pos;
-              break;
-          }
-          break;
-        }
-        case ActionType::OpenBlock: {
-          auto optional_ctx = find_context(tag_name(action), stack);
-          if (!optional_ctx.first) {
-            current = action.pos;
-            break;
-          }
-
-          auto& ctx = optional_ctx.second;
-          switch (ctx.t()) {
-            case json::type::List:
-              if (ctx.l) {
-                for (auto& it : *ctx.l) {
-                  stack.push_back(&it);
-                  render_internal(current + 1, action.pos, stack, out, indent);
-                  stack.pop_back();
-                }
-              }
-              current = action.pos;
-              break;
-            case json::type::Number:
-            case json::type::String:
-            case json::type::Object:
-            case json::type::True:
-              stack.push_back(&ctx);
-              break;
-            case json::type::False:
-            case json::type::Null:
-              current = action.pos;
-              break;
-            default:
-              throw std::runtime_error(
-                  "{{#: not implemented context type: " +
-                  std::to_string(static_cast<int>(ctx.t())));
-              break;
-          }
-          break;
-        }
-        case ActionType::CloseBlock:
-          stack.pop_back();
-          break;
-        default:
-          throw std::runtime_error("not implemented " +
-                                   std::to_string(static_cast<int>(action.t)));
-      }
-      current++;
-    }
-    auto& fragment = fragments_[actionEnd];
-    render_fragment(fragment, indent, out);
-  }
-  void render_fragment(const std::pair<int, int> fragment, int indent,
-                       std::string& out) {
-    if (indent != 0) {
-      for (int i = fragment.first; i < fragment.second; i++) {
-        out += body_[i];
-        if (body_[i] == '\n' && i + 1 != static_cast<int>(body_.size())) {
-          out.insert(out.size(), indent, ' ');
-        }
-      }
-    } else {
-      out.insert(out.size(), body_, fragment.first,
-                 fragment.second - fragment.first);
-    }
-  }
-
- public:
-  std::string render() {
-    context empty_ctx;
-    std::vector<context*> stack;
-    stack.emplace_back(&empty_ctx);
-
-    std::string ret;
-    render_internal(0, fragments_.size() - 1, stack, ret, 0);
-    return ret;
-  }
-  std::string render(context& ctx) {
-    std::vector<context*> stack;
-    stack.emplace_back(&ctx);
-
-    std::string ret;
-    render_internal(0, fragments_.size() - 1, stack, ret, 0);
-    return ret;
-  }
-
- private:
-  void parse() {
-    std::string tag_open = "{{";
-    std::string tag_close = "}}";
-
-    std::vector<int> blockPositions;
-
-    size_t current = 0;
-    while (1) {
-      size_t idx = body_.find(tag_open, current);
-      if (idx == body_.npos) {
-        fragments_.emplace_back(current, body_.size());
-        actions_.emplace_back(ActionType::Ignore, 0, 0);
-        break;
-      }
-      fragments_.emplace_back(current, idx);
-
-      idx += tag_open.size();
-      size_t endIdx = body_.find(tag_close, idx);
-      if (endIdx == idx) {
-        throw invalid_template_exception("empty tag is not allowed");
-      }
-      if (endIdx == body_.npos) {
-        // error, no matching tag
-        throw invalid_template_exception("not matched opening tag");
-      }
-      current = endIdx + tag_close.size();
-      switch (body_[idx]) {
-        case '#':
-          idx++;
-          while (body_[idx] == ' ') {
-            idx++;
-          }
-          while (body_[endIdx - 1] == ' ') {
-            endIdx--;
-          }
-          blockPositions.emplace_back(actions_.size());
-          actions_.emplace_back(ActionType::OpenBlock, idx, endIdx);
-          break;
-        case '/':
-          idx++;
-          while (body_[idx] == ' ') {
-            idx++;
-          }
-          while (body_[endIdx - 1] == ' ') {
-            endIdx--;
-          }
-          {
-            auto& matched = actions_[blockPositions.back()];
-            if (body_.compare(idx, endIdx - idx, body_, matched.start,
-                              matched.end - matched.start) != 0) {
-              throw invalid_template_exception(
-                  "not matched {{# {{/ pair: " +
-                  body_.substr(matched.start, matched.end - matched.start) +
-                  ", " + body_.substr(idx, endIdx - idx));
-            }
-            matched.pos = actions_.size();
-          }
-          actions_.emplace_back(ActionType::CloseBlock, idx, endIdx,
-                                blockPositions.back());
-          blockPositions.pop_back();
-          break;
-        case '^':
-          idx++;
-          while (body_[idx] == ' ') {
-            idx++;
-          }
-          while (body_[endIdx - 1] == ' ') {
-            endIdx--;
-          }
-          blockPositions.emplace_back(actions_.size());
-          actions_.emplace_back(ActionType::ElseBlock, idx, endIdx);
-          break;
-        case '!':
-          // do nothing action
-          actions_.emplace_back(ActionType::Ignore, idx + 1, endIdx);
-          break;
-        case '>':  // partial
-          idx++;
-          while (body_[idx] == ' ') {
-            idx++;
-          }
-          while (body_[endIdx - 1] == ' ') {
-            endIdx--;
-          }
-          actions_.emplace_back(ActionType::Partial, idx, endIdx);
-          break;
-        case '{':
-          if (tag_open != "{{" || tag_close != "}}") {
-            throw invalid_template_exception(
-                "cannot use triple mustache when delimiter changed");
-          }
-
-          idx++;
-          if (body_[endIdx + 2] != '}') {
-            throw invalid_template_exception("{{{: }}} not matched");
-          }
-          while (body_[idx] == ' ') {
-            idx++;
-          }
-          while (body_[endIdx - 1] == ' ') {
-            endIdx--;
-          }
-          actions_.emplace_back(ActionType::UnescapeTag, idx, endIdx);
-          current++;
-          break;
-        case '&':
-          idx++;
-          while (body_[idx] == ' ') {
-            idx++;
-          }
-          while (body_[endIdx - 1] == ' ') {
-            endIdx--;
-          }
-          actions_.emplace_back(ActionType::UnescapeTag, idx, endIdx);
-          break;
-        case '=':
-          // tag itself is no-op
-          idx++;
-          actions_.emplace_back(ActionType::Ignore, idx, endIdx);
-          endIdx--;
-          if (body_[endIdx] != '=') {
-            throw invalid_template_exception("{{=: not matching = tag: " +
-                                             body_.substr(idx, endIdx - idx));
-          }
-          endIdx--;
-          while (body_[idx] == ' ') {
-            idx++;
-          }
-          while (body_[endIdx] == ' ') {
-            endIdx--;
-          }
-          endIdx++;
-          {
-            bool succeeded = false;
-            for (size_t i = idx; i < endIdx; i++) {
-              if (body_[i] == ' ') {
-                tag_open = body_.substr(idx, i - idx);
-                while (body_[i] == ' ') {
-                  i++;
-                }
-                tag_close = body_.substr(i, endIdx - i);
-                if (tag_open.empty()) {
-                  throw invalid_template_exception("{{=: empty open tag");
-                }
-                if (tag_close.empty()) {
-                  throw invalid_template_exception("{{=: empty close tag");
-                }
-
-                if (tag_close.find(' ') != tag_close.npos) {
-                  throw invalid_template_exception(
-                      "{{=: invalid open/close tag: " + tag_open + " " +
-                      tag_close);
-                }
-                succeeded = true;
-                break;
-              }
-            }
-            if (!succeeded) {
-              throw invalid_template_exception(
-                  "{{=: cannot find space between new open/close tags");
-            }
-          }
-          break;
-        default:
-          // normal tag case;
-          while (body_[idx] == ' ') {
-            idx++;
-          }
-          while (body_[endIdx - 1] == ' ') {
-            endIdx--;
-          }
-          actions_.emplace_back(ActionType::Tag, idx, endIdx);
-          break;
-      }
-    }
-
-    // removing standalones
-    for (int i = actions_.size() - 2; i >= 0; i--) {
-      if (actions_[i].t == ActionType::Tag ||
-          actions_[i].t == ActionType::UnescapeTag) {
-        continue;
-      }
-      auto& fragment_before = fragments_[i];
-      auto& fragment_after = fragments_[i + 1];
-      bool is_last_action = i == static_cast<int>(actions_.size()) - 2;
-      bool all_space_before = true;
-      int j, k;
-      for (j = fragment_before.second - 1; j >= fragment_before.first; j--) {
-        if (body_[j] != ' ') {
-          all_space_before = false;
-          break;
-        }
-      }
-      if (all_space_before && i > 0) {
-        continue;
-      }
-      if (!all_space_before && body_[j] != '\n') {
-        continue;
-      }
-      bool all_space_after = true;
-      for (k = fragment_after.first;
-           k < static_cast<int>(body_.size()) && k < fragment_after.second;
-           k++) {
-        if (body_[k] != ' ') {
-          all_space_after = false;
-          break;
-        }
-      }
-      if (all_space_after && !is_last_action) {
-        continue;
-      }
-      if (!all_space_after &&
-          !(body_[k] == '\n' ||
-            (body_[k] == '\r' && k + 1 < static_cast<int>(body_.size()) &&
-             body_[k + 1] == '\n'))) {
-        continue;
-      }
-      if (actions_[i].t == ActionType::Partial) {
-        actions_[i].pos = fragment_before.second - j - 1;
-      }
-      fragment_before.second = j + 1;
-      if (!all_space_after) {
-        if (body_[k] == '\n') {
-          k++;
-        } else {
-          k += 2;
-        }
-        fragment_after.first = k;
-      }
-    }
-  }
-
-  std::vector<std::pair<int, int>> fragments_;
-  std::vector<Action> actions_;
-  std::string body_;
-};
-
-inline template_t compile(const std::string& body) { return template_t(body); }
-namespace detail {
-inline std::string& get_template_base_directory_ref() {
-  static std::string template_base_directory = "templates";
-  return template_base_directory;
-}
-}  // namespace detail
-
-inline std::string default_loader(const std::string& filename) {
-  std::string path = detail::get_template_base_directory_ref();
-  if (!(path.back() == '/' || path.back() == '\\')) {
-    path += '/';
-  }
-  path += filename;
-  std::ifstream inf(path);
-  if (!inf) {
-    return {};
-  }
-  return {std::istreambuf_iterator<char>(inf),
-          std::istreambuf_iterator<char>()};
-}
-
-namespace detail {
-inline std::function<std::string(std::string)>& get_loader_ref() {
-  static std::function<std::string(std::string)> loader = default_loader;
-  return loader;
-}
-}  // namespace detail
-
-inline void set_base(const std::string& path) {
-  auto& base = detail::get_template_base_directory_ref();
-  base = path;
-  if (base.back() != '\\' && base.back() != '/') {
-    base += '/';
-  }
-}
-
-inline void set_loader(std::function<std::string(std::string)> loader) {
-  detail::get_loader_ref() = std::move(loader);
-}
-
-inline std::string load_text(const std::string& filename) {
-  return detail::get_loader_ref()(filename);
-}
-
-inline template_t load(const std::string& filename) {
-  return compile(detail::get_loader_ref()(filename));
-}
-}  // namespace mustache
-}  // namespace crow
diff --git a/crow/include/crow/parser.h b/crow/include/crow/parser.h
deleted file mode 100644
index c5f8824..0000000
--- a/crow/include/crow/parser.h
+++ /dev/null
@@ -1,137 +0,0 @@
-#pragma once
-
-#include <algorithm>
-#include <boost/algorithm/string.hpp>
-#include <boost/tokenizer.hpp>
-#include <string>
-
-#include "crow/http_parser_merged.h"
-#include "crow/http_request.h"
-
-namespace crow {
-template <typename Handler>
-struct HTTPParser : public http_parser {
-  static int on_message_begin(http_parser* self_) {
-    auto* self = static_cast<HTTPParser*>(self_);
-    self->clear();
-    return 0;
-  }
-  static int on_url(http_parser* self_, const char* at, size_t length) {
-    auto* self = static_cast<HTTPParser*>(self_);
-    self->raw_url.insert(self->raw_url.end(), at, at + length);
-    return 0;
-  }
-  static int on_header_field(http_parser* self_, const char* at,
-                             size_t length) {
-    auto* self = static_cast<HTTPParser*>(self_);
-    switch (self->header_building_state) {
-      case 0:
-        if (!self->header_value.empty()) {
-          self->headers.emplace(std::move(self->header_field),
-                                std::move(self->header_value));
-        }
-        self->header_field.assign(at, at + length);
-        self->header_building_state = 1;
-        break;
-      case 1:
-        self->header_field.insert(self->header_field.end(), at, at + length);
-        break;
-    }
-    return 0;
-  }
-  static int on_header_value(http_parser* self_, const char* at,
-                             size_t length) {
-    auto* self = static_cast<HTTPParser*>(self_);
-    switch (self->header_building_state) {
-      case 0:
-        self->header_value.insert(self->header_value.end(), at, at + length);
-        break;
-      case 1:
-        self->header_building_state = 0;
-        self->header_value.assign(at, at + length);
-        break;
-    }
-    return 0;
-  }
-  static int on_headers_complete(http_parser* self_) {
-    auto* self = static_cast<HTTPParser*>(self_);
-    if (!self->header_field.empty()) {
-      self->headers.emplace(std::move(self->header_field),
-                            std::move(self->header_value));
-    }
-    self->process_header();
-    return 0;
-  }
-  static int on_body(http_parser* self_, const char* at, size_t length) {
-    auto* self = static_cast<HTTPParser*>(self_);
-    self->body.insert(self->body.end(), at, at + length);
-    return 0;
-  }
-  static int on_message_complete(http_parser* self_) {
-    auto* self = static_cast<HTTPParser*>(self_);
-
-    // url params
-    self->url = self->raw_url.substr(0, self->raw_url.find('?'));
-    self->url_params = query_string(self->raw_url);
-
-    self->process_message();
-    return 0;
-  }
-  explicit HTTPParser(Handler* handler) : http_parser(), handler_(handler) {
-    http_parser_init(this, HTTP_REQUEST);
-  }
-
-  // return false on error
-  bool feed(const char* buffer, int length) {
-    const static http_parser_settings settings_{
-        on_message_begin, on_url,
-        nullptr,          on_header_field,
-        on_header_value,  on_headers_complete,
-        on_body,          on_message_complete,
-    };
-
-    int nparsed = http_parser_execute(this, &settings_, buffer, length);
-    return nparsed == length;
-  }
-
-  bool done() { return feed(nullptr, 0); }
-
-  void clear() {
-    url.clear();
-    raw_url.clear();
-    header_building_state = 0;
-    header_field.clear();
-    header_value.clear();
-    headers.clear();
-    url_params.clear();
-    body.clear();
-  }
-
-  void process_header() { handler_->handle_header(); }
-
-  void process_message() { handler_->handle(); }
-
-  request to_request() const {
-    return request{(HTTPMethod)method,    std::move(raw_url), std::move(url),
-                   std::move(url_params), std::move(headers), std::move(body)};
-  }
-
-  bool is_upgrade() const { return upgrade; }
-
-  bool check_version(int major, int minor) const {
-    return http_major == major && http_minor == minor;
-  }
-
-  std::string raw_url;
-  std::string url;
-
-  int header_building_state = 0;
-  std::string header_field;
-  std::string header_value;
-  ci_map headers;
-  query_string url_params;
-  std::string body;
-
-  Handler* handler_;
-};
-} // namespace crow
diff --git a/crow/include/crow/routing.h b/crow/include/crow/routing.h
index 30bb845..0fe692e 100644
--- a/crow/include/crow/routing.h
+++ b/crow/include/crow/routing.h
@@ -1,6 +1,8 @@
 #pragma once
 
+#include <cerrno>
 #include <cstdint>
+#include <cstdlib>
 #include <limits>
 #include <memory>
 #include <tuple>
@@ -32,12 +34,12 @@
 
   virtual void handle(const request&, response&, const routing_params&) = 0;
   virtual void handle_upgrade(const request&, response& res, SocketAdaptor&&) {
-    res = response(404);
+    res = response(boost::beast::http::status::not_found);
     res.end();
   }
 #ifdef CROW_ENABLE_SSL
   virtual void handle_upgrade(const request&, response& res, SSLAdaptor&&) {
-    res = response(404);
+    res = response(boost::beast::http::status::not_found);
     res.end();
   }
 #endif
@@ -45,7 +47,7 @@
   uint32_t get_methods() { return methods_; }
 
  protected:
-  uint32_t methods_{1 << (int)HTTPMethod::Get};
+  uint32_t methods_{1 << (int)boost::beast::http::verb::get};
 
   std::string rule_;
   std::string name_;
@@ -249,7 +251,7 @@
   void validate() override {}
 
   void handle(const request&, response& res, const routing_params&) override {
-    res = response(404);
+    res = response(boost::beast::http::status::not_found);
     res.end();
   }
 
@@ -315,13 +317,13 @@
     return (self_t&)*this;
   }
 
-  self_t& methods(HTTPMethod method) {
+  self_t& methods(boost::beast::http::verb method) {
     ((self_t*)this)->methods_ = 1 << (int)method;
     return (self_t&)*this;
   }
 
   template <typename... MethodArgs>
-  self_t& methods(HTTPMethod method, MethodArgs... args_method) {
+  self_t& methods(boost::beast::http::verb method, MethodArgs... args_method) {
     methods(args_method...);
     ((self_t*)this)->methods_ |= 1 << (int)method;
     return (self_t&)*this;
@@ -577,8 +579,8 @@
   }
 
   std::pair<unsigned, routing_params> find(
-      const std::string& req_url, const Node* node = nullptr, unsigned pos = 0,
-      routing_params* params = nullptr) const {
+      const boost::string_view req_url, const Node* node = nullptr,
+      unsigned pos = 0, routing_params* params = nullptr) const {
     routing_params empty;
     if (params == nullptr) params = &empty;
 
@@ -601,7 +603,7 @@
       if ((c >= '0' && c <= '9') || c == '+' || c == '-') {
         char* eptr;
         errno = 0;
-        long long int value = strtoll(req_url.data() + pos, &eptr, 10);
+        long long int value = std::strtoll(req_url.data() + pos, &eptr, 10);
         if (errno != ERANGE && eptr != req_url.data() + pos) {
           params->int_params.push_back(value);
           auto ret =
@@ -619,7 +621,7 @@
         char* eptr;
         errno = 0;
         unsigned long long int value =
-            strtoull(req_url.data() + pos, &eptr, 10);
+            std::strtoull(req_url.data() + pos, &eptr, 10);
         if (errno != ERANGE && eptr != req_url.data() + pos) {
           params->uint_params.push_back(value);
           auto ret = find(req_url,
@@ -636,7 +638,7 @@
       if ((c >= '0' && c <= '9') || c == '+' || c == '-' || c == '.') {
         char* eptr;
         errno = 0;
-        double value = strtod(req_url.data() + pos, &eptr);
+        double value = std::strtod(req_url.data() + pos, &eptr);
         if (errno != ERANGE && eptr != req_url.data() + pos) {
           params->double_params.push_back(value);
           auto ret = find(
@@ -655,7 +657,7 @@
       }
 
       if (epos != pos) {
-        params->string_params.push_back(req_url.substr(pos, epos - pos));
+        params->string_params.emplace_back(req_url.substr(pos, epos - pos));
         auto ret = find(req_url,
                         &nodes_[node->param_childrens[(int)ParamType::STRING]],
                         epos, params);
@@ -668,7 +670,7 @@
       size_t epos = req_url.size();
 
       if (epos != pos) {
-        params->string_params.push_back(req_url.substr(pos, epos - pos));
+        params->string_params.emplace_back(req_url.substr(pos, epos - pos));
         auto ret =
             find(req_url, &nodes_[node->param_childrens[(int)ParamType::PATH]],
                  epos, params);
@@ -807,6 +809,7 @@
         typename black_magic::arguments<N>::type::template rebind<TaggedRule>;
     std::unique_ptr<RuleT> ruleObject = std::make_unique<RuleT>(rule);
     RuleT* ptr = ruleObject.get();
+
     internal_add_rule_object(rule, std::move(ruleObject));
 
     return *ptr;
@@ -841,7 +844,7 @@
     unsigned rule_index = found.first;
     if (!rule_index) {
       CROW_LOG_DEBUG << "Cannot match rules " << req.url;
-      res = response(404);
+      res = response(boost::beast::http::status::not_found);
       res.end();
       return;
     }
@@ -851,35 +854,36 @@
 
     if (rule_index == RULE_SPECIAL_REDIRECT_SLASH) {
       CROW_LOG_INFO << "Redirecting to a url with trailing slash: " << req.url;
-      res = response(301);
+      res = response(boost::beast::http::status::moved_permanently);
 
       // TODO absolute url building
       if (req.get_header_value("Host").empty()) {
-        res.add_header("Location", req.url + "/");
+        res.add_header("Location", std::string(req.url) + "/");
       } else {
-        res.add_header(
-            "Location",
-            req.is_secure
-                ? "https://"
-                : "http://" + req.get_header_value("Host") + req.url + "/");
+        res.add_header("Location",
+                       req.is_secure
+                           ? "https://"
+                           : "http://" +
+                                 std::string(req.get_header_value("Host")) +
+                                 std::string(req.url) + "/");
       }
       res.end();
       return;
     }
 
-    if ((rules_[rule_index]->get_methods() & (1 << (uint32_t)req.method)) ==
+    if ((rules_[rule_index]->get_methods() & (1 << (uint32_t)req.method())) ==
         0) {
       CROW_LOG_DEBUG << "Rule found but method mismatch: " << req.url
-                     << " with " << method_name(req.method) << "("
-                     << (uint32_t)req.method << ") / "
+                     << " with " << req.method_string() << "("
+                     << (uint32_t)req.method() << ") / "
                      << rules_[rule_index]->get_methods();
-      res = response(404);
+      res = response(boost::beast::http::status::not_found);
       res.end();
       return;
     }
 
     CROW_LOG_DEBUG << "Matched rule (upgrade) '" << rules_[rule_index]->rule_
-                   << "' " << (uint32_t)req.method << " / "
+                   << "' " << (uint32_t)req.method() << " / "
                    << rules_[rule_index]->get_methods();
 
     // any uncaught exceptions become 500s
@@ -887,13 +891,13 @@
       rules_[rule_index]->handle_upgrade(req, res, std::move(adaptor));
     } catch (std::exception& e) {
       CROW_LOG_ERROR << "An uncaught exception occurred: " << e.what();
-      res = response(500);
+      res = response(boost::beast::http::status::internal_server_error);
       res.end();
       return;
     } catch (...) {
       CROW_LOG_ERROR << "An uncaught exception occurred. The type was unknown "
                         "so no information was available.";
-      res = response(500);
+      res = response(boost::beast::http::status::internal_server_error);
       res.end();
       return;
     }
@@ -906,7 +910,7 @@
 
     if (!rule_index) {
       CROW_LOG_DEBUG << "Cannot match rules " << req.url;
-      res = response(404);
+      res = response(boost::beast::http::status::not_found);
       res.end();
       return;
     }
@@ -916,33 +920,34 @@
 
     if (rule_index == RULE_SPECIAL_REDIRECT_SLASH) {
       CROW_LOG_INFO << "Redirecting to a url with trailing slash: " << req.url;
-      res = response(301);
+      res = response(boost::beast::http::status::moved_permanently);
 
       // TODO absolute url building
       if (req.get_header_value("Host").empty()) {
-        res.add_header("Location", req.url + "/");
+        res.add_header("Location", std::string(req.url) + "/");
       } else {
-        res.add_header("Location", (req.is_secure ? "https://" : "http://") +
-                                       req.get_header_value("Host") + req.url +
-                                       "/");
+        res.add_header("Location",
+                       (req.is_secure ? "https://" : "http://") +
+                           std::string(req.get_header_value("Host")) +
+                           std::string(req.url) + "/");
       }
       res.end();
       return;
     }
 
-    if ((rules_[rule_index]->get_methods() & (1 << (uint32_t)req.method)) ==
+    if ((rules_[rule_index]->get_methods() & (1 << (uint32_t)req.method())) ==
         0) {
       CROW_LOG_DEBUG << "Rule found but method mismatch: " << req.url
-                     << " with " << method_name(req.method) << "("
-                     << (uint32_t)req.method << ") / "
+                     << " with " << req.method_string() << "("
+                     << (uint32_t)req.method() << ") / "
                      << rules_[rule_index]->get_methods();
-      res = response(404);
+      res = response(boost::beast::http::status::not_found);
       res.end();
       return;
     }
 
     CROW_LOG_DEBUG << "Matched rule '" << rules_[rule_index]->rule_ << "' "
-                   << (uint32_t)req.method << " / "
+                   << (uint32_t)req.method() << " / "
                    << rules_[rule_index]->get_methods();
 
     // any uncaught exceptions become 500s
@@ -950,13 +955,13 @@
       rules_[rule_index]->handle(req, res, found.second);
     } catch (std::exception& e) {
       CROW_LOG_ERROR << "An uncaught exception occurred: " << e.what();
-      res = response(500);
+      res = response(boost::beast::http::status::internal_server_error);
       res.end();
       return;
     } catch (...) {
       CROW_LOG_ERROR << "An uncaught exception occurred. The type was unknown "
                         "so no information was available.";
-      res = response(500);
+      res = response(boost::beast::http::status::internal_server_error);
       res.end();
       return;
     }
diff --git a/crow/include/crow/settings.h b/crow/include/crow/settings.h
index 9d29a99..8dbd516 100644
--- a/crow/include/crow/settings.h
+++ b/crow/include/crow/settings.h
@@ -2,6 +2,12 @@
 // settings for crow
 // TODO - replace with runtime config. libucl?
 
+/* #ifdef - enables debug mode */
+//#define CROW_ENABLE_DEBUG
+
+/* #ifdef - enables logging */
+//#define CROW_ENABLE_LOGGING
+
 /* #ifdef - enables ssl */
 //#define CROW_ENABLE_SSL
 
diff --git a/crow/include/crow/socket_adaptors.h b/crow/include/crow/socket_adaptors.h
index a8a55ed..a057240 100644
--- a/crow/include/crow/socket_adaptors.h
+++ b/crow/include/crow/socket_adaptors.h
@@ -2,6 +2,8 @@
 #include "crow/logging.h"
 #include "crow/settings.h"
 #include <boost/asio.hpp>
+#include <boost/lexical_cast.hpp>
+
 #ifdef CROW_ENABLE_SSL
 #include <boost/asio/ssl.hpp>
 #endif
@@ -21,7 +23,14 @@
 
   tcp::socket& socket() { return socket_; }
 
-  tcp::endpoint remote_endpoint() { return socket_.remote_endpoint(); }
+  std::string remote_endpoint() {
+    boost::system::error_code ec;
+    tcp::endpoint ep = socket_.remote_endpoint(ec);
+    if (ec) {
+      return "";
+    }
+    return boost::lexical_cast<std::string>(ep);
+  }
 
   bool is_open() { return socket_.is_open(); }
 
@@ -47,7 +56,7 @@
 
   tcp::socket& socket() { return socket_; }
 
-  tcp::endpoint remote_endpoint() { return socket_.remote_endpoint(); }
+  std::string remote_endpoint() { return "Testhost"; }
 
   bool is_open() { return socket_.is_open(); }
 
@@ -75,7 +84,14 @@
     return ssl_socket_->lowest_layer();
   }
 
-  tcp::endpoint remote_endpoint() { return raw_socket().remote_endpoint(); }
+  std::string remote_endpoint() {
+    boost::system::error_code ec;
+    tcp::endpoint ep = raw_socket().remote_endpoint(ec);
+    if (ec) {
+      return "";
+    }
+    return boost::lexical_cast<std::string>(ep);
+  }
 
   bool is_open() {
     /*TODO(ed) this is a bit of a cheat.
diff --git a/crow/include/crow/timer_queue.h b/crow/include/crow/timer_queue.h
new file mode 100644
index 0000000..d886a63
--- /dev/null
+++ b/crow/include/crow/timer_queue.h
@@ -0,0 +1,63 @@
+#pragma once
+
+#include <chrono>
+#include <functional>
+#include "crow/logging.h"
+#include <boost/circular_buffer.hpp>
+#include <boost/circular_buffer/space_optimized.hpp>
+
+namespace crow {
+namespace detail {
+// fast timer queue for fixed tick value.
+class timer_queue {
+ public:
+  timer_queue() { dq_.set_capacity(100); }
+
+  void cancel(int k) {
+    unsigned int index = static_cast<unsigned int>(k - step_);
+    if (index < dq_.size()) {
+      dq_[index].second = nullptr;
+    }
+  }
+
+  int add(std::function<void()> f) {
+    dq_.push_back(
+        std::make_pair(std::chrono::steady_clock::now(), std::move(f)));
+    int ret = step_ + dq_.size() - 1;
+
+    CROW_LOG_DEBUG << "timer add inside: " << this << ' ' << ret;
+    return ret;
+  }
+
+  void process() {
+    auto now = std::chrono::steady_clock::now();
+    while (!dq_.empty()) {
+      auto& x = dq_.front();
+      if (now - x.first < std::chrono::seconds(5)) {
+        break;
+      }
+      if (x.second) {
+        CROW_LOG_DEBUG << "timer call: " << this << ' ' << step_;
+        // we know that timer handlers are very simple currenty; call here
+        x.second();
+      }
+      dq_.pop_front();
+      step_++;
+    }
+  }
+
+ private:
+  using storage_type =
+      std::pair<std::chrono::time_point<std::chrono::steady_clock>,
+                std::function<void()>>;
+
+  boost::circular_buffer_space_optimized<storage_type,
+                                         std::allocator<storage_type>>
+      dq_{};
+
+  // boost::circular_buffer<storage_type> dq_{20};
+  // std::deque<storage_type> dq_{};
+  int step_{};
+};
+}  // namespace detail
+}  // namespace crow
diff --git a/crow/include/crow/utility.h b/crow/include/crow/utility.h
index e2e9c16..7cae52e 100644
--- a/crow/include/crow/utility.h
+++ b/crow/include/crow/utility.h
@@ -6,7 +6,8 @@
 #include <stdexcept>
 #include <string>
 #include <tuple>
-#include <type_traits>
+#include <boost/utility/string_view.hpp>
+#include "nlohmann/json.hpp"
 
 #include "crow/settings.h"
 
@@ -518,7 +519,8 @@
 
 // TODO this is temporary and should be deleted once base64 is refactored out of
 // crow
-inline bool base64_decode(const std::string& input, std::string& output) {
+inline bool base64_decode(const boost::string_view input,
+                          std::string& output) {
   static const char nop = -1;
   // See note on encoding_data[] in above function
   static const char decoding_data[] = {
diff --git a/crow/include/crow/websocket.h b/crow/include/crow/websocket.h
index f3cd0e0..7cd48ef 100644
--- a/crow/include/crow/websocket.h
+++ b/crow/include/crow/websocket.h
@@ -1,9 +1,9 @@
 #pragma once
 #include <array>
-#include "crow/TinySHA1.hpp"
 #include "crow/http_request.h"
 #include "crow/socket_adaptors.h"
 #include <boost/algorithm/string/predicate.hpp>
+#include <boost/uuid/detail/sha1.hpp>
 
 namespace crow {
 namespace websocket {
@@ -57,12 +57,17 @@
     }
     // Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
     // Sec-WebSocket-Version: 13
-    std::string magic = req.get_header_value("Sec-WebSocket-Key") +
-                        "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
-    sha1::SHA1 s;
-    s.processBytes(magic.data(), magic.size());
-    uint8_t digest[20];
-    s.getDigestBytes(digest);
+    std::string magic(req.get_header_value("Sec-WebSocket-Key"));
+    magic += "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
+    boost::uuids::detail::sha1 s;
+    s.process_bytes(magic.data(), magic.size());
+
+    // sha1 digests are 20 bytes long
+    uint32_t digest[20 / sizeof(uint32_t)];
+    s.get_digest(digest);
+    for (int i = 0; i < 5; i++) {
+      digest[i] = htonl(digest[i]);
+    }
     start(crow::utility::base64encode(reinterpret_cast<char*>(digest), 20));
   }
 
diff --git a/include/ast_video_puller.hpp b/include/ast_video_puller.hpp
index 759aaeb..6cd7f37 100644
--- a/include/ast_video_puller.hpp
+++ b/include/ast_video_puller.hpp
@@ -148,7 +148,7 @@
     boost::asio::async_read(
         dev_video, mutable_buffer, [this](const boost::system::error_code &ec,
                                           std::size_t bytes_transferred) {
-          if (ec != nullptr) {
+          if (ec) {
             std::cerr << "Read failed with status " << ec << "\n";
           } else {
             this->read_done();
diff --git a/include/openbmc_dbus_rest.hpp b/include/openbmc_dbus_rest.hpp
index 4257127..e6052f1 100644
--- a/include/openbmc_dbus_rest.hpp
+++ b/include/openbmc_dbus_rest.hpp
@@ -2,6 +2,7 @@
 
 #include <tinyxml2.h>
 #include <dbus_singleton.hpp>
+#include <boost/algorithm/string.hpp>
 #include <boost/container/flat_set.hpp>
 
 namespace crow {
@@ -130,7 +131,7 @@
           const boost::system::error_code ec,
           const GetSubTreeType &object_names) {
         if (ec) {
-          res.code = 500;
+          res.result(boost::beast::http::status::internal_server_error);
           res.end();
           return;
         }
@@ -144,7 +145,7 @@
         }
 
         if (connections.size() <= 0) {
-          res.code = 404;
+          res.result(boost::beast::http::status::not_found);
           res.end();
           return;
         }
@@ -163,10 +164,10 @@
 
 template <typename... Middlewares>
 void request_routes(Crow<Middlewares...> &app) {
-  CROW_ROUTE(app, "/bus/").methods("GET"_method)([](const crow::request &req) {
-    return nlohmann::json{{"busses", {{{"name", "system"}}}}, {"status", "ok"}};
-
-  });
+  CROW_ROUTE(app, "/bus/")
+      .methods("GET"_method)([](const crow::request &req, crow::response &res) {
+        res.json_value = {{"busses", {{{"name", "system"}}}}, {"status", "ok"}};
+      });
 
   CROW_ROUTE(app, "/bus/system/")
       .methods("GET"_method)([](const crow::request &req, crow::response &res) {
@@ -174,7 +175,7 @@
         auto myCallback = [&res](const boost::system::error_code ec,
                                  std::vector<std::string> &names) {
           if (ec) {
-            res.code = 500;
+            res.result(boost::beast::http::status::internal_server_error);
           } else {
             std::sort(names.begin(), names.end());
             nlohmann::json j{{"status", "ok"}};
@@ -197,7 +198,7 @@
             [&res](const boost::system::error_code ec,
                    const std::vector<std::string> &object_paths) {
               if (ec) {
-                res.code = 500;
+                res.result(boost::beast::http::status::internal_server_error);
               } else {
                 res.json_value = {{"status", "ok"},
                                   {"message", "200 OK"},
@@ -232,21 +233,21 @@
           auto request_dbus_data =
               nlohmann::json::parse(req.body, nullptr, false);
           if (request_dbus_data.is_discarded()) {
-            res.code = 400;
+            res.result(boost::beast::http::status::unauthorized);
             res.end();
             return;
           }
 
           auto property_value_it = request_dbus_data.find("data");
           if (property_value_it == request_dbus_data.end()) {
-            res.code = 400;
+            res.result(boost::beast::http::status::unauthorized);
             res.end();
             return;
           }
 
           property_set_value = property_value_it->get<const std::string>();
           if (property_set_value.empty()) {
-            res.code = 400;
+            res.result(boost::beast::http::status::unauthorized);
             res.end();
             return;
           }
@@ -266,16 +267,16 @@
             ](const boost::system::error_code ec,
               const GetObjectType &object_names) {
               if (ec) {
-                res.code = 500;
+                res.result(boost::beast::http::status::internal_server_error);
                 res.end();
                 return;
               }
               if (object_names.size() != 1) {
-                res.code = 404;
+                res.result(boost::beast::http::status::not_found);
                 res.end();
                 return;
               }
-              if (req.method == "GET"_method) {
+              if (req.method() == "GET"_method) {
                 for (auto &interface : object_names[0].second) {
                   crow::connections::system_bus->async_method_call(
                       [&res, transaction](
@@ -303,7 +304,7 @@
                       object_names[0].first, object_path,
                       "org.freedesktop.DBus.Properties", "GetAll", interface);
                 }
-              } else if (req.method == "PUT"_method) {
+              } else if (req.method() == "PUT"_method) {
                 for (auto &interface : object_names[0].second) {
                   crow::connections::system_bus->async_method_call(
                       [
@@ -351,7 +352,7 @@
                           // if nobody filled in the property, all calls either
                           // errored, or failed
                           if (transaction == nullptr) {
-                            res.code = 403;
+                            res.result(boost::beast::http::status::forbidden);
                             res.json_value = {{"status", "error"},
                                               {"message", "403 Forbidden"},
                                               {"data",
@@ -426,7 +427,7 @@
         if (it != strs.end()) {
           // if there is more levels past the method name, something went
           // wrong, throw an error
-          res.code = 404;
+          res.result(boost::beast::http::status::not_found);
           res.end();
           return;
         }
@@ -452,8 +453,9 @@
                     CROW_LOG_ERROR << "XML document failed to parse "
                                    << process_name << " " << object_path
                                    << "\n";
-                    res.write(nlohmann::json{{"status", "XML parse error"}});
-                    res.code = 500;
+                    res.json_value = {{"status", "XML parse error"}};
+                    res.result(
+                        boost::beast::http::status::internal_server_error);
                   } else {
                     nlohmann::json interfaces_array = nlohmann::json::array();
                     tinyxml2::XMLElement *interface =
@@ -498,7 +500,8 @@
                     CROW_LOG_ERROR << "XML document failed to parse "
                                    << process_name << " " << object_path
                                    << "\n";
-                    res.code = 500;
+                    res.result(
+                        boost::beast::http::status::internal_server_error);
 
                   } else {
                     tinyxml2::XMLElement *node =
@@ -575,7 +578,7 @@
                     if (interface == nullptr) {
                       // if we got to the end of the list and never found a
                       // match, throw 404
-                      res.code = 404;
+                      res.result(boost::beast::http::status::not_found);
                     }
                   }
                 }
diff --git a/include/pam_authenticate.hpp b/include/pam_authenticate.hpp
index 5b4b454..997c297 100644
--- a/include/pam_authenticate.hpp
+++ b/include/pam_authenticate.hpp
@@ -1,8 +1,9 @@
 #pragma once
 
 #include <security/pam_appl.h>
-#include <memory>
 #include <cstring>
+#include <memory>
+#include <boost/utility/string_view.hpp>
 
 // function used to get user input
 inline int pam_function_conversation(int num_msg,
@@ -32,13 +33,15 @@
   return PAM_SUCCESS;
 }
 
-inline bool pam_authenticate_user(const std::string& username,
-                                  const std::string& password) {
+inline bool pam_authenticate_user(const boost::string_view username,
+                                  const boost::string_view password) {
+  std::string user_str(username);
+  std::string pass_str(password);
   const struct pam_conv local_conversation = {
-      pam_function_conversation, const_cast<char*>(password.c_str())};
+      pam_function_conversation, const_cast<char*>(pass_str.c_str())};
   pam_handle_t* local_auth_handle = NULL;  // this gets set by pam_start
 
-  if (pam_start("dropbear", username.c_str(), &local_conversation,
+  if (pam_start("dropbear", user_str.c_str(), &local_conversation,
                 &local_auth_handle) != PAM_SUCCESS) {
     return false;
   }
diff --git a/include/persistent_data_middleware.hpp b/include/persistent_data_middleware.hpp
index fcab52f..77a5bbb 100644
--- a/include/persistent_data_middleware.hpp
+++ b/include/persistent_data_middleware.hpp
@@ -68,11 +68,11 @@
         if (jSessions != data.end()) {
           if (jSessions->is_object()) {
             for (const auto& elem : *jSessions) {
-              UserSession newSession;
+              std::shared_ptr<UserSession> newSession = std::make_shared<UserSession>();
 
-              if (newSession.fromJson(elem)) {
-                session_store->auth_tokens.emplace(newSession.unique_id,
-                                                   std::move(newSession));
+              if (newSession->fromJson(elem)) {
+                session_store->auth_tokens.emplace(newSession->unique_id,
+                                                   newSession);
               }
             }
           }
diff --git a/include/redfish_v1.hpp b/include/redfish_v1.hpp
index 49a5a15..e8f4d7f 100644
--- a/include/redfish_v1.hpp
+++ b/include/redfish_v1.hpp
@@ -11,36 +11,6 @@
 namespace crow {
 namespace redfish {
 
-template <typename... Middlewares>
-void get_redfish_sub_routes(Crow<Middlewares...>& app, const std::string& url,
-                            nlohmann::json& j) {
-  std::vector<const std::string*> routes = app.get_routes(url);
-  for (auto route : routes) {
-    auto redfish_sub_route =
-        route->substr(url.size(), route->size() - url.size() - 1);
-    // check if the route is at this level, and we didn't find and exact match
-    // also, filter out resources that start with $ to remove $metadata
-    if (!redfish_sub_route.empty() && redfish_sub_route[0] != '$' &&
-        redfish_sub_route.find('/') == std::string::npos) {
-      j[redfish_sub_route] = nlohmann::json{{"@odata.id", *route}};
-    }
-  }
-}
-
-std::string execute_process(const char* cmd) {
-  std::array<char, 128> buffer;
-  std::string result;
-  std::shared_ptr<FILE> pipe(popen(cmd, "r"), pclose);
-  if (!pipe) throw std::runtime_error("popen() failed!");
-  while (!feof(pipe.get())) {
-    if (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr)
-      result += buffer.data();
-  }
-  return result;
-}
-
-// GetManagedObjects unpack type.  Observe that variant has only one bool type,
-// because we don't actually use the values it provides
 using ManagedObjectType = std::vector<std::pair<
     sdbusplus::message::object_path,
     boost::container::flat_map<
@@ -62,7 +32,7 @@
             [&](const boost::system::error_code ec,
                 const ManagedObjectType& users) {
               if (ec) {
-                res.code = 500;
+                res.result(boost::beast::http::status::internal_server_error);
               } else {
                 res.json_value = {
                     {"@odata.context",
@@ -107,7 +77,7 @@
                 const boost::system::error_code ec,
                 const ManagedObjectType& users) {
               if (ec) {
-                res.code = 500;
+                res.result(boost::beast::http::status::internal_server_error);
               } else {
                 for (auto& user : users) {
                   const std::string& path =
@@ -141,7 +111,7 @@
                   }
                 }
                 if (res.json_value.is_null()) {
-                  res.code = 404;
+                  res.result(boost::beast::http::status::not_found);
                 }
               }
               res.end();
diff --git a/include/sessions.hpp b/include/sessions.hpp
index 15ff9ca..fdd1200 100644
--- a/include/sessions.hpp
+++ b/include/sessions.hpp
@@ -73,12 +73,12 @@
   }
 };
 
-void to_json(nlohmann::json& j, const UserSession& p) {
-  if (p.persistence != PersistenceType::SINGLE_REQUEST) {
-    j = nlohmann::json{{"unique_id", p.unique_id},
-                       {"session_token", p.session_token},
-                       {"username", p.username},
-                       {"csrf_token", p.csrf_token}};
+void to_json(nlohmann::json& j, const std::shared_ptr<UserSession> p) {
+  if (p->persistence != PersistenceType::SINGLE_REQUEST) {
+    j = {{"unique_id", p->unique_id},
+         {"session_token", p->session_token},
+         {"username", p->username},
+         {"csrf_token", p->csrf_token}};
   }
 }
 
@@ -87,8 +87,8 @@
 class SessionStore {
  public:
   SessionStore() : timeout_in_minutes(60) {}
-  const UserSession& generate_user_session(
-      const std::string& username,
+  std::shared_ptr<UserSession> generate_user_session(
+      const boost::string_view username,
       PersistenceType persistence = PersistenceType::TIMEOUT) {
     // TODO(ed) find a secure way to not generate session identifiers if
     // persistence is set to SINGLE_REQUEST
@@ -120,42 +120,42 @@
     for (int i = 0; i < unique_id.size(); ++i) {
       unique_id[i] = alphanum[dist(rd)];
     }
-
-    const auto session_it = auth_tokens.emplace(
-        session_token,
-        std::move(UserSession{unique_id, session_token, username, csrf_token,
-                              std::chrono::steady_clock::now(), persistence}));
-    const UserSession& user = (session_it).first->second;
+    auto session = std::make_shared<UserSession>(
+        UserSession{unique_id, session_token, std::string(username), csrf_token,
+                    std::chrono::steady_clock::now(), persistence});
+    auto it = auth_tokens.emplace(std::make_pair(session_token, session));
     // Only need to write to disk if session isn't about to be destroyed.
     need_write_ = persistence == PersistenceType::TIMEOUT;
-    return user;
+    return it.first->second;
   }
 
-  const UserSession* login_session_by_token(const std::string& token) {
+  std::shared_ptr<UserSession> login_session_by_token(
+      const boost::string_view token) {
     apply_session_timeouts();
-    auto session_it = auth_tokens.find(token);
+    auto session_it = auth_tokens.find(std::string(token));
     if (session_it == auth_tokens.end()) {
       return nullptr;
     }
-    UserSession& foo = session_it->second;
-    foo.last_updated = std::chrono::steady_clock::now();
-    return &foo;
+    std::shared_ptr<UserSession> user_session = session_it->second;
+    user_session->last_updated = std::chrono::steady_clock::now();
+    return user_session;
   }
 
-  const UserSession* get_session_by_uid(const std::string& uid) {
+  std::shared_ptr<UserSession> get_session_by_uid(
+      const boost::string_view uid) {
     apply_session_timeouts();
     // TODO(Ed) this is inefficient
     auto session_it = auth_tokens.begin();
     while (session_it != auth_tokens.end()) {
-      if (session_it->second.unique_id == uid) {
-        return &session_it->second;
+      if (session_it->second->unique_id == uid) {
+        return session_it->second;
       }
       session_it++;
     }
     return nullptr;
   }
 
-  void remove_session(const UserSession* session) {
+  void remove_session(std::shared_ptr<UserSession> session) {
     auth_tokens.erase(session->session_token);
     need_write_ = true;
   }
@@ -168,8 +168,8 @@
     std::vector<const std::string*> ret;
     ret.reserve(auth_tokens.size());
     for (auto& session : auth_tokens) {
-      if (getAll || type == session.second.persistence) {
-        ret.push_back(&session.second.unique_id);
+      if (getAll || type == session.second->persistence) {
+        ret.push_back(&session.second->unique_id);
       }
     }
     return ret;
@@ -191,7 +191,7 @@
       last_timeout_update = time_now;
       auto auth_tokens_it = auth_tokens.begin();
       while (auth_tokens_it != auth_tokens.end()) {
-        if (time_now - auth_tokens_it->second.last_updated >=
+        if (time_now - auth_tokens_it->second->last_updated >=
             timeout_in_minutes) {
           auth_tokens_it = auth_tokens.erase(auth_tokens_it);
           need_write_ = true;
@@ -202,11 +202,12 @@
     }
   }
   std::chrono::time_point<std::chrono::steady_clock> last_timeout_update;
-  boost::container::flat_map<std::string, UserSession> auth_tokens;
+  boost::container::flat_map<std::string, std::shared_ptr<UserSession>>
+      auth_tokens;
   std::random_device rd;
   bool need_write_{false};
   std::chrono::minutes timeout_in_minutes;
 };
 
-}  // namespaec PersistentData
+}  // namespace PersistentData
 }  // namespace crow
diff --git a/include/token_authorization_middleware.hpp b/include/token_authorization_middleware.hpp
index 07540d4..49649dd 100644
--- a/include/token_authorization_middleware.hpp
+++ b/include/token_authorization_middleware.hpp
@@ -5,10 +5,9 @@
 #include <webassets.hpp>
 #include <random>
 #include <crow/app.h>
-#include <crow/http_codes.h>
+#include <crow/common.h>
 #include <crow/http_request.h>
 #include <crow/http_response.h>
-#include <boost/bimap.hpp>
 #include <boost/container/flat_set.hpp>
 
 namespace crow {
@@ -18,7 +17,7 @@
 class Middleware {
  public:
   struct context {
-    const crow::PersistentData::UserSession* session;
+    std::shared_ptr<crow::PersistentData::UserSession> session;
   };
 
   void before_handle(crow::request& req, response& res, context& ctx) {
@@ -27,25 +26,27 @@
     }
 
     ctx.session = perform_xtoken_auth(req);
-
     if (ctx.session == nullptr) {
       ctx.session = perform_cookie_auth(req);
     }
-
-    const std::string& auth_header = req.get_header_value("Authorization");
-    // Reject any kind of auth other than basic or token
-    if (ctx.session == nullptr && boost::starts_with(auth_header, "Token ")) {
-      ctx.session = perform_token_auth(auth_header);
-    }
-
-    if (ctx.session == nullptr && boost::starts_with(auth_header, "Basic ")) {
-      ctx.session = perform_basic_auth(auth_header);
+    if (ctx.session == nullptr) {
+      boost::string_view auth_header = req.get_header_value("Authorization");
+      if (!auth_header.empty()) {
+        // Reject any kind of auth other than basic or token
+        if (boost::starts_with(auth_header, "Token ")) {
+          ctx.session = perform_token_auth(auth_header);
+        } else if (boost::starts_with(auth_header, "Basic ")) {
+          ctx.session = perform_basic_auth(auth_header);
+        }
+      }
     }
 
     if (ctx.session == nullptr) {
       CROW_LOG_WARNING << "[AuthMiddleware] authorization failed";
-      res.code = static_cast<int>(HttpRespCode::UNAUTHORIZED);
+
+      res.result(boost::beast::http::status::unauthorized);
       res.add_header("WWW-Authenticate", "Basic");
+
       res.end();
       return;
     }
@@ -57,10 +58,10 @@
   template <typename AllContext>
   void after_handle(request& req, response& res, context& ctx,
                     AllContext& allctx) {
-    // TODO(ed) THis should really be handled by the persistent data middleware,
-    // but because it is upstream, it doesn't have access to the session
-    // information.  Should the data middleware persist the current user
-    // session?
+    // TODO(ed) THis should really be handled by the persistent data
+    // middleware, but because it is upstream, it doesn't have access to the
+    // session information.  Should the data middleware persist the current
+    // user session?
     if (ctx.session != nullptr &&
         ctx.session->persistence ==
             crow::PersistentData::PersistenceType::SINGLE_REQUEST) {
@@ -69,12 +70,12 @@
   }
 
  private:
-  const crow::PersistentData::UserSession* perform_basic_auth(
-      const std::string& auth_header) const {
+  const std::shared_ptr<crow::PersistentData::UserSession> perform_basic_auth(
+      boost::string_view auth_header) const {
     CROW_LOG_DEBUG << "[AuthMiddleware] Basic authentication";
 
     std::string auth_data;
-    std::string param = auth_header.substr(strlen("Basic "));
+    boost::string_view param = auth_header.substr(strlen("Basic "));
     if (!crow::utility::base64_decode(param, auth_data)) {
       return nullptr;
     }
@@ -102,24 +103,24 @@
     // needed.
     // This whole flow needs to be revisited anyway, as we can't be
     // calling directly into pam for every request
-    return &(PersistentData::session_store->generate_user_session(
-        user, crow::PersistentData::PersistenceType::SINGLE_REQUEST));
+    return PersistentData::session_store->generate_user_session(
+        user, crow::PersistentData::PersistenceType::SINGLE_REQUEST);
   }
 
-  const crow::PersistentData::UserSession* perform_token_auth(
-      const std::string& auth_header) const {
+  const std::shared_ptr<crow::PersistentData::UserSession> perform_token_auth(
+      boost::string_view auth_header) const {
     CROW_LOG_DEBUG << "[AuthMiddleware] Token authentication";
 
-    std::string token = auth_header.substr(strlen("Token "));
+    boost::string_view token = auth_header.substr(strlen("Token "));
     auto session = PersistentData::session_store->login_session_by_token(token);
     return session;
   }
 
-  const crow::PersistentData::UserSession* perform_xtoken_auth(
+  const std::shared_ptr<crow::PersistentData::UserSession> perform_xtoken_auth(
       const crow::request& req) const {
     CROW_LOG_DEBUG << "[AuthMiddleware] X-Auth-Token authentication";
 
-    const std::string& token = req.get_header_value("X-Auth-Token");
+    boost::string_view token = req.get_header_value("X-Auth-Token");
     if (token.empty()) {
       return nullptr;
     }
@@ -127,11 +128,11 @@
     return session;
   }
 
-  const crow::PersistentData::UserSession* perform_cookie_auth(
+  const std::shared_ptr<crow::PersistentData::UserSession> perform_cookie_auth(
       const crow::request& req) const {
     CROW_LOG_DEBUG << "[AuthMiddleware] Cookie authentication";
 
-    auto& cookie_value = req.get_header_value("Cookie");
+    boost::string_view cookie_value = req.get_header_value("Cookie");
     if (cookie_value.empty()) {
       return nullptr;
     }
@@ -145,18 +146,18 @@
     if (end_index == std::string::npos) {
       end_index = cookie_value.size();
     }
-    std::string auth_key =
+    boost::string_view auth_key =
         cookie_value.substr(start_index, end_index - start_index);
 
-    const crow::PersistentData::UserSession* session =
+    const std::shared_ptr<crow::PersistentData::UserSession> session =
         PersistentData::session_store->login_session_by_token(auth_key);
     if (session == nullptr) {
       return nullptr;
     }
 
     // RFC7231 defines methods that need csrf protection
-    if (req.method != "GET"_method) {
-      const std::string& csrf = req.get_header_value("X-XSRF-TOKEN");
+    if (req.method() != "GET"_method) {
+      boost::string_view csrf = req.get_header_value("X-XSRF-TOKEN");
       // Make sure both tokens are filled
       if (csrf.empty() || session->csrf_token.empty()) {
         return nullptr;
@@ -171,21 +172,21 @@
 
   // checks if request can be forwarded without authentication
   bool is_on_whitelist(const crow::request& req) const {
-    // it's allowed to GET root node without authentication
-    if ("GET"_method == req.method) {
-      CROW_LOG_DEBUG << "TESTING ROUTE " << req.url;
+    // it's allowed to GET root node without authentica tion
+    if ("GET"_method == req.method()) {
       if (req.url == "/redfish/v1" || req.url == "/redfish/v1/") {
         return true;
-      } else if (crow::webassets::routes.find(req.url) !=
+      } else if (crow::webassets::routes.find(std::string(req.url)) !=
                  crow::webassets::routes.end()) {
         return true;
       }
     }
 
-    // it's allowed to POST on session collection & login without authentication
-    if ("POST"_method == req.method) {
-      if ((req.url == "/redfish/v1/SessionService/Sessions" ||
-           req.url == "/redfish/v1/SessionService/Sessions/") ||
+    // it's allowed to POST on session collection & login without
+    // authentication
+    if ("POST"_method == req.method()) {
+      if ((req.url == "/redfish/v1/SessionService/Sessions") ||
+          (req.url == "/redfish/v1/SessionService/Sessions/") ||
           (req.url == "/login") || (req.url == "/logout")) {
         return true;
       }
@@ -207,35 +208,38 @@
   CROW_ROUTE(app, "/login")
       .methods(
           "POST"_method)([&](const crow::request& req, crow::response& res) {
-        std::string content_type;
-        auto content_type_it = req.headers.find("content-type");
-        if (content_type_it != req.headers.end()) {
-          content_type = content_type_it->second;
-          boost::algorithm::to_lower(content_type);
-        }
-        const std::string* username;
-        const std::string* password;
+        boost::string_view content_type = req.get_header_value("content-type");
+        boost::string_view username;
+        boost::string_view password;
+
         bool looks_like_ibm = false;
 
-        // This object needs to be declared at this scope so the strings within
-        // it are not destroyed before we can use them
+        // This object needs to be declared at this scope so the strings
+        // within it are not destroyed before we can use them
         nlohmann::json login_credentials;
         // Check if auth was provided by a payload
         if (content_type == "application/json") {
           login_credentials = nlohmann::json::parse(req.body, nullptr, false);
           if (login_credentials.is_discarded()) {
-            res.code = 400;
+            res.result(boost::beast::http::status::bad_request);
             res.end();
             return;
           }
+
           // check for username/password in the root object
           // THis method is how intel APIs authenticate
-          auto user_it = login_credentials.find("username");
-          auto pass_it = login_credentials.find("password");
+          nlohmann::json::iterator user_it = login_credentials.find("username");
+          nlohmann::json::iterator pass_it = login_credentials.find("password");
           if (user_it != login_credentials.end() &&
               pass_it != login_credentials.end()) {
-            username = user_it->get_ptr<const std::string*>();
-            password = pass_it->get_ptr<const std::string*>();
+            const std::string* user_str =
+                user_it->get_ptr<const std::string*>();
+            const std::string* pass_str =
+                pass_it->get_ptr<const std::string*>();
+            if (user_str != nullptr && pass_str != nullptr) {
+              username = *user_str;
+              password = *pass_str;
+            }
           } else {
             // Openbmc appears to push a data object that contains the same
             // keys (username and password), attempt to use that
@@ -245,56 +249,70 @@
               // "password"]
               if (data_it->is_array()) {
                 if (data_it->size() == 2) {
-                  username = (*data_it)[0].get_ptr<const std::string*>();
-                  password = (*data_it)[1].get_ptr<const std::string*>();
+                  nlohmann::json::iterator user_it2 = data_it->begin();
+                  nlohmann::json::iterator pass_it2 = data_it->begin() + 1;
                   looks_like_ibm = true;
+                  if (user_it2 != data_it->end() &&
+                      pass_it2 != data_it->end()) {
+                    const std::string* user_str =
+                        user_it2->get_ptr<const std::string*>();
+                    const std::string* pass_str =
+                        pass_it2->get_ptr<const std::string*>();
+                    if (user_str != nullptr && pass_str != nullptr) {
+                      username = *user_str;
+                      password = *pass_str;
+                    }
+                  }
                 }
+
               } else if (data_it->is_object()) {
-                auto user_it = data_it->find("username");
-                auto pass_it = data_it->find("password");
-                if (user_it != data_it->end() && pass_it != data_it->end()) {
-                  username = user_it->get_ptr<const std::string*>();
-                  password = pass_it->get_ptr<const std::string*>();
+                nlohmann::json::iterator user_it2 = data_it->find("username");
+                nlohmann::json::iterator pass_it2 = data_it->find("password");
+                if (user_it2 != data_it->end() && pass_it2 != data_it->end()) {
+                  const std::string* user_str =
+                      user_it2->get_ptr<const std::string*>();
+                  const std::string* pass_str =
+                      pass_it2->get_ptr<const std::string*>();
+                  if (user_str != nullptr && pass_str != nullptr) {
+                    username = *user_str;
+                    password = *pass_str;
+                  }
                 }
               }
             }
           }
         } else {
-          // check if auth was provided as a query string
-          auto user_it = req.headers.find("username");
-          auto pass_it = req.headers.find("password");
-          if (user_it != req.headers.end() && pass_it != req.headers.end()) {
-            username = &user_it->second;
-            password = &pass_it->second;
-          }
+          // check if auth was provided as a headers
+          username = req.get_header_value("username");
+          password = req.get_header_value("password");
         }
 
-        if (username != nullptr && !username->empty() && password != nullptr &&
-            !password->empty()) {
-          if (!pam_authenticate_user(*username, *password)) {
-            res.code = res.code = static_cast<int>(HttpRespCode::UNAUTHORIZED);
+        if (!username.empty() && !password.empty()) {
+          if (!pam_authenticate_user(username, password)) {
+            res.result(boost::beast::http::status::unauthorized);
           } else {
-            auto& session =
-                PersistentData::session_store->generate_user_session(*username);
+            auto session =
+                PersistentData::session_store->generate_user_session(username);
 
             if (looks_like_ibm) {
               // IBM requires a very specific login structure, and doesn't
               // actually look at the status code.  TODO(ed).... Fix that
               // upstream
-              res.json_value = {{"data", "User '" + *username + "' logged in"},
-                                {"message", "200 OK"},
-                                {"status", "ok"}};
-              res.add_header("Set-Cookie", "XSRF-TOKEN=" + session.csrf_token);
-              res.add_header("Set-Cookie", "SESSION=" + session.session_token +
+              res.json_value = {
+                  {"data", "User '" + std::string(username) + "' logged in"},
+                  {"message", "200 OK"},
+                  {"status", "ok"}};
+              res.add_header("Set-Cookie", "XSRF-TOKEN=" + session->csrf_token);
+              res.add_header("Set-Cookie", "SESSION=" + session->session_token +
                                                "; Secure; HttpOnly");
             } else {
               // if content type is json, assume json token
-              res.json_value = {{"token", session.session_token}};
+              res.json_value = {{"token", session->session_token}};
             }
           }
 
         } else {
-          res.code = static_cast<int>(HttpRespCode::BAD_REQUEST);
+          res.result(boost::beast::http::status::bad_request);
         }
         res.end();
       });
@@ -308,7 +326,6 @@
             if (session != nullptr) {
               PersistentData::session_store->remove_session(session);
             }
-            res.code = static_cast<int>(HttpRespCode::OK);
             res.end();
             return;
 
diff --git a/include/webassets.hpp b/include/webassets.hpp
index 6384f3a..85de3ad 100644
--- a/include/webassets.hpp
+++ b/include/webassets.hpp
@@ -4,7 +4,6 @@
 #include <fstream>
 #include <string>
 #include <crow/app.h>
-#include <crow/http_codes.h>
 #include <crow/http_request.h>
 #include <crow/http_response.h>
 #include <crow/routing.h>
@@ -88,7 +87,7 @@
 
       auto content_type_it = content_types.find(extension.c_str());
       if (content_type_it == content_types.end()) {
-        CROW_LOG_ERROR << "Cannot determine content-type for " << webpath
+        CROW_LOG_ERROR << "Cannot determine content-type for " << absolute_path
                        << " with extension " << extension;
       } else {
         content_type = content_type_it->second;
@@ -109,13 +108,12 @@
             std::ifstream inf(absolute_path);
             if (!inf) {
               CROW_LOG_DEBUG << "failed to read file";
-              res.code = static_cast<int>(HttpRespCode::NOT_FOUND);
-              res.code = static_cast<int>(HttpRespCode::INTERNAL_ERROR);
+              res.result(boost::beast::http::status::internal_server_error);
               res.end();
               return;
             }
 
-            res.body = {std::istreambuf_iterator<char>(inf),
+            res.body() = {std::istreambuf_iterator<char>(inf),
                         std::istreambuf_iterator<char>()};
             res.end();
           });
diff --git a/redfish-core/include/node.hpp b/redfish-core/include/node.hpp
index b41439a..3fb0ce7 100644
--- a/redfish-core/include/node.hpp
+++ b/redfish-core/include/node.hpp
@@ -102,19 +102,19 @@
 
   virtual void doPatch(crow::response& res, const crow::request& req,
                        const std::vector<std::string>& params) {
-    res.code = static_cast<int>(HttpRespCode::METHOD_NOT_ALLOWED);
+    res.result(boost::beast::http::status::method_not_allowed);
     res.end();
   }
 
   virtual void doPost(crow::response& res, const crow::request& req,
                       const std::vector<std::string>& params) {
-    res.code = static_cast<int>(HttpRespCode::METHOD_NOT_ALLOWED);
+    res.result(boost::beast::http::status::method_not_allowed);
     res.end();
   }
 
   virtual void doDelete(crow::response& res, const crow::request& req,
                         const std::vector<std::string>& params) {
-    res.code = static_cast<int>(HttpRespCode::METHOD_NOT_ALLOWED);
+    res.result(boost::beast::http::status::method_not_allowed);
     res.end();
   }
 
@@ -127,14 +127,14 @@
     auto ctx =
         app.template get_context<crow::TokenAuthorization::Middleware>(req);
 
-    if (!isMethodAllowedForUser(req.method, entityPrivileges,
+    if (!isMethodAllowedForUser(req.method(), entityPrivileges,
                                 ctx.session->username)) {
-      res.code = static_cast<int>(HttpRespCode::METHOD_NOT_ALLOWED);
+      res.result(boost::beast::http::status::method_not_allowed);
       res.end();
       return;
     }
 
-    switch (req.method) {
+    switch (req.method()) {
       case "GET"_method:
         doGet(res, req, params);
         break;
@@ -152,7 +152,7 @@
         break;
 
       default:
-        res.code = static_cast<int>(HttpRespCode::NOT_FOUND);
+        res.result(boost::beast::http::status::not_found);
         res.end();
     }
     return;
diff --git a/redfish-core/include/privileges.hpp b/redfish-core/include/privileges.hpp
index 1341f36..e98debb 100644
--- a/redfish-core/include/privileges.hpp
+++ b/redfish-core/include/privileges.hpp
@@ -157,8 +157,8 @@
   std::bitset<MAX_PRIVILEGE_COUNT> privilegeBitset = 0;
 };
 
-using OperationMap =
-    boost::container::flat_map<crow::HTTPMethod, std::vector<Privileges>>;
+using OperationMap = boost::container::flat_map<boost::beast::http::verb,
+                                                std::vector<Privileges>>;
 
 /**
  * @brief Checks if given privileges allow to call an HTTP method
@@ -169,7 +169,7 @@
  * @return                 True if method allowed, false otherwise
  *
  */
-inline bool isMethodAllowedWithPrivileges(const crow::HTTPMethod method,
+inline bool isMethodAllowedWithPrivileges(const boost::beast::http::verb method,
                                           const OperationMap& operationMap,
                                           const Privileges& userPrivileges) {
   const auto& it = operationMap.find(method);
@@ -199,7 +199,7 @@
  * @return                 True if method allowed, false otherwise
  *
  */
-inline bool isMethodAllowedForUser(const crow::HTTPMethod method,
+inline bool isMethodAllowedForUser(const boost::beast::http::verb method,
                                    const OperationMap& operationMap,
                                    const std::string& user) {
   // TODO: load user privileges from configuration as soon as its available
diff --git a/redfish-core/lib/account_service.hpp b/redfish-core/lib/account_service.hpp
index 53b67a4..48872f8 100644
--- a/redfish-core/lib/account_service.hpp
+++ b/redfish-core/lib/account_service.hpp
@@ -37,12 +37,12 @@
     Node::json["Roles"]["@odata.id"] = "/redfish/v1/AccountService/Roles";
 
     entityPrivileges = {
-        {crow::HTTPMethod::GET, {{"ConfigureUsers"}, {"ConfigureManager"}}},
-        {crow::HTTPMethod::HEAD, {{"Login"}}},
-        {crow::HTTPMethod::PATCH, {{"ConfigureUsers"}}},
-        {crow::HTTPMethod::PUT, {{"ConfigureUsers"}}},
-        {crow::HTTPMethod::DELETE, {{"ConfigureUsers"}}},
-        {crow::HTTPMethod::POST, {{"ConfigureUsers"}}}};
+        {boost::beast::http::verb::get, {{"ConfigureUsers"}, {"ConfigureManager"}}},
+        {boost::beast::http::verb::head, {{"Login"}}},
+        {boost::beast::http::verb::patch, {{"ConfigureUsers"}}},
+        {boost::beast::http::verb::put, {{"ConfigureUsers"}}},
+        {boost::beast::http::verb::delete_, {{"ConfigureUsers"}}},
+        {boost::beast::http::verb::post, {{"ConfigureUsers"}}}};
   }
 
  private:
diff --git a/redfish-core/lib/chassis.hpp b/redfish-core/lib/chassis.hpp
index c2ea91d..6047f3e 100644
--- a/redfish-core/lib/chassis.hpp
+++ b/redfish-core/lib/chassis.hpp
@@ -108,12 +108,13 @@
         "/redfish/v1/$metadata#ChassisCollection.ChassisCollection";
     Node::json["Name"] = "Chassis Collection";
 
-    entityPrivileges = {{crow::HTTPMethod::GET, {{"Login"}}},
-                        {crow::HTTPMethod::HEAD, {{"Login"}}},
-                        {crow::HTTPMethod::PATCH, {{"ConfigureComponents"}}},
-                        {crow::HTTPMethod::PUT, {{"ConfigureComponents"}}},
-                        {crow::HTTPMethod::DELETE, {{"ConfigureComponents"}}},
-                        {crow::HTTPMethod::POST, {{"ConfigureComponents"}}}};
+    entityPrivileges = {
+        {boost::beast::http::verb::get, {{"Login"}}},
+        {boost::beast::http::verb::head, {{"Login"}}},
+        {boost::beast::http::verb::patch, {{"ConfigureComponents"}}},
+        {boost::beast::http::verb::put, {{"ConfigureComponents"}}},
+        {boost::beast::http::verb::delete_, {{"ConfigureComponents"}}},
+        {boost::beast::http::verb::post, {{"ConfigureComponents"}}}};
   }
 
  private:
@@ -138,7 +139,7 @@
             res.json_value = Node::json;
           } else {
             // ... otherwise, return INTERNALL ERROR
-            res.code = static_cast<int>(HttpRespCode::INTERNAL_ERROR);
+            res.result(boost::beast::http::status::internal_server_error);
           }
           res.end();
         });
@@ -166,12 +167,13 @@
     Node::json["Name"] = "Chassis Collection";
     Node::json["ChassisType"] = "RackMount";
 
-    entityPrivileges = {{crow::HTTPMethod::GET, {{"Login"}}},
-                        {crow::HTTPMethod::HEAD, {{"Login"}}},
-                        {crow::HTTPMethod::PATCH, {{"ConfigureComponents"}}},
-                        {crow::HTTPMethod::PUT, {{"ConfigureComponents"}}},
-                        {crow::HTTPMethod::DELETE, {{"ConfigureComponents"}}},
-                        {crow::HTTPMethod::POST, {{"ConfigureComponents"}}}};
+    entityPrivileges = {
+        {boost::beast::http::verb::get, {{"Login"}}},
+        {boost::beast::http::verb::head, {{"Login"}}},
+        {boost::beast::http::verb::patch, {{"ConfigureComponents"}}},
+        {boost::beast::http::verb::put, {{"ConfigureComponents"}}},
+        {boost::beast::http::verb::delete_, {{"ConfigureComponents"}}},
+        {boost::beast::http::verb::post, {{"ConfigureComponents"}}}};
   }
 
  private:
@@ -183,7 +185,7 @@
     // Check if there is required param, truly entering this shall be
     // impossible.
     if (params.size() != 1) {
-      res.code = static_cast<int>(HttpRespCode::INTERNAL_ERROR);
+      res.result(boost::beast::http::status::internal_server_error);
       res.end();
       return;
     }
@@ -198,8 +200,8 @@
                 std::vector<std::pair<std::string, std::vector<std::string>>>>>
                 &subtree) {
           if (error_code) {
-            res.code = static_cast<int>(HttpRespCode::INTERNAL_ERROR);
             res.json_value = {};
+            res.result(boost::beast::http::status::internal_server_error);
             res.end();
             return;
           }
@@ -211,14 +213,16 @@
             const std::string &path = object.first;
             const std::vector<std::pair<std::string, std::vector<std::string>>>
                 &connectionNames = object.second;
+
             if (!boost::ends_with(path, chassis_id)) {
               continue;
             }
             if (connectionNames.size() < 1) {
-              res.code = static_cast<int>(HttpRespCode::INTERNAL_ERROR);
-              res.end();
-              return;
+              CROW_LOG_ERROR << "Only got " << connectionNames.size()
+                             << " connection names";
+              continue;
             }
+
             const std::string connectionName = connectionNames[0].first;
             crow::connections::system_bus->async_method_call(
                 [&res, chassis_id(std::string(chassis_id)) ](
@@ -244,8 +248,10 @@
             // Found the connection we were looking for, return
             return;
           }
+
           // Couldn't find an object with that name.  return an error
-          res.code = static_cast<int>(HttpRespCode::NOT_FOUND);
+          res.result(boost::beast::http::status::not_found);
+
           res.end();
         },
         "xyz.openbmc_project.ObjectMapper",
@@ -259,6 +265,6 @@
   // Chassis Provider object
   // TODO(Pawel) consider move it to singleton
   OnDemandChassisProvider chassis_provider;
-};
+};  // namespace redfish
 
 }  // namespace redfish
diff --git a/redfish-core/lib/ethernet.hpp b/redfish-core/lib/ethernet.hpp
index ba69728..6c91cef 100644
--- a/redfish-core/lib/ethernet.hpp
+++ b/redfish-core/lib/ethernet.hpp
@@ -355,12 +355,12 @@
     Node::json["Description"] =
         "Collection of EthernetInterfaces for this Manager";
 
-    entityPrivileges = {{crow::HTTPMethod::GET, {{"Login"}}},
-                        {crow::HTTPMethod::HEAD, {{"Login"}}},
-                        {crow::HTTPMethod::PATCH, {{"ConfigureComponents"}}},
-                        {crow::HTTPMethod::PUT, {{"ConfigureComponents"}}},
-                        {crow::HTTPMethod::DELETE, {{"ConfigureComponents"}}},
-                        {crow::HTTPMethod::POST, {{"ConfigureComponents"}}}};
+    entityPrivileges = {{boost::beast::http::verb::get, {{"Login"}}},
+                        {boost::beast::http::verb::head, {{"Login"}}},
+                        {boost::beast::http::verb::patch, {{"ConfigureComponents"}}},
+                        {boost::beast::http::verb::put, {{"ConfigureComponents"}}},
+                        {boost::beast::http::verb::delete_, {{"ConfigureComponents"}}},
+                        {boost::beast::http::verb::post, {{"ConfigureComponents"}}}};
   }
 
  private:
@@ -391,7 +391,7 @@
             res.json_value = Node::json;
           } else {
             // No success, best what we can do is return INTERNALL ERROR
-            res.code = static_cast<int>(HttpRespCode::INTERNAL_ERROR);
+            res.result(boost::beast::http::status::internal_server_error);
           }
           res.end();
         });
@@ -423,12 +423,12 @@
     Node::json["Name"] = "Manager Ethernet Interface";
     Node::json["Description"] = "Management Network Interface";
 
-    entityPrivileges = {{crow::HTTPMethod::GET, {{"Login"}}},
-                        {crow::HTTPMethod::HEAD, {{"Login"}}},
-                        {crow::HTTPMethod::PATCH, {{"ConfigureComponents"}}},
-                        {crow::HTTPMethod::PUT, {{"ConfigureComponents"}}},
-                        {crow::HTTPMethod::DELETE, {{"ConfigureComponents"}}},
-                        {crow::HTTPMethod::POST, {{"ConfigureComponents"}}}};
+    entityPrivileges = {{boost::beast::http::verb::get, {{"Login"}}},
+                        {boost::beast::http::verb::head, {{"Login"}}},
+                        {boost::beast::http::verb::patch, {{"ConfigureComponents"}}},
+                        {boost::beast::http::verb::put, {{"ConfigureComponents"}}},
+                        {boost::beast::http::verb::delete_, {{"ConfigureComponents"}}},
+                        {boost::beast::http::verb::post, {{"ConfigureComponents"}}}};
   }
 
  private:
@@ -442,7 +442,7 @@
     // Check if there is required param, truly entering this shall be
     // impossible.
     if (params.size() != 1) {
-      res.code = static_cast<int>(HttpRespCode::INTERNAL_ERROR);
+      res.result(boost::beast::http::status::internal_server_error);
       res.end();
       return;
     }
@@ -503,7 +503,7 @@
             // ... otherwise return error
             // TODO(Pawel)consider distinguish between non existing object, and
             // other errors
-            res.code = static_cast<int>(HttpRespCode::NOT_FOUND);
+            res.result(boost::beast::http::status::not_found);
           }
           res.end();
         });
diff --git a/redfish-core/lib/managers.hpp b/redfish-core/lib/managers.hpp
index 0ad768f..c8609b4 100644
--- a/redfish-core/lib/managers.hpp
+++ b/redfish-core/lib/managers.hpp
@@ -43,12 +43,12 @@
                                                                  // will work
                                                                  // correctly
 
-    entityPrivileges = {{crow::HTTPMethod::GET, {{"Login"}}},
-                        {crow::HTTPMethod::HEAD, {{"Login"}}},
-                        {crow::HTTPMethod::PATCH, {{"ConfigureManager"}}},
-                        {crow::HTTPMethod::PUT, {{"ConfigureManager"}}},
-                        {crow::HTTPMethod::DELETE, {{"ConfigureManager"}}},
-                        {crow::HTTPMethod::POST, {{"ConfigureManager"}}}};
+    entityPrivileges = {{boost::beast::http::verb::get, {{"Login"}}},
+                        {boost::beast::http::verb::head, {{"Login"}}},
+                        {boost::beast::http::verb::patch, {{"ConfigureManager"}}},
+                        {boost::beast::http::verb::put, {{"ConfigureManager"}}},
+                        {boost::beast::http::verb::delete_, {{"ConfigureManager"}}},
+                        {boost::beast::http::verb::post, {{"ConfigureManager"}}}};
   }
 
  private:
@@ -87,12 +87,12 @@
     Node::json["Members@odata.count"] = 1;
     Node::json["Members"] = {{{"@odata.id", "/redfish/v1/Managers/openbmc"}}};
 
-    entityPrivileges = {{crow::HTTPMethod::GET, {{"Login"}}},
-                        {crow::HTTPMethod::HEAD, {{"Login"}}},
-                        {crow::HTTPMethod::PATCH, {{"ConfigureManager"}}},
-                        {crow::HTTPMethod::PUT, {{"ConfigureManager"}}},
-                        {crow::HTTPMethod::DELETE, {{"ConfigureManager"}}},
-                        {crow::HTTPMethod::POST, {{"ConfigureManager"}}}};
+    entityPrivileges = {{boost::beast::http::verb::get, {{"Login"}}},
+                        {boost::beast::http::verb::head, {{"Login"}}},
+                        {boost::beast::http::verb::patch, {{"ConfigureManager"}}},
+                        {boost::beast::http::verb::put, {{"ConfigureManager"}}},
+                        {boost::beast::http::verb::delete_, {{"ConfigureManager"}}},
+                        {boost::beast::http::verb::post, {{"ConfigureManager"}}}};
   }
 
  private:
diff --git a/redfish-core/lib/network_protocol.hpp b/redfish-core/lib/network_protocol.hpp
index 581eb03..438de41 100644
--- a/redfish-core/lib/network_protocol.hpp
+++ b/redfish-core/lib/network_protocol.hpp
@@ -36,12 +36,12 @@
     Node::json["Status"]["HealthRollup"] = "OK";
     Node::json["Status"]["State"] = "Enabled";
 
-    entityPrivileges = {{crow::HTTPMethod::GET, {{"Login"}}},
-                        {crow::HTTPMethod::HEAD, {{"Login"}}},
-                        {crow::HTTPMethod::PATCH, {{"ConfigureManager"}}},
-                        {crow::HTTPMethod::PUT, {{"ConfigureManager"}}},
-                        {crow::HTTPMethod::DELETE, {{"ConfigureManager"}}},
-                        {crow::HTTPMethod::POST, {{"ConfigureManager"}}}};
+    entityPrivileges = {{boost::beast::http::verb::get, {{"Login"}}},
+                        {boost::beast::http::verb::head, {{"Login"}}},
+                        {boost::beast::http::verb::patch, {{"ConfigureManager"}}},
+                        {boost::beast::http::verb::put, {{"ConfigureManager"}}},
+                        {boost::beast::http::verb::delete_, {{"ConfigureManager"}}},
+                        {boost::beast::http::verb::post, {{"ConfigureManager"}}}};
   }
 
  private:
diff --git a/redfish-core/lib/redfish_sessions.hpp b/redfish-core/lib/redfish_sessions.hpp
index 507116d..7de6d3b 100644
--- a/redfish-core/lib/redfish_sessions.hpp
+++ b/redfish-core/lib/redfish_sessions.hpp
@@ -32,12 +32,13 @@
     Node::json["Name"] = "User Session";
     Node::json["Description"] = "Manager User Session";
 
-    entityPrivileges = {{crow::HTTPMethod::GET, {{"Login"}}},
-                        {crow::HTTPMethod::HEAD, {{"Login"}}},
-                        {crow::HTTPMethod::PATCH, {{"ConfigureManager"}}},
-                        {crow::HTTPMethod::PUT, {{"ConfigureManager"}}},
-                        {crow::HTTPMethod::DELETE, {{"ConfigureManager"}}},
-                        {crow::HTTPMethod::POST, {{"ConfigureManager"}}}};
+    entityPrivileges = {
+        {boost::beast::http::verb::get, {{"Login"}}},
+        {boost::beast::http::verb::head, {{"Login"}}},
+        {boost::beast::http::verb::patch, {{"ConfigureManager"}}},
+        {boost::beast::http::verb::put, {{"ConfigureManager"}}},
+        {boost::beast::http::verb::delete_, {{"ConfigureManager"}}},
+        {boost::beast::http::verb::post, {{"ConfigureManager"}}}};
   }
 
  private:
@@ -50,7 +51,7 @@
       messages::addMessageToErrorJson(
           res.json_value, messages::resourceNotFound("Session", params[0]));
 
-      res.code = static_cast<int>(HttpRespCode::NOT_FOUND);
+      res.result(boost::beast::http::status::not_found);
       res.end();
       return;
     }
@@ -72,8 +73,9 @@
       CROW_LOG_ERROR
           << "Session DELETE has been called with invalid number of params";
 
-      res.code = static_cast<int>(HttpRespCode::BAD_REQUEST);
+      res.result(boost::beast::http::status::bad_request);
       messages::addMessageToErrorJson(res.json_value, messages::generalError());
+
       res.end();
       return;
     }
@@ -85,7 +87,7 @@
       messages::addMessageToErrorJson(
           res.json_value, messages::resourceNotFound("Session", params[0]));
 
-      res.code = static_cast<int>(HttpRespCode::NOT_FOUND);
+      res.result(boost::beast::http::status::not_found);
       res.end();
       return;
     }
@@ -117,12 +119,13 @@
     Node::json["Members@odata.count"] = 0;
     Node::json["Members"] = nlohmann::json::array();
 
-    entityPrivileges = {{crow::HTTPMethod::GET, {{"Login"}}},
-                        {crow::HTTPMethod::HEAD, {{"Login"}}},
-                        {crow::HTTPMethod::PATCH, {{"ConfigureManager"}}},
-                        {crow::HTTPMethod::PUT, {{"ConfigureManager"}}},
-                        {crow::HTTPMethod::DELETE, {{"ConfigureManager"}}},
-                        {crow::HTTPMethod::POST, {}}};
+    entityPrivileges = {
+        {boost::beast::http::verb::get, {{"Login"}}},
+        {boost::beast::http::verb::head, {{"Login"}}},
+        {boost::beast::http::verb::patch, {{"ConfigureManager"}}},
+        {boost::beast::http::verb::put, {{"ConfigureManager"}}},
+        {boost::beast::http::verb::delete_, {{"ConfigureManager"}}},
+        {boost::beast::http::verb::post, {}}};
   }
 
  private:
@@ -134,7 +137,7 @@
 
     Node::json["Members@odata.count"] = session_ids.size();
     Node::json["Members"] = nlohmann::json::array();
-    for (const auto& uid : session_ids) {
+    for (const std::string* uid : session_ids) {
       Node::json["Members"].push_back(
           {{"@odata.id", "/redfish/v1/SessionService/Sessions/" + *uid}});
     }
@@ -145,9 +148,12 @@
 
   void doPost(crow::response& res, const crow::request& req,
               const std::vector<std::string>& params) override {
+    boost::beast::http::status status;
     std::string username;
     bool userAuthSuccessful =
-        authenticateUser(req, res.code, username, res.json_value);
+        authenticateUser(req, status, username, res.json_value);
+    res.result(status);
+
     if (!userAuthSuccessful) {
       res.end();
       return;
@@ -156,10 +162,10 @@
     // User is authenticated - create session for him
     auto session =
         crow::PersistentData::session_store->generate_user_session(username);
-    res.add_header("X-Auth-Token", session.session_token);
+    res.add_header("X-Auth-Token", session->session_token);
 
     // Return data for created session
-    memberSession.doGet(res, req, {session.unique_id});
+    memberSession.doGet(res, req, {session->unique_id});
 
     // No need for res.end(), as it is called by doGet()
   }
@@ -174,7 +180,8 @@
    *
    * @return true if authentication was successful, false otherwise
    */
-  bool authenticateUser(const crow::request& req, int& httpRespCode,
+  bool authenticateUser(const crow::request& req,
+                        boost::beast::http::status& httpRespCode,
                         std::string& user, nlohmann::json& errJson) {
     // We need only UserName and Password - nothing more, nothing less
     static constexpr const unsigned int numberOfRequiredFieldsInReq = 2;
@@ -182,7 +189,7 @@
     // call with exceptions disabled
     auto login_credentials = nlohmann::json::parse(req.body, nullptr, false);
     if (login_credentials.is_discarded()) {
-      httpRespCode = static_cast<int>(HttpRespCode::BAD_REQUEST);
+      httpRespCode = boost::beast::http::status::bad_request;
 
       messages::addMessageToErrorJson(errJson, messages::malformedJSON());
 
@@ -191,7 +198,7 @@
 
     // Check that there are only as many fields as there should be
     if (login_credentials.size() != numberOfRequiredFieldsInReq) {
-      httpRespCode = static_cast<int>(HttpRespCode::BAD_REQUEST);
+      httpRespCode = boost::beast::http::status::bad_request;
 
       messages::addMessageToErrorJson(errJson, messages::malformedJSON());
 
@@ -203,7 +210,7 @@
     auto pass_it = login_credentials.find("Password");
     if (user_it == login_credentials.end() ||
         pass_it == login_credentials.end()) {
-      httpRespCode = static_cast<int>(HttpRespCode::BAD_REQUEST);
+      httpRespCode = boost::beast::http::status::bad_request;
 
       if (user_it == login_credentials.end()) {
         messages::addMessageToErrorJson(errJson,
@@ -220,7 +227,7 @@
 
     // Check that given data is of valid type (string)
     if (!user_it->is_string() || !pass_it->is_string()) {
-      httpRespCode = static_cast<int>(HttpRespCode::BAD_REQUEST);
+      httpRespCode = boost::beast::http::status::bad_request;
 
       if (!user_it->is_string()) {
         messages::addMessageToErrorJson(
@@ -243,7 +250,7 @@
 
     // Verify that required fields are not empty
     if (username.empty() || password.empty()) {
-      httpRespCode = static_cast<int>(HttpRespCode::BAD_REQUEST);
+      httpRespCode = boost::beast::http::status::bad_request;
 
       if (username.empty()) {
         messages::addMessageToErrorJson(errJson,
@@ -260,17 +267,17 @@
 
     // Finally - try to authenticate user
     if (!pam_authenticate_user(username, password)) {
-      httpRespCode = static_cast<int>(HttpRespCode::UNAUTHORIZED);
+      httpRespCode = boost::beast::http::status::unauthorized;
 
       messages::addMessageToErrorJson(
           errJson, messages::resourceAtUriUnauthorized(
-                       req.url, "Invalid username or password"));
+                       std::string(req.url), "Invalid username or password"));
 
       return false;
     }
 
     // User authenticated successfully
-    httpRespCode = static_cast<int>(HttpRespCode::OK);
+    httpRespCode = boost::beast::http::status::ok;
     user = username;
 
     return true;
@@ -297,12 +304,13 @@
         crow::PersistentData::session_store->get_timeout_in_seconds();
     Node::json["ServiceEnabled"] = true;
 
-    entityPrivileges = {{crow::HTTPMethod::GET, {{"Login"}}},
-                        {crow::HTTPMethod::HEAD, {{"Login"}}},
-                        {crow::HTTPMethod::PATCH, {{"ConfigureManager"}}},
-                        {crow::HTTPMethod::PUT, {{"ConfigureManager"}}},
-                        {crow::HTTPMethod::DELETE, {{"ConfigureManager"}}},
-                        {crow::HTTPMethod::POST, {{"ConfigureManager"}}}};
+    entityPrivileges = {
+        {boost::beast::http::verb::get, {{"Login"}}},
+        {boost::beast::http::verb::head, {{"Login"}}},
+        {boost::beast::http::verb::patch, {{"ConfigureManager"}}},
+        {boost::beast::http::verb::put, {{"ConfigureManager"}}},
+        {boost::beast::http::verb::delete_, {{"ConfigureManager"}}},
+        {boost::beast::http::verb::post, {{"ConfigureManager"}}}};
   }
 
  private:
diff --git a/redfish-core/lib/roles.hpp b/redfish-core/lib/roles.hpp
index 7b7a804..f538c83 100644
--- a/redfish-core/lib/roles.hpp
+++ b/redfish-core/lib/roles.hpp
@@ -34,12 +34,12 @@
                                         "ConfigureUsers", "ConfigureSelf",
                                         "ConfigureComponents"};
     Node::json["OemPrivileges"] = nlohmann::json::array();
-    entityPrivileges = {{crow::HTTPMethod::GET, {{"Login"}}},
-                        {crow::HTTPMethod::HEAD, {{"Login"}}},
-                        {crow::HTTPMethod::PATCH, {{"ConfigureManager"}}},
-                        {crow::HTTPMethod::PUT, {{"ConfigureManager"}}},
-                        {crow::HTTPMethod::DELETE, {{"ConfigureManager"}}},
-                        {crow::HTTPMethod::POST, {{"ConfigureManager"}}}};
+    entityPrivileges = {{boost::beast::http::verb::get, {{"Login"}}},
+                        {boost::beast::http::verb::head, {{"Login"}}},
+                        {boost::beast::http::verb::patch, {{"ConfigureManager"}}},
+                        {boost::beast::http::verb::put, {{"ConfigureManager"}}},
+                        {boost::beast::http::verb::delete_, {{"ConfigureManager"}}},
+                        {boost::beast::http::verb::post, {{"ConfigureManager"}}}};
   }
 
  private:
@@ -64,12 +64,12 @@
     Node::json["Members"] = {
         {{"@odata.id", "/redfish/v1/AccountService/Roles/Administrator"}}};
 
-    entityPrivileges = {{crow::HTTPMethod::GET, {{"Login"}}},
-                        {crow::HTTPMethod::HEAD, {{"Login"}}},
-                        {crow::HTTPMethod::PATCH, {{"ConfigureManager"}}},
-                        {crow::HTTPMethod::PUT, {{"ConfigureManager"}}},
-                        {crow::HTTPMethod::DELETE, {{"ConfigureManager"}}},
-                        {crow::HTTPMethod::POST, {{"ConfigureManager"}}}};
+    entityPrivileges = {{boost::beast::http::verb::get, {{"Login"}}},
+                        {boost::beast::http::verb::head, {{"Login"}}},
+                        {boost::beast::http::verb::patch, {{"ConfigureManager"}}},
+                        {boost::beast::http::verb::put, {{"ConfigureManager"}}},
+                        {boost::beast::http::verb::delete_, {{"ConfigureManager"}}},
+                        {boost::beast::http::verb::post, {{"ConfigureManager"}}}};
   }
 
  private:
diff --git a/redfish-core/lib/sensors.hpp b/redfish-core/lib/sensors.hpp
index 4ba63e7..a8b74ff 100644
--- a/redfish-core/lib/sensors.hpp
+++ b/redfish-core/lib/sensors.hpp
@@ -51,7 +51,7 @@
   }
 
   ~AsyncResp() {
-    if (res.code != static_cast<int>(HttpRespCode::OK)) {
+    if (res.result() == boost::beast::http::status::internal_server_error) {
       // Reset the json object to clear out any data that made it in before the
       // error happened
       // todo(ed) handle error condition with proper code
@@ -60,7 +60,7 @@
     res.end();
   }
   void setErrorStatus() {
-    res.code = static_cast<int>(HttpRespCode::INTERNAL_ERROR);
+    res.result(boost::beast::http::status::internal_server_error);
   }
 
   std::string chassisId{};
@@ -75,7 +75,7 @@
  * @param callback Callback for processing gathered connections
  */
 template <typename Callback>
-void getConnections(const std::shared_ptr<AsyncResp>& asyncResp,
+void getConnections(std::shared_ptr<AsyncResp> asyncResp,
                     const boost::container::flat_set<std::string>& sensorNames,
                     Callback&& callback) {
   CROW_LOG_DEBUG << "getConnections";
@@ -86,7 +86,7 @@
   // Response handler for parsing objects subtree
   auto resp_handler = [ callback{std::move(callback)}, asyncResp, sensorNames ](
       const boost::system::error_code ec, const GetSubTreeType& subtree) {
-    if (ec != 0) {
+    if (ec) {
       asyncResp->setErrorStatus();
       CROW_LOG_ERROR << "resp_handler: Dbus error " << ec;
       return;
@@ -144,8 +144,7 @@
  * @param callback  Callback for next step in gathered sensor processing
  */
 template <typename Callback>
-void getChassis(const std::shared_ptr<AsyncResp>& asyncResp,
-                Callback&& callback) {
+void getChassis(std::shared_ptr<AsyncResp> asyncResp, Callback&& callback) {
   CROW_LOG_DEBUG << "getChassis Done";
 
   // Process response from EntityManager and extract chassis data
@@ -190,7 +189,7 @@
 
     if (!foundChassis) {
       CROW_LOG_INFO << "Unable to find chassis named " << asyncResp->chassisId;
-      asyncResp->res.code = static_cast<int>(HttpRespCode::NOT_FOUND);
+      asyncResp->res.result(boost::beast::http::status::not_found);
     } else {
       callback(sensorNames);
     }
@@ -325,6 +324,7 @@
       }
     }
   }
+  CROW_LOG_DEBUG << "Added sensor " << sensorName;
 }
 
 /**
@@ -332,94 +332,86 @@
  *        chassis.
  * @param asyncResp   Pointer to object holding response data
  */
-void getChassisData(const std::shared_ptr<AsyncResp>& asyncResp) {
+void getChassisData(std::shared_ptr<AsyncResp> asyncResp) {
   CROW_LOG_DEBUG << "getChassisData";
   auto getChassisCb = [&, asyncResp](boost::container::flat_set<std::string>&
                                          sensorNames) {
     CROW_LOG_DEBUG << "getChassisCb Done";
-    auto getConnectionCb =
-        [&, asyncResp, sensorNames](
-            const boost::container::flat_set<std::string>& connections) {
-          CROW_LOG_DEBUG << "getConnectionCb Done";
-          // Get managed objects from all services exposing sensors
-          for (const std::string& connection : connections) {
-            // Response handler to process managed objects
-            auto getManagedObjectsCb = [&, asyncResp, sensorNames](
-                                           const boost::system::error_code ec,
-                                           ManagedObjectsVectorType& resp) {
-              // Go through all objects and update response with
-              // sensor data
-              for (const auto& objDictEntry : resp) {
-                const std::string& objPath =
-                    static_cast<const std::string&>(objDictEntry.first);
-                CROW_LOG_DEBUG << "getManagedObjectsCb parsing object "
-                               << objPath;
-                if (!boost::starts_with(objPath, DBUS_SENSOR_PREFIX)) {
-                  CROW_LOG_ERROR << "Got path that isn't in sensor namespace: "
-                                 << objPath;
-                  continue;
-                }
-                std::vector<std::string> split;
-                // Reserve space for
-                // /xyz/openbmc_project/Sensors/<name>/<subname>
-                split.reserve(6);
-                boost::algorithm::split(split, objPath, boost::is_any_of("/"));
-                if (split.size() < 6) {
-                  CROW_LOG_ERROR << "Got path that isn't long enough "
-                                 << objPath;
-                  continue;
-                }
-                // These indexes aren't intuitive, as boost::split puts an empty
-                // string at the beginning
-                const std::string& sensorType = split[4];
-                const std::string& sensorName = split[5];
-                CROW_LOG_DEBUG << "sensorName " << sensorName << " sensorType "
-                               << sensorType;
-                if (sensorNames.find(sensorName) == sensorNames.end()) {
-                  CROW_LOG_ERROR << sensorName << " not in sensor list ";
-                  continue;
-                }
+    auto getConnectionCb = [&, asyncResp, sensorNames](
+                               const boost::container::flat_set<std::string>&
+                                   connections) {
+      CROW_LOG_DEBUG << "getConnectionCb Done";
+      // Get managed objects from all services exposing sensors
+      for (const std::string& connection : connections) {
+        // Response handler to process managed objects
+        auto getManagedObjectsCb = [&, asyncResp, sensorNames](
+                                       const boost::system::error_code ec,
+                                       ManagedObjectsVectorType& resp) {
+          // Go through all objects and update response with
+          // sensor data
+          for (const auto& objDictEntry : resp) {
+            const std::string& objPath =
+                static_cast<const std::string&>(objDictEntry.first);
+            CROW_LOG_DEBUG << "getManagedObjectsCb parsing object " << objPath;
 
-                const char* fieldName = nullptr;
-                if (sensorType == "temperature") {
-                  fieldName = "Temperatures";
-                } else if (sensorType == "fan" || sensorType == "fan_tach") {
-                  fieldName = "Fans";
-                } else if (sensorType == "voltage") {
-                  fieldName = "Voltages";
-                } else if (sensorType == "current") {
-                  fieldName = "PowerSupply";
-                } else if (sensorType == "power") {
-                  fieldName = "PowerSupply";
-                } else {
-                  CROW_LOG_ERROR << "Unsure how to handle sensorType "
-                                 << sensorType;
-                  continue;
-                }
+            std::vector<std::string> split;
+            // Reserve space for
+            // /xyz/openbmc_project/Sensors/<name>/<subname>
+            split.reserve(6);
+            boost::algorithm::split(split, objPath, boost::is_any_of("/"));
+            if (split.size() < 6) {
+              CROW_LOG_ERROR << "Got path that isn't long enough " << objPath;
+              continue;
+            }
+            // These indexes aren't intuitive, as boost::split puts an empty
+            // string at the beggining
+            const std::string& sensorType = split[4];
+            const std::string& sensorName = split[5];
+            CROW_LOG_DEBUG << "sensorName " << sensorName << " sensorType "
+                           << sensorType;
+            if (sensorNames.find(sensorName) == sensorNames.end()) {
+              CROW_LOG_ERROR << sensorName << " not in sensor list ";
+              continue;
+            }
 
-                nlohmann::json& temp_array =
-                    asyncResp->res.json_value[fieldName];
+            const char* fieldName = nullptr;
+            if (sensorType == "temperature") {
+              fieldName = "Temperatures";
+            } else if (sensorType == "fan" || sensorType == "fan_tach") {
+              fieldName = "Fans";
+            } else if (sensorType == "voltage") {
+              fieldName = "Voltages";
+            } else if (sensorType == "current") {
+              fieldName = "PowerSupply";
+            } else if (sensorType == "power") {
+              fieldName = "PowerSupply";
+            } else {
+              CROW_LOG_ERROR << "Unsure how to handle sensorType "
+                             << sensorType;
+              continue;
+            }
 
-                // Create the array if it doesn't yet exist
-                if (temp_array.is_array() == false) {
-                  temp_array = nlohmann::json::array();
-                }
+            nlohmann::json& temp_array = asyncResp->res.json_value[fieldName];
 
-                temp_array.push_back(nlohmann::json::object());
-                nlohmann::json& sensor_json = temp_array.back();
-                sensor_json["@odata.id"] = "/redfish/v1/Chassis/" +
-                                           asyncResp->chassisId + "/Thermal#/" +
-                                           sensorName;
-                objectInterfacesToJson(sensorName, sensorType,
-                                       objDictEntry.second, sensor_json);
-              }
-            };
+            // Create the array if it doesn't yet exist
+            if (temp_array.is_array() == false) {
+              temp_array = nlohmann::json::array();
+            }
 
-            crow::connections::system_bus->async_method_call(
-                getManagedObjectsCb, connection, "/xyz/openbmc_project/Sensors",
-                "org.freedesktop.DBus.ObjectManager", "GetManagedObjects");
-          };
+            temp_array.push_back(
+                {{"@odata.id", "/redfish/v1/Chassis/" + asyncResp->chassisId +
+                                   "/Thermal#/" + sensorName}});
+            nlohmann::json& sensor_json = temp_array.back();
+            objectInterfacesToJson(sensorName, sensorType, objDictEntry.second,
+                                   sensor_json);
+          }
         };
+
+        crow::connections::system_bus->async_method_call(
+            getManagedObjectsCb, connection, "/xyz/openbmc_project/Sensors",
+            "org.freedesktop.DBus.ObjectManager", "GetManagedObjects");
+      };
+    };
     // Get connections and then pass it to get sensors
     getConnections(asyncResp, sensorNames, std::move(getConnectionCb));
   };
diff --git a/redfish-core/lib/service_root.hpp b/redfish-core/lib/service_root.hpp
index c57d3e7..62796ee 100644
--- a/redfish-core/lib/service_root.hpp
+++ b/redfish-core/lib/service_root.hpp
@@ -35,12 +35,12 @@
         app.template get_middleware<crow::PersistentData::Middleware>()
             .system_uuid;
 
-    entityPrivileges = {{crow::HTTPMethod::GET, {}},
-                        {crow::HTTPMethod::HEAD, {}},
-                        {crow::HTTPMethod::PATCH, {{"ConfigureComponents"}}},
-                        {crow::HTTPMethod::PUT, {{"ConfigureComponents"}}},
-                        {crow::HTTPMethod::DELETE, {{"ConfigureComponents"}}},
-                        {crow::HTTPMethod::POST, {{"ConfigureComponents"}}}};
+    entityPrivileges = {{boost::beast::http::verb::get, {}},
+                        {boost::beast::http::verb::head, {}},
+                        {boost::beast::http::verb::patch, {{"ConfigureComponents"}}},
+                        {boost::beast::http::verb::put, {{"ConfigureComponents"}}},
+                        {boost::beast::http::verb::delete_, {{"ConfigureComponents"}}},
+                        {boost::beast::http::verb::post, {{"ConfigureComponents"}}}};
   }
 
  private:
diff --git a/redfish-core/lib/thermal.hpp b/redfish-core/lib/thermal.hpp
index b33c80f..506e320 100644
--- a/redfish-core/lib/thermal.hpp
+++ b/redfish-core/lib/thermal.hpp
@@ -29,19 +29,20 @@
     Node::json["Id"] = "Thermal";
     Node::json["Name"] = "Thermal";
 
-    entityPrivileges = {{crow::HTTPMethod::GET, {{"Login"}}},
-                        {crow::HTTPMethod::HEAD, {{"Login"}}},
-                        {crow::HTTPMethod::PATCH, {{"ConfigureManager"}}},
-                        {crow::HTTPMethod::PUT, {{"ConfigureManager"}}},
-                        {crow::HTTPMethod::DELETE, {{"ConfigureManager"}}},
-                        {crow::HTTPMethod::POST, {{"ConfigureManager"}}}};
+    entityPrivileges = {
+        {boost::beast::http::verb::get, {{"Login"}}},
+        {boost::beast::http::verb::head, {{"Login"}}},
+        {boost::beast::http::verb::patch, {{"ConfigureManager"}}},
+        {boost::beast::http::verb::put, {{"ConfigureManager"}}},
+        {boost::beast::http::verb::delete_, {{"ConfigureManager"}}},
+        {boost::beast::http::verb::post, {{"ConfigureManager"}}}};
   }
 
  private:
   void doGet(crow::response& res, const crow::request& req,
              const std::vector<std::string>& params) override {
     if (params.size() != 1) {
-      res.code = static_cast<int>(HttpRespCode::INTERNAL_ERROR);
+      res.result(boost::beast::http::status::internal_server_error);
       res.end();
       return;
     }
diff --git a/redfish-core/src/utils/json_utils.cpp b/redfish-core/src/utils/json_utils.cpp
index b4bdba6..fea4d38 100644
--- a/redfish-core/src/utils/json_utils.cpp
+++ b/redfish-core/src/utils/json_utils.cpp
@@ -15,7 +15,6 @@
 */
 #include "utils/json_utils.hpp"
 #include <error_messages.hpp>
-#include <crow/http_codes.h>
 
 namespace redfish {
 
@@ -440,7 +439,7 @@
   if (reqJson.is_discarded()) {
     messages::addMessageToErrorJson(res.json_value, messages::malformedJSON());
 
-    res.code = static_cast<int>(HttpRespCode::BAD_REQUEST);
+    res.result(boost::beast::http::status::bad_request);
     res.end();
 
     return false;
diff --git a/redfish-core/ut/privileges_test.cpp b/redfish-core/ut/privileges_test.cpp
index 36e02c6..92cd6c4 100644
--- a/redfish-core/ut/privileges_test.cpp
+++ b/redfish-core/ut/privileges_test.cpp
@@ -18,26 +18,26 @@
 TEST(PrivilegeTest, PrivilegeCheckForNoPrivilegesRequired) {
   Privileges userPrivileges{"Login"};
 
-  OperationMap entityPrivileges{{crow::HTTPMethod::GET, {{"Login"}}}};
+  OperationMap entityPrivileges{{boost::beast::http::verb::get, {{"Login"}}}};
 
-  EXPECT_TRUE(isMethodAllowedWithPrivileges(crow::HTTPMethod::GET,
+  EXPECT_TRUE(isMethodAllowedWithPrivileges(boost::beast::http::verb::get,
                                             entityPrivileges, userPrivileges));
 }
 
 TEST(PrivilegeTest, PrivilegeCheckForSingleCaseSuccess) {
   auto userPrivileges = Privileges{"Login"};
-  OperationMap entityPrivileges{{crow::HTTPMethod::GET, {}}};
+  OperationMap entityPrivileges{{boost::beast::http::verb::get, {}}};
 
-  EXPECT_TRUE(isMethodAllowedWithPrivileges(crow::HTTPMethod::GET,
+  EXPECT_TRUE(isMethodAllowedWithPrivileges(boost::beast::http::verb::get,
                                             entityPrivileges, userPrivileges));
 }
 
 TEST(PrivilegeTest, PrivilegeCheckForSingleCaseFailure) {
   auto userPrivileges = Privileges{"Login"};
   OperationMap entityPrivileges{
-      {crow::HTTPMethod::GET, {{"ConfigureManager"}}}};
+      {boost::beast::http::verb::get, {{"ConfigureManager"}}}};
 
-  EXPECT_FALSE(isMethodAllowedWithPrivileges(crow::HTTPMethod::GET,
+  EXPECT_FALSE(isMethodAllowedWithPrivileges(boost::beast::http::verb::get,
                                              entityPrivileges, userPrivileges));
 }
 
@@ -45,38 +45,38 @@
   auto userPrivileges =
       Privileges{"Login", "ConfigureManager", "ConfigureSelf"};
   OperationMap entityPrivileges{
-      {crow::HTTPMethod::GET,
+      {boost::beast::http::verb::get,
        {{"Login", "ConfigureManager", "ConfigureSelf"}}}};
 
-  EXPECT_TRUE(isMethodAllowedWithPrivileges(crow::HTTPMethod::GET,
+  EXPECT_TRUE(isMethodAllowedWithPrivileges(boost::beast::http::verb::get,
                                             entityPrivileges, userPrivileges));
 }
 
 TEST(PrivilegeTest, PrivilegeCheckForANDCaseFailure) {
   auto userPrivileges = Privileges{"Login", "ConfigureManager"};
   OperationMap entityPrivileges{
-      {crow::HTTPMethod::GET,
+      {boost::beast::http::verb::get,
        {{"Login", "ConfigureManager", "ConfigureSelf"}}}};
 
-  EXPECT_FALSE(isMethodAllowedWithPrivileges(crow::HTTPMethod::GET,
+  EXPECT_FALSE(isMethodAllowedWithPrivileges(boost::beast::http::verb::get,
                                              entityPrivileges, userPrivileges));
 }
 
 TEST(PrivilegeTest, PrivilegeCheckForORCaseSuccess) {
   auto userPrivileges = Privileges{"ConfigureManager"};
   OperationMap entityPrivileges{
-      {crow::HTTPMethod::GET, {{"Login"}, {"ConfigureManager"}}}};
+      {boost::beast::http::verb::get, {{"Login"}, {"ConfigureManager"}}}};
 
-  EXPECT_TRUE(isMethodAllowedWithPrivileges(crow::HTTPMethod::GET,
+  EXPECT_TRUE(isMethodAllowedWithPrivileges(boost::beast::http::verb::get,
                                             entityPrivileges, userPrivileges));
 }
 
 TEST(PrivilegeTest, PrivilegeCheckForORCaseFailure) {
   auto userPrivileges = Privileges{"ConfigureComponents"};
   OperationMap entityPrivileges = OperationMap(
-      {{crow::HTTPMethod::GET, {{"Login"}, {"ConfigureManager"}}}});
+      {{boost::beast::http::verb::get, {{"Login"}, {"ConfigureManager"}}}});
 
-  EXPECT_FALSE(isMethodAllowedWithPrivileges(crow::HTTPMethod::GET,
+  EXPECT_FALSE(isMethodAllowedWithPrivileges(boost::beast::http::verb::get,
                                              entityPrivileges, userPrivileges));
 }
 
diff --git a/src/ci_map_tests.cpp b/src/ci_map_tests.cpp
deleted file mode 100644
index acaaa6e..0000000
--- a/src/ci_map_tests.cpp
+++ /dev/null
@@ -1,78 +0,0 @@
-#include "crow/ci_map.h"
-#include <gmock/gmock.h>
-#include <gtest/gtest.h>
-
-using namespace testing;
-
-TEST(CiMap, MapEmpty) {
-  crow::ci_map map;
-  EXPECT_TRUE(map.empty());
-  EXPECT_EQ(map.size(), 0);
-
-  map.emplace("foo", "bar");
-
-  map.clear();
-  EXPECT_TRUE(map.empty());
-}
-
-TEST(CiMap, MapBasicInsert) {
-  crow::ci_map map;
-  map.emplace("foo", "bar");
-  auto x = map.find("foo");
-  ASSERT_NE(x, map.end());
-
-  EXPECT_EQ(map.find("foo")->first, "foo");
-  EXPECT_EQ(map.find("foo")->second, "bar");
-  EXPECT_EQ(map.find("FOO")->first, "foo");
-  EXPECT_EQ(map.find("FOO")->second, "bar");
-}
-
-TEST(CiMap, MapManyInsert) {
-  crow::ci_map map;
-  map.emplace("foo", "car");
-  map.emplace("foo", "boo");
-  map.emplace("bar", "cat");
-  map.emplace("baz", "bat");
-
-  EXPECT_EQ(map.size(), 3);
-  ASSERT_NE(map.find("foo"), map.end());
-  EXPECT_EQ(map.find("foo")->first, "foo");
-  EXPECT_EQ(map.find("foo")->second, "car");
-
-  ASSERT_NE(map.find("FOO"), map.end());
-  EXPECT_EQ(map.find("FOO")->first, "foo");
-  EXPECT_EQ(map.find("FOO")->second, "car");
-  
-  ASSERT_NE(map.find("bar"), map.end());
-  EXPECT_EQ(map.find("bar")->first, "bar");
-  EXPECT_EQ(map.find("bar")->second, "cat");
-
-  ASSERT_NE(map.find("BAR"), map.end());
-  EXPECT_EQ(map.find("BAR")->first, "bar");
-  EXPECT_EQ(map.find("BAR")->second, "cat");
-
-  ASSERT_NE(map.find("baz"), map.end());
-  EXPECT_EQ(map.find("baz")->first, "baz");
-  EXPECT_EQ(map.find("baz")->second, "bat");
-
-  ASSERT_NE(map.find("BAZ"), map.end());
-  EXPECT_EQ(map.find("BAZ")->first, "baz");
-  EXPECT_EQ(map.find("BAZ")->second, "bat");
-
-  EXPECT_EQ(map.count("foo"), 1);
-  EXPECT_EQ(map.count("bar"), 1);
-  EXPECT_EQ(map.count("baz"), 1);
-  EXPECT_EQ(map.count("FOO"), 1);
-  EXPECT_EQ(map.count("BAR"), 1);
-  EXPECT_EQ(map.count("BAZ"), 1);
-}
-
-TEST(CiMap, MapMultiInsert) {
-  crow::ci_map map;
-  map.emplace("foo", "bar1");
-  map.emplace("foo", "bar2");
-  EXPECT_EQ(map.count("foo"), 1);
-  EXPECT_EQ(map.count("FOO"), 1);
-  EXPECT_EQ(map.count("fOo"), 1);
-  EXPECT_EQ(map.count("FOo"), 1);
-}
\ No newline at end of file
diff --git a/src/crow_getroutes_test.cpp b/src/crow_getroutes_test.cpp
index d89c7c1..4b705b0 100644
--- a/src/crow_getroutes_test.cpp
+++ b/src/crow_getroutes_test.cpp
@@ -16,7 +16,7 @@
 TEST(GetRoutes, TestOneRoute) {
   SimpleApp app;
   decltype(app)::server_t server(&app, "127.0.0.1", 45451);
-  CROW_ROUTE(app, "/")([]() { return 200; });
+  CROW_ROUTE(app, "/")([]() { return boost::beast::http::status::ok; });
 
   EXPECT_THAT(app.get_routes(),
               testing::ElementsAre(testing::Pointee(std::string("/"))));
@@ -26,12 +26,12 @@
 TEST(GetRoutes, TestlotsOfRoutes) {
   SimpleApp app;
   decltype(app)::server_t server(&app, "127.0.0.1", 45451);
-  CROW_ROUTE(app, "/")([]() { return 200; });
-  CROW_ROUTE(app, "/foo")([]() { return 200; });
-  CROW_ROUTE(app, "/bar")([]() { return 200; });
-  CROW_ROUTE(app, "/baz")([]() { return 200; });
-  CROW_ROUTE(app, "/boo")([]() { return 200; });
-  CROW_ROUTE(app, "/moo")([]() { return 200; });
+  CROW_ROUTE(app, "/")([]() { return boost::beast::http::status::ok; });
+  CROW_ROUTE(app, "/foo")([]() { return boost::beast::http::status::ok; });
+  CROW_ROUTE(app, "/bar")([]() { return boost::beast::http::status::ok; });
+  CROW_ROUTE(app, "/baz")([]() { return boost::beast::http::status::ok; });
+  CROW_ROUTE(app, "/boo")([]() { return boost::beast::http::status::ok; });
+  CROW_ROUTE(app, "/moo")([]() { return boost::beast::http::status::ok; });
 
   EXPECT_THAT(app.get_routes(), testing::UnorderedElementsAre(
                                     testing::Pointee(std::string("/")),
diff --git a/src/crow_test.cpp b/src/crow_test.cpp
index a3c9ed9..20a946d 100644
--- a/src/crow_test.cpp
+++ b/src/crow_test.cpp
@@ -1,7 +1,7 @@
+#include "crow.h"
 #include <iostream>
 #include <sstream>
 #include <vector>
-#include "crow.h"
 #include "gtest/gtest.h"
 #undef CROW_LOG_LEVEL
 #define CROW_LOG_LEVEL 0
@@ -66,7 +66,8 @@
 
   // executing handler
   ASSERT_EQUAL(0, x);
-  r.handle(request(), res, routing_params());
+  boost::beast::http::request<boost::beast::http::string_body> req{};
+  r.handle(request(req), res, routing_params());
   ASSERT_EQUAL(1, x);
 
   // registering handler with request argument
@@ -79,7 +80,7 @@
 
   // executing handler
   ASSERT_EQUAL(1, x);
-  r.handle(request(), res, routing_params());
+  r.handle(request(req), res, routing_params());
   ASSERT_EQUAL(2, x);
 }
 
@@ -119,41 +120,45 @@
   ([] { return "path"; });
 
   {
-    request req;
+    boost::beast::http::request<boost::beast::http::string_body> r{};
+    request req{r};
     response res;
 
     req.url = "/file";
 
     app.handle(req, res);
 
-    ASSERT_EQUAL(200, res.code);
+    ASSERT_EQUAL(200, res.result_int());
   }
   {
-    request req;
+    boost::beast::http::request<boost::beast::http::string_body> r{};
+    request req{r};
     response res;
 
     req.url = "/file/";
 
     app.handle(req, res);
-    ASSERT_EQUAL(404, res.code);
+    ASSERT_EQUAL(404, res.result_int());
   }
   {
-    request req;
+    boost::beast::http::request<boost::beast::http::string_body> r{};
+    request req{r};
     response res;
 
     req.url = "/path";
 
     app.handle(req, res);
-    ASSERT_NOTEQUAL(404, res.code);
+    ASSERT_NOTEQUAL(404, res.result_int());
   }
   {
-    request req;
+    boost::beast::http::request<boost::beast::http::string_body> r{};
+    request req{r};
     response res;
 
     req.url = "/path/";
 
     app.handle(req, res);
-    ASSERT_EQUAL(200, res.code);
+    ASSERT_EQUAL(200, res.result_int());
   }
 }
 
@@ -200,52 +205,55 @@
   app.validate();
   // app.debug_print();
   {
-    request req;
+    boost::beast::http::request<boost::beast::http::string_body> r{};
+    request req{r};
     response res;
 
     req.url = "/-1";
 
     app.handle(req, res);
 
-    ASSERT_EQUAL(404, res.code);
+    ASSERT_EQUAL(404, res.result_int());
   }
 
   {
-    request req;
+    boost::beast::http::request<boost::beast::http::string_body> r{};
+    request req{r};
     response res;
 
     req.url = "/0/1001999";
 
     app.handle(req, res);
 
-    ASSERT_EQUAL(200, res.code);
+    ASSERT_EQUAL(200, res.result_int());
 
     ASSERT_EQUAL(1001999, B);
   }
 
   {
-    request req;
+    boost::beast::http::request<boost::beast::http::string_body> r{};
+    request req{r};
     response res;
 
     req.url = "/1/-100/1999";
 
     app.handle(req, res);
 
-    ASSERT_EQUAL(200, res.code);
+    ASSERT_EQUAL(200, res.result_int());
 
     ASSERT_EQUAL(-100, A);
     ASSERT_EQUAL(1999, B);
   }
   {
-    request req;
+    boost::beast::http::request<boost::beast::http::string_body> r{};
+    request req{r};
     response res;
 
     req.url = "/4/5000/3/-2.71828/hellhere";
-    req.add_header("TestHeader", "Value");
 
     app.handle(req, res);
 
-    ASSERT_EQUAL(200, res.code);
+    ASSERT_EQUAL(200, res.result_int());
 
     ASSERT_EQUAL(5000, A);
     ASSERT_EQUAL(3, B);
@@ -253,15 +261,15 @@
     ASSERT_EQUAL("hellhere", D);
   }
   {
-    request req;
+    boost::beast::http::request<boost::beast::http::string_body> r{};
+    request req{r};
     response res;
 
     req.url = "/5/-5/999/3.141592/hello_there/a/b/c/d";
-    req.add_header("TestHeader", "Value");
 
     app.handle(req, res);
 
-    ASSERT_EQUAL(200, res.code);
+    ASSERT_EQUAL(200, res.result_int());
 
     ASSERT_EQUAL(-5, A);
     ASSERT_EQUAL(999, B);
@@ -272,9 +280,12 @@
 }
 
 TEST(Crow, simple_response_routing_params) {
-  ASSERT_EQUAL(100, response(100).code);
-  ASSERT_EQUAL(200, response("Hello there").code);
-  ASSERT_EQUAL(500, response(500, "Internal Error?").code);
+  ASSERT_EQUAL(100,
+               response(boost::beast::http::status::continue_).result_int());
+  ASSERT_EQUAL(200, response("Hello there").result_int());
+  ASSERT_EQUAL(500, response(boost::beast::http::status::internal_server_error,
+                             "Internal Error?")
+                        .result_int());
 
   routing_params rp;
   rp.int_params.push_back(1);
@@ -299,7 +310,7 @@
 
   CROW_ROUTE(app, "/").methods("POST"_method,
                                "GET"_method)([](const request& req) {
-    if (req.method == "GET"_method)
+    if (req.method() == "GET"_method)
       return "2";
     else
       return "1";
@@ -316,44 +327,48 @@
   //([]{ return "2"; });
 
   {
-    request req;
+    boost::beast::http::request<boost::beast::http::string_body> r{};
+    request req{r};
     response res;
 
     req.url = "/";
     app.handle(req, res);
 
-    ASSERT_EQUAL("2", res.body);
+    ASSERT_EQUAL("2", res.body());
   }
   {
-    request req;
+    boost::beast::http::request<boost::beast::http::string_body> r{};
+    request req{r};
     response res;
 
     req.url = "/";
-    req.method = "POST"_method;
+    r.method("POST"_method);
     app.handle(req, res);
 
-    ASSERT_EQUAL("1", res.body);
+    ASSERT_EQUAL("1", res.body());
   }
 
   {
-    request req;
+    boost::beast::http::request<boost::beast::http::string_body> r{};
+    request req{r};
     response res;
 
     req.url = "/get_only";
     app.handle(req, res);
 
-    ASSERT_EQUAL("get", res.body);
+    ASSERT_EQUAL("get", res.body());
   }
 
   {
-    request req;
+    boost::beast::http::request<boost::beast::http::string_body> r{};
+    request req{r};
     response res;
 
     req.url = "/get_only";
-    req.method = "POST"_method;
+    r.method("POST"_method);
     app.handle(req, res);
 
-    ASSERT_NOTEQUAL("get", res.body);
+    ASSERT_NOTEQUAL("get", res.body());
   }
 }
 
@@ -428,208 +443,6 @@
   server2.stop();
 }
 
-TEST(Crow, json_read) {
-  {
-    const char* json_error_tests[] = {
-        "{} 3",
-        "{{}",
-        "{3}",
-        "3.4.5",
-        "+3",
-        "3-2",
-        "00",
-        "03",
-        "1e3e3",
-        "1e+.3",
-        "nll",
-        "f",
-        "t",
-        "{\"x\":3,}",
-        "{\"x\"}",
-        "{\"x\":3   q}",
-        "{\"x\":[3 4]}",
-        "{\"x\":[\"",
-        "{\"x\":[[], 4],\"y\",}",
-        "{\"x\":[3",
-        "{\"x\":[ null, false, true}",
-    };
-    for (auto s : json_error_tests) {
-      auto x = json::load(s);
-      if (x) {
-        fail("should fail to parse ", s);
-        return;
-      }
-    }
-  }
-
-  auto x = json::load(R"({"message":"hello, world"})");
-  if (!x) fail("fail to parse");
-  ASSERT_EQUAL("hello, world", x["message"]);
-  ASSERT_EQUAL(1, x.size());
-  ASSERT_EQUAL(false, x.has("mess"));
-  ASSERT_THROW(x["mess"], std::exception);
-  // TODO returning false is better than exception
-  // ASSERT_THROW(3 == x["message"], std::exception);
-  ASSERT_EQUAL(12, x["message"].size());
-
-  std::string s = R"({"int":3,     "ints"  :[1,2,3,4,5]		})";
-  auto y = json::load(s);
-  ASSERT_EQUAL(3, y["int"]);
-  ASSERT_EQUAL(3.0, y["int"]);
-  ASSERT_NOTEQUAL(3.01, y["int"]);
-  ASSERT_EQUAL(5, y["ints"].size());
-  ASSERT_EQUAL(1, y["ints"][0]);
-  ASSERT_EQUAL(2, y["ints"][1]);
-  ASSERT_EQUAL(3, y["ints"][2]);
-  ASSERT_EQUAL(4, y["ints"][3]);
-  ASSERT_EQUAL(5, y["ints"][4]);
-  ASSERT_EQUAL(1u, y["ints"][0]);
-  ASSERT_EQUAL(1.f, y["ints"][0]);
-
-  int q = (int)y["ints"][1];
-  ASSERT_EQUAL(2, q);
-  q = y["ints"][2].i();
-  ASSERT_EQUAL(3, q);
-
-  std::string s2 = R"({"bools":[true, false], "doubles":[1.2, -3.4]})";
-  auto z = json::load(s2);
-  ASSERT_EQUAL(2, z["bools"].size());
-  ASSERT_EQUAL(2, z["doubles"].size());
-  ASSERT_EQUAL(true, z["bools"][0].b());
-  ASSERT_EQUAL(false, z["bools"][1].b());
-  ASSERT_EQUAL(1.2, z["doubles"][0].d());
-  ASSERT_EQUAL(-3.4, z["doubles"][1].d());
-
-  std::string s3 = R"({"uint64": 18446744073709551615})";
-  auto z1 = json::load(s3);
-  ASSERT_EQUAL(18446744073709551615ull, z1["uint64"].u());
-}
-
-TEST(Crow, json_read_real) {
-  vector<std::string> v{"0.036303908355795146",
-                        "0.18320417789757412",
-                        "0.05319940476190476",
-                        "0.15224702380952382",
-                        "0",
-                        "0.3296201145552561",
-                        "0.47921580188679247",
-                        "0.05873511904761905",
-                        "0.1577827380952381",
-                        "0.4996841307277628",
-                        "0.6425412735849056",
-                        "0.052113095238095236",
-                        "0.12830357142857143",
-                        "0.7871041105121294",
-                        "0.954220013477089",
-                        "0.05869047619047619",
-                        "0.1625",
-                        "0.8144794474393531",
-                        "0.9721613881401617",
-                        "0.1399404761904762",
-                        "0.24470238095238095",
-                        "0.04527459568733154",
-                        "0.2096950808625337",
-                        "0.35267857142857145",
-                        "0.42791666666666667",
-                        "0.855731974393531",
-                        "0.9352467991913747",
-                        "0.3816220238095238",
-                        "0.4282886904761905",
-                        "0.39414167789757415",
-                        "0.5316079851752021",
-                        "0.3809375",
-                        "0.4571279761904762",
-                        "0.03522995283018868",
-                        "0.1915641846361186",
-                        "0.6164136904761904",
-                        "0.7192708333333333",
-                        "0.05675117924528302",
-                        "0.21308541105121293",
-                        "0.7045386904761904",
-                        "0.8016815476190476"};
-  for (auto x : v) {
-    CROW_LOG_DEBUG << x;
-    ASSERT_EQUAL(json::load(x).d(), boost::lexical_cast<double>(x));
-  }
-
-  auto ret = json::load(
-      R"---({"balloons":[{"mode":"ellipse","left":0.036303908355795146,"right":0.18320417789757412,"top":0.05319940476190476,"bottom":0.15224702380952382,"index":"0"},{"mode":"ellipse","left":0.3296201145552561,"right":0.47921580188679247,"top":0.05873511904761905,"bottom":0.1577827380952381,"index":"1"},{"mode":"ellipse","left":0.4996841307277628,"right":0.6425412735849056,"top":0.052113095238095236,"bottom":0.12830357142857143,"index":"2"},{"mode":"ellipse","left":0.7871041105121294,"right":0.954220013477089,"top":0.05869047619047619,"bottom":0.1625,"index":"3"},{"mode":"ellipse","left":0.8144794474393531,"right":0.9721613881401617,"top":0.1399404761904762,"bottom":0.24470238095238095,"index":"4"},{"mode":"ellipse","left":0.04527459568733154,"right":0.2096950808625337,"top":0.35267857142857145,"bottom":0.42791666666666667,"index":"5"},{"mode":"ellipse","left":0.855731974393531,"right":0.9352467991913747,"top":0.3816220238095238,"bottom":0.4282886904761905,"index":"6"},{"mode":"ellipse","left":0.39414167789757415,"right":0.5316079851752021,"top":0.3809375,"bottom":0.4571279761904762,"index":"7"},{"mode":"ellipse","left":0.03522995283018868,"right":0.1915641846361186,"top":0.6164136904761904,"bottom":0.7192708333333333,"index":"8"},{"mode":"ellipse","left":0.05675117924528302,"right":0.21308541105121293,"top":0.7045386904761904,"bottom":0.8016815476190476,"index":"9"}]})---");
-  ASSERT_TRUE(static_cast<bool>(ret));
-}
-
-TEST(Crow, json_read_unescaping) {
-  {
-    auto x = json::load(R"({"data":"\ud55c\n\t\r"})");
-    if (!x) {
-      fail("fail to parse");
-      return;
-    }
-    ASSERT_EQUAL(6, x["data"].size());
-    ASSERT_EQUAL("한\n\t\r", x["data"]);
-  }
-  {
-    // multiple r_string instance
-    auto x = json::load(R"({"data":"\ud55c\n\t\r"})");
-    auto a = x["data"].s();
-    auto b = x["data"].s();
-    ASSERT_EQUAL(6, a.size());
-    ASSERT_EQUAL(6, b.size());
-    ASSERT_EQUAL(6, x["data"].size());
-  }
-}
-
-TEST(Crow, json_write) {
-  json::wvalue x;
-  x["message"] = "hello world";
-  ASSERT_EQUAL(R"({"message":"hello world"})", json::dump(x));
-  x["message"] = std::string("string value");
-  ASSERT_EQUAL(R"({"message":"string value"})", json::dump(x));
-  x["message"]["x"] = 3;
-  ASSERT_EQUAL(R"({"message":{"x":3}})", json::dump(x));
-  x["message"]["y"] = 5;
-  ASSERT_TRUE(R"({"message":{"x":3,"y":5}})" == json::dump(x) ||
-              R"({"message":{"y":5,"x":3}})" == json::dump(x));
-  x["message"] = 5.5;
-  ASSERT_EQUAL(R"({"message":5.5})", json::dump(x));
-
-  json::wvalue y;
-  y["scores"][0] = 1;
-  y["scores"][1] = "king";
-  y["scores"][2] = 3.5;
-  ASSERT_EQUAL(R"({"scores":[1,"king",3.5]})", json::dump(y));
-
-  y["scores"][2][0] = "real";
-  y["scores"][2][1] = false;
-  y["scores"][2][2] = true;
-  ASSERT_EQUAL(R"({"scores":[1,"king",["real",false,true]]})", json::dump(y));
-
-  y["scores"]["a"]["b"]["c"] = nullptr;
-  ASSERT_EQUAL(R"({"scores":{"a":{"b":{"c":null}}}})", json::dump(y));
-
-  y["scores"] = std::vector<int>{1, 2, 3};
-  ASSERT_EQUAL(R"({"scores":[1,2,3]})", json::dump(y));
-}
-
-TEST(Crow, template_basic) {
-  auto t = crow::mustache::compile(R"---(attack of {{name}})---");
-  crow::mustache::context ctx;
-  ctx["name"] = "killer tomatoes";
-  auto result = t.render(ctx);
-  ASSERT_EQUAL("attack of killer tomatoes", result);
-  // crow::mustache::load("basic.mustache");
-}
-
-TEST(Crow, template_load) {
-  crow::mustache::set_base(".");
-  ofstream("test.mustache") << R"---(attack of {{name}})---";
-  auto t = crow::mustache::load("test.mustache");
-  crow::mustache::context ctx;
-  ctx["name"] = "killer tomatoes";
-  auto result = t.render(ctx);
-  ASSERT_EQUAL("attack of killer tomatoes", result);
-  unlink("test.mustache");
-}
-
 TEST(Crow, black_magic) {
   using namespace black_magic;
   static_assert(
@@ -816,47 +629,6 @@
   server.stop();
 }
 
-TEST(Crow, middleware_cookieparser) {
-  static char buf[2048];
-
-  App<CookieParser> app;
-
-  std::string value1;
-  std::string value2;
-
-  CROW_ROUTE(app, "/")
-  ([&](const request& req) {
-    {
-      auto& ctx = app.get_context<CookieParser>(req);
-      value1 = ctx.get_cookie("key1");
-      value2 = ctx.get_cookie("key2");
-    }
-
-    return "";
-  });
-
-  decltype(app)::server_t server(&app, LOCALHOST_ADDRESS, 45451);
-  auto _ = async(launch::async, [&] { server.run(); });
-  std::string sendmsg =
-      "GET /\r\nCookie: key1=value1; key2=\"val\\\"ue2\"\r\n\r\n";
-  asio::io_service is;
-  {
-    asio::ip::tcp::socket c(is);
-    c.connect(asio::ip::tcp::endpoint(
-        asio::ip::address::from_string(LOCALHOST_ADDRESS), 45451));
-
-    c.send(asio::buffer(sendmsg));
-
-    c.receive(asio::buffer(buf, 2048));
-    c.close();
-  }
-  {
-    ASSERT_EQUAL("value1", value1);
-    ASSERT_EQUAL("val\"ue2", value2);
-  }
-  server.stop();
-}
-
 TEST(Crow, bug_quick_repeated_request) {
   static char buf[2048];
 
@@ -1067,28 +839,32 @@
   }
 
   {
-    request req;
+    boost::beast::http::request<boost::beast::http::string_body> r{};
+    request req{r};
     response res;
     req.url = "/";
     app.handle(req, res);
     ASSERT_EQUAL(x, 2);
   }
   {
-    request req;
+    boost::beast::http::request<boost::beast::http::string_body> r{};
+    request req{r};
     response res;
     req.url = "/set_int/42";
     app.handle(req, res);
     ASSERT_EQUAL(x, 42);
   }
   {
-    request req;
+    boost::beast::http::request<boost::beast::http::string_body> r{};
+    request req{r};
     response res;
     req.url = "/set5";
     app.handle(req, res);
     ASSERT_EQUAL(x, 5);
   }
   {
-    request req;
+    boost::beast::http::request<boost::beast::http::string_body> r{};
+    request req{r};
     response res;
     req.url = "/set4";
     app.handle(req, res);
diff --git a/src/kvm_websocket_test.cpp b/src/kvm_websocket_test.cpp
index d3ab54d..94a9ffc 100644
--- a/src/kvm_websocket_test.cpp
+++ b/src/kvm_websocket_test.cpp
@@ -17,7 +17,7 @@
 
   crow::kvm::request_routes(app);
   app.bindaddr("127.0.0.1").port(45451);
-  CROW_ROUTE(app, "/")([]() { return 200; });
+  CROW_ROUTE(app, "/")([]() { return boost::beast::http::status::ok; });
   auto _ = async(std::launch::async, [&] { app.run(); });
   auto routes = app.get_routes();
   asio::io_service is;
diff --git a/src/security_headers_middleware_test.cpp b/src/security_headers_middleware_test.cpp
index 5045215..c435921 100644
--- a/src/security_headers_middleware_test.cpp
+++ b/src/security_headers_middleware_test.cpp
@@ -10,7 +10,7 @@
 TEST(SecurityHeaders, TestHeadersExist) {
   App<SecurityHeadersMiddleware> app;
   app.bindaddr("127.0.0.1").port(45451);
-  CROW_ROUTE(app, "/")([]() { return 200; });
+  CROW_ROUTE(app, "/")([]() { return boost::beast::http::status::ok; });
   auto _ = async(launch::async, [&] { app.run(); });
 
   asio::io_service is;
diff --git a/src/token_authorization_middleware_test.cpp b/src/token_authorization_middleware_test.cpp
index 5857d2e..8f45834 100644
--- a/src/token_authorization_middleware_test.cpp
+++ b/src/token_authorization_middleware_test.cpp
@@ -11,7 +11,7 @@
   App<crow::PersistentData::Middleware, crow::TokenAuthorization::Middleware>
       app;
   decltype(app)::server_t server(&app, "127.0.0.1", 45451);
-  CROW_ROUTE(app, "/")([]() { return 200; });
+  CROW_ROUTE(app, "/")([]() { return boost::beast::http::status::ok; });
   auto _ = async(launch::async, [&] { server.run(); });
   asio::io_service is;
   std::string sendmsg;
@@ -50,7 +50,7 @@
   App<crow::PersistentData::Middleware, crow::TokenAuthorization::Middleware>
       app;
   app.bindaddr("127.0.0.1").port(45451);
-  CROW_ROUTE(app, "/")([]() { return 200; });
+  CROW_ROUTE(app, "/")([]() { return boost::beast::http::status::ok; });
   auto _ = async(launch::async, [&] { app.run(); });
 
   asio::io_service is;
@@ -80,7 +80,7 @@
   App<crow::PersistentData::Middleware, crow::TokenAuthorization::Middleware>
       app;
   app.bindaddr("127.0.0.1").port(45451);
-  CROW_ROUTE(app, "/")([]() { return 200; });
+  CROW_ROUTE(app, "/")([]() { return boost::beast::http::status::ok; });
   auto _ = async(launch::async, [&] { app.run(); });
 
   asio::io_service is;
@@ -110,7 +110,7 @@
   App<crow::PersistentData::Middleware, crow::TokenAuthorization::Middleware>
       app;
   app.bindaddr("127.0.0.1").port(45451);
-  CROW_ROUTE(app, "/")([]() { return 200; });
+  CROW_ROUTE(app, "/")([]() { return boost::beast::http::status::ok; });
   auto _ = async(launch::async, [&] { app.run(); });
 
   asio::io_service is;
@@ -194,7 +194,7 @@
   App<crow::PersistentData::Middleware, crow::TokenAuthorization::Middleware>
       app;
   app.bindaddr("127.0.0.1").port(45451);
-  CROW_ROUTE(app, "/")([]() { return 200; });
+  CROW_ROUTE(app, "/")([]() { return boost::beast::http::status::ok; });
   auto _ = async(launch::async, [&] { app.run(); });
 
   asio::io_service is;
diff --git a/src/webserver_main.cpp b/src/webserver_main.cpp
index 7531503..eaaca94 100644
--- a/src/webserver_main.cpp
+++ b/src/webserver_main.cpp
@@ -70,8 +70,6 @@
   crow::intel_oem::request_routes(app);
   crow::openbmc_mapper::request_routes(app);
 
-
-
   CROW_LOG_INFO << "bmcweb (" << __DATE__ << ": " << __TIME__ << ')';
   setup_socket(app);
 
