23
23
#include <arpa/inet.h>
24
24
#endif
25
25
26
- static void * lexbor_parse_uri (const zend_string * uri_str , const void * base_url , zval * errors );
27
- static void lexbor_create_invalid_uri_exception (zval * exception_zv , zval * errors );
28
- static void * lexbor_clone_uri (void * uri );
29
- static zend_string * lexbor_uri_to_string (void * uri , uri_recomposition_mode_t recomposition_mode , bool exclude_fragment );
30
- static void lexbor_free_uri (void * uri );
31
-
32
- static HashTable lexbor_property_handlers ;
33
-
34
26
ZEND_TLS lxb_url_parser_t * lexbor_parser ;
35
27
ZEND_TLS int lexbor_urls ;
36
28
37
- const uri_handler_t lexbor_uri_handler = {
38
- URI_PARSER_WHATWG ,
39
- lexbor_parse_uri ,
40
- lexbor_create_invalid_uri_exception ,
41
- lexbor_clone_uri ,
42
- lexbor_uri_to_string ,
43
- lexbor_free_uri ,
44
- & lexbor_property_handlers
45
- };
46
-
47
- #define MAX_URL_COUNT 500
29
+ #define LEXBOR_MAX_URL_COUNT 500
30
+ #define LEXBOR_MRAW_BYTE_SIZE 8192
48
31
49
32
#define ZVAL_STRING_OR_NULL_TO_LEXBOR_STR (value , str ) do { \
50
33
if (Z_TYPE_P(value) == IS_STRING && Z_STRLEN_P(value) > 0) { \
51
- lexbor_str_init_append(&str, lexbor_parser->mraw, (const lxb_char_t *) Z_STRVAL_P(value), Z_STRLEN_P(value)); \
34
+ str.data = (lxb_char_t *) Z_STRVAL_P(value); \
35
+ str.length = Z_STRLEN_P(value); \
52
36
} else { \
53
37
ZEND_ASSERT(Z_ISNULL_P(value) || (Z_TYPE_P(value) == IS_STRING && Z_STRLEN_P(value) == 0)); \
54
- lexbor_str_init(&str, lexbor_parser->mraw, 0); \
38
+ str.data = (lxb_char_t *) ""; \
39
+ str.length = 0; \
55
40
} \
56
41
} while (0)
57
42
58
43
#define ZVAL_LONG_OR_NULL_TO_LEXBOR_STR (value , str ) do { \
59
44
if (Z_TYPE_P(value) == IS_LONG) { \
60
45
ZVAL_STR(value, zend_long_to_str(Z_LVAL_P(value))); \
61
46
lexbor_str_init_append(&str, lexbor_parser->mraw, (const lxb_char_t *) Z_STRVAL_P(value), Z_STRLEN_P(value)); \
62
- zval_ptr_dtor (value); \
47
+ zval_ptr_dtor_str (value); \
63
48
} else { \
64
49
ZEND_ASSERT(Z_ISNULL_P(value)); \
65
- lexbor_str_init(&str, lexbor_parser->mraw, 0); \
50
+ str.data = (lxb_char_t *) ""; \
51
+ str.length = 0; \
66
52
} \
67
53
} while (0)
68
54
69
- #define LEXBOR_READ_ASCII_URI_COMPONENT (start , len , read_mode , retval ) do { \
55
+ #define LEXBOR_READ_ASCII_URI_COMPONENT (start , len , retval ) do { \
70
56
ZVAL_STRINGL(retval, (const char *) start, len); \
71
57
} while (0)
72
58
73
59
static void lexbor_cleanup_parser (void )
74
60
{
75
- if (++ lexbor_urls % MAX_URL_COUNT == 0 ) {
61
+ if (++ lexbor_urls % LEXBOR_MAX_URL_COUNT == 0 ) {
76
62
lexbor_mraw_clean (lexbor_parser -> mraw );
77
63
}
78
64
@@ -246,7 +232,7 @@ static lxb_status_t lexbor_serialize_callback(const lxb_char_t *data, size_t len
246
232
return LXB_STATUS_OK ;
247
233
}
248
234
249
- static zend_result lexbor_read_scheme (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
235
+ static zend_result lexbor_read_scheme (const struct uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
250
236
{
251
237
lxb_url_t * lexbor_uri = internal_uri -> uri ;
252
238
@@ -257,7 +243,7 @@ static zend_result lexbor_read_scheme(const uri_internal_t *internal_uri, uri_co
257
243
return SUCCESS ;
258
244
}
259
245
260
- static zend_result lexbor_write_scheme (uri_internal_t * internal_uri , zval * value , zval * errors )
246
+ static zend_result lexbor_write_scheme (struct uri_internal_t * internal_uri , zval * value , zval * errors )
261
247
{
262
248
lxb_url_t * lexbor_uri = internal_uri -> uri ;
263
249
lexbor_str_t str = {0 };
@@ -273,12 +259,12 @@ static zend_result lexbor_write_scheme(uri_internal_t *internal_uri, zval *value
273
259
return SUCCESS ;
274
260
}
275
261
276
- static zend_result lexbor_read_username (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
262
+ static zend_result lexbor_read_username (const struct uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
277
263
{
278
264
lxb_url_t * lexbor_uri = internal_uri -> uri ;
279
265
280
266
if (lexbor_uri -> username .length ) {
281
- LEXBOR_READ_ASCII_URI_COMPONENT (lexbor_uri -> username .data , lexbor_uri -> username .length , read_mode , retval );
267
+ LEXBOR_READ_ASCII_URI_COMPONENT (lexbor_uri -> username .data , lexbor_uri -> username .length , retval );
282
268
} else {
283
269
ZVAL_NULL (retval );
284
270
}
@@ -302,20 +288,20 @@ static zend_result lexbor_write_username(uri_internal_t *internal_uri, zval *val
302
288
return SUCCESS ;
303
289
}
304
290
305
- static zend_result lexbor_read_password (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
291
+ static zend_result lexbor_read_password (const struct uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
306
292
{
307
293
lxb_url_t * lexbor_uri = internal_uri -> uri ;
308
294
309
295
if (lexbor_uri -> password .length > 0 ) {
310
- LEXBOR_READ_ASCII_URI_COMPONENT (lexbor_uri -> password .data , lexbor_uri -> password .length , read_mode , retval );
296
+ LEXBOR_READ_ASCII_URI_COMPONENT (lexbor_uri -> password .data , lexbor_uri -> password .length , retval );
311
297
} else {
312
298
ZVAL_NULL (retval );
313
299
}
314
300
315
301
return SUCCESS ;
316
302
}
317
303
318
- static zend_result lexbor_write_password (uri_internal_t * internal_uri , zval * value , zval * errors )
304
+ static zend_result lexbor_write_password (struct uri_internal_t * internal_uri , zval * value , zval * errors )
319
305
{
320
306
lxb_url_t * lexbor_uri = internal_uri -> uri ;
321
307
lexbor_str_t str = {0 };
@@ -342,7 +328,7 @@ static ZEND_RESULT_CODE init_idna(void)
342
328
return lxb_unicode_idna_init (lexbor_parser -> idna ) == LXB_STATUS_OK ? SUCCESS : FAILURE ;
343
329
}
344
330
345
- static zend_result lexbor_read_host (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
331
+ static zend_result lexbor_read_host (const struct uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
346
332
{
347
333
lxb_url_t * lexbor_uri = internal_uri -> uri ;
348
334
@@ -387,7 +373,7 @@ static zend_result lexbor_read_host(const uri_internal_t *internal_uri, uri_comp
387
373
return SUCCESS ;
388
374
}
389
375
390
- static zend_result lexbor_write_host (uri_internal_t * internal_uri , zval * value , zval * errors )
376
+ static zend_result lexbor_write_host (struct uri_internal_t * internal_uri , zval * value , zval * errors )
391
377
{
392
378
lxb_url_t * lexbor_uri = internal_uri -> uri ;
393
379
lexbor_str_t str = {0 };
@@ -403,7 +389,7 @@ static zend_result lexbor_write_host(uri_internal_t *internal_uri, zval *value,
403
389
return SUCCESS ;
404
390
}
405
391
406
- static zend_result lexbor_read_port (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
392
+ static zend_result lexbor_read_port (const struct uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
407
393
{
408
394
lxb_url_t * lexbor_uri = internal_uri -> uri ;
409
395
@@ -416,7 +402,7 @@ static zend_result lexbor_read_port(const uri_internal_t *internal_uri, uri_comp
416
402
return SUCCESS ;
417
403
}
418
404
419
- static zend_result lexbor_write_port (uri_internal_t * internal_uri , zval * value , zval * errors )
405
+ static zend_result lexbor_write_port (struct uri_internal_t * internal_uri , zval * value , zval * errors )
420
406
{
421
407
lxb_url_t * lexbor_uri = internal_uri -> uri ;
422
408
lexbor_str_t str = {0 };
@@ -432,20 +418,20 @@ static zend_result lexbor_write_port(uri_internal_t *internal_uri, zval *value,
432
418
return SUCCESS ;
433
419
}
434
420
435
- static zend_result lexbor_read_path (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
421
+ static zend_result lexbor_read_path (const struct uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
436
422
{
437
423
lxb_url_t * lexbor_uri = internal_uri -> uri ;
438
424
439
425
if (lexbor_uri -> path .str .length ) {
440
- LEXBOR_READ_ASCII_URI_COMPONENT (lexbor_uri -> path .str .data , lexbor_uri -> path .str .length , read_mode , retval );
426
+ LEXBOR_READ_ASCII_URI_COMPONENT (lexbor_uri -> path .str .data , lexbor_uri -> path .str .length , retval );
441
427
} else {
442
428
ZVAL_EMPTY_STRING (retval );
443
429
}
444
430
445
431
return SUCCESS ;
446
432
}
447
433
448
- static zend_result lexbor_write_path (uri_internal_t * internal_uri , zval * value , zval * errors )
434
+ static zend_result lexbor_write_path (struct uri_internal_t * internal_uri , zval * value , zval * errors )
449
435
{
450
436
lxb_url_t * lexbor_uri = internal_uri -> uri ;
451
437
lexbor_str_t str = {0 };
@@ -461,20 +447,20 @@ static zend_result lexbor_write_path(uri_internal_t *internal_uri, zval *value,
461
447
return SUCCESS ;
462
448
}
463
449
464
- static zend_result lexbor_read_query (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
450
+ static zend_result lexbor_read_query (const struct uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
465
451
{
466
452
lxb_url_t * lexbor_uri = internal_uri -> uri ;
467
453
468
454
if (lexbor_uri -> query .length ) {
469
- LEXBOR_READ_ASCII_URI_COMPONENT (lexbor_uri -> query .data , lexbor_uri -> query .length , read_mode , retval );
455
+ LEXBOR_READ_ASCII_URI_COMPONENT (lexbor_uri -> query .data , lexbor_uri -> query .length , retval );
470
456
} else {
471
457
ZVAL_NULL (retval );
472
458
}
473
459
474
460
return SUCCESS ;
475
461
}
476
462
477
- static zend_result lexbor_write_query (uri_internal_t * internal_uri , zval * value , zval * errors )
463
+ static zend_result lexbor_write_query (struct uri_internal_t * internal_uri , zval * value , zval * errors )
478
464
{
479
465
lxb_url_t * lexbor_uri = internal_uri -> uri ;
480
466
lexbor_str_t str = {0 };
@@ -490,20 +476,20 @@ static zend_result lexbor_write_query(uri_internal_t *internal_uri, zval *value,
490
476
return SUCCESS ;
491
477
}
492
478
493
- static zend_result lexbor_read_fragment (const uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
479
+ static zend_result lexbor_read_fragment (const struct uri_internal_t * internal_uri , uri_component_read_mode_t read_mode , zval * retval )
494
480
{
495
481
lxb_url_t * lexbor_uri = internal_uri -> uri ;
496
482
497
483
if (lexbor_uri -> fragment .length ) {
498
- LEXBOR_READ_ASCII_URI_COMPONENT (lexbor_uri -> fragment .data , lexbor_uri -> fragment .length , read_mode , retval );
484
+ LEXBOR_READ_ASCII_URI_COMPONENT (lexbor_uri -> fragment .data , lexbor_uri -> fragment .length , retval );
499
485
} else {
500
486
ZVAL_NULL (retval );
501
487
}
502
488
503
489
return SUCCESS ;
504
490
}
505
491
506
- static zend_result lexbor_write_fragment (uri_internal_t * internal_uri , zval * value , zval * errors )
492
+ static zend_result lexbor_write_fragment (struct uri_internal_t * internal_uri , zval * value , zval * errors )
507
493
{
508
494
lxb_url_t * lexbor_uri = internal_uri -> uri ;
509
495
lexbor_str_t str = {0 };
@@ -519,29 +505,10 @@ static zend_result lexbor_write_fragment(uri_internal_t *internal_uri, zval *val
519
505
return SUCCESS ;
520
506
}
521
507
522
- void lexbor_module_init (void )
523
- {
524
- zend_hash_init (& lexbor_property_handlers , 8 , NULL , NULL , true);
525
-
526
- URI_REGISTER_PROPERTY_READ_WRITE_HANDLER (& lexbor_property_handlers , ZSTR_KNOWN (ZEND_STR_SCHEME ), lexbor_read_scheme , lexbor_write_scheme );
527
- URI_REGISTER_PROPERTY_READ_WRITE_HANDLER (& lexbor_property_handlers , ZSTR_KNOWN (ZEND_STR_USERNAME ), lexbor_read_username , lexbor_write_username );
528
- URI_REGISTER_PROPERTY_READ_WRITE_HANDLER (& lexbor_property_handlers , ZSTR_KNOWN (ZEND_STR_PASSWORD ), lexbor_read_password , lexbor_write_password );
529
- URI_REGISTER_PROPERTY_READ_WRITE_HANDLER (& lexbor_property_handlers , ZSTR_KNOWN (ZEND_STR_HOST ), lexbor_read_host , lexbor_write_host );
530
- URI_REGISTER_PROPERTY_READ_WRITE_HANDLER (& lexbor_property_handlers , ZSTR_KNOWN (ZEND_STR_PORT ), lexbor_read_port , lexbor_write_port );
531
- URI_REGISTER_PROPERTY_READ_WRITE_HANDLER (& lexbor_property_handlers , ZSTR_KNOWN (ZEND_STR_PATH ), lexbor_read_path , lexbor_write_path );
532
- URI_REGISTER_PROPERTY_READ_WRITE_HANDLER (& lexbor_property_handlers , ZSTR_KNOWN (ZEND_STR_QUERY ), lexbor_read_query , lexbor_write_query );
533
- URI_REGISTER_PROPERTY_READ_WRITE_HANDLER (& lexbor_property_handlers , ZSTR_KNOWN (ZEND_STR_FRAGMENT ), lexbor_read_fragment , lexbor_write_fragment );
534
- }
535
-
536
- void lexbor_module_shutdown (void )
537
- {
538
- zend_hash_destroy (& lexbor_property_handlers );
539
- }
540
-
541
508
zend_result lexbor_request_init (void )
542
509
{
543
510
lexbor_mraw_t * mraw = lexbor_mraw_create ();
544
- lxb_status_t status = lexbor_mraw_init (mraw , 4096 * 2 );
511
+ lxb_status_t status = lexbor_mraw_init (mraw , LEXBOR_MRAW_BYTE_SIZE );
545
512
if (status != LXB_STATUS_OK ) {
546
513
lexbor_mraw_destroy (mraw , true);
547
514
return FAILURE ;
@@ -588,7 +555,7 @@ static void lexbor_create_invalid_uri_exception(zval *exception_zv, zval *errors
588
555
zval value ;
589
556
ZVAL_STRING (& value , "URL parsing failed" );
590
557
zend_update_property_ex (uri_whatwg_invalid_url_exception_ce , Z_OBJ_P (exception_zv ), ZSTR_KNOWN (ZEND_STR_MESSAGE ), & value );
591
- zval_ptr_dtor (& value );
558
+ zval_ptr_dtor_str (& value );
592
559
593
560
zend_update_property (uri_whatwg_invalid_url_exception_ce , Z_OBJ_P (exception_zv ), ZEND_STRL ("errors" ), errors );
594
561
}
@@ -629,3 +596,22 @@ static zend_string *lexbor_uri_to_string(void *uri, uri_recomposition_mode_t rec
629
596
static void lexbor_free_uri (void * uri )
630
597
{
631
598
}
599
+
600
+ const uri_handler_t lexbor_uri_handler = {
601
+ .name = URI_PARSER_WHATWG ,
602
+ .parse_uri = lexbor_parse_uri ,
603
+ .create_invalid_uri_exception = lexbor_create_invalid_uri_exception ,
604
+ .clone_uri = lexbor_clone_uri ,
605
+ .uri_to_string = lexbor_uri_to_string ,
606
+ .free_uri = lexbor_free_uri ,
607
+ {
608
+ .scheme = {.read_func = lexbor_read_scheme , .write_func = lexbor_write_scheme },
609
+ .username = {.read_func = lexbor_read_username , .write_func = lexbor_write_username },
610
+ .password = {.read_func = lexbor_read_password , .write_func = lexbor_write_password },
611
+ .host = {.read_func = lexbor_read_host , .write_func = lexbor_write_host },
612
+ .port = {.read_func = lexbor_read_port , .write_func = lexbor_write_port },
613
+ .path = {.read_func = lexbor_read_path , .write_func = lexbor_write_path },
614
+ .query = {.read_func = lexbor_read_query , .write_func = lexbor_write_query },
615
+ .fragment = {.read_func = lexbor_read_fragment , .write_func = lexbor_write_fragment },
616
+ }
617
+ };
0 commit comments