diff --git a/sanic/request.py b/sanic/request.py index d4f6dc6f..7a35c4b1 100644 --- a/sanic/request.py +++ b/sanic/request.py @@ -1,8 +1,9 @@ import sys import json +import socket from cgi import parse_header from collections import namedtuple -from http.cookies import SimpleCookie +from http import cookies from httptools import parse_url from urllib.parse import parse_qs, urlunparse @@ -157,13 +158,17 @@ class Request(dict): def cookies(self): if self._cookies is None: cookie = self.headers.get('Cookie') + self._cookies = {} if cookie is not None: - cookies = SimpleCookie() - cookies.load(cookie) - self._cookies = {name: cookie.value - for name, cookie in cookies.items()} - else: - self._cookies = {} + for chunk in cookie.split(';'): + if '=' in chunk: + key, val = chunk.split('=', 1) + else: + key, val = '', chunk + key, val = key.strip(), val.strip() + if key or val: + self._cookies[key] = cookies._unquote(val) + return self._cookies @property @@ -181,13 +186,22 @@ class Request(dict): @property def socket(self): if not hasattr(self, '_socket'): - self._get_socket() + self._get_address() return self._socket def _get_address(self): - self._socket = (self.transport.get_extra_info('peername') or - (None, None)) - self._ip, self._port = self._socket + sock = self.transport.get_extra_info('socket') + + if sock.family == socket.AF_INET: + self._socket = (self.transport.get_extra_info('peername') or + (None, None)) + self._ip, self._port = self._socket + elif sock.family == socket.AF_INET6: + self._socket = (self.transport.get_extra_info('peername') or + (None, None, None, None)) + self._ip, self._port, *_ = self._socket + else: + self._ip, self._port = (None, None) @property def remote_addr(self):