Here it is :
when RULE_INIT {
set ::maxRate 100 ;nombre de requetes HTTP max par utilisateur
set ::windowSecs 10 ;fenetre de limitation de requetes
init array if non-existent
array set ::postHistory { }
wipe array if already existent
array unset ::postHistory
}
when HTTP_REQUEST {
if { [HTTP::method] eq "GET" } {
if {[HTTP::cookie exists JSESSIONID]} {
Extraction du critere de niveau 7 - en l occurence le cookie JSESSIONID
set myUserID [HTTP::cookie "JSESSIONID"]
log local0. "premiere requete du user $myUserID"
Initialisation du nombre de requetes pour l utilisateur
set myMaxRate ""
utilisation du max rate defini plus haut
if { $myMaxRate eq "" }{
set myMaxRate $::maxRate
log local0. "max rate set to $::maxRate"
}
}
else {
set myUserID "no_user_id"
log local0. "premiere requete du user $myUserID"
Initialisation du nombre de requetes pour l utilisateur
set myMaxRate ""
utilisation du max rate defini plus haut
if { $myMaxRate eq "" }{
set myMaxRate $::maxRate
log local0. "max rate set to $::maxRate"
}
}
set currentTime [clock seconds]
calcul de la fenetre de temps
set windowStart [expr {$currentTime - $::windowSecs}]
log local0. "cutoff time set"
incremente le nombre de requete pour cet utilisateur
set postCount 1
foreach { requestID requestTime } [array get ::postHistory ${myUserID}*] {
compte les requetes dont le start time > $windowStart, supprime le reste
if { $requestTime > $windowStart } {
incr postCount 1
log local0. "User $myUserID - incremente - Current rate: $postCount - Max rate: $myMaxRate"
} else {
unset ::postHistory($requestID)
log local0. "User $myUserID - decremente - Current rate: $postCount - Max rate: $myMaxRate"
}
}
if { $postCount < $myMaxRate } {
autorise les requetes et ajoute une entr?e au tableauy w/myUserID.rand + currentTime
set requestID "${myUserID}.[expr { int(10000000 * rand()) }]"
set ::postHistory($requestID) $currentTime
} else {
Rejete la requete en envoyant un 501 server error
log local0. "Service Unavailable - User $myUserID - Current rate: $postCount - Max rate: $myMaxRate"
HTTP::respond 501
return
}
}
}