Am 15.05.2019 um 17:09 schrieb Tim Düsterhus:
> Willy,
> 
> Am 15.05.19 um 11:31 schrieb Tim Düsterhus:
>>>> 2. 'req*' and 'rsp*'. I remember that they allow some modification that
>>>>    cannot easily be replicated otherwise (but I'll have to check that
>>>>    first).
>>>
>>> Sure but practically speaking such modifications do not make sense in
>>> the real world (e.g. rename many header names at once). And the "excuse"
>>
>> I believe it was some kind of request path rewriting that was not easily
>> possibly with `http-request set-path` (maybe because of syntax
>> limitations). I'll definitely check and report back.
>>
> 
> Okay, I looked it up. It's simple: Everything that needs capturing
> groups for the path modifications is not exactly trivial or clean to
> replicate otherwise (but it's possible as I found out by scrolling
> through the docs and seeing http-request replace-header):
> 
> Consider I have URLs in a folder that I want to map to “git object
> directory style” hashed folders (that's a hypothetical example, but I've
> used something similar in production):
> 
> /foo/1234.png will become /12/34
> 
> This is my config:
> 
>> defaults
>>      timeout server 1s
>>      mode http
>>      option httpclose
>>      
>> listen fe
>>      bind :8080
>>      reqrep ^([^\ :]*)\ /foo/(.{2})(.*).png \1\ /\2/\3
>>      http-request set-header FE 1
>>
>>      server example localhost:8082
>>
>> listen fe2
>>      bind :8081
>>      http-request set-header XXX %[path]
>>      http-request replace-header XXX /foo/(.{2})(.*).png /\1/\2
>>      http-request set-path %[req.hdr(XXX)]
>>      http-request del-header XXX
>>      http-request set-header FE 2
>>
>>      server example localhost:8082
> 
> Both frontends will do the correct replacement, but IMO the reqrep one
> is more readable (not that any of these are really readable):
> 
>> [timwolla@~]begin
>>                 nc -l 127.0.0.1 8082 &
>>                 curl -q localhost:8080/foo/1234.png
>>                 wait
>>                 echo ============
>>                 nc -l 127.0.0.1 8082 &
>>                 curl -q localhost:8081/foo/1234.png
>>                 wait
>>             end
>> GET /12/34 HTTP/1.1
>> host: localhost:8080
>> user-agent: curl/7.47.0
>> accept: */*
>> fe: 1
>>
>> <html><body><h1>504 Gateway Time-out</h1>
>> The server didn't respond in time.
>> </body></html>
>> ============
>> GET /12/34 HTTP/1.1
>> host: localhost:8081
>> user-agent: curl/7.47.0
>> accept: */*
>> fe: 2
>> Connection: close
>>
>> <html><body><h1>504 Gateway Time-out</h1>
>> The server didn't respond in time.
>> </body></html>
> 
> The obvious `http-request set-path %[path,regsub(...)]` as suggested in
> the docs for `http-request set-query` does *NOT* work, because the
> `regsub` parameters cannot contain the closing parenthesis required for
> capture groups.


Uh yes that's really unhandy.

How about to reuse the `create_cond_regex_rule(...)` for

http-(request|respone) replace <search> <replace> [ { if | unless }<condition> ]
http-(request|respone) ireplace <search> <replace> [{ if | unless} <condition> ]

which uses `chain_regex(...)` or maybe it's easier to add to `regsub` a backtick
possibility?

> Best regards
> Tim Düsterhus

Best regards
Aleks

Reply via email to