summaryrefslogtreecommitdiffstats
path: root/doc/design-thoughts/config-language.txt
blob: 20c4fbd2bb294e24b2c40ffbb9c70ebada5346cf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
Pr�voir des commandes en plusieurs mots cl�s.
Par exemple :

  timeout connection XXX
  connection scale XXX

On doit aussi accepter les pr�fixes :

  tim co XXX
  co sca XXX

Pr�voir de ranger les combinaisons dans un tableau. On doit m�me
pouvoir effectuer un mapping simplifiant le parseur.


Pour les filtres :


    <direction> <where> <what> <operator> <pattern> <action> [ <args>* ]

    <direction> = [ req | rsp ]
    <where>     = [ in | out ]
    <what>      = [ line | LINE | METH | URI | h(hdr) | H(hdr) | c(cookie) | C(cookie) ]
    <operator>  = [ == | =~ | =* | =^ | =/ | != | !~ | !* | !^ | !/ ]
    <pattern>   = "<string>"
    <action>    = [ allow | permit | deny | delete | replace | switch | add | set | redir ]
    <args>      = optional action args

    examples:

        req in URI     =^ "/images" switch images
        req in h(host) =* ".mydomain.com" switch mydomain
        req in h(host) =~ "localhost(.*)" replace "www\1"

    alternative :

    <direction> <where> <action> [not] <what> [<operator> <pattern> [ <args>* ]]

        req in  switch   URI     =^ "/images" images
        req in  switch   h(host) =* ".mydomain.com" mydomain
        req in  replace  h(host) =~ "localhost(.*)" "www\1"
        req in  delete   h(Connection)
        req in  deny not line =~ "((GET|HEAD|POST|OPTIONS) /)|(OPTIONS *)"
        req out set      h(Connection) "close"
        req out add      line "Server: truc"


    <direction> <action> <where> [not] <what> [<operator> <pattern> [ <args>* ]] ';' <action2> <what2>

        req in  switch   URI     =^ "/images/" images ; replace "/"
        req in  switch   h(host) =* ".mydomain.com" mydomain
        req in  replace  h(host) =~ "localhost(.*)" "www\1"
        req in  delete   h(Connection)
        req in  deny not line =~ "((GET|HEAD|POST|OPTIONS) /)|(OPTIONS *)"
        req out set      h(Connection) "close"
        req out add      line == "Server: truc"


Extension avec des ACL :

        req in acl(meth_valid)   METH =~ "(GET|POST|HEAD|OPTIONS)"  
        req in acl(meth_options) METH == "OPTIONS" 
        req in acl(uri_slash)    URI  =^ "/" 
        req in acl(uri_star)     URI  == "*" 

        req in deny acl !(meth_options && uri_star || meth_valid && uri_slash)

Peut-�tre plus simplement :

        acl meth_valid   METH =~ "(GET|POST|HEAD|OPTIONS)"  
        acl meth_options METH == "OPTIONS" 
        acl uri_slash    URI  =^ "/" 
        acl uri_star     URI  == "*" 

        req in  deny not acl(meth_options uri_star, meth_valid uri_slash)

        req in  switch   URI     =^ "/images/" images ; replace "/"
        req in  switch   h(host) =* ".mydomain.com" mydomain
        req in  replace  h(host) =~ "localhost(.*)" "www\1"
        req in  delete   h(Connection)
        req in  deny not line =~ "((GET|HEAD|POST|OPTIONS) /)|(OPTIONS *)"
        req out set      h(Connection) "close"
        req out add      line == "Server: truc"

Pr�voir le cas du "if" pour ex�cuter plusieurs actions :

        req in  if URI =^ "/images/" then replace "/" ; switch images

Utiliser les noms en majuscules/minuscules pour indiquer si on veut prendre
en compte la casse ou non :

        if uri  =^ "/watch/"       setbe watch   rebase "/watch/" "/"
        if uri  =* ".jpg"          setbe images
        if uri  =~ ".*dll.*"       deny
        if HOST =* ".mydomain.com" setbe mydomain
        etc...

Another solution would be to have a dedicated keyword to URI remapping. It
would both rewrite the URI and optionally switch to another backend.

        uriremap "/watch/"  "/"       watch
        uriremap "/chat/"   "/"       chat
        uriremap "/event/"  "/event/" event

Or better :

        uriremap "/watch/"  watch  "/"
        uriremap "/chat/"   chat   "/"
        uriremap "/event/"  event

For the URI, using a regex is sometimes useful (eg: providing a set of possible prefixes.


Sinon, peut-�tre que le "switch" peut prendre un param�tre de mapping pour la partie match�e :

        req in  switch   URI     =^ "/images/" images:"/"


2007/03/31 - Besoins plus pr�cis.

1) aucune extension de branchement ou autre dans les "listen", c'est trop complexe.

Distinguer les donn�es entrantes (in) et sortantes (out).

Le frontend ne voit que les requetes entrantes et les r�ponses sortantes.
Le backend voir les requ�tes in/out et les r�ponses in/out.
Le frontend permet les branchements d'ensembles de filtres de requ�tes vers
d'autres. Le frontend et les ensembles de filtres de requ�tes peuvent brancher
vers un backend.

-----------+--------+----------+----------+---------+----------+
  \  Where |        |          |          |         |          |
   \______ | Listen | Frontend | ReqRules | Backend | RspRules |
          \|        |          |          |         |          |
Capability |        |          |          |         |          |
-----------+--------+----------+----------+---------+----------+
Frontend   |    X   |     X    |          |         |          |
-----------+--------+----------+----------+---------+----------+
FiltReqIn  |    X   |     X    |     X    |    X    |          |
-----------+--------+----------+----------+---------+----------+
JumpFiltReq|    X   |     X    |     X    |         |          | \
-----------+--------+----------+----------+---------+----------+  > = ReqJump
SetBackend |    X   |     X    |     X    |         |          | /
-----------+--------+----------+----------+---------+----------+
FiltReqOut |        |          |          |    X    |          |
-----------+--------+----------+----------+---------+----------+
FiltRspIn  |    X   |          |          |    X    |     X    |
-----------+--------+----------+----------+---------+----------+
JumpFiltRsp|        |          |          |    X    |     X    |
-----------+--------+----------+----------+---------+----------+
FiltRspOut |        |     X    |          |    X    |     X    |
-----------+--------+----------+----------+---------+----------+
Backend    |    X   |          |          |    X    |          |
-----------+--------+----------+----------+---------+----------+

En conclusion
-------------

Il y a au moins besoin de distinguer 8 fonctionnalit�s de base :
 - capacit� � recevoir des connexions (frontend)
 - capacit� � filtrer les requ�tes entrantes
 - capacit� � brancher vers un backend ou un ensemble de r�gles de requ�tes
 - capacit� � filtrer les requ�tes sortantes
 - capacit� � filtrer les r�ponses entrantes
 - capacit� � brancher vers un autre ensemble de r�gles de r�ponses
 - capacit� � filtrer la r�ponse sortante
 - capacit� � g�rer des serveurs (backend)

Remarque
--------
 - on a souvent besoin de pouvoir appliquer un petit traitement sur un ensemble
   host/uri/autre. Le petit traitement peut consister en quelques filtres ainsi
   qu'une r��criture du couple (host,uri).


Proposition : ACL

Syntaxe :
---------

   acl <name> <what> <operator> <value> ...

Ceci cr�era une acl r�f�renc�e sous le nom <name> qui sera valid�e si
l'application d'au moins une des valeurs <value> avec l'op�rateur <operator>
sur le sujet <what> est valid�e.

Op�rateurs :
------------

Toujours 2 caract�res :

  [=!][~=*^%/.]

Premier caract�re :  
   '=' : OK si test valide
   '!' : OK si test �chou�.

Second caract�re :
   '~' : compare avec une regex
   '=' : compare cha�ne � cha�ne
   '*' : compare la fin de la cha�ne (ex: =* ".mydomain.com")
   '^' : compare le d�but de la cha�ne (ex: =^ "/images/")
   '%' : recherche une sous-cha�ne
   '/' : compare avec un mot entier en acceptant le '/' comme d�limiteur
   '.' : compare avec un mot entier en acceptant el '.' comme d�limiteur

Ensuite on ex�cute une action de mani�re conditionnelle si l'ensemble des ACLs
mentionn�es sont valid�es (ou invalid�es pour celles pr�c�d�es d'un "!") :

   <what> <where> <action> on [!]<aclname> ...


Exemple :
---------

   acl www_pub host =. www www01 dev preprod
   acl imghost host =. images
   acl imgdir   uri =/ img
   acl imagedir uri =/ images
   acl msie h(user-agent) =% "MSIE"

   set_host  "images"       on www_pub imgdir 
   remap_uri "/img"    "/"  on www_pub imgdir
   remap_uri "/images" "/"  on www_pub imagedir
   setbe images             on imghost
   reqdel "Cookie"          on all



Actions possibles :

   req  {in|out} {append|delete|rem|add|set|rep|mapuri|rewrite|reqline|deny|allow|setbe|tarpit}
   resp {in|out} {append|delete|rem|add|set|rep|maploc|rewrite|stsline|deny|allow}

   req in append <line>
   req in delete <line_regex>
   req in rem <header>
   req in add <header> <new_value>
   req in set <header> <new_value>
   req in rep <header> <old_value> <new_value>
   req in mapuri  <old_uri_prefix> <new_uri_prefix>
   req in rewrite <old_uri_regex>  <new_uri>
   req in reqline <old_req_regex>  <new_req>
   req in deny
   req in allow
   req in tarpit
   req in setbe <backend>

   resp out maploc <old_location_prefix> <new_loc_prefix>
   resp out stsline <old_sts_regex> <new_sts_regex>

Les cha�nes doivent �tre d�limit�es par un m�me caract�re au d�but et � la fin,
qui doit �tre �chapp� s'il est pr�sent dans la cha�ne. Tout ce qui se trouve
entre le caract�re de fin et les premiers espace est consid�r� comme des
options pass�es au traitement. Par exemple :

   req in rep host /www/i /www/
   req in rep connection /keep-alive/i "close"

Il serait pratique de pouvoir effectuer un remap en m�me temps qu'un setbe.

Captures: les s�parer en in/out. Les rendre conditionnelles ?