diff options
author | Arnaud Le Blanc <lbarnaud@php.net> | 2008-11-13 10:14:04 +0000 |
---|---|---|
committer | Arnaud Le Blanc <lbarnaud@php.net> | 2008-11-13 10:14:04 +0000 |
commit | 8c4151ad72b6c5a82b341aaf59d2c31521ca4341 (patch) | |
tree | ccc7c01da54fd7f7a02d03d7017e78a359aa254e /main/SAPI.c | |
parent | 06119f4748066e61163764bbb31d1db4b21b6d07 (diff) | |
download | php-git-8c4151ad72b6c5a82b341aaf59d2c31521ca4341.tar.gz |
Added header_remove() (chsc at peytz dotdk, Arnaud)
[DOC] proto void header_remove([string header_name])
Removes an HTTP header previously set using header()
The header_name parameter is optionnal, all headers are
removed if it is not set
[SAPIs] The header_handler callback in sapi_module_struct has
been changed, it now take a new argument.
When it is set to SAPI_HEADER_DELETE, sapi_header->header is
the name of an header, header_handler has to delete it.
When it is set to SAPI_HEADER_DELETE_ALL, header_handler has
to delete all headers.
When sapi_header_op_enum is SAPI_HEADER_ADD or _REPLACE,
sapi_header->header is in the form "Name: value", header_handler
has to add or replace the given header.
In all cases, header_handler must not free sapi_header or
sapi_header->header. SAPI_HEADER_ADD must be returned if the
header has been added or replaced, or 0 in other cases.
Diffstat (limited to 'main/SAPI.c')
-rw-r--r-- | main/SAPI.c | 45 |
1 files changed, 32 insertions, 13 deletions
diff --git a/main/SAPI.c b/main/SAPI.c index feabcef549..3adb76541e 100644 --- a/main/SAPI.c +++ b/main/SAPI.c @@ -497,7 +497,8 @@ static void sapi_update_response_code(int ncode TSRMLS_DC) static int sapi_find_matching_header(void *element1, void *element2) { - return strncasecmp(((sapi_header_struct*)element1)->header, (char*)element2, strlen((char*)element2)) == 0; + int len = strlen((char*)element2); + return strncasecmp(((sapi_header_struct*)element1)->header, (char*)element2, len) == 0 && ((sapi_header_struct*)element1)->header[len] == ':'; } SAPI_API int sapi_add_header_ex(char *header_line, uint header_line_len, zend_bool duplicate, zend_bool replace TSRMLS_DC) @@ -525,7 +526,6 @@ SAPI_API int sapi_header_op(sapi_header_op_enum op, void *arg TSRMLS_DC) long myuid = 0L; char *header_line; uint header_line_len; - zend_bool replace; int http_response_code; if (SG(headers_sent) && !SG(request_info).no_headers) { @@ -546,8 +546,9 @@ SAPI_API int sapi_header_op(sapi_header_op_enum op, void *arg TSRMLS_DC) sapi_update_response_code((int)(zend_intptr_t) arg TSRMLS_CC); return SUCCESS; + case SAPI_HEADER_ADD: case SAPI_HEADER_REPLACE: - case SAPI_HEADER_ADD: { + case SAPI_HEADER_DELETE: { sapi_header_line *p = arg; if (!p->line || !p->line_len) { @@ -556,10 +557,16 @@ SAPI_API int sapi_header_op(sapi_header_op_enum op, void *arg TSRMLS_DC) header_line = p->line; header_line_len = p->line_len; http_response_code = p->response_code; - replace = (op == SAPI_HEADER_REPLACE); break; } + case SAPI_HEADER_DELETE_ALL: + if (sapi_module.header_handler) { + sapi_module.header_handler(&sapi_header, op, &SG(sapi_headers) TSRMLS_CC); + } + zend_llist_clean(&SG(sapi_headers).headers); + return SUCCESS; + default: return FAILURE; } @@ -570,8 +577,14 @@ SAPI_API int sapi_header_op(sapi_header_op_enum op, void *arg TSRMLS_DC) while(header_line_len && isspace(header_line[header_line_len-1])) header_line[--header_line_len]='\0'; - /* new line safety check */ - { + if (op == SAPI_HEADER_DELETE) { + if (strchr(header_line, ':')) { + efree(header_line); + sapi_module.sapi_error(E_WARNING, "Header to delete may not contain colon."); + return FAILURE; + } + } else { + /* new line safety check */ char *s = header_line, *e = header_line + header_line_len, *p; while (s < e && (p = memchr(s, '\n', (e - s)))) { if (*(p + 1) == ' ' || *(p + 1) == '\t') { @@ -586,7 +599,15 @@ SAPI_API int sapi_header_op(sapi_header_op_enum op, void *arg TSRMLS_DC) sapi_header.header = header_line; sapi_header.header_len = header_line_len; - sapi_header.replace = replace; + + if (op == SAPI_HEADER_DELETE) { + if (sapi_module.header_handler) { + sapi_module.header_handler(&sapi_header, op, &SG(sapi_headers) TSRMLS_CC); + } + zend_llist_del_element(&SG(sapi_headers).headers, sapi_header.header, (int(*)(void*, void*))sapi_find_matching_header); + sapi_free_header(&sapi_header); + return SUCCESS; + } /* Check the header for a few cases that we have special support for in SAPI */ if (header_line_len>=5 @@ -728,20 +749,16 @@ SAPI_API int sapi_header_op(sapi_header_op_enum op, void *arg TSRMLS_DC) sapi_update_response_code(http_response_code TSRMLS_CC); } if (sapi_module.header_handler) { - retval = sapi_module.header_handler(&sapi_header, &SG(sapi_headers) TSRMLS_CC); + retval = sapi_module.header_handler(&sapi_header, op, &SG(sapi_headers) TSRMLS_CC); } else { retval = SAPI_HEADER_ADD; } - if (retval & SAPI_HEADER_DELETE_ALL) { - zend_llist_clean(&SG(sapi_headers).headers); - } if (retval & SAPI_HEADER_ADD) { /* in replace mode first remove the header if it already exists in the headers llist */ - if (replace) { + if (op == SAPI_HEADER_REPLACE) { colon_offset = strchr(sapi_header.header, ':'); if (colon_offset) { char sav; - colon_offset++; sav = *colon_offset; *colon_offset = 0; zend_llist_del_element(&SG(sapi_headers).headers, sapi_header.header, (int(*)(void*, void*))sapi_find_matching_header); @@ -750,6 +767,8 @@ SAPI_API int sapi_header_op(sapi_header_op_enum op, void *arg TSRMLS_DC) } zend_llist_add_element(&SG(sapi_headers).headers, (void *) &sapi_header); + } else { + sapi_free_header(&sapi_header); } return SUCCESS; } |