2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
42#include "core/socket/stream/tls/SocketReader.h"
44#ifndef DOXYGEN_SHOULD_SKIP_THIS
46#include "core/socket/stream/tls/ssl_utils.h"
47#include "log/Logger.h"
48#include "utils/PreserveErrno.h"
52#include <openssl/ssl.h>
62 if ((SSL_get_shutdown(
ssl) & SSL_RECEIVED_SHUTDOWN) != 0) {
65 chunkLen = chunkLen > std::numeric_limits<
int>::max() ? std::numeric_limits<
int>::max() : chunkLen;
66 ret = SSL_read(
ssl, chunk,
static_cast<
int>(chunkLen));
69 const int ssl_err = SSL_get_error(
ssl,
static_cast<
int>(ret));
72 case SSL_ERROR_WANT_READ:
76 case SSL_ERROR_WANT_WRITE:
77 LOG(TRACE) <<
getName() <<
" SSL/TLS: Start renegotiation on read";
80 LOG(DEBUG) <<
getName() <<
" SSL/TLS: Renegotiation on read success";
83 LOG(WARNING) <<
getName() <<
" SSL/TLS: Renegotiation on read timed out";
91 case SSL_ERROR_ZERO_RETURN:
97 case SSL_ERROR_SYSCALL:
108 PLOG(DEBUG) <<
getName() <<
" SSL/TLS: EOF detected: Connection closed by peer.";
110 PLOG(WARNING) <<
getName() +
" SSL/TLS: Syscall error on read";
const std::string & getName() const
virtual ssize_t read(char *chunk, std::size_t chunkLen)
virtual void onReadShutdown()=0
virtual bool doSSLHandshake(const std::function< void()> &onSuccess, const std::function< void()> &onTimeout, const std::function< void(int)> &onStatus)=0
ssize_t read(char *chunk, std::size_t chunkLen) override
void ssl_log(const std::string &message, int sslErr)