Repository: mesos Updated Branches: refs/heads/master e6e7d732c -> 5b183ee21
Added https support in libprocess. Current http implementation lacks a https interface. This change exposes SSL socket for "https" URL scheme. Review: https://reviews.apache.org/r/36757 Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/5b183ee2 Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/5b183ee2 Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/5b183ee2 Branch: refs/heads/master Commit: 5b183ee215847cdb4a5121bedf9af0952426cef7 Parents: e6e7d73 Author: Jojy Varghese <[email protected]> Authored: Tue Jul 28 12:00:18 2015 -0700 Committer: Timothy Chen <[email protected]> Committed: Wed Jul 29 10:48:55 2015 -0700 ---------------------------------------------------------------------- 3rdparty/libprocess/src/http.cpp | 16 +++-- 3rdparty/libprocess/src/tests/ssl_tests.cpp | 81 ++++++++++++++++++++++++ 2 files changed, 93 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/5b183ee2/3rdparty/libprocess/src/http.cpp ---------------------------------------------------------------------- diff --git a/3rdparty/libprocess/src/http.cpp b/3rdparty/libprocess/src/http.cpp index d168579..4dcbd74 100644 --- a/3rdparty/libprocess/src/http.cpp +++ b/3rdparty/libprocess/src/http.cpp @@ -703,11 +703,19 @@ Future<Response> request( const Option<string>& body, const Option<string>& contentType) { - if (url.scheme != "http") { - return Failure("Unsupported URL scheme"); - } + auto create = [&url]() -> Try<Socket> { + if (url.scheme == "http") { + return Socket::create(Socket::POLL); + } + +#ifdef USE_SSL_SOCKET + if (url.scheme == "https") { + return Socket::create(Socket::SSL); + } +#endif - Try<Socket> create = Socket::create(); + return Error("Unsupported URL scheme"); + }(); if (create.isError()) { return Failure("Failed to create socket: " + create.error()); http://git-wip-us.apache.org/repos/asf/mesos/blob/5b183ee2/3rdparty/libprocess/src/tests/ssl_tests.cpp ---------------------------------------------------------------------- diff --git a/3rdparty/libprocess/src/tests/ssl_tests.cpp b/3rdparty/libprocess/src/tests/ssl_tests.cpp index a7173df..7a316bc 100644 --- a/3rdparty/libprocess/src/tests/ssl_tests.cpp +++ b/3rdparty/libprocess/src/tests/ssl_tests.cpp @@ -925,4 +925,85 @@ TEST_F(SSLTest, PeerAddress) ASSERT_SOME_EQ(client.address().get(), socket.get().peer()); } + +// Basic Https GET test. +TEST_F(SSLTest, HTTPSGet) +{ + Try<Socket> server = setup_server({ + {"SSL_ENABLED", "true"}, + {"SSL_KEY_FILE", key_path().value}, + {"SSL_CERT_FILE", certificate_path().value}}); + + ASSERT_SOME(server); + ASSERT_SOME(server.get().address()); + ASSERT_SOME(server.get().address().get().hostname()); + + Future<Socket> socket = server.get().accept(); + + // Create URL from server hostname and port. + const http::URL url( + "https", + server.get().address().get().hostname().get(), + server.get().address().get().port); + + // Send GET request. + Future<http::Response> response = http::get(url); + + AWAIT_ASSERT_READY(socket); + + // Construct response and send(server side). + const string buffer = + string("HTTP/1.1 200 OK\r\n") + + "Content-Length : " + + stringify(data.length()) + "\r\n" + + "\r\n" + + data; + AWAIT_ASSERT_READY(Socket(socket.get()).send(buffer)); + + AWAIT_ASSERT_READY(response); + AWAIT_EXPECT_RESPONSE_STATUS_EQ(http::OK().status, response); + ASSERT_EQ(data, response.get().body); +} + + +// Basic Https POST test. +TEST_F(SSLTest, HTTPSPost) +{ + Try<Socket> server = setup_server({ + {"SSL_ENABLED", "true"}, + {"SSL_KEY_FILE", key_path().value}, + {"SSL_CERT_FILE", certificate_path().value}}); + + ASSERT_SOME(server); + ASSERT_SOME(server.get().address()); + ASSERT_SOME(server.get().address().get().hostname()); + + Future<Socket> socket = server.get().accept(); + + // Create URL from server hostname and port. + const http::URL url( + "https", + server.get().address().get().hostname().get(), + server.get().address().get().port); + + // Send POST request. + Future<http::Response> response = + http::post(url, None(), "payload", "text/plain"); + + AWAIT_ASSERT_READY(socket); + + // Construct response and send(server side). + const string buffer = + string("HTTP/1.1 200 OK\r\n") + + "Content-Length : " + + stringify(data.length()) + "\r\n" + + "\r\n" + + data; + AWAIT_ASSERT_READY(Socket(socket.get()).send(buffer)); + + AWAIT_ASSERT_READY(response); + AWAIT_EXPECT_RESPONSE_STATUS_EQ(http::OK().status, response); + ASSERT_EQ(data, response.get().body); +} + #endif // USE_SSL_SOCKET
