@@ -97,8 +97,8 @@ static void extend_timeout(reqtimeout_con_cfg *ccfg, apr_bucket_brigade *bb)
97
97
}
98
98
}
99
99
100
- static apr_status_t check_time_left (reqtimeout_con_cfg * ccfg ,
101
- apr_time_t now )
100
+ static apr_status_t check_and_update_time_left (reqtimeout_con_cfg * ccfg ,
101
+ apr_time_t now )
102
102
{
103
103
if (!now )
104
104
now = apr_time_now ();
@@ -209,11 +209,11 @@ static apr_status_t reqtimeout_filter(ap_filter_t *f,
209
209
/* set new timeout */
210
210
now = apr_time_now ();
211
211
ccfg -> timeout_at = now + apr_time_from_sec (ccfg -> cur_stage .timeout );
212
- ccfg -> cur_stage .timeout = 0 ;
213
212
if (ccfg -> cur_stage .max_timeout > 0 ) {
214
213
ccfg -> max_timeout_at = now + apr_time_from_sec (ccfg -> cur_stage .max_timeout );
215
214
ccfg -> cur_stage .max_timeout = 0 ;
216
215
}
216
+ ccfg -> cur_stage .timeout = 0 ;
217
217
}
218
218
else if (ccfg -> timeout_at == 0 ) {
219
219
/* no timeout set, or in between requests */
@@ -227,25 +227,27 @@ static apr_status_t reqtimeout_filter(ap_filter_t *f,
227
227
rv = apr_socket_timeout_get (ccfg -> socket , & saved_sock_timeout );
228
228
AP_DEBUG_ASSERT (rv == APR_SUCCESS );
229
229
230
- rv = check_time_left (ccfg , now );
230
+ rv = check_and_update_time_left (ccfg , now );
231
231
if (rv != APR_SUCCESS )
232
232
goto cleanup ;
233
233
234
234
if (mode == AP_MODE_GETLINE && block == APR_BLOCK_READ ) {
235
+ apr_off_t remaining = HUGE_STRING_LEN ;
236
+ #if APR_MAJOR_VERSION < 2
237
+ apr_int32_t nsds ;
238
+ apr_interval_time_t poll_timeout ;
239
+ apr_pollfd_t pollset ;
240
+ pollset .p = NULL ;
241
+ #endif
242
+
235
243
/*
236
244
* For a blocking AP_MODE_GETLINE read, apr_brigade_split_line()
237
245
* would loop until a whole line has been read. As this would make it
238
246
* impossible to enforce a total timeout, we only do non-blocking
239
247
* reads.
240
248
*/
241
- apr_off_t remaining = HUGE_STRING_LEN ;
242
249
do {
243
250
apr_off_t bblen ;
244
- #if APR_MAJOR_VERSION < 2
245
- apr_int32_t nsds ;
246
- apr_interval_time_t poll_timeout ;
247
- apr_pollfd_t pollset ;
248
- #endif
249
251
250
252
rv = ap_get_brigade (f -> next , bb , AP_MODE_GETLINE , APR_NONBLOCK_READ , remaining );
251
253
if (rv != APR_SUCCESS && !APR_STATUS_IS_EAGAIN (rv )) {
@@ -282,10 +284,12 @@ static apr_status_t reqtimeout_filter(ap_filter_t *f,
282
284
283
285
/* ... and wait for more */
284
286
#if APR_MAJOR_VERSION < 2
285
- pollset .p = f -> c -> pool ;
286
- pollset .desc_type = APR_POLL_SOCKET ;
287
- pollset .reqevents = APR_POLLIN |APR_POLLHUP ;
288
- pollset .desc .s = ccfg -> socket ;
287
+ if (pollset .p == NULL ) {
288
+ pollset .p = f -> c -> pool ;
289
+ pollset .desc_type = APR_POLL_SOCKET ;
290
+ pollset .reqevents = APR_POLLIN | APR_POLLHUP | APR_POLLERR ;
291
+ pollset .desc .s = ccfg -> socket ;
292
+ }
289
293
apr_socket_timeout_get (ccfg -> socket , & poll_timeout );
290
294
rv = apr_poll (& pollset , 1 , & nsds , poll_timeout );
291
295
#else
@@ -294,7 +298,7 @@ static apr_status_t reqtimeout_filter(ap_filter_t *f,
294
298
if (rv != APR_SUCCESS )
295
299
break ;
296
300
297
- rv = check_time_left (ccfg , 0 );
301
+ rv = check_and_update_time_left (ccfg , 0 );
298
302
if (rv != APR_SUCCESS )
299
303
break ;
300
304
@@ -306,12 +310,14 @@ static apr_status_t reqtimeout_filter(ap_filter_t *f,
306
310
}
307
311
else { /* mode != AP_MODE_GETLINE */
308
312
rv = ap_get_brigade (f -> next , bb , mode , block , readbytes );
313
+
309
314
/* Don't extend the timeout in speculative mode, wait for
310
315
* the real (relevant) bytes to be asked later, within the
311
316
* currently allotted time.
312
317
*/
313
- if (ccfg -> cur_stage .rate_factor && rv == APR_SUCCESS
314
- && mode != AP_MODE_SPECULATIVE ) {
318
+ if (rv == APR_SUCCESS
319
+ && mode != AP_MODE_SPECULATIVE
320
+ && ccfg -> cur_stage .rate_factor ) {
315
321
extend_timeout (ccfg , bb );
316
322
}
317
323
}
0 commit comments