@@ -24,6 +24,11 @@ void *uriparser_parse_uri(const zend_string *uri_str, const void *base_url, zval
24
24
static void uriparser_free_uri (void * uri );
25
25
static void throw_invalid_uri_exception (void );
26
26
27
+ static inline size_t get_text_range_length (const UriTextRangeA * range )
28
+ {
29
+ return range -> afterLast - range -> first ;
30
+ }
31
+
27
32
static void uriparser_copy_text_range (UriTextRangeA * text_range , UriTextRangeA * new_text_range , bool use_safe )
28
33
{
29
34
if (text_range -> first == NULL || text_range -> afterLast == NULL || (text_range -> first > text_range -> afterLast && !use_safe )) {
@@ -33,7 +38,7 @@ static void uriparser_copy_text_range(UriTextRangeA *text_range, UriTextRangeA *
33
38
new_text_range -> first = uriSafeToPointToA ;
34
39
new_text_range -> afterLast = uriSafeToPointToA ;
35
40
} else {
36
- size_t length = ( size_t ) ( text_range -> afterLast - text_range -> first );
41
+ size_t length = get_text_range_length ( text_range );
37
42
char * dup = emalloc (length );
38
43
memcpy (dup , text_range -> first , length );
39
44
@@ -135,8 +140,8 @@ static zend_result uriparser_read_scheme(const uri_internal_t *internal_uri, uri
135
140
}
136
141
137
142
if (uriparser_uri -> scheme .first != NULL && uriparser_uri -> scheme .afterLast != NULL ) {
138
- zend_string * str = zend_string_init (uriparser_uri -> scheme .first , uriparser_uri -> scheme . afterLast - uriparser_uri -> scheme . first , false);
139
- ZVAL_STR (retval , str );
143
+ zend_string * str = zend_string_init (uriparser_uri -> scheme .first , get_text_range_length ( & uriparser_uri -> scheme ) , false);
144
+ ZVAL_NEW_STR (retval , str );
140
145
} else {
141
146
ZVAL_NULL (retval );
142
147
}
@@ -152,7 +157,7 @@ zend_result uriparser_read_userinfo(const uri_internal_t *internal_uri, uri_comp
152
157
}
153
158
154
159
if (uriparser_uri -> userInfo .first != NULL && uriparser_uri -> userInfo .afterLast != NULL ) {
155
- ZVAL_STRINGL (retval , uriparser_uri -> userInfo .first , uriparser_uri -> userInfo . afterLast - uriparser_uri -> userInfo . first );
160
+ ZVAL_STRINGL (retval , uriparser_uri -> userInfo .first , get_text_range_length ( & uriparser_uri -> userInfo ) );
156
161
} else {
157
162
ZVAL_NULL (retval );
158
163
}
@@ -168,7 +173,7 @@ static zend_result uriparser_read_username(const uri_internal_t *internal_uri, u
168
173
}
169
174
170
175
if (uriparser_uri -> userInfo .first != NULL && uriparser_uri -> userInfo .afterLast != NULL ) {
171
- size_t length = uriparser_uri -> userInfo . afterLast - uriparser_uri -> userInfo . first ;
176
+ size_t length = get_text_range_length ( & uriparser_uri -> userInfo ) ;
172
177
char * c = memchr (uriparser_uri -> userInfo .first , ':' , length );
173
178
174
179
if (c == NULL && length > 0 ) {
@@ -193,7 +198,7 @@ static zend_result uriparser_read_password(const uri_internal_t *internal_uri, u
193
198
}
194
199
195
200
if (uriparser_uri -> userInfo .first != NULL && uriparser_uri -> userInfo .afterLast != NULL ) {
196
- const char * c = memchr (uriparser_uri -> userInfo .first , ':' , uriparser_uri -> userInfo . afterLast - uriparser_uri -> userInfo . first );
201
+ const char * c = memchr (uriparser_uri -> userInfo .first , ':' , get_text_range_length ( & uriparser_uri -> userInfo ) );
197
202
198
203
if (c != NULL && uriparser_uri -> userInfo .afterLast - c - 1 > 0 ) {
199
204
ZVAL_STRINGL (retval , c + 1 , uriparser_uri -> userInfo .afterLast - c - 1 );
@@ -214,17 +219,17 @@ static zend_result uriparser_read_host(const uri_internal_t *internal_uri, uri_c
214
219
return FAILURE ;
215
220
}
216
221
217
- if (uriparser_uri -> hostText .first != NULL && uriparser_uri -> hostText .afterLast != NULL && uriparser_uri -> hostText . afterLast - uriparser_uri -> hostText . first > 0 ) {
222
+ if (uriparser_uri -> hostText .first != NULL && uriparser_uri -> hostText .afterLast != NULL && get_text_range_length ( & uriparser_uri -> hostText ) > 0 ) {
218
223
if (uriparser_uri -> hostData .ip6 != NULL ) {
219
224
smart_str host_str = {0 };
220
225
221
226
smart_str_appendc (& host_str , '[' );
222
- smart_str_appendl (& host_str , uriparser_uri -> hostText .first , uriparser_uri -> hostText . afterLast - uriparser_uri -> hostText . first );
227
+ smart_str_appendl (& host_str , uriparser_uri -> hostText .first , get_text_range_length ( & uriparser_uri -> hostText ) );
223
228
smart_str_appendc (& host_str , ']' );
224
229
225
230
ZVAL_NEW_STR (retval , smart_str_extract (& host_str ));
226
231
} else {
227
- ZVAL_STRINGL (retval , uriparser_uri -> hostText .first , uriparser_uri -> hostText . afterLast - uriparser_uri -> hostText . first );
232
+ ZVAL_STRINGL (retval , uriparser_uri -> hostText .first , get_text_range_length ( & uriparser_uri -> hostText ) );
228
233
}
229
234
} else {
230
235
ZVAL_NULL (retval );
@@ -233,13 +238,26 @@ static zend_result uriparser_read_host(const uri_internal_t *internal_uri, uri_c
233
238
return SUCCESS ;
234
239
}
235
240
241
+ static int str_to_int (const char * str , int len )
242
+ {
243
+ int result = 0 ;
244
+
245
+ for (int i = 0 ; i < len ; ++ i ) {
246
+ result = result * 10 + (str [i ] - '0' );
247
+ }
248
+
249
+ return result ;
250
+ }
251
+
236
252
static zend_result uriparser_read_port (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
237
253
{
238
- uriparser_uris_t * uriparser_uris = (uriparser_uris_t * ) internal_uri -> uri ;
239
- UriUriA * uriparser_uri = uriparser_uris -> uri ;
254
+ UriUriA * uriparser_uri = uriparser_read_uri (internal_uri -> uri , read_mode );
255
+ if (UNEXPECTED (uriparser_uri == NULL )) {
256
+ return FAILURE ;
257
+ }
240
258
241
259
if (uriparser_uri -> portText .first != NULL && uriparser_uri -> portText .afterLast != NULL ) {
242
- ZVAL_LONG (retval , strtol (uriparser_uri -> portText .first , NULL , 10 ));
260
+ ZVAL_LONG (retval , str_to_int (uriparser_uri -> portText .first , get_text_range_length ( & uriparser_uri -> portText ) ));
243
261
} else {
244
262
ZVAL_NULL (retval );
245
263
}
@@ -262,11 +280,11 @@ static zend_result uriparser_read_path(const uri_internal_t *internal_uri, uri_c
262
280
smart_str_appendc (& str , '/' );
263
281
}
264
282
265
- smart_str_appendl (& str , uriparser_uri -> pathHead -> text .first , ( size_t ) (( uriparser_uri -> pathHead -> text ). afterLast - ( uriparser_uri -> pathHead -> text ). first ));
283
+ smart_str_appendl (& str , uriparser_uri -> pathHead -> text .first , get_text_range_length ( & uriparser_uri -> pathHead -> text ));
266
284
267
285
for (p = uriparser_uri -> pathHead -> next ; p != NULL ; p = p -> next ) {
268
286
smart_str_appendc (& str , '/' );
269
- smart_str_appendl (& str , p -> text .first , ( int ) (( p -> text ). afterLast - ( p -> text ). first ));
287
+ smart_str_appendl (& str , p -> text .first , get_text_range_length ( & p -> text ));
270
288
}
271
289
272
290
ZVAL_NEW_STR (retval , smart_str_extract (& str ));
@@ -287,7 +305,7 @@ static zend_result uriparser_read_query(const uri_internal_t *internal_uri, uri_
287
305
}
288
306
289
307
if (uriparser_uri -> query .first != NULL && uriparser_uri -> query .afterLast != NULL ) {
290
- ZVAL_STRINGL (retval , uriparser_uri -> query .first , uriparser_uri -> query . afterLast - uriparser_uri -> query . first );
308
+ ZVAL_STRINGL (retval , uriparser_uri -> query .first , get_text_range_length ( & uriparser_uri -> query ) );
291
309
} else {
292
310
ZVAL_NULL (retval );
293
311
}
@@ -303,7 +321,7 @@ static zend_result uriparser_read_fragment(const uri_internal_t *internal_uri, u
303
321
}
304
322
305
323
if (uriparser_uri -> fragment .first != NULL && uriparser_uri -> fragment .afterLast != NULL ) {
306
- ZVAL_STRINGL (retval , uriparser_uri -> fragment .first , uriparser_uri -> fragment . afterLast - uriparser_uri -> fragment . first );
324
+ ZVAL_STRINGL (retval , uriparser_uri -> fragment .first , get_text_range_length ( & uriparser_uri -> fragment ) );
307
325
} else {
308
326
ZVAL_NULL (retval );
309
327
}
@@ -336,13 +354,19 @@ static void uriparser_free(UriMemoryManager *memory_manager, void *ptr)
336
354
efree (ptr );
337
355
}
338
356
339
- void uriparser_module_init ( void )
357
+ PHP_MINIT_FUNCTION ( uri_uriparser )
340
358
{
359
+ if (uri_handler_register (& uriparser_uri_handler ) == FAILURE ) {
360
+ return FAILURE ;
361
+ }
362
+
341
363
defaultMemoryManager .malloc = uriparser_malloc ;
342
364
defaultMemoryManager .calloc = uriparser_calloc ;
343
365
defaultMemoryManager .realloc = uriparser_realloc ;
344
366
defaultMemoryManager .reallocarray = uriparser_reallocarray ;
345
367
defaultMemoryManager .free = uriparser_free ;
368
+
369
+ return SUCCESS ;
346
370
}
347
371
348
372
static uriparser_uris_t * uriparser_create_uris (
0 commit comments