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 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// clang-format off
16
17/// @ingroup userver_components userver_http_handlers userver_base_classes
18///
19/// @brief Base class for WebSocket handler
20///
21/// ## Static options:
22/// Inherits all the options from server::handlers::HandlerBase and adds the
23/// following ones:
24///
25/// Name | Description | Default value
26/// ---- | ----------- | -------------
27/// log-level | overrides log level for this handle | <no override>
28/// status-codes-log-level | map of "status": log_level items to override span log level for specific status codes | {}
29/// max-remote-payload | max remote payload size | 65536
30/// fragment-size | max output fragment size | 65536
31///
32/// ## Example usage:
33///
34/// @snippet samples/websocket_service/websocket_service.cpp Websocket service sample - component
35
36// clang-format on
37class WebsocketHandlerBase : public server::handlers::HttpHandlerBase {
38 public:
39 WebsocketHandlerBase(const components::ComponentConfig&,
40 const components::ComponentContext&);
41
42 /// @brief Websocket handler code belongs here.
43 virtual void Handle(WebSocketConnection& websocket,
44 server::request::RequestContext&) const = 0;
45
46 /// @brief If any code is required for handshake validation,
47 /// it goes here.
48 virtual bool HandleHandshake(const server::http::HttpRequest&,
49 server::http::HttpResponse&,
50 server::request::RequestContext&) const {
51 return true;
52 }
53
54 /// @cond
55 void WriteMetrics(utils::statistics::Writer& writer) const;
56
57 static yaml_config::Schema GetStaticConfigSchema();
58 /// @endcond
59
60 /// @brief If \a request isn't a websocket request the function handles a
61 /// request.
63 [[maybe_unused]] const server::http::HttpRequest& request,
64 [[maybe_unused]] server::request::RequestContext& context) const {
66 << "Not a GET 'Upgrade: websocket' and 'Connection: Upgrade' request";
67 throw server::handlers::ClientError();
68 }
69
70 private:
71 std::string HandleRequestThrow(
72 const server::http::HttpRequest& request,
73 server::request::RequestContext& context) const override;
74
75 websocket::Config config_;
76 mutable Statistics stats_;
77 utils::statistics::Entry statistics_holder_;
78};
79
80} // namespace server::websocket
81
82USERVER_NAMESPACE_END