Retry_HTTP_post_request,_including_payload,_to_a_secondary_pool_if_primary_pool_fails
Problem this snippet solves:
So this is just a clean up of Terje Gravvold's iRules found in http://devcentral.f5.com/Forums/tabid/1082223/asg/50/showtab/groupforums/afv/topic/aff/5/aft/59759/Default.aspx
We tried to implement it, and found some bug fixes and minor improvements along the way. Enjoy
Code :
when CLIENT_ACCEPTED {
# Set initial retry count to zero
set retries 0
# Set debug level for iRule
set debug 6
# Set HTTP status code to look for
set status_code 5
# Log client info about connecting client
if { $debug > 0 } { log local0.alert "From [IP::remote_addr]:[TCP::remote_port] To: [IP::local_addr]:[TCP::local_port]" }
}
when HTTP_REQUEST {
# On first try, set request variables and capture request payload (XML post data)
if { $retries == 0 } {
# Set request, HTTP post header.
set request [HTTP::request]
# Set payload content legth to capture.
if {[HTTP::header exists "Content-Length"] && [HTTP::header "Content-Length"] <= 4000000}{
set content_length [HTTP::header "Content-Length"]
}
else {
set content_length 4000000
}
# Capture HTTP payload from request, HTTP::collect triggers event HTTP_REQUEST_DATA
if { [info exists content_length] && $content_length > 0} {
HTTP::collect $content_length
}
# Set default pool to send first request to.
pool pool_tst_wps-celle-1
# Log request
if { $debug > 5 } { log local0.alert "Request: $request" }
}
}
when HTTP_REQUEST_DATA {
# Set payload, depends on HTTP::collect done in HTTP_REQUEST event.
set payload [HTTP::payload]
# Append HTTP payload to HTTP request header to form a complete HTTP post request (request + payload)
append request [HTTP::payload [HTTP::payload length]]
# Log payload
if { $debug > 5 } { log local0.alert "Payload: $payload" }
}
when LB_SELECTED {
if { $retries == 0 } {
# Log LB pool/server selection
if { $debug > 0 } { log local0.alert "Server Selected $retries: [LB::server pool] [LB::server addr]:[LB::server port]" }
}
else {
# Reselect LB pool if retries > 0
LB::reselect pool pool_tst_wps-celle-2
set retries 0
# Log LB pool/server selection
if { $debug > 0 } { log local0.alert "Server Selected $retries: [LB::server pool] [LB::server addr]:[LB::server port]" }
}
if { $debug > 5 } { log local0.alert "Request: $request" }
}
when HTTP_RESPONSE {
if { [HTTP::status] starts_with 50 } {
# Retry if HTTP 50x response and retry count equals zero.
if { $retries == 0 } {
# Increment retries by 1
incr retries
# Retry HTTP request/payload to another another server. This command triggers LB_SELECTED event.
HTTP::retry "$request"
if { $debug > 0 } { log local0.alert "Process NOT found in pool [LB::server pool], detaching pool member [LB::server addr]:[LB::server port]" }
if { $debug > 5 } { log local0.alert "Request retry: $request" }
}
else {
if { $debug > 0 } { log local0.alert "Process NOT found in any pool, [HTTP::status] sent to client." }
}
else {
# Non HTTP 50x response.
if { $debug > 0 } { log local0.alert "Process found in pool [LB::server pool], request served by pool member [LB::server addr]:[LB::server port]" }
}
}
}
when LB_FAILED {
if { $retries == 0 } {
# Increment retries by 1
incr retries
# Retry HTTP request/payload to another another server. This command triggers LB_SELECTED event.
HTTP::retry "$request"
if { $debug > 0 } { log local0.alert "Process NOT found in pool [LB::server pool], detaching pool member [LB::server addr]:[LB::server port]" }
if { $debug > 5 } { log local0.alert "Request retry: $request" }
}
else {
if { $debug > 0 } { log local0.alert "Process NOT found in any pool, [HTTP::status] sent to client." }
}
}Published Mar 18, 2015
Version 1.0David_Carlin_20
Nimbostratus
Joined March 09, 2011
David_Carlin_20
Nimbostratus
Joined March 09, 2011
No CommentsBe the first to comment
Help guide the future of your DevCentral Community!
What tools do you use to collaborate? (1min - anonymous)