Merge pull request #1635 from huge-success/upgrade-websockets

Upgrade websockets, resolve incompatible issue between multidict and websockets
This commit is contained in:
7 2019-08-12 10:48:56 -07:00 committed by GitHub
commit 3f9c94ba4a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 15 additions and 10 deletions

View File

@ -5,8 +5,7 @@ from inspect import isawaitable
from typing import Any, Awaitable, Callable, MutableMapping, Union from typing import Any, Awaitable, Callable, MutableMapping, Union
from urllib.parse import quote from urllib.parse import quote
from multidict import CIMultiDict from sanic.compat import Header
from sanic.exceptions import InvalidUsage, ServerError from sanic.exceptions import InvalidUsage, ServerError
from sanic.log import logger from sanic.log import logger
from sanic.request import Request from sanic.request import Request
@ -186,7 +185,7 @@ class ASGIApp:
instance.transport.add_task = sanic_app.loop.create_task instance.transport.add_task = sanic_app.loop.create_task
instance.transport.loop = sanic_app.loop instance.transport.loop = sanic_app.loop
headers = CIMultiDict( headers = Header(
[ [
(key.decode("latin-1"), value.decode("latin-1")) (key.decode("latin-1"), value.decode("latin-1"))
for key, value in scope.get("headers", []) for key, value in scope.get("headers", [])

6
sanic/compat.py Normal file
View File

@ -0,0 +1,6 @@
from multidict import CIMultiDict
class Header(CIMultiDict):
def get_all(self, key):
return self.getall(key, default=[])

View File

@ -4,8 +4,8 @@ from os import path
from urllib.parse import quote_plus from urllib.parse import quote_plus
from aiofiles import open as open_async from aiofiles import open as open_async
from multidict import CIMultiDict
from sanic.compat import Header
from sanic.cookies import CookieJar from sanic.cookies import CookieJar
from sanic.helpers import STATUS_CODES, has_message_body, remove_entity_headers from sanic.helpers import STATUS_CODES, has_message_body, remove_entity_headers
@ -74,7 +74,7 @@ class StreamingHTTPResponse(BaseHTTPResponse):
self.content_type = content_type self.content_type = content_type
self.streaming_fn = streaming_fn self.streaming_fn = streaming_fn
self.status = status self.status = status
self.headers = CIMultiDict(headers or {}) self.headers = Header(headers or {})
self.chunked = chunked self.chunked = chunked
self._cookies = None self._cookies = None
@ -164,7 +164,7 @@ class HTTPResponse(BaseHTTPResponse):
self.body = body_bytes self.body = body_bytes
self.status = status self.status = status
self.headers = CIMultiDict(headers or {}) self.headers = Header(headers or {})
self._cookies = None self._cookies = None
def output(self, version="1.1", keep_alive=False, keep_alive_timeout=None): def output(self, version="1.1", keep_alive=False, keep_alive_timeout=None):

View File

@ -12,8 +12,8 @@ from time import time
from httptools import HttpRequestParser from httptools import HttpRequestParser
from httptools.parser.errors import HttpParserError from httptools.parser.errors import HttpParserError
from multidict import CIMultiDict
from sanic.compat import Header
from sanic.exceptions import ( from sanic.exceptions import (
HeaderExpectationFailed, HeaderExpectationFailed,
InvalidUsage, InvalidUsage,
@ -304,7 +304,7 @@ class HttpProtocol(asyncio.Protocol):
def on_headers_complete(self): def on_headers_complete(self):
self.request = self.request_class( self.request = self.request_class(
url_bytes=self.url, url_bytes=self.url,
headers=CIMultiDict(self.headers), headers=Header(self.headers),
version=self.parser.get_http_version(), version=self.parser.get_http_version(),
method=self.parser.get_method().decode(), method=self.parser.get_method().decode(),
transport=self.transport, transport=self.transport,

View File

@ -80,7 +80,7 @@ requirements = [
uvloop, uvloop,
ujson, ujson,
"aiofiles>=0.3.0", "aiofiles>=0.3.0",
"websockets>=6.0,<7.0", "websockets>=7.0,<8.0",
"multidict>=4.0,<5.0", "multidict>=4.0,<5.0",
"requests-async==0.5.0", "requests-async==0.5.0",
] ]

View File

@ -19,7 +19,7 @@ deps =
gunicorn gunicorn
pytest-benchmark pytest-benchmark
uvicorn uvicorn
websockets>=6.0,<7.0 websockets>=7.0,<8.0
commands = commands =
pytest {posargs:tests --cov sanic} pytest {posargs:tests --cov sanic}
- coverage combine --append - coverage combine --append