|
@@ -118,20 +118,23 @@ bool TlsTransport::stop() {
|
|
}
|
|
}
|
|
|
|
|
|
bool TlsTransport::send(message_ptr message) {
|
|
bool TlsTransport::send(message_ptr message) {
|
|
- if (!message || state() != State::Connected)
|
|
|
|
- return false;
|
|
|
|
|
|
+ if (state() != State::Connected)
|
|
|
|
+ throw std::runtime_error("TLS is not open");
|
|
|
|
|
|
- PLOG_VERBOSE << "Send size=" << message->size();
|
|
|
|
|
|
+ if (!message || message->size() == 0)
|
|
|
|
+ return outgoing(message); // pass through
|
|
|
|
|
|
- if (message->size() == 0)
|
|
|
|
- return true;
|
|
|
|
|
|
+ PLOG_VERBOSE << "Send size=" << message->size();
|
|
|
|
|
|
ssize_t ret;
|
|
ssize_t ret;
|
|
do {
|
|
do {
|
|
ret = gnutls_record_send(mSession, message->data(), message->size());
|
|
ret = gnutls_record_send(mSession, message->data(), message->size());
|
|
} while (ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN);
|
|
} while (ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN);
|
|
|
|
|
|
- return gnutls::check(ret);
|
|
|
|
|
|
+ if (!gnutls::check(ret))
|
|
|
|
+ throw std::runtime_error("TLS send failed");
|
|
|
|
+
|
|
|
|
+ return mOutgoingResult;
|
|
}
|
|
}
|
|
|
|
|
|
void TlsTransport::incoming(message_ptr message) {
|
|
void TlsTransport::incoming(message_ptr message) {
|
|
@@ -144,6 +147,12 @@ void TlsTransport::incoming(message_ptr message) {
|
|
mIncomingQueue.push(message);
|
|
mIncomingQueue.push(message);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+bool TlsTransport::outgoing(message_ptr message) {
|
|
|
|
+ bool result = Transport::outgoing(std::move(message));
|
|
|
|
+ mOutgoingResult = result;
|
|
|
|
+ return result;
|
|
|
|
+}
|
|
|
|
+
|
|
void TlsTransport::postHandshake() {
|
|
void TlsTransport::postHandshake() {
|
|
// Dummy
|
|
// Dummy
|
|
}
|
|
}
|
|
@@ -390,24 +399,25 @@ bool TlsTransport::stop() {
|
|
}
|
|
}
|
|
|
|
|
|
bool TlsTransport::send(message_ptr message) {
|
|
bool TlsTransport::send(message_ptr message) {
|
|
- if (!message || state() != State::Connected)
|
|
|
|
- return false;
|
|
|
|
|
|
+ if (state() != State::Connected)
|
|
|
|
+ throw std::runtime_error("TLS is not open");
|
|
|
|
|
|
- PLOG_VERBOSE << "Send size=" << message->size();
|
|
|
|
|
|
+ if (!message || message->size() == 0)
|
|
|
|
+ return outgoing(message); // pass through
|
|
|
|
|
|
- if (message->size() == 0)
|
|
|
|
- return true;
|
|
|
|
|
|
+ PLOG_VERBOSE << "Send size=" << message->size();
|
|
|
|
|
|
int ret = SSL_write(mSsl, message->data(), int(message->size()));
|
|
int ret = SSL_write(mSsl, message->data(), int(message->size()));
|
|
if (!openssl::check(mSsl, ret))
|
|
if (!openssl::check(mSsl, ret))
|
|
- return false;
|
|
|
|
|
|
+ throw std::runtime_error("TLS send failed");
|
|
|
|
|
|
const size_t bufferSize = 4096;
|
|
const size_t bufferSize = 4096;
|
|
byte buffer[bufferSize];
|
|
byte buffer[bufferSize];
|
|
|
|
+ bool result = true;
|
|
while ((ret = BIO_read(mOutBio, buffer, bufferSize)) > 0)
|
|
while ((ret = BIO_read(mOutBio, buffer, bufferSize)) > 0)
|
|
- outgoing(make_message(buffer, buffer + ret));
|
|
|
|
|
|
+ result = outgoing(make_message(buffer, buffer + ret));
|
|
|
|
|
|
- return true;
|
|
|
|
|
|
+ return result;
|
|
}
|
|
}
|
|
|
|
|
|
void TlsTransport::incoming(message_ptr message) {
|
|
void TlsTransport::incoming(message_ptr message) {
|
|
@@ -420,6 +430,10 @@ void TlsTransport::incoming(message_ptr message) {
|
|
mIncomingQueue.push(message);
|
|
mIncomingQueue.push(message);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+bool TlsTransport::outgoing(message_ptr message) {
|
|
|
|
+ return Transport::outgoing(std::move(message));
|
|
|
|
+}
|
|
|
|
+
|
|
void TlsTransport::postHandshake() {
|
|
void TlsTransport::postHandshake() {
|
|
// Dummy
|
|
// Dummy
|
|
}
|
|
}
|