From f2583b1a475ac85534e0566424565f2b64f09e89 Mon Sep 17 00:00:00 2001 From: JJ Date: Thu, 8 Oct 2015 12:37:49 -0400 Subject: [PATCH 1/2] Add support for sending User-Agent string to prerenderer. Makes changes to argument signature of the BackendBase method get_response_for_url() --- AUTHORS | 3 ++- README.md | 7 ++++++- django_seo_js/backends/base.py | 2 +- django_seo_js/backends/prerender.py | 5 ++++- django_seo_js/middleware/escaped_fragment.py | 2 +- django_seo_js/middleware/useragent.py | 2 +- django_seo_js/settings.py | 2 ++ 7 files changed, 17 insertions(+), 6 deletions(-) diff --git a/AUTHORS b/AUTHORS index b7f0dcc..f28625f 100644 --- a/AUTHORS +++ b/AUTHORS @@ -5,4 +5,5 @@ denisvlr - https://github.com/denisvlr mattrobenolt - https://github.com/mattrobenolt thoop - https://github.com/thoop rchrd2 - https://github.com/rchrd2 -chazcb - https://github.com/chazcb \ No newline at end of file +chazcb - https://github.com/chazcb +jdotjdot - https://github.com/jdotjdot \ No newline at end of file diff --git a/README.md b/README.md index dd315ef..a404fc9 100644 --- a/README.md +++ b/README.md @@ -97,6 +97,10 @@ SEO_JS_IGNORE_EXTENSIONS = [ ".txt", # See helpers.py for full list of extensions ignored by default. ] + +# Whether or not to pass along the original request's user agent to the prerender service. +# Useful for analytics, understanding where requests are coming from. +SEO_JS_SEND_USER_AGENT = True ``` ## Backend settings @@ -135,9 +139,10 @@ Backends must implement the following methods: class MyBackend(SEOBackendBase): - def get_response_for_url(self, url): + def get_response_for_url(self, url, request=None): """ Accepts a fully-qualified url. + Optionally accepts the django request object, so that headers, etc. may be passed along to the prerenderer. Returns an HttpResponse, passing through all headers and the status code. """ raise NotImplementedError diff --git a/django_seo_js/backends/base.py b/django_seo_js/backends/base.py index 186a814..1c9f0e6 100644 --- a/django_seo_js/backends/base.py +++ b/django_seo_js/backends/base.py @@ -39,7 +39,7 @@ def build_absolute_uri(self, request): """ return request.build_absolute_uri() - def get_response_for_url(self, url): + def get_response_for_url(self, url, request=None): """ Accepts a fully-qualified url. Returns an HttpResponse, passing through all headers and the status code. diff --git a/django_seo_js/backends/prerender.py b/django_seo_js/backends/prerender.py index 8d6ec9d..3f667f1 100644 --- a/django_seo_js/backends/prerender.py +++ b/django_seo_js/backends/prerender.py @@ -16,7 +16,7 @@ def _get_token(self): raise ValueError("Missing SEO_JS_PRERENDER_TOKEN in settings.") return settings.PRERENDER_TOKEN - def get_response_for_url(self, url): + def get_response_for_url(self, url, request=None): """ Accepts a fully-qualified url. Returns an HttpResponse, passing through all headers and the status code. @@ -29,6 +29,9 @@ def get_response_for_url(self, url): headers = { 'X-Prerender-Token': self.token, } + if request and settings.SEND_USER_AGENT: + headers.update({'User-Agent': request.META.get('HTTP_USER_AGENT')}) + r = self.session.get(render_url, headers=headers, allow_redirects=False) assert r.status_code < 500 diff --git a/django_seo_js/middleware/escaped_fragment.py b/django_seo_js/middleware/escaped_fragment.py index 155e249..2ae9b61 100644 --- a/django_seo_js/middleware/escaped_fragment.py +++ b/django_seo_js/middleware/escaped_fragment.py @@ -19,7 +19,7 @@ def process_request(self, request): url = self.backend.build_absolute_uri(request) try: - return self.backend.get_response_for_url(url) + return self.backend.get_response_for_url(url, request) except Exception as e: logger.exception(e) diff --git a/django_seo_js/middleware/useragent.py b/django_seo_js/middleware/useragent.py index 4126a63..769ee4c 100644 --- a/django_seo_js/middleware/useragent.py +++ b/django_seo_js/middleware/useragent.py @@ -29,6 +29,6 @@ def process_request(self, request): url = self.backend.build_absolute_uri(request) try: - return self.backend.get_response_for_url(url) + return self.backend.get_response_for_url(url, request) except Exception as e: logger.exception(e) diff --git a/django_seo_js/settings.py b/django_seo_js/settings.py index 199d780..4b70155 100644 --- a/django_seo_js/settings.py +++ b/django_seo_js/settings.py @@ -71,3 +71,5 @@ PRERENDER_TOKEN = getattr(django_settings, 'SEO_JS_PRERENDER_TOKEN', None) PRERENDER_URL = getattr(django_settings, 'SEO_JS_PRERENDER_URL', None) PRERENDER_RECACHE_URL = getattr(django_settings, 'SEO_JS_PRERENDER_RECACHE_URL', None) + +SEND_USER_AGENT = getattr(django_settings, 'SEO_JS_SEND_USER_AGENT', True) \ No newline at end of file From 1215500ff37e22b567d7e109b51456fe1317649f Mon Sep 17 00:00:00 2001 From: JJ Date: Sat, 9 Apr 2016 18:08:13 -0400 Subject: [PATCH 2/2] Ensure IGNORED_HEADERS check matches correctly by lowercasing Fixes #23 --- django_seo_js/backends/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/django_seo_js/backends/base.py b/django_seo_js/backends/base.py index 1c9f0e6..04cdd64 100644 --- a/django_seo_js/backends/base.py +++ b/django_seo_js/backends/base.py @@ -63,7 +63,7 @@ def __init__(self, *args, **kwargs): def build_django_response_from_requests_response(self, response): r = HttpResponse(response.content) for k, v in response.headers.items(): - if k not in IGNORED_HEADERS: + if k.lower() not in IGNORED_HEADERS: r[k] = v r['content-length'] = len(response.content) r.status_code = response.status_code