Loading client_http.hpp +20 −9 Original line number Diff line number Diff line Loading @@ -500,22 +500,33 @@ namespace SimpleWeb { } std::pair<std::string, unsigned short> parse_host_port(const std::string &host_port, unsigned short default_port) const noexcept { std::pair<std::string, unsigned short> parsed_host_port; std::size_t host_end = host_port.find(':'); if(host_end == std::string::npos) { parsed_host_port.first = host_port; parsed_host_port.second = default_port; std::string host, port; host.reserve(host_port.size()); bool parse_port = false; int square_count = 0; // To parse IPv6 addresses for(auto chr : host_port) { if(chr == '[') ++square_count; else if(chr == ']') --square_count; else if(square_count == 0 && chr == ':') parse_port = true; else if(!parse_port) host += chr; else port += chr; } if(port.empty()) return {std::move(host), default_port}; else { parsed_host_port.first = host_port.substr(0, host_end); try { parsed_host_port.second = static_cast<unsigned short>(std::stoul(host_port.substr(host_end + 1))); return {std::move(host), static_cast<unsigned short>(std::stoul(port))}; } catch(...) { parsed_host_port.second = default_port; return {std::move(host), default_port}; } } return parsed_host_port; } virtual std::shared_ptr<Connection> create_connection() noexcept = 0; Loading tests/parse_test.cpp +22 −15 Original line number Diff line number Diff line Loading @@ -61,16 +61,6 @@ public: void connect(const std::shared_ptr<Session> &) noexcept override {} void constructor_parse_test1() { ASSERT(host == "test.org"); ASSERT(port == 8080); } void constructor_parse_test2() { ASSERT(host == "test.org"); ASSERT(port == 80); } void parse_response_header_test() { std::shared_ptr<Response> response(new Response(static_cast<size_t>(-1), nullptr)); Loading Loading @@ -151,13 +141,30 @@ int main() { serverTest->parse_request_test(); auto clientTest = make_shared<ClientTest>("test.org:8080"); clientTest->constructor_parse_test1(); { ClientTest clientTest("test.org"); ASSERT(clientTest.host == "test.org"); ASSERT(clientTest.port == 80); clientTest.parse_response_header_test(); } auto clientTest2 = make_shared<ClientTest>("test.org"); clientTest2->constructor_parse_test2(); { ClientTest clientTest("test.org:8080"); ASSERT(clientTest.host == "test.org"); ASSERT(clientTest.port == 8080); } { ClientTest clientTest("[::1]"); ASSERT(clientTest.host == "::1"); ASSERT(clientTest.port == 80); } clientTest2->parse_response_header_test(); { ClientTest clientTest("[::1]:8080"); ASSERT(clientTest.host == "::1"); ASSERT(clientTest.port == 8080); } io_context io_service; Loading Loading
client_http.hpp +20 −9 Original line number Diff line number Diff line Loading @@ -500,22 +500,33 @@ namespace SimpleWeb { } std::pair<std::string, unsigned short> parse_host_port(const std::string &host_port, unsigned short default_port) const noexcept { std::pair<std::string, unsigned short> parsed_host_port; std::size_t host_end = host_port.find(':'); if(host_end == std::string::npos) { parsed_host_port.first = host_port; parsed_host_port.second = default_port; std::string host, port; host.reserve(host_port.size()); bool parse_port = false; int square_count = 0; // To parse IPv6 addresses for(auto chr : host_port) { if(chr == '[') ++square_count; else if(chr == ']') --square_count; else if(square_count == 0 && chr == ':') parse_port = true; else if(!parse_port) host += chr; else port += chr; } if(port.empty()) return {std::move(host), default_port}; else { parsed_host_port.first = host_port.substr(0, host_end); try { parsed_host_port.second = static_cast<unsigned short>(std::stoul(host_port.substr(host_end + 1))); return {std::move(host), static_cast<unsigned short>(std::stoul(port))}; } catch(...) { parsed_host_port.second = default_port; return {std::move(host), default_port}; } } return parsed_host_port; } virtual std::shared_ptr<Connection> create_connection() noexcept = 0; Loading
tests/parse_test.cpp +22 −15 Original line number Diff line number Diff line Loading @@ -61,16 +61,6 @@ public: void connect(const std::shared_ptr<Session> &) noexcept override {} void constructor_parse_test1() { ASSERT(host == "test.org"); ASSERT(port == 8080); } void constructor_parse_test2() { ASSERT(host == "test.org"); ASSERT(port == 80); } void parse_response_header_test() { std::shared_ptr<Response> response(new Response(static_cast<size_t>(-1), nullptr)); Loading Loading @@ -151,13 +141,30 @@ int main() { serverTest->parse_request_test(); auto clientTest = make_shared<ClientTest>("test.org:8080"); clientTest->constructor_parse_test1(); { ClientTest clientTest("test.org"); ASSERT(clientTest.host == "test.org"); ASSERT(clientTest.port == 80); clientTest.parse_response_header_test(); } auto clientTest2 = make_shared<ClientTest>("test.org"); clientTest2->constructor_parse_test2(); { ClientTest clientTest("test.org:8080"); ASSERT(clientTest.host == "test.org"); ASSERT(clientTest.port == 8080); } { ClientTest clientTest("[::1]"); ASSERT(clientTest.host == "::1"); ASSERT(clientTest.port == 80); } clientTest2->parse_response_header_test(); { ClientTest clientTest("[::1]:8080"); ASSERT(clientTest.host == "::1"); ASSERT(clientTest.port == 8080); } io_context io_service; Loading