@@ -596,6 +596,34 @@ static void sapi_cli_server_register_variable(zval *track_vars_array, const char
596
596
}
597
597
} /* }}} */
598
598
599
+ static void sapi_cli_server_register_known_var_char (zval * track_vars_array ,
600
+ const char * var_name , size_t var_name_len , const char * value , size_t value_len )
601
+ {
602
+ zval new_entry ;
603
+
604
+ if (!value ) {
605
+ return ;
606
+ }
607
+
608
+ ZVAL_STRINGL_FAST (& new_entry , value , value_len );
609
+
610
+ php_register_known_variable (var_name , var_name_len , & new_entry , track_vars_array );
611
+ }
612
+
613
+ static void sapi_cli_server_register_known_var_str (zval * track_vars_array ,
614
+ const char * var_name , size_t var_name_len , /* const */ zend_string * value )
615
+ {
616
+ zval new_entry ;
617
+
618
+ if (!value ) {
619
+ return ;
620
+ }
621
+
622
+ ZVAL_STR_COPY (& new_entry , value );
623
+
624
+ php_register_known_variable (var_name , var_name_len , & new_entry , track_vars_array );
625
+ }
626
+
599
627
/* The entry zval will always contain a zend_string* */
600
628
static int sapi_cli_server_register_entry_cb (zval * entry , int num_args , va_list args , zend_hash_key * hash_key ) /* {{{ */ {
601
629
zval * track_vars_array = va_arg (args , zval * );
@@ -615,7 +643,7 @@ static int sapi_cli_server_register_entry_cb(zval *entry, int num_args, va_list
615
643
}
616
644
spprintf (& real_key , 0 , "%s_%s" , "HTTP" , key );
617
645
if (strcmp (key , "CONTENT_TYPE" ) == 0 || strcmp (key , "CONTENT_LENGTH" ) == 0 ) {
618
- // TODO make a version specialized for zend_string?
646
+ /* Is it possible to use sapi_cli_server_register_known_var_char() and not go through the SAPI filter? */
619
647
sapi_cli_server_register_variable (track_vars_array , key , Z_STRVAL_P (entry ));
620
648
}
621
649
sapi_cli_server_register_variable (track_vars_array , real_key , Z_STRVAL_P (entry ));
@@ -630,7 +658,9 @@ static int sapi_cli_server_register_entry_cb(zval *entry, int num_args, va_list
630
658
static void sapi_cli_server_register_variables (zval * track_vars_array ) /* {{{ */
631
659
{
632
660
php_cli_server_client * client = SG (server_context );
633
- sapi_cli_server_register_variable (track_vars_array , "DOCUMENT_ROOT" , client -> server -> document_root );
661
+
662
+ sapi_cli_server_register_known_var_char (track_vars_array ,
663
+ "DOCUMENT_ROOT" , strlen ("DOCUMENT_ROOT" ), client -> server -> document_root , client -> server -> document_root_len );
634
664
{
635
665
char * tmp ;
636
666
if ((tmp = strrchr (ZSTR_VAL (client -> addr_str ), ':' ))) {
@@ -643,54 +673,67 @@ static void sapi_cli_server_register_variables(zval *track_vars_array) /* {{{ */
643
673
port [7 ] = '\0' ;
644
674
strncpy (addr , addr_start , addr_end - addr_start );
645
675
addr [addr_end - addr_start ] = '\0' ;
646
- sapi_cli_server_register_variable (track_vars_array , "REMOTE_ADDR" , addr );
647
- sapi_cli_server_register_variable (track_vars_array , "REMOTE_PORT" , port );
676
+ sapi_cli_server_register_known_var_char (track_vars_array ,
677
+ "REMOTE_ADDR" , strlen ("REMOTE_ADDR" ), addr , strlen (addr ));
678
+ sapi_cli_server_register_known_var_char (track_vars_array ,
679
+ "REMOTE_PORT" , strlen ("REMOTE_PORT" ), port , strlen (port ));
648
680
} else {
649
- sapi_cli_server_register_variable (track_vars_array , "REMOTE_ADDR" , ZSTR_VAL (client -> addr_str ));
681
+ sapi_cli_server_register_known_var_str (track_vars_array ,
682
+ "REMOTE_ADDR" , strlen ("REMOTE_ADDR" ), client -> addr_str );
650
683
}
651
684
}
652
685
{
653
- char * tmp ;
654
- spprintf (& tmp , 0 , "PHP %s Development Server" , PHP_VERSION );
655
- sapi_cli_server_register_variable (track_vars_array , "SERVER_SOFTWARE" , tmp );
656
- efree (tmp );
686
+ zend_string * tmp = strpprintf (0 , "PHP %s Development Server" , PHP_VERSION );
687
+ sapi_cli_server_register_known_var_str (track_vars_array , "SERVER_SOFTWARE" , strlen ("SERVER_SOFTWARE" ), tmp );
688
+ zend_string_release_ex (tmp , /* persistent */ false);
657
689
}
658
690
{
659
- char * tmp ;
660
- spprintf (& tmp , 0 , "HTTP/%d.%d" , client -> request .protocol_version / 100 , client -> request .protocol_version % 100 );
661
- sapi_cli_server_register_variable (track_vars_array , "SERVER_PROTOCOL" , tmp );
662
- efree (tmp );
691
+ zend_string * tmp = strpprintf (0 , "HTTP/%d.%d" , client -> request .protocol_version / 100 , client -> request .protocol_version % 100 );
692
+ sapi_cli_server_register_known_var_str (track_vars_array , "SERVER_PROTOCOL" , strlen ("SERVER_PROTOCOL" ), tmp );
693
+ zend_string_release_ex (tmp , /* persistent */ false);
663
694
}
664
- sapi_cli_server_register_variable (track_vars_array , "SERVER_NAME" , client -> server -> host );
695
+ sapi_cli_server_register_known_var_char (track_vars_array ,
696
+ "SERVER_NAME" , strlen ("SERVER_NAME" ), client -> server -> host , strlen (client -> server -> host ));
665
697
{
666
- char * tmp ;
667
- spprintf (& tmp , 0 , "%i" , client -> server -> port );
668
- sapi_cli_server_register_variable (track_vars_array , "SERVER_PORT" , tmp );
669
- efree (tmp );
670
- }
671
-
672
- sapi_cli_server_register_variable (track_vars_array , "REQUEST_URI" , client -> request .request_uri );
673
- sapi_cli_server_register_variable (track_vars_array , "REQUEST_METHOD" , SG (request_info ).request_method );
674
- sapi_cli_server_register_variable (track_vars_array , "SCRIPT_NAME" , client -> request .vpath );
698
+ zend_string * tmp = strpprintf (0 , "%i" , client -> server -> port );
699
+ sapi_cli_server_register_known_var_str (track_vars_array , "SERVER_PORT" , strlen ("SERVER_PORT" ), tmp );
700
+ zend_string_release_ex (tmp , /* persistent */ false);
701
+ }
702
+
703
+ sapi_cli_server_register_known_var_char (track_vars_array ,
704
+ "REQUEST_URI" , strlen ("REQUEST_URI" ), client -> request .request_uri , client -> request .request_uri_len );
705
+ sapi_cli_server_register_known_var_char (track_vars_array ,
706
+ "REQUEST_METHOD" , strlen ("REQUEST_METHOD" ),
707
+ SG (request_info ).request_method , strlen (SG (request_info ).request_method ));
708
+ sapi_cli_server_register_known_var_char (track_vars_array ,
709
+ "SCRIPT_NAME" , strlen ("SCRIPT_NAME" ), client -> request .vpath , client -> request .vpath_len );
675
710
if (SG (request_info ).path_translated ) {
676
- sapi_cli_server_register_variable (track_vars_array , "SCRIPT_FILENAME" , SG (request_info ).path_translated );
711
+ sapi_cli_server_register_known_var_char (track_vars_array ,
712
+ "SCRIPT_FILENAME" , strlen ("SCRIPT_FILENAME" ),
713
+ SG (request_info ).path_translated , strlen (SG (request_info ).path_translated ));
677
714
} else if (client -> server -> router ) {
678
- sapi_cli_server_register_variable (track_vars_array , "SCRIPT_FILENAME" , client -> server -> router );
715
+ sapi_cli_server_register_known_var_char (track_vars_array ,
716
+ "SCRIPT_FILENAME" , strlen ("SCRIPT_FILENAME" ), client -> server -> router , client -> server -> router_len );
679
717
}
680
718
if (client -> request .path_info ) {
681
- sapi_cli_server_register_variable (track_vars_array , "PATH_INFO" , client -> request .path_info );
719
+ sapi_cli_server_register_known_var_char (track_vars_array ,
720
+ "PATH_INFO" , strlen ("PATH_INFO" ), client -> request .path_info , client -> request .path_info_len );
682
721
}
683
722
if (client -> request .path_info_len ) {
684
- char * tmp ;
685
- spprintf (& tmp , 0 , "%s%s" , client -> request .vpath , client -> request .path_info );
686
- sapi_cli_server_register_variable (track_vars_array , "PHP_SELF" , tmp );
687
- efree (tmp );
723
+ zend_string * tmp = strpprintf (0 , "%s%s" , client -> request .vpath , client -> request .path_info );
724
+ sapi_cli_server_register_known_var_str (track_vars_array , "PHP_SELF" , strlen ("PHP_SELF" ), tmp );
725
+ zend_string_release_ex (tmp , /* persistent */ false);
688
726
} else {
689
- sapi_cli_server_register_variable (track_vars_array , "PHP_SELF" , client -> request .vpath );
727
+ sapi_cli_server_register_known_var_char (track_vars_array ,
728
+ "PHP_SELF" , strlen ("PHP_SELF" ), client -> request .vpath , client -> request .vpath_len );
690
729
}
691
730
if (client -> request .query_string ) {
731
+ /* Use sapi_cli_server_register_variable() to pass query string through SAPI input filter,
732
+ * and check keys are proper PHP var names */
692
733
sapi_cli_server_register_variable (track_vars_array , "QUERY_STRING" , client -> request .query_string );
693
734
}
735
+ /* Use sapi_cli_server_register_variable() to pass header values through SAPI input filter,
736
+ * and check keys are proper PHP var names */
694
737
zend_hash_apply_with_arguments (& client -> request .headers , (apply_func_args_t )sapi_cli_server_register_entry_cb , 1 , track_vars_array );
695
738
} /* }}} */
696
739
0 commit comments