xref: /aosp_15_r20/external/openscreen/util/url.h (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
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