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/SocketWriter.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"
51#include <openssl/ssl.h>
61 if ((SSL_get_shutdown(
ssl) & SSL_SENT_SHUTDOWN) != 0) {
64 ret = SSL_write(
ssl, chunk,
static_cast<
int>(chunkLen));
67 const int ssl_err = SSL_get_error(
ssl,
static_cast<
int>(ret));
70 case SSL_ERROR_WANT_READ:
71 LOG(TRACE) <<
getName() <<
" SSL/TLS: Start renegotiation on read";
74 LOG(DEBUG) <<
getName() <<
" SSL/TLS: Renegotiation on read success";
77 LOG(WARNING) <<
getName() <<
" SSL/TLS: Renegotiation on read timed out";
85 case SSL_ERROR_WANT_WRITE:
89 case SSL_ERROR_ZERO_RETURN:
94 case SSL_ERROR_SYSCALL:
100 PLOG(WARNING) <<
getName() <<
" SSL/TLS: Syscal error (SIGPIPE detected) on write.";
101 }
else if (errno == ECONNRESET) {
102 PLOG(WARNING) <<
getName() <<
" SSL/TLS: Connection reset by peer (ECONNRESET).";
104 PLOG(WARNING) <<
getName() <<
" SSL/TLS: Syscall error on write";
const std::string & getName() const
virtual ssize_t write(const char *chunk, std::size_t chunkLen)
virtual bool doSSLHandshake(const std::function< void()> &onSuccess, const std::function< void()> &onTimeout, const std::function< void(int)> &onStatus)=0
ssize_t write(const char *chunk, std::size_t chunkLen) override
void ssl_log(const std::string &message, int sslErr)