Skip to content

Commit e850634

Browse files
author
Nick Kew
committed
Fixup broken handling of range header.
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@105613 13f79535-47bb-0310-9956-ffa450edef68
1 parent f680d9a commit e850634

2 files changed

Lines changed: 13 additions & 6 deletions

File tree

include/util_filter.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -256,9 +256,6 @@ struct ap_filter_rec_t {
256256

257257
/** Protocol flags for this filter */
258258
unsigned int proto_flags;
259-
260-
/** Save Ranges header if this filter unsets it */
261-
const char* range;
262259
};
263260

264261
/**

modules/experimental/mod_filter.c

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@ typedef struct {
100100
mod_filter_chain *chain;
101101
} mod_filter_cfg;
102102

103+
typedef struct {
104+
const char* range ;
105+
} mod_filter_ctx ;
106+
103107

104108
static void filter_trace(apr_pool_t *pool, int debug, const char *fname,
105109
apr_bucket_brigade *bb)
@@ -164,6 +168,8 @@ static int filter_lookup(ap_filter_t *f, ap_filter_rec_t *filter)
164168
request_rec *r = f->r;
165169
harness_ctx *ctx = f->ctx;
166170
provider_ctx *pctx;
171+
mod_filter_ctx *rctx = ap_get_module_config(r->request_config,
172+
&filter_module);
167173

168174
/* Check registered providers in order */
169175
for (provider = filter->providers; provider; provider = provider->next) {
@@ -307,8 +313,10 @@ static int filter_lookup(ap_filter_t *f, ap_filter_rec_t *filter)
307313
if (proto_flags & AP_FILTER_PROTO_NO_BYTERANGE) {
308314
apr_table_unset(r->headers_out, "Accept-Ranges");
309315
}
310-
else if (filter->range) {
311-
apr_table_setn(r->headers_in, "Range", filter->range);
316+
else if (rctx && rctx->range) {
317+
/* restore range header we saved earlier */
318+
apr_table_setn(r->headers_in, "Range", rctx->range);
319+
rctx->range = NULL;
312320
}
313321
#endif
314322
for (pctx = ctx->init_ctx; pctx; pctx = pctx->next) {
@@ -709,6 +717,8 @@ static void filter_insert(request_rec *r)
709717
&filter_module);
710718
#ifndef NO_PROTOCOL
711719
int ranges = 1;
720+
mod_filter_ctx *ctx = apr_pcalloc(r->pool, sizeof(mod_filter_ctx));
721+
ap_set_module_config(r->request_config, &filter_module, ctx);
712722
#endif
713723

714724
for (p = cfg->chain; p; p = p->next) {
@@ -718,7 +728,7 @@ static void filter_insert(request_rec *r)
718728
if (ranges && (filter->proto_flags
719729
& (AP_FILTER_PROTO_NO_BYTERANGE
720730
| AP_FILTER_PROTO_CHANGE_LENGTH))) {
721-
filter->range = apr_table_get(r->headers_in, "Range");
731+
ctx->range = apr_table_get(r->headers_in, "Range");
722732
apr_table_unset(r->headers_in, "Range");
723733
ranges = 0;
724734
}

0 commit comments

Comments
 (0)