Oh, one more question: if I use reqrep to modify the cookies header
that's going to destroy the original header, I suspect, which would
cause problems for the web server that wants to read those cookies. Is
there any way around that?

On Wed, May 9, 2012 at 3:51 PM, Malcolm Handley <[email protected]> wrote:
> On Tue, May 8, 2012 at 1:24 AM, Willy Tarreau <[email protected]> wrote:
>> Hi Malcolm,
>>
>> On Mon, May 07, 2012 at 06:19:36PM -0700, Malcolm Handley wrote:
>>> I'd like to write an ACL that compares the integer value of a cookie
>>> with a constant. (My goal is to be able to block percentiles of our
>>> users if we have more traffic than we can handle, so I want to block a
>>> request if the cookie's value is, say, less then 25.)
>>>
>>> I understand that I can do something like
>>>     hdr_sub(cookie) -i <regular expression>
>>> but that doesn't let me treat the value as an integer and compare it.
>>>
>>> I also know about
>>>     hdr_val(<header>)
>>> but that gives me the entire value of the cookie header, not just the
>>> value of a particular cookie.
>>>
>>> Is there any way that I can do this?
>>
>> In the next snapshot I hope to be able to push today, there is a new
>> cookie pattern fetch method which brings a number of "cook_*" ACL keywords.
>> It does not have cook_val at the moment, but I can check if that's hard
>> to add or not.
>
> Cook_val sounds great if you happen to add that. How long do snapshots
> take to become the stable version, generally? We've had some outages
> (nothing to do with haproxy, which works great) and definitely don't
> want to put bleeding-edge code into production at the moment.
>
>> In the mean time, I think that if you manage to rewrite your cookie header
>> to replace it with a header holding only the value, it might work, though
>> it's dirty and quite tricky.
>
> This is a great suggestion. Can you confirm that header rewriting
> happens before other calls to hdr_val? (Do the commands happen in
> order?) (One thing that's great about this is it would also let me
> avoid creating a new header. My goal is to write an ACL of the form
> [block if cook_value(user_id) % 1000 < 250] but ACLs don't support
> much math. But your suggestion would get around this.)
>
>> Instead, with regex you can actually match integer expressions, it's just
>> a bit complicated but doable. For instance, a value below 25 might be
>> defined like this (not tested right now but you get the idea) :
>>
>>      COOK=([0-9]|1[0-9]|2[0-4])([^0-9]|$)
>>
>> I've been doing this for a long time to extract requests by response times
>> in logs until I got fed up and wrote halog.
>
> Yeah. I thought of this too. I know that I could do it but we are
> creating a tool to use in emergencies and I think that I'd be
> frightened of messing it up in some small but important way. :-)
>
> Thanks for the help.

Reply via email to