nlib
Uri.h
[詳解]
1 
2 #pragma once
3 #ifndef INCLUDE_NN_NLIB_URI_H_
4 #define INCLUDE_NN_NLIB_URI_H_
5 
6 #include <utility>
7 
8 #include "nn/nlib/Config.h"
9 #include "nn/nlib/UniquePtr.h"
10 #include "nn/nlib/Nlist.h"
11 
12 NLIB_NAMESPACE_BEGIN
13 
14 class InputStream;
15 class OutputStream;
16 class MemoryOutputStream;
17 
18 class Uri NLIB_FINAL {
19  public:
20  // reserved = gen-delims / sub-delims
21  // gen - delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
22  // sub - delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
23  NLIB_VIS_PUBLIC static bool IsReserved(int c) NLIB_NOEXCEPT;
24  // unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
25  NLIB_VIS_PUBLIC static bool IsUnreserved(int c) NLIB_NOEXCEPT;
26  // 0-9 / A-F / a-f
27  NLIB_VIS_PUBLIC static bool IsHexDigit(int c) NLIB_NOEXCEPT;
28  NLIB_VIS_PUBLIC static errno_t DecodeUriComponent(InputStream* is,
30  NLIB_VIS_PUBLIC static errno_t EncodeUriComponent(InputStream* is, OutputStream* os,
31  bool fragment_mode = false) NLIB_NOEXCEPT;
32 
33  NLIB_VIS_PUBLIC static errno_t DecodeUriComponent(size_t* written, char* buf, size_t n,
34  const char* s) NLIB_NOEXCEPT;
35  NLIB_VIS_PUBLIC static errno_t EncodeUriComponent(size_t* written, char* buf, size_t n,
36  const char* s,
37  bool fragment_mode) NLIB_NOEXCEPT;
38  NLIB_VIS_PUBLIC static errno_t DecodePath(size_t* written, char* buf, size_t n,
39  const char* s) NLIB_NOEXCEPT;
40  NLIB_VIS_PUBLIC static errno_t EncodePath(size_t* written, char* buf, size_t n,
41  const char* s) NLIB_NOEXCEPT;
42 
43  template <size_t N>
44  static errno_t
45  DecodeUriComponent(size_t* written, char (&buf)[N], const char* s) NLIB_NOEXCEPT {
46  return DecodeUriComponent(written, buf, N, s);
47  }
48  template <size_t N>
49  static errno_t
50  EncodeUriComponent(size_t* written, char (&buf)[N], const char* s,
51  bool fragment_mode) NLIB_NOEXCEPT {
52  return EncodeUriComponent(written, buf, N, s, fragment_mode);
53  }
54  template <size_t N>
55  static errno_t
56  DecodePath(size_t* written, char (&buf)[N], const char* s) NLIB_NOEXCEPT {
57  return DecodePath(written, buf, N, s);
58  }
59  template <size_t N>
60  static errno_t
61  EncodePath(size_t* written, char (&buf)[N], const char* s) NLIB_NOEXCEPT {
62  return EncodePath(written, buf, N, s);
63  }
64 
65  public:
66  NLIB_VIS_PUBLIC Uri() NLIB_NOEXCEPT;
67  NLIB_VIS_PUBLIC ~Uri() NLIB_NOEXCEPT;
68  NLIB_VIS_PUBLIC bool Parse(const char* str) NLIB_NOEXCEPT;
69  // for example:
70  // http://foobar:pass@www.example.com:80/my/dir/index.html?var=value#frag
71  // scheme = "http"
72  // userinfo = "foobar:pass"
73  // host = "www.example.com"
74  // port = "80"
75  // path = "/my/dir/index.html"
76  // query = "var=value"
77  // fragment = "frag"
78  NLIB_VIS_PUBLIC bool SetUri(const char* scheme, const char* userinfo, const char* host,
79  const char* port, const char* path, const char* query,
80  const char* fragment) NLIB_NOEXCEPT;
81 
82  NLIB_VIS_PUBLIC errno_t ComposeString(OutputStream* os) const NLIB_NOEXCEPT;
83  NLIB_VIS_PUBLIC bool ComposeString(char* buf, size_t size) const NLIB_NOEXCEPT;
84  template <size_t N>
85  bool ComposeString(char (&buf)[N]) const NLIB_NOEXCEPT {
86  return this->ComposeString(buf, N);
87  }
88 
89  // AddBaseUri("g/", "http://a/b/c/d;p?q") -> http://a/b/c/g/
90  // AddBaseUri("/g", "http://a/b/c/d;p?q") -> http://a/g
91  // AddBaseUri("//g", "http://a/b/c/d;p?q") -> http://g
92  NLIB_VIS_PUBLIC bool AddBaseUri(const Uri& relative, const Uri& base) NLIB_NOEXCEPT;
93  // "http" from "http://foobar:pass@www.example.com:80/my/dir/index.html?var=value#frag"
94  const char* GetScheme() const NLIB_NOEXCEPT { return m_Scheme.get(); }
95  // "foobar:pass" from "http://foobar:pass@www.example.com:80/my/dir/index.html?var=value#frag"
96  const char* GetUserInfo() const NLIB_NOEXCEPT { return m_UserInfo.get(); }
97  // "www.example.com" from "http://foobar:pass@www.example.com:80/my/dir/index.html?var=value#frag"
98  const char* GetHost() const NLIB_NOEXCEPT { return m_Host.get(); }
99  // "80" from "http://foobar:pass@www.example.com:80/my/dir/index.html?var=value#frag"
100  const char* GetPort() const NLIB_NOEXCEPT { return m_Port.get(); }
101  // "/my/dir/index.html" from "http://foobar:pass@www.example.com:80/my/dir/index.html?var=value#frag"
102  const char* GetPath() const NLIB_NOEXCEPT { return m_Path.get(); }
103  // "var=value" from "http://foobar:pass@www.example.com:80/my/dir/index.html?var=value#frag"
104  const char* GetQuery() const NLIB_NOEXCEPT { return m_Query.get(); }
105  // "frag" from "http://foobar:pass@www.example.com:80/my/dir/index.html?var=value#frag"
106  const char* GetFragment() const NLIB_NOEXCEPT { return m_Fragment.get(); }
107  void Reset() NLIB_NOEXCEPT;
108 
109  private:
110  NLIB_VIS_HIDDEN bool SetScheme_(const char* first, const char* last) NLIB_NOEXCEPT;
111  NLIB_VIS_HIDDEN bool SetUserInfo_(const char* first, const char* last) NLIB_NOEXCEPT;
112  NLIB_VIS_HIDDEN bool SetHost_(const char* first, const char* last) NLIB_NOEXCEPT;
113  NLIB_VIS_HIDDEN bool SetPort_(const char* first, const char* last) NLIB_NOEXCEPT;
114  NLIB_VIS_HIDDEN bool SetPath_(const char* first, const char* last) NLIB_NOEXCEPT;
115  NLIB_VIS_HIDDEN bool SetQuery_(const char* first, const char* last) NLIB_NOEXCEPT;
116  NLIB_VIS_HIDDEN bool SetFragment_(const char* first, const char* last) NLIB_NOEXCEPT;
117  NLIB_VIS_HIDDEN bool DirectSet(UniquePtr<char[]>* field, const char* str) NLIB_NOEXCEPT;
118  NLIB_VIS_HIDDEN bool MergePath(const char* base, const char* relative) NLIB_NOEXCEPT;
119  NLIB_VIS_HIDDEN bool RemoveDotSegments(const char* path) NLIB_NOEXCEPT;
120 
121  private:
122  UniquePtr<char[]> m_Scheme; // unspecified if NULL, empty string not allowed.
123  UniquePtr<char[]> m_UserInfo; // unspecified if NULL, empty string not allowed.
124  UniquePtr<char[]> m_Host; // unspecified if NULL, empty string for empty string host.
125  UniquePtr<char[]> m_Port; // unspecified if NULL, empty string not allowed.
126  UniquePtr<char[]> m_Path; // empty path if empty string, NULL is not allowed.
127  UniquePtr<char[]> m_Query; // unspecified if NULL, empty string for empty string query
128  UniquePtr<char[]> m_Fragment; // unspecified if NULL, empty string for empty string fragment
129 };
130 
131 NLIB_NAMESPACE_END
132 
133 NLIB_NAMESPACE_BEGIN
134 namespace detail {
135 
136 class Query NLIB_FINAL {
137  public:
138  typedef std::pair<const char*, const char*> KeyValue;
139  Query() NLIB_NOEXCEPT {}
140  NLIB_VIS_PUBLIC ~Query() NLIB_NOEXCEPT;
141  NLIB_VIS_PUBLIC bool Set(const char* query) NLIB_NOEXCEPT;
142  NLIB_VIS_PUBLIC bool Add(const char* key, const char* value) NLIB_NOEXCEPT;
143  NLIB_VIS_PUBLIC bool Compose(char** p, char* end) const NLIB_NOEXCEPT;
144  NLIB_VIS_PUBLIC const char* GetValue(const char* key) const NLIB_NOEXCEPT;
145  size_t GetNumQuery() const NLIB_NOEXCEPT { return m_Query.size(); }
146  const KeyValue* GetKeyValue(size_t i) const NLIB_NOEXCEPT {
147  return (i < m_Query.size()) ? &m_Query[i] : NULL;
148  }
149  void Reset() NLIB_NOEXCEPT { m_Query.clear(); }
150 
151  private:
152  Nlist<KeyValue> m_Query;
154 };
155 
156 class Segments NLIB_FINAL {
157  // NOTE:
158  // Each segments holds the byte sequence decoded completely.
159  public:
160  NLIB_VIS_PUBLIC Segments() NLIB_NOEXCEPT;
161  NLIB_VIS_PUBLIC ~Segments() NLIB_NOEXCEPT;
162  NLIB_VIS_PUBLIC void Reset() NLIB_NOEXCEPT;
163  NLIB_VIS_PUBLIC bool SetPath(const char* str) NLIB_NOEXCEPT;
164  NLIB_VIS_PUBLIC bool ComposePath(char** p, char* buf_end) const NLIB_NOEXCEPT;
165  bool IsAbsolutePath() const NLIB_NOEXCEPT { return m_IsAbsolutePath; }
166  bool IsDirectory() const NLIB_NOEXCEPT { return m_IsDirectory; }
167  bool IsEmpty() const NLIB_NOEXCEPT {
168  return m_Segment.empty() && !m_IsAbsolutePath && !m_IsDirectory;
169  }
170  const char* GetSegment(size_t i) const NLIB_NOEXCEPT {
171  return i < m_Segment.size() ? m_Segment[i].get() : NULL;
172  }
173  size_t GetNumSegment() const NLIB_NOEXCEPT { return m_Segment.size(); }
174 
175  private:
176  bool m_IsAbsolutePath;
177  bool m_IsDirectory;
178  Nlist<UniquePtr<char[]> > m_Segment;
180 };
181 
182 } // namespace detail
183 NLIB_NAMESPACE_END
184 
185 
186 #endif // INCLUDE_NN_NLIB_URI_H_
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
Definition: Platform.h:2151
static errno_t DecodePath(size_t *written, char(&buf)[N], const char *s) noexcept
DecodePath(written, buf, N, s)を呼び出します。
Definition: Uri.h:56
static errno_t DecodeUriComponent(size_t *written, char(&buf)[N], const char *s) noexcept
DecodeUriComponent(written, buf, N, s)を呼び出します。
Definition: Uri.h:45
#define NLIB_FINAL
利用可能であればfinalが定義されます。そうでない場合は空文字列です。
#define NLIB_DISALLOW_COPY_AND_ASSIGN(TypeName)
TypeName で指定されたクラスのコピーコンストラクタと代入演算子を禁止します。
Definition: Config.h:126
const char * GetHost() const noexcept
ホスト名を取得します。
Definition: Uri.h:98
#define NLIB_VIS_HIDDEN
関数やクラス等のシンボルをライブラリの外部に公開しません。
Definition: Platform_unix.h:50
const char * GetScheme() const noexcept
URIのスキーム(http, file等)の文字列を返します。
Definition: Uri.h:94
UniquePtrはポインタの所有権を保持し、UniquePtrがスコープから出るときにデストラクタでポインタをDELで指...
Definition: UniquePtr.h:96
std::unique_ptrに相当するクラスが定義されています。
static errno_t EncodePath(size_t *written, char(&buf)[N], const char *s) noexcept
EncodePath(written, buf, N, s)を呼び出します。
Definition: Uri.h:61
const char * GetPort() const noexcept
ポート番号の文字列を取得します。
Definition: Uri.h:100
std::vectorに似ていますが、コピーできないオブジェクトを格納可能なクラスが定義されています。 ...
const char * GetUserInfo() const noexcept
指定した URI に関連付けられているユーザー名、パスワードなどのユーザー固有の情報を取得します。 ...
Definition: Uri.h:96
入力ストリームの基底クラスです。このクラスを実体化することはできません。
Definition: InputStream.h:15
const char * GetPath() const noexcept
パスを取得します。
Definition: Uri.h:102
static errno_t EncodeUriComponent(size_t *written, char(&buf)[N], const char *s, bool fragment_mode) noexcept
EncodeUriComponent(written, buf, N, s, fragment_mode)を呼び出します。
Definition: Uri.h:50
開発環境別の設定が書かれるファイルです。
一般的なURIをパースしたり構築したりするためのクラスです。
Definition: Uri.h:18
const char * GetFragment() const noexcept
フラグメント文字列を取得します
Definition: Uri.h:106
#define NLIB_VIS_PUBLIC
関数やクラス等のシンボルをライブラリの外部に公開します。
Definition: Platform_unix.h:51
const char * GetQuery() const noexcept
クエリ文字列を取得します
Definition: Uri.h:104
出力ストリームの基底クラスです。このクラスを実体化することはできません。
Definition: OutputStream.h:17
int errno_t
intのtypedefで、戻り値としてPOSIXのエラー値を返すことを示します。
Definition: NMalloc.h:24