]> granicus.if.org Git - php/commitdiff
Updated header_handler in apache2filter and apache_hooks
authorArnaud Le Blanc <lbarnaud@php.net>
Thu, 13 Nov 2008 13:41:08 +0000 (13:41 +0000)
committerArnaud Le Blanc <lbarnaud@php.net>
Thu, 13 Nov 2008 13:41:08 +0000 (13:41 +0000)
sapi/apache2filter/sapi_apache2.c
sapi/apache_hooks/mod_php5.c

index 1edc0f9ea3d745d2f25f954cc0c79f02e2d5b125..ecd1eb624d170b958b4a84106b649a6a06f61968 100644 (file)
@@ -91,7 +91,7 @@ php_apache_sapi_ub_write(const char *str, uint str_length TSRMLS_DC)
 }
 
 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;
        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);
        f = ctx->r->output_filters;
 
-       val = strchr(sapi_header->header, ':');
-
-       if (!val) {
-               sapi_free_header(sapi_header);
-               return 0;
+       switch(op) {
+               case SAPI_HEADER_DELETE:
+                       apr_table_unset(ctx->r->headers_out, sapi_header->header);
+                       return 0;
+
+               case SAPI_HEADER_DELETE_ALL:
+                       apr_table_clear(ctx->r->headers_out);
+                       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
index 83cca78b800847fe8a6073ca499d0f0b1621bdb5..1e66f443283780147835ad30849f4610f2df6d5b 100644 (file)
@@ -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;
+       }
 }
 /* }}} */