You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by tn...@apache.org on 2015/07/29 19:49:06 UTC

mesos git commit: Added https support in libprocess.

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 <jo...@mesosphere.io>
Authored: Tue Jul 28 12:00:18 2015 -0700
Committer: Timothy Chen <tn...@apache.org>
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