From 2af19481a9f2b0251d605b640b70369b2f4513b0 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Mon, 5 Jun 2017 19:28:17 -0700 Subject: [PATCH] Derive header from Fields (API Change) --- doc/4_02_message.qbk | 12 ++-- doc/4_03_streams.qbk | 2 +- doc/6_3_client.qbk | 4 +- doc/6_4_server.qbk | 2 +- doc/images/message.png | Bin 37882 -> 37039 bytes examples/doc_http_samples.hpp | 24 +++---- examples/http_async_server.hpp | 12 ++-- examples/http_crawl.cpp | 4 +- examples/http_example.cpp | 4 +- examples/http_sync_server.hpp | 12 ++-- examples/ssl/http_ssl_example.cpp | 4 +- examples/websocket_async_echo_server.hpp | 2 +- examples/websocket_sync_echo_server.hpp | 2 +- include/beast/http/fields.hpp | 56 +++------------ include/beast/http/impl/fields.ipp | 65 ++++++++++++++++++ include/beast/http/impl/message.ipp | 62 +++++++++-------- include/beast/http/impl/serializer.ipp | 8 +-- include/beast/http/impl/write.ipp | 2 +- include/beast/http/message.hpp | 42 +++++------ include/beast/http/parser.hpp | 2 +- include/beast/websocket/impl/accept.ipp | 3 +- include/beast/websocket/impl/handshake.ipp | 3 +- include/beast/websocket/impl/rfc6455.ipp | 4 +- include/beast/websocket/impl/stream.ipp | 56 ++++++++------- include/beast/websocket/stream.hpp | 8 +-- test/http/doc_http_samples.cpp | 14 ++-- test/http/fields.cpp | 13 ---- test/http/message.cpp | 40 +++++------ test/http/parser.cpp | 14 ++-- test/http/write.cpp | 54 +++++++-------- test/websocket/rfc6455.cpp | 6 +- .../ssl/websocket_async_ssl_echo_server.hpp | 2 +- test/websocket/stream.cpp | 60 ++++++++-------- .../websocket/websocket_async_echo_server.hpp | 2 +- test/websocket/websocket_sync_echo_server.hpp | 2 +- 35 files changed, 304 insertions(+), 298 deletions(-) diff --git a/doc/4_02_message.qbk b/doc/4_02_message.qbk index d21064de..c8ddd429 100644 --- a/doc/4_02_message.qbk +++ b/doc/4_02_message.qbk @@ -51,7 +51,7 @@ This diagram shows the inheritance relationship between header and message, along with the fields from the different partial specializations for each possible value of `isRequest`: -[$images/message.png [width 711px] [height 424px]] +[$images/message.png [width 730px] [height 410px]] For notational convenience, the template type aliases [link beast.ref.http__request `request`] and @@ -126,9 +126,9 @@ objects: req.version = 11; // HTTP/1.1 req.method(verb::get); req.target("/index.htm"); - req.fields.insert("Accept", "text/html"); - req.fields.insert("Connection", "keep-alive"); - req.fields.insert("User-Agent", "Beast"); + req.insert("Accept", "text/html"); + req.insert("Connection", "keep-alive"); + req.insert("User-Agent", "Beast"); ``` ][ ``` @@ -149,8 +149,8 @@ objects: res.version = 11; // HTTP/1.1 res.result(status::ok); res.body = "Hello, world!"; - res.fields.insert("Server", "Beast"); - res.fields.insert("Content-Length", res.body.size()); + res.insert("Server", "Beast"); + res.insert("Content-Length", res.body.size()); ``` ][ ``` diff --git a/doc/4_03_streams.qbk b/doc/4_03_streams.qbk index 10be7a88..e8b180d9 100644 --- a/doc/4_03_streams.qbk +++ b/doc/4_03_streams.qbk @@ -129,7 +129,7 @@ the number of octets received prior to the server closing the connection: response res; res.version = 11; res.result(status::ok); - res.fields.insert("Server", "Beast"); + res.insert("Server", "Beast"); res.body = "Hello, world!"; error_code ec; diff --git a/doc/6_3_client.qbk b/doc/6_3_client.qbk index 2f69bb86..bef35c9d 100644 --- a/doc/6_3_client.qbk +++ b/doc/6_3_client.qbk @@ -61,7 +61,7 @@ on the request: ``` void decorate(websocket::request_type& req) { - req.fields.insert("Sec-WebSocket-Protocol", "xmpp;ws-chat"); + req.insert("Sec-WebSocket-Protocol", "xmpp;ws-chat"); } ... ws.handshake_ex("localhost", "/", &decorate); @@ -102,7 +102,7 @@ as follows: ``` websocket::response_type res; ws.handshake(res, "localhost", "/"); - if(! res.fields.exists("Sec-WebSocket-Protocol")) + if(! res.exists("Sec-WebSocket-Protocol")) throw std::invalid_argument("missing subprotocols"); ``` diff --git a/doc/6_4_server.qbk b/doc/6_4_server.qbk index d7ee2071..18bcfe6a 100644 --- a/doc/6_4_server.qbk +++ b/doc/6_4_server.qbk @@ -53,7 +53,7 @@ field on the response: ws.accept_ex( [](websocket::response_type& res) { - res.fields.insert("Server", "AcmeServer"); + res.insert("Server", "AcmeServer"); }); ``` diff --git a/doc/images/message.png b/doc/images/message.png index 159df8c0ca3e2128f6635121027b0cb515c38beb..0ee1fe6e6f9928400f1475c586daf72a27413d38 100644 GIT binary patch delta 36500 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 LtDnm{r-UW|)y$;h delta 37349 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 diff --git a/examples/doc_http_samples.hpp b/examples/doc_http_samples.hpp index 95b7dfe0..af6c9315 100644 --- a/examples/doc_http_samples.hpp +++ b/examples/doc_http_samples.hpp @@ -61,7 +61,7 @@ send_expect_100_continue( "DynamicBuffer requirements not met"); // Insert or replace the Expect field - req.fields.replace("Expect", "100-continue"); + req.replace("Expect", "100-continue"); // Create the serializer auto sr = make_serializer(req); @@ -130,13 +130,13 @@ receive_expect_100_continue( return; // Check for the Expect field value - if(parser.get().fields["Expect"] == "100-continue") + if(parser.get()["Expect"] == "100-continue") { // send 100 response response res; res.version = 11; res.result(status::continue_); - res.fields.insert("Server", "test"); + res.insert("Server", "test"); write(stream, res, ec); if(ec) return; @@ -198,8 +198,8 @@ send_cgi_response( res.result(status::ok); res.version = 11; - res.fields.insert("Server", "Beast"); - res.fields.insert("Transfer-Encoding", "chunked"); + res.insert("Server", "Beast"); + res.insert("Transfer-Encoding", "chunked"); // No data yet, but we set more = true to indicate // that it might be coming later. Otherwise the @@ -307,7 +307,7 @@ void do_server_head( // Set up the response, starting with the common fields response res; res.version = 11; - res.fields.insert("Server", "test"); + res.insert("Server", "test"); // Now handle request-specific fields switch(req.method()) @@ -319,7 +319,7 @@ void do_server_head( // set of headers that would be sent for a GET request, // including the Content-Length, except for the body. res.result(status::ok); - res.fields.insert("Content-Length", payload.size()); + res.insert("Content-Length", payload.size()); // For GET requests, we include the body if(req.method() == verb::get) @@ -337,7 +337,7 @@ void do_server_head( // We return responses indicating an error if // we do not recognize the request method. res.result(status::bad_request); - res.fields.insert("Content-Type", "text/plain"); + res.insert("Content-Type", "text/plain"); res.body = "Invalid request-method '" + req.method_string().to_string() + "'"; break; } @@ -397,11 +397,11 @@ do_head_request( req.version = 11; req.method(verb::head); req.target(target); - req.fields.insert("User-Agent", "test"); + req.insert("User-Agent", "test"); // A client MUST send a Host header field in all HTTP/1.1 request messages. // https://tools.ietf.org/html/rfc7230#section-5.4 - req.fields.insert("Host", "localhost"); + req.insert("Host", "localhost"); // Now send it write(stream, req, ec); @@ -813,8 +813,8 @@ do_form_request( case verb::post: { // If this is not a form upload then use a string_body - if( req0.get().fields["Content-Type"] != "application/x-www-form-urlencoded" && - req0.get().fields["Content-Type"] != "multipart/form-data") + if( req0.get()["Content-Type"] != "application/x-www-form-urlencoded" && + req0.get()["Content-Type"] != "multipart/form-data") goto do_string_body; // Commit to string_body as the body type. diff --git a/examples/http_async_server.hpp b/examples/http_async_server.hpp index 82998566..a1af3133 100644 --- a/examples/http_async_server.hpp +++ b/examples/http_async_server.hpp @@ -236,8 +236,8 @@ private: response res; res.result(status::not_found); res.version = req_.version; - res.fields.insert("Server", "http_async_server"); - res.fields.insert("Content-Type", "text/html"); + res.insert("Server", "http_async_server"); + res.insert("Content-Type", "text/html"); res.body = "The file '" + path + "' was not found"; prepare(res); async_write(sock_, std::move(res), @@ -250,8 +250,8 @@ private: resp_type res; res.result(status::ok); res.version = req_.version; - res.fields.insert("Server", "http_async_server"); - res.fields.insert("Content-Type", mime_type(path)); + res.insert("Server", "http_async_server"); + res.insert("Content-Type", mime_type(path)); res.body = path; prepare(res); async_write(sock_, std::move(res), @@ -263,8 +263,8 @@ private: response res; res.result(status::internal_server_error); res.version = req_.version; - res.fields.insert("Server", "http_async_server"); - res.fields.insert("Content-Type", "text/html"); + res.insert("Server", "http_async_server"); + res.insert("Content-Type", "text/html"); res.body = std::string{"An internal error occurred"} + e.what(); prepare(res); diff --git a/examples/http_crawl.cpp b/examples/http_crawl.cpp index 8d945346..85fa39b8 100644 --- a/examples/http_crawl.cpp +++ b/examples/http_crawl.cpp @@ -40,9 +40,9 @@ int main(int, char const*[]) req.method(verb::get); req.target("/"); req.version = 11; - req.fields.insert("Host", host + std::string(":") + + req.insert("Host", host + std::string(":") + boost::lexical_cast(ep.port())); - req.fields.insert("User-Agent", "beast/http"); + req.insert("User-Agent", "beast/http"); prepare(req); write(sock, req); response res; diff --git a/examples/http_example.cpp b/examples/http_example.cpp index ef268bfb..4be99e3d 100644 --- a/examples/http_example.cpp +++ b/examples/http_example.cpp @@ -29,9 +29,9 @@ int main() req.method(beast::http::verb::get); req.target("/"); req.version = 11; - req.fields.replace("Host", host + ":" + + req.replace("Host", host + ":" + boost::lexical_cast(sock.remote_endpoint().port())); - req.fields.replace("User-Agent", "Beast"); + req.replace("User-Agent", "Beast"); beast::http::prepare(req); beast::http::write(sock, req); diff --git a/examples/http_sync_server.hpp b/examples/http_sync_server.hpp index b26db6b0..7c175f0a 100644 --- a/examples/http_sync_server.hpp +++ b/examples/http_sync_server.hpp @@ -166,8 +166,8 @@ private: response res; res.result(status::not_found); res.version = req.version; - res.fields.insert("Server", "http_sync_server"); - res.fields.insert("Content-Type", "text/html"); + res.insert("Server", "http_sync_server"); + res.insert("Content-Type", "text/html"); res.body = "The file '" + path + "' was not found"; prepare(res); write(sock, res, ec); @@ -181,8 +181,8 @@ private: res.result(status::ok); res.reason("OK"); res.version = req.version; - res.fields.insert("Server", "http_sync_server"); - res.fields.insert("Content-Type", mime_type(path)); + res.insert("Server", "http_sync_server"); + res.insert("Content-Type", mime_type(path)); res.body = path; prepare(res); write(sock, res, ec); @@ -195,8 +195,8 @@ private: res.result(status::internal_server_error); res.reason("Internal Error"); res.version = req.version; - res.fields.insert("Server", "http_sync_server"); - res.fields.insert("Content-Type", "text/html"); + res.insert("Server", "http_sync_server"); + res.insert("Content-Type", "text/html"); res.body = std::string{"An internal error occurred: "} + e.what(); prepare(res); diff --git a/examples/ssl/http_ssl_example.cpp b/examples/ssl/http_ssl_example.cpp index 7fb0bf73..0dc40d0f 100644 --- a/examples/ssl/http_ssl_example.cpp +++ b/examples/ssl/http_ssl_example.cpp @@ -38,9 +38,9 @@ int main() req.method(beast::http::verb::get); req.target("/"); req.version = 11; - req.fields.insert("Host", host + ":" + + req.insert("Host", host + ":" + boost::lexical_cast(sock.remote_endpoint().port())); - req.fields.insert("User-Agent", "Beast"); + req.insert("User-Agent", "Beast"); beast::http::prepare(req); beast::http::write(stream, req); diff --git a/examples/websocket_async_echo_server.hpp b/examples/websocket_async_echo_server.hpp index 49e8472e..75d7ddad 100644 --- a/examples/websocket_async_echo_server.hpp +++ b/examples/websocket_async_echo_server.hpp @@ -263,7 +263,7 @@ private: d.ws.async_accept_ex( [](beast::websocket::response_type& res) { - res.fields.insert( + res.insert( "Server", "async_echo_server"); }, std::move(*this)); diff --git a/examples/websocket_sync_echo_server.hpp b/examples/websocket_sync_echo_server.hpp index deb2706a..3df6ddb5 100644 --- a/examples/websocket_sync_echo_server.hpp +++ b/examples/websocket_sync_echo_server.hpp @@ -274,7 +274,7 @@ private: ws.accept_ex( [](beast::websocket::response_type& res) { - res.fields.insert( + res.insert( "Server", "sync_echo_server"); }, ec); diff --git a/include/beast/http/fields.hpp b/include/beast/http/fields.hpp index 25116b92..0eb52850 100644 --- a/include/beast/http/fields.hpp +++ b/include/beast/http/fields.hpp @@ -268,54 +268,14 @@ public: boost::lexical_cast(value)); } -#if BEAST_DOXYGEN -private: -#endif - - string_view - method_impl() const - { - return (*this)[":method"]; - } - - void - method_impl(string_view s) - { - if(s.empty()) - this->erase(":method"); - else - this->replace(":method", s); - } - - string_view - target_impl() const - { - return (*this)[":target"]; - } - - void - target_impl(string_view s) - { - if(s.empty()) - this->erase(":target"); - else - return this->replace(":target", s); - } - - string_view - reason_impl() const - { - return (*this)[":reason"]; - } - - void - reason_impl(string_view s) - { - if(s.empty()) - this->erase(":reason"); - else - this->replace(":reason", s); - } +protected: + // for header + string_view method_impl() const; + string_view target_impl() const; + string_view reason_impl() const; + void method_impl(string_view s); + void target_impl(string_view s); + void reason_impl(string_view s); private: struct element diff --git a/include/beast/http/impl/fields.ipp b/include/beast/http/impl/fields.ipp index ea265692..703f0ed3 100644 --- a/include/beast/http/impl/fields.ipp +++ b/include/beast/http/impl/fields.ipp @@ -26,6 +26,71 @@ basic_fields:: //------------------------------------------------------------------------------ +template +inline +string_view +basic_fields:: +method_impl() const +{ + return (*this)[":method"]; +} + +template +inline +string_view +basic_fields:: +target_impl() const +{ + return (*this)[":target"]; +} + +template +inline +string_view +basic_fields:: +reason_impl() const +{ + return (*this)[":reason"]; +} + +template +inline +void +basic_fields:: +method_impl(string_view s) +{ + if(s.empty()) + this->erase(":method"); + else + this->replace(":method", s); +} + +template +inline +void +basic_fields:: +target_impl(string_view s) +{ + if(s.empty()) + this->erase(":target"); + else + return this->replace(":target", s); +} + +template +inline +void +basic_fields:: +reason_impl(string_view s) +{ + if(s.empty()) + this->erase(":reason"); + else + this->replace(":reason", s); +} + +//------------------------------------------------------------------------------ + template class basic_fields:: const_iterator diff --git a/include/beast/http/impl/message.ipp b/include/beast/http/impl/message.ipp index 881b20d3..0710dd16 100644 --- a/include/beast/http/impl/message.ipp +++ b/include/beast/http/impl/message.ipp @@ -30,7 +30,7 @@ get_method_string() const { if(method_ != verb::unknown) return to_string(method_); - return fields.method_impl(); + return this->method_impl(); } template @@ -43,7 +43,7 @@ set_method(verb v) BOOST_THROW_EXCEPTION( std::invalid_argument{"unknown verb"}); method_ = v; - fields.method_impl({}); + this->method_impl({}); } template @@ -54,9 +54,9 @@ set_method(string_view s) { method_ = string_to_verb(s); if(method_ != verb::unknown) - fields.method_impl({}); + this->method_impl({}); else - fields.method_impl(s); + this->method_impl(s); } template @@ -65,7 +65,7 @@ string_view header:: get_reason() const { - auto const s = fields.reason_impl(); + auto const s = this->reason_impl(); if(! s.empty()) return s; return obsolete_reason(result_); @@ -74,25 +74,29 @@ get_reason() const template void swap( - header& m1, - header& m2) + header& h1, + header& h2) { using std::swap; - swap(m1.version, m2.version); - swap(m1.fields, m2.fields); - swap(m1.method_, m2.method_); + swap( + static_cast(h1), + static_cast(h2)); + swap(h1.version, h2.version); + swap(h1.method_, h2.method_); } template void swap( - header& a, - header& b) + header& h1, + header& h2) { using std::swap; - swap(a.version, b.version); - swap(a.fields, b.fields); - swap(a.result_, b.result_); + swap( + static_cast(h1), + static_cast(h2)); + swap(h1.version, h2.version); + swap(h1.result_, h2.result_); } template @@ -113,11 +117,11 @@ is_keep_alive(header const& msg) BOOST_ASSERT(msg.version == 10 || msg.version == 11); if(msg.version == 11) { - if(token_list{msg.fields["Connection"]}.exists("close")) + if(token_list{msg["Connection"]}.exists("close")) return false; return true; } - if(token_list{msg.fields["Connection"]}.exists("keep-alive")) + if(token_list{msg["Connection"]}.exists("keep-alive")) return true; return false; } @@ -129,7 +133,7 @@ is_upgrade(header const& msg) BOOST_ASSERT(msg.version == 10 || msg.version == 11); if(msg.version == 10) return false; - if(token_list{msg.fields["Connection"]}.exists("upgrade")) + if(token_list{msg["Connection"]}.exists("upgrade")) return true; return false; } @@ -219,15 +223,15 @@ prepare(message& msg, detail::prepare_options(pi, msg, std::forward(options)...); - if(msg.fields.exists("Connection")) + if(msg.exists("Connection")) BOOST_THROW_EXCEPTION(std::invalid_argument{ "prepare called with Connection field set"}); - if(msg.fields.exists("Content-Length")) + if(msg.exists("Content-Length")) BOOST_THROW_EXCEPTION(std::invalid_argument{ "prepare called with Content-Length field set"}); - if(token_list{msg.fields["Transfer-Encoding"]}.exists("chunked")) + if(token_list{msg["Transfer-Encoding"]}.exists("chunked")) BOOST_THROW_EXCEPTION(std::invalid_argument{ "prepare called with Transfer-Encoding: chunked set"}); @@ -245,7 +249,7 @@ prepare(message& msg, if(*pi.content_length > 0 || msg.method() == verb::post) { - msg.fields.insert( + msg.insert( "Content-Length", *pi.content_length); } } @@ -258,7 +262,7 @@ prepare(message& msg, msg.result() != status::no_content && msg.result() != status::not_modified) { - msg.fields.insert( + msg.insert( "Content-Length", *pi.content_length); } } @@ -267,39 +271,39 @@ prepare(message& msg, } else if(msg.version >= 11) { - msg.fields.insert("Transfer-Encoding", "chunked"); + msg.insert("Transfer-Encoding", "chunked"); } } auto const content_length = - msg.fields.exists("Content-Length"); + msg.exists("Content-Length"); if(pi.connection_value) { switch(*pi.connection_value) { case connection::upgrade: - msg.fields.insert("Connection", "upgrade"); + msg.insert("Connection", "upgrade"); break; case connection::keep_alive: if(msg.version < 11) { if(content_length) - msg.fields.insert("Connection", "keep-alive"); + msg.insert("Connection", "keep-alive"); } break; case connection::close: if(msg.version >= 11) - msg.fields.insert("Connection", "close"); + msg.insert("Connection", "close"); break; } } // rfc7230 6.7. if(msg.version < 11 && token_list{ - msg.fields["Connection"]}.exists("upgrade")) + msg["Connection"]}.exists("upgrade")) BOOST_THROW_EXCEPTION(std::invalid_argument{ "invalid version for Connection: upgrade"}); } diff --git a/include/beast/http/impl/serializer.ipp b/include/beast/http/impl/serializer.ipp index 4a9209b8..3338d2ce 100644 --- a/include/beast/http/impl/serializer.ipp +++ b/include/beast/http/impl/serializer.ipp @@ -94,12 +94,12 @@ get(error_code& ec, Visit&& visit) case do_construct: { chunked_ = token_list{ - m_.fields["Transfer-Encoding"]}.exists("chunked"); - close_ = token_list{m_.fields["Connection"]}.exists("close") || - (m_.version < 11 && ! m_.fields.exists("Content-Length")); + m_["Transfer-Encoding"]}.exists("chunked"); + close_ = token_list{m_["Connection"]}.exists("close") || + (m_.version < 11 && ! m_.exists("Content-Length")); auto os = ostream(b_); detail::write_start_line(os, m_); - detail::write_fields(os, m_.fields); + detail::write_fields(os, m_); os << "\r\n"; if(chunked_) goto go_init_c; diff --git a/include/beast/http/impl/write.ipp b/include/beast/http/impl/write.ipp index 1f5f58a5..a8ecd7ed 100644 --- a/include/beast/http/impl/write.ipp +++ b/include/beast/http/impl/write.ipp @@ -828,7 +828,7 @@ operator<<(std::ostream& os, header const& msg) { detail::write_start_line(os, msg); - detail::write_fields(os, msg.fields); + detail::write_fields(os, msg); os << "\r\n"; return os; } diff --git a/include/beast/http/message.hpp b/include/beast/http/message.hpp index a48ffcb0..33f02bc0 100644 --- a/include/beast/http/message.hpp +++ b/include/beast/http/message.hpp @@ -45,7 +45,7 @@ template struct header; template -struct header +struct header : Fields #endif { /// Indicates if the header is a request or response. @@ -59,6 +59,17 @@ struct header /// The type representing the fields. using fields_type = Fields; + /** The HTTP-version. + + This holds both the major and minor version numbers, + using these formulas: + @code + int major = version / 10; + int minor = version % 10; + @endcode + */ + int version; + /// Default constructor header() = default; @@ -96,25 +107,11 @@ struct header header>::value>::type> explicit header(Arg1&& arg1, ArgN&&... argn) - : fields(std::forward(arg1), + : Fields(std::forward(arg1), std::forward(argn)...) { } - /** The HTTP-version. - - This holds both the major and minor version numbers, - using these formulas: - @code - int major = version / 10; - int minor = version % 10; - @endcode - */ - int version; - - /// The HTTP field values. - fields_type fields; - /** Return the request-method verb. If the request-method is not one of the recognized verbs, @@ -181,7 +178,7 @@ struct header string_view target() const { - return fields.target_impl(); + return this->target_impl(); } /** Set the request-target string. @@ -193,7 +190,7 @@ struct header void target(string_view s) { - fields.target_impl(s); + this->target_impl(s); } private: @@ -230,7 +227,7 @@ private: @li Invoke algorithms which operate on the header only. */ template -struct header +struct header : Fields { /// Indicates if the header is a request or response. static bool constexpr is_request = false; @@ -249,9 +246,6 @@ struct header */ int version; - /// The HTTP field values. - fields_type fields; - /// Default constructor. header() = default; @@ -283,7 +277,7 @@ struct header header>::value>::type> explicit header(Arg1&& arg1, ArgN&&... argn) - : fields(std::forward(arg1), + : Fields(std::forward(arg1), std::forward(argn)...) { } @@ -379,7 +373,7 @@ struct header void reason(string_view s) { - fields.reason_impl(s); + this->reason_impl(s); } private: diff --git a/include/beast/http/parser.hpp b/include/beast/http/parser.hpp index b1118793..9019a5eb 100644 --- a/include/beast/http/parser.hpp +++ b/include/beast/http/parser.hpp @@ -208,7 +208,7 @@ private: string_view value, error_code&) { - m_.fields.insert(name, value); + m_.insert(name, value); } void diff --git a/include/beast/websocket/impl/accept.ipp b/include/beast/websocket/impl/accept.ipp index 901b16ce..5381e091 100644 --- a/include/beast/websocket/impl/accept.ipp +++ b/include/beast/websocket/impl/accept.ipp @@ -153,8 +153,7 @@ operator()(error_code ec, bool again) ec = error::handshake_failed; if(! ec) { - pmd_read( - d.ws.pmd_config_, d.res.fields); + pmd_read(d.ws.pmd_config_, d.res); d.ws.open(detail::role_type::server); } break; diff --git a/include/beast/websocket/impl/handshake.ipp b/include/beast/websocket/impl/handshake.ipp index cae20f99..3dfad407 100644 --- a/include/beast/websocket/impl/handshake.ipp +++ b/include/beast/websocket/impl/handshake.ipp @@ -132,8 +132,7 @@ operator()(error_code ec, bool again) // VFALCO Do we need the ability to move // a message on the async_write? // - pmd_read( - d.ws.pmd_config_, d.req.fields); + pmd_read(d.ws.pmd_config_, d.req); http::async_write(d.ws.stream_, d.req, std::move(*this)); // TODO We don't need d.req now. Figure diff --git a/include/beast/websocket/impl/rfc6455.ipp b/include/beast/websocket/impl/rfc6455.ipp index d8153785..582d2dee 100644 --- a/include/beast/websocket/impl/rfc6455.ipp +++ b/include/beast/websocket/impl/rfc6455.ipp @@ -23,9 +23,9 @@ is_upgrade(http::header const& req) return false; if(! http::is_upgrade(req)) return false; - if(! http::token_list{req.fields["Upgrade"]}.exists("websocket")) + if(! http::token_list{req["Upgrade"]}.exists("websocket")) return false; - if(! req.fields.exists("Sec-WebSocket-Version")) + if(! req.exists("Sec-WebSocket-Version")) return false; return true; } diff --git a/include/beast/websocket/impl/stream.ipp b/include/beast/websocket/impl/stream.ipp index aebaef09..75adb35f 100644 --- a/include/beast/websocket/impl/stream.ipp +++ b/include/beast/websocket/impl/stream.ipp @@ -117,7 +117,7 @@ do_accept(http::header const& req, // teardown if Connection: close. return; } - pmd_read(pmd_config_, req.fields); + pmd_read(pmd_config_, req); open(detail::role_type::server); } @@ -137,7 +137,7 @@ do_handshake(response_type* res_p, { auto const req = build_request( key, host, target, decorator); - pmd_read(pmd_config_, req.fields); + pmd_read(pmd_config_, req); http::write(stream_, req, ec); } if(ec) @@ -163,12 +163,12 @@ build_request(detail::sec_ws_key_type& key, req.target(target); req.version = 11; req.method(http::verb::get); - req.fields.insert("Host", host); - req.fields.insert("Upgrade", "websocket"); - req.fields.insert("Connection", "upgrade"); + req.insert("Host", host); + req.insert("Upgrade", "websocket"); + req.insert("Connection", "upgrade"); detail::make_sec_ws_key(key, maskgen_); - req.fields.insert("Sec-WebSocket-Key", key); - req.fields.insert("Sec-WebSocket-Version", "13"); + req.insert("Sec-WebSocket-Key", key); + req.insert("Sec-WebSocket-Version", "13"); if(pmd_opts_.client_enable) { detail::pmd_offer config; @@ -181,14 +181,13 @@ build_request(detail::sec_ws_key_type& key, pmd_opts_.server_no_context_takeover; config.client_no_context_takeover = pmd_opts_.client_no_context_takeover; - detail::pmd_write( - req.fields, config); + detail::pmd_write(req, config); } decorator(req); - if(! req.fields.exists("User-Agent")) + if(! req.exists("User-Agent")) { static_string<20> s(BEAST_VERSION_STRING); - req.fields.insert("User-Agent", s); + req.insert("User-Agent", s); } return req; } @@ -204,10 +203,10 @@ build_response(http::header const& req, [&decorator](response_type& res) { decorator(res); - if(! res.fields.exists("Server")) + if(! res.exists("Server")) { static_string<20> s(BEAST_VERSION_STRING); - res.fields.insert("Server", s); + res.insert("Server", s); } }; auto err = @@ -227,18 +226,18 @@ build_response(http::header const& req, return err("Wrong method"); if(! is_upgrade(req)) return err("Expected Upgrade request"); - if(! req.fields.exists("Host")) + if(! req.exists("Host")) return err("Missing Host"); - if(! req.fields.exists("Sec-WebSocket-Key")) + if(! req.exists("Sec-WebSocket-Key")) return err("Missing Sec-WebSocket-Key"); - if(! http::token_list{req.fields["Upgrade"]}.exists("websocket")) + if(! http::token_list{req["Upgrade"]}.exists("websocket")) return err("Missing websocket Upgrade token"); - auto const key = req.fields["Sec-WebSocket-Key"]; + auto const key = req["Sec-WebSocket-Key"]; if(key.size() > detail::sec_ws_key_type::max_size_n) return err("Invalid Sec-WebSocket-Key"); { auto const version = - req.fields["Sec-WebSocket-Version"]; + req["Sec-WebSocket-Version"]; if(version.empty()) return err("Missing Sec-WebSocket-Version"); if(version != "13") @@ -246,7 +245,7 @@ build_response(http::header const& req, response_type res; res.result(http::status::upgrade_required); res.version = req.version; - res.fields.insert("Sec-WebSocket-Version", "13"); + res.insert("Sec-WebSocket-Version", "13"); prepare(res); decorate(res); return res; @@ -257,18 +256,17 @@ build_response(http::header const& req, { detail::pmd_offer offer; detail::pmd_offer unused; - pmd_read(offer, req.fields); - pmd_negotiate( - res.fields, unused, offer, pmd_opts_); + pmd_read(offer, req); + pmd_negotiate(res, unused, offer, pmd_opts_); } res.result(http::status::switching_protocols); res.version = req.version; - res.fields.insert("Upgrade", "websocket"); - res.fields.insert("Connection", "upgrade"); + res.insert("Upgrade", "websocket"); + res.insert("Connection", "upgrade"); { detail::sec_ws_accept_type accept; detail::make_sec_ws_accept(accept, key); - res.fields.insert("Sec-WebSocket-Accept", accept); + res.insert("Sec-WebSocket-Accept", accept); } decorate(res); return res; @@ -288,14 +286,14 @@ do_response(http::header const& res, return false; if(! is_upgrade(res)) return false; - if(! http::token_list{res.fields["Upgrade"]}.exists("websocket")) + if(! http::token_list{res["Upgrade"]}.exists("websocket")) return false; - if(! res.fields.exists("Sec-WebSocket-Accept")) + if(! res.exists("Sec-WebSocket-Accept")) return false; detail::sec_ws_accept_type accept; detail::make_sec_ws_accept(accept, key); if(accept.compare( - res.fields["Sec-WebSocket-Accept"]) != 0) + res["Sec-WebSocket-Accept"]) != 0) return false; return true; }(); @@ -305,7 +303,7 @@ do_response(http::header const& res, return; } detail::pmd_offer offer; - pmd_read(offer, res.fields); + pmd_read(offer, res); // VFALCO see if offer satisfies pmd_config_, // return an error if not. pmd_config_ = offer; // overwrite for now diff --git a/include/beast/websocket/stream.hpp b/include/beast/websocket/stream.hpp index daf357e4..9c8367f5 100644 --- a/include/beast/websocket/stream.hpp +++ b/include/beast/websocket/stream.hpp @@ -1563,7 +1563,7 @@ public: ws.handshake("localhost", "/", [](request_type& req) { - req.fields.insert("User-Agent", "Beast"); + req.insert("User-Agent", "Beast"); }); } catch(...) @@ -1625,7 +1625,7 @@ public: ws.handshake(res, "localhost", "/", [](request_type& req) { - req.fields.insert("User-Agent", "Beast"); + req.insert("User-Agent", "Beast"); }); } catch(...) @@ -1771,7 +1771,7 @@ public: ws.handshake("localhost", "/", [](request_type& req) { - req.fields.insert("User-Agent", "Beast"); + req.insert("User-Agent", "Beast"); }, ec); if(ec) @@ -1833,7 +1833,7 @@ public: ws.handshake(res, "localhost", "/", [](request_type& req) { - req.fields.insert("User-Agent", "Beast"); + req.insert("User-Agent", "Beast"); }, ec); if(ec) diff --git a/test/http/doc_http_samples.cpp b/test/http/doc_http_samples.cpp index 2280b964..0f557494 100644 --- a/test/http/doc_http_samples.cpp +++ b/test/http/doc_http_samples.cpp @@ -66,11 +66,11 @@ public: [&](yield_context) { flat_buffer buffer; - request req; + request req; req.version = 11; req.method("POST"); req.target("/"); - req.fields.insert("User-Agent", "test"); + req.insert("User-Agent", "test"); req.body = "Hello, world!"; prepare(req); @@ -99,11 +99,11 @@ public: void doRelay() { - request req; + request req; req.version = 11; req.method("POST"); req.target("/"); - req.fields.insert("User-Agent", "test"); + req.insert("User-Agent", "test"); req.body = "Hello, world!"; prepare(req); @@ -121,8 +121,8 @@ public: relay(upstream.client, downstream.server, buffer, ec, [&](header& h, error_code& ec) { - h.fields.erase("Content-Length"); - h.fields.replace("Transfer-Encoding", "chunked"); + h.erase("Content-Length"); + h.replace("Transfer-Encoding", "chunked"); }); BEAST_EXPECTS(! ec, ec.message()); BEAST_EXPECT(equal_body( @@ -155,7 +155,7 @@ public: req.version = 11; req.method(verb::get); req.target("/"); - req.fields.insert("User-Agent", "test"); + req.insert("User-Agent", "test"); error_code ec; write_ostream(os, req, ec); BEAST_EXPECTS(! ec, ec.message()); diff --git a/test/http/fields.cpp b/test/http/fields.cpp index c34b1bf3..0f204006 100644 --- a/test/http/fields.cpp +++ b/test/http/fields.cpp @@ -99,24 +99,11 @@ public: BEAST_EXPECT(size(f) == 2); } - void - testMethodString() - { - f_t f; - f.method_impl("CRY"); - BEAST_EXPECTS(f.method_impl() == "CRY", f.method_impl()); - f.method_impl("PUT"); - BEAST_EXPECTS(f.method_impl() == "PUT", f.method_impl()); - f.method_impl({}); - BEAST_EXPECTS(f.method_impl().empty(), f.method_impl()); - } - void run() override { testHeaders(); testRFC2616(); testErase(); - testMethodString(); } }; diff --git a/test/http/message.cpp b/test/http/message.cpp index e006f31c..23a0bb5e 100644 --- a/test/http/message.cpp +++ b/test/http/message.cpp @@ -118,14 +118,14 @@ public: h.insert("User-Agent", "test"); message m{Arg1{}, h}; BEAST_EXPECT(h["User-Agent"] == "test"); - BEAST_EXPECT(m.fields["User-Agent"] == "test"); + BEAST_EXPECT(m["User-Agent"] == "test"); } { fields h; h.insert("User-Agent", "test"); message m{Arg1{}, std::move(h)}; BEAST_EXPECT(! h.exists("User-Agent")); - BEAST_EXPECT(m.fields["User-Agent"] == "test"); + BEAST_EXPECT(m["User-Agent"] == "test"); } // swap @@ -133,7 +133,7 @@ public: message m2; m1.target("u"); m1.body = "1"; - m1.fields.insert("h", "v"); + m1.insert("h", "v"); m2.method("G"); m2.body = "2"; swap(m1, m2); @@ -143,8 +143,8 @@ public: BEAST_EXPECT(m2.target() == "u"); BEAST_EXPECT(m1.body == "2"); BEAST_EXPECT(m2.body == "1"); - BEAST_EXPECT(! m1.fields.exists("h")); - BEAST_EXPECT(m2.fields.exists("h")); + BEAST_EXPECT(! m1.exists("h")); + BEAST_EXPECT(m2.exists("h")); } struct MoveFields : fields @@ -187,10 +187,10 @@ public: MoveFields h; header r{std::move(h)}; BEAST_EXPECT(h.moved_from); - BEAST_EXPECT(r.fields.moved_to); + BEAST_EXPECT(r.moved_to); request m{std::move(r)}; - BEAST_EXPECT(r.fields.moved_from); - BEAST_EXPECT(m.fields.moved_to); + BEAST_EXPECT(r.moved_from); + BEAST_EXPECT(m.moved_to); } } @@ -202,12 +202,12 @@ public: m.method(verb::get); m.target("/"); m.version = 11; - m.fields.insert("Upgrade", "test"); + m.insert("Upgrade", "test"); BEAST_EXPECT(! is_upgrade(m)); prepare(m, connection::upgrade); BEAST_EXPECT(is_upgrade(m)); - BEAST_EXPECT(m.fields["Connection"] == "upgrade"); + BEAST_EXPECT(m["Connection"] == "upgrade"); m.version = 10; BEAST_EXPECT(! is_upgrade(m)); @@ -220,7 +220,7 @@ public: request m; m.version = 10; BEAST_EXPECT(! is_upgrade(m)); - m.fields.insert("Transfer-Encoding", "chunked"); + m.insert("Transfer-Encoding", "chunked"); try { prepare(m); @@ -229,8 +229,8 @@ public: catch(std::exception const&) { } - m.fields.erase("Transfer-Encoding"); - m.fields.insert("Content-Length", "0"); + m.erase("Transfer-Encoding"); + m.insert("Content-Length", "0"); try { prepare(m); @@ -240,8 +240,8 @@ public: { pass(); } - m.fields.erase("Content-Length"); - m.fields.insert("Connection", "keep-alive"); + m.erase("Content-Length"); + m.insert("Connection", "keep-alive"); try { prepare(m); @@ -252,8 +252,8 @@ public: pass(); } m.version = 11; - m.fields.erase("Connection"); - m.fields.insert("Connection", "close"); + m.erase("Connection"); + m.insert("Connection", "close"); BEAST_EXPECT(! is_keep_alive(m)); } @@ -265,7 +265,7 @@ public: m1.result(status::ok); m1.version = 10; m1.body = "1"; - m1.fields.insert("h", "v"); + m1.insert("h", "v"); m2.result(status::not_found); m2.body = "2"; m2.version = 11; @@ -280,8 +280,8 @@ public: BEAST_EXPECT(m2.version == 10); BEAST_EXPECT(m1.body == "2"); BEAST_EXPECT(m2.body == "1"); - BEAST_EXPECT(! m1.fields.exists("h")); - BEAST_EXPECT(m2.fields.exists("h")); + BEAST_EXPECT(! m1.exists("h")); + BEAST_EXPECT(m2.exists("h")); } void diff --git a/test/http/parser.cpp b/test/http/parser.cpp index 32cdc076..6a92e46a 100644 --- a/test/http/parser.cpp +++ b/test/http/parser.cpp @@ -133,7 +133,7 @@ public: BEAST_EXPECT(m.version == 10); BEAST_EXPECT(m.result() == status::ok); BEAST_EXPECT(m.reason() == "OK"); - BEAST_EXPECT(m.fields["Server"] == "test"); + BEAST_EXPECT(m["Server"] == "test"); BEAST_EXPECT(m.body == "Hello, world!"); } ); @@ -160,10 +160,10 @@ public: BEAST_EXPECT(m.version == 11); BEAST_EXPECT(m.result() == status::ok); BEAST_EXPECT(m.reason() == "OK"); - BEAST_EXPECT(m.fields["Server"] == "test"); - BEAST_EXPECT(m.fields["Transfer-Encoding"] == "chunked"); - BEAST_EXPECT(m.fields["Expires"] == "never"); - BEAST_EXPECT(m.fields["MD5-Fingerprint"] == "-"); + BEAST_EXPECT(m["Server"] == "test"); + BEAST_EXPECT(m["Transfer-Encoding"] == "chunked"); + BEAST_EXPECT(m["Expires"] == "never"); + BEAST_EXPECT(m["MD5-Fingerprint"] == "-"); BEAST_EXPECT(m.body == "*****--"); } ); @@ -202,7 +202,7 @@ public: [&](parser_type const& p) { auto const& m = p.get(); - BEAST_EXPECT(m.fields["X"] == "x"); + BEAST_EXPECT(m["X"] == "x"); } ); @@ -226,7 +226,7 @@ public: BEAST_EXPECT(m.method() == verb::get); BEAST_EXPECT(m.target() == "/"); BEAST_EXPECT(m.version == 11); - BEAST_EXPECT(m.fields["User-Agent"] == "test"); + BEAST_EXPECT(m["User-Agent"] == "test"); BEAST_EXPECT(m.body == "*"); } { diff --git a/test/http/write.cpp b/test/http/write.cpp index a603cfd8..a9a7441e 100644 --- a/test/http/write.cpp +++ b/test/http/write.cpp @@ -294,8 +294,8 @@ public: m.version = 10; m.result(status::ok); m.reason("OK"); - m.fields.insert("Server", "test"); - m.fields.insert("Content-Length", "5"); + m.insert("Server", "test"); + m.insert("Content-Length", "5"); m.body = "*****"; error_code ec; test::string_ostream ss{ios_}; @@ -313,8 +313,8 @@ public: m.version = 11; m.result(status::ok); m.reason("OK"); - m.fields.insert("Server", "test"); - m.fields.insert("Transfer-Encoding", "chunked"); + m.insert("Server", "test"); + m.insert("Transfer-Encoding", "chunked"); m.body = "*****"; error_code ec; test::string_ostream ss(ios_); @@ -346,8 +346,8 @@ public: m.method(verb::get); m.target("/"); m.version = 10; - m.fields.insert("User-Agent", "test"); - m.fields.insert("Content-Length", "5"); + m.insert("User-Agent", "test"); + m.insert("Content-Length", "5"); m.body = "*****"; try { @@ -377,8 +377,8 @@ public: m.method(verb::get); m.target("/"); m.version = 10; - m.fields.insert("User-Agent", "test"); - m.fields.insert("Transfer-Encoding", "chunked"); + m.insert("User-Agent", "test"); + m.insert("Transfer-Encoding", "chunked"); m.body = "*****"; error_code ec; write(fs, m, ec); @@ -410,8 +410,8 @@ public: m.method(verb::get); m.target("/"); m.version = 10; - m.fields.insert("User-Agent", "test"); - m.fields.insert("Transfer-Encoding", "chunked"); + m.insert("User-Agent", "test"); + m.insert("Transfer-Encoding", "chunked"); m.body = "*****"; error_code ec; async_write(fs, m, do_yield[ec]); @@ -443,8 +443,8 @@ public: m.method(verb::get); m.target("/"); m.version = 10; - m.fields.insert("User-Agent", "test"); - m.fields.insert("Content-Length", "5"); + m.insert("User-Agent", "test"); + m.insert("Content-Length", "5"); m.body = "*****"; error_code ec; write(fs, m, ec); @@ -471,8 +471,8 @@ public: m.method(verb::get); m.target("/"); m.version = 10; - m.fields.insert("User-Agent", "test"); - m.fields.insert("Content-Length", "5"); + m.insert("User-Agent", "test"); + m.insert("Content-Length", "5"); m.body = "*****"; error_code ec; async_write(fs, m, do_yield[ec]); @@ -500,7 +500,7 @@ public: m.method(verb::get); m.target("/"); m.version = 10; - m.fields.insert("User-Agent", "test"); + m.insert("User-Agent", "test"); m.body = "*"; prepare(m); BEAST_EXPECT(str(m) == @@ -517,7 +517,7 @@ public: m.method(verb::get); m.target("/"); m.version = 10; - m.fields.insert("User-Agent", "test"); + m.insert("User-Agent", "test"); m.body = "*"; prepare(m, connection::keep_alive); BEAST_EXPECT(str(m) == @@ -535,7 +535,7 @@ public: m.method(verb::get); m.target("/"); m.version = 10; - m.fields.insert("User-Agent", "test"); + m.insert("User-Agent", "test"); m.body = "*"; try { @@ -553,7 +553,7 @@ public: m.method(verb::get); m.target("/"); m.version = 10; - m.fields.insert("User-Agent", "test"); + m.insert("User-Agent", "test"); m.body = "*"; prepare(m); test::string_ostream ss(ios_); @@ -573,7 +573,7 @@ public: m.method(verb::get); m.target("/"); m.version = 11; - m.fields.insert("User-Agent", "test"); + m.insert("User-Agent", "test"); m.body = "*"; prepare(m); BEAST_EXPECT(str(m) == @@ -590,7 +590,7 @@ public: m.method(verb::get); m.target("/"); m.version = 11; - m.fields.insert("User-Agent", "test"); + m.insert("User-Agent", "test"); m.body = "*"; prepare(m, connection::close); test::string_ostream ss(ios_); @@ -612,7 +612,7 @@ public: m.method(verb::get); m.target("/"); m.version = 11; - m.fields.insert("User-Agent", "test"); + m.insert("User-Agent", "test"); prepare(m, connection::upgrade); BEAST_EXPECT(str(m) == "GET / HTTP/1.1\r\n" @@ -627,7 +627,7 @@ public: m.method(verb::get); m.target("/"); m.version = 11; - m.fields.insert("User-Agent", "test"); + m.insert("User-Agent", "test"); m.body = "*"; prepare(m); test::string_ostream ss(ios_); @@ -652,7 +652,7 @@ public: m.method(verb::get); m.target("/"); m.version = 11; - m.fields.insert("User-Agent", "test"); + m.insert("User-Agent", "test"); m.body = "*"; BEAST_EXPECT(boost::lexical_cast(m) == "GET / HTTP/1.1\r\nUser-Agent: test\r\n\r\n*"); @@ -684,7 +684,7 @@ public: m.method(verb::get); m.version = 11; m.target("/"); - m.fields.insert("Content-Length", 5); + m.insert("Content-Length", 5); m.body = "*****"; async_write(os, m, handler{}); BEAST_EXPECT(handler::count() > 0); @@ -706,7 +706,7 @@ public: m.method(verb::get); m.version = 11; m.target("/"); - m.fields.insert("Content-Length", 5); + m.insert("Content-Length", 5); m.body = "*****"; async_write(is, m, handler{}); BEAST_EXPECT(handler::count() > 0); @@ -788,7 +788,7 @@ public: m0.version = 11; m0.result(status::ok); m0.reason("OK"); - m0.fields.insert("Server", "test"); + m0.insert("Server", "test"); m0.body.s = "Hello, world!\n"; { @@ -845,7 +845,7 @@ public: } } { - m0.fields.insert("Transfer-Encoding", "chunked"); + m0.insert("Transfer-Encoding", "chunked"); { auto m = m0; error_code ec; diff --git a/test/websocket/rfc6455.cpp b/test/websocket/rfc6455.cpp index c2a37545..169ba810 100644 --- a/test/websocket/rfc6455.cpp +++ b/test/websocket/rfc6455.cpp @@ -28,11 +28,11 @@ public: req.target("/"); BEAST_EXPECT(! is_upgrade(req)); req.method(http::verb::get); - req.fields.insert("Connection", "upgrade"); + req.insert("Connection", "upgrade"); BEAST_EXPECT(! is_upgrade(req)); - req.fields.insert("Upgrade", "websocket"); + req.insert("Upgrade", "websocket"); BEAST_EXPECT(! is_upgrade(req)); - req.fields.insert("Sec-WebSocket-Version", "13"); + req.insert("Sec-WebSocket-Version", "13"); BEAST_EXPECT(is_upgrade(req)); } diff --git a/test/websocket/ssl/websocket_async_ssl_echo_server.hpp b/test/websocket/ssl/websocket_async_ssl_echo_server.hpp index 919571ad..6a2f0b50 100644 --- a/test/websocket/ssl/websocket_async_ssl_echo_server.hpp +++ b/test/websocket/ssl/websocket_async_ssl_echo_server.hpp @@ -225,7 +225,7 @@ private: d.ws.async_accept_ex( [](beast::websocket::response_type& res) { - res.fields.insert( + res.insert( "Server", "async_ssl_echo_server"); }, d.strand.wrap(std::move(*this))); diff --git a/test/websocket/stream.cpp b/test/websocket/stream.cpp index 50d23be6..a98e08cb 100644 --- a/test/websocket/stream.cpp +++ b/test/websocket/stream.cpp @@ -707,11 +707,11 @@ public: req.method(http::verb::get); req.target("/"); req.version = 11; - req.fields.insert("Host", "localhost"); - req.fields.insert("Upgrade", "websocket"); - req.fields.insert("Connection", "upgrade"); - req.fields.insert("Sec-WebSocket-Key", "dGhlIHNhbXBsZSBub25jZQ=="); - req.fields.insert("Sec-WebSocket-Version", "13"); + req.insert("Host", "localhost"); + req.insert("Upgrade", "websocket"); + req.insert("Connection", "upgrade"); + req.insert("Sec-WebSocket-Key", "dGhlIHNhbXBsZSBub25jZQ=="); + req.insert("Sec-WebSocket-Version", "13"); stream> ws{fc, ios_}; c.accept(ws, req); @@ -721,11 +721,11 @@ public: req.method(http::verb::get); req.target("/"); req.version = 11; - req.fields.insert("Host", "localhost"); - req.fields.insert("Upgrade", "websocket"); - req.fields.insert("Connection", "upgrade"); - req.fields.insert("Sec-WebSocket-Key", "dGhlIHNhbXBsZSBub25jZQ=="); - req.fields.insert("Sec-WebSocket-Version", "13"); + req.insert("Host", "localhost"); + req.insert("Upgrade", "websocket"); + req.insert("Connection", "upgrade"); + req.insert("Sec-WebSocket-Key", "dGhlIHNhbXBsZSBub25jZQ=="); + req.insert("Sec-WebSocket-Version", "13"); stream> ws{fc, ios_}; bool called = false; @@ -739,11 +739,11 @@ public: req.method(http::verb::get); req.target("/"); req.version = 11; - req.fields.insert("Host", "localhost"); - req.fields.insert("Upgrade", "websocket"); - req.fields.insert("Connection", "upgrade"); - req.fields.insert("Sec-WebSocket-Key", "dGhlIHNhbXBsZSBub25jZQ=="); - req.fields.insert("Sec-WebSocket-Version", "13"); + req.insert("Host", "localhost"); + req.insert("Upgrade", "websocket"); + req.insert("Connection", "upgrade"); + req.insert("Sec-WebSocket-Key", "dGhlIHNhbXBsZSBub25jZQ=="); + req.insert("Sec-WebSocket-Version", "13"); stream> ws{fc, ios_}; c.accept(ws, req, @@ -766,11 +766,11 @@ public: req.method(http::verb::get); req.target("/"); req.version = 11; - req.fields.insert("Host", "localhost"); - req.fields.insert("Upgrade", "websocket"); - req.fields.insert("Connection", "upgrade"); - req.fields.insert("Sec-WebSocket-Key", "dGhlIHNhbXBsZSBub25jZQ=="); - req.fields.insert("Sec-WebSocket-Version", "13"); + req.insert("Host", "localhost"); + req.insert("Upgrade", "websocket"); + req.insert("Connection", "upgrade"); + req.insert("Sec-WebSocket-Key", "dGhlIHNhbXBsZSBub25jZQ=="); + req.insert("Sec-WebSocket-Version", "13"); stream> ws{fc, ios_}; bool called = false; @@ -797,11 +797,11 @@ public: req.method(http::verb::get); req.target("/"); req.version = 11; - req.fields.insert("Host", "localhost"); - req.fields.insert("Upgrade", "websocket"); - req.fields.insert("Connection", "upgrade"); - req.fields.insert("Sec-WebSocket-Key", "dGhlIHNhbXBsZSBub25jZQ=="); - req.fields.insert("Sec-WebSocket-Version", "13"); + req.insert("Host", "localhost"); + req.insert("Upgrade", "websocket"); + req.insert("Connection", "upgrade"); + req.insert("Sec-WebSocket-Key", "dGhlIHNhbXBsZSBub25jZQ=="); + req.insert("Sec-WebSocket-Version", "13"); stream> ws{fc, ios_, "\x88\x82\xff\xff\xff\xff\xfc\x17"}; @@ -825,11 +825,11 @@ public: req.method(http::verb::get); req.target("/"); req.version = 11; - req.fields.insert("Host", "localhost"); - req.fields.insert("Upgrade", "websocket"); - req.fields.insert("Connection", "upgrade"); - req.fields.insert("Sec-WebSocket-Key", "dGhlIHNhbXBsZSBub25jZQ=="); - req.fields.insert("Sec-WebSocket-Version", "13"); + req.insert("Host", "localhost"); + req.insert("Upgrade", "websocket"); + req.insert("Connection", "upgrade"); + req.insert("Sec-WebSocket-Key", "dGhlIHNhbXBsZSBub25jZQ=="); + req.insert("Sec-WebSocket-Version", "13"); stream> ws{fc, ios_, "xff\xff\xfc\x17"}; diff --git a/test/websocket/websocket_async_echo_server.hpp b/test/websocket/websocket_async_echo_server.hpp index 19a51449..db7d2d49 100644 --- a/test/websocket/websocket_async_echo_server.hpp +++ b/test/websocket/websocket_async_echo_server.hpp @@ -263,7 +263,7 @@ private: d.ws.async_accept_ex( [](beast::websocket::response_type& res) { - res.fields.insert( + res.insert( "Server", "async_echo_server"); }, std::move(*this)); diff --git a/test/websocket/websocket_sync_echo_server.hpp b/test/websocket/websocket_sync_echo_server.hpp index 4350cb00..ad683dea 100644 --- a/test/websocket/websocket_sync_echo_server.hpp +++ b/test/websocket/websocket_sync_echo_server.hpp @@ -293,7 +293,7 @@ private: ws.accept_ex( [](beast::websocket::response_type& res) { - res.fields.insert( + res.insert( "Server", "sync_echo_server"); }, ec);