9 #include <boost/asio.hpp>
10 #include <boost/bind.hpp>
16 using boost::asio::async_write;
17 using boost::asio::buffer;
18 using boost::asio::buffer_cast;
19 using boost::asio::mutable_buffer;
20 using boost::asio::mutable_buffers_1;
21 using boost::asio::null_buffers;
22 using boost::asio::placeholders::error;
23 using boost::asio::placeholders::bytes_transferred;
24 using boost::asio::ssl::stream_base;
26 using boost::function;
27 using boost::system::error_code;
50 session_->server()->stats_.read_blocked++;
54 }
else if (!
session_->IsSslHandShakeInProgress()) {
61 string Description()
const {
return "SslSession::SslReader"; }
70 bool async_read_ready)
72 ssl_socket_(ssl_socket),
73 ssl_handshake_in_progress_(false),
74 ssl_handshake_success_(false),
76 ssl_handshake_delayed_(false),
77 ssl_last_read_len_(0) {
89 size_t bytes_transferred) {
90 Buffer rdbuf(buffer_cast<const uint8_t *>(buffer), bytes_transferred);
136 if (ec.value() == ERR_PACK(ERR_LIB_SSL, 0, SSL_R_SHORT_READ)) {
149 return ssl_socket_->read_some(mutable_buffers_1(buffer), *error);
154 async_write(*
ssl_socket_.get(), buffer(data, size),
164 const error_code &error) {
165 session->ssl_handshake_in_progress_ =
false;
167 session->SetSslHandShakeSuccess();
169 session->SetSslHandShakeFailure();
172 if (session->socket() != NULL && !(session->IsClosed())) {
179 srand(static_cast<unsigned>(time(0)));
181 session->ssl_handshake_in_progress_ =
true;
182 if (session->IsServerSession()) {
183 session->ssl_socket_->async_handshake(stream_base::server,
187 session->ssl_socket_->async_handshake(stream_base::client,
boost::asio::const_buffer Buffer
SslSession(SslServer *server, SslSocket *socket, bool async_read_ready=true)
boost::intrusive_ptr< TcpSession > TcpSessionPtr
static const int kDefaultBufferSize
static void AsyncWriteHandler(TcpSessionPtr session, const boost::system::error_code &error, std::size_t bytes_transferred)
virtual size_t ReadSome(boost::asio::mutable_buffer buffer, boost::system::error_code *error)
static size_t BufferSize(const Buffer &buffer)
boost::intrusive_ptr< SslSession > SslSessionPtr
virtual Task * CreateReaderTask(boost::asio::mutable_buffer, size_t)
boost::asio::io_context * io_service()
size_t ReadSome(boost::asio::mutable_buffer buffer, boost::system::error_code *error)
bool IsSslHandShakeSuccessLocked()
EventManager * event_manager()
size_t ssl_last_read_len_
void TriggerAsyncReadHandler()
boost::asio::ssl::stream< boost::asio::ip::tcp::socket > SslSocket
boost::scoped_ptr< SslSocket > ssl_socket_
bool ssl_handshake_in_progress_
boost::asio::ip::tcp::socket Socket
string Description() const
bool ssl_handshake_delayed_
virtual void OnRead(Buffer buffer)=0
static bool IsSocketErrorHard(const boost::system::error_code &ec)
virtual void AsyncWrite(const uint8_t *data, std::size_t size)
virtual int reader_task_id() const
virtual void AsyncReadSome()
virtual size_t GetReadBufferSize() const
static bool IsSocketErrorHard(const boost::system::error_code &ec)
virtual bool Run()
Code to execute. Returns true if task is completed. Return false to reschedule the task...
void TriggerSslHandShake(SslHandShakeCallbackHandler)
bool ssl_handshake_delayed_
virtual void AsyncReadSome()
static uint64_t UTCTimestampUsec()
static void TriggerSslHandShakeInternal(SslSessionPtr ptr, SslHandShakeCallbackHandler cb)
SslReader(int task_id, SslSessionPtr session, ReadHandler read_fn, Buffer buffer)
virtual int GetSessionInstance() const
void AsyncWrite(const uint8_t *data, std::size_t size)
static void SslHandShakeCallback(SslHandShakeCallbackHandler cb, SslSessionPtr, const boost::system::error_code &error)
Task is a wrapper over tbb::task to support policies.
boost::function< void(SslSessionPtr, const boost::system::error_code &error)> SslHandShakeCallbackHandler
virtual Socket * socket() const
function< void(Buffer)> ReadHandler