@@ -167,9 +167,7 @@ typedef struct php_cli_server_client {
167
167
zend_string * addr_str ;
168
168
php_http_parser parser ;
169
169
unsigned int request_read :1 ;
170
- char * current_header_name ;
171
- size_t current_header_name_len ;
172
- unsigned int current_header_name_allocated :1 ;
170
+ zend_string * current_header_name ;
173
171
char * current_header_value ;
174
172
size_t current_header_value_len ;
175
173
enum { HEADER_NONE = 0 , HEADER_FIELD , HEADER_VALUE } last_header_element ;
@@ -1623,22 +1621,13 @@ static int php_cli_server_client_read_request_on_fragment(php_http_parser *parse
1623
1621
static void php_cli_server_client_save_header (php_cli_server_client * client )
1624
1622
{
1625
1623
/* strip off the colon */
1626
- zend_string * orig_header_name = zend_string_init (client -> current_header_name , client -> current_header_name_len , 1 );
1627
- zend_string * lc_header_name = zend_string_alloc (client -> current_header_name_len , 1 );
1628
- zend_str_tolower_copy (ZSTR_VAL (lc_header_name ), client -> current_header_name , client -> current_header_name_len );
1629
- GC_MAKE_PERSISTENT_LOCAL (orig_header_name );
1630
- GC_MAKE_PERSISTENT_LOCAL (lc_header_name );
1624
+ // TODO Need to duplicate original header and make persistent?
1625
+ zend_string * lc_header_name = zend_string_tolower_ex (client -> current_header_name , /* persistent */ true);
1631
1626
zend_hash_add_ptr (& client -> request .headers , lc_header_name , client -> current_header_value );
1632
- zend_hash_add_ptr (& client -> request .headers_original_case , orig_header_name , client -> current_header_value );
1633
- zend_string_release_ex (lc_header_name , 1 );
1634
- zend_string_release_ex (orig_header_name , 1 );
1627
+ zend_hash_add_ptr (& client -> request .headers_original_case , client -> current_header_name , client -> current_header_value );
1628
+ zend_string_release_ex (lc_header_name , /* persistent */ true);
1635
1629
1636
- if (client -> current_header_name_allocated ) {
1637
- pefree (client -> current_header_name , 1 );
1638
- client -> current_header_name_allocated = 0 ;
1639
- }
1640
1630
client -> current_header_name = NULL ;
1641
- client -> current_header_name_len = 0 ;
1642
1631
client -> current_header_value = NULL ;
1643
1632
client -> current_header_value_len = 0 ;
1644
1633
}
@@ -1647,31 +1636,19 @@ static int php_cli_server_client_read_request_on_header_field(php_http_parser *p
1647
1636
{
1648
1637
php_cli_server_client * client = parser -> data ;
1649
1638
switch (client -> last_header_element ) {
1650
- case HEADER_VALUE :
1651
- php_cli_server_client_save_header (client );
1652
- ZEND_FALLTHROUGH ;
1653
- case HEADER_NONE :
1654
- client -> current_header_name = (char * )at ;
1655
- client -> current_header_name_len = length ;
1656
- break ;
1657
- case HEADER_FIELD :
1658
- if (client -> current_header_name_allocated ) {
1659
- size_t new_length = client -> current_header_name_len + length ;
1660
- client -> current_header_name = perealloc (client -> current_header_name , new_length + 1 , 1 );
1661
- memcpy (client -> current_header_name + client -> current_header_name_len , at , length );
1662
- client -> current_header_name [new_length ] = '\0' ;
1663
- client -> current_header_name_len = new_length ;
1664
- } else {
1665
- size_t new_length = client -> current_header_name_len + length ;
1666
- char * field = pemalloc (new_length + 1 , 1 );
1667
- memcpy (field , client -> current_header_name , client -> current_header_name_len );
1668
- memcpy (field + client -> current_header_name_len , at , length );
1669
- field [new_length ] = '\0' ;
1639
+ case HEADER_VALUE :
1640
+ php_cli_server_client_save_header (client );
1641
+ ZEND_FALLTHROUGH ;
1642
+ case HEADER_NONE :
1643
+ client -> current_header_name = zend_string_init (at , length , /* persistent */ false);
1644
+ break ;
1645
+ case HEADER_FIELD : {
1646
+ zend_string * field = zend_string_concat2 (
1647
+ ZSTR_VAL (client -> current_header_name ), ZSTR_LEN (client -> current_header_name ), at , length );
1648
+ // Free previous
1649
+ zend_string_release_ex (client -> current_header_name , /* persistent */ false);
1670
1650
client -> current_header_name = field ;
1671
- client -> current_header_name_len = new_length ;
1672
- client -> current_header_name_allocated = 1 ;
1673
1651
}
1674
- break ;
1675
1652
}
1676
1653
1677
1654
client -> last_header_element = HEADER_FIELD ;
@@ -1816,12 +1793,7 @@ static int php_cli_server_client_read_request(php_cli_server_client *client, cha
1816
1793
1817
1794
return -1 ;
1818
1795
}
1819
- if (client -> current_header_name ) {
1820
- char * header_name = safe_pemalloc (client -> current_header_name_len , 1 , 1 , 1 );
1821
- memmove (header_name , client -> current_header_name , client -> current_header_name_len );
1822
- client -> current_header_name = header_name ;
1823
- client -> current_header_name_allocated = 1 ;
1824
- }
1796
+
1825
1797
return client -> request_read ? 1 : 0 ;
1826
1798
}
1827
1799
/* }}} */
@@ -1903,8 +1875,6 @@ static void php_cli_server_client_ctor(php_cli_server_client *client, php_cli_se
1903
1875
1904
1876
client -> last_header_element = HEADER_NONE ;
1905
1877
client -> current_header_name = NULL ;
1906
- client -> current_header_name_len = 0 ;
1907
- client -> current_header_name_allocated = 0 ;
1908
1878
client -> current_header_value = NULL ;
1909
1879
client -> current_header_value_len = 0 ;
1910
1880
@@ -1925,6 +1895,7 @@ static void php_cli_server_client_dtor(php_cli_server_client *client) /* {{{ */
1925
1895
}
1926
1896
pefree (client -> addr , 1 );
1927
1897
zend_string_release_ex (client -> addr_str , /* persistent */ true);
1898
+ // TODO release client->current_header_name ?
1928
1899
if (client -> content_sender_initialized ) {
1929
1900
php_cli_server_content_sender_dtor (& client -> content_sender );
1930
1901
}
0 commit comments