1+ <!--
2+ This policy sample demonstrates a pattern of replaying the request.
3+ For eg: One scenario could be when we are using quota and rate limit policies,
4+ for some special tier consumers, we would still like to serve the request if there
5+ was a quota error but this time with a low-end backend.
6+
7+ The "example-policy-name" string is in the when condition is just for example
8+ and needs to be replaced with the actual policy name accordingly.
9+
10+ Important Note:
11+ Altough this pattern works, we would do end up having 2 log entries now
12+ for the same request, since the request is now being replayed.
13+ -->
14+ <policies >
15+ <inbound >
16+ <base />
17+ </inbound >
18+ <backend >
19+ <base />
20+ </backend >
21+ <outbound >
22+ <base />
23+ </outbound >
24+ <on-error >
25+ <base />
26+ <choose >
27+ <when condition =" @(context.LastError.Source == " example-policy-name" )" >
28+ <set-variable name =" replay-url" value =" @(" http://" + context.Request.Headers.GetValueOrDefault(" X-Original-Host" ) + context.Request.Headers.GetValueOrDefault(" X-Original-Url" ))" />
29+ <set-variable name =" original-error-source" value =" @(context.LastError.Source)" />
30+ <set-variable name =" original-error-reason" value =" @(context.LastError.Reason)" />
31+ <!-- We replay the same request again to APIM -->
32+ <send-request mode =" copy" response-variable-name =" replay-response" timeout =" 60" ignore-error =" false" >
33+ <set-url >@(context.Variables.GetValueOrDefault<string >("replay-url"))</set-url >
34+ <set-method >POST</set-method >
35+ <!-- While replaying the request this time, we might need to pass some additional information
36+ this time in our request with corresponding logic in the inbound section to process such requests
37+ The string "skip-example-policy-error" here is just as an example -->
38+ <set-header name =" skip-example-policy-error" exists-action =" override" >
39+ <value >true</value >
40+ </set-header >
41+ </send-request >
42+ <!-- THIS IS AN IMPORTANT STEP i.e. the response captured in policy variable "response-variable-name" defined above has to be explicity sent back -->
43+ <return-response response-variable-name =" replay-response" >
44+ <!-- Any additional headers like below can further be added as part of response tracking -->
45+ <set-header name =" x-request-replayed" exists-action =" override" >
46+ <value >true</value >
47+ </set-header >
48+ <set-header name =" x-original-error-source" exists-action =" override" >
49+ <value >@(context.Variables.GetValueOrDefault<string >("original-error-source"))</value >
50+ </set-header >
51+ <set-header name =" x-original-error-reason" exists-action =" override" >
52+ <value >@(context.Variables.GetValueOrDefault<string >("original-error-reason"))</value >
53+ </set-header >
54+ </return-response >
55+ </when >
56+ <otherwise >
57+ <!-- Any additional headers like below can further be added as part of response tracking -->
58+ <set-header name =" x-request-replayed" exists-action =" override" >
59+ <value >"false"</value >
60+ </set-header >
61+ </otherwise >
62+ </choose >
63+ </on-error >
64+ </policies >
0 commit comments