summaryrefslogtreecommitdiff
path: root/main/SAPI.c
diff options
context:
space:
mode:
authorArnaud Le Blanc <lbarnaud@php.net>2008-11-13 10:14:04 +0000
committerArnaud Le Blanc <lbarnaud@php.net>2008-11-13 10:14:04 +0000
commit8c4151ad72b6c5a82b341aaf59d2c31521ca4341 (patch)
treeccc7c01da54fd7f7a02d03d7017e78a359aa254e /main/SAPI.c
parent06119f4748066e61163764bbb31d1db4b21b6d07 (diff)
downloadphp-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.c45
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;
}