@@ -28,25 +28,21 @@ static inline size_t get_text_range_length(const UriTextRangeA *range)
28
28
return range -> afterLast - range -> first ;
29
29
}
30
30
31
- static UriUriA * uriparser_copy_uri (UriUriA * uriparser_uri ) // TODO add to uriparser
31
+ static UriUriA * uriparser_copy_uri (UriUriA * uriparser_uri )
32
32
{
33
+ ZEND_ASSERT (uriparser_uri != NULL );
34
+
33
35
UriUriA * new_uriparser_uri = emalloc (sizeof (UriUriA ));
34
36
35
- if (uriCopyUriA (new_uriparser_uri , uriparser_uri ) != URI_SUCCESS ) {
36
- efree (new_uriparser_uri );
37
- return NULL ; /* TODO check for null on call sites */
38
- }
37
+ int result = uriCopyUriA (new_uriparser_uri , uriparser_uri );
38
+ ZEND_ASSERT (result == URI_SUCCESS && new_uriparser_uri != NULL );
39
39
40
40
return new_uriparser_uri ;
41
41
}
42
42
43
- static zend_result uriparser_normalize_uri (UriUriA * uriparser_uri )
43
+ static void uriparser_normalize_uri (UriUriA * uriparser_uri )
44
44
{
45
- if (uriNormalizeSyntaxExA (uriparser_uri , (unsigned int )-1 ) != URI_SUCCESS ) {
46
- return FAILURE ;
47
- }
48
-
49
- return SUCCESS ;
45
+ ZEND_ASSERT (uriNormalizeSyntaxExA (uriparser_uri , (unsigned int )-1 ) == URI_SUCCESS );
50
46
}
51
47
52
48
static UriUriA * uriparser_read_uri (uriparser_uris_t * uriparser_uris , uri_component_read_mode_t read_mode )
@@ -59,13 +55,7 @@ static UriUriA *uriparser_read_uri(uriparser_uris_t *uriparser_uris, uri_compone
59
55
case URI_COMPONENT_READ_NORMALIZED_UNICODE :
60
56
if (uriparser_uris -> normalized_uri == NULL ) {
61
57
uriparser_uris -> normalized_uri = uriparser_copy_uri (uriparser_uris -> uri );
62
- if (uriparser_normalize_uri (uriparser_uris -> normalized_uri ) == FAILURE ) {
63
- uriFreeUriMembersA (uriparser_uris -> normalized_uri );
64
- efree (uriparser_uris -> normalized_uri );
65
- uriparser_uris -> normalized_uri = NULL ;
66
-
67
- return NULL ;
68
- }
58
+ uriparser_normalize_uri (uriparser_uris -> normalized_uri );
69
59
}
70
60
71
61
return uriparser_uris -> normalized_uri ;
@@ -76,9 +66,7 @@ static UriUriA *uriparser_read_uri(uriparser_uris_t *uriparser_uris, uri_compone
76
66
static zend_result uriparser_read_scheme (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
77
67
{
78
68
UriUriA * uriparser_uri = uriparser_read_uri (internal_uri -> uri , read_mode );
79
- if (UNEXPECTED (uriparser_uri == NULL )) {
80
- return FAILURE ;
81
- }
69
+ ZEND_ASSERT (uriparser_uri != NULL );
82
70
83
71
if (uriparser_uri -> scheme .first != NULL && uriparser_uri -> scheme .afterLast != NULL ) {
84
72
zend_string * str = zend_string_init (uriparser_uri -> scheme .first , get_text_range_length (& uriparser_uri -> scheme ), false);
@@ -93,9 +81,7 @@ static zend_result uriparser_read_scheme(const uri_internal_t *internal_uri, uri
93
81
zend_result uriparser_read_userinfo (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
94
82
{
95
83
UriUriA * uriparser_uri = uriparser_read_uri (internal_uri -> uri , read_mode );
96
- if (UNEXPECTED (uriparser_uri == NULL )) {
97
- return FAILURE ;
98
- }
84
+ ZEND_ASSERT (uriparser_uri != NULL );
99
85
100
86
if (uriparser_uri -> userInfo .first != NULL && uriparser_uri -> userInfo .afterLast != NULL ) {
101
87
ZVAL_STRINGL (retval , uriparser_uri -> userInfo .first , get_text_range_length (& uriparser_uri -> userInfo ));
@@ -109,9 +95,7 @@ zend_result uriparser_read_userinfo(const uri_internal_t *internal_uri, uri_comp
109
95
static zend_result uriparser_read_username (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
110
96
{
111
97
UriUriA * uriparser_uri = uriparser_read_uri (internal_uri -> uri , read_mode );
112
- if (UNEXPECTED (uriparser_uri == NULL )) {
113
- return FAILURE ;
114
- }
98
+ ZEND_ASSERT (uriparser_uri != NULL );
115
99
116
100
if (uriparser_uri -> userInfo .first != NULL && uriparser_uri -> userInfo .afterLast != NULL ) {
117
101
size_t length = get_text_range_length (& uriparser_uri -> userInfo );
@@ -134,9 +118,7 @@ static zend_result uriparser_read_username(const uri_internal_t *internal_uri, u
134
118
static zend_result uriparser_read_password (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
135
119
{
136
120
UriUriA * uriparser_uri = uriparser_read_uri (internal_uri -> uri , read_mode );
137
- if (UNEXPECTED (uriparser_uri == NULL )) {
138
- return FAILURE ;
139
- }
121
+ ZEND_ASSERT (uriparser_uri != NULL );
140
122
141
123
if (uriparser_uri -> userInfo .first != NULL && uriparser_uri -> userInfo .afterLast != NULL ) {
142
124
const char * c = memchr (uriparser_uri -> userInfo .first , ':' , get_text_range_length (& uriparser_uri -> userInfo ));
@@ -156,9 +138,7 @@ static zend_result uriparser_read_password(const uri_internal_t *internal_uri, u
156
138
static zend_result uriparser_read_host (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
157
139
{
158
140
UriUriA * uriparser_uri = uriparser_read_uri (internal_uri -> uri , read_mode );
159
- if (UNEXPECTED (uriparser_uri == NULL )) {
160
- return FAILURE ;
161
- }
141
+ ZEND_ASSERT (uriparser_uri != NULL );
162
142
163
143
if (uriparser_uri -> hostText .first != NULL && uriparser_uri -> hostText .afterLast != NULL && get_text_range_length (& uriparser_uri -> hostText ) > 0 ) {
164
144
if (uriparser_uri -> hostData .ip6 != NULL ) {
@@ -193,9 +173,7 @@ static int str_to_int(const char *str, int len)
193
173
static zend_result uriparser_read_port (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
194
174
{
195
175
UriUriA * uriparser_uri = uriparser_read_uri (internal_uri -> uri , read_mode );
196
- if (UNEXPECTED (uriparser_uri == NULL )) {
197
- return FAILURE ;
198
- }
176
+ ZEND_ASSERT (uriparser_uri != NULL );
199
177
200
178
if (uriparser_uri -> portText .first != NULL && uriparser_uri -> portText .afterLast != NULL ) {
201
179
ZVAL_LONG (retval , str_to_int (uriparser_uri -> portText .first , get_text_range_length (& uriparser_uri -> portText )));
@@ -209,9 +187,7 @@ static zend_result uriparser_read_port(const uri_internal_t *internal_uri, uri_c
209
187
static zend_result uriparser_read_path (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
210
188
{
211
189
UriUriA * uriparser_uri = uriparser_read_uri (internal_uri -> uri , read_mode );
212
- if (UNEXPECTED (uriparser_uri == NULL )) {
213
- return FAILURE ;
214
- }
190
+ ZEND_ASSERT (uriparser_uri != NULL );
215
191
216
192
if (uriparser_uri -> pathHead != NULL ) {
217
193
const UriPathSegmentA * p ;
@@ -241,9 +217,7 @@ static zend_result uriparser_read_path(const uri_internal_t *internal_uri, uri_c
241
217
static zend_result uriparser_read_query (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
242
218
{
243
219
UriUriA * uriparser_uri = uriparser_read_uri (internal_uri -> uri , read_mode );
244
- if (UNEXPECTED (uriparser_uri == NULL )) {
245
- return FAILURE ;
246
- }
220
+ ZEND_ASSERT (uriparser_uri != NULL );
247
221
248
222
if (uriparser_uri -> query .first != NULL && uriparser_uri -> query .afterLast != NULL ) {
249
223
ZVAL_STRINGL (retval , uriparser_uri -> query .first , get_text_range_length (& uriparser_uri -> query ));
@@ -257,9 +231,7 @@ static zend_result uriparser_read_query(const uri_internal_t *internal_uri, uri_
257
231
static zend_result uriparser_read_fragment (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
258
232
{
259
233
UriUriA * uriparser_uri = uriparser_read_uri (internal_uri -> uri , read_mode );
260
- if (UNEXPECTED (uriparser_uri == NULL )) {
261
- return FAILURE ;
262
- }
234
+ ZEND_ASSERT (uriparser_uri != NULL );
263
235
264
236
if (uriparser_uri -> fragment .first != NULL && uriparser_uri -> fragment .afterLast != NULL ) {
265
237
ZVAL_STRINGL (retval , uriparser_uri -> fragment .first , get_text_range_length (& uriparser_uri -> fragment ));
@@ -373,6 +345,10 @@ void *uriparser_parse_uri(const zend_string *uri_str, const void *base_url, zval
373
345
return uriparser_parse_uri_ex (uri_str , base_url , silent );
374
346
}
375
347
348
+ /* TODO make the clone handler accept a flag to distingish between clone() calls and withers.
349
+ * When calling a wither successfully, the normalized URI is surely invalidated, therefore
350
+ * it doesn't make sense to copy it. In case of failure, an exeption is thrown, and the URI object
351
+ * is discarded altogether. */
376
352
static void * uriparser_clone_uri (void * uri )
377
353
{
378
354
uriparser_uris_t * uriparser_uris = (uriparser_uris_t * ) uri ;
@@ -386,30 +362,25 @@ static void *uriparser_clone_uri(void *uri)
386
362
static zend_string * uriparser_uri_to_string (void * uri , uri_recomposition_mode_t recomposition_mode , bool exclude_fragment )
387
363
{
388
364
uriparser_uris_t * uriparser_uris = (uriparser_uris_t * ) uri ;
389
- UriUriA * uriparser_uri = uriparser_uris -> uri ;
365
+ UriUriA * uriparser_uri ;
390
366
391
- if (( recomposition_mode == URI_RECOMPOSITION_NORMALIZED_UNICODE || recomposition_mode == URI_RECOMPOSITION_NORMALIZED_ASCII ) &&
392
- uriparser_uris -> normalized_uri == NULL
393
- ) {
394
- uriparser_uris -> normalized_uri = uriparser_copy_uri ( uriparser_uris -> uri );
395
- if ( uriparser_normalize_uri ( uriparser_uris -> normalized_uri ) == FAILURE ) {
396
- return NULL ;
367
+ if (recomposition_mode == URI_RECOMPOSITION_RAW_ASCII || recomposition_mode == URI_RECOMPOSITION_RAW_UNICODE ) {
368
+ uriparser_uri = uriparser_uris -> uri ;
369
+ } else {
370
+ if ( uriparser_uris -> normalized_uri == NULL ) {
371
+ uriparser_uris -> normalized_uri = uriparser_copy_uri ( uriparser_uris -> uri );
372
+ uriparser_normalize_uri ( uriparser_uris -> normalized_uri ) ;
397
373
}
398
374
uriparser_uri = uriparser_uris -> normalized_uri ;
399
375
}
400
376
401
- int charsRequired ;
402
- if (uriToStringCharsRequiredA (uriparser_uri , & charsRequired ) != URI_SUCCESS ) {
403
- return NULL ;
404
- }
377
+ int charsRequired = 0 ;
378
+ ZEND_ASSERT (uriToStringCharsRequiredA (uriparser_uri , & charsRequired ) == URI_SUCCESS );
405
379
406
380
charsRequired ++ ;
407
381
408
382
zend_string * uri_string = zend_string_alloc (charsRequired - 1 , false);
409
- if (uriToStringA (ZSTR_VAL (uri_string ), uriparser_uri , charsRequired , NULL ) != URI_SUCCESS ) {
410
- zend_string_efree (uri_string );
411
- return NULL ;
412
- }
383
+ ZEND_ASSERT (uriToStringA (ZSTR_VAL (uri_string ), uriparser_uri , charsRequired , NULL ) == URI_SUCCESS );
413
384
414
385
if (exclude_fragment ) {
415
386
const char * pos = zend_memrchr (ZSTR_VAL (uri_string ), '#' , ZSTR_LEN (uri_string ));
0 commit comments