]> granicus.if.org Git - apache/commit
Merge r1833875 from trunk:
authorYann Ylavic <ylavic@apache.org>
Thu, 5 Jul 2018 19:15:40 +0000 (19:15 +0000)
committerYann Ylavic <ylavic@apache.org>
Thu, 5 Jul 2018 19:15:40 +0000 (19:15 +0000)
commit85d190ecb26e7e342df785c694481b9b92000768
tree24c023c965bde47f15a355c7f9cf20efde8560b5
parent92d315b8d6b8cc8dda2fb64bb23e7f917f08c57f
Merge r1833875 from trunk:

mod_ratelimit: fix behavior with proxied content

mod_ratelimit works by splitting data in "chunks"
to send to the client, sleeping a predefined amount
of time between them (200ms). So for example,
a rate-limit 40 value would correspond to a chunk size
of 8192 bytes, flushed to the client every 200ms.

The idea works fine when httpd directly serves the
content, since the filter will be called once with
a single bucket brigade. In the context of a proxied
content though the filter is likely to be called multiple
times, with a bucket brigade size that corresponds to
the maximum allowed buffer size. If this value is lower
or higher than the chunk size, the filter will not
properly rate limit the data going to the client.

This patch solves the problem with two fix:
1) do_sleep is now stored in the ctx context struct,
   so if the filter is invoked multiple times it
   will still sleep when needed. For example, say
   that the chunk_size is 8192 and the bucket brigate
   len is 10240: the filter will flush 8192 bytes
   on the first invocation, sleep 200ms, flush the
   remaining bytes and then finish. The next invocation
   will do the same, clearly not leading to the
   correct "sleeping pattern".
2) The example above highlights also another issue:
   mod_ratelimit should  flush only chunk_size bytes
   at the time (I am now excluding the burst calculation
   from the picture), and buffer between invocations
   unless the brigade contains EOS.

The change has been tested with various scenarios and
it looks working as expected, but of course more
feedback/testing is welcome.

The original patch was written by me and then Yann
refactored the code to be more precise and efficient,
basically transforming an axe in a wonderful Japanese
katana sword, so credits to him for this work.

PR: 62362

Submitted by: elukey
Reviewed by: elukey, jim, ylavic

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1835168 13f79535-47bb-0310-9956-ffa450edef68
CHANGES
docs/manual/mod/mod_ratelimit.xml
modules/filters/mod_ratelimit.c