26 #ifndef STATICLIB_PION_TCP_CONNECTION_HPP
27 #define STATICLIB_PION_TCP_CONNECTION_HPP
35 #include "asio/ssl.hpp"
37 #include "staticlib/config.hpp"
63 using connection_handler = std::function<void(std::shared_ptr<tcp_connection>&)>;
68 using read_buffer_type = std::array<char, 8192>;
73 using socket_type = asio::ip::tcp::socket;
78 using ssl_socket_type = asio::ssl::stream<asio::ip::tcp::socket>;
83 using ssl_context_type = asio::ssl::context;
90 ssl_socket_type ssl_socket;
100 read_buffer_type read_buffer;
105 std::pair<const char*, const char*> read_position;
115 connection_handler finished_handler;
120 asio::io_service::strand strand;
125 asio::steady_timer timer;
138 tcp_connection(asio::io_service& io_service, ssl_context_type& ssl_context,
const bool ssl_flag_in,
139 connection_handler finished_handler_in) :
140 ssl_socket(io_service, ssl_context),
141 ssl_flag(ssl_flag_in),
143 finished_handler(finished_handler_in),
172 return const_cast<ssl_socket_type&
> (ssl_socket).lowest_layer().is_open();
187 ssl_socket.next_layer().shutdown(asio::ip::tcp::socket::shutdown_both);
193 ssl_socket.next_layer().close(ec);
205 #if !defined(_MSC_VER) || (_WIN32_WINNT >= 0x0600)
207 ssl_socket.next_layer().cancel(ec);
215 #if !defined(_MSC_VER) || (_WIN32_WINNT >= 0x0600)
229 template <
typename AcceptHandler>
230 void async_accept(asio::ip::tcp::acceptor& tcp_acceptor, AcceptHandler handler) {
231 tcp_acceptor.async_accept(ssl_socket.lowest_layer(), handler);
241 template <
typename SSLHandshakeHandler>
243 ssl_socket.async_handshake(asio::ssl::stream_base::server, handler);
254 template <
typename ReadHandler>
257 ssl_socket.async_read_some(asio::buffer(read_buffer), handler);
259 ssl_socket.next_layer().async_read_some(asio::buffer(read_buffer), handler);
271 template <
typename ConstBufferSequence,
typename write_handler_t>
272 void async_write(
const ConstBufferSequence& buffers, write_handler_t handler) {
284 auto conn = shared_from_this();
285 if (finished_handler) {
286 finished_handler(conn);
305 current_lifecycle = lcycle;
323 return current_lifecycle == lifecycle::pipelined;
342 read_position.first = read_ptr;
343 read_position.second = read_end_ptr;
352 void load_read_pos(
const char *&read_ptr,
const char *&read_end_ptr)
const {
353 read_ptr = read_position.first;
354 read_end_ptr = read_position.second;
363 asio::ip::tcp::endpoint remote_endpoint;
366 remote_endpoint =
const_cast<ssl_socket_type&
> (ssl_socket).lowest_layer().remote_endpoint();
367 }
catch (asio::system_error& ) {
370 return remote_endpoint;
397 return ssl_socket.lowest_layer().get_io_service();
406 return ssl_socket.next_layer();
441 using tcp_connection_ptr = std::shared_ptr<tcp_connection>;
446 #endif // STATICLIB_PION_TCP_CONNECTION_HPP