Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 66 additions & 25 deletions ext/uri/uri_parser_rfc3986.c
Original file line number Diff line number Diff line change
Expand Up @@ -130,12 +130,17 @@ static zend_result php_uri_parser_rfc3986_scheme_write(struct uri_internal_t *in
result = uriSetSchemeMmA(uriparser_uri, Z_STRVAL_P(value), Z_STRVAL_P(value) + Z_STRLEN_P(value), mm);
}

if (result != URI_SUCCESS) {
zend_throw_exception(uri_invalid_uri_exception_ce, "The specified scheme is malformed", 0);
return FAILURE;
switch (result) {
case URI_SUCCESS:
return SUCCESS;
case URI_ERROR_SYNTAX:
zend_throw_exception(uri_invalid_uri_exception_ce, "The specified scheme is malformed", 0);
return FAILURE;
default:
/* This should be unreachable in practice. */
zend_throw_exception(uri_invalid_uri_exception_ce, "Failed to update the scheme", 0);
return FAILURE;
}

return SUCCESS;
}

ZEND_ATTRIBUTE_NONNULL zend_result php_uri_parser_rfc3986_userinfo_read(const uri_internal_t *internal_uri, uri_component_read_mode_t read_mode, zval *retval)
Expand Down Expand Up @@ -168,9 +173,13 @@ zend_result php_uri_parser_rfc3986_userinfo_write(struct uri_internal_t *interna
case URI_ERROR_SETUSERINFO_HOST_NOT_SET:
zend_throw_exception(uri_invalid_uri_exception_ce, "Cannot set a userinfo without having a host", 0);
return FAILURE;
default:
case URI_ERROR_SYNTAX:
zend_throw_exception(uri_invalid_uri_exception_ce, "The specified userinfo is malformed", 0);
return FAILURE;
default:
/* This should be unreachable in practice. */
zend_throw_exception(uri_invalid_uri_exception_ce, "Failed to update the userinfo", 0);
return FAILURE;
}
}

Expand Down Expand Up @@ -259,9 +268,13 @@ static zend_result php_uri_parser_rfc3986_host_write(struct uri_internal_t *inte
case URI_ERROR_SETHOST_USERINFO_SET:
zend_throw_exception(uri_invalid_uri_exception_ce, "Cannot remove the host from a URI that has a userinfo", 0);
return FAILURE;
default:
case URI_ERROR_SYNTAX:
zend_throw_exception(uri_invalid_uri_exception_ce, "The specified host is malformed", 0);
return FAILURE;
default:
/* This should be unreachable in practice. */
zend_throw_exception(uri_invalid_uri_exception_ce, "Failed to update the host", 0);
return FAILURE;
}
}

Expand Down Expand Up @@ -315,9 +328,13 @@ static zend_result php_uri_parser_rfc3986_port_write(struct uri_internal_t *inte
case URI_ERROR_SETPORT_HOST_NOT_SET:
zend_throw_exception(uri_invalid_uri_exception_ce, "Cannot set a port without having a host", 0);
return FAILURE;
default:
case URI_ERROR_SYNTAX:
zend_throw_exception(uri_invalid_uri_exception_ce, "The specified port is malformed", 0);
return FAILURE;
default:
/* This should be unreachable in practice. */
zend_throw_exception(uri_invalid_uri_exception_ce, "Failed to update the port", 0);
return FAILURE;
}
}

Expand Down Expand Up @@ -360,12 +377,17 @@ static zend_result php_uri_parser_rfc3986_path_write(struct uri_internal_t *inte
result = uriSetPathMmA(uriparser_uri, Z_STRVAL_P(value), Z_STRVAL_P(value) + Z_STRLEN_P(value), mm);
}

if (result != URI_SUCCESS) {
zend_throw_exception(uri_invalid_uri_exception_ce, "The specified path is malformed", 0);
return FAILURE;
switch (result) {
case URI_SUCCESS:
return SUCCESS;
case URI_ERROR_SYNTAX:
zend_throw_exception(uri_invalid_uri_exception_ce, "The specified path is malformed", 0);
return FAILURE;
default:
/* This should be unreachable in practice. */
zend_throw_exception(uri_invalid_uri_exception_ce, "Failed to update the path", 0);
return FAILURE;
}

return SUCCESS;
}

ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_query_read(const uri_internal_t *internal_uri, uri_component_read_mode_t read_mode, zval *retval)
Expand All @@ -392,12 +414,17 @@ static zend_result php_uri_parser_rfc3986_query_write(struct uri_internal_t *int
result = uriSetQueryMmA(uriparser_uri, Z_STRVAL_P(value), Z_STRVAL_P(value) + Z_STRLEN_P(value), mm);
}

if (result != URI_SUCCESS) {
zend_throw_exception(uri_invalid_uri_exception_ce, "The specified query is malformed", 0);
return FAILURE;
switch (result) {
case URI_SUCCESS:
return SUCCESS;
case URI_ERROR_SYNTAX:
zend_throw_exception(uri_invalid_uri_exception_ce, "The specified query is malformed", 0);
return FAILURE;
default:
/* This should be unreachable in practice. */
zend_throw_exception(uri_invalid_uri_exception_ce, "Failed to update the query", 0);
return FAILURE;
}

return SUCCESS;
}

ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_parser_rfc3986_fragment_read(const uri_internal_t *internal_uri, uri_component_read_mode_t read_mode, zval *retval)
Expand All @@ -424,12 +451,17 @@ static zend_result php_uri_parser_rfc3986_fragment_write(struct uri_internal_t *
result = uriSetFragmentMmA(uriparser_uri, Z_STRVAL_P(value), Z_STRVAL_P(value) + Z_STRLEN_P(value), mm);
}

if (result != URI_SUCCESS) {
zend_throw_exception(uri_invalid_uri_exception_ce, "The specified fragment is malformed", 0);
return FAILURE;
switch (result) {
case URI_SUCCESS:
return SUCCESS;
case URI_ERROR_SYNTAX:
zend_throw_exception(uri_invalid_uri_exception_ce, "The specified fragment is malformed", 0);
return FAILURE;
default:
/* This should be unreachable in practice. */
zend_throw_exception(uri_invalid_uri_exception_ce, "Failed to update the fragment", 0);
return FAILURE;
}

return SUCCESS;
}

static php_uri_parser_rfc3986_uris *uriparser_create_uris(void)
Expand All @@ -445,9 +477,18 @@ php_uri_parser_rfc3986_uris *php_uri_parser_rfc3986_parse_ex(const char *uri_str
UriUriA uri = {0};

/* Parse the URI. */
if (uriParseSingleUriExMmA(&uri, uri_str, uri_str + uri_str_len, NULL, mm) != URI_SUCCESS) {
int result = uriParseSingleUriExMmA(&uri, uri_str, uri_str + uri_str_len, NULL, mm);
if (result != URI_SUCCESS) {
if (!silent) {
zend_throw_exception(uri_invalid_uri_exception_ce, "The specified URI is malformed", 0);
switch (result) {
case URI_ERROR_SYNTAX:
zend_throw_exception(uri_invalid_uri_exception_ce, "The specified URI is malformed", 0);
break;
default:
/* This should be unreachable in practice. */
zend_throw_exception(uri_invalid_uri_exception_ce, "Failed to parse the specified URI", 0);
break;
}
}

goto fail;
Expand Down