Commit a5136c64 authored by Dominik Charousset's avatar Dominik Charousset

Streamline web_socket::accept implementation

parent c4ed2be3
...@@ -15,6 +15,10 @@ namespace caf::net::ssl { ...@@ -15,6 +15,10 @@ namespace caf::net::ssl {
/// Wraps an accept socket and an SSL context. /// Wraps an accept socket and an SSL context.
class CAF_NET_EXPORT acceptor { class CAF_NET_EXPORT acceptor {
public: public:
// -- member types -----------------------------------------------------------
using transport_type = transport;
// -- constructors, destructors, and assignment operators -------------------- // -- constructors, destructors, and assignment operators --------------------
acceptor() = delete; acceptor() = delete;
......
...@@ -18,6 +18,8 @@ struct CAF_NET_EXPORT tcp_accept_socket : network_socket { ...@@ -18,6 +18,8 @@ struct CAF_NET_EXPORT tcp_accept_socket : network_socket {
using super = network_socket; using super = network_socket;
using super::super; using super::super;
using transport_type = stream_transport;
}; };
/// Creates a new TCP socket to accept connections on a given port. /// Creates a new TCP socket to accept connections on a given port.
......
...@@ -77,13 +77,29 @@ private: ...@@ -77,13 +77,29 @@ private:
connector_pointer connector_; connector_pointer connector_;
}; };
template <class Transport, class Acceptor, class... Ts, class OnRequest> } // namespace caf::detail
disposable ws_accept_impl(actor_system& sys, Acceptor acc,
net::web_socket::acceptor_resource_t<Ts...> out, namespace caf::net::web_socket {
OnRequest on_request, const settings& cfg) {
/// Listens for incoming WebSocket connections.
/// @param sys The host system.
/// @param acc A connection acceptor such as @ref tcp_accept_socket or
/// @ref ssl::acceptor.
/// @param out A buffer resource that connects the server to a listener that
/// processes the buffer pairs for each incoming connection.
/// @param on_request Function object for accepting incoming requests.
/// @param cfg Configuration parameters for the acceptor.
template <class Acceptor, class... Ts, class OnRequest>
disposable accept(actor_system& sys, Acceptor acc,
acceptor_resource_t<Ts...> out, OnRequest on_request,
const settings& cfg = {}) {
using transport_t = typename Acceptor::transport_type;
using request_t = request<default_trait, Ts...>;
static_assert(std::is_invocable_v<OnRequest, const settings&, request_t&>,
"invalid signature found for on_request");
using trait_t = net::web_socket::default_trait; using trait_t = net::web_socket::default_trait;
using factory_t = detail::ws_conn_factory<Transport, trait_t>; using factory_t = detail::ws_conn_factory<transport_t, trait_t>;
using conn_t = typename Transport::connection_handle; using conn_t = typename transport_t::connection_handle;
using impl_t = detail::accept_handler<Acceptor, conn_t>; using impl_t = detail::accept_handler<Acceptor, conn_t>;
using connector_t using connector_t
= net::web_socket::flow_connector_request_impl<OnRequest, trait_t, Ts...>; = net::web_socket::flow_connector_request_impl<OnRequest, trait_t, Ts...>;
...@@ -105,44 +121,4 @@ disposable ws_accept_impl(actor_system& sys, Acceptor acc, ...@@ -105,44 +121,4 @@ disposable ws_accept_impl(actor_system& sys, Acceptor acc,
} }
} }
} // namespace caf::detail
namespace caf::net::web_socket {
/// Listens for incoming WebSocket connections.
/// @param sys The host system.
/// @param fd An accept socket in listening mode, already bound to a port.
/// @param out A buffer resource that connects the server to a listener that
/// processes the buffer pairs for each incoming connection.
/// @param on_request Function object for accepting incoming requests.
/// @param cfg Configuration parameters for the acceptor.
template <class... Ts, class OnRequest>
disposable accept(actor_system& sys, tcp_accept_socket fd,
acceptor_resource_t<Ts...> out, OnRequest on_request,
const settings& cfg = {}) {
using request_t = request<default_trait, Ts...>;
static_assert(std::is_invocable_v<OnRequest, const settings&, request_t&>,
"invalid signature found for on_request");
return detail::ws_accept_impl<stream_transport>(sys, fd, out,
std::move(on_request), cfg);
}
/// Listens for incoming WebSocket connections over TLS.
/// @param sys The host system.
/// @param acc An SSL connection acceptor with a socket that in listening mode.
/// @param out A buffer resource that connects the server to a listener that
/// processes the buffer pairs for each incoming connection.
/// @param on_request Function object for accepting incoming requests.
/// @param cfg Configuration parameters for the acceptor.
template <class... Ts, class OnRequest>
disposable accept(actor_system& sys, ssl::acceptor acc,
acceptor_resource_t<Ts...> out, OnRequest on_request,
const settings& cfg = {}) {
using request_t = request<default_trait, Ts...>;
static_assert(std::is_invocable_v<OnRequest, const settings&, request_t&>,
"invalid signature found for on_request");
return detail::ws_accept_impl<ssl::transport>(sys, std::move(acc), out,
std::move(on_request), cfg);
}
} // namespace caf::net::web_socket } // namespace caf::net::web_socket
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment