struct check_header_ctx {
request_rec *r;
int strict;
- const char *badheader;
};
/* check a single header, to be used with apr_table_do() */
"Response header name '%s' contains invalid "
"characters, aborting request",
name);
- ctx->badheader = name;
return 0;
}
"Response header '%s' value of '%s' contains invalid "
"characters, aborting request",
name, val);
- ctx->badheader = name;
return 0;
}
return 1;
struct check_header_ctx ctx;
core_server_config *conf =
ap_get_core_module_config(r->server->module_config);
- int rv = 1;
ctx.r = r;
ctx.strict = (conf->http_conformance != AP_HTTP_CONFORMANCE_UNSAFE);
- ctx.badheader = NULL;
+ if (!apr_table_do(check_header, &ctx, r->headers_out, NULL))
+ return 0; /* problem has been logged by check_header() */
- while (!apr_table_do(check_header, &ctx, r->headers_out, NULL)){
- if (ctx.badheader) {
- apr_table_unset(r->headers_out, ctx.badheader);
- apr_table_unset(r->err_headers_out, ctx.badheader);
- }
- rv = 0; /* problem has been logged by check_header() */
- }
-
- return rv;
+ return 1;
}
typedef struct header_struct {
}
if (!check_headers(r)) {
- r->status = 500;
+ ap_die(HTTP_INTERNAL_SERVER_ERROR, r);
+ return AP_FILTER_ERROR;
}
/*