Coverage Report

Created: 2025-09-27 06:26

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/php-src/ext/uri/php_uri_common.c
Line
Count
Source
1
/*
2
   +----------------------------------------------------------------------+
3
   | Copyright (c) The PHP Group                                          |
4
   +----------------------------------------------------------------------+
5
   | This source file is subject to version 3.01 of the PHP license,      |
6
   | that is bundled with this package in the file LICENSE, and is        |
7
   | available through the world-wide-web at the following url:           |
8
   | https://www.php.net/license/3_01.txt                                 |
9
   | If you did not receive a copy of the PHP license and are unable to   |
10
   | obtain it through the world-wide-web, please send a note to          |
11
   | license@php.net so we can mail you a copy immediately.               |
12
   +----------------------------------------------------------------------+
13
   | Authors: Máté Kocsis <kocsismate@php.net>                            |
14
   +----------------------------------------------------------------------+
15
*/
16
17
#include "php.h"
18
#include "Zend/zend_interfaces.h"
19
#include "Zend/zend_exceptions.h"
20
#include "php_uri_common.h"
21
22
static zend_string *get_known_string_by_property_name(php_uri_property_name property_name)
23
0
{
24
0
  switch (property_name) {
25
0
    case PHP_URI_PROPERTY_NAME_SCHEME:
26
0
      return ZSTR_KNOWN(ZEND_STR_SCHEME);
27
0
    case PHP_URI_PROPERTY_NAME_USERNAME:
28
0
      return ZSTR_KNOWN(ZEND_STR_USERNAME);
29
0
    case PHP_URI_PROPERTY_NAME_PASSWORD:
30
0
      return ZSTR_KNOWN(ZEND_STR_PASSWORD);
31
0
    case PHP_URI_PROPERTY_NAME_HOST:
32
0
      return ZSTR_KNOWN(ZEND_STR_HOST);
33
0
    case PHP_URI_PROPERTY_NAME_PORT:
34
0
      return ZSTR_KNOWN(ZEND_STR_PORT);
35
0
    case PHP_URI_PROPERTY_NAME_PATH:
36
0
      return ZSTR_KNOWN(ZEND_STR_PATH);
37
0
    case PHP_URI_PROPERTY_NAME_QUERY:
38
0
      return ZSTR_KNOWN(ZEND_STR_QUERY);
39
0
    case PHP_URI_PROPERTY_NAME_FRAGMENT:
40
0
      return ZSTR_KNOWN(ZEND_STR_FRAGMENT);
41
0
    EMPTY_SWITCH_DEFAULT_CASE()
42
0
  }
43
0
}
44
45
void php_uri_property_read_helper(INTERNAL_FUNCTION_PARAMETERS, php_uri_property_name property_name, php_uri_component_read_mode component_read_mode)
46
0
{
47
0
  ZEND_PARSE_PARAMETERS_NONE();
48
49
0
  php_uri_object *uri_object = Z_URI_OBJECT_P(ZEND_THIS);
50
0
  ZEND_ASSERT(uri_object->uri != NULL);
51
52
0
  const php_uri_property_handler *property_handler = php_uri_parser_property_handler_by_name(uri_object->parser, property_name);
53
54
0
  if (UNEXPECTED(property_handler->read(uri_object->uri, component_read_mode, return_value) == FAILURE)) {
55
0
    zend_throw_exception_ex(php_uri_ce_error, 0, "The %s component cannot be retrieved", ZSTR_VAL(get_known_string_by_property_name(property_name)));
56
0
    RETURN_THROWS();
57
0
  }
58
0
}
59
60
static void php_uri_property_write_helper(INTERNAL_FUNCTION_PARAMETERS, php_uri_property_name property_name, zval *property_zv)
61
0
{
62
0
  php_uri_object *old_uri_object = Z_URI_OBJECT_P(ZEND_THIS);
63
0
  ZEND_ASSERT(old_uri_object->uri != NULL);
64
65
0
  zend_object *new_object = old_uri_object->std.handlers->clone_obj(&old_uri_object->std);
66
0
  if (new_object == NULL) {
67
0
    RETURN_THROWS();
68
0
  }
69
70
  /* Assign the object early. The engine will take care of destruction in
71
   * case of an exception being thrown. */
72
0
  RETVAL_OBJ(new_object);
73
74
0
  const php_uri_property_handler *property_handler = php_uri_parser_property_handler_by_name(old_uri_object->parser, property_name);
75
76
0
  php_uri_object *new_uri_object = php_uri_object_from_obj(new_object);
77
0
  ZEND_ASSERT(new_uri_object->uri != NULL);
78
0
  if (UNEXPECTED(property_handler->write == NULL)) {
79
0
    zend_readonly_property_modification_error_ex(ZSTR_VAL(old_uri_object->std.ce->name),
80
0
      ZSTR_VAL(get_known_string_by_property_name(property_name)));
81
0
    RETURN_THROWS();
82
0
  }
83
84
0
  zval errors;
85
0
  ZVAL_UNDEF(&errors);
86
0
  if (UNEXPECTED(property_handler->write(new_uri_object->uri, property_zv, &errors) == FAILURE)) {
87
0
    zval_ptr_dtor(&errors);
88
0
    RETURN_THROWS();
89
0
  }
90
91
0
  ZEND_ASSERT(Z_ISUNDEF(errors));
92
0
}
93
94
void php_uri_property_write_str_helper(INTERNAL_FUNCTION_PARAMETERS, php_uri_property_name property_name)
95
0
{
96
0
  zend_string *value;
97
98
0
  ZEND_PARSE_PARAMETERS_START(1, 1)
99
0
    Z_PARAM_PATH_STR(value)
100
0
  ZEND_PARSE_PARAMETERS_END();
101
102
0
  zval zv;
103
0
  ZVAL_STR(&zv, value);
104
105
0
  php_uri_property_write_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, property_name, &zv);
106
0
}
107
108
void php_uri_property_write_str_or_null_helper(INTERNAL_FUNCTION_PARAMETERS, php_uri_property_name property_name)
109
0
{
110
0
  zend_string *value;
111
112
0
  ZEND_PARSE_PARAMETERS_START(1, 1)
113
0
    Z_PARAM_PATH_STR_OR_NULL(value)
114
0
  ZEND_PARSE_PARAMETERS_END();
115
116
0
  zval zv;
117
0
  if (value == NULL) {
118
0
    ZVAL_NULL(&zv);
119
0
  } else {
120
0
    ZVAL_STR(&zv, value);
121
0
  }
122
123
0
  php_uri_property_write_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, property_name, &zv);
124
0
}
125
126
void php_uri_property_write_long_or_null_helper(INTERNAL_FUNCTION_PARAMETERS, php_uri_property_name property_name)
127
0
{
128
0
  zend_long value;
129
0
  bool value_is_null;
130
131
0
  ZEND_PARSE_PARAMETERS_START(1, 1)
132
0
    Z_PARAM_LONG_OR_NULL(value, value_is_null)
133
0
  ZEND_PARSE_PARAMETERS_END();
134
135
0
  zval zv;
136
0
  if (value_is_null) {
137
0
    ZVAL_NULL(&zv);
138
0
  } else {
139
0
    ZVAL_LONG(&zv, value);
140
0
  }
141
142
0
  php_uri_property_write_helper(INTERNAL_FUNCTION_PARAM_PASSTHRU, property_name, &zv);
143
0
}