1
Pr�voir des commandes en plusieurs mots cl�s.
7
On doit aussi accepter les pr�fixes :
12
Pr�voir de ranger les combinaisons dans un tableau. On doit m�me
13
pouvoir effectuer un mapping simplifiant le parseur.
19
<direction> <where> <what> <operator> <pattern> <action> [ <args>* ]
21
<direction> = [ req | rsp ]
22
<where> = [ in | out ]
23
<what> = [ line | LINE | METH | URI | h(hdr) | H(hdr) | c(cookie) | C(cookie) ]
24
<operator> = [ == | =~ | =* | =^ | =/ | != | !~ | !* | !^ | !/ ]
25
<pattern> = "<string>"
26
<action> = [ allow | permit | deny | delete | replace | switch | add | set | redir ]
27
<args> = optionnal action args
31
req in URI =^ "/images" switch images
32
req in h(host) =* ".mydomain.com" switch mydomain
33
req in h(host) =~ "localhost(.*)" replace "www\1"
37
<direction> <where> <action> [not] <what> [<operator> <pattern> [ <args>* ]]
39
req in switch URI =^ "/images" images
40
req in switch h(host) =* ".mydomain.com" mydomain
41
req in replace h(host) =~ "localhost(.*)" "www\1"
42
req in delete h(Connection)
43
req in deny not line =~ "((GET|HEAD|POST|OPTIONS) /)|(OPTIONS *)"
44
req out set h(Connection) "close"
45
req out add line "Server: truc"
48
<direction> <action> <where> [not] <what> [<operator> <pattern> [ <args>* ]] ';' <action2> <what2>
50
req in switch URI =^ "/images/" images ; replace "/"
51
req in switch h(host) =* ".mydomain.com" mydomain
52
req in replace h(host) =~ "localhost(.*)" "www\1"
53
req in delete h(Connection)
54
req in deny not line =~ "((GET|HEAD|POST|OPTIONS) /)|(OPTIONS *)"
55
req out set h(Connection) "close"
56
req out add line == "Server: truc"
59
Extension avec des ACL :
61
req in acl(meth_valid) METH =~ "(GET|POST|HEAD|OPTIONS)"
62
req in acl(meth_options) METH == "OPTIONS"
63
req in acl(uri_slash) URI =^ "/"
64
req in acl(uri_star) URI == "*"
66
req in deny acl !(meth_options && uri_star || meth_valid && uri_slash)
68
Peut-�tre plus simplement :
70
acl meth_valid METH =~ "(GET|POST|HEAD|OPTIONS)"
71
acl meth_options METH == "OPTIONS"
72
acl uri_slash URI =^ "/"
73
acl uri_star URI == "*"
75
req in deny not acl(meth_options uri_star, meth_valid uri_slash)
77
req in switch URI =^ "/images/" images ; replace "/"
78
req in switch h(host) =* ".mydomain.com" mydomain
79
req in replace h(host) =~ "localhost(.*)" "www\1"
80
req in delete h(Connection)
81
req in deny not line =~ "((GET|HEAD|POST|OPTIONS) /)|(OPTIONS *)"
82
req out set h(Connection) "close"
83
req out add line == "Server: truc"
85
Pr�voir le cas du "if" pour ex�cuter plusieurs actions :
87
req in if URI =^ "/images/" then replace "/" ; switch images
89
Utiliser les noms en majuscules/minuscules pour indiquer si on veut prendre
90
en compte la casse ou non :
92
if uri =^ "/watch/" setbe watch rebase "/watch/" "/"
93
if uri =* ".jpg" setbe images
94
if uri =~ ".*dll.*" deny
95
if HOST =* ".mydomain.com" setbe mydomain
98
Another solution would be to have a dedicated keyword to URI remapping. It
99
would both rewrite the URI and optionally switch to another backend.
101
uriremap "/watch/" "/" watch
102
uriremap "/chat/" "/" chat
103
uriremap "/event/" "/event/" event
107
uriremap "/watch/" watch "/"
108
uriremap "/chat/" chat "/"
109
uriremap "/event/" event
111
For the URI, using a regex is sometimes useful (eg: providing a set of possible prefixes.
114
Sinon, peut-�tre que le "switch" peut prendre un param�tre de mapping pour la partie match�e :
116
req in switch URI =^ "/images/" images:"/"
119
2007/03/31 - Besoins plus pr�cis.
121
1) aucune extension de branchement ou autre dans les "listen", c'est trop complexe.
123
Distinguer les donn�es entrantes (in) et sortantes (out).
125
Le frontend ne voit que les requetes entrantes et les r�ponses sortantes.
126
Le backend voir les requ�tes in/out et les r�ponses in/out.
127
Le frontend permet les branchements d'ensembles de filtres de requ�tes vers
128
d'autres. Le frontend et les ensembles de filtres de requ�tes peuvent brancher
131
-----------+--------+----------+----------+---------+----------+
133
\______ | Listen | Frontend | ReqRules | Backend | RspRules |
135
Capability | | | | | |
136
-----------+--------+----------+----------+---------+----------+
137
Frontend | X | X | | | |
138
-----------+--------+----------+----------+---------+----------+
139
FiltReqIn | X | X | X | X | |
140
-----------+--------+----------+----------+---------+----------+
141
JumpFiltReq| X | X | X | | | \
142
-----------+--------+----------+----------+---------+----------+ > = ReqJump
143
SetBackend | X | X | X | | | /
144
-----------+--------+----------+----------+---------+----------+
145
FiltReqOut | | | | X | |
146
-----------+--------+----------+----------+---------+----------+
147
FiltRspIn | X | | | X | X |
148
-----------+--------+----------+----------+---------+----------+
149
JumpFiltRsp| | | | X | X |
150
-----------+--------+----------+----------+---------+----------+
151
FiltRspOut | | X | | X | X |
152
-----------+--------+----------+----------+---------+----------+
153
Backend | X | | | X | |
154
-----------+--------+----------+----------+---------+----------+
159
Il y a au moins besoin de distinguer 8 fonctionnalit�s de base :
160
- capacit� � recevoir des connexions (frontend)
161
- capacit� � filtrer les requ�tes entrantes
162
- capacit� � brancher vers un backend ou un ensemble de r�gles de requ�tes
163
- capacit� � filtrer les requ�tes sortantes
164
- capacit� � filtrer les r�ponses entrantes
165
- capacit� � brancher vers un autre ensemble de r�gles de r�ponses
166
- capacit� � filtrer la r�ponse sortante
167
- capacit� � g�rer des serveurs (backend)
171
- on a souvent besoin de pouvoir appliquer un petit traitement sur un ensemble
172
host/uri/autre. Le petit traitement peut consister en quelques filtres ainsi
173
qu'une r��criture du couple (host,uri).
181
acl <name> <what> <operator> <value> ...
183
Ceci cr�era une acl r�f�renc�e sous le nom <name> qui sera valid�e si
184
l'application d'au moins une des valeurs <value> avec l'op�rateur <operator>
185
sur le sujet <what> est valid�e.
190
Toujours 2 caract�res :
195
'=' : OK si test valide
196
'!' : OK si test �chou�.
199
'~' : compare avec une regex
200
'=' : compare cha�ne � cha�ne
201
'*' : compare la fin de la cha�ne (ex: =* ".mydomain.com")
202
'^' : compare le d�but de la cha�ne (ex: =^ "/images/")
203
'%' : recherche une sous-cha�ne
204
'/' : compare avec un mot entier en acceptant le '/' comme d�limiteur
205
'.' : compare avec un mot entier en acceptant el '.' comme d�limiteur
207
Ensuite on ex�cute une action de mani�re conditionnelle si l'ensemble des ACLs
208
mentionn�es sont valid�es (ou invalid�es pour celles pr�c�d�es d'un "!") :
210
<what> <where> <action> on [!]<aclname> ...
216
acl www_pub host =. www www01 dev preprod
217
acl imghost host =. images
218
acl imgdir uri =/ img
219
acl imagedir uri =/ images
220
acl msie h(user-agent) =% "MSIE"
222
set_host "images" on www_pub imgdir
223
remap_uri "/img" "/" on www_pub imgdir
224
remap_uri "/images" "/" on www_pub imagedir
225
setbe images on imghost
226
reqdel "Cookie" on all
232
req {in|out} {append|delete|rem|add|set|rep|mapuri|rewrite|reqline|deny|allow|setbe|tarpit}
233
resp {in|out} {append|delete|rem|add|set|rep|maploc|rewrite|stsline|deny|allow}
236
req in delete <line_regex>
238
req in add <header> <new_value>
239
req in set <header> <new_value>
240
req in rep <header> <old_value> <new_value>
241
req in mapuri <old_uri_prefix> <new_uri_prefix>
242
req in rewrite <old_uri_regex> <new_uri>
243
req in reqline <old_req_regex> <new_req>
247
req in setbe <backend>
249
resp out maploc <old_location_prefix> <new_loc_prefix>
250
resp out stsline <old_sts_regex> <new_sts_regex>
252
Les cha�nes doivent �tre d�limit�es par un m�me caract�re au d�but et � la fin,
253
qui doit �tre �chapp� s'il est pr�sent dans la cha�ne. Tout ce qui se trouve
254
entre le caract�re de fin et les premiers espace est consid�r� comme des
255
options pass�es au traitement. Par exemple :
257
req in rep host /www/i /www/
258
req in rep connection /keep-alive/i "close"
260
Il serait pratique de pouvoir effectuer un remap en m�me temps qu'un setbe.
262
Captures: les s�parer en in/out. Les rendre conditionnelles ?