Skip to content

Commit 8b70aa8

Browse files
committed
uri: Remove php_uri_parse() and php_uri_free()
This API is both less powerful as well as less efficient compared to just calling the `->parse_uri()` handler of the parser directly. With regard to efficiency it needlessly allocates 32 byte of memory to store two pointers, of which one is already known, because it's the input. While it would be possible to just return the resulting `uri_internal_t` struct (instead of a pointer to a freshly allocated one), which would be returned as a register pair, users of the API can also just create the struct themselves for even more flexibility in allocations. The API is also less powerful, because it does not support base URIs.
1 parent 550858a commit 8b70aa8

File tree

4 files changed

+55
-68
lines changed

4 files changed

+55
-68
lines changed

ext/openssl/xp_ssl.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2640,14 +2640,19 @@ static char *php_openssl_get_url_name(const char *resourcename,
26402640
return NULL;
26412641
}
26422642

2643-
uri_internal_t *internal_uri = php_uri_parse(uri_parser, resourcename, resourcenamelen, true);
2644-
if (internal_uri == NULL) {
2643+
void *parsed = uri_parser->parse_uri(resourcename, resourcenamelen,
2644+
/* base_url */ NULL, /* errors */ NULL, /* silent */ true);
2645+
if (parsed == NULL) {
26452646
return NULL;
26462647
}
2648+
uri_internal_t internal_uri = {
2649+
.parser = uri_parser,
2650+
.uri = parsed,
2651+
};
26472652

26482653
char * url_name = NULL;
26492654
zval host_zv;
2650-
zend_result result = php_uri_get_host(internal_uri, URI_COMPONENT_READ_RAW, &host_zv);
2655+
zend_result result = php_uri_get_host(&internal_uri, URI_COMPONENT_READ_RAW, &host_zv);
26512656
if (result == SUCCESS && Z_TYPE(host_zv) == IS_STRING) {
26522657
const char * host = Z_STRVAL(host_zv);
26532658
size_t len = Z_STRLEN(host_zv);
@@ -2662,7 +2667,7 @@ static char *php_openssl_get_url_name(const char *resourcename,
26622667
}
26632668
}
26642669

2665-
php_uri_free(internal_uri);
2670+
uri_parser->free_uri(parsed);
26662671
zval_ptr_dtor(&host_zv);
26672672

26682673
return url_name;

ext/uri/php_uri.c

Lines changed: 21 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -114,21 +114,6 @@ PHPAPI const uri_parser_t *php_uri_get_parser(const zend_string *uri_parser_name
114114
return uri_parser_by_name(ZSTR_VAL(uri_parser_name), ZSTR_LEN(uri_parser_name));
115115
}
116116

117-
ZEND_ATTRIBUTE_NONNULL PHPAPI uri_internal_t *php_uri_parse(const uri_parser_t *uri_parser, const char *uri_str, size_t uri_str_len, bool silent)
118-
{
119-
void *parsed = uri_parser->parse_uri(uri_str, uri_str_len, NULL, NULL, silent);
120-
121-
if (parsed == NULL) {
122-
return NULL;
123-
}
124-
125-
uri_internal_t *internal_uri = emalloc(sizeof(*internal_uri));
126-
internal_uri->parser = uri_parser;
127-
internal_uri->uri = parsed;
128-
129-
return internal_uri;
130-
}
131-
132117
ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_get_property(const uri_internal_t *internal_uri, uri_property_name_t property_name, uri_component_read_mode_t read_mode, zval *zv)
133118
{
134119
const uri_property_handler_t *property_handler = uri_property_handler_from_internal_uri(internal_uri, property_name);
@@ -179,96 +164,95 @@ ZEND_ATTRIBUTE_NONNULL PHPAPI zend_result php_uri_get_fragment(const uri_interna
179164
return php_uri_get_property(internal_uri, URI_PROPERTY_NAME_FRAGMENT, read_mode, zv);
180165
}
181166

182-
ZEND_ATTRIBUTE_NONNULL PHPAPI void php_uri_free(uri_internal_t *internal_uri)
183-
{
184-
internal_uri->parser->free_uri(internal_uri->uri);
185-
internal_uri->uri = NULL;
186-
internal_uri->parser = NULL;
187-
efree(internal_uri);
188-
}
189-
190167
ZEND_ATTRIBUTE_NONNULL PHPAPI php_uri *php_uri_parse_to_struct(
191168
const uri_parser_t *uri_parser, const char *uri_str, size_t uri_str_len, uri_component_read_mode_t read_mode, bool silent
192169
) {
193-
uri_internal_t *uri_internal = php_uri_parse(uri_parser, uri_str, uri_str_len, silent);
194-
if (uri_internal == NULL) {
170+
void *parsed = uri_parser->parse_uri(uri_str, uri_str_len,
171+
/* base_url */ NULL, /* errors */ NULL, silent);
172+
if (parsed == NULL) {
195173
return NULL;
196174
}
197175

176+
uri_internal_t uri_internal = {
177+
.parser = uri_parser,
178+
.uri = parsed,
179+
};
180+
198181
php_uri *uri = ecalloc(1, sizeof(*uri));
199182
zval tmp;
200183
zend_result result;
201184

202-
result = php_uri_get_scheme(uri_internal, read_mode, &tmp);
185+
result = php_uri_get_scheme(&uri_internal, read_mode, &tmp);
203186
if (result == FAILURE) {
204187
goto error;
205188
}
206189
if (Z_TYPE(tmp) == IS_STRING) {
207190
uri->scheme = Z_STR(tmp);
208191
}
209192

210-
result = php_uri_get_username(uri_internal, read_mode, &tmp);
193+
result = php_uri_get_username(&uri_internal, read_mode, &tmp);
211194
if (result == FAILURE) {
212195
goto error;
213196
}
214197
if (Z_TYPE(tmp) == IS_STRING) {
215198
uri->user = Z_STR(tmp);
216199
}
217200

218-
result = php_uri_get_password(uri_internal, read_mode, &tmp);
201+
result = php_uri_get_password(&uri_internal, read_mode, &tmp);
219202
if (result == FAILURE) {
220203
goto error;
221204
}
222205
if (Z_TYPE(tmp) == IS_STRING) {
223206
uri->password = Z_STR(tmp);
224207
}
225208

226-
result = php_uri_get_host(uri_internal, read_mode, &tmp);
209+
result = php_uri_get_host(&uri_internal, read_mode, &tmp);
227210
if (result == FAILURE) {
228211
goto error;
229212
}
230213
if (Z_TYPE(tmp) == IS_STRING) {
231214
uri->host = Z_STR(tmp);
232215
}
233216

234-
result = php_uri_get_port(uri_internal, read_mode, &tmp);
217+
result = php_uri_get_port(&uri_internal, read_mode, &tmp);
235218
if (result == FAILURE) {
236219
goto error;
237220
}
238221
if (Z_TYPE(tmp) == IS_LONG) {
239222
uri->port = Z_LVAL(tmp);
240223
}
241224

242-
result = php_uri_get_path(uri_internal, read_mode, &tmp);
225+
result = php_uri_get_path(&uri_internal, read_mode, &tmp);
243226
if (result == FAILURE) {
244227
goto error;
245228
}
246229
if (Z_TYPE(tmp) == IS_STRING) {
247230
uri->path = Z_STR(tmp);
248231
}
249232

250-
result = php_uri_get_query(uri_internal, read_mode, &tmp);
233+
result = php_uri_get_query(&uri_internal, read_mode, &tmp);
251234
if (result == FAILURE) {
252235
goto error;
253236
}
254237
if (Z_TYPE(tmp) == IS_STRING) {
255238
uri->query = Z_STR(tmp);
256239
}
257240

258-
result = php_uri_get_fragment(uri_internal, read_mode, &tmp);
241+
result = php_uri_get_fragment(&uri_internal, read_mode, &tmp);
259242
if (result == FAILURE) {
260243
goto error;
261244
}
262245
if (Z_TYPE(tmp) == IS_STRING) {
263246
uri->fragment = Z_STR(tmp);
264247
}
265248

266-
php_uri_free(uri_internal);
249+
uri_parser->free_uri(parsed);
267250

268251
return uri;
269252

270253
error:
271-
php_uri_free(uri_internal);
254+
255+
uri_parser->free_uri(parsed);
272256
php_uri_struct_free(uri);
273257

274258
return NULL;
@@ -344,7 +328,8 @@ ZEND_ATTRIBUTE_NONNULL_ARGS(1, 2) PHPAPI void php_uri_instantiate_uri(
344328
base_url = internal_base_url->uri;
345329
}
346330

347-
void *uri = uri_parser->parse_uri(ZSTR_VAL(uri_str), ZSTR_LEN(uri_str), base_url, should_throw || errors_zv != NULL ? &errors : NULL, !should_throw);
331+
void *uri = uri_parser->parse_uri(ZSTR_VAL(uri_str), ZSTR_LEN(uri_str),
332+
base_url, should_throw || errors_zv != NULL ? &errors : NULL, !should_throw);
348333
if (UNEXPECTED(uri == NULL)) {
349334
if (should_throw) {
350335
zval_ptr_dtor(&errors);

ext/uri/php_uri.h

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,6 @@ PHPAPI zend_result php_uri_parser_register(const uri_parser_t *uri_parser);
4949
*/
5050
PHPAPI const uri_parser_t *php_uri_get_parser(const zend_string *uri_parser_name);
5151

52-
ZEND_ATTRIBUTE_NONNULL PHPAPI uri_internal_t *php_uri_parse(const uri_parser_t *uri_parser, const char *uri_str, size_t uri_str_len, bool silent);
53-
5452
/**
5553
* Retrieves the scheme component based on the read_mode and passes it to the zv ZVAL in case of success.
5654
*
@@ -171,13 +169,6 @@ ZEND_ATTRIBUTE_NONNULL PHPAPI zend_result php_uri_get_query(const uri_internal_t
171169
*/
172170
ZEND_ATTRIBUTE_NONNULL PHPAPI zend_result php_uri_get_fragment(const uri_internal_t *internal_uri, uri_component_read_mode_t read_mode, zval *zv);
173171

174-
/**
175-
* Frees the uri member within the provided internal URI.
176-
*
177-
* @param internal_uri The internal URI
178-
*/
179-
ZEND_ATTRIBUTE_NONNULL PHPAPI void php_uri_free(uri_internal_t *internal_uri);
180-
181172
/**
182173
* Creates a new php_uri struct containing all the URI components. The components are retrieved based on the read_mode parameter.
183174
*

ext/zend_test/test.c

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -741,54 +741,60 @@ static ZEND_FUNCTION(zend_test_uri_parser)
741741
RETURN_THROWS();
742742
}
743743

744-
uri_internal_t *uri = php_uri_parse(parser, ZSTR_VAL(uri_string), ZSTR_LEN(uri_string), false);
745-
if (uri == NULL) {
744+
void *parsed = parser->parse_uri(ZSTR_VAL(uri_string), ZSTR_LEN(uri_string),
745+
/* base_url */ NULL, /* errors */ NULL, /* silent */ false);
746+
if (parsed == NULL) {
746747
RETURN_THROWS();
747748
}
748749

750+
uri_internal_t uri = {
751+
.parser = parser,
752+
.uri = parsed,
753+
};
754+
749755
zval value;
750756

751757
array_init(return_value);
752758
zval normalized;
753759
array_init(&normalized);
754-
php_uri_get_scheme(uri, URI_COMPONENT_READ_NORMALIZED_ASCII, &value);
760+
php_uri_get_scheme(&uri, URI_COMPONENT_READ_NORMALIZED_ASCII, &value);
755761
zend_hash_add(Z_ARR(normalized), ZSTR_KNOWN(ZEND_STR_SCHEME), &value);
756-
php_uri_get_username(uri, URI_COMPONENT_READ_NORMALIZED_ASCII, &value);
762+
php_uri_get_username(&uri, URI_COMPONENT_READ_NORMALIZED_ASCII, &value);
757763
zend_hash_add(Z_ARR(normalized), ZSTR_KNOWN(ZEND_STR_USERNAME), &value);
758-
php_uri_get_password(uri, URI_COMPONENT_READ_NORMALIZED_ASCII, &value);
764+
php_uri_get_password(&uri, URI_COMPONENT_READ_NORMALIZED_ASCII, &value);
759765
zend_hash_add(Z_ARR(normalized), ZSTR_KNOWN(ZEND_STR_PASSWORD), &value);
760-
php_uri_get_host(uri, URI_COMPONENT_READ_NORMALIZED_ASCII, &value);
766+
php_uri_get_host(&uri, URI_COMPONENT_READ_NORMALIZED_ASCII, &value);
761767
zend_hash_add(Z_ARR(normalized), ZSTR_KNOWN(ZEND_STR_HOST), &value);
762-
php_uri_get_port(uri, URI_COMPONENT_READ_NORMALIZED_ASCII, &value);
768+
php_uri_get_port(&uri, URI_COMPONENT_READ_NORMALIZED_ASCII, &value);
763769
zend_hash_add(Z_ARR(normalized), ZSTR_KNOWN(ZEND_STR_PORT), &value);
764-
php_uri_get_path(uri, URI_COMPONENT_READ_NORMALIZED_ASCII, &value);
770+
php_uri_get_path(&uri, URI_COMPONENT_READ_NORMALIZED_ASCII, &value);
765771
zend_hash_add(Z_ARR(normalized), ZSTR_KNOWN(ZEND_STR_PATH), &value);
766-
php_uri_get_query(uri, URI_COMPONENT_READ_NORMALIZED_ASCII, &value);
772+
php_uri_get_query(&uri, URI_COMPONENT_READ_NORMALIZED_ASCII, &value);
767773
zend_hash_add(Z_ARR(normalized), ZSTR_KNOWN(ZEND_STR_QUERY), &value);
768-
php_uri_get_fragment(uri, URI_COMPONENT_READ_NORMALIZED_ASCII, &value);
774+
php_uri_get_fragment(&uri, URI_COMPONENT_READ_NORMALIZED_ASCII, &value);
769775
zend_hash_add(Z_ARR(normalized), ZSTR_KNOWN(ZEND_STR_FRAGMENT), &value);
770776
zend_hash_str_add(Z_ARR_P(return_value), "normalized", strlen("normalized"), &normalized);
771777
zval raw;
772778
array_init(&raw);
773-
php_uri_get_scheme(uri, URI_COMPONENT_READ_RAW, &value);
779+
php_uri_get_scheme(&uri, URI_COMPONENT_READ_RAW, &value);
774780
zend_hash_add(Z_ARR(raw), ZSTR_KNOWN(ZEND_STR_SCHEME), &value);
775-
php_uri_get_username(uri, URI_COMPONENT_READ_RAW, &value);
781+
php_uri_get_username(&uri, URI_COMPONENT_READ_RAW, &value);
776782
zend_hash_add(Z_ARR(raw), ZSTR_KNOWN(ZEND_STR_USERNAME), &value);
777-
php_uri_get_password(uri, URI_COMPONENT_READ_RAW, &value);
783+
php_uri_get_password(&uri, URI_COMPONENT_READ_RAW, &value);
778784
zend_hash_add(Z_ARR(raw), ZSTR_KNOWN(ZEND_STR_PASSWORD), &value);
779-
php_uri_get_host(uri, URI_COMPONENT_READ_RAW, &value);
785+
php_uri_get_host(&uri, URI_COMPONENT_READ_RAW, &value);
780786
zend_hash_add(Z_ARR(raw), ZSTR_KNOWN(ZEND_STR_HOST), &value);
781-
php_uri_get_port(uri, URI_COMPONENT_READ_RAW, &value);
787+
php_uri_get_port(&uri, URI_COMPONENT_READ_RAW, &value);
782788
zend_hash_add(Z_ARR(raw), ZSTR_KNOWN(ZEND_STR_PORT), &value);
783-
php_uri_get_path(uri, URI_COMPONENT_READ_RAW, &value);
789+
php_uri_get_path(&uri, URI_COMPONENT_READ_RAW, &value);
784790
zend_hash_add(Z_ARR(raw), ZSTR_KNOWN(ZEND_STR_PATH), &value);
785-
php_uri_get_query(uri, URI_COMPONENT_READ_RAW, &value);
791+
php_uri_get_query(&uri, URI_COMPONENT_READ_RAW, &value);
786792
zend_hash_add(Z_ARR(raw), ZSTR_KNOWN(ZEND_STR_QUERY), &value);
787-
php_uri_get_fragment(uri, URI_COMPONENT_READ_RAW, &value);
793+
php_uri_get_fragment(&uri, URI_COMPONENT_READ_RAW, &value);
788794
zend_hash_add(Z_ARR(raw), ZSTR_KNOWN(ZEND_STR_FRAGMENT), &value);
789795
zend_hash_str_add(Z_ARR_P(return_value), "raw", strlen("raw"), &raw);
790796

791-
php_uri_free(uri);
797+
parser->free_uri(parsed);
792798
}
793799

794800
static bool has_opline(zend_execute_data *execute_data)

0 commit comments

Comments
 (0)