2525
2626static zend_result lexbor_init_parser (void );
2727static void * lexbor_parse_uri (const zend_string * url_str , const zend_string * base_url_str , zval * errors );
28+ static void lexbor_create_invalid_uri_exception (zval * exception_zv , zval * errors );
2829static void * lexbor_clone_uri (void * uri );
2930static zend_string * lexbor_uri_to_string (void * uri , uri_recomposition_mode_t recomposition_mode , bool exclude_fragment );
3031static void lexbor_free_uri (void * uri );
@@ -39,6 +40,7 @@ const uri_handler_t lexbor_uri_handler = {
3940 URI_PARSER_WHATWG ,
4041 lexbor_init_parser ,
4142 lexbor_parse_uri ,
43+ lexbor_create_invalid_uri_exception ,
4244 lexbor_clone_uri ,
4345 lexbor_uri_to_string ,
4446 lexbor_free_uri ,
@@ -284,7 +286,7 @@ static zend_result lexbor_write_scheme(uri_internal_t *internal_uri, zval *value
284286 CHECK_WRITE_RESULT (status , lexbor_uri , str , errors );
285287}
286288
287- static zend_result lexbor_read_user (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
289+ static zend_result lexbor_read_username (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
288290{
289291 lxb_url_t * lexbor_uri = (lxb_url_t * ) internal_uri -> uri ;
290292
@@ -297,7 +299,7 @@ static zend_result lexbor_read_user(const uri_internal_t *internal_uri, uri_comp
297299 return SUCCESS ;
298300}
299301
300- static zend_result lexbor_write_user (uri_internal_t * internal_uri , zval * value , zval * errors )
302+ static zend_result lexbor_write_username (uri_internal_t * internal_uri , zval * value , zval * errors )
301303{
302304 lxb_url_t * lexbor_uri = (lxb_url_t * ) internal_uri -> uri ;
303305 lexbor_str_t str = {0 };
@@ -339,22 +341,19 @@ static zend_result lexbor_read_host(const uri_internal_t *internal_uri, uri_comp
339341 lxb_url_t * lexbor_uri = (lxb_url_t * ) internal_uri -> uri ;
340342
341343 if (lexbor_uri -> host .type == LXB_URL_HOST_TYPE_IPV4 ) {
342- struct in_addr myaddr ;
343- myaddr .s_addr = htonl ((zend_ulong ) & lexbor_uri -> host .u .ipv4 );
344- char buffer [17 ];
344+ smart_str host_str = {0 };
345345
346- const char * result = inet_ntop (AF_INET , & myaddr , buffer , sizeof (buffer ));
347- ZEND_ASSERT (result != NULL );
346+ lxb_url_serialize_host_ipv4 ((zend_ulong ) lexbor_uri -> host .u .ipv4 , lexbor_serialize_callback , (void * ) & host_str );
348347
349- ZVAL_STRING (retval , buffer );
348+ ZVAL_STR (retval , smart_str_extract ( & host_str ) );
350349 } else if (lexbor_uri -> host .type == LXB_URL_HOST_TYPE_IPV6 ) {
351- char buffer [ 46 ] ;
350+ smart_str host_str = { 0 } ;
352351
353- php_sprintf ( buffer , "[%hu:%hu:%hu:%hu:%hu:%hu:%hu:%hu]" , lexbor_uri -> host . u . ipv6 [ 0 ], lexbor_uri -> host . u . ipv6 [ 1 ],
354- lexbor_uri -> host .u .ipv6 [ 2 ], lexbor_uri -> host . u . ipv6 [ 3 ], lexbor_uri -> host . u . ipv6 [ 4 ], lexbor_uri -> host . u . ipv6 [ 5 ],
355- lexbor_uri -> host . u . ipv6 [ 6 ], lexbor_uri -> host . u . ipv6 [ 7 ] );
352+ smart_str_appendc ( & host_str , '[' );
353+ lxb_url_serialize_host_ipv6 ( lexbor_uri -> host .u .ipv6 , lexbor_serialize_callback , ( void * ) & host_str );
354+ smart_str_appendc ( & host_str , ']' );
356355
357- ZVAL_STRING (retval , buffer );
356+ ZVAL_STR (retval , smart_str_extract ( & host_str ) );
358357 } else if (lexbor_uri -> host .type != LXB_URL_HOST_TYPE_EMPTY && lexbor_uri -> host .type != LXB_URL_HOST_TYPE__UNDEF ) {
359358
360359 switch (read_mode ) {
@@ -522,7 +521,7 @@ static zend_result lexbor_init_parser(void)
522521 zend_hash_init (& lexbor_property_handlers , 8 , NULL , NULL , true);
523522
524523 URI_REGISTER_PROPERTY_READ_WRITE_HANDLER (& lexbor_property_handlers , ZSTR_KNOWN (ZEND_STR_SCHEME ), lexbor_read_scheme , lexbor_write_scheme );
525- URI_REGISTER_PROPERTY_READ_WRITE_HANDLER (& lexbor_property_handlers , ZSTR_KNOWN (ZEND_STR_USER ), lexbor_read_user , lexbor_write_user );
524+ URI_REGISTER_PROPERTY_READ_WRITE_HANDLER (& lexbor_property_handlers , ZSTR_KNOWN (ZEND_STR_USERNAME ), lexbor_read_username , lexbor_write_username );
526525 URI_REGISTER_PROPERTY_READ_WRITE_HANDLER (& lexbor_property_handlers , ZSTR_KNOWN (ZEND_STR_PASSWORD ), lexbor_read_password , lexbor_write_password );
527526 URI_REGISTER_PROPERTY_READ_WRITE_HANDLER (& lexbor_property_handlers , ZSTR_KNOWN (ZEND_STR_HOST ), lexbor_read_host , lexbor_write_host );
528527 URI_REGISTER_PROPERTY_READ_WRITE_HANDLER (& lexbor_property_handlers , ZSTR_KNOWN (ZEND_STR_PORT ), lexbor_read_port , lexbor_write_port );
@@ -552,6 +551,22 @@ static void *lexbor_parse_uri(const zend_string *url_str, const zend_string *bas
552551 return url ;
553552}
554553
554+ static void lexbor_create_invalid_uri_exception (zval * exception_zv , zval * errors )
555+ {
556+ object_init_ex (exception_zv , whatwg_invalid_url_exception_ce );
557+
558+ zend_update_property_string (
559+ whatwg_invalid_url_exception_ce ,
560+ Z_OBJ_P (exception_zv ),
561+ ZSTR_VAL (ZSTR_KNOWN (ZEND_STR_MESSAGE )),
562+ ZSTR_LEN (ZSTR_KNOWN (ZEND_STR_MESSAGE )),
563+ "URL parsing failed"
564+ );
565+
566+ zend_update_property (whatwg_invalid_url_exception_ce , Z_OBJ_P (exception_zv ), "errors" , sizeof ("errors" ) - 1 , errors );
567+ }
568+
569+
555570static void * lexbor_clone_uri (void * uri )
556571{
557572 lxb_url_t * lexbor_uri = (lxb_url_t * ) uri ;
0 commit comments