@@ -29,6 +29,7 @@ extern "C" {
29
29
#include " Zend/zend_enum.h"
30
30
#include " Zend/zend_interfaces.h"
31
31
#include " url_arginfo.h"
32
+ #include " ext/standard/url.h"
32
33
}
33
34
34
35
#include < ada/ada.h>
@@ -37,94 +38,175 @@ static zend_class_entry *url_ce;
37
38
static zend_class_entry *url_component_ce;
38
39
static zend_class_entry *url_parser_ce;
39
40
41
+ static php_url *parseUrlComponents (zend_string *url) {
42
+ ada::result<ada::url> ada_url = ada::parse<ada::url>(ZSTR_VAL (url));
43
+ if (!ada_url) {
44
+ return NULL ;
45
+ }
46
+
47
+ ada::url_components components = ada_url->get_components ();
48
+
49
+ php_url *result = (php_url*) ecalloc (1 , sizeof (php_url));
50
+
51
+ result->scheme = zend_string_init (ZSTR_VAL (url), components.protocol_end - 1 , false );
52
+
53
+ if (components.host_start < components.host_end ) {
54
+ result->host = zend_string_init (ZSTR_VAL (url) + components.host_start , components.host_end - components.host_start , false );
55
+ } else {
56
+ result->host = ZSTR_EMPTY_ALLOC ();
57
+ }
58
+
59
+ result->port = components.port ;
60
+
61
+ if (components.protocol_end + 2 < components.username_end ) {
62
+ result->user = zend_string_init (ZSTR_VAL (url) + components.protocol_end + 2 , components.username_end - components.protocol_end - 2 , false );
63
+ } else {
64
+ result->user = ZSTR_EMPTY_ALLOC ();
65
+ }
66
+
67
+ if (components.host_start - components.username_end > 0 ) {
68
+ result->pass = zend_string_init (ZSTR_VAL (url) + components.username_end + 1 , components.host_start - components.username_end - 1 , false );
69
+ } else {
70
+ result->pass = ZSTR_EMPTY_ALLOC ();
71
+ }
72
+
73
+ size_t ends_at;
74
+ if (ada_url->has_search ()) {
75
+ ends_at = components.search_start ;
76
+ } else if (ada_url->has_hash ()) {
77
+ ends_at = components.hash_start ;
78
+ } else {
79
+ ends_at = components.pathname_start ;
80
+ }
81
+ result->path = zend_string_init (ZSTR_VAL (url) + components.pathname_start , ends_at - components.pathname_start , false );
82
+
83
+ if (!ada_url->has_search ()) {
84
+ result->query = ZSTR_EMPTY_ALLOC ();
85
+ } else {
86
+ ends_at = ada_url->has_hash () ? components.hash_start : ZSTR_LEN (url);
87
+ if (ends_at - components.search_start <= 1 ) {
88
+ result->query = ZSTR_EMPTY_ALLOC ();
89
+ } else {
90
+ result->query = zend_string_init (ZSTR_VAL (url) + components.search_start , ends_at - components.search_start , false );
91
+ }
92
+ }
93
+
94
+ if (ada_url->has_hash () && (ZSTR_LEN (url) - components.hash_start > 1 )) {
95
+ result->fragment = zend_string_init (ZSTR_VAL (url) + components.hash_start + 1 , ZSTR_LEN (url) - components.hash_start - 1 , false );
96
+ } else {
97
+ result->fragment = ZSTR_EMPTY_ALLOC ();
98
+ }
99
+
100
+ return result;
101
+ }
102
+
40
103
void parseUrlComponentsArray (zend_string *url, zval *return_value)
41
104
{
42
- std::string_view protocol, hostname, username, password, port, path, query, fragment;
105
+ php_url *components;
106
+ zval tmp;
43
107
44
- ada::result<ada::url_aggregator> ada_url = ada::parse<ada::url_aggregator>( ZSTR_VAL ( url) );
45
- if (!ada_url ) {
108
+ components = parseUrlComponents ( url);
109
+ if (!components ) {
46
110
RETURN_NULL ();
47
111
}
48
112
49
- protocol = ada_url->get_protocol ();
50
- hostname = ada_url->get_hostname ();
51
- port = ada_url->get_port ();
52
- username = ada_url->get_username ();
53
- password = ada_url->get_password ();
54
- path = ada_url->get_protocol ();
55
- query = ada_url->get_search ();
56
- fragment = ada_url->get_hash ();
57
-
58
113
array_init (return_value);
59
- add_assoc_stringl (return_value," scheme" ,protocol.data (), protocol.length ()-1 );
60
- add_assoc_stringl (return_value," host" , hostname.data (), hostname.length ());
61
- add_assoc_stringl (return_value, " port" , port.data (), port.length ());
62
- add_assoc_stringl (return_value, " user" , username.data (), username.length ());
63
- add_assoc_stringl (return_value, " password" , password.data (), password.length ());
64
- add_assoc_stringl (return_value, " path" , path.data (), path.length ());
65
- add_assoc_stringl (return_value, " query" , query.data (), query.length ());
66
- add_assoc_stringl (return_value, " fragment" , fragment.data (), fragment.length ());
114
+
115
+ ZVAL_STR_COPY (&tmp, components->scheme );
116
+ zend_hash_add_new (Z_ARRVAL_P (return_value), ZSTR_KNOWN (ZEND_STR_SCHEME), &tmp);
117
+
118
+ ZVAL_STR_COPY (&tmp, components->host );
119
+ zend_hash_add_new (Z_ARRVAL_P (return_value), ZSTR_KNOWN (ZEND_STR_HOST), &tmp);
120
+
121
+ if (components->port ) {
122
+ ZVAL_LONG (&tmp, components->port );
123
+ } else {
124
+ ZVAL_NULL (&tmp);
125
+ }
126
+ zend_hash_add_new (Z_ARRVAL_P (return_value), ZSTR_KNOWN (ZEND_STR_HOST), &tmp);
127
+
128
+ ZVAL_STR_COPY (&tmp, components->user );
129
+ zend_hash_add_new (Z_ARRVAL_P (return_value), ZSTR_KNOWN (ZEND_STR_USER), &tmp);
130
+
131
+ ZVAL_STR_COPY (&tmp, components->pass );
132
+ zend_hash_add_new (Z_ARRVAL_P (return_value), ZSTR_KNOWN (ZEND_STR_PASS), &tmp);
133
+
134
+ ZVAL_STR_COPY (&tmp, components->path );
135
+ zend_hash_add_new (Z_ARRVAL_P (return_value), ZSTR_KNOWN (ZEND_STR_PATH), &tmp);
136
+
137
+ ZVAL_STR_COPY (&tmp, components->query );
138
+ zend_hash_add_new (Z_ARRVAL_P (return_value), ZSTR_KNOWN (ZEND_STR_QUERY), &tmp);
139
+
140
+ ZVAL_STR_COPY (&tmp, components->fragment );
141
+ zend_hash_add_new (Z_ARRVAL_P (return_value), ZSTR_KNOWN (ZEND_STR_FRAGMENT), &tmp);
142
+
143
+ php_url_free (components);
67
144
}
68
145
69
146
void parseUrlComponentsObject (zend_string *url, zval *return_value)
70
147
{
71
- std::string_view protocol, hostname, username, password, port, path, query, fragment ;
148
+ php_url *components ;
72
149
73
- ada::result<ada::url_aggregator> ada_url = ada::parse<ada::url_aggregator>( ZSTR_VAL ( url) );
74
- if (!ada_url ) {
150
+ components = parseUrlComponents ( url);
151
+ if (!components ) {
75
152
RETURN_NULL ();
76
153
}
77
154
78
- protocol = ada_url->get_protocol ();
79
- hostname = ada_url->get_hostname ();
80
- port = ada_url->get_port ();
81
- username = ada_url->get_username ();
82
- password = ada_url->get_password ();
83
- path = ada_url->get_protocol ();
84
- query = ada_url->get_search ();
85
- fragment = ada_url->get_hash ();
86
-
87
155
object_init_ex (return_value, url_ce);
88
- zend_update_property_stringl (
89
- url_ce, Z_OBJ_P (return_value),
90
- " scheme" , sizeof (" scheme" )-1 ,
91
- protocol.data (), protocol.length ()-1
92
- );
93
- zend_update_property_stringl (
156
+ zend_update_property_str (
94
157
url_ce, Z_OBJ_P (return_value),
95
- " host " , sizeof ( " host " )- 1 ,
96
- hostname. data (), hostname. length ()
158
+ ZSTR_VAL ( ZSTR_KNOWN (ZEND_STR_SCHEME)), ZSTR_LEN ( ZSTR_KNOWN (ZEND_STR_SCHEME)) ,
159
+ components-> scheme
97
160
);
98
- zend_update_property_stringl (
161
+ zend_update_property_str (
99
162
url_ce, Z_OBJ_P (return_value),
100
- " port " , sizeof ( " port " )- 1 ,
101
- port. data (), port. length ()
163
+ ZSTR_VAL ( ZSTR_KNOWN (ZEND_STR_HOST)), ZSTR_LEN ( ZSTR_KNOWN (ZEND_STR_HOST)) ,
164
+ components-> host
102
165
);
103
- zend_update_property_stringl (
166
+ if (components->port ) {
167
+ zend_update_property_long (
168
+ url_ce, Z_OBJ_P (return_value),
169
+ ZSTR_VAL (ZSTR_KNOWN (ZEND_STR_PORT)), ZSTR_LEN (ZSTR_KNOWN (ZEND_STR_PORT)),
170
+ components->port
171
+ );
172
+ } else {
173
+ zend_update_property_null (
174
+ url_ce, Z_OBJ_P (return_value),
175
+ ZSTR_VAL (ZSTR_KNOWN (ZEND_STR_PORT)), ZSTR_LEN (ZSTR_KNOWN (ZEND_STR_PORT))
176
+ );
177
+ }
178
+
179
+ zend_update_property_str (
104
180
url_ce, Z_OBJ_P (return_value),
105
- " user " , sizeof ( " user " )- 1 ,
106
- username. data (), username. length ()
181
+ ZSTR_VAL ( ZSTR_KNOWN (ZEND_STR_USER)), ZSTR_LEN ( ZSTR_KNOWN (ZEND_STR_USER)) ,
182
+ components-> user
107
183
);
108
- zend_update_property_stringl (
184
+
185
+ zend_update_property_str (
109
186
url_ce, Z_OBJ_P (return_value),
110
- " password " , sizeof ( " password " )- 1 ,
111
- password. data (), password. length ()
187
+ ZSTR_VAL ( ZSTR_KNOWN (ZEND_STR_PASSWORD)), ZSTR_LEN ( ZSTR_KNOWN (ZEND_STR_PASSWORD)) ,
188
+ components-> pass
112
189
);
113
- zend_update_property_stringl (
190
+
191
+ zend_update_property_str (
114
192
url_ce, Z_OBJ_P (return_value),
115
- " path " , sizeof ( " path " )- 1 ,
116
- path. data (), path. length ()
193
+ ZSTR_VAL ( ZSTR_KNOWN (ZEND_STR_PATH)), ZSTR_LEN ( ZSTR_KNOWN (ZEND_STR_PATH)) ,
194
+ components-> path
117
195
);
118
- zend_update_property_stringl (
196
+
197
+ zend_update_property_str (
119
198
url_ce, Z_OBJ_P (return_value),
120
- " query " , sizeof ( " query " )- 1 ,
121
- query. data (), query. length ()
199
+ ZSTR_VAL ( ZSTR_KNOWN (ZEND_STR_QUERY)), ZSTR_LEN ( ZSTR_KNOWN (ZEND_STR_QUERY)) ,
200
+ components-> query
122
201
);
123
- zend_update_property_stringl (
202
+
203
+ zend_update_property_str (
124
204
url_ce, Z_OBJ_P (return_value),
125
- " fragment " , sizeof ( " fragment " )- 1 ,
126
- fragment. data (), fragment. length ()
205
+ ZSTR_VAL ( ZSTR_KNOWN (ZEND_STR_FRAGMENT)), ZSTR_LEN ( ZSTR_KNOWN (ZEND_STR_FRAGMENT)) ,
206
+ components-> fragment
127
207
);
208
+
209
+ php_url_free (components);
128
210
}
129
211
130
212
PHP_METHOD (Url_Url, __construct)
0 commit comments