mirror of
https://github.com/django/daphne.git
synced 2025-07-02 02:43:08 +03:00
Fixed #24: Configurable root_name options
This commit is contained in:
parent
66e005f277
commit
5a451ab06a
19
README.rst
19
README.rst
|
@ -14,6 +14,7 @@ to power Django Channels.
|
||||||
It supports automatic negotiation of protocols; there's no need for URL
|
It supports automatic negotiation of protocols; there's no need for URL
|
||||||
prefixing to determine WebSocket endpoints versus HTTP endpoints.
|
prefixing to determine WebSocket endpoints versus HTTP endpoints.
|
||||||
|
|
||||||
|
|
||||||
Running
|
Running
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
@ -21,3 +22,21 @@ Simply point Daphne to your ASGI channel layer instance, and optionally
|
||||||
set a bind address and port (defaults to localhost, port 8000)::
|
set a bind address and port (defaults to localhost, port 8000)::
|
||||||
|
|
||||||
daphne -b 0.0.0.0 -p 8001 django_project.asgi:channel_layer
|
daphne -b 0.0.0.0 -p 8001 django_project.asgi:channel_layer
|
||||||
|
|
||||||
|
|
||||||
|
Root Path (SCRIPT_NAME)
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
In order to set the root path for Daphne, which is the equivalent of the
|
||||||
|
WSGI ``SCRIPT_NAME`` setting, you have two options:
|
||||||
|
|
||||||
|
* Pass a header value ``DAPHNE_ROOT_PATH``, with the desired root path as a
|
||||||
|
URLencoded ASCII value
|
||||||
|
|
||||||
|
* Set the ``--root-path`` commandline option with the desired root path as a
|
||||||
|
URLencoded ASCII value
|
||||||
|
|
||||||
|
The header takes precedence if both are set. As with ``SCRIPT_ALIAS``, the value
|
||||||
|
should start with a slash, but not end with one; for example::
|
||||||
|
|
||||||
|
daphne --root-path=/forum django_project.asgi:channel_layer
|
||||||
|
|
|
@ -77,6 +77,12 @@ class CommandLineInterface(object):
|
||||||
help='The WebSocket protocols you wish to support',
|
help='The WebSocket protocols you wish to support',
|
||||||
default=None,
|
default=None,
|
||||||
)
|
)
|
||||||
|
self.parser.add_argument(
|
||||||
|
'--root-path',
|
||||||
|
dest='root_path',
|
||||||
|
help='The setting for the ASGI root_path variable',
|
||||||
|
default="",
|
||||||
|
)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def entrypoint(cls):
|
def entrypoint(cls):
|
||||||
|
@ -131,4 +137,5 @@ class CommandLineInterface(object):
|
||||||
ping_interval=args.ping_interval,
|
ping_interval=args.ping_interval,
|
||||||
action_logger=AccessLogGenerator(access_log_stream) if access_log_stream else None,
|
action_logger=AccessLogGenerator(access_log_stream) if access_log_stream else None,
|
||||||
ws_protocols=args.ws_protocols,
|
ws_protocols=args.ws_protocols,
|
||||||
|
root_path=args.root_path,
|
||||||
).run()
|
).run()
|
||||||
|
|
|
@ -109,13 +109,17 @@ class WebRequest(http.Request):
|
||||||
self.reply_channel = None
|
self.reply_channel = None
|
||||||
# Boring old HTTP.
|
# Boring old HTTP.
|
||||||
else:
|
else:
|
||||||
# Sanitize and decode headers
|
# Sanitize and decode headers, potentially extracting root path
|
||||||
self.clean_headers = []
|
self.clean_headers = []
|
||||||
|
self.root_path = self.factory.root_path
|
||||||
for name, values in self.requestHeaders.getAllRawHeaders():
|
for name, values in self.requestHeaders.getAllRawHeaders():
|
||||||
# Prevent CVE-2015-0219
|
# Prevent CVE-2015-0219
|
||||||
if b"_" in name:
|
if b"_" in name:
|
||||||
continue
|
continue
|
||||||
for value in values:
|
for value in values:
|
||||||
|
if name.lower() == "asgi_root_path":
|
||||||
|
self.root_path = self.unquote(value)
|
||||||
|
else:
|
||||||
self.clean_headers.append((name.lower(), value))
|
self.clean_headers.append((name.lower(), value))
|
||||||
logger.debug("HTTP %s request for %s", self.method, self.reply_channel)
|
logger.debug("HTTP %s request for %s", self.method, self.reply_channel)
|
||||||
self.content.seek(0, 0)
|
self.content.seek(0, 0)
|
||||||
|
@ -127,6 +131,7 @@ class WebRequest(http.Request):
|
||||||
"http_version": "1.1",
|
"http_version": "1.1",
|
||||||
"method": self.method.decode("ascii"),
|
"method": self.method.decode("ascii"),
|
||||||
"path": self.unquote(self.path),
|
"path": self.unquote(self.path),
|
||||||
|
"root_path": self.root_path,
|
||||||
"scheme": "http",
|
"scheme": "http",
|
||||||
"query_string": self.unquote(self.query_string, plus_as_space=True),
|
"query_string": self.unquote(self.query_string, plus_as_space=True),
|
||||||
"headers": self.clean_headers,
|
"headers": self.clean_headers,
|
||||||
|
@ -268,7 +273,7 @@ class HTTPFactory(http.HTTPFactory):
|
||||||
|
|
||||||
protocol = HTTPProtocol
|
protocol = HTTPProtocol
|
||||||
|
|
||||||
def __init__(self, channel_layer, action_logger=None, timeout=120, websocket_timeout=86400, ping_interval=20, ws_protocols=None):
|
def __init__(self, channel_layer, action_logger=None, timeout=120, websocket_timeout=86400, ping_interval=20, ws_protocols=None, root_path=""):
|
||||||
http.HTTPFactory.__init__(self)
|
http.HTTPFactory.__init__(self)
|
||||||
self.channel_layer = channel_layer
|
self.channel_layer = channel_layer
|
||||||
self.action_logger = action_logger
|
self.action_logger = action_logger
|
||||||
|
@ -281,6 +286,7 @@ class HTTPFactory(http.HTTPFactory):
|
||||||
self.ws_factory = WebSocketFactory(self, protocols=ws_protocols)
|
self.ws_factory = WebSocketFactory(self, protocols=ws_protocols)
|
||||||
self.ws_factory.protocol = WebSocketProtocol
|
self.ws_factory.protocol = WebSocketProtocol
|
||||||
self.ws_factory.reply_protocols = self.reply_protocols
|
self.ws_factory.reply_protocols = self.reply_protocols
|
||||||
|
self.root_path = root_path
|
||||||
|
|
||||||
def reply_channels(self):
|
def reply_channels(self):
|
||||||
return self.reply_protocols.keys()
|
return self.reply_protocols.keys()
|
||||||
|
|
|
@ -20,6 +20,7 @@ class Server(object):
|
||||||
websocket_timeout=None,
|
websocket_timeout=None,
|
||||||
ping_interval=20,
|
ping_interval=20,
|
||||||
ws_protocols=None,
|
ws_protocols=None,
|
||||||
|
root_path="",
|
||||||
):
|
):
|
||||||
self.channel_layer = channel_layer
|
self.channel_layer = channel_layer
|
||||||
self.host = host
|
self.host = host
|
||||||
|
@ -33,6 +34,7 @@ class Server(object):
|
||||||
# channel layer's group_expiry value if present, or one day if not.
|
# channel layer's group_expiry value if present, or one day if not.
|
||||||
self.websocket_timeout = websocket_timeout or getattr(channel_layer, "group_expiry", 86400)
|
self.websocket_timeout = websocket_timeout or getattr(channel_layer, "group_expiry", 86400)
|
||||||
self.ws_protocols = ws_protocols
|
self.ws_protocols = ws_protocols
|
||||||
|
self.root_path = root_path
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
self.factory = HTTPFactory(
|
self.factory = HTTPFactory(
|
||||||
|
@ -42,6 +44,7 @@ class Server(object):
|
||||||
websocket_timeout=self.websocket_timeout,
|
websocket_timeout=self.websocket_timeout,
|
||||||
ping_interval=self.ping_interval,
|
ping_interval=self.ping_interval,
|
||||||
ws_protocols=self.ws_protocols,
|
ws_protocols=self.ws_protocols,
|
||||||
|
root_path=self.root_path,
|
||||||
)
|
)
|
||||||
if self.unix_socket:
|
if self.unix_socket:
|
||||||
reactor.listenUNIX(self.unix_socket, self.factory)
|
reactor.listenUNIX(self.unix_socket, self.factory)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user