Commit bab4b309 authored by Ole Christian Eidheim's avatar Ole Christian Eidheim
Browse files

Client: added parsing of host specified with IPv6 address

parent c8963421
Loading
Loading
Loading
Loading
Loading
+20 −9
Original line number Diff line number Diff line
@@ -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;
+22 −15
Original line number Diff line number Diff line
@@ -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));

@@ -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;