@@ -15,13 +15,16 @@ class FailedProxiedRequest:
1515 A delegated request that has failed for whatever reason
1616
1717 The failure context (usually the exception) is stored in the `context`
18- property.
18+ property. We also keep track of the proxy URL that serviced the request so
19+ downstream consumers can make informed retry decisions.
1920 """
2021
2122 context = None
23+ proxy_url = None
2224
23- def __init__ (self , context = None ):
25+ def __init__ (self , context = None , proxy_url = None ):
2426 self .context = context
27+ self .proxy_url = proxy_url
2528
2629
2730class NoProxiesAvailableError (Exception ):
@@ -561,6 +564,13 @@ def manage_requests(self):
561564 self .log .info (f"Removed proxy { proxy_url } (completed all active requests)" )
562565 try :
563566 response = url_metadata .proxied .request .result ()
567+ # annotate the response so processors can see which
568+ # proxy (if any) handled the request
569+ setattr (
570+ response ,
571+ "_4cat_proxy" ,
572+ url_metadata .proxied .proxy .proxy_url ,
573+ )
564574 url_metadata .proxied .result = response
565575
566576 except requests .exceptions .ProxyError as e :
@@ -590,7 +600,9 @@ def manage_requests(self):
590600 urllib3 .exceptions .HTTPError ,
591601 ) as e :
592602 # this is where timeouts, etc, go
593- url_metadata .proxied .result = FailedProxiedRequest (e )
603+ url_metadata .proxied .result = FailedProxiedRequest (
604+ e , url_metadata .proxied .proxy .proxy_url
605+ )
594606
595607 finally :
596608 # success or fail, we can pass it on
0 commit comments