Updated header_handler in apache2filter and apache_hooks

This commit is contained in:
Arnaud Le Blanc 2008-11-13 13:41:08 +00:00
parent 494dbdb1c1
commit aaaf67e19e
2 changed files with 78 additions and 44 deletions

View file

@ -91,7 +91,7 @@ php_apache_sapi_ub_write(const char *str, uint str_length TSRMLS_DC)
} }
static int static int
php_apache_sapi_header_handler(sapi_header_struct *sapi_header, sapi_headers_struct *sapi_headers TSRMLS_DC) php_apache_sapi_header_handler(sapi_header_struct *sapi_header, sapi_header_op_enum op, sapi_headers_struct *sapi_headers TSRMLS_DC)
{ {
php_struct *ctx; php_struct *ctx;
ap_filter_t *f; ap_filter_t *f;
@ -100,29 +100,44 @@ php_apache_sapi_header_handler(sapi_header_struct *sapi_header, sapi_headers_str
ctx = SG(server_context); ctx = SG(server_context);
f = ctx->r->output_filters; f = ctx->r->output_filters;
val = strchr(sapi_header->header, ':'); switch(op) {
case SAPI_HEADER_DELETE:
apr_table_unset(ctx->r->headers_out, sapi_header->header);
return 0;
if (!val) { case SAPI_HEADER_DELETE_ALL:
sapi_free_header(sapi_header); apr_table_clear(ctx->r->headers_out);
return 0; return 0;
case SAPI_HEADER_ADD:
case SAPI_HEADER_REPLACE:
val = strchr(sapi_header->header, ':');
if (!val) {
sapi_free_header(sapi_header);
return 0;
}
ptr = val;
*val = '\0';
do {
val++;
} while (*val == ' ');
if (!strcasecmp(sapi_header->header, "content-type"))
ctx->r->content_type = apr_pstrdup(ctx->r->pool, val);
else if (op == SAPI_HEADER_REPLACE)
apr_table_set(ctx->r->headers_out, sapi_header->header, val);
else
apr_table_add(ctx->r->headers_out, sapi_header->header, val);
*ptr = ':';
return SAPI_HEADER_ADD;
default:
return 0;
} }
ptr = val;
*val = '\0';
do {
val++;
} while (*val == ' ');
if (!strcasecmp(sapi_header->header, "content-type"))
ctx->r->content_type = apr_pstrdup(ctx->r->pool, val);
else if (sapi_header->replace)
apr_table_set(ctx->r->headers_out, sapi_header->header, val);
else
apr_table_add(ctx->r->headers_out, sapi_header->header, val);
*ptr = ':';
return SAPI_HEADER_ADD;
} }
static int static int

View file

@ -34,7 +34,7 @@ static void php_save_umask(void);
static void php_restore_umask(void); static void php_restore_umask(void);
static int sapi_apache_read_post(char *buffer, uint count_bytes TSRMLS_DC); static int sapi_apache_read_post(char *buffer, uint count_bytes TSRMLS_DC);
static char *sapi_apache_read_cookies(TSRMLS_D); 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 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_php(request_rec *r, int display_source_mode, char *filename);
static int send_parsed_php(request_rec * r); static int send_parsed_php(request_rec * r);
@ -308,35 +308,54 @@ static char *sapi_apache_read_cookies(TSRMLS_D)
/* {{{ sapi_apache_header_handler /* {{{ 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; char *header_name, *header_content, *p;
request_rec *r = (request_rec *) SG(server_context); request_rec *r = (request_rec *) SG(server_context);
if(!r) {
header_name = sapi_header->header;
header_content = p = strchr(header_name, ':');
if (!p) {
efree(sapi_header->header);
return 0; return 0;
} }
*p = 0; switch(op) {
do { case SAPI_HEADER_DELETE_ALL:
header_content++; clear_table(r->headers_out);
} while (*header_content==' '); return 0;
if (!strcasecmp(header_name, "Content-Type")) { case SAPI_HEADER_DELETE:
r->content_type = pstrdup(r->pool, header_content); table_unset(r->headers_out, sapi_header->header);
} else if (!strcasecmp(header_name, "Set-Cookie")) { return 0;
table_add(r->headers_out, header_name, header_content);
} else { case SAPI_HEADER_ADD:
table_set(r->headers_out, header_name, header_content); 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 */
return SAPI_HEADER_ADD;
default:
return 0;
} }
*p = ':'; /* a well behaved header handler shouldn't change its original arguments */
return SAPI_HEADER_ADD;
} }
/* }}} */ /* }}} */