@@ -105,12 +105,14 @@ enum {
105
105
url_password,
106
106
url_host,
107
107
url_port,
108
- url_abs_path
108
+ url_abs_path,
109
+ url_query,
110
+ url_params
109
111
};
110
112
111
113
} // namespace imple
112
114
113
- enum { Invalid = -1 , Ok };
115
+ enum { Invalid = -1 , Ok = 1 };
114
116
115
117
// Best for http...
116
118
class url {
@@ -121,6 +123,8 @@ class url {
121
123
std::string host_;
122
124
std::size_t port_;
123
125
std::string abs_path_;
126
+ std::string query_;
127
+ std::string params_;
124
128
125
129
int state_;
126
130
@@ -133,6 +137,7 @@ class url {
133
137
: scheme_(std::move(u.scheme_)), account_(std::move(u.account_)),
134
138
password_ (std::move(u.password_)), host_(std::move(u.host_)),
135
139
port_(std::move(u.port_)), abs_path_(std::move(u.abs_path_)),
140
+ query_(std::move(u.query_)), params_(std::move(u.params_)),
136
141
state_(u.state_) {
137
142
u.port_ = 0 ;
138
143
u.state_ = 0 ;
@@ -146,6 +151,8 @@ class url {
146
151
port_ = u.port_ ;
147
152
u.port_ = 0 ;
148
153
abs_path_ = std::move (u.abs_path_ );
154
+ query_ = std::move (u.query_ );
155
+ params_ = std::move (u.params_ );
149
156
state_ = u.state_ ;
150
157
u.state_ = 0 ;
151
158
return *this ;
@@ -178,6 +185,16 @@ class url {
178
185
s.append (abs_path_);
179
186
}
180
187
188
+ if (query_.size () > 0 ) {
189
+ s.push_back (' ?' );
190
+ s.append (query_);
191
+ }
192
+
193
+ if (params_.size () > 0 ) {
194
+ s.push_back (' #' );
195
+ s.append (params_);
196
+ }
197
+
181
198
return s;
182
199
}
183
200
@@ -208,6 +225,10 @@ class url {
208
225
std::size_t &port_ref () { return port_; }
209
226
std::string &abs_path_ref () { return abs_path_; }
210
227
std::string abs_path () { return abs_path_; }
228
+ std::string &query_ref () { return query_; }
229
+ std::string query () { return query_; }
230
+ std::string ¶ms_ref () { return params_; }
231
+ std::string params () { return params_; }
211
232
212
233
void reset () {
213
234
scheme_.clear ();
@@ -216,7 +237,8 @@ class url {
216
237
host_.clear ();
217
238
port_ = 0 ;
218
239
abs_path_.clear ();
219
-
240
+ query_.clear ();
241
+ params_.clear ();
220
242
state_ = 0 ;
221
243
}
222
244
};
@@ -350,11 +372,41 @@ inline int url::parse(char ch) {
350
372
break ;
351
373
352
374
case url_abs_path:
375
+ if (ch == ' ?' ) {
376
+ state_ = url_query;
377
+ break ;
378
+ }
379
+
380
+ if (ch == ' #' ) {
381
+ state_ = url_params;
382
+ break ;
383
+ }
384
+
353
385
if (!allow_in_path (ch)) {
354
386
return Invalid;
355
387
}
356
388
abs_path_.push_back (ch);
357
389
break ;
390
+
391
+ case url_query:
392
+ if (ch == ' #' ) {
393
+ state_ = url_params;
394
+ break ;
395
+ }
396
+
397
+ if (!allow_in_path (ch)) {
398
+ return Invalid;
399
+ }
400
+
401
+ query_.push_back (ch);
402
+ break ;
403
+
404
+ case url_params:
405
+ if (!allow_in_path (ch)) {
406
+ return Invalid;
407
+ }
408
+ params_.push_back (ch);
409
+ break ;
358
410
}
359
411
360
412
return Ok;
0 commit comments