@@ -1680,14 +1680,33 @@ static void php_cli_server_client_save_header(php_cli_server_client *client)
16801680{
16811681 /* Wrap header value in a zval to add is to the HashTable which acts as an array */
16821682 zval tmp ;
1683- ZVAL_STR (& tmp , client -> current_header_value );
16841683 /* strip off the colon */
16851684 zend_string * lc_header_name = zend_string_tolower_ex (client -> current_header_name , /* persistent */ true);
16861685 GC_MAKE_PERSISTENT_LOCAL (lc_header_name );
16871686
1688- /* Add the wrapped zend_string to the HashTable */
1689- zend_hash_add (& client -> request .headers , lc_header_name , & tmp );
1690- zend_hash_add (& client -> request .headers_original_case , client -> current_header_name , & tmp );
1687+ zval * entry = zend_hash_find (& client -> request .headers , lc_header_name );
1688+ bool with_comma = !zend_string_equals_literal (lc_header_name , "set-cookie" );
1689+
1690+ /**
1691+ * `Set-Cookie` HTTP header being the exception, they can have 1 or more values separated
1692+ * by a comma while still possibly be set separately by the client.
1693+ **/
1694+ if (!with_comma || entry == NULL ) {
1695+ ZVAL_STR (& tmp , client -> current_header_value );
1696+ } else {
1697+ zend_string * curval = Z_STR_P (entry );
1698+ zend_string * newval = zend_string_safe_alloc (1 , ZSTR_LEN (curval ), ZSTR_LEN (client -> current_header_value ) + 2 , /* persistent */ true);
1699+
1700+ memcpy (ZSTR_VAL (newval ), ZSTR_VAL (curval ), ZSTR_LEN (curval ));
1701+ memcpy (ZSTR_VAL (newval ) + ZSTR_LEN (curval ), ", " , 2 );
1702+ memcpy (ZSTR_VAL (newval ) + ZSTR_LEN (curval ) + 2 , ZSTR_VAL (client -> current_header_value ), ZSTR_LEN (client -> current_header_value ) + 1 );
1703+
1704+ ZVAL_STR (& tmp , newval );
1705+ }
1706+
1707+ /* Add/Update the wrapped zend_string to the HashTable */
1708+ zend_hash_update (& client -> request .headers , lc_header_name , & tmp );
1709+ zend_hash_update (& client -> request .headers_original_case , client -> current_header_name , & tmp );
16911710
16921711 zend_string_release_ex (lc_header_name , /* persistent */ true);
16931712 zend_string_release_ex (client -> current_header_name , /* persistent */ true);
0 commit comments