Skip to content

Commit 72c5568

Browse files
committed
uri: Streamline implementation of uriparser_parse_uri_ex()
Avoid the use of a macro and streamline the logic.
1 parent a8a3c81 commit 72c5568

File tree

1 file changed

+34
-30
lines changed

1 file changed

+34
-30
lines changed

ext/uri/php_uriparser.c

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -297,47 +297,51 @@ static void throw_invalid_uri_exception(void)
297297
{
298298
zend_throw_exception(uri_invalid_uri_exception_ce, "The specified URI is malformed", 0);
299299
}
300-
301-
#define PARSE_URI(dest_uri, uri_str, uriparser_uris, silent) \
302-
do { \
303-
if (ZSTR_LEN(uri_str) == 0 || \
304-
uriParseSingleUriExMmA(dest_uri, ZSTR_VAL(uri_str), ZSTR_VAL(uri_str) + ZSTR_LEN(uri_str), NULL, mm) != URI_SUCCESS \
305-
) { \
306-
efree(uriparser_uris); \
307-
if (!silent) { \
308-
throw_invalid_uri_exception(); \
309-
} \
310-
return NULL; \
311-
} \
312-
} while (0)
313-
314300
void *uriparser_parse_uri_ex(const zend_string *uri_str, const uriparser_uris_t *uriparser_base_urls, bool silent)
315301
{
316-
uriparser_uris_t *uriparser_uris = uriparser_create_uris();
317-
318-
if (uriparser_base_urls == NULL) {
319-
PARSE_URI(&uriparser_uris->uri, uri_str, uriparser_uris, silent);
320-
uriMakeOwnerMmA(&uriparser_uris->uri, mm);
321-
} else {
322-
UriUriA uri;
302+
UriUriA uri = {0};
323303

324-
PARSE_URI(&uri, uri_str, uriparser_uris, silent);
304+
/* Empty URIs are always invalid. */
305+
if (ZSTR_LEN(uri_str) == 0) {
306+
goto fail;
307+
}
308+
309+
/* Parse the URI. */
310+
if (uriParseSingleUriExMmA(&uri, ZSTR_VAL(uri_str), ZSTR_VAL(uri_str) + ZSTR_LEN(uri_str), NULL, mm) != URI_SUCCESS) {
311+
goto fail;
312+
}
325313

326-
if (uriAddBaseUriExMmA(&uriparser_uris->uri, &uri, &uriparser_base_urls->uri, URI_RESOLVE_STRICTLY, mm) != URI_SUCCESS) {
327-
efree(uriparser_uris);
328-
uriFreeUriMembersMmA(&uri, mm);
329-
if (!silent) {
330-
throw_invalid_uri_exception();
331-
}
314+
if (uriparser_base_urls != NULL) {
315+
UriUriA tmp = {0};
332316

333-
return NULL;
317+
/* Combine the parsed URI with the base URI and store the result in 'tmp',
318+
* since the target and source URLs must be distinct. */
319+
if (uriAddBaseUriExMmA(&tmp, &uri, &uriparser_base_urls->uri, URI_RESOLVE_STRICTLY, mm) != URI_SUCCESS) {
320+
goto fail;
334321
}
335322

336-
uriMakeOwnerMmA(&uriparser_uris->uri, mm);
323+
/* Store the combined URI back into 'uri'. */
337324
uriFreeUriMembersMmA(&uri, mm);
325+
uri = tmp;
338326
}
339327

328+
/* Make the resulting URI independent of the 'uri_str'. */
329+
uriMakeOwnerMmA(&uri, mm);
330+
331+
uriparser_uris_t *uriparser_uris = uriparser_create_uris();
332+
uriparser_uris->uri = uri;
333+
340334
return uriparser_uris;
335+
336+
fail:
337+
338+
uriFreeUriMembersA(&uri);
339+
340+
if (!silent) {
341+
throw_invalid_uri_exception();
342+
}
343+
344+
return NULL;
341345
}
342346

343347
void *uriparser_parse_uri(const zend_string *uri_str, const void *base_url, zval *errors, bool silent)

0 commit comments

Comments
 (0)