diff options
Diffstat (limited to 'sapi/apache_hooks/mod_php5.c')
| -rw-r--r-- | sapi/apache_hooks/mod_php5.c | 61 | 
1 files changed, 40 insertions, 21 deletions
diff --git a/sapi/apache_hooks/mod_php5.c b/sapi/apache_hooks/mod_php5.c index 83cca78b80..1e66f44328 100644 --- a/sapi/apache_hooks/mod_php5.c +++ b/sapi/apache_hooks/mod_php5.c @@ -34,7 +34,7 @@ static void php_save_umask(void);  static void php_restore_umask(void);  static int sapi_apache_read_post(char *buffer, uint count_bytes TSRMLS_DC);  static char *sapi_apache_read_cookies(TSRMLS_D); -static int sapi_apache_header_handler(sapi_header_struct *sapi_header, sapi_headers_struct *sapi_headers TSRMLS_DC); +static int sapi_apache_header_handler(sapi_header_struct *sapi_header, sapi_header_op_enum op, sapi_headers_struct *sapi_headers TSRMLS_DC);  static int sapi_apache_send_headers(sapi_headers_struct *sapi_headers TSRMLS_DC);  static int send_php(request_rec *r, int display_source_mode, char *filename);  static int send_parsed_php(request_rec * r); @@ -308,35 +308,54 @@ static char *sapi_apache_read_cookies(TSRMLS_D)  /* {{{ sapi_apache_header_handler   */ -static int sapi_apache_header_handler(sapi_header_struct *sapi_header, sapi_headers_struct *sapi_headers TSRMLS_DC) +static int sapi_apache_header_handler(sapi_header_struct *sapi_header, sapi_header_op_enum op, sapi_headers_struct *sapi_headers TSRMLS_DC)  {  	char *header_name, *header_content, *p;  	request_rec *r = (request_rec *) SG(server_context); - -	header_name = sapi_header->header; - -	header_content = p = strchr(header_name, ':'); -	if (!p) { -		efree(sapi_header->header); +	if(!r) {  		return 0;  	} -	*p = 0; -	do { -		header_content++; -	} while (*header_content==' '); +	switch(op) { +		case SAPI_HEADER_DELETE_ALL: +			clear_table(r->headers_out); +			return 0; -	if (!strcasecmp(header_name, "Content-Type")) { -		r->content_type = pstrdup(r->pool, header_content); -	} else if (!strcasecmp(header_name, "Set-Cookie")) { -		table_add(r->headers_out, header_name, header_content); -	} else { -		table_set(r->headers_out, header_name, header_content); -	} +		case SAPI_HEADER_DELETE: +			table_unset(r->headers_out, sapi_header->header); +			return 0; + +		case SAPI_HEADER_ADD: +		case SAPI_HEADER_REPLACE: +			header_name = sapi_header->header; + +			header_content = p = strchr(header_name, ':'); +			if (!p) { +				return 0; +			} + +			*p = 0; +			do { +				header_content++; +			} while (*header_content==' '); + +			if (!strcasecmp(header_name, "Content-Type")) { +				r->content_type = pstrdup(r->pool, header_content); +			} else if (!strcasecmp(header_name, "Set-Cookie")) { +				table_add(r->headers_out, header_name, header_content); +			} else if (op == SAPI_HEADER_REPLACE) { +				table_set(r->headers_out, header_name, header_content); +			} else { +				table_add(r->headers_out, header_name, header_content); +			} -	*p = ':';  /* a well behaved header handler shouldn't change its original arguments */ +			*p = ':';  /* a well behaved header handler shouldn't change its original arguments */ -	return SAPI_HEADER_ADD; +			return SAPI_HEADER_ADD; + +		default: +			return 0; +	}  }  /* }}} */  | 
