1*3f982cf4SFabien Sanglard // Copyright 2020 The Chromium Authors. All rights reserved. 2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be 3*3f982cf4SFabien Sanglard // found in the LICENSE file. 4*3f982cf4SFabien Sanglard 5*3f982cf4SFabien Sanglard #ifndef UTIL_URL_H_ 6*3f982cf4SFabien Sanglard #define UTIL_URL_H_ 7*3f982cf4SFabien Sanglard 8*3f982cf4SFabien Sanglard #include <cstdint> 9*3f982cf4SFabien Sanglard #include <string> 10*3f982cf4SFabien Sanglard 11*3f982cf4SFabien Sanglard #include "util/osp_logging.h" 12*3f982cf4SFabien Sanglard 13*3f982cf4SFabien Sanglard namespace openscreen { 14*3f982cf4SFabien Sanglard 15*3f982cf4SFabien Sanglard // Parses a URL and stores its components separately. If parsing is successful, 16*3f982cf4SFabien Sanglard // is_valid() will return true, otherwise no other members should be accessed. 17*3f982cf4SFabien Sanglard // This is a thin wrapper around //third_party/mozilla. It does not handle 18*3f982cf4SFabien Sanglard // file: or mailto: URLs. 19*3f982cf4SFabien Sanglard class Url { 20*3f982cf4SFabien Sanglard public: 21*3f982cf4SFabien Sanglard explicit Url(const std::string& source); 22*3f982cf4SFabien Sanglard Url(const Url&); 23*3f982cf4SFabien Sanglard Url(Url&&) noexcept; 24*3f982cf4SFabien Sanglard ~Url(); 25*3f982cf4SFabien Sanglard 26*3f982cf4SFabien Sanglard Url& operator=(const Url&); 27*3f982cf4SFabien Sanglard Url& operator=(Url&&); 28*3f982cf4SFabien Sanglard 29*3f982cf4SFabien Sanglard // No other members should be accessed if this is false. is_valid()30*3f982cf4SFabien Sanglard bool is_valid() const { return is_valid_; } 31*3f982cf4SFabien Sanglard 32*3f982cf4SFabien Sanglard // A successfully parsed URL will always have a scheme. All the other 33*3f982cf4SFabien Sanglard // components are optional and therefore have has_*() accessors for checking 34*3f982cf4SFabien Sanglard // their presence. scheme()35*3f982cf4SFabien Sanglard const std::string& scheme() const { 36*3f982cf4SFabien Sanglard OSP_DCHECK(is_valid_); 37*3f982cf4SFabien Sanglard return scheme_; 38*3f982cf4SFabien Sanglard } has_host()39*3f982cf4SFabien Sanglard bool has_host() const { 40*3f982cf4SFabien Sanglard OSP_DCHECK(is_valid_); 41*3f982cf4SFabien Sanglard return has_host_; 42*3f982cf4SFabien Sanglard } host()43*3f982cf4SFabien Sanglard const std::string& host() const { 44*3f982cf4SFabien Sanglard OSP_DCHECK(is_valid_); 45*3f982cf4SFabien Sanglard return host_; 46*3f982cf4SFabien Sanglard } has_port()47*3f982cf4SFabien Sanglard bool has_port() const { 48*3f982cf4SFabien Sanglard OSP_DCHECK(is_valid_); 49*3f982cf4SFabien Sanglard return has_port_; 50*3f982cf4SFabien Sanglard } port()51*3f982cf4SFabien Sanglard int32_t port() const { 52*3f982cf4SFabien Sanglard OSP_DCHECK(is_valid_); 53*3f982cf4SFabien Sanglard return port_; 54*3f982cf4SFabien Sanglard } has_path()55*3f982cf4SFabien Sanglard bool has_path() const { 56*3f982cf4SFabien Sanglard OSP_DCHECK(is_valid_); 57*3f982cf4SFabien Sanglard return has_path_; 58*3f982cf4SFabien Sanglard } path()59*3f982cf4SFabien Sanglard const std::string& path() const { 60*3f982cf4SFabien Sanglard OSP_DCHECK(is_valid_); 61*3f982cf4SFabien Sanglard return path_; 62*3f982cf4SFabien Sanglard } has_query()63*3f982cf4SFabien Sanglard bool has_query() const { 64*3f982cf4SFabien Sanglard OSP_DCHECK(is_valid_); 65*3f982cf4SFabien Sanglard return has_query_; 66*3f982cf4SFabien Sanglard } query()67*3f982cf4SFabien Sanglard const std::string& query() const { 68*3f982cf4SFabien Sanglard OSP_DCHECK(is_valid_); 69*3f982cf4SFabien Sanglard return query_; 70*3f982cf4SFabien Sanglard } 71*3f982cf4SFabien Sanglard 72*3f982cf4SFabien Sanglard private: 73*3f982cf4SFabien Sanglard bool is_valid_ = false; 74*3f982cf4SFabien Sanglard bool has_host_ = false; 75*3f982cf4SFabien Sanglard bool has_port_ = false; 76*3f982cf4SFabien Sanglard bool has_path_ = false; 77*3f982cf4SFabien Sanglard bool has_query_ = false; 78*3f982cf4SFabien Sanglard 79*3f982cf4SFabien Sanglard std::string scheme_; 80*3f982cf4SFabien Sanglard std::string host_; 81*3f982cf4SFabien Sanglard int32_t port_ = 0; 82*3f982cf4SFabien Sanglard std::string path_; 83*3f982cf4SFabien Sanglard std::string query_; 84*3f982cf4SFabien Sanglard }; 85*3f982cf4SFabien Sanglard 86*3f982cf4SFabien Sanglard } // namespace openscreen 87*3f982cf4SFabien Sanglard 88*3f982cf4SFabien Sanglard #endif // UTIL_URL_H_ 89