@@ -42,16 +42,7 @@ constexpr static bool isValidHTTPMethod(std::string_view payload) noexcept
4242constexpr static bool hasHTTPVersionInRequest (std::string_view payload) noexcept
4343{
4444 constexpr std::string_view httpLabel = " HTTP" ;
45-
46- auto spaces = payload | std::views::filter ([](const char c) { return c == ' ' ; });
47-
48- auto httpLabelBegin = std::ranges::next (spaces.begin (), 2 );
49- auto httpLabelEnd = std::ranges::next (spaces.begin (), 3 );
50- if (httpLabelBegin == spaces.end () || httpLabelEnd == spaces.end ()) {
51- return false ;
52- }
53-
54- return std::string_view (&*std::next (httpLabelBegin), &*httpLabelEnd) == httpLabel;
45+ return payload.contains (httpLabel);
5546}
5647
5748constexpr static bool isRequest (std::string_view payload) noexcept
@@ -62,6 +53,7 @@ constexpr static bool isRequest(std::string_view payload) noexcept
6253constexpr static bool hasHttpVersionInResponse (std::string_view payload) noexcept
6354{
6455 constexpr std::string_view httpLabel = " HTTP" ;
56+
6557 return payload.starts_with (httpLabel);
6658}
6759
@@ -109,20 +101,16 @@ constexpr bool HTTPParser::parseRequest(std::string_view payload) noexcept
109101 if (methodEnd == std::string_view::npos) {
110102 return false ;
111103 }
112- auto methodBegin
113- = std::ranges::find_if (payload, [](const unsigned char c) { return !std::isspace (c); });
114- const std::size_t methodBeginPos = std::distance (payload.begin (), methodBegin);
115- method = std::string_view (payload.substr (methodBeginPos, methodEnd - methodBeginPos));
104+
105+ auto methodBegin = payload.find_first_not_of (' ' );
106+ method = payload.substr (methodBegin, methodEnd - methodBegin);
116107
117108 const std::size_t uriEnd = payload.find (' ' , methodEnd + 1 );
118109 if (uriEnd == std::string_view::npos) {
119110 return false ;
120111 }
121- auto uriBegin = std::ranges::find_if (payload.substr (methodEnd + 1 ), [](const unsigned char c) {
122- return !std::isspace (c);
123- });
124- const std::size_t uriBeginPos = std::distance (payload.begin (), uriBegin);
125- uri = std::string_view (payload.substr (uriBeginPos, uriEnd - uriBeginPos));
112+ auto uriBegin = payload.substr (methodEnd + 1 ).find_first_not_of (' ' );
113+ uri = payload.substr (uriBegin, uriEnd - uriBegin);
126114
127115 const std::size_t httpVersionEnd = payload.find (' \n ' , uriEnd + 1 );
128116 if (httpVersionEnd == std::string_view::npos) {
@@ -147,7 +135,9 @@ bool HTTPParser::parseResponseHeaders(std::string_view payload) noexcept
147135 cookies.emplace ();
148136 }
149137 std::ranges::copy (
150- splitToVector (value) | std::views::transform (removeLeadingWhitespaces)
138+ value | std::views::split (' ' ) | std::views::transform ([](auto && rng) {
139+ return std::string_view (&*rng.begin (), std::ranges::distance (rng));
140+ }) | std::views::transform (removeLeadingWhitespaces)
151141 | std::views::take (cookies->capacity () - cookies->size ()),
152142 std::back_inserter (*cookies));
153143 }
@@ -158,25 +148,24 @@ bool HTTPParser::parseResponseHeaders(std::string_view payload) noexcept
158148
159149constexpr bool HTTPParser::parseResponse (std::string_view payload) noexcept
160150{
161- auto spaces = payload | std::views::filter ([](const char c) { return c == ' ' ; });
162-
163- auto statusCodeBegin = std::next (spaces.begin (), 1 );
164- auto statusCodeEnd = std::next (spaces.begin (), 2 );
165- if (statusCodeBegin == spaces.end () || statusCodeEnd == spaces.end ()) {
166- return false ;
167- }
168- const auto [_, errorCode] = std::from_chars (&*statusCodeBegin, &*statusCodeEnd, *statusCode);
169- if (errorCode != std::errc ()) {
151+ auto firstLine = payload.substr (0 , payload.find (' \n ' ));
152+ if (firstLine.length () == payload.length ()) {
170153 return false ;
171154 }
172155
173- const size_t statusMessageEnd
174- = payload.find (' \n ' , std::distance (spaces.begin (), statusCodeEnd) + 1 );
175- if (statusMessageEnd == std::string_view::npos) {
156+ const std::size_t statusCodeBegin = firstLine.find (' ' );
157+ const std::size_t statusCodeEnd = firstLine.find (' ' , statusCodeBegin + 1 );
158+ if (statusCodeBegin == std::string_view::npos || statusCodeEnd == std::string_view::npos
159+ || std::from_chars (
160+ firstLine.data () + statusCodeBegin + 1 ,
161+ firstLine.data () + statusCodeEnd,
162+ *statusCode)
163+ .ec
164+ != std::errc ()) {
176165 return false ;
177166 }
178167
179- return parseResponseHeaders (payload.substr (statusMessageEnd + 1 ));
168+ return parseResponseHeaders (payload.substr (firstLine. size () + 1 ));
180169}
181170
182171} // namespace ipxp
0 commit comments