connect_fsm.hpp 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. //
  2. // Copyright (c) 2025 Marcelo Zimbres Silva (mzimbres@gmail.com),
  3. // Ruben Perez Hidalgo (rubenperez038 at gmail dot com)
  4. //
  5. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  6. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  7. //
  8. #ifndef BOOST_REDIS_CONNECT_FSM_HPP
  9. #define BOOST_REDIS_CONNECT_FSM_HPP
  10. #include <boost/redis/config.hpp>
  11. #include <boost/asio/cancellation_type.hpp>
  12. #include <boost/asio/ip/tcp.hpp>
  13. #include <boost/system/error_code.hpp>
  14. // Sans-io algorithm for redis_stream::async_connect, as a finite state machine
  15. namespace boost::redis::detail {
  16. struct buffered_logger;
  17. // What transport is redis_stream using?
  18. enum class transport_type
  19. {
  20. tcp, // plaintext TCP
  21. tcp_tls, // TLS over TCP
  22. unix_socket, // UNIX domain sockets
  23. };
  24. struct redis_stream_state {
  25. transport_type type{transport_type::tcp};
  26. bool ssl_stream_used{false};
  27. };
  28. // What should we do next?
  29. enum class connect_action_type
  30. {
  31. unix_socket_close, // Close the UNIX socket, to discard state
  32. unix_socket_connect, // Connect to the UNIX socket
  33. tcp_resolve, // Name resolution
  34. tcp_connect, // TCP connect
  35. ssl_stream_reset, // Re-create the SSL stream, to discard state
  36. ssl_handshake, // SSL handshake
  37. done, // Complete the async op
  38. };
  39. struct connect_action {
  40. connect_action_type type;
  41. system::error_code ec;
  42. connect_action(connect_action_type type) noexcept
  43. : type{type}
  44. { }
  45. connect_action(system::error_code ec) noexcept
  46. : type{connect_action_type::done}
  47. , ec{ec}
  48. { }
  49. };
  50. class connect_fsm {
  51. int resume_point_{0};
  52. const config* cfg_{nullptr};
  53. buffered_logger* lgr_{nullptr};
  54. public:
  55. connect_fsm(const config& cfg, buffered_logger& lgr) noexcept
  56. : cfg_(&cfg)
  57. , lgr_(&lgr)
  58. { }
  59. const config& get_config() const { return *cfg_; }
  60. connect_action resume(
  61. system::error_code ec,
  62. const asio::ip::tcp::resolver::results_type& resolver_results,
  63. redis_stream_state& st,
  64. asio::cancellation_type_t cancel_state);
  65. connect_action resume(
  66. system::error_code ec,
  67. const asio::ip::tcp::endpoint& selected_endpoint,
  68. redis_stream_state& st,
  69. asio::cancellation_type_t cancel_state);
  70. connect_action resume(
  71. system::error_code ec,
  72. redis_stream_state& st,
  73. asio::cancellation_type_t cancel_state);
  74. }; // namespace boost::redis::detail
  75. } // namespace boost::redis::detail
  76. #endif