From 048ee7523cb34ea9041c4ec2e12743295b231bbc Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Sun, 4 Jun 2017 10:03:36 -0700 Subject: [PATCH] Refactor method and verb (API Change): The verb interfaces now use verb::unknown instead of boost::optional == boost::none to indicate that the request-method is an unrecognized string. The http::header interface is modified to focus more on the verb enum rather than the string. For recognized verbs, the implementation stores an integer instead of the string. Unknown verbs are still stored as strings. * header::method now returns a verb * header::method_string returns the method text --- CHANGELOG.md | 4 ++ doc/6_1_http_message.qbk | 37 ++++++----- doc/images/message.png | Bin 40445 -> 39902 bytes include/beast/http/fields.hpp | 15 ++--- include/beast/http/impl/fields.ipp | 24 +------ include/beast/http/impl/message.ipp | 40 ++++++++++- include/beast/http/impl/verb.ipp | 18 +++-- include/beast/http/message.hpp | 81 ++++++++++++++++++++--- include/beast/http/verb.hpp | 13 +++- include/beast/websocket/impl/rfc6455.ipp | 2 +- include/beast/websocket/impl/stream.ipp | 2 +- test/http/fields.cpp | 18 +++-- test/http/message.cpp | 30 ++++++++- test/http/parser.cpp | 4 +- test/http/verb.cpp | 4 +- 15 files changed, 205 insertions(+), 87 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 455d5fcb..bd0f246a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ Version 49 +API Changes: + +* Refactor method and verb + -------------------------------------------------------------------------------- Version 48 diff --git a/doc/6_1_http_message.qbk b/doc/6_1_http_message.qbk index aa9f6087..08f4c4bd 100644 --- a/doc/6_1_http_message.qbk +++ b/doc/6_1_http_message.qbk @@ -210,11 +210,16 @@ template struct header { int version; - string_view method() const; + verb method() const; + string_view method_string() const; + void method(verb); void method(string_view); string_view target(); const; void target(string_view); Fields fields; + +private: + verb method_; }; /// An HTTP response header @@ -230,12 +235,16 @@ struct header ``` The start-line data members are replaced traditional accessors using -non-owning references to string buffers. Now we make a concession: -management of the corresponding string is delegated to the [*Fields] -container, which can already be allocator aware and constructed with the -necessary allocator parameter via the provided constructor overloads for -`message`. The delegation implementation looks like this (only the -response header specialization is shown): +non-owning references to string buffers. The method is stored using +a simple integer instead of the entire string, for the case where +the method is recognized from the set of known verb strings. + +Now we make a concession: management of the corresponding string is +delegated to the [*Fields] container, which can already be allocator +aware and constructed with the necessary allocator parameter via the +provided constructor overloads for `message`. The delegation +implementation looks like this (only the response header specialization +is shown): ``` /// An HTTP response header template @@ -244,28 +253,22 @@ struct header int version; int status; - auto - reason() const -> decltype(std::declval().reason()) const + string_view + reason() const { return fields.reason(); } - template void - reason(Value&& value) + reason(string_view s) { - fields.reason(std::forward(value)); + fields.reason(s); } Fields fields; }; ``` -An advantage of this technique is that user-provided implementations of -[*Fields] may use arbitrary representation strategies. For example, instead -of explicitly storing the method as a string, store it as an enumerated -integer with a lookup table of static strings for known message types. - Now that we've accomplished our initial goals and more, there is one small quality of life improvement to make. Users will choose different types for `Body` far more often than they will for `Fields`. Thus, we swap the order diff --git a/doc/images/message.png b/doc/images/message.png index fc750f8dd065f78da41ecdc69cb850cd685f4a90..6e96476279502237174403268bbc83aee06f368a 100644 GIT binary patch delta 38680 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 delta 39336 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 e7SQuw{{X}C?hrHQzuymmlzF=PxvX #include #include -#include #include #include -#include #include #include #include @@ -61,8 +59,6 @@ class basic_fields : using size_type = typename std::allocator_traits::size_type; - boost::optional verb_; - void delete_all(); @@ -290,13 +286,10 @@ private: #endif string_view - method() const; + method_string() const; void - method(verb v); - - void - method(string_view const& s); + method_string(string_view s); string_view target() const @@ -305,7 +298,7 @@ private: } void - target(string_view const& s) + target(string_view s) { return this->replace(":target", s); } @@ -317,7 +310,7 @@ private: } void - reason(string_view const& s) + reason(string_view s) { return this->replace(":reason", s); } diff --git a/include/beast/http/impl/fields.ipp b/include/beast/http/impl/fields.ipp index 39b695ad..ef78d693 100644 --- a/include/beast/http/impl/fields.ipp +++ b/include/beast/http/impl/fields.ipp @@ -100,7 +100,6 @@ basic_fields(basic_fields&& other) std::move(other.member())) , detail::basic_fields_base( std::move(other.set_), std::move(other.list_)) - , verb_(other.verb_) { } @@ -115,7 +114,6 @@ operator=(basic_fields&& other) -> clear(); move_assign(other, std::integral_constant{}); - verb_ = other.verb_; return *this; } @@ -126,7 +124,6 @@ basic_fields(basic_fields const& other) select_on_container_copy_construction(other.member())) { copy_from(other); - verb_ = other.verb_; } template @@ -138,7 +135,6 @@ operator=(basic_fields const& other) -> clear(); copy_assign(other, std::integral_constant{}); - verb_ = other.verb_; return *this; } @@ -148,7 +144,6 @@ basic_fields:: basic_fields(basic_fields const& other) { copy_from(other); - verb_ = other.verb_; } template @@ -160,7 +155,6 @@ operator=(basic_fields const& other) -> { clear(); copy_from(other); - verb_ = other.verb_; return *this; } @@ -260,29 +254,17 @@ replace(string_view const& name, template string_view basic_fields:: -method() const +method_string() const { - if(verb_) - return to_string(*verb_); return (*this)[":method"]; } template void basic_fields:: -method(verb v) +method_string(string_view s) { - verb_ = v; - this->erase(":method"); -} - -template -void -basic_fields:: -method(string_view const& s) -{ - verb_ = string_to_verb(s); - if(verb_) + if(s.empty()) this->erase(":method"); else this->replace(":method", s); diff --git a/include/beast/http/impl/message.ipp b/include/beast/http/impl/message.ipp index d951f951..71df4b0f 100644 --- a/include/beast/http/impl/message.ipp +++ b/include/beast/http/impl/message.ipp @@ -22,6 +22,43 @@ namespace beast { namespace http { +template +template +string_view +header:: +get_method_string() const +{ + if(method_ != verb::unknown) + return to_string(method_); + return fields.method_string(); +} + +template +template +void +header:: +set_method(verb v) +{ + if(v == verb::unknown) + BOOST_THROW_EXCEPTION( + std::invalid_argument{"unknown verb"}); + method_ = v; + fields.method_string({}); +} + +template +template +void +header:: +set_method(string_view s) +{ + method_ = string_to_verb(s); + if(method_ != verb::unknown) + fields.method_string({}); + else + fields.method_string(s); +} + template void swap( @@ -31,6 +68,7 @@ swap( using std::swap; swap(m1.version, m2.version); swap(m1.fields, m2.fields); + swap(m1.method_, m2.method_); } template @@ -193,7 +231,7 @@ prepare(message& msg, { using beast::detail::ci_equal; if(*pi.content_length > 0 || - ci_equal(msg.method(), "POST")) + msg.method() == verb::post) { msg.fields.insert( "Content-Length", *pi.content_length); diff --git a/include/beast/http/impl/verb.ipp b/include/beast/http/impl/verb.ipp index 7f261b6d..f72e1089 100644 --- a/include/beast/http/impl/verb.ipp +++ b/include/beast/http/impl/verb.ipp @@ -62,13 +62,16 @@ verb_to_string(verb v) case verb::link: return "LINK"; case verb::unlink: return "UNLINK"; + + case verb::unknown: + return ""; } - BOOST_THROW_EXCEPTION(std::logic_error{"unknown method"}); + BOOST_THROW_EXCEPTION(std::invalid_argument{"unknown verb"}); } template -boost::optional +verb string_to_verb(string_view v) { /* @@ -107,7 +110,8 @@ string_to_verb(string_view v) UNSUBSCRIBE */ if(v.size() < 3) - return boost::none; + return verb::unknown; + // s must be null terminated auto const eq = [](string_view sv, char const* s) { @@ -118,8 +122,8 @@ string_to_verb(string_view v) return false; ++s; ++p; - if(*s == 0) - return *p == 0; + if(! *s) + return p == sv.end(); } }; auto c = v[0]; @@ -303,7 +307,7 @@ string_to_verb(string_view v) break; } - return boost::none; + return verb::unknown; } } // detail @@ -316,7 +320,7 @@ to_string(verb v) } inline -boost::optional +verb string_to_verb(string_view s) { return detail::string_to_verb(s); diff --git a/include/beast/http/message.hpp b/include/beast/http/message.hpp index 629fe72e..bb15d847 100644 --- a/include/beast/http/message.hpp +++ b/include/beast/http/message.hpp @@ -10,9 +10,12 @@ #include #include +#include #include #include +#include #include +#include #include #include #include @@ -66,28 +69,64 @@ struct header */ int version; - /** Return the Request Method + /** Return the request-method verb. + + If the request-method is not one of the recognized verbs, + @ref verb::unknown is returned. Callers may use @ref method_string + to retrieve the exact text. @note This function is only available if `isRequest == true`. + + @see @ref method_string */ - auto - method() const -> - decltype(std::declval().method()) const + verb + method() const { - return fields.method(); + return method_; } - /** Set the Request Method + /** Set the request-method verb. - @param value A value that represents the request method. + This function will set the method for requests to one + of the known verbs. + + @param v The request method verb to set. + This may not be @ref verb::unknown. + + @throw std::invalid_argument when `v == verb::unknown`. + */ + void + method(verb v) + { + set_method(v); + } + + /** Return the request-method as a string. + + @note This function is only available if `isRequest == true`. + + @see @ref method + */ + string_view + method_string() const + { + return get_method_string(); + } + + /** Set the request-method using a string. + + This function will set the method for requests to a verb + if the string matches a known verb, otherwise it will + store a copy of the passed string as the method. + + @param s A string representing the request method. @note This function is only available if `isRequest == true`. */ - template void - method(Value&& value) + method(string_view s) { - fields.method(std::forward(value)); + set_method(s); } /** Return the Request Target @@ -158,6 +197,28 @@ struct header std::forward(argn)...) { } + +private: + template + friend + void + swap( + header& m1, + header& m2); + + template + string_view + get_method_string() const; + + template + void + set_method(verb v); + + template + void + set_method(string_view v); + + verb method_ = verb::unknown; }; /** A container for an HTTP request or response header. diff --git a/include/beast/http/verb.hpp b/include/beast/http/verb.hpp index 8ff64967..a77020b9 100644 --- a/include/beast/http/verb.hpp +++ b/include/beast/http/verb.hpp @@ -10,7 +10,6 @@ #include #include -#include #include namespace beast { @@ -23,8 +22,16 @@ namespace http { */ enum class verb { + /** An unknown method. + + This value indicates that the request method string is not + one of the recognized verbs. Callers interested in the method + should use an interface which returns the original string. + */ + unknown = 0, + /// The DELETE method deletes the specified resource - delete_ = 1, + delete_, /** The GET method requests a representation of the specified resource. @@ -123,7 +130,7 @@ enum class verb If the string does not match a known request method, `boost::none` is returned. */ -boost::optional +verb string_to_verb(string_view s); /// Returns the text representation of a request method verb. diff --git a/include/beast/websocket/impl/rfc6455.ipp b/include/beast/websocket/impl/rfc6455.ipp index e04bd11c..d8153785 100644 --- a/include/beast/websocket/impl/rfc6455.ipp +++ b/include/beast/websocket/impl/rfc6455.ipp @@ -19,7 +19,7 @@ is_upgrade(http::header const& req) { if(req.version < 11) return false; - if(req.method() != "GET") + if(req.method() != http::verb::get) return false; if(! http::is_upgrade(req)) return false; diff --git a/include/beast/websocket/impl/stream.ipp b/include/beast/websocket/impl/stream.ipp index d1894ce1..8ce4422c 100644 --- a/include/beast/websocket/impl/stream.ipp +++ b/include/beast/websocket/impl/stream.ipp @@ -225,7 +225,7 @@ build_response(http::header const& req, }; if(req.version < 11) return err("HTTP version 1.1 required"); - if(req.method() != "GET") + if(req.method() != http::verb::get) return err("Wrong method"); if(! is_upgrade(req)) return err("Expected Upgrade request"); diff --git a/test/http/fields.cpp b/test/http/fields.cpp index c6bb2c1a..3dfd23e7 100644 --- a/test/http/fields.cpp +++ b/test/http/fields.cpp @@ -100,17 +100,15 @@ public: } void - testMethod() + testMethodString() { f_t f; - f.method(verb::get); - BEAST_EXPECTS(f.method() == "GET", f.method()); - f.method("CRY"); - BEAST_EXPECTS(f.method() == "CRY", f.method()); - f.method("PUT"); - BEAST_EXPECTS(f.method() == "PUT", f.method()); - f.method("CONNECT"); - BEAST_EXPECTS(f.method() == "CONNECT", f.method()); + f.method_string("CRY"); + BEAST_EXPECTS(f.method_string() == "CRY", f.method_string()); + f.method_string("PUT"); + BEAST_EXPECTS(f.method_string() == "PUT", f.method_string()); + f.method_string({}); + BEAST_EXPECTS(f.method_string().empty(), f.method_string()); } void run() override @@ -118,7 +116,7 @@ public: testHeaders(); testRFC2616(); testErase(); - testMethod(); + testMethodString(); } }; diff --git a/test/http/message.cpp b/test/http/message.cpp index 14b817b6..0de2542b 100644 --- a/test/http/message.cpp +++ b/test/http/message.cpp @@ -137,8 +137,8 @@ public: m2.method("G"); m2.body = "2"; swap(m1, m2); - BEAST_EXPECT(m1.method() == "G"); - BEAST_EXPECT(m2.method().empty()); + BEAST_EXPECT(m1.method_string() == "G"); + BEAST_EXPECT(m2.method_string().empty()); BEAST_EXPECT(m1.target().empty()); BEAST_EXPECT(m2.target() == "u"); BEAST_EXPECT(m1.body == "2"); @@ -296,6 +296,31 @@ public: }(); } + void + testMethod() + { + header h; + auto const vcheck = + [&](verb v) + { + h.method(v); + BEAST_EXPECT(h.method() == v); + BEAST_EXPECT(h.method_string() == to_string(v)); + }; + auto const scheck = + [&](string_view s) + { + h.method(s); + BEAST_EXPECT(h.method() == string_to_verb(s)); + BEAST_EXPECT(h.method_string() == s); + }; + vcheck(verb::get); + vcheck(verb::head); + scheck("GET"); + scheck("HEAD"); + scheck("XYZ"); + } + void run() override { @@ -305,6 +330,7 @@ public: testPrepare(); testSwap(); testSpecialMembers(); + testMethod(); } }; diff --git a/test/http/parser.cpp b/test/http/parser.cpp index 6bbfe384..8ace8e0f 100644 --- a/test/http/parser.cpp +++ b/test/http/parser.cpp @@ -237,7 +237,7 @@ public: [&](parser_type const& p) { auto const& m = p.get(); - BEAST_EXPECT(m.method() == "GET"); + BEAST_EXPECT(m.method() == verb::get); BEAST_EXPECT(m.target() == "/"); BEAST_EXPECT(m.version == 11); BEAST_EXPECT(! p.need_eof()); @@ -274,7 +274,7 @@ public: BEAST_EXPECT(p.is_done()); BEAST_EXPECT(p.is_header_done()); BEAST_EXPECT(! p.need_eof()); - BEAST_EXPECT(m.method() == "GET"); + BEAST_EXPECT(m.method() == verb::get); BEAST_EXPECT(m.target() == "/"); BEAST_EXPECT(m.version == 11); BEAST_EXPECT(m.fields["User-Agent"] == "test"); diff --git a/test/http/verb.cpp b/test/http/verb.cpp index b0a83cf5..ec90033d 100644 --- a/test/http/verb.cpp +++ b/test/http/verb.cpp @@ -26,6 +26,8 @@ public: BEAST_EXPECT(string_to_verb(to_string(v)) == v); }; + good(verb::unknown); + good(verb::delete_); good(verb::get); good(verb::head); @@ -64,7 +66,7 @@ public: [&](string_view s) { auto const v = string_to_verb(s); - BEAST_EXPECTS(! v, to_string(*v)); + BEAST_EXPECTS(v == verb::unknown, to_string(v)); }; bad("AC_");