You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by me...@apache.org on 2016/02/10 10:06:07 UTC

mesos git commit: Exposed the http::internal::request function.

Repository: mesos
Updated Branches:
  refs/heads/master 942fe33d1 -> c869b0647


Exposed the http::internal::request function.

Review: https://reviews.apache.org/r/41789/


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/c869b064
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/c869b064
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/c869b064

Branch: refs/heads/master
Commit: c869b0647d56b22fdd940a015df7015069732169
Parents: 942fe33
Author: Yongqiao Wang <yq...@cn.ibm.com>
Authored: Tue Feb 9 19:13:39 2016 -0800
Committer: Adam B <ad...@mesosphere.io>
Committed: Tue Feb 9 19:13:39 2016 -0800

----------------------------------------------------------------------
 3rdparty/libprocess/include/process/http.hpp |  35 ++++++-
 3rdparty/libprocess/src/http.cpp             | 118 +++++++++++++++-------
 3rdparty/libprocess/src/tests/http_tests.cpp |  30 ++++++
 3 files changed, 144 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/c869b064/3rdparty/libprocess/include/process/http.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/include/process/http.hpp b/3rdparty/libprocess/include/process/http.hpp
index bcba304..8f4eabc 100644
--- a/3rdparty/libprocess/include/process/http.hpp
+++ b/3rdparty/libprocess/include/process/http.hpp
@@ -783,8 +783,39 @@ private:
 Future<Connection> connect(const URL& url);
 
 
-// TODO(bmahler): Consolidate these functions into a single
-// http::request function that takes a 'Request' object.
+// Create a http Request from the specified parameters.
+Request createRequest(
+  const UPID& upid,
+  const std::string& method,
+  bool enableSSL = false,
+  const Option<std::string>& path = None(),
+  const Option<Headers>& headers = None(),
+  const Option<std::string>& body = None(),
+  const Option<std::string>& contentType = None());
+
+
+Request createRequest(
+    const URL& url,
+    const std::string& method,
+    const Option<Headers>& headers = None(),
+    const Option<std::string>& body = None(),
+    const Option<std::string>& contentType = None());
+
+/**
+ * Asynchronously sends an HTTP request to the process and
+ * returns the HTTP response once the entire response is received.
+ *
+ * @param streamedResponse Being true indicates the HTTP response will
+ *     be 'PIPE' type, and caller must read the response body from the
+ *     Pipe::Reader, otherwise, the HTTP response will be 'BODY' type.
+ */
+Future<Response> request(
+    const Request& request,
+    bool streamedResponse = false);
+
+
+// TODO(Yongqiao Wang): Refactor other functions
+// (such as post/get/requestDelete) to use the 'request' function.
 
 // TODO(bmahler): Support discarding the future responses;
 // discarding should disconnect from the server.

http://git-wip-us.apache.org/repos/asf/mesos/blob/c869b064/3rdparty/libprocess/src/http.cpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/src/http.cpp b/3rdparty/libprocess/src/http.cpp
index a19cd12..3ca0cfd 100644
--- a/3rdparty/libprocess/src/http.cpp
+++ b/3rdparty/libprocess/src/http.cpp
@@ -1266,7 +1266,53 @@ Future<Connection> connect(const URL& url)
 }
 
 
-namespace internal {
+Request createRequest(
+    const URL& url,
+    const string& method,
+    const Option<Headers>& headers,
+    const Option<string>& body,
+    const Option<string>& contentType)
+{
+  Request request;
+  request.method = method;
+  request.url = url;
+  request.keepAlive = false;
+
+  if (headers.isSome()) {
+    request.headers = headers.get();
+  }
+
+  if (body.isSome()) {
+    request.body = body.get();
+  }
+
+  if (contentType.isSome()) {
+    request.headers["Content-Type"] = contentType.get();
+  }
+
+  return request;
+}
+
+
+Request createRequest(
+  const UPID& upid,
+  const string& method,
+  bool enableSSL,
+  const Option<string>& path,
+  const Option<Headers>& headers,
+  const Option<string>& body,
+  const Option<string>& contentType)
+{
+  string scheme = enableSSL ? "https" : "http";
+  URL url(scheme, net::IP(upid.address.ip), upid.address.port, upid.id);
+
+  if (path.isSome()) {
+    url.path = strings::join("/", url.path, path.get());
+  }
+
+  return createRequest(url, method, headers, body, contentType);
+}
+
 
 Future<Response> request(const Request& request, bool streamedResponse)
 {
@@ -1292,23 +1338,21 @@ Future<Response> request(const Request& request, bool streamedResponse)
     });
 }
 
-} // namespace internal {
-
 
 Future<Response> get(
     const URL& url,
     const Option<Headers>& headers)
 {
-  Request request;
-  request.method = "GET";
-  request.url = url;
-  request.keepAlive = false;
+  Request _request;
+  _request.method = "GET";
+  _request.url = url;
+  _request.keepAlive = false;
 
   if (headers.isSome()) {
-    request.headers = headers.get();
+    _request.headers = headers.get();
   }
 
-  return internal::request(request, false);
+  return request(_request, false);
 }
 
 
@@ -1350,24 +1394,24 @@ Future<Response> post(
     return Failure("Attempted to do a POST with a Content-Type but no body");
   }
 
-  Request request;
-  request.method = "POST";
-  request.url = url;
-  request.keepAlive = false;
+  Request _request;
+  _request.method = "POST";
+  _request.url = url;
+  _request.keepAlive = false;
 
   if (headers.isSome()) {
-    request.headers = headers.get();
+    _request.headers = headers.get();
   }
 
   if (body.isSome()) {
-    request.body = body.get();
+    _request.body = body.get();
   }
 
   if (contentType.isSome()) {
-    request.headers["Content-Type"] = contentType.get();
+    _request.headers["Content-Type"] = contentType.get();
   }
 
-  return internal::request(request, false);
+  return request(_request, false);
 }
 
 
@@ -1393,16 +1437,16 @@ Future<Response> requestDelete(
     const URL& url,
     const Option<Headers>& headers)
 {
-  Request request;
-  request.method = "DELETE";
-  request.url = url;
-  request.keepAlive = false;
+  Request _request;
+  _request.method = "DELETE";
+  _request.url = url;
+  _request.keepAlive = false;
 
   if (headers.isSome()) {
-    request.headers = headers.get();
+    _request.headers = headers.get();
   }
 
-  return internal::request(request, false);
+  return request(_request, false);
 }
 
 
@@ -1430,16 +1474,16 @@ Future<Response> get(
     const URL& url,
     const Option<Headers>& headers)
 {
-  Request request;
-  request.method = "GET";
-  request.url = url;
-  request.keepAlive = false;
+  Request _request;
+  _request.method = "GET";
+  _request.url = url;
+  _request.keepAlive = false;
 
   if (headers.isSome()) {
-    request.headers = headers.get();
+    _request.headers = headers.get();
   }
 
-  return internal::request(request, true);
+  return request(_request, true);
 }
 
 
@@ -1481,24 +1525,24 @@ Future<Response> post(
     return Failure("Attempted to do a POST with a Content-Type but no body");
   }
 
-  Request request;
-  request.method = "POST";
-  request.url = url;
-  request.keepAlive = false;
+  Request _request;
+  _request.method = "POST";
+  _request.url = url;
+  _request.keepAlive = false;
 
   if (body.isSome()) {
-    request.body = body.get();
+    _request.body = body.get();
   }
 
   if (headers.isSome()) {
-    request.headers = headers.get();
+    _request.headers = headers.get();
   }
 
   if (contentType.isSome()) {
-    request.headers["Content-Type"] = contentType.get();
+    _request.headers["Content-Type"] = contentType.get();
   }
 
-  return internal::request(request, true);
+  return request(_request, true);
 }
 
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/c869b064/3rdparty/libprocess/src/tests/http_tests.cpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/src/tests/http_tests.cpp b/3rdparty/libprocess/src/tests/http_tests.cpp
index dfd93d9..410551c 100644
--- a/3rdparty/libprocess/src/tests/http_tests.cpp
+++ b/3rdparty/libprocess/src/tests/http_tests.cpp
@@ -76,6 +76,7 @@ public:
 
   MOCK_METHOD1(body, Future<http::Response>(const http::Request&));
   MOCK_METHOD1(pipe, Future<http::Response>(const http::Request&));
+  MOCK_METHOD1(request, Future<http::Response>(const http::Request&));
   MOCK_METHOD1(get, Future<http::Response>(const http::Request&));
   MOCK_METHOD1(post, Future<http::Response>(const http::Request&));
   MOCK_METHOD1(requestDelete, Future<http::Response>(const http::Request&));
@@ -91,6 +92,7 @@ protected:
   {
     route("/body", None(), &HttpProcess::body);
     route("/pipe", None(), &HttpProcess::pipe);
+    route("/request", None(), &HttpProcess::request);
     route("/get", None(), &HttpProcess::get);
     route("/post", None(), &HttpProcess::post);
     route("/delete", None(), &HttpProcess::requestDelete);
@@ -730,6 +732,34 @@ TEST(HTTPTest, Delete)
 }
 
 
+http::Response validateDeleteHttpRequest(const http::Request& request)
+{
+  EXPECT_EQ("DELETE", request.method);
+  EXPECT_THAT(request.url.path, EndsWith("request"));
+  EXPECT_TRUE(request.body.empty());
+  EXPECT_TRUE(request.url.query.empty());
+
+  return http::OK();
+}
+
+
+TEST(HTTPTest, Request)
+{
+  Http http;
+
+  EXPECT_CALL(*http.process, request(_))
+    .WillOnce(Invoke(validateDeleteHttpRequest));
+
+  Future<http::Response> future =
+    http::request(http::createRequest(
+        http.process->self(), "DELETE", false, "request"));
+
+  AWAIT_READY(future);
+  ASSERT_EQ(http::Status::OK, future->code);
+  ASSERT_EQ(http::Status::string(http::Status::OK), future->status);
+}
+
+
 TEST(HTTPConnectionTest, Serial)
 {
   Http http;