summaryrefslogtreecommitdiff
path: root/src/url.hh
blob: 77027d2801afbacf13ac7ad3e715de3df421e33e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// -*- mode: c++; c-basic-offset: 2; -*-

#ifndef URL_HH
#define URL_HH

#include <cstdint>
#include <string>

// scheme://[userinfo@]host[:port]/path[?query][#fragment]
class Url {
public:
  virtual ~Url() {}

  static Url* parse(std::string const& url, Url const* base = nullptr);
  static bool parse_authority(std::string const& str,
                              std::string* host, uint16_t* port);

  virtual Url* copy() const = 0;

  bool operator==(Url const& url) const;

  // never empty, unescaped
  virtual std::string const& scheme() const = 0;

  // may be null, not empty, unescaped
  virtual char const* userinfo() const = 0;

  // may be null, not empty
  virtual char const* userinfo_escaped() const = 0;

  // may be empty, unescaped
  virtual std::string const& host() const = 0;

  // 0 is used for no port set
  virtual uint16_t port() const = 0;

  // may be empty, unescaped
  virtual std::string path() const = 0;

  // may be empty
  virtual std::string path_escaped() const = 0;

  // return true if name was found and value updated,
  // value may be empty, unescaped
  virtual bool query(std::string const& name, std::string* value) const = 0;

  // may be null or empty, unescaped
  virtual char const* full_query() const = 0;

  // may be null or empty
  virtual char const* full_query_escaped() const = 0;

  // may be null or empty, unescaped
  virtual char const* fragment() const = 0;

  virtual void print(std::ostream& out, bool path = true, bool query = true,
                     bool fragment = true) const = 0;

protected:
  Url() {}
  Url(Url const&) = delete;
};

#endif  // URL_HH