#retry/views.py file from django.http import HttpResponse, HttpResponseRedirect, HttpResponseNotFound, HttpResponseBadRequest, Http404 from django.utils.http import urlencode from django.conf import settings from django.utils.encoding import iri_to_uri import time import logging logger = logging.getLogger('retry') # Create your views here. def retry_after(request): default_timeout = settings.DEFAULT_RETRY_TIMEOUT if not 'redirect' in request.GET: return HttpResponseBadRequest('redirect parameter required') redirect = request.GET['redirect'] time_retry = time.time() + default_timeout if 'retry_after' in request.GET: time_retry = int(float(request.GET['retry_after'])) if settings.DEBUG: logger.debug("RETRY AFTER GOT FOR: %s" % redirect) time_now = time.time() if time_now < time_retry: if settings.DEBUG: logger.debug("RETRY AFTER IS FROM DUMB FOR: %s" % redirect) sleep_timeout = time_retry - time_now if sleep_timeout > default_timeout: sleep_timeout = default_timeout # the client is dumb, we need to wait on the server side time.sleep(sleep_timeout) time_now = time.time() if time_now < time_retry: if settings.DEBUG: logger.debug("RESEND RETRY AFTER FOR: %s" % redirect) r = HttpResponseRedirect( iri_to_uri(request.path) + '?' + urlencode( {'retry_after':int(time_retry), 'redirect':redirect} ) ) r['Retry-After'] = int(time_retry - time_now) + 1 return r # Tell a client to retrieve original URL if settings.DEBUG: logger.debug("REDIRECT TO ORIGINAL URL FOR: %s" % redirect) r = HttpResponseRedirect( redirect ) return r