@@ -44,12 +44,14 @@ static lxb_url_parser_t *init_parser(void)
44
44
lexbor_mraw_t * mraw = lexbor_mraw_create ();
45
45
lxb_status_t status = lexbor_mraw_init (mraw , 4096 * 2 );
46
46
if (status != LXB_STATUS_OK ) {
47
+ lexbor_mraw_destroy (mraw , true);
47
48
return NULL ;
48
49
}
49
50
50
51
lxb_url_parser_t * parser = lxb_url_parser_create ();
51
52
status = lxb_url_parser_init (parser , mraw );
52
53
if (status != LXB_STATUS_OK ) {
54
+ lxb_url_parser_destroy (parser , true);
53
55
return NULL ;
54
56
}
55
57
@@ -64,8 +66,7 @@ static void destroy_parser(lxb_url_parser_t *parser)
64
66
65
67
#define PARSE_URL (url ) \
66
68
do { \
67
- lxb_url = lxb_url_parse(URL_G(parser), NULL, (unsigned char *) ZSTR_VAL(url), ZSTR_LEN(url)); \
68
- if (lxb_url == NULL) { \
69
+ if (ZSTR_LEN(url) == 0 || (lxb_url = lxb_url_parse(URL_G(parser), NULL, (unsigned char *) ZSTR_VAL(url), ZSTR_LEN(url))) == NULL) { \
69
70
zend_argument_value_error(1, "is not a valid URL"); \
70
71
RETURN_THROWS(); \
71
72
} \
@@ -158,19 +159,19 @@ static void cleanup_parser(void)
158
159
void parse_url_to_array (zend_string * url , zval * return_value )
159
160
{
160
161
zval tmp ;
161
- lxb_url_t * lxb_url ;
162
+ lxb_url_t * lxb_url = NULL ;
162
163
163
164
PARSE_URL (url );
164
165
165
166
array_init (return_value );
166
167
167
168
url_scheme_to_zval (lxb_url , & tmp );
168
- if (Z_STRLEN (tmp ) > 0 ) {
169
+ if (Z_TYPE ( tmp ) == IS_STRING && Z_STRLEN (tmp ) > 0 ) {
169
170
zend_hash_add_new (Z_ARRVAL_P (return_value ), ZSTR_KNOWN (ZEND_STR_SCHEME ), & tmp );
170
171
}
171
172
172
173
url_host_to_zval (lxb_url , & tmp );
173
- if (Z_STRLEN (tmp ) > 0 ) {
174
+ if (Z_TYPE ( tmp ) == IS_STRING && Z_STRLEN (tmp ) > 0 ) {
174
175
zend_hash_add_new (Z_ARRVAL_P (return_value ), ZSTR_KNOWN (ZEND_STR_HOST ), & tmp );
175
176
}
176
177
@@ -210,71 +211,89 @@ void parse_url_to_array(zend_string *url, zval *return_value)
210
211
void parse_url_to_object (zend_string * url , zval * return_value )
211
212
{
212
213
zval tmp ;
213
- lxb_url_t * lxb_url ;
214
+ lxb_url_t * lxb_url = NULL ;
214
215
215
216
PARSE_URL (url );
216
217
217
218
object_init_ex (return_value , url_ce );
218
219
219
220
url_scheme_to_zval (lxb_url , & tmp );
220
- zend_update_property (
221
- url_ce , Z_OBJ_P (return_value ),
222
- ZSTR_VAL (ZSTR_KNOWN (ZEND_STR_SCHEME )), ZSTR_LEN (ZSTR_KNOWN (ZEND_STR_SCHEME )),
223
- & tmp
224
- );
221
+ zend_update_property_ex (url_ce , Z_OBJ_P (return_value ), ZSTR_KNOWN (ZEND_STR_SCHEME ), & tmp );
222
+ zval_ptr_dtor (& tmp );
225
223
226
224
url_host_to_zval (lxb_url , & tmp );
227
- zend_update_property (
228
- url_ce , Z_OBJ_P (return_value ),
229
- ZSTR_VAL (ZSTR_KNOWN (ZEND_STR_HOST )), ZSTR_LEN (ZSTR_KNOWN (ZEND_STR_HOST )),
230
- & tmp
231
- );
225
+ zend_update_property_ex (url_ce , Z_OBJ_P (return_value ), ZSTR_KNOWN (ZEND_STR_HOST ), & tmp );
226
+ zval_ptr_dtor (& tmp );
232
227
233
228
url_port_to_zval (lxb_url , & tmp );
234
- zend_update_property (
235
- url_ce , Z_OBJ_P (return_value ),
236
- ZSTR_VAL (ZSTR_KNOWN (ZEND_STR_PORT )), ZSTR_LEN (ZSTR_KNOWN (ZEND_STR_PORT )),
237
- & tmp
238
- );
229
+ zend_update_property_ex (url_ce , Z_OBJ_P (return_value ), ZSTR_KNOWN (ZEND_STR_PORT ), & tmp );
230
+ zval_ptr_dtor (& tmp );
239
231
240
232
url_user_to_zval (lxb_url , & tmp );
241
- zend_update_property (
242
- url_ce , Z_OBJ_P (return_value ),
243
- ZSTR_VAL (ZSTR_KNOWN (ZEND_STR_USER )), ZSTR_LEN (ZSTR_KNOWN (ZEND_STR_USER )),
244
- & tmp
245
- );
233
+ zend_update_property_ex (url_ce , Z_OBJ_P (return_value ), ZSTR_KNOWN (ZEND_STR_USER ), & tmp );
234
+ zval_ptr_dtor (& tmp );
246
235
247
236
url_password_to_zval (lxb_url , & tmp );
248
- zend_update_property (
249
- url_ce , Z_OBJ_P (return_value ),
250
- ZSTR_VAL (ZSTR_KNOWN (ZEND_STR_PASSWORD )), ZSTR_LEN (ZSTR_KNOWN (ZEND_STR_PASSWORD )),
251
- & tmp
252
- );
237
+ zend_update_property_ex (url_ce , Z_OBJ_P (return_value ), ZSTR_KNOWN (ZEND_STR_PASSWORD ), & tmp );
238
+ zval_ptr_dtor (& tmp );
253
239
254
240
url_path_to_zval (lxb_url , & tmp );
255
- zend_update_property (
256
- url_ce , Z_OBJ_P (return_value ),
257
- ZSTR_VAL (ZSTR_KNOWN (ZEND_STR_PATH )), ZSTR_LEN (ZSTR_KNOWN (ZEND_STR_PATH )),
258
- & tmp
259
- );
241
+ zend_update_property_ex (url_ce , Z_OBJ_P (return_value ), ZSTR_KNOWN (ZEND_STR_PATH ), & tmp );
242
+ zval_ptr_dtor (& tmp );
260
243
261
244
url_query_string_to_zval (lxb_url , & tmp );
262
- zend_update_property (
263
- url_ce , Z_OBJ_P (return_value ),
264
- ZSTR_VAL (ZSTR_KNOWN (ZEND_STR_QUERY )), ZSTR_LEN (ZSTR_KNOWN (ZEND_STR_QUERY )),
265
- & tmp
266
- );
245
+ zend_update_property_ex (url_ce , Z_OBJ_P (return_value ), ZSTR_KNOWN (ZEND_STR_QUERY ), & tmp );
246
+ zval_ptr_dtor (& tmp );
267
247
268
248
url_fragment_to_zval (lxb_url , & tmp );
269
- zend_update_property (
270
- url_ce , Z_OBJ_P (return_value ),
271
- ZSTR_VAL (ZSTR_KNOWN (ZEND_STR_FRAGMENT )), ZSTR_LEN (ZSTR_KNOWN (ZEND_STR_FRAGMENT )),
272
- & tmp
273
- );
249
+ zend_update_property_ex (url_ce , Z_OBJ_P (return_value ), ZSTR_KNOWN (ZEND_STR_FRAGMENT ), & tmp );
250
+ zval_ptr_dtor (& tmp );
274
251
275
252
cleanup_parser ();
276
253
}
277
254
255
+ void url_update_str_property (const zend_execute_data * execute_data , zend_string * name , zend_string * value )
256
+ {
257
+ zval zv ;
258
+
259
+ if (value ) {
260
+ ZVAL_STR (& zv , value );
261
+ } else {
262
+ ZVAL_NULL (& zv );
263
+ }
264
+
265
+ zend_update_property_ex (url_ce , Z_OBJ_P (getThis ()), name , & zv );
266
+ }
267
+
268
+ void url_update_long_property (const zend_execute_data * execute_data , zend_string * name , zend_long value , bool value_is_null )
269
+ {
270
+ zval zv ;
271
+
272
+ if (!value_is_null ) {
273
+ ZVAL_LONG (& zv , value );
274
+ } else {
275
+ ZVAL_NULL (& zv );
276
+ }
277
+
278
+ zend_update_property_ex (url_ce , Z_OBJ_P (getThis ()), name , & zv );
279
+ }
280
+
281
+ #define UPDATE_STR_PROPERTY (e , n , v ) \
282
+ do { \
283
+ url_update_str_property(e, n, v); \
284
+ if (EG(exception)) { \
285
+ RETURN_THROWS(); \
286
+ } \
287
+ } while(0)
288
+
289
+ #define UPDATE_LONG_PROPERTY (e , n , v , vn ) \
290
+ do { \
291
+ url_update_long_property(e, n, v, vn); \
292
+ if (EG(exception)) { \
293
+ RETURN_THROWS(); \
294
+ } \
295
+ } while(0)
296
+
278
297
PHP_METHOD (Url_Url , __construct )
279
298
{
280
299
zend_string * scheme = NULL , * host = NULL , * user = NULL , * password = NULL , * path = NULL , * query = NULL , * fragment = NULL ;
@@ -292,9 +311,14 @@ PHP_METHOD(Url_Url, __construct)
292
311
Z_PARAM_STR_OR_NULL (fragment )
293
312
ZEND_PARSE_PARAMETERS_END ();
294
313
295
- zend_update_property_str (url_ce , Z_OBJ_P (getThis ()), "scheme" , sizeof ("scheme" )- 1 , scheme );
296
-
297
- // TODO Not implemented yet
314
+ UPDATE_STR_PROPERTY (execute_data , ZSTR_KNOWN (ZEND_STR_SCHEME ), scheme );
315
+ UPDATE_STR_PROPERTY (execute_data , ZSTR_KNOWN (ZEND_STR_HOST ), host );
316
+ UPDATE_LONG_PROPERTY (execute_data , ZSTR_KNOWN (ZEND_STR_PORT ), port , port_is_null );
317
+ UPDATE_STR_PROPERTY (execute_data , ZSTR_KNOWN (ZEND_STR_USER ), user );
318
+ UPDATE_STR_PROPERTY (execute_data , ZSTR_KNOWN (ZEND_STR_PASSWORD ), password );
319
+ UPDATE_STR_PROPERTY (execute_data , ZSTR_KNOWN (ZEND_STR_PATH ), path );
320
+ UPDATE_STR_PROPERTY (execute_data , ZSTR_KNOWN (ZEND_STR_QUERY ), query );
321
+ UPDATE_STR_PROPERTY (execute_data , ZSTR_KNOWN (ZEND_STR_FRAGMENT ), fragment );
298
322
}
299
323
300
324
PHP_METHOD (Url_Url , __toString )
0 commit comments