userver: userver/clients/http/websocket_response.hpp Source File
Loading...
Searching...
No Matches
websocket_response.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file userver/clients/http/websocket_response.hpp
4/// @brief @copybrief clients::http::WebSocketResponse
5
6#include <string>
7
8#include <userver/clients/http/response.hpp>
9#include <userver/fs/blocking/file_descriptor.hpp>
10
11USERVER_NAMESPACE_BEGIN
12
13namespace websocket {
15struct Config;
16} // namespace websocket
17
18namespace clients::http {
19
20/// @brief HTTP response for WebSocket upgrade.
21///
22/// Call @ref clients::http::Request::PerformWebSocketHandshake()
23/// to get one. After successful WebSocket handshake, you can use
24/// MakeWebSocketConnection() to establish a WebSocket connection.
25///
26/// @snippet samples/websocket_client/main.cpp WebSocket client sample - handler
27class WebSocketResponse final {
28public:
29 /// @cond
30 WebSocketResponse(
31 std::shared_ptr<Response> handshake_response,
32 fs::blocking::FileDescriptor&& socket,
33 std::string socket_preamble = {}
34 );
35 /// @endcond
36
37 WebSocketResponse() = default;
38 WebSocketResponse(WebSocketResponse&&) = default;
39 WebSocketResponse(const WebSocketResponse&) = delete;
40 WebSocketResponse& operator=(WebSocketResponse&&) = default;
41 WebSocketResponse& operator=(const WebSocketResponse&) = delete;
42
43 /// @brief Get the HTTP handshake response
44 std::shared_ptr<Response> GetHandshakeResponse() { return handshake_response_; }
45
46 /// @brief Check if WebSocket protocol upgrade was successful
47 /// @returns true if handshake completed with status 101 Switching Protocols
48 bool IsProtocolUpgraded() const;
49
50 /// @brief Create a WebSocket connection from this response
51 std::shared_ptr<websocket::WebSocketConnection> MakeWebSocketConnection();
52
53 /// @brief Create a WebSocket connection from this response with custom websocket config
54 std::shared_ptr<websocket::WebSocketConnection> MakeWebSocketConnectionWithConfig(const websocket::Config& config);
55
56private:
57 std::shared_ptr<Response> handshake_response_;
58 fs::blocking::FileDescriptor socket_;
59 /// Raw WebSocket frames drained from libcurl CONNECT_ONLY buffers.
60 std::string socket_preamble_;
61};
62
63/// @cond
64namespace impl {
65
66/// Function pointer for curl::easy::enable_socket_extraction (curl thread, before remove).
67std::string DrainCurlWebSocketPreamble(void* native_easy);
68
69} // namespace impl
70/// @endcond
71
72} // namespace clients::http
73
74USERVER_NAMESPACE_END