Skip to content

Commit 4ec7c3c

Browse files
committed
Add SAPI_HEADER_DELETE_PREFIX operation
The session ext currently munges into the linked list of headers itself, because the delete header API is given the key for headers to delete. The session ext wants to use a prefix past the colon separator, for i.e. "Set-Cookie: PHPSESSID=", to eliminate only the specific cookie rather than all cookies. This changes the SAPI code to add a new header op to take a prefix instead. Call sites are yet unchanged. Also fix some whitespace.
1 parent 400b7b8 commit 4ec7c3c

File tree

2 files changed

+10
-6
lines changed

2 files changed

+10
-6
lines changed

main/SAPI.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -597,15 +597,17 @@ static void sapi_update_response_code(int ncode)
597597
* since zend_llist_del_element only removes one matched item once,
598598
* we should remove them manually
599599
*/
600-
static void sapi_remove_header(zend_llist *l, char *name, size_t len) {
600+
static void sapi_remove_header(zend_llist *l, char *name, size_t len, bool check_separator)
601+
{
601602
sapi_header_struct *header;
602603
zend_llist_element *next;
603604
zend_llist_element *current=l->head;
604605

605606
while (current) {
606607
header = (sapi_header_struct *)(current->data);
607608
next = current->next;
608-
if (header->header_len > len && header->header[len] == ':'
609+
if (header->header_len > len
610+
&& (header->header[len] == ':' || !check_separator)
609611
&& !strncasecmp(header->header, name, len)) {
610612
if (current->prev) {
611613
current->prev->next = next;
@@ -653,7 +655,7 @@ static void sapi_header_add_op(sapi_header_op_enum op, sapi_header_struct *sapi_
653655
char sav = *colon_offset;
654656

655657
*colon_offset = 0;
656-
sapi_remove_header(&SG(sapi_headers).headers, sapi_header->header, strlen(sapi_header->header));
658+
sapi_remove_header(&SG(sapi_headers).headers, sapi_header->header, strlen(sapi_header->header), true);
657659
*colon_offset = sav;
658660
}
659661
}
@@ -691,6 +693,7 @@ SAPI_API int sapi_header_op(sapi_header_op_enum op, void *arg)
691693

692694
case SAPI_HEADER_ADD:
693695
case SAPI_HEADER_REPLACE:
696+
case SAPI_HEADER_DELETE_PREFIX:
694697
case SAPI_HEADER_DELETE: {
695698
sapi_header_line *p = arg;
696699

@@ -722,8 +725,8 @@ SAPI_API int sapi_header_op(sapi_header_op_enum op, void *arg)
722725
header_line[header_line_len]='\0';
723726
}
724727

725-
if (op == SAPI_HEADER_DELETE) {
726-
if (strchr(header_line, ':')) {
728+
if (op == SAPI_HEADER_DELETE || op == SAPI_HEADER_DELETE_PREFIX) {
729+
if (op == SAPI_HEADER_DELETE && strchr(header_line, ':')) {
727730
efree(header_line);
728731
sapi_module.sapi_error(E_WARNING, "Header to delete may not contain colon.");
729732
return FAILURE;
@@ -733,7 +736,7 @@ SAPI_API int sapi_header_op(sapi_header_op_enum op, void *arg)
733736
sapi_header.header_len = header_line_len;
734737
sapi_module.header_handler(&sapi_header, op, &SG(sapi_headers));
735738
}
736-
sapi_remove_header(&SG(sapi_headers).headers, header_line, header_line_len);
739+
sapi_remove_header(&SG(sapi_headers).headers, header_line, header_line_len, op == SAPI_HEADER_DELETE);
737740
efree(header_line);
738741
return SUCCESS;
739742
} else {

main/SAPI.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,7 @@ typedef enum { /* Parameter: */
192192
SAPI_HEADER_REPLACE, /* sapi_header_line* */
193193
SAPI_HEADER_ADD, /* sapi_header_line* */
194194
SAPI_HEADER_DELETE, /* sapi_header_line* */
195+
SAPI_HEADER_DELETE_PREFIX, /* sapi_header_line* */
195196
SAPI_HEADER_DELETE_ALL, /* void */
196197
SAPI_HEADER_SET_STATUS /* int */
197198
} sapi_header_op_enum;

0 commit comments

Comments
 (0)