JSON-RPC 2.0
JSON-RPC 2.0 Modern C++ Library
Loading...
Searching...
No Matches
framed_pipe_transport.cpp
Go to the documentation of this file.
2
3#include <stdexcept>
4#include <unistd.h>
5
6#include <spdlog/spdlog.h>
7
8namespace jsonrpc::transport {
9
11 const std::string &socket_path, bool is_server)
12 : PipeTransport(socket_path, is_server) {
13 spdlog::info(
14 "FramedPipeTransport initialized with socket path: {}", socket_path);
15}
16
17void FramedPipeTransport::SendMessage(const std::string &message) {
18 try {
19 asio::streambuf message_buf;
20 std::ostream message_stream(&message_buf);
21 FrameMessage(message_stream, message);
22
23 asio::error_code ec;
24 std::size_t bytes_written =
25 asio::write(GetSocket(), message_buf.data(), ec);
26
27 if (ec) {
28 throw std::runtime_error("Error sending message: " + ec.message());
29 }
30
31 spdlog::info(
32 "FramedPipeTransport sent message with {} bytes", bytes_written);
33 } catch (const std::exception &e) {
34 spdlog::error("FramedPipeTransport failed to send message: {}", e.what());
35 throw;
36 }
37}
38
40 asio::streambuf buffer;
41 asio::error_code ec;
42
43 // Read headers until \r\n\r\n delimiter
44 asio::read_until(GetSocket(), buffer, kHeaderDelimiter, ec);
45 if (ec) {
46 throw std::runtime_error("Failed to read message headers: " + ec.message());
47 }
48
49 std::istream header_stream(&buffer);
50
51 // Extract content length from the headers
52 int content_length = ReadContentLengthFromStream(header_stream);
53
54 // Calculate how much more content we need to read
55 std::size_t remaining_content_length = content_length - buffer.size();
56
57 // Read any remaining content directly into the buffer
58 if (remaining_content_length > 0) {
59 asio::read(GetSocket(), buffer.prepare(remaining_content_length), ec);
60 if (ec && ec != asio::error::eof) {
61 throw std::runtime_error(
62 "Failed to read message content: " + ec.message());
63 }
64 buffer.commit(remaining_content_length);
65 }
66
67 // Convert the entire buffer to a string
68 std::string content(
69 asio::buffers_begin(buffer.data()), asio::buffers_end(buffer.data()));
70 return content;
71}
72
73} // namespace jsonrpc::transport
void SendMessage(const std::string &message) override
Sends a message in string to the transport layer.
auto ReceiveMessage() -> std::string override
Receives a message from the transport layer.
FramedPipeTransport(const std::string &socket_path, bool is_server)
static void FrameMessage(std::ostream &output, const std::string &message)
Constructs a framed message.
Transport implementation using Unix domain sockets.
auto GetSocket() -> asio::local::stream_protocol::socket &