2323#include <arpa/inet.h>
2424#endif
2525
26- static void * lexbor_parse_uri (const zend_string * uri_str , const void * base_url , zval * errors );
27- static void lexbor_create_invalid_uri_exception (zval * exception_zv , zval * errors );
28- static void * lexbor_clone_uri (void * uri );
29- static zend_string * lexbor_uri_to_string (void * uri , uri_recomposition_mode_t recomposition_mode , bool exclude_fragment );
30- static void lexbor_free_uri (void * uri );
31-
32- static HashTable lexbor_property_handlers ;
33-
3426ZEND_TLS lxb_url_parser_t * lexbor_parser ;
3527ZEND_TLS int lexbor_urls ;
3628
37- const uri_handler_t lexbor_uri_handler = {
38- URI_PARSER_WHATWG ,
39- lexbor_parse_uri ,
40- lexbor_create_invalid_uri_exception ,
41- lexbor_clone_uri ,
42- lexbor_uri_to_string ,
43- lexbor_free_uri ,
44- & lexbor_property_handlers
45- };
46-
47- #define MAX_URL_COUNT 500
29+ #define LEXBOR_MAX_URL_COUNT 500
30+ #define LEXBOR_MRAW_BYTE_SIZE 8192
4831
4932#define ZVAL_STRING_OR_NULL_TO_LEXBOR_STR (value , str ) do { \
5033 if (Z_TYPE_P(value) == IS_STRING && Z_STRLEN_P(value) > 0) { \
51- lexbor_str_init_append(&str, lexbor_parser->mraw, (const lxb_char_t *) Z_STRVAL_P(value), Z_STRLEN_P(value)); \
34+ str.data = (lxb_char_t *) Z_STRVAL_P(value); \
35+ str.length = Z_STRLEN_P(value); \
5236 } else { \
5337 ZEND_ASSERT(Z_ISNULL_P(value) || (Z_TYPE_P(value) == IS_STRING && Z_STRLEN_P(value) == 0)); \
54- lexbor_str_init(&str, lexbor_parser->mraw, 0); \
38+ str.data = (lxb_char_t *) ""; \
39+ str.length = 0; \
5540 } \
5641} while (0)
5742
5843#define ZVAL_LONG_OR_NULL_TO_LEXBOR_STR (value , str ) do { \
5944 if (Z_TYPE_P(value) == IS_LONG) { \
6045 ZVAL_STR(value, zend_long_to_str(Z_LVAL_P(value))); \
6146 lexbor_str_init_append(&str, lexbor_parser->mraw, (const lxb_char_t *) Z_STRVAL_P(value), Z_STRLEN_P(value)); \
62- zval_ptr_dtor (value); \
47+ zval_ptr_dtor_str (value); \
6348 } else { \
6449 ZEND_ASSERT(Z_ISNULL_P(value)); \
65- lexbor_str_init(&str, lexbor_parser->mraw, 0); \
50+ str.data = (lxb_char_t *) ""; \
51+ str.length = 0; \
6652 } \
6753} while (0)
6854
69- #define LEXBOR_READ_ASCII_URI_COMPONENT (start , len , read_mode , retval ) do { \
55+ #define LEXBOR_READ_ASCII_URI_COMPONENT (start , len , retval ) do { \
7056 ZVAL_STRINGL(retval, (const char *) start, len); \
7157} while (0)
7258
7359static void lexbor_cleanup_parser (void )
7460{
75- if (++ lexbor_urls % MAX_URL_COUNT == 0 ) {
61+ if (++ lexbor_urls % LEXBOR_MAX_URL_COUNT == 0 ) {
7662 lexbor_mraw_clean (lexbor_parser -> mraw );
7763 }
7864
@@ -246,7 +232,7 @@ static lxb_status_t lexbor_serialize_callback(const lxb_char_t *data, size_t len
246232 return LXB_STATUS_OK ;
247233}
248234
249- static zend_result lexbor_read_scheme (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
235+ static zend_result lexbor_read_scheme (const struct uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
250236{
251237 lxb_url_t * lexbor_uri = internal_uri -> uri ;
252238
@@ -257,7 +243,7 @@ static zend_result lexbor_read_scheme(const uri_internal_t *internal_uri, uri_co
257243 return SUCCESS ;
258244}
259245
260- static zend_result lexbor_write_scheme (uri_internal_t * internal_uri , zval * value , zval * errors )
246+ static zend_result lexbor_write_scheme (struct uri_internal_t * internal_uri , zval * value , zval * errors )
261247{
262248 lxb_url_t * lexbor_uri = internal_uri -> uri ;
263249 lexbor_str_t str = {0 };
@@ -273,12 +259,12 @@ static zend_result lexbor_write_scheme(uri_internal_t *internal_uri, zval *value
273259 return SUCCESS ;
274260}
275261
276- static zend_result lexbor_read_username (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
262+ static zend_result lexbor_read_username (const struct uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
277263{
278264 lxb_url_t * lexbor_uri = internal_uri -> uri ;
279265
280266 if (lexbor_uri -> username .length ) {
281- LEXBOR_READ_ASCII_URI_COMPONENT (lexbor_uri -> username .data , lexbor_uri -> username .length , read_mode , retval );
267+ LEXBOR_READ_ASCII_URI_COMPONENT (lexbor_uri -> username .data , lexbor_uri -> username .length , retval );
282268 } else {
283269 ZVAL_NULL (retval );
284270 }
@@ -302,20 +288,20 @@ static zend_result lexbor_write_username(uri_internal_t *internal_uri, zval *val
302288 return SUCCESS ;
303289}
304290
305- static zend_result lexbor_read_password (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
291+ static zend_result lexbor_read_password (const struct uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
306292{
307293 lxb_url_t * lexbor_uri = internal_uri -> uri ;
308294
309295 if (lexbor_uri -> password .length > 0 ) {
310- LEXBOR_READ_ASCII_URI_COMPONENT (lexbor_uri -> password .data , lexbor_uri -> password .length , read_mode , retval );
296+ LEXBOR_READ_ASCII_URI_COMPONENT (lexbor_uri -> password .data , lexbor_uri -> password .length , retval );
311297 } else {
312298 ZVAL_NULL (retval );
313299 }
314300
315301 return SUCCESS ;
316302}
317303
318- static zend_result lexbor_write_password (uri_internal_t * internal_uri , zval * value , zval * errors )
304+ static zend_result lexbor_write_password (struct uri_internal_t * internal_uri , zval * value , zval * errors )
319305{
320306 lxb_url_t * lexbor_uri = internal_uri -> uri ;
321307 lexbor_str_t str = {0 };
@@ -342,7 +328,7 @@ static ZEND_RESULT_CODE init_idna(void)
342328 return lxb_unicode_idna_init (lexbor_parser -> idna ) == LXB_STATUS_OK ? SUCCESS : FAILURE ;
343329}
344330
345- static zend_result lexbor_read_host (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
331+ static zend_result lexbor_read_host (const struct uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
346332{
347333 lxb_url_t * lexbor_uri = internal_uri -> uri ;
348334
@@ -387,7 +373,7 @@ static zend_result lexbor_read_host(const uri_internal_t *internal_uri, uri_comp
387373 return SUCCESS ;
388374}
389375
390- static zend_result lexbor_write_host (uri_internal_t * internal_uri , zval * value , zval * errors )
376+ static zend_result lexbor_write_host (struct uri_internal_t * internal_uri , zval * value , zval * errors )
391377{
392378 lxb_url_t * lexbor_uri = internal_uri -> uri ;
393379 lexbor_str_t str = {0 };
@@ -403,7 +389,7 @@ static zend_result lexbor_write_host(uri_internal_t *internal_uri, zval *value,
403389 return SUCCESS ;
404390}
405391
406- static zend_result lexbor_read_port (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
392+ static zend_result lexbor_read_port (const struct uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
407393{
408394 lxb_url_t * lexbor_uri = internal_uri -> uri ;
409395
@@ -416,7 +402,7 @@ static zend_result lexbor_read_port(const uri_internal_t *internal_uri, uri_comp
416402 return SUCCESS ;
417403}
418404
419- static zend_result lexbor_write_port (uri_internal_t * internal_uri , zval * value , zval * errors )
405+ static zend_result lexbor_write_port (struct uri_internal_t * internal_uri , zval * value , zval * errors )
420406{
421407 lxb_url_t * lexbor_uri = internal_uri -> uri ;
422408 lexbor_str_t str = {0 };
@@ -432,20 +418,20 @@ static zend_result lexbor_write_port(uri_internal_t *internal_uri, zval *value,
432418 return SUCCESS ;
433419}
434420
435- static zend_result lexbor_read_path (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
421+ static zend_result lexbor_read_path (const struct uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
436422{
437423 lxb_url_t * lexbor_uri = internal_uri -> uri ;
438424
439425 if (lexbor_uri -> path .str .length ) {
440- LEXBOR_READ_ASCII_URI_COMPONENT (lexbor_uri -> path .str .data , lexbor_uri -> path .str .length , read_mode , retval );
426+ LEXBOR_READ_ASCII_URI_COMPONENT (lexbor_uri -> path .str .data , lexbor_uri -> path .str .length , retval );
441427 } else {
442428 ZVAL_EMPTY_STRING (retval );
443429 }
444430
445431 return SUCCESS ;
446432}
447433
448- static zend_result lexbor_write_path (uri_internal_t * internal_uri , zval * value , zval * errors )
434+ static zend_result lexbor_write_path (struct uri_internal_t * internal_uri , zval * value , zval * errors )
449435{
450436 lxb_url_t * lexbor_uri = internal_uri -> uri ;
451437 lexbor_str_t str = {0 };
@@ -461,20 +447,20 @@ static zend_result lexbor_write_path(uri_internal_t *internal_uri, zval *value,
461447 return SUCCESS ;
462448}
463449
464- static zend_result lexbor_read_query (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
450+ static zend_result lexbor_read_query (const struct uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
465451{
466452 lxb_url_t * lexbor_uri = internal_uri -> uri ;
467453
468454 if (lexbor_uri -> query .length ) {
469- LEXBOR_READ_ASCII_URI_COMPONENT (lexbor_uri -> query .data , lexbor_uri -> query .length , read_mode , retval );
455+ LEXBOR_READ_ASCII_URI_COMPONENT (lexbor_uri -> query .data , lexbor_uri -> query .length , retval );
470456 } else {
471457 ZVAL_NULL (retval );
472458 }
473459
474460 return SUCCESS ;
475461}
476462
477- static zend_result lexbor_write_query (uri_internal_t * internal_uri , zval * value , zval * errors )
463+ static zend_result lexbor_write_query (struct uri_internal_t * internal_uri , zval * value , zval * errors )
478464{
479465 lxb_url_t * lexbor_uri = internal_uri -> uri ;
480466 lexbor_str_t str = {0 };
@@ -490,20 +476,20 @@ static zend_result lexbor_write_query(uri_internal_t *internal_uri, zval *value,
490476 return SUCCESS ;
491477}
492478
493- static zend_result lexbor_read_fragment (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
479+ static zend_result lexbor_read_fragment (const struct uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
494480{
495481 lxb_url_t * lexbor_uri = internal_uri -> uri ;
496482
497483 if (lexbor_uri -> fragment .length ) {
498- LEXBOR_READ_ASCII_URI_COMPONENT (lexbor_uri -> fragment .data , lexbor_uri -> fragment .length , read_mode , retval );
484+ LEXBOR_READ_ASCII_URI_COMPONENT (lexbor_uri -> fragment .data , lexbor_uri -> fragment .length , retval );
499485 } else {
500486 ZVAL_NULL (retval );
501487 }
502488
503489 return SUCCESS ;
504490}
505491
506- static zend_result lexbor_write_fragment (uri_internal_t * internal_uri , zval * value , zval * errors )
492+ static zend_result lexbor_write_fragment (struct uri_internal_t * internal_uri , zval * value , zval * errors )
507493{
508494 lxb_url_t * lexbor_uri = internal_uri -> uri ;
509495 lexbor_str_t str = {0 };
@@ -519,29 +505,10 @@ static zend_result lexbor_write_fragment(uri_internal_t *internal_uri, zval *val
519505 return SUCCESS ;
520506}
521507
522- void lexbor_module_init (void )
523- {
524- zend_hash_init (& lexbor_property_handlers , 8 , NULL , NULL , true);
525-
526- URI_REGISTER_PROPERTY_READ_WRITE_HANDLER (& lexbor_property_handlers , ZSTR_KNOWN (ZEND_STR_SCHEME ), lexbor_read_scheme , lexbor_write_scheme );
527- URI_REGISTER_PROPERTY_READ_WRITE_HANDLER (& lexbor_property_handlers , ZSTR_KNOWN (ZEND_STR_USERNAME ), lexbor_read_username , lexbor_write_username );
528- URI_REGISTER_PROPERTY_READ_WRITE_HANDLER (& lexbor_property_handlers , ZSTR_KNOWN (ZEND_STR_PASSWORD ), lexbor_read_password , lexbor_write_password );
529- URI_REGISTER_PROPERTY_READ_WRITE_HANDLER (& lexbor_property_handlers , ZSTR_KNOWN (ZEND_STR_HOST ), lexbor_read_host , lexbor_write_host );
530- URI_REGISTER_PROPERTY_READ_WRITE_HANDLER (& lexbor_property_handlers , ZSTR_KNOWN (ZEND_STR_PORT ), lexbor_read_port , lexbor_write_port );
531- URI_REGISTER_PROPERTY_READ_WRITE_HANDLER (& lexbor_property_handlers , ZSTR_KNOWN (ZEND_STR_PATH ), lexbor_read_path , lexbor_write_path );
532- URI_REGISTER_PROPERTY_READ_WRITE_HANDLER (& lexbor_property_handlers , ZSTR_KNOWN (ZEND_STR_QUERY ), lexbor_read_query , lexbor_write_query );
533- URI_REGISTER_PROPERTY_READ_WRITE_HANDLER (& lexbor_property_handlers , ZSTR_KNOWN (ZEND_STR_FRAGMENT ), lexbor_read_fragment , lexbor_write_fragment );
534- }
535-
536- void lexbor_module_shutdown (void )
537- {
538- zend_hash_destroy (& lexbor_property_handlers );
539- }
540-
541508zend_result lexbor_request_init (void )
542509{
543510 lexbor_mraw_t * mraw = lexbor_mraw_create ();
544- lxb_status_t status = lexbor_mraw_init (mraw , 4096 * 2 );
511+ lxb_status_t status = lexbor_mraw_init (mraw , LEXBOR_MRAW_BYTE_SIZE );
545512 if (status != LXB_STATUS_OK ) {
546513 lexbor_mraw_destroy (mraw , true);
547514 return FAILURE ;
@@ -588,7 +555,7 @@ static void lexbor_create_invalid_uri_exception(zval *exception_zv, zval *errors
588555 zval value ;
589556 ZVAL_STRING (& value , "URL parsing failed" );
590557 zend_update_property_ex (uri_whatwg_invalid_url_exception_ce , Z_OBJ_P (exception_zv ), ZSTR_KNOWN (ZEND_STR_MESSAGE ), & value );
591- zval_ptr_dtor (& value );
558+ zval_ptr_dtor_str (& value );
592559
593560 zend_update_property (uri_whatwg_invalid_url_exception_ce , Z_OBJ_P (exception_zv ), ZEND_STRL ("errors" ), errors );
594561}
@@ -629,3 +596,22 @@ static zend_string *lexbor_uri_to_string(void *uri, uri_recomposition_mode_t rec
629596static void lexbor_free_uri (void * uri )
630597{
631598}
599+
600+ const uri_handler_t lexbor_uri_handler = {
601+ .name = URI_PARSER_WHATWG ,
602+ .parse_uri = lexbor_parse_uri ,
603+ .create_invalid_uri_exception = lexbor_create_invalid_uri_exception ,
604+ .clone_uri = lexbor_clone_uri ,
605+ .uri_to_string = lexbor_uri_to_string ,
606+ .free_uri = lexbor_free_uri ,
607+ {
608+ .scheme = {.read_func = lexbor_read_scheme , .write_func = lexbor_write_scheme },
609+ .username = {.read_func = lexbor_read_username , .write_func = lexbor_write_username },
610+ .password = {.read_func = lexbor_read_password , .write_func = lexbor_write_password },
611+ .host = {.read_func = lexbor_read_host , .write_func = lexbor_write_host },
612+ .port = {.read_func = lexbor_read_port , .write_func = lexbor_write_port },
613+ .path = {.read_func = lexbor_read_path , .write_func = lexbor_write_path },
614+ .query = {.read_func = lexbor_read_query , .write_func = lexbor_write_query },
615+ .fragment = {.read_func = lexbor_read_fragment , .write_func = lexbor_write_fragment },
616+ }
617+ };
0 commit comments