Client: added parsing of host specified with IPv6 address
This commit is contained in:
parent
c896342127
commit
bab4b309ca
2 changed files with 42 additions and 24 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue