acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
url.h
1// From url_department.h by camilo on 2022-11-19 04:24 <3ThomasBorregaardSorensen!!
2#pragma once
3
4
5//#include "acme/platform/department.h"
6//#include "acme/prototype/collection/string_array.h"
7#include "acme/prototype/string/scoped_string_base.h"
8
9//template < prototype_character CHARACTER >
10//const CHARACTER * const_string_range_begin(const ::range < const CHARACTER* >& range)
11//{
12//
13// return range.begin();
14//
15//}
16//
17//template < prototype_character CHARACTER >
18//const CHARACTER* const_string_range_begin(const CHARACTER* p)
19//{
20//
21// return p;
22//
23//}
24//
25//template < prototype_character CHARACTER >
26//character_count const_string_range_size(const ::range < const CHARACTER* >& range)
27//{
28//
29// return range.size();
30//
31//}
32//
33//template < prototype_character CHARACTER >
34//character_count const_string_range_size(const CHARACTER* p)
35//{
36//
37// return string_safe_length(p);
38//
39//}
40
41
42namespace url
43{
44
45
46 CLASS_DECL_ACME ::string connect_string(const ::scoped_string& scopedstrProtocol, const ::scoped_string& scopedstrHost, ::i32 iPort);
47 CLASS_DECL_ACME::string request_string(const ::scoped_string& scopedstrPath, const ::scoped_string& scopedstrQuery = {}, const ::scoped_string& scopedstrFragment = {});
48 CLASS_DECL_ACME::string request_string(const ::scoped_string& scopedstrPath, const ::property_set& setArguments, const ::scoped_string& scopedstrFragment = {});
49
50
51 class parts;
52
53
54 //CLASS_DECL_ACME::string decode_block(const ::block& block);
55 //CLASS_DECL_ACME::string encode_block(const ::block& block);
56 //CLASS_DECL_ACME::string encode_path_block(const ::block& block);
57
58 CLASS_DECL_ACME::string decode(const ::scoped_string & scopedstr);
59 CLASS_DECL_ACME::string encode(const ::scoped_string & scopedstr);
60 CLASS_DECL_ACME::string encode_path(const ::scoped_string & scopedstr);
61
62
63 class CLASS_DECL_ACME connect_range
64 {
65 protected:
66
67
68 friend class url;
69 friend class connect;
70 friend class request_range;
71
72
73 //::url::url* m_purl;
74 bool m_bIsUrl;
75 ::ansi_range m_range{ nullptr };
76 //::string m_str;
77 ::logic::boolean m_bSecure;
78 //bool m_bScoped = false;
79 ::ansi_range m_rangeProtocol{ nullptr };
80 ::ansi_range m_rangeHost{ nullptr };
81 ::ansi_range m_rangePort{ nullptr };
82 ::ansi_range m_rangeRequest{ nullptr };
83 ::i32 m_iPort = -1;
84
85
86 connect_range();
87 connect_range(const connect_range& connectrange);
88 ~connect_range();
89
90
91 connect_range& operator = (const connect_range& connectrange);
92
93 void parse(const ::const_ansi_range& ansirange);
94
95 ::const_ansi_range request_range() const { return m_rangeRequest; }
96
97
98 public:
99
100
101
103
104
105
106
107 ::string as_string() const;
108 auto protocol() const { return m_rangeProtocol; }
109 auto host() const { return m_rangeHost; }
110 auto port_range() const { return m_rangePort; }
111 ::i32 port() const;
112 ::string port_part() const;
113 bool is_url() const { return m_bIsUrl; }
114 bool is_secure() const;
115 //bool is_scoped() const { return m_bScoped; }
116
117
118 };
119
120
121 class CLASS_DECL_ACME request_range
122 {
123 protected:
124
125
126 friend class url;
127 friend class request;
128
129
130 ::ansi_range m_range{ nullptr };
131 //::string m_str;
132 //bool m_bScoped = false;
133 ::ansi_range m_rangePath{ nullptr };
134 ::ansi_range m_rangeName{ nullptr };
135 ::ansi_range m_rangeQuery{ nullptr };
136 ::ansi_range m_rangeFragment{ nullptr };
137 ::pointer < ::property_set > m_psetArguments;
138
139 request_range();
140 request_range(const request_range& requestrange);
141 ~request_range();
142
143
144 request_range& operator = (const request_range& request);
145
146
147 void parse(const ::const_ansi_range& ansirange);
148
149
150 public:
151
152
153
154 // // Example: /script%20folder/strict%20object?param1=1&param2=2
155 auto as_string() const { return m_range; } // /script%20folder/strict%20object?param1=1&param2=2
156 auto raw_path() const { return m_rangePath; } // /script%20folder/strict%20object
157 auto path() const { return decode(this->raw_path()); } // /script folder/strict object
158 auto raw_name() const { return m_rangeName; } // strict%20object
159 auto name() const { return decode(this->raw_name()); } // strict object
160 auto query() const { return m_rangeQuery; }// param1=1&param2=2
161 auto raw_fragment() const { return m_rangeFragment; }// param1=1&param2=2
162 auto fragment() const { return decode(m_rangeFragment); }// param1=1&param2=2
163 //bool is_scoped() const { return m_bScoped; }
164
165 const ::property_set& arguments() const;
166 ::property_set& arguments();
167
168 ::payload get(const ::atom& atom) const;
169
170 };
171
172
173
174 //class connect;
175 //class request;
176
177 //struct CLASS_DECL_ACME part
178 //{
179
180 // enum enum_type
181 // {
182 //
183 // e_type_mixed,
184 // e_type_strict_object_with_query,
185 // e_type_strict_object_no_query,
186 // e_type_query,
187
188 // };
189
190 // enum_type m_type;
191 // const_char_pointer m_pszLastQuestionMarkAfterLastSlash;
192 // const_char_pointer m_pszLastSlash;
193
194 // part(const_char_pointer psz);
195
196 //};
197
198
199
200 class CLASS_DECL_ACME connect :
201 public connect_range
202 {
203 protected:
204
205
206 ::string m_str;
207
208
209 public:
210
211
212 //::string m_strProtocol;
213 //::string m_strHost;
214 //::i32 m_iPort;
215 //::logic::boolean m_bSecure;
216
217
218 connect();
219 connect(const ::scoped_string& scopedstr);
220 //connect(const ::url::url & url);
221
222
223 void parse(const ::scoped_string& scopedstr);
224
225
226 //connect& operator = (const ::url::url & url);
227
228
229 void set(const ::scoped_string& scopedstrProtocol, const ::scoped_string& scopedstrHost, ::i32 iPort = -1, ::logic::boolean booleanSecure = {});
230
231
232 //::string as_string() const;
233
234
235 };
236
237
238 class CLASS_DECL_ACME request :
239 public request_range
240 {
241 protected:
242
243 ::string m_str;
244
245 void __set_href(const ::scoped_string& scopedstrHref);
246
247 friend class ::url::parts;
248
249 public:
250
251
252 //::string m_strPath;
253 //::pointer < ::property_set > m_psetArguments;
254 //::string m_strFragment;
255
256 request();
257 request(const ::scoped_string& scopedstr);
258 //request(const::url::url& url);
259
260
261 void parse(const ::scoped_string& scopedstr);
262
263 //request& operator = (const::url::url& url);
264
265
266 void set(const ::scoped_string& scopedstrPath);
267 void set(const ::scoped_string& scopedstrPath, const ::scoped_string & scopedstrQuery);
268 void set(const ::scoped_string& scopedstrPath, const ::scoped_string & scopedstrQuery, const ::scoped_string & scopedstrFragment);
269
270 void set_query(const ::scoped_string& scopedstrKey);
271 void set_query(const ::property_set & set);
272
273
274
275
276 ::string calculate_string() const;
277
278
279 };
280
281
282 class CLASS_DECL_ACME parts
283 {
284 public:
285
286
287 ::url::connect m_connect;
288 ::url::request m_request;
289
290
291 parts();
292 parts(const ::url::url& url);
293 //parts(const ::scoped_string & scopedstrConnect);
294 //parts(const ::scoped_string & scopedstrConnect, const ::scoped_string& scopedstrRequest);
295 ~parts();
296
297
298 void from(const ::url::url& url);
299 void set(const ::url::connect_range & connectrange);
300 void set(const ::url::request_range & requestrange);
301
302 void set_href(const ::scoped_string& scopedstrHref);
303
304
305 auto& connect() { return m_connect; }
306 auto& request() { return m_request; }
307 auto& connect() const { return m_connect; }
308 auto& request() const { return m_request; }
309 auto& arguments() { return request().arguments(); }
310
311 ::url::url as_url() const;
312 ::string as_string() const;
313
314 };
315
316
317 //class CLASS_DECL_ACME connect
318 //{
319 //protected:
320
321
322 // bool m_bIsUrl;
323 // ::string m_str;
324 // ::logic::boolean m_bSecure;
325 // //bool m_bScoped = false;
326 // ::const_ansi_range m_rangeProtocol{ nullptr };
327 // ::const_ansi_range m_rangeHost{ nullptr };
328 // ::const_ansi_range m_rangePort{ nullptr };
329 // ::i32 m_iPort = -1;
330 //
331
332 // friend ::url::url;
333 // friend ::url::request;
334
335 // // returns range of the request
336
337 // const_ansi_range __from(const ::scoped_string & scopedstr);
338 // void __from(const ::url::connect_part& connect);
339
340 //public:
341
342
343
344 // connect();
345 // template < const_string_castable STRING >
346 // connect(const STRING& string)
347 // {
348
349 // __from(string);
350
351 // }
352 // connect(const ::url::connect& connect);
353 // ~connect();
354
355
356 // connect& operator = (const ::url::connect& connect);
357
358 // ::string as_string() const;
359 // auto protocol() const { return m_rangeProtocol; }
360 // auto host() const { return m_rangeHost; }
361 // auto port() const { return m_rangePort; }
362 // ::string port_part() const;
363 // bool is_url() const { return m_bIsUrl; }
364 // bool is_secure() const { return m_bSecure; }
365 // //bool is_scoped() const { return m_bScoped; }
366
367
368 //};
369
370
371 //class CLASS_DECL_ACME request
372 //{
373 //protected:
374
375
376 // ::string m_str;
377 // //bool m_bScoped = false;
378 // ::const_ansi_range m_rangePath{ nullptr };
379 // ::const_ansi_range m_rangeName{ nullptr };
380 // ::const_ansi_range m_rangeQuery{ nullptr };
381 // ::pointer < ::property_set > m_psetArguments;
382 // ::const_ansi_range m_rangeFragment{ nullptr };
383
384 // // returns the request
385 // void __from(const ::scoped_string & scopedstr);
386 // void __from(const ::url::request_part& request);
387
388
389 // friend ::url::url;
390
391
392 //public:
393
394
395 // request();
396 // template < const_string_castable STRING >
397 // request(const STRING& string) requires
398 // !::std::is_same_v < STRING, ::url::connect >
399 // {
400 //
401 // __from(string);
402
403 // }
404 // request(const ::url::request& request);
405 // ~request();
406 //
407
408 // request& operator = (const ::url::request& request);
409
410
411 // // Example: /script%20folder/strict%20object?param1=1&param2=2
412 // auto as_string() const { return m_str; } // /script%20folder/strict%20object?param1=1&param2=2
413 // auto raw_path() const { return m_rangePath; } // /script%20folder/strict%20object
414 // auto path() const { return decode(this->raw_path()); } // /script folder/strict object
415 // auto raw_name() const { return m_rangeName; } // strict%20object
416 // auto name() const { return decode(this->raw_name()); } // strict object
417 // auto query() const { return m_rangeQuery; }// param1=1&param2=2
418 // auto raw_fragment() const { return m_rangeFragment; }// param1=1&param2=2
419 // auto fragment() const { return decode(m_rangeFragment); }// param1=1&param2=2
420 // //bool is_scoped() const { return m_bScoped; }
421
422 // auto& arguments() { return *m_psetArguments; }
423
424
425 // ::string query(const ::scoped_string& scopedstrKey) const;
426
427
428 //
429 //};
430
431
432
433
434 class CLASS_DECL_ACME url
435 {
436 public:
437
438 ::string m_str;
439
440
441 //const_char_pointer m_pszRequest;
442
443
444 //bool m_bScoped = false;
445 ::url::connect_range m_connectrange;
446 ::url::request_range m_requestrange;
447
448
449
450 //public:
451
452
453 url();
454
455
456 template < const_string_castable STRING >
457 url(const STRING & str)
458 {
459
460 ::string strSink(str);
461
462 parse(strSink);
463
464 }
465
466
467 url(const ::url::connect_range & connectrange);
468 url(const ::url::connect_range & connectrange, const ::url::request_range & requestrange);
469 url(const ::url::url& url);
470 ~url();
471
472
473 //void __from(const ::scoped_string& scopedstr);
474 //void __from(const ::url::parts& parts);
475
476
477 void parse(const ::scoped_string & scopedstr);
478
479
480 //void parse(const ::url::parts & parts);
481
482
483 //void construct_connect();
484 //void construct_request();
485
486
487 url& operator = (const ::url::url& url);
488
489
490 // Example: http://website.com:80/script%20folder/strict%20object?param1=1&param2=2
491 ::string as_string() const;
492 const auto & connect() const { return m_connectrange; }
493 const auto & request() const { return m_requestrange; }
494 auto& connect() { return m_connectrange; }
495 auto& request() { return m_requestrange; }
496 //auto request_uri() const { return m_rangeRequestUri; } // /script%20folder/strict%20object?param1=1&param2=2
497 //auto raw_script() const { return m_rangeScript; } // /script%20folder/strict%20object
498 //auto script() const { return decode(this->raw_script()); } // /script folder/strict object
499 //auto raw_name() const { return m_rangeName; } // strict%20object
500 //auto name() const { return decode(this->raw_name()); } // strict object
501 //auto query() const { return m_rangeQuery; }// param1=1&param2=2
502 void set_request_arguments(const ::property_set & set)
503 {
504
505 m_requestrange.arguments() = set;
506
507 }
508
509 bool is() const { return m_connectrange.is_url(); }
510
511
512
513
514
515 //string set_parameter(const ::scoped_string & scopedstrKey, const scoped_string & scopedstr);
516 //string erase_parameter(const ::scoped_string & scopedstrKey);
517
518 //void set_parameter(string & strUrl, const ::scoped_string & scopedstrKey, const ::scoped_string & scopedstr);
519 //void set_param(string & strUrl, const ::scoped_string & scopedstr, const ::scoped_string & scopedstrKey, const ::scoped_string & scopedstrParam);
520 //void set_param(string & strUrl, const ::scoped_string & scopedstrKey, const ::scoped_string & scopedstrParam);
521 //string string_set(string & strUrl, const ::scoped_string & scopedstrKey, ::payload payload);
522 //string string_set_if_not_empty(string& strUrl, const ::scoped_string & scopedstrKey, ::payload payload);
523 //::payload & var_set(::payload & varUrl, const ::scoped_string & scopedstrKey, ::payload payload);
524 //property & ::property_set(property & propUrl, const ::scoped_string & scopedstrKey, ::payload payload);
525
526 //string set_script(const ::scoped_string & scopedstrUrl, const ::scoped_string & scopedstrScript);
527
528 //string parameters_set_if_empty_at_target(const ::scoped_string & scopedstrDest, const ::scoped_string & scopedstrSrc, bool bOverrideQuery = false);
529 //string replaced_parameters_if_set_at_source(const ::scoped_string & scopedstrDest, const ::scoped_string & scopedstrSrc);
530
531 //string & erase_key(string & strUrl, const ::scoped_string & scopedstrKey);
532 //::payload & erase_key(::payload & varUrl, const ::scoped_string & scopedstrKey);
533 //property & erase_key(property & propUrl, const ::scoped_string & scopedstrKey);
534
535 //string object(const ::scoped_string & scopedstrScript, const ::scoped_string & scopedstrQuery);
536 //string object_set(const ::scoped_string & scopedstrObject, const ::scoped_string & scopedstrKey, ::payload payload);
537
538 //string path(const ::scoped_string & scopedstr1, const ::scoped_string & scopedstr2);
539 //string path(const ::scoped_string & scopedstr1, const ::scoped_string & scopedstr2, const ::scoped_string & scopedstr3);
540 //string name(const ::scoped_string & scopedstr);
541 //string ::url::encode(const ::scoped_string & scopedstr);
542 //string ::url::decode(const ::scoped_string & scopedstr);
543 //string ::url::decode(const ::scoped_string & scopedstr, character_count iLen);
544
545 //string query_append(const ::scoped_string & scopedstrUrl, const ::scoped_string & scopedstrQuery);
546 //string query_erase(const ::scoped_string & scopedstrQuery, string_array_base & straKey);
547 //string query_erase(const ::scoped_string & scopedstrQuery, const ::scoped_string & scopedstrKey);
549 //bool query_get_param(string & strValue, const ::scoped_string & scopedstrUrl, const ::scoped_string & scopedstrKey);
550 //bool query_has_param(const ::scoped_string & scopedstrUrl, const ::scoped_string & scopedstrKey);
551 //bool query_param_has_char(const ::scoped_string & scopedstrUrl, const ::scoped_string & scopedstrKey);
552
553 // can return false (not_found) or string
554 //::payload get_parameter(const ::scoped_string & scopedstrQuery, const ::scoped_string & scopedstrKey);
555 // can return false (not_found) or string
556 //::payload query_get_parameter(const ::scoped_string & scopedstrQuery, const ::scoped_string & scopedstrKey);
557 //string get_param(const ::scoped_string & scopedstrQuery, const ::scoped_string & scopedstrKey);
558 //string query_get_param(const ::scoped_string & scopedstrQuery, const ::scoped_string & scopedstrKey);
559 //bool query_has_parameter_replace(string & strQuery, const ::scoped_string & scopedstrKey, const ::scoped_string & scopedstrValue);
560 //string __query_erase(const ::scoped_string & scopedstrQuery, const ::scoped_string & scopedstrAndKeyEqual);
561 //bool get_parameter(string & strValue, const ::scoped_string & scopedstrUrl, const ::scoped_string & scopedstrKey);
562 //bool has_parameter(const ::scoped_string & scopedstrUrl, const ::scoped_string & scopedstrKey);
563 //bool parameter_has_char(const ::scoped_string & scopedstrUrl, const ::scoped_string & scopedstrKey);
564 //bool has_parameter_replace(string & strUrl, const ::scoped_string & scopedstrKey, const ::scoped_string & scopedstrValue);
565
566
567
568 //virtual bool server_ends(const ::scoped_string & scopedstrUrl, const ::scoped_string & scopedstrRoot);
569
570
571 //virtual string to_punycode(const ::scoped_string & scopedstr);
572 //virtual string from_punycode(const ::scoped_string & scopedstr);
573
574 //string os_fspath(const ::scoped_string & scopedstrUrl);
575
576 //string os_fsname(const ::scoped_string & scopedstrUrl);
577
578 //string os_fs(const ::scoped_string & scopedstrUrl, bool bPath);
579
580
581
582 //virtual void defer_raw_http(::property_set & set, const ::payload & payloadUrl);
583 //virtual void defer_raw_http(::property_set & set);
584
585
586 //bool case_insensitive_is_protocol(const ::scoped_string & scopedstrProtocol) const;
587 //bool is_http() const;
588 //bool is_https(const ::scoped_string & scopedstrUrl) const;
589 //bool is_http_or_https() const;
590 //bool is_ftp(const ::scoped_string & scopedstrUrl) const;
591 //bool is_ftps(const ::scoped_string & scopedstrUrl) const;
592 //bool is_ftp_or_ftps(const ::scoped_string & scopedstrUrl) const;
593
594 //string __query_set(const ::scoped_string& scopedstrQuery, const ::scoped_string& scopedstrKey, const ::scoped_string& scopedstr);
595
596 //string __object_set(const ::scoped_string& scopedstrObject, const ::scoped_string& scopedstrKey, const ::scoped_string& scopedstr);
597
598
599 };
600
601
602} // namespace url
603
604
Definition atom.h:237
Definition boolean.h:55
Definition payload.h:54
Definition property_set.h:512
Definition url.h:64
::string as_string() const
parse connect range and returns range for the request
Definition url.cpp:729
Definition url.h:283
Definition url.h:122
Definition url.h:435
void parse(const ::scoped_string &scopedstr)
Definition url.cpp:1025