diff --git a/third_party/websocketpp/websocketpp.patch b/third_party/websocketpp/websocketpp.patch
new file mode 100644
index 0000000..6c2292b
--- /dev/null
+++ b/third_party/websocketpp/websocketpp.patch
@@ -0,0 +1,236 @@
+diff --git a/websocketpp/endpoint.hpp b/websocketpp/endpoint.hpp
+index c124b1d..177bda6 100644
+--- a/websocketpp/endpoint.hpp
++++ b/websocketpp/endpoint.hpp
+@@ -109,26 +109,26 @@ public:
+ 
+ 
+     /// Destructor
+-    ~endpoint<connection,config>() {}
++    ~endpoint() {}
+ 
+     #ifdef _WEBSOCKETPP_DEFAULT_DELETE_FUNCTIONS_
+         // no copy constructor because endpoints are not copyable
+         endpoint(endpoint &) = delete;
+-    
++
+         // no copy assignment operator because endpoints are not copyable
+         endpoint & operator=(endpoint const &) = delete;
+     #endif // _WEBSOCKETPP_DEFAULT_DELETE_FUNCTIONS_
+ 
+     #ifdef _WEBSOCKETPP_MOVE_SEMANTICS_
+         /// Move constructor
+-        endpoint(endpoint && o) 
++        endpoint(endpoint && o)
+          : config::transport_type(std::move(o))
+          , config::endpoint_base(std::move(o))
+          , m_alog(std::move(o.m_alog))
+          , m_elog(std::move(o.m_elog))
+          , m_user_agent(std::move(o.m_user_agent))
+          , m_open_handler(std::move(o.m_open_handler))
+-         
++
+          , m_close_handler(std::move(o.m_close_handler))
+          , m_fail_handler(std::move(o.m_fail_handler))
+          , m_ping_handler(std::move(o.m_ping_handler))
+@@ -146,7 +146,7 @@ public:
+          , m_max_http_body_size(o.m_max_http_body_size)
+ 
+          , m_rng(std::move(o.m_rng))
+-         , m_is_server(o.m_is_server)         
++         , m_is_server(o.m_is_server)
+         {}
+ 
+     #ifdef _WEBSOCKETPP_DEFAULT_DELETE_FUNCTIONS_
+@@ -403,9 +403,9 @@ public:
+ 
+     /// Get default maximum message size
+     /**
+-     * Get the default maximum message size that will be used for new 
++     * Get the default maximum message size that will be used for new
+      * connections created by this endpoint. The maximum message size determines
+-     * the point at which the connection will fail a connection with the 
++     * the point at which the connection will fail a connection with the
+      * message_too_big protocol error.
+      *
+      * The default is set by the max_message_size value from the template config
+@@ -415,10 +415,10 @@ public:
+     size_t get_max_message_size() const {
+         return m_max_message_size;
+     }
+-    
++
+     /// Set default maximum message size
+     /**
+-     * Set the default maximum message size that will be used for new 
++     * Set the default maximum message size that will be used for new
+      * connections created by this endpoint. Maximum message size determines the
+      * point at which the connection will fail a connection with the
+      * message_too_big protocol error.
+@@ -449,7 +449,7 @@ public:
+     size_t get_max_http_body_size() const {
+         return m_max_http_body_size;
+     }
+-    
++
+     /// Set maximum HTTP message body size
+     /**
+      * Set maximum HTTP message body size. Maximum message body size determines
+@@ -484,32 +484,32 @@ public:
+ 
+     /// Pause reading of new data (exception free)
+     /**
+-     * Signals to the connection to halt reading of new data. While reading is 
++     * Signals to the connection to halt reading of new data. While reading is
+      * paused, the connection will stop reading from its associated socket. In
+      * turn this will result in TCP based flow control kicking in and slowing
+      * data flow from the remote endpoint.
+      *
+-     * This is useful for applications that push new requests to a queue to be 
++     * This is useful for applications that push new requests to a queue to be
+      * processed by another thread and need a way to signal when their request
+      * queue is full without blocking the network processing thread.
+      *
+      * Use `resume_reading()` to resume.
+      *
+      * If supported by the transport this is done asynchronously. As such
+-     * reading may not stop until the current read operation completes. 
++     * reading may not stop until the current read operation completes.
+      * Typically you can expect to receive no more bytes after initiating a read
+      * pause than the size of the read buffer.
+      *
+      * If reading is paused for this connection already nothing is changed.
+      */
+     void pause_reading(connection_hdl hdl, lib::error_code & ec);
+-    
++
+     /// Pause reading of new data
+     void pause_reading(connection_hdl hdl);
+ 
+     /// Resume reading of new data (exception free)
+     /**
+-     * Signals to the connection to resume reading of new data after it was 
++     * Signals to the connection to resume reading of new data after it was
+      * paused by `pause_reading()`.
+      *
+      * If reading is not paused for this connection already nothing is changed.
+@@ -533,7 +533,7 @@ public:
+      * @param ec A status code, zero on success, non-zero otherwise
+      */
+     void send_http_response(connection_hdl hdl, lib::error_code & ec);
+-        
++
+     /// Send deferred HTTP Response (exception free)
+     /**
+      * Sends an http response to an HTTP connection that was deferred. This will
+diff --git a/websocketpp/logger/basic.hpp b/websocketpp/logger/basic.hpp
+index 8451413..7dd8684 100644
+--- a/websocketpp/logger/basic.hpp
++++ b/websocketpp/logger/basic.hpp
+@@ -58,46 +58,46 @@ namespace log {
+ template <typename concurrency, typename names>
+ class basic {
+ public:
+-    basic<concurrency,names>(channel_type_hint::value h =
++    basic(channel_type_hint::value h =
+         channel_type_hint::access)
+       : m_static_channels(0xffffffff)
+       , m_dynamic_channels(0)
+       , m_out(h == channel_type_hint::error ? &std::cerr : &std::cout) {}
+ 
+-    basic<concurrency,names>(std::ostream * out)
++    basic(std::ostream * out)
+       : m_static_channels(0xffffffff)
+       , m_dynamic_channels(0)
+       , m_out(out) {}
+ 
+-    basic<concurrency,names>(level c, channel_type_hint::value h =
++    basic(level c, channel_type_hint::value h =
+         channel_type_hint::access)
+       : m_static_channels(c)
+       , m_dynamic_channels(0)
+       , m_out(h == channel_type_hint::error ? &std::cerr : &std::cout) {}
+ 
+-    basic<concurrency,names>(level c, std::ostream * out)
++    basic(level c, std::ostream * out)
+       : m_static_channels(c)
+       , m_dynamic_channels(0)
+       , m_out(out) {}
+ 
+     /// Destructor
+-    ~basic<concurrency,names>() {}
++    ~basic() {}
+ 
+     /// Copy constructor
+-    basic<concurrency,names>(basic<concurrency,names> const & other)
++    basic(basic<concurrency,names> const & other)
+      : m_static_channels(other.m_static_channels)
+      , m_dynamic_channels(other.m_dynamic_channels)
+      , m_out(other.m_out)
+     {}
+-    
++
+ #ifdef _WEBSOCKETPP_DEFAULT_DELETE_FUNCTIONS_
+     // no copy assignment operator because of const member variables
+-    basic<concurrency,names> & operator=(basic<concurrency,names> const &) = delete;
++    basic & operator=(basic<concurrency,names> const &) = delete;
+ #endif // _WEBSOCKETPP_DEFAULT_DELETE_FUNCTIONS_
+ 
+ #ifdef _WEBSOCKETPP_MOVE_SEMANTICS_
+     /// Move constructor
+-    basic<concurrency,names>(basic<concurrency,names> && other)
++    basic(basic<concurrency,names> && other)
+      : m_static_channels(other.m_static_channels)
+      , m_dynamic_channels(other.m_dynamic_channels)
+      , m_out(other.m_out)
+@@ -105,7 +105,7 @@ public:
+ 
+ #ifdef _WEBSOCKETPP_DEFAULT_DELETE_FUNCTIONS_
+     // no move assignment operator because of const member variables
+-    basic<concurrency,names> & operator=(basic<concurrency,names> &&) = delete;
++    basic & operator=(basic<concurrency,names> &&) = delete;
+ #endif // _WEBSOCKETPP_DEFAULT_DELETE_FUNCTIONS_
+ 
+ #endif // _WEBSOCKETPP_MOVE_SEMANTICS_
+diff --git a/websocketpp/roles/server_endpoint.hpp b/websocketpp/roles/server_endpoint.hpp
+index 9cc652f..a96471b 100644
+--- a/websocketpp/roles/server_endpoint.hpp
++++ b/websocketpp/roles/server_endpoint.hpp
+@@ -72,23 +72,23 @@ public:
+     }
+ 
+     /// Destructor
+-    ~server<config>() {}
++    ~server() {}
+ 
+ #ifdef _WEBSOCKETPP_DEFAULT_DELETE_FUNCTIONS_
+     // no copy constructor because endpoints are not copyable
+-    server<config>(server<config> &) = delete;
++    server(server<config> &) = delete;
+ 
+     // no copy assignment operator because endpoints are not copyable
+-    server<config> & operator=(server<config> const &) = delete;
++    server & operator=(server<config> const &) = delete;
+ #endif // _WEBSOCKETPP_DEFAULT_DELETE_FUNCTIONS_
+ 
+ #ifdef _WEBSOCKETPP_MOVE_SEMANTICS_
+     /// Move constructor
+-    server<config>(server<config> && o) : endpoint<connection<config>,config>(std::move(o)) {}
++    server(server<config> && o) : endpoint<connection<config>,config>(std::move(o)) {}
+ 
+ #ifdef _WEBSOCKETPP_DEFAULT_DELETE_FUNCTIONS_
+     // no move assignment operator because of const member variables
+-    server<config> & operator=(server<config> &&) = delete;
++    server & operator=(server<config> &&) = delete;
+ #endif // _WEBSOCKETPP_DEFAULT_DELETE_FUNCTIONS_
+ 
+ #endif // _WEBSOCKETPP_MOVE_SEMANTICS_
+@@ -123,7 +123,7 @@ public:
+             ec = error::make_error_code(error::async_accept_not_listening);
+             return;
+         }
+-        
++
+         ec = lib::error_code();
+         connection_ptr con = get_connection();
+ 
