@@ -269,8 +269,7 @@ static bool php_cli_server_get_system_time(char *buf) {
269
269
/* Destructor for php_cli_server_request->headers, this frees header value */
270
270
static void char_ptr_dtor_p (zval * zv ) /* {{{ */
271
271
{
272
- // TODO free have zend_string* not as a pointer
273
- zend_string_release_ex (Z_PTR_P (zv ), /* persistent */ true);
272
+ zend_string_release_ex (Z_STR_P (zv ), /* persistent */ true);
274
273
} /* }}} */
275
274
276
275
static char * get_last_error (void ) /* {{{ */
@@ -348,12 +347,12 @@ static void append_http_status_line(smart_str *buffer, int protocol_version, int
348
347
349
348
static void append_essential_headers (smart_str * buffer , php_cli_server_client * client , bool persistent ) /* {{{ */
350
349
{
351
- zend_string * val ;
350
+ zval * val ;
352
351
struct timeval tv = {0 };
353
352
354
- if (NULL != (val = zend_hash_str_find_ptr (& client -> request .headers , "host" , sizeof ("host" )- 1 ))) {
353
+ if (NULL != (val = zend_hash_str_find (& client -> request .headers , "host" , sizeof ("host" )- 1 ))) {
355
354
smart_str_appends_ex (buffer , "Host: " , persistent );
356
- smart_str_append_ex (buffer , val , persistent );
355
+ smart_str_append_ex (buffer , Z_STR_P ( val ) , persistent );
357
356
smart_str_appends_ex (buffer , "\r\n" , persistent );
358
357
}
359
358
@@ -382,25 +381,17 @@ static const char *get_mime_type(const php_cli_server *server, const char *ext,
382
381
PHP_FUNCTION (apache_request_headers ) /* {{{ */
383
382
{
384
383
php_cli_server_client * client ;
385
- HashTable * headers ;
386
- zend_string * key ;
387
- zend_string * value ;
388
384
zval tmp ;
389
385
390
386
if (zend_parse_parameters_none () == FAILURE ) {
391
387
RETURN_THROWS ();
392
388
}
393
389
394
390
client = SG (server_context );
395
- headers = & client -> request .headers_original_case ;
396
391
397
- array_init_size (return_value , zend_hash_num_elements (headers ));
398
-
399
- ZEND_HASH_MAP_FOREACH_STR_KEY_PTR (headers , key , value ) {
400
- // TODO There must be a better way
401
- ZVAL_STRING (& tmp , ZSTR_VAL (value ));
402
- zend_symtable_update (Z_ARRVAL_P (return_value ), key , & tmp );
403
- } ZEND_HASH_FOREACH_END ();
392
+ /* Need to copy the HashTable */
393
+ ZVAL_ARR (& tmp ,& client -> request .headers_original_case );
394
+ RETURN_COPY (& tmp );
404
395
}
405
396
/* }}} */
406
397
@@ -573,11 +564,11 @@ static int sapi_cli_server_send_headers(sapi_headers_struct *sapi_headers) /* {{
573
564
static char * sapi_cli_server_read_cookies (void ) /* {{{ */
574
565
{
575
566
php_cli_server_client * client = SG (server_context );
576
- zend_string * val ;
577
- if (NULL == (val = zend_hash_str_find_ptr (& client -> request .headers , "cookie" , sizeof ("cookie" )- 1 ))) {
567
+ zval * val ;
568
+ if (NULL == (val = zend_hash_str_find (& client -> request .headers , "cookie" , sizeof ("cookie" )- 1 ))) {
578
569
return NULL ;
579
570
}
580
- return ZSTR_VAL (val );
571
+ return Z_STRVAL_P (val );
581
572
} /* }}} */
582
573
583
574
static size_t sapi_cli_server_read_post (char * buf , size_t count_bytes ) /* {{{ */
@@ -607,8 +598,12 @@ static void sapi_cli_server_register_variable(zval *track_vars_array, const char
607
598
}
608
599
} /* }}} */
609
600
610
- static int sapi_cli_server_register_entry_cb (zend_string * * entry , int num_args , va_list args , zend_hash_key * hash_key ) /* {{{ */ {
601
+ /* The entry zval will always contain a zend_string* */
602
+ static int sapi_cli_server_register_entry_cb (zval * entry , int num_args , va_list args , zend_hash_key * hash_key ) /* {{{ */ {
611
603
zval * track_vars_array = va_arg (args , zval * );
604
+
605
+ ZEND_ASSERT (Z_TYPE_P (entry ) == IS_STRING );
606
+
612
607
if (hash_key -> key ) {
613
608
char * real_key , * key ;
614
609
uint32_t i ;
@@ -623,9 +618,9 @@ static int sapi_cli_server_register_entry_cb(zend_string **entry, int num_args,
623
618
spprintf (& real_key , 0 , "%s_%s" , "HTTP" , key );
624
619
if (strcmp (key , "CONTENT_TYPE" ) == 0 || strcmp (key , "CONTENT_LENGTH" ) == 0 ) {
625
620
// TODO make a version specialized for zend_string?
626
- sapi_cli_server_register_variable (track_vars_array , key , ZSTR_VAL ( * entry ));
621
+ sapi_cli_server_register_variable (track_vars_array , key , Z_STRVAL_P ( entry ));
627
622
}
628
- sapi_cli_server_register_variable (track_vars_array , real_key , ZSTR_VAL ( * entry ));
623
+ sapi_cli_server_register_variable (track_vars_array , real_key , Z_STRVAL_P ( entry ));
629
624
efree (key );
630
625
efree (real_key );
631
626
}
@@ -1624,11 +1619,16 @@ static int php_cli_server_client_read_request_on_fragment(php_http_parser *parse
1624
1619
1625
1620
static void php_cli_server_client_save_header (php_cli_server_client * client )
1626
1621
{
1622
+ /* Wrap header value in a zval to add is to the HashTable which acts as an array */
1623
+ zval tmp ;
1624
+ ZVAL_STR (& tmp , client -> current_header_value );
1627
1625
/* strip off the colon */
1628
1626
zend_string * perm_header_name = zend_string_dup (client -> current_header_name , /* persistent */ true);
1629
1627
zend_string * lc_header_name = zend_string_tolower_ex (client -> current_header_name , /* persistent */ true);
1630
- zend_hash_add_ptr (& client -> request .headers , lc_header_name , client -> current_header_value );
1631
- zend_hash_add_ptr (& client -> request .headers_original_case , perm_header_name , client -> current_header_value );
1628
+
1629
+ /* Add the wrapped zend_string to the HashTable */
1630
+ zend_hash_add (& client -> request .headers , lc_header_name , & tmp );
1631
+ zend_hash_add (& client -> request .headers_original_case , perm_header_name , & tmp );
1632
1632
1633
1633
zend_string_release_ex (client -> current_header_name , /* persistent */ false);
1634
1634
zend_string_release_ex (lc_header_name , /* persistent */ true);
@@ -1850,7 +1850,7 @@ static size_t php_cli_server_client_send_through(php_cli_server_client *client,
1850
1850
1851
1851
static void php_cli_server_client_populate_request_info (const php_cli_server_client * client , sapi_request_info * request_info ) /* {{{ */
1852
1852
{
1853
- zend_string * val ;
1853
+ zval * val ;
1854
1854
1855
1855
request_info -> request_method = php_http_method_str (client -> request .request_method );
1856
1856
request_info -> proto_num = client -> request .protocol_version ;
@@ -1859,8 +1859,8 @@ static void php_cli_server_client_populate_request_info(const php_cli_server_cli
1859
1859
request_info -> query_string = client -> request .query_string ;
1860
1860
request_info -> content_length = client -> request .content_len ;
1861
1861
request_info -> auth_user = request_info -> auth_password = request_info -> auth_digest = NULL ;
1862
- if (NULL != (val = zend_hash_str_find_ptr (& client -> request .headers , "content-type" , sizeof ("content-type" )- 1 ))) {
1863
- request_info -> content_type = ZSTR_VAL (val );
1862
+ if (NULL != (val = zend_hash_str_find (& client -> request .headers , "content-type" , sizeof ("content-type" )- 1 ))) {
1863
+ request_info -> content_type = Z_STRVAL_P (val );
1864
1864
}
1865
1865
} /* }}} */
1866
1866
@@ -2110,10 +2110,10 @@ static zend_result php_cli_server_begin_send_static(php_cli_server *server, php_
2110
2110
/* }}} */
2111
2111
2112
2112
static zend_result php_cli_server_request_startup (php_cli_server * server , php_cli_server_client * client ) { /* {{{ */
2113
- zend_string * auth ;
2113
+ zval * auth ;
2114
2114
php_cli_server_client_populate_request_info (client , & SG (request_info ));
2115
- if (NULL != (auth = zend_hash_str_find_ptr (& client -> request .headers , "authorization" , sizeof ("authorization" )- 1 ))) {
2116
- php_handle_auth_data (ZSTR_VAL (auth ));
2115
+ if (NULL != (auth = zend_hash_str_find (& client -> request .headers , "authorization" , sizeof ("authorization" )- 1 ))) {
2116
+ php_handle_auth_data (Z_STRVAL_P (auth ));
2117
2117
}
2118
2118
SG (sapi_headers ).http_response_code = 200 ;
2119
2119
if (FAILURE == php_request_startup ()) {
0 commit comments