acme
Foundational cross-platform layer of the ca2 framework
Toggle main menu visibility
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
42
namespace
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¶m2=2
155
auto
as_string()
const
{
return
m_range; }
// /script%20folder/strict%20object?param1=1¶m2=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¶m2=2
161
auto
raw_fragment()
const
{
return
m_rangeFragment; }
// param1=1¶m2=2
162
auto
fragment()
const
{
return
decode(m_rangeFragment); }
// param1=1¶m2=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¶m2=2
412
// auto as_string() const { return m_str; } // /script%20folder/strict%20object?param1=1¶m2=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¶m2=2
418
// auto raw_fragment() const { return m_rangeFragment; }// param1=1¶m2=2
419
// auto fragment() const { return decode(m_rangeFragment); }// param1=1¶m2=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¶m2=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¶m2=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¶m2=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
atom
Definition
atom.h:237
logic::boolean
Definition
boolean.h:55
payload
Definition
payload.h:54
property_set
Definition
property_set.h:512
url::connect_range
Definition
url.h:64
url::connect_range::as_string
::string as_string() const
parse connect range and returns range for the request
Definition
url.cpp:729
url::parts
Definition
url.h:283
url::request_range
Definition
url.h:122
url::url
Definition
url.h:435
url::url::parse
void parse(const ::scoped_string &scopedstr)
Definition
url.cpp:1025
prototype
prototype
url.h
Generated by
1.17.0