64 lines
2.4 KiB
Python
64 lines
2.4 KiB
Python
|
"""response functions from django-revproxy"""
|
||
|
import logging
|
||
|
|
||
|
from django.http import HttpResponse, StreamingHttpResponse
|
||
|
|
||
|
from passbook.app_gw.proxy.utils import (cookie_from_string,
|
||
|
set_response_headers, should_stream)
|
||
|
|
||
|
#: Default number of bytes that are going to be read in a file lecture
|
||
|
DEFAULT_AMT = 2 ** 16
|
||
|
|
||
|
logger = logging.getLogger('revproxy.response')
|
||
|
|
||
|
|
||
|
def get_django_response(proxy_response, strict_cookies=False):
|
||
|
"""This method is used to create an appropriate response based on the
|
||
|
Content-Length of the proxy_response. If the content is bigger than
|
||
|
MIN_STREAMING_LENGTH, which is found on utils.py,
|
||
|
than django.http.StreamingHttpResponse will be created,
|
||
|
else a django.http.HTTPResponse will be created instead
|
||
|
|
||
|
:param proxy_response: An Instance of urllib3.response.HTTPResponse that
|
||
|
will create an appropriate response
|
||
|
:param strict_cookies: Whether to only accept RFC-compliant cookies
|
||
|
:returns: Returns an appropriate response based on the proxy_response
|
||
|
content-length
|
||
|
"""
|
||
|
status = proxy_response.status
|
||
|
headers = proxy_response.headers
|
||
|
|
||
|
logger.debug('Proxy response headers: %s', headers)
|
||
|
|
||
|
content_type = headers.get('Content-Type')
|
||
|
|
||
|
logger.debug('Content-Type: %s', content_type)
|
||
|
|
||
|
if should_stream(proxy_response):
|
||
|
logger.info('Content-Length is bigger than %s', DEFAULT_AMT)
|
||
|
response = StreamingHttpResponse(proxy_response.stream(DEFAULT_AMT),
|
||
|
status=status,
|
||
|
content_type=content_type)
|
||
|
else:
|
||
|
content = proxy_response.data or b''
|
||
|
response = HttpResponse(content, status=status,
|
||
|
content_type=content_type)
|
||
|
|
||
|
logger.info('Normalizing response headers')
|
||
|
set_response_headers(response, headers)
|
||
|
|
||
|
logger.debug('Response headers: %s', getattr(response, '_headers'))
|
||
|
|
||
|
cookies = proxy_response.headers.getlist('set-cookie')
|
||
|
logger.info('Checking for invalid cookies')
|
||
|
for cookie_string in cookies:
|
||
|
cookie_dict = cookie_from_string(cookie_string,
|
||
|
strict_cookies=strict_cookies)
|
||
|
# if cookie is invalid cookie_dict will be None
|
||
|
if cookie_dict:
|
||
|
response.set_cookie(**cookie_dict)
|
||
|
|
||
|
logger.debug('Response cookies: %s', response.cookies)
|
||
|
|
||
|
return response
|