aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordan Bayles <jophba@chromium.org>2019-09-20 11:37:42 -0700
committerCommit Bot <commit-bot@chromium.org>2019-09-25 16:38:25 +0000
commitf46c0a6bda52678b6712e1e8cf99c94e9852041c (patch)
tree2517101dba14b928153e63b5a5221ad8faa78811
parentc05ada2d30d52623ba90d2450405e992f9b1140c (diff)
downloadopenscreen-f46c0a6bda52678b6712e1e8cf99c94e9852041c.tar.gz
Add simple reading to TlsConnection
This patch implements a ReceiveMessage method for TlsConnectionPosix, that simply checks if bytes are pending and then reads them if so, reporting any errors that occur. Change-Id: If9c453cd466c235c502ed16deedac3b7538a6a46 Reviewed-on: https://chromium-review.googlesource.com/c/openscreen/+/1816287 Reviewed-by: Jordan Bayles <jophba@chromium.org> Reviewed-by: Yuri Wiitala <miu@chromium.org> Reviewed-by: Ryan Keane <rwkeane@google.com> Commit-Queue: Jordan Bayles <jophba@chromium.org>
-rw-r--r--platform/api/tls_connection.cc6
-rw-r--r--platform/api/tls_connection.h8
-rw-r--r--platform/impl/tls_connection_posix.cc27
-rw-r--r--platform/impl/tls_connection_posix.h4
-rw-r--r--platform/impl/tls_data_router_posix.cc6
5 files changed, 41 insertions, 10 deletions
diff --git a/platform/api/tls_connection.cc b/platform/api/tls_connection.cc
index 0696e4fc..ee0258c2 100644
--- a/platform/api/tls_connection.cc
+++ b/platform/api/tls_connection.cc
@@ -42,14 +42,14 @@ void TlsConnection::OnError(Error error) {
});
}
-void TlsConnection::OnRead(std::vector<uint8_t> message) {
+void TlsConnection::OnRead(std::vector<uint8_t> block) {
if (!client_) {
return;
}
- task_runner_->PostTask([m = std::move(message), this]() mutable {
+ task_runner_->PostTask([b = std::move(block), this]() mutable {
// TODO(issues/71): |this| may be invalid at this point.
- this->client_->OnRead(this, std::move(m));
+ this->client_->OnRead(this, std::move(b));
});
}
diff --git a/platform/api/tls_connection.h b/platform/api/tls_connection.h
index 1126265a..de7faffa 100644
--- a/platform/api/tls_connection.h
+++ b/platform/api/tls_connection.h
@@ -33,11 +33,11 @@ class TlsConnection {
virtual void OnWriteUnblocked(TlsConnection* connection) = 0;
// Called when |connection| experiences an error, such as a read error.
- virtual void OnError(TlsConnection* socket, Error error) = 0;
+ virtual void OnError(TlsConnection* connection, Error error) = 0;
- // Called when a |packet| arrives on |socket|.
- virtual void OnRead(TlsConnection* socket,
- std::vector<uint8_t> message) = 0;
+ // Called when a |block| arrives on |connection|.
+ virtual void OnRead(TlsConnection* connection,
+ std::vector<uint8_t> block) = 0;
protected:
virtual ~Client() = default;
diff --git a/platform/impl/tls_connection_posix.cc b/platform/impl/tls_connection_posix.cc
index e11b85b3..6a0f4353 100644
--- a/platform/impl/tls_connection_posix.cc
+++ b/platform/impl/tls_connection_posix.cc
@@ -16,6 +16,7 @@
#include <cstring>
#include <memory>
+#include <utility>
#include "absl/types/optional.h"
#include "absl/types/span.h"
@@ -27,7 +28,6 @@
namespace openscreen {
namespace platform {
-// TODO(jophba, rwkeane): implement reading
// TODO(jophba, rwkeane): implement write blocking/unblocking
TlsConnectionPosix::TlsConnectionPosix(IPEndpoint local_address,
TaskRunner* task_runner)
@@ -47,6 +47,31 @@ TlsConnectionPosix::TlsConnectionPosix(std::unique_ptr<StreamSocket> socket,
TlsConnectionPosix::~TlsConnectionPosix() = default;
+void TlsConnectionPosix::TryReceiveMessage() {
+ const int bytes_available = SSL_pending(ssl_.get());
+ if (bytes_available > 0) {
+ // NOTE: the pending size of the data block available is not a guarantee
+ // that it will receive only bytes_available or even
+ // any data, since not all pending bytes are application data.
+ std::vector<uint8_t> block(bytes_available);
+
+ const int bytes_read = SSL_read(ssl_.get(), block.data(), bytes_available);
+
+ // Read operator was not successful, either due to a closed connection,
+ // an error occurred, or we have to take an action.
+ if (bytes_read <= 0) {
+ const Error error = GetSSLError(ssl_.get(), bytes_read);
+ if (!error.ok() && (error != Error::Code::kAgain)) {
+ OnError(error);
+ }
+ return;
+ }
+
+ block.resize(bytes_read);
+ OnRead(std::move(block));
+ }
+}
+
void TlsConnectionPosix::Write(const void* data, size_t len) {
// TODO(jophba, rwkeane): implement this method.
OSP_UNIMPLEMENTED();
diff --git a/platform/impl/tls_connection_posix.h b/platform/impl/tls_connection_posix.h
index dd583549..cf8c1a73 100644
--- a/platform/impl/tls_connection_posix.h
+++ b/platform/impl/tls_connection_posix.h
@@ -33,6 +33,10 @@ class TlsConnectionPosix : public TlsConnection,
// Sends any available bytes from this connection's buffer_.
void SendAvailableBytes();
+ // Read out a block/message, if one is available, and notify this instance's
+ // TlsConnection::Client.
+ virtual void TryReceiveMessage();
+
// TlsConnection overrides.
void Write(const void* data, size_t len) override;
const IPEndpoint& local_address() const override;
diff --git a/platform/impl/tls_data_router_posix.cc b/platform/impl/tls_data_router_posix.cc
index b65210ba..466e5068 100644
--- a/platform/impl/tls_data_router_posix.cc
+++ b/platform/impl/tls_data_router_posix.cc
@@ -41,8 +41,10 @@ void TlsDataRouterPosix::OnSocketDestroyed(StreamSocketPosix* socket) {
}
void TlsDataRouterPosix::ReadAll() {
- // TODO(jophba, rwkeane): implement this method.
- OSP_UNIMPLEMENTED();
+ std::lock_guard<std::mutex> lock(connections_mutex_);
+ for (TlsConnectionPosix* connection : connections_) {
+ connection->TryReceiveMessage();
+ }
}
void TlsDataRouterPosix::WriteAll() {