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));
   }
 
