forked from boostorg/beast
A new server framework is introduced, allowing users to quickly get off the ground. Example servers are refactored to use the common framework.
103 lines
2.6 KiB
C++
103 lines
2.6 KiB
C++
//
|
|
// Copyright (c) 2013-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
|
|
//
|
|
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
//
|
|
|
|
#ifndef BEAST_EXAMPLE_SERVER_WS_UPGRADE_SERVICE_HPP
|
|
#define BEAST_EXAMPLE_SERVER_WS_UPGRADE_SERVICE_HPP
|
|
|
|
#include "framework.hpp"
|
|
|
|
#include <beast/http/message.hpp>
|
|
#include <beast/websocket/rfc6455.hpp>
|
|
#include <memory>
|
|
|
|
namespace framework {
|
|
|
|
/** An HTTP service which transfers WebSocket upgrade request to another port handler.
|
|
|
|
@tparam PortHandler The type of port handler. The service will
|
|
handle WebSocket Upgrade requests by transferring ownership
|
|
of the stream and request to a port handler of this type.
|
|
*/
|
|
template<class PortHandler>
|
|
class ws_upgrade_service
|
|
{
|
|
std::shared_ptr<PortHandler> handler_;
|
|
|
|
public:
|
|
/** Constructor
|
|
|
|
@param handler A shared pointer to the @b PortHandler to
|
|
handle WebSocket upgrade requests.
|
|
*/
|
|
explicit
|
|
ws_upgrade_service(
|
|
std::shared_ptr<PortHandler> handler)
|
|
: handler_(std::move(handler))
|
|
{
|
|
}
|
|
|
|
/** Initialize the service.
|
|
|
|
This provides an opportunity for the service to perform
|
|
initialization which may fail, while reporting an error
|
|
code instead of throwing an exception from the constructor.
|
|
*/
|
|
void
|
|
init(error_code& ec)
|
|
{
|
|
// This is required by the error_code specification
|
|
//
|
|
ec = {};
|
|
}
|
|
|
|
/** Handle a WebSocket Upgrade request.
|
|
|
|
If the request is an upgrade request, ownership of the
|
|
stream and request will be transferred to the corresponding
|
|
WebSocket port handler.
|
|
|
|
@param stream The stream corresponding to the connection.
|
|
|
|
@param ep The remote endpoint associated with the stream.
|
|
|
|
@req The request to check.
|
|
*/
|
|
template<
|
|
class Stream,
|
|
class Body, class Fields,
|
|
class Send>
|
|
bool
|
|
respond(
|
|
Stream&& stream,
|
|
endpoint_type const& ep,
|
|
beast::http::request<Body, Fields>&& req,
|
|
Send const&) const
|
|
{
|
|
// If its not an upgrade request, return `false`
|
|
// to indicate that we are not handling it.
|
|
//
|
|
if(! beast::websocket::is_upgrade(req))
|
|
return false;
|
|
|
|
// Its an ugprade request, so transfer ownership
|
|
// of the stream and request to the port handler.
|
|
//
|
|
handler_->accept(
|
|
std::move(stream),
|
|
ep,
|
|
std::move(req));
|
|
|
|
// Tell the service list that we handled the request.
|
|
//
|
|
return true;
|
|
}
|
|
};
|
|
|
|
} // framework
|
|
|
|
#endif
|