7 #include <boost/asio/ssl/stream.hpp> 8 #include "util/asio/fiber_socket.h" 17 using verify_mode = ::boost::asio::ssl::verify_mode;
18 using want = ::boost::asio::ssl::detail::engine::want;
21 explicit Engine(SSL_CTX* context);
27 SSL* native_handle() {
32 boost::system::error_code set_verify_mode(verify_mode v, boost::system::error_code& ec);
36 want handshake(::boost::asio::ssl::stream_base::handshake_type type,
37 boost::system::error_code& ec);
40 want shutdown(boost::system::error_code& ec);
43 want write(
const boost::asio::const_buffer& data, boost::system::error_code& ec,
44 std::size_t& bytes_transferred);
47 want read(
const boost::asio::mutable_buffer& data, boost::system::error_code& ec,
48 std::size_t& bytes_transferred);
51 void GetWriteBuf(boost::asio::mutable_buffer* mbuf);
56 void GetReadBuf(boost::asio::const_buffer* cbuf);
57 void AdvanceRead(
size_t sz);
62 const boost::system::error_code& map_error_code(boost::system::error_code& ec)
const;
72 want perform(
int (
Engine::*op)(
void*, std::size_t),
void* data, std::size_t length,
73 boost::system::error_code& ec, std::size_t* bytes_transferred);
76 int do_connect(
void*, std::size_t);
79 int do_shutdown(
void*, std::size_t);
82 int do_read(
void* data, std::size_t length);
85 int do_write(
void* data, std::size_t length);
94 using Impl = ::boost::asio::ssl::stream<FiberSyncSocket>;
100 using next_layer_type = Impl::next_layer_type;
101 using lowest_layer_type = Impl::lowest_layer_type;
102 using error_code = boost::system::error_code;
107 next_layer_type& next_layer() {
111 lowest_layer_type& lowest_layer() {
112 return next_layer_.lowest_layer();
117 template <
typename MBS>
size_t read_some(
const MBS& bufs, error_code& ec) {
118 namespace a = ::boost::asio;
120 auto cb = [&](
detail::Engine& eng, error_code& ec,
size_t& bytes_transferred) {
121 a::mutable_buffer buffer =
122 a::detail::buffer_sequence_adapter<a::mutable_buffer, MBS>::first(bufs);
124 return eng.read(buffer, ec, bytes_transferred);
127 size_t res = IoLoop(cb, ec);
134 template <
typename MBS>
size_t read_some(
const MBS& bufs);
138 template <
typename BS>
size_t write_some(
const BS& bufs, error_code& ec) {
139 namespace a = ::boost::asio;
140 auto cb = [&](
detail::Engine& eng, error_code& ec,
size_t& bytes_transferred) {
141 a::const_buffer buffer = a::detail::buffer_sequence_adapter<a::const_buffer, BS>::first(bufs);
143 return eng.write(buffer, ec, bytes_transferred);
146 size_t res = IoLoop(cb, ec);
153 template <
typename BS>
size_t write_some(
const BS& bufs);
155 void handshake(Impl::handshake_type type, error_code& ec);
157 const error_code& last_error()
const {
161 auto native_handle() {
162 return engine_.native_handle();
166 using want = detail::Engine::want;
168 template <
typename Operation>
169 std::size_t IoLoop(
const Operation& op, boost::system::error_code& ec);
171 void IoHandler(want op_code, boost::system::error_code& ec);
173 detail::Engine engine_;
174 FiberSyncSocket next_layer_;
176 error_code last_err_;
179 template <
typename Operation>
180 std::size_t SslStream::IoLoop(
const Operation& op, boost::system::error_code& ec) {
181 using engine = ::boost::asio::ssl::detail::engine;
183 std::size_t bytes_transferred = 0;
184 want op_code = engine::want_nothing;
187 op_code = op(engine_, ec, bytes_transferred);
190 IoHandler(op_code, ec);
191 }
while (!ec &&
int(op_code) < 0);
195 engine_.map_error_code(ec);
198 return bytes_transferred;
size_t write_some(const BS &bufs, error_code &ec)
void CommitWriteBuf(size_t sz)
sz should be less or equal to the size returned by GetWriteBuf.