Skip to content
Merged
Show file tree
Hide file tree
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
26 changes: 8 additions & 18 deletions ext/uri/php_uri.c
Original file line number Diff line number Diff line change
Expand Up @@ -124,54 +124,44 @@ ZEND_ATTRIBUTE_NONNULL PHPAPI uri_internal_t *php_uri_parse(const php_uri_parser
return internal_uri;
}

ZEND_ATTRIBUTE_NONNULL static zend_result php_uri_get_property(const uri_internal_t *internal_uri, php_uri_property_name property_name, php_uri_component_read_mode read_mode, zval *zv)
{
const php_uri_property_handler *property_handler = uri_property_handler_from_internal_uri(internal_uri, property_name);
if (property_handler == NULL) {
return FAILURE;
}

return property_handler->read(internal_uri->uri, read_mode, zv);
}

ZEND_ATTRIBUTE_NONNULL PHPAPI zend_result php_uri_get_scheme(const uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *zv)
{
return php_uri_get_property(internal_uri, PHP_URI_PROPERTY_NAME_SCHEME, read_mode, zv);
return internal_uri->parser->property_handler.scheme.read(internal_uri->uri, read_mode, zv);
}

ZEND_ATTRIBUTE_NONNULL PHPAPI zend_result php_uri_get_username(const uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *zv)
{
return php_uri_get_property(internal_uri, PHP_URI_PROPERTY_NAME_USERNAME, read_mode, zv);
return internal_uri->parser->property_handler.username.read(internal_uri->uri, read_mode, zv);
}

ZEND_ATTRIBUTE_NONNULL PHPAPI zend_result php_uri_get_password(const uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *zv)
{
return php_uri_get_property(internal_uri, PHP_URI_PROPERTY_NAME_PASSWORD, read_mode, zv);
return internal_uri->parser->property_handler.password.read(internal_uri->uri, read_mode, zv);
}

ZEND_ATTRIBUTE_NONNULL PHPAPI zend_result php_uri_get_host(const uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *zv)
{
return php_uri_get_property(internal_uri, PHP_URI_PROPERTY_NAME_HOST, read_mode, zv);
return internal_uri->parser->property_handler.host.read(internal_uri->uri, read_mode, zv);
}

ZEND_ATTRIBUTE_NONNULL PHPAPI zend_result php_uri_get_port(const uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *zv)
{
return php_uri_get_property(internal_uri, PHP_URI_PROPERTY_NAME_PORT, read_mode, zv);
return internal_uri->parser->property_handler.port.read(internal_uri->uri, read_mode, zv);
}

ZEND_ATTRIBUTE_NONNULL PHPAPI zend_result php_uri_get_path(const uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *zv)
{
return php_uri_get_property(internal_uri, PHP_URI_PROPERTY_NAME_PATH, read_mode, zv);
return internal_uri->parser->property_handler.path.read(internal_uri->uri, read_mode, zv);
}

ZEND_ATTRIBUTE_NONNULL PHPAPI zend_result php_uri_get_query(const uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *zv)
{
return php_uri_get_property(internal_uri, PHP_URI_PROPERTY_NAME_QUERY, read_mode, zv);
return internal_uri->parser->property_handler.query.read(internal_uri->uri, read_mode, zv);
}

ZEND_ATTRIBUTE_NONNULL PHPAPI zend_result php_uri_get_fragment(const uri_internal_t *internal_uri, php_uri_component_read_mode read_mode, zval *zv)
{
return php_uri_get_property(internal_uri, PHP_URI_PROPERTY_NAME_FRAGMENT, read_mode, zv);
return internal_uri->parser->property_handler.fragment.read(internal_uri->uri, read_mode, zv);
}

ZEND_ATTRIBUTE_NONNULL PHPAPI void php_uri_free(uri_internal_t *internal_uri)
Expand Down
29 changes: 2 additions & 27 deletions ext/uri/php_uri_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,29 +19,6 @@
#include "Zend/zend_exceptions.h"
#include "php_uri_common.h"

const php_uri_property_handler *uri_property_handler_from_internal_uri(const uri_internal_t *internal_uri, php_uri_property_name property_name)
{
switch (property_name) {
case PHP_URI_PROPERTY_NAME_SCHEME:
return &internal_uri->parser->property_handler.scheme;
case PHP_URI_PROPERTY_NAME_USERNAME:
return &internal_uri->parser->property_handler.username;
case PHP_URI_PROPERTY_NAME_PASSWORD:
return &internal_uri->parser->property_handler.password;
case PHP_URI_PROPERTY_NAME_HOST:
return &internal_uri->parser->property_handler.host;
case PHP_URI_PROPERTY_NAME_PORT:
return &internal_uri->parser->property_handler.port;
case PHP_URI_PROPERTY_NAME_PATH:
return &internal_uri->parser->property_handler.path;
case PHP_URI_PROPERTY_NAME_QUERY:
return &internal_uri->parser->property_handler.query;
case PHP_URI_PROPERTY_NAME_FRAGMENT:
return &internal_uri->parser->property_handler.fragment;
EMPTY_SWITCH_DEFAULT_CASE()
}
}

static zend_string *get_known_string_by_property_name(php_uri_property_name property_name)
{
switch (property_name) {
Expand Down Expand Up @@ -72,8 +49,7 @@ void uri_read_component(INTERNAL_FUNCTION_PARAMETERS, php_uri_property_name prop
uri_internal_t *internal_uri = Z_URI_INTERNAL_P(ZEND_THIS);
URI_ASSERT_INITIALIZATION(internal_uri);

const php_uri_property_handler *property_handler = uri_property_handler_from_internal_uri(internal_uri, property_name);
ZEND_ASSERT(property_handler != NULL);
const php_uri_property_handler *property_handler = php_uri_parser_property_handler_by_name(internal_uri->parser, property_name);

if (UNEXPECTED(property_handler->read(internal_uri->uri, component_read_mode, return_value) == FAILURE)) {
zend_throw_error(NULL, "The %s component cannot be retrieved", ZSTR_VAL(get_known_string_by_property_name(property_name)));
Expand All @@ -96,8 +72,7 @@ static void uri_write_component_ex(INTERNAL_FUNCTION_PARAMETERS, php_uri_propert
* case of an exception being thrown. */
RETVAL_OBJ(new_object);

const php_uri_property_handler *property_handler = uri_property_handler_from_internal_uri(internal_uri, property_name);
ZEND_ASSERT(property_handler != NULL);
const php_uri_property_handler *property_handler = php_uri_parser_property_handler_by_name(internal_uri->parser, property_name);

uri_internal_t *new_internal_uri = uri_internal_from_obj(new_object);
URI_ASSERT_INITIALIZATION(new_internal_uri);
Expand Down
24 changes: 23 additions & 1 deletion ext/uri/php_uri_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,29 @@ PHPAPI zend_object *php_uri_object_handler_clone(zend_object *object);
#define PHP_URI_PARSER_PHP_PARSE_URL "parse_url"
#define URI_SERIALIZED_PROPERTY_NAME "uri"

const php_uri_property_handler *uri_property_handler_from_internal_uri(const uri_internal_t *internal_uri, php_uri_property_name property_name);
static inline const php_uri_property_handler *php_uri_parser_property_handler_by_name(const php_uri_parser *parser, php_uri_property_name property_name)
{
switch (property_name) {
case PHP_URI_PROPERTY_NAME_SCHEME:
return &parser->property_handler.scheme;
case PHP_URI_PROPERTY_NAME_USERNAME:
return &parser->property_handler.username;
case PHP_URI_PROPERTY_NAME_PASSWORD:
return &parser->property_handler.password;
case PHP_URI_PROPERTY_NAME_HOST:
return &parser->property_handler.host;
case PHP_URI_PROPERTY_NAME_PORT:
return &parser->property_handler.port;
case PHP_URI_PROPERTY_NAME_PATH:
return &parser->property_handler.path;
case PHP_URI_PROPERTY_NAME_QUERY:
return &parser->property_handler.query;
case PHP_URI_PROPERTY_NAME_FRAGMENT:
return &parser->property_handler.fragment;
EMPTY_SWITCH_DEFAULT_CASE()
}
}

void uri_read_component(INTERNAL_FUNCTION_PARAMETERS, php_uri_property_name property_name, php_uri_component_read_mode component_read_mode);
void uri_write_component_str(INTERNAL_FUNCTION_PARAMETERS, php_uri_property_name property_name);
void uri_write_component_str_or_null(INTERNAL_FUNCTION_PARAMETERS, php_uri_property_name property_name);
Expand Down