Skip to content

Commit 6f7d773

Browse files
committed
Convert php_cli_server_client->current_header_name to zend_string
1 parent 4b58422 commit 6f7d773

File tree

1 file changed

+18
-47
lines changed

1 file changed

+18
-47
lines changed

sapi/cli/php_cli_server.c

Lines changed: 18 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -167,9 +167,7 @@ typedef struct php_cli_server_client {
167167
zend_string *addr_str;
168168
php_http_parser parser;
169169
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;
173171
char *current_header_value;
174172
size_t current_header_value_len;
175173
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
16231621
static void php_cli_server_client_save_header(php_cli_server_client *client)
16241622
{
16251623
/* 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);
16311626
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);
16351629

1636-
if (client->current_header_name_allocated) {
1637-
pefree(client->current_header_name, 1);
1638-
client->current_header_name_allocated = 0;
1639-
}
16401630
client->current_header_name = NULL;
1641-
client->current_header_name_len = 0;
16421631
client->current_header_value = NULL;
16431632
client->current_header_value_len = 0;
16441633
}
@@ -1647,31 +1636,19 @@ static int php_cli_server_client_read_request_on_header_field(php_http_parser *p
16471636
{
16481637
php_cli_server_client *client = parser->data;
16491638
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);
16701650
client->current_header_name = field;
1671-
client->current_header_name_len = new_length;
1672-
client->current_header_name_allocated = 1;
16731651
}
1674-
break;
16751652
}
16761653

16771654
client->last_header_element = HEADER_FIELD;
@@ -1816,12 +1793,7 @@ static int php_cli_server_client_read_request(php_cli_server_client *client, cha
18161793

18171794
return -1;
18181795
}
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+
18251797
return client->request_read ? 1: 0;
18261798
}
18271799
/* }}} */
@@ -1903,8 +1875,6 @@ static void php_cli_server_client_ctor(php_cli_server_client *client, php_cli_se
19031875

19041876
client->last_header_element = HEADER_NONE;
19051877
client->current_header_name = NULL;
1906-
client->current_header_name_len = 0;
1907-
client->current_header_name_allocated = 0;
19081878
client->current_header_value = NULL;
19091879
client->current_header_value_len = 0;
19101880

@@ -1925,6 +1895,7 @@ static void php_cli_server_client_dtor(php_cli_server_client *client) /* {{{ */
19251895
}
19261896
pefree(client->addr, 1);
19271897
zend_string_release_ex(client->addr_str, /* persistent */ true);
1898+
// TODO release client->current_header_name ?
19281899
if (client->content_sender_initialized) {
19291900
php_cli_server_content_sender_dtor(&client->content_sender);
19301901
}

0 commit comments

Comments
 (0)