@@ -44,12 +44,14 @@ static lxb_url_parser_t *init_parser(void)
4444 lexbor_mraw_t * mraw = lexbor_mraw_create ();
4545 lxb_status_t status = lexbor_mraw_init (mraw , 4096 * 2 );
4646 if (status != LXB_STATUS_OK ) {
47+ lexbor_mraw_destroy (mraw , true);
4748 return NULL ;
4849 }
4950
5051 lxb_url_parser_t * parser = lxb_url_parser_create ();
5152 status = lxb_url_parser_init (parser , mraw );
5253 if (status != LXB_STATUS_OK ) {
54+ lxb_url_parser_destroy (parser , true);
5355 return NULL ;
5456 }
5557
@@ -64,8 +66,7 @@ static void destroy_parser(lxb_url_parser_t *parser)
6466
6567#define PARSE_URL (url ) \
6668 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) { \
6970 zend_argument_value_error(1, "is not a valid URL"); \
7071 RETURN_THROWS(); \
7172 } \
@@ -158,19 +159,19 @@ static void cleanup_parser(void)
158159void parse_url_to_array (zend_string * url , zval * return_value )
159160{
160161 zval tmp ;
161- lxb_url_t * lxb_url ;
162+ lxb_url_t * lxb_url = NULL ;
162163
163164 PARSE_URL (url );
164165
165166 array_init (return_value );
166167
167168 url_scheme_to_zval (lxb_url , & tmp );
168- if (Z_STRLEN (tmp ) > 0 ) {
169+ if (Z_TYPE ( tmp ) == IS_STRING && Z_STRLEN (tmp ) > 0 ) {
169170 zend_hash_add_new (Z_ARRVAL_P (return_value ), ZSTR_KNOWN (ZEND_STR_SCHEME ), & tmp );
170171 }
171172
172173 url_host_to_zval (lxb_url , & tmp );
173- if (Z_STRLEN (tmp ) > 0 ) {
174+ if (Z_TYPE ( tmp ) == IS_STRING && Z_STRLEN (tmp ) > 0 ) {
174175 zend_hash_add_new (Z_ARRVAL_P (return_value ), ZSTR_KNOWN (ZEND_STR_HOST ), & tmp );
175176 }
176177
@@ -210,71 +211,89 @@ void parse_url_to_array(zend_string *url, zval *return_value)
210211void parse_url_to_object (zend_string * url , zval * return_value )
211212{
212213 zval tmp ;
213- lxb_url_t * lxb_url ;
214+ lxb_url_t * lxb_url = NULL ;
214215
215216 PARSE_URL (url );
216217
217218 object_init_ex (return_value , url_ce );
218219
219220 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 );
225223
226224 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 );
232227
233228 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 );
239231
240232 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 );
246235
247236 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 );
253239
254240 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 );
260243
261244 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 );
267247
268248 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 );
274251
275252 cleanup_parser ();
276253}
277254
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+
278297PHP_METHOD (Url_Url , __construct )
279298{
280299 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)
292311 Z_PARAM_STR_OR_NULL (fragment )
293312 ZEND_PARSE_PARAMETERS_END ();
294313
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 );
298322}
299323
300324PHP_METHOD (Url_Url , __toString )
0 commit comments