userver: userver/server/websocket/websocket_handler.hpp Source File
Loading...
Searching...
No Matches
websocket_handler.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file userver/server/websocket/websocket_handler.hpp
4/// @brief @copybrief server::websocket::WebsocketHandlerBase
5
6#include <userver/components/component_config.hpp>
7#include <userver/components/component_context.hpp>
8#include <userver/server/handlers/http_handler_base.hpp>
9#include <userver/server/websocket/server.hpp>
10
11USERVER_NAMESPACE_BEGIN
12
13namespace server::websocket {
14
15/// @ingroup userver_components userver_http_handlers userver_base_classes
16///
17/// @brief Base class for WebSocket handler
18///
19/// ## Static options of server::websocket::WebsocketHandlerBase :
20/// @include{doc} scripts/docs/en/components_schema/core/src/server/websocket/websocket_handler.md
21///
22/// Options inherited from @ref server::handlers::HttpHandlerBase :
23/// @include{doc} scripts/docs/en/components_schema/core/src/server/handlers/http_handler_base.md
24///
25/// Options inherited from @ref server::handlers::HandlerBase :
26/// @include{doc} scripts/docs/en/components_schema/core/src/server/handlers/handler_base.md
27///
28/// Options inherited from @ref components::ComponentBase :
29/// @include{doc} scripts/docs/en/components_schema/core/src/components/impl/component_base.md
30///
31/// ## Example usage:
32///
33/// @snippet samples/websocket_service/main.cpp Websocket service sample - component
34class WebsocketHandlerBase : public server::handlers::HttpHandlerBase {
35public:
36 WebsocketHandlerBase(const components::ComponentConfig&, const components::ComponentContext&);
37
38 /// @brief Websocket handler code belongs here.
39 virtual void Handle(WebSocketConnection& websocket, server::request::RequestContext&) const = 0;
40
41 /// @brief If any code is required for handshake validation,
42 /// it goes here.
43 virtual bool
44 HandleHandshake(const server::http::HttpRequest&, server::http::HttpResponse&, server::request::RequestContext&)
45 const {
46 return true;
47 }
48
49 /// @cond
50 void WriteMetrics(utils::statistics::Writer& writer) const;
51
52 static yaml_config::Schema GetStaticConfigSchema();
53 /// @endcond
54
55 /// @brief If \a request isn't a websocket request the function handles a
56 /// request.
58 [[maybe_unused]] const server::http::HttpRequest& request,
59 [[maybe_unused]] server::request::RequestContext& context
60 ) const {
61 LOG_WARNING() << "Not a GET 'Upgrade: websocket' and 'Connection: Upgrade' request";
62 throw server::handlers::ClientError();
63 }
64
65private:
66 std::string HandleRequestThrow(const server::http::HttpRequest& request, server::request::RequestContext& context)
67 const override;
68
69 websocket::Config config_;
70 mutable Statistics stats_;
71};
72
73} // namespace server::websocket
74
75USERVER_NAMESPACE_END