NAME
Plack::App::Proxy::WebSocket - proxy HTTP and WebSocket connections
VERSION
version 0.04
SYNOPSIS
use Plack::App::Proxy::WebSocket;
use Plack::Builder;
builder {
mount "/socket.io" => Plack::App::Proxy::WebSocket->new(
remote => "http://localhost:9000/socket.io",
preserve_host_header => 1,
)->to_app;
};
DESCRIPTION
This is a subclass of Plack::App::Proxy that adds support for transparent (i.e. reverse) proxying WebSocket connections. If your proxy is a forward proxy that is to be explicitly configured in the system or browser, you may be able to use Plack::Middleware::Proxy::Connect instead.
This module works by looking for the Upgrade: WebSocket
header, completing the handshake with the remote, and then buffering full-duplex between the client and the remote. Regular requests are handled by Plack::App::Proxy as usual, though there are a few differences related to the generation of headers for the back-end request; see "build_headers_from_env" for details.
This module has no configuration options beyond what Plack::App::Proxy requires or provides, so it may be an easy drop-in replacement. Read the documentation of that module for advanced usage not covered here. Also, you must use a PSGI server that supports psgi.streaming
and psgix.io
. For performance reasons, you should also use a psgi.nonblocking
server (like Twiggy) and the Plack::App::Proxy::Backend::AnyEvent::HTTP user agent back-end (which is the default, so no extra configuration is needed).
This module is EXPERIMENTAL. I use it in development and it works swimmingly for me, but it is completely untested in production scenarios.
METHODS
build_headers_from_env
Supplement the headers-building logic from Plack::App::Proxy to maintain the complete list of proxies in X-Forwarded-For
and to set the following headers if they are not already set: X-Forwarded-Proto
to the value of psgi.url_scheme
, X-Real-IP
to the value of REMOTE_ADDR
, and Host
to the host and port number of a URI (if given).
This is called internally.
switching_response_headers
Like response_headers
from Plack::App::Proxy but doesn't filter the "Connection" header nor the headers listed by the "Connection" header.
CAVEATS
Starman ignores the Connection
HTTP response header from applications and chooses its own value (Close
or Keep-Alive
), but WebSocket clients expect the value of that header to be Upgrade
. Therefore, WebSocket proxying does not work on Starman. Your best bet is to use a server that doesn't mess with the Connection
header, like Twiggy.
BUGS
Please report any bugs or feature requests on the bugtracker website https://github.com/chazmcgarvey/p5-Plack-App-Proxy-WebSocket/issues
When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature.
AUTHOR
Charles McGarvey <chazmcgarvey@brokenzipper.com>
COPYRIGHT AND LICENSE
This software is copyright (c) 2018 by Charles McGarvey.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.