Skip to content

Commit 181662e

Browse files
committed
Review fixes
1 parent fae8cfd commit 181662e

File tree

8 files changed

+177
-63
lines changed

8 files changed

+177
-63
lines changed

ext/uri/php_lexbor.c

Lines changed: 28 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,11 @@
2323
#include <arpa/inet.h>
2424
#endif
2525

26-
static zend_result lexbor_init_parser(void);
2726
static void *lexbor_parse_uri(const zend_string *uri_str, const void *base_url, zval *errors);
2827
static void lexbor_create_invalid_uri_exception(zval *exception_zv, zval *errors);
2928
static void *lexbor_clone_uri(void *uri);
3029
static zend_string *lexbor_uri_to_string(void *uri, uri_recomposition_mode_t recomposition_mode, bool exclude_fragment);
3130
static void lexbor_free_uri(void *uri);
32-
static zend_result lexbor_destroy_parser(void);
3331

3432
static HashTable lexbor_property_handlers;
3533

@@ -38,13 +36,11 @@ ZEND_TLS int lexbor_urls;
3836

3937
const uri_handler_t lexbor_uri_handler = {
4038
URI_PARSER_WHATWG,
41-
lexbor_init_parser,
4239
lexbor_parse_uri,
4340
lexbor_create_invalid_uri_exception,
4441
lexbor_clone_uri,
4542
lexbor_uri_to_string,
4643
lexbor_free_uri,
47-
lexbor_destroy_parser,
4844
&lexbor_property_handlers
4945
};
5046

@@ -67,14 +63,6 @@ const uri_handler_t lexbor_uri_handler = {
6763
} \
6864
} while (0)
6965

70-
#define CHECK_WRITE_RESULT(status, errors) do { \
71-
if (status != LXB_STATUS_OK) { \
72-
fill_errors(errors); \
73-
return FAILURE; \
74-
} \
75-
return SUCCESS; \
76-
} while (0)
77-
7866
#define LEXBOR_READ_ASCII_URI_COMPONENT(start, len, read_mode, retval) do { \
7967
ZVAL_STRINGL(retval, (const char *) start, len); \
8068
} while (0)
@@ -528,7 +516,26 @@ static zend_result lexbor_write_fragment(uri_internal_t *internal_uri, zval *val
528516
return SUCCESS;
529517
}
530518

531-
static zend_result lexbor_init_parser(void)
519+
void lexbor_module_init(void)
520+
{
521+
zend_hash_init(&lexbor_property_handlers, 8, NULL, NULL, true);
522+
523+
URI_REGISTER_PROPERTY_READ_WRITE_HANDLER(&lexbor_property_handlers, ZSTR_KNOWN(ZEND_STR_SCHEME), lexbor_read_scheme, lexbor_write_scheme);
524+
URI_REGISTER_PROPERTY_READ_WRITE_HANDLER(&lexbor_property_handlers, ZSTR_KNOWN(ZEND_STR_USERNAME), lexbor_read_username, lexbor_write_username);
525+
URI_REGISTER_PROPERTY_READ_WRITE_HANDLER(&lexbor_property_handlers, ZSTR_KNOWN(ZEND_STR_PASSWORD), lexbor_read_password, lexbor_write_password);
526+
URI_REGISTER_PROPERTY_READ_WRITE_HANDLER(&lexbor_property_handlers, ZSTR_KNOWN(ZEND_STR_HOST), lexbor_read_host, lexbor_write_host);
527+
URI_REGISTER_PROPERTY_READ_WRITE_HANDLER(&lexbor_property_handlers, ZSTR_KNOWN(ZEND_STR_PORT), lexbor_read_port, lexbor_write_port);
528+
URI_REGISTER_PROPERTY_READ_WRITE_HANDLER(&lexbor_property_handlers, ZSTR_KNOWN(ZEND_STR_PATH), lexbor_read_path, lexbor_write_path);
529+
URI_REGISTER_PROPERTY_READ_WRITE_HANDLER(&lexbor_property_handlers, ZSTR_KNOWN(ZEND_STR_QUERY), lexbor_read_query, lexbor_write_query);
530+
URI_REGISTER_PROPERTY_READ_WRITE_HANDLER(&lexbor_property_handlers, ZSTR_KNOWN(ZEND_STR_FRAGMENT), lexbor_read_fragment, lexbor_write_fragment);
531+
}
532+
533+
void lexbor_module_shutdown(void)
534+
{
535+
zend_hash_destroy(&lexbor_property_handlers);
536+
}
537+
538+
zend_result lexbor_request_init(void)
532539
{
533540
lexbor_mraw_t *mraw = lexbor_mraw_create();
534541
lxb_status_t status = lexbor_mraw_init(mraw, 4096 * 2);
@@ -548,18 +555,16 @@ static zend_result lexbor_init_parser(void)
548555

549556
lexbor_urls = 0;
550557

551-
zend_hash_init(&lexbor_property_handlers, 8, NULL, NULL, true);
558+
return SUCCESS;
559+
}
552560

553-
URI_REGISTER_PROPERTY_READ_WRITE_HANDLER(&lexbor_property_handlers, ZSTR_KNOWN(ZEND_STR_SCHEME), lexbor_read_scheme, lexbor_write_scheme);
554-
URI_REGISTER_PROPERTY_READ_WRITE_HANDLER(&lexbor_property_handlers, ZSTR_KNOWN(ZEND_STR_USERNAME), lexbor_read_username, lexbor_write_username);
555-
URI_REGISTER_PROPERTY_READ_WRITE_HANDLER(&lexbor_property_handlers, ZSTR_KNOWN(ZEND_STR_PASSWORD), lexbor_read_password, lexbor_write_password);
556-
URI_REGISTER_PROPERTY_READ_WRITE_HANDLER(&lexbor_property_handlers, ZSTR_KNOWN(ZEND_STR_HOST), lexbor_read_host, lexbor_write_host);
557-
URI_REGISTER_PROPERTY_READ_WRITE_HANDLER(&lexbor_property_handlers, ZSTR_KNOWN(ZEND_STR_PORT), lexbor_read_port, lexbor_write_port);
558-
URI_REGISTER_PROPERTY_READ_WRITE_HANDLER(&lexbor_property_handlers, ZSTR_KNOWN(ZEND_STR_PATH), lexbor_read_path, lexbor_write_path);
559-
URI_REGISTER_PROPERTY_READ_WRITE_HANDLER(&lexbor_property_handlers, ZSTR_KNOWN(ZEND_STR_QUERY), lexbor_read_query, lexbor_write_query);
560-
URI_REGISTER_PROPERTY_READ_WRITE_HANDLER(&lexbor_property_handlers, ZSTR_KNOWN(ZEND_STR_FRAGMENT), lexbor_read_fragment, lexbor_write_fragment);
561+
void lexbor_request_shutdown(void)
562+
{
563+
lxb_url_parser_memory_destroy(lexbor_parser);
564+
lxb_url_parser_destroy(lexbor_parser, true);
561565

562-
return SUCCESS;
566+
lexbor_parser = NULL;
567+
lexbor_urls = 0;
563568
}
564569

565570
static void *lexbor_parse_uri(const zend_string *uri_str, const void *base_url, zval *errors)
@@ -621,16 +626,3 @@ static zend_string *lexbor_uri_to_string(void *uri, uri_recomposition_mode_t rec
621626
static void lexbor_free_uri(void *uri)
622627
{
623628
}
624-
625-
static zend_result lexbor_destroy_parser(void)
626-
{
627-
lxb_url_parser_memory_destroy(lexbor_parser);
628-
lxb_url_parser_destroy(lexbor_parser, true);
629-
630-
lexbor_parser = NULL;
631-
lexbor_urls = 0;
632-
633-
zend_hash_destroy(&lexbor_property_handlers);
634-
635-
return SUCCESS;
636-
}

ext/uri/php_lexbor.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,10 @@
2222

2323
extern const uri_handler_t lexbor_uri_handler;
2424

25+
void lexbor_module_init(void);
26+
void lexbor_module_shutdown(void);
27+
28+
zend_result lexbor_request_init(void);
29+
void lexbor_request_shutdown(void);
30+
2531
#endif

ext/uri/php_uri.c

Lines changed: 60 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,56 @@ static HashTable *uri_get_debug_properties(zend_object *object)
8585
return result;
8686
}
8787

88+
PHP_METHOD(Uri_WhatWg_InvalidUrlException, __construct)
89+
{
90+
zend_string *message = NULL;
91+
zval *errors = NULL;
92+
zend_long code = 0;
93+
zval *previous = NULL;
94+
95+
ZEND_PARSE_PARAMETERS_START(0, 4)
96+
Z_PARAM_OPTIONAL
97+
Z_PARAM_STR(message)
98+
Z_PARAM_ARRAY(errors)
99+
Z_PARAM_LONG(code)
100+
Z_PARAM_OBJECT_OF_CLASS_OR_NULL(previous, zend_ce_throwable)
101+
ZEND_PARSE_PARAMETERS_END();
102+
103+
zval tmp;
104+
if (message != NULL) {
105+
ZVAL_STR(&tmp, message);
106+
zend_update_property_ex(uri_whatwg_invalid_url_exception_ce, Z_OBJ_P(ZEND_THIS), ZSTR_KNOWN(ZEND_STR_MESSAGE), &tmp);
107+
if (EG(exception)) {
108+
RETURN_THROWS();
109+
}
110+
}
111+
112+
if (errors == NULL) {
113+
ZVAL_EMPTY_ARRAY(&tmp);
114+
zend_update_property(uri_whatwg_invalid_url_exception_ce, Z_OBJ_P(ZEND_THIS), ZEND_STRL("errors"), &tmp);
115+
} else {
116+
zend_update_property(uri_whatwg_invalid_url_exception_ce, Z_OBJ_P(ZEND_THIS), ZEND_STRL("errors"), errors);
117+
}
118+
if (EG(exception)) {
119+
RETURN_THROWS();
120+
}
121+
122+
if (code != 0) {
123+
ZVAL_LONG(&tmp, code);
124+
zend_update_property_ex(uri_whatwg_invalid_url_exception_ce, Z_OBJ_P(ZEND_THIS), ZSTR_KNOWN(ZEND_STR_CODE), &tmp);
125+
if (EG(exception)) {
126+
RETURN_THROWS();
127+
}
128+
}
129+
130+
if (previous != NULL) {
131+
zend_update_property_ex(zend_ce_exception, Z_OBJ_P(ZEND_THIS), ZSTR_KNOWN(ZEND_STR_PREVIOUS), previous);
132+
if (EG(exception)) {
133+
RETURN_THROWS();
134+
}
135+
}
136+
}
137+
88138
PHP_METHOD(Uri_WhatWg_UrlValidationError, __construct)
89139
{
90140
zend_string *context;
@@ -101,10 +151,12 @@ PHP_METHOD(Uri_WhatWg_UrlValidationError, __construct)
101151
if (EG(exception)) {
102152
RETURN_THROWS();
103153
}
154+
104155
zend_update_property(uri_whatwg_url_validation_error_ce, Z_OBJ_P(ZEND_THIS), ZEND_STRL("type"), type);
105156
if (EG(exception)) {
106157
RETURN_THROWS();
107158
}
159+
108160
zval failure_zv;
109161
ZVAL_BOOL(&failure_zv, failure);
110162
zend_update_property(uri_whatwg_url_validation_error_ce, Z_OBJ_P(ZEND_THIS), ZEND_STRL("failure"), &failure_zv);
@@ -519,7 +571,6 @@ static zend_object *uri_create_object_handler(zend_class_entry *class_type)
519571
static void uri_free_obj_handler(zend_object *object)
520572
{
521573
uri_object_t *uri_object = uri_object_from_obj(object);
522-
ZEND_ASSERT(uri_object != NULL);
523574

524575
if (UNEXPECTED(uri_object->internal.uri != NULL)) {
525576
uri_object->internal.handler->free_uri(uri_object->internal.uri);
@@ -568,13 +619,11 @@ zend_result uri_handler_register(const uri_handler_t *uri_handler)
568619
zend_string *key = zend_string_init_interned(uri_handler->name, strlen(uri_handler->name), 1);
569620

570621
ZEND_ASSERT(uri_handler->name != NULL);
571-
ZEND_ASSERT(uri_handler->init_parser != NULL);
572622
ZEND_ASSERT(uri_handler->parse_uri != NULL);
573623
ZEND_ASSERT(uri_handler->create_invalid_uri_exception != NULL);
574624
ZEND_ASSERT(uri_handler->clone_uri != NULL);
575625
ZEND_ASSERT(uri_handler->uri_to_string != NULL);
576626
ZEND_ASSERT(uri_handler->free_uri != NULL);
577-
ZEND_ASSERT(uri_handler->destroy_parser != NULL);
578627
ZEND_ASSERT(uri_handler->property_handlers != NULL);
579628

580629
zend_result result = zend_hash_add_ptr(&uri_handlers, key, (void *) uri_handler) != NULL ? SUCCESS : FAILURE;
@@ -602,6 +651,8 @@ static PHP_MINIT_FUNCTION(uri)
602651
return FAILURE;
603652
}
604653

654+
lexbor_module_init();
655+
605656
return SUCCESS;
606657
}
607658

@@ -615,33 +666,25 @@ static PHP_MINFO_FUNCTION(uri)
615666

616667
static PHP_MSHUTDOWN_FUNCTION(uri)
617668
{
669+
lexbor_module_shutdown();
670+
618671
zend_hash_destroy(&uri_handlers);
619672

620673
return SUCCESS;
621674
}
622675

623676
PHP_RINIT_FUNCTION(uri)
624677
{
625-
uri_handler_t *handler;
626-
627-
ZEND_HASH_MAP_FOREACH_PTR(&uri_handlers, handler) {
628-
if (handler->init_parser() == FAILURE) {
629-
return FAILURE;
630-
}
631-
} ZEND_HASH_FOREACH_END();
678+
if (lexbor_request_init() == FAILURE) {
679+
return FAILURE;
680+
}
632681

633682
return SUCCESS;
634683
}
635684

636685
PHP_RSHUTDOWN_FUNCTION(uri)
637686
{
638-
uri_handler_t *handler;
639-
640-
ZEND_HASH_MAP_FOREACH_PTR(&uri_handlers, handler) {
641-
if (handler->destroy_parser() == FAILURE) {
642-
return FAILURE;
643-
}
644-
} ZEND_HASH_FOREACH_END();
687+
lexbor_request_shutdown();
645688

646689
return SUCCESS;
647690
}

ext/uri/php_uri.stub.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ enum UriComparisonMode
2525
class InvalidUrlException extends \Uri\InvalidUriException
2626
{
2727
public readonly array $errors;
28+
29+
public function __construct(string $message = "", array $errors = [], int $code = 0, ?\Throwable $previous = null) {}
2830
}
2931

3032
enum UrlValidationErrorType

ext/uri/php_uri_arginfo.h

Lines changed: 15 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ext/uri/php_uri_common.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ static void uri_write_component_ex(INTERNAL_FUNCTION_PARAMETERS, zend_string *pr
6565
zend_object *new_object = uri_clone_obj_handler(Z_OBJ_P(ZEND_THIS));
6666
if (UNEXPECTED(EG(exception) != NULL)) {
6767
zend_object_release(new_object);
68-
zval_ptr_dtor(property_zv);
6968
RETURN_THROWS();
7069
}
7170

@@ -74,7 +73,6 @@ static void uri_write_component_ex(INTERNAL_FUNCTION_PARAMETERS, zend_string *pr
7473
if (property_handler->write_func == NULL) {
7574
zend_readonly_property_modification_error_ex(ZSTR_VAL(Z_OBJ_P(ZEND_THIS)->ce->name), ZSTR_VAL(property_name));
7675
zend_object_release(new_object);
77-
zval_ptr_dtor(property_zv);
7876
RETURN_THROWS();
7977
}
8078

@@ -84,13 +82,11 @@ static void uri_write_component_ex(INTERNAL_FUNCTION_PARAMETERS, zend_string *pr
8482
throw_invalid_uri_exception(new_internal_uri->handler, &errors);
8583
zval_ptr_dtor(&errors);
8684
zend_object_release(new_object);
87-
zval_ptr_dtor(property_zv);
8885
RETURN_THROWS();
8986
}
9087

9188
ZEND_ASSERT(Z_ISUNDEF(errors));
9289
RETVAL_OBJ(new_object);
93-
zval_ptr_dtor(property_zv);
9490
}
9591

9692
void uri_write_component_str(INTERNAL_FUNCTION_PARAMETERS, zend_string *property_name)
@@ -102,7 +98,7 @@ void uri_write_component_str(INTERNAL_FUNCTION_PARAMETERS, zend_string *property
10298
ZEND_PARSE_PARAMETERS_END();
10399

104100
zval zv;
105-
ZVAL_STR_COPY(&zv, value);
101+
ZVAL_STR(&zv, value);
106102

107103
uri_write_component_ex(INTERNAL_FUNCTION_PARAM_PASSTHRU, property_name, &zv);
108104
}
@@ -119,7 +115,7 @@ void uri_write_component_str_or_null(INTERNAL_FUNCTION_PARAMETERS, zend_string *
119115
if (value == NULL) {
120116
ZVAL_NULL(&zv);
121117
} else {
122-
ZVAL_STR_COPY(&zv, value);
118+
ZVAL_STR(&zv, value);
123119
}
124120

125121
uri_write_component_ex(INTERNAL_FUNCTION_PARAM_PASSTHRU, property_name, &zv);

ext/uri/php_uri_common.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,12 @@ typedef enum {
4343
typedef struct uri_handler_t {
4444
const char *name;
4545

46-
zend_result (*init_parser)(void);
4746
void *(*parse_uri)(const zend_string *uri_str, const void *base_url, zval *errors);
4847
void (*create_invalid_uri_exception)(zval *exception_zv, zval *errors);
4948
void *(*clone_uri)(void *uri);
5049
zend_string *(*uri_to_string)(void *uri, uri_recomposition_mode_t recomposition_mode, bool exclude_fragment);
5150
void (*free_uri)(void *uri);
52-
zend_result (*destroy_parser)(void);
51+
5352
HashTable *property_handlers;
5453
} uri_handler_t;
5554

0 commit comments

Comments
 (0)