Forum Discussion
Kai_Wilke
Mar 08, 2016MVP
Hi Domunda,
did some quick additions to an
HTTP::retry
iRule which I've written last week. The iRule will capture GET and POST request and replay the request if the server responds with 404 or 5xx.
when RULE_INIT {
set static::max_retry_count 3
set static::persistence_cookie "mycookie"
set static::max_content_length 1048576
}
when CLIENT_ACCEPTED {
set retry_count 0
}
when HTTP_REQUEST {
if { $retry_count == 0 } then {
log local0.debug "Saving the initial HTTP request..."
set http_request [HTTP::request]
if { [HTTP::method] equals "POST" } then {
log local0.debug "POST request detected. Collecting the POST data..."
if { ( [HTTP::header value "Content-Length"] ne "" ) and ( [HTTP::header value "Content-Length"] < $static::max_content_length ) } then {
HTTP::collect [HTTP::header value "Content-Length"]
} else {
HTTP::collect $static::max_content_length
}
}
} else {
log local0.debug "Removing the persistence cookie from replayed request..."
HTTP::cookie remove $static::persistence_cookie
}
}
when HTTP_REQUEST_DATA {
if { $retry_count == 0 } then {
log local0.debug "Appending the collected POST data to the request. And releasing the request..."
append http_request [HTTP::payload]
HTTP::release
log local0.debug "Post Request [b64encode $http_request]"
}
}
when LB_SELECTED {
if { $retry_count > 0 } then {
if { $last_node eq [LB::server addr] } then {
log local0.debug "Wrong Selection: member [LB::server addr]:[LB::server port] from pool [LB::server pool] (retry $retry_count)"
LB::reselect
} else {
log local0. "Good Selection: member [LB::server addr]:[LB::server port] from pool [LB::server pool] (retry $retry_count)"
}
}
}
when HTTP_RESPONSE {
if { (( [HTTP::status] equals 404 ) or ( [HTTP::status] starts_with 5 )) and ( $retry_count < $static::max_retry_count ) } then {
log local0.debug "[HTTP::status] from [LB::server addr]:[LB::server port], trying another [LB::server pool] member (retry $retry_count)"
set last_node [LB::server addr]
incr retry_count
HTTP::retry $http_request
return
}
set retry_count 0
set http_request ""
}
Note: Remove or comment the
lines once tested and verified the iRule.[log]
Cheers, Kai