Re: Backend reqrep rule with quotes

From: Cyril Bonté <cyril.bonte#free.fr>
Date: Wed, 20 Apr 2011 01:05:51 +0200


Hi Josh,

Le mercredi 20 avril 2011 00:32:45, Josh Brown (Mailing List) a écrit :
> Hi,
>
> I am wondering if anyone has been able to rewrite a request with regular
> expression to use double quotes.
>
> I need to rewrites the second variable with quotes around it for the
> backend application to accept it.
>
> Something like /service/list?key="value"
>
> I have tried the following rewrite rules on the backend before sending to
> the servers:
>
> reqrep ^([^\ ]*)\ /uri/list/(.+) \1\ /service/list?key="\2"
> reqrep ^([^\ ]*)\ /uri/list/(.+) \1\ /service/list?key=\"\2\"
> reqrep ^([^\ ]*)\ /uri/list/(.+) \1\ /service/list?key=\x22\2\x22
> reqrep ^([^\ ]*)\ /uri/list/(.+) \1\ /service/list?key=%22\2%22
>
> Unfortunately every time I do this the client gets back a 400 Bad Request.
>
> [19/Apr/2011:15:21:43.776] frontend backend/<NOSRV> -1/-1/-1/-1/0 400 187 -
> - PR-- 0/0/0/0/0 0/0 "GET /uri/list/value HTTP/1.0"
>
> If I remove the quotes the request goes through HAProxy just fine.
> Unfortunately the application then freaks out :-)
>
> This is HAProxy 1.4.8 on CentOS.
>
> Anyone have any ideas?

This is because your regexp also matches the HTTP/1.0 or HTTP/1.1 part of the request line, due to (.+).
For a request like :
GET /uri/list/foo HTTP/1.0
Your rewrite rules (I take the last one as an example, which looks to be what you need) will rewrite it as :
GET /service/list?key=%22foo HTTP/1.0%22

You can try something like this instead (not tested) : reqrep ^([^\ ]*)\ /uri/list/([^\ ]*)\ (.*) \1\ /service/list?key=%22\2%22\ \3

This should rewrite the following line : GET /uri/list/foo HTTP/1.0
as :
GET /service/list?key=%22foo%22 HTTP/1.0

-- 
Cyril Bonté
Received on 2011/04/20 01:05

This archive was generated by hypermail 2.2.0 : 2011/04/20 01:15 CEST