Client: added parsing of host specified with IPv6 address

This commit is contained in:
eidheim 2021-04-09 14:33:43 +02:00
commit bab4b309ca
2 changed files with 42 additions and 24 deletions

View file

@ -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> parse_host_port(const std::string &host_port, unsigned short default_port) const noexcept {
std::pair<std::string, unsigned short> parsed_host_port; std::string host, port;
std::size_t host_end = host_port.find(':'); host.reserve(host_port.size());
if(host_end == std::string::npos) { bool parse_port = false;
parsed_host_port.first = host_port; int square_count = 0; // To parse IPv6 addresses
parsed_host_port.second = default_port; 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 { else {
parsed_host_port.first = host_port.substr(0, host_end);
try { 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(...) { 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; virtual std::shared_ptr<Connection> create_connection() noexcept = 0;

View file

@ -61,16 +61,6 @@ public:
void connect(const std::shared_ptr<Session> &) noexcept override {} 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() { void parse_response_header_test() {
std::shared_ptr<Response> response(new Response(static_cast<size_t>(-1), nullptr)); std::shared_ptr<Response> response(new Response(static_cast<size_t>(-1), nullptr));
@ -151,13 +141,30 @@ int main() {
serverTest->parse_request_test(); 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);
}
clientTest2->parse_response_header_test(); {
ClientTest clientTest("[::1]");
ASSERT(clientTest.host == "::1");
ASSERT(clientTest.port == 80);
}
{
ClientTest clientTest("[::1]:8080");
ASSERT(clientTest.host == "::1");
ASSERT(clientTest.port == 8080);
}
io_context io_service; io_context io_service;