From 9b92eec43a0b06ef33b1c9aa399369082c9b8a5a Mon Sep 17 00:00:00 2001 From: Andrew Godwin Date: Mon, 7 Sep 2015 15:04:10 -0500 Subject: [PATCH] Fix request/response compatability --- channels/request.py | 15 +++++++++++++-- channels/response.py | 5 ++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/channels/request.py b/channels/request.py index 8dfcec6..7e5a71e 100644 --- a/channels/request.py +++ b/channels/request.py @@ -1,5 +1,7 @@ from django.http import HttpRequest from django.utils.datastructures import MultiValueDict +from django.http.request import QueryDict +from django.conf import settings def encode_request(request): @@ -25,8 +27,8 @@ def decode_request(value): Decodes a request JSONish value to a HttpRequest object. """ request = HttpRequest() - request.GET = MultiValueDict(value['GET']) - request.POST = MultiValueDict(value['POST']) + request.GET = CustomQueryDict(value['GET']) + request.POST = CustomQueryDict(value['POST']) request.COOKIES = value['COOKIES'] request.META = value['META'] request.path = value['path'] @@ -34,3 +36,12 @@ def decode_request(value): request.path_info = value['path_info'] request.response_channel = value['response_channel'] return request + + +class CustomQueryDict(QueryDict): + """ + Custom override of QueryDict that sets things directly. + """ + + def __init__(self, values): + MultiValueDict.__init__(self, values) diff --git a/channels/response.py b/channels/response.py index c8abdd7..2b8d761 100644 --- a/channels/response.py +++ b/channels/response.py @@ -1,4 +1,5 @@ from django.http import HttpResponse +from django.http.cookie import SimpleCookie from six import PY3 @@ -6,12 +7,12 @@ def encode_response(response): """ Encodes a response to JSON-compatible datastructures """ - # TODO: Entirely useful things like cookies value = { "content_type": getattr(response, "content_type", None), "content": response.content, "status_code": response.status_code, "headers": list(response._headers.values()), + "cookies": {k: v.output(header="") for k, v in response.cookies.items()} } if PY3: value["content"] = value["content"].decode('utf8') @@ -28,6 +29,8 @@ def decode_response(value): content_type = value['content_type'], status = value['status_code'], ) + for cookie in value['cookies'].values(): + response.cookies.load(cookie) response._headers = {k.lower: (k, v) for k, v in value['headers']} return response