From 96078e6b96ee511547b2785ad56daaa6b4a66228 Mon Sep 17 00:00:00 2001 From: Sergio Oliveira Date: Mon, 31 Oct 2016 21:24:35 -0200 Subject: [PATCH] Allow multiple upstreams --- revproxy/views.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/revproxy/views.py b/revproxy/views.py index ef592ce..0a06e19 100644 --- a/revproxy/views.py +++ b/revproxy/views.py @@ -8,6 +8,8 @@ import urllib3 +from itertools import cycle + from django.utils.six.moves.urllib.parse import urlparse, urlencode, quote_plus from django.shortcuts import redirect @@ -34,6 +36,8 @@ HTTP_POOLS = PoolManager() +UPSTREAM_CYCLES = {} + class ProxyView(View): """View responsable by excute proxy requests, process and return @@ -70,7 +74,15 @@ def upstream(self, value): self._upstream = value def get_upstream(self, path): - upstream = self.upstream + if isinstance(self.upstream, (list, tuple)): + key = tuple(self.upstream) + upstream_rr = UPSTREAM_CYCLES.get(key) + if not upstream_rr: + upstream_rr = cycle(self.upstream) + UPSTREAM_CYCLES[key] = upstream_rr + upstream = next(upstream_rr) + else: + upstream = self.upstream if not getattr(self, '_parsed_url', None): self._parsed_url = urlparse(upstream)