You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by bm...@apache.org on 2015/09/28 20:27:21 UTC

[07/10] mesos git commit: Refactored http::internal::Request to take a Request object.

Refactored http::internal::Request to take a Request object.

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


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

Branch: refs/heads/master
Commit: 127a2181491464eb2dff7947bc91562cd788f3e3
Parents: 9b05418
Author: Benjamin Mahler <be...@gmail.com>
Authored: Thu Sep 17 17:02:51 2015 -0700
Committer: Benjamin Mahler <be...@gmail.com>
Committed: Mon Sep 28 11:09:55 2015 -0700

----------------------------------------------------------------------
 3rdparty/libprocess/src/http.cpp | 170 ++++++++++++++++++++--------------
 1 file changed, 102 insertions(+), 68 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/127a2181/3rdparty/libprocess/src/http.cpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/src/http.cpp b/3rdparty/libprocess/src/http.cpp
index c93e7e0..d992533 100644
--- a/3rdparty/libprocess/src/http.cpp
+++ b/3rdparty/libprocess/src/http.cpp
@@ -759,29 +759,20 @@ void _decode(
 Future<Response> _request(
     Socket socket,
     const Address& address,
-    const URL& url,
-    const string& method,
-    bool streamingResponse,
-    const Option<Headers>& _headers,
-    const Option<string>& body,
-    const Option<string>& contentType);
+    const Request& request,
+    bool streamedResponse);
 
 
-Future<Response> request(
-    const URL& url,
-    const string& method,
-    bool streamedResponse,
-    const Option<Headers>& headers,
-    const Option<string>& body,
-    const Option<string>& contentType)
+Future<Response> request(const Request& request, bool streamedResponse)
 {
-  Try<Socket> socket = [&url]() -> Try<Socket> {
+  Try<Socket> socket = [&request]() -> Try<Socket> {
     // Default to 'http' if no scheme was specified.
-    if (url.scheme.isNone() || url.scheme == string("http")) {
+    if (request.url.scheme.isNone() ||
+        request.url.scheme == string("http")) {
       return Socket::create(Socket::POLL);
     }
 
-    if (url.scheme == string("https")) {
+    if (request.url.scheme == string("https")) {
 #ifdef USE_SSL_SOCKET
       return Socket::create(Socket::SSL);
 #else
@@ -798,86 +789,78 @@ Future<Response> request(
 
   Address address;
 
-  if (url.ip.isSome()) {
-    address.ip = url.ip.get();
-  } else if (url.domain.isNone()) {
+  if (request.url.ip.isSome()) {
+    address.ip = request.url.ip.get();
+  } else if (request.url.domain.isNone()) {
     return Failure("Expecting url.ip or url.domain to be set");
   } else {
-    Try<net::IP> ip = net::getIP(url.domain.get(), AF_INET);
+    Try<net::IP> ip = net::getIP(request.url.domain.get(), AF_INET);
 
     if (ip.isError()) {
       return Failure("Failed to determine IP of domain '" +
-                     url.domain.get() + "': " + ip.error());
+                     request.url.domain.get() + "': " + ip.error());
     }
 
     address.ip = ip.get();
   }
 
-  if (url.port.isNone()) {
+  if (request.url.port.isNone()) {
     return Failure("Expecting url.port to be set");
   }
 
-  address.port = url.port.get();
+  address.port = request.url.port.get();
 
   return socket->connect(address)
     .then(lambda::bind(&_request,
                        socket.get(),
                        address,
-                       url,
-                       method,
-                       streamedResponse,
-                       headers,
-                       body,
-                       contentType));
+                       request,
+                       streamedResponse));
 }
 
 
 Future<Response> _request(
     Socket socket,
     const Address& address,
-    const URL& url,
-    const string& method,
-    bool streamedResponse,
-    const Option<Headers>& _headers,
-    const Option<string>& body,
-    const Option<string>& contentType)
+    const Request& request,
+    bool streamedResponse)
 {
   std::ostringstream out;
 
-  out << method << " /" << strings::remove(url.path, "/", strings::PREFIX);
+  out << request.method
+      << " /" << strings::remove(request.url.path, "/", strings::PREFIX);
 
-  if (!url.query.empty()) {
+  if (!request.url.query.empty()) {
     // Convert the query to a string that we join via '=' and '&'.
     vector<string> query;
 
-    foreachpair (const string& key, const string& value, url.query) {
+    foreachpair (const string& key, const string& value, request.url.query) {
       query.push_back(key + "=" + value);
     }
 
     out << "?" << strings::join("&", query);
   }
 
-  if (url.fragment.isSome()) {
-    out << "#" << url.fragment.get();
+  if (request.url.fragment.isSome()) {
+    out << "#" << request.url.fragment.get();
   }
 
   out << " HTTP/1.1\r\n";
 
-  // Set up the headers as necessary.
-  Headers headers;
-
-  if (_headers.isSome()) {
-    headers = _headers.get();
-  }
+  // Overwrite headers as necessary.
+  Headers headers = request.headers;
 
   // Need to specify the 'Host' header.
-  if (url.domain.isSome()) {
+  if (request.url.domain.isSome()) {
     // Use ONLY domain for standard ports.
-    if (url.port.isNone() || url.port == 80 || url.port == 443) {
-      headers["Host"] = url.domain.get();
+    if (request.url.port.isNone() ||
+        request.url.port == 80 ||
+        request.url.port == 443) {
+      headers["Host"] = request.url.domain.get();
     } else {
       // Add port for non-standard ports.
-      headers["Host"] = url.domain.get() + ":" + stringify(url.port.get());
+      headers["Host"] =
+        request.url.domain.get() + ":" + stringify(request.url.port.get());
     }
   } else {
     headers["Host"] = stringify(address);
@@ -886,15 +869,8 @@ Future<Response> _request(
   // Tell the server to close the connection when it's done.
   headers["Connection"] = "close";
 
-  // Overwrite Content-Type if necessary.
-  if (contentType.isSome()) {
-    headers["Content-Type"] = contentType.get();
-  }
-
-  // Make sure the Content-Length is set correctly if necessary.
-  if (body.isSome()) {
-    headers["Content-Length"] = stringify(body.get().length());
-  }
+  // Make sure the Content-Length is set correctly.
+  headers["Content-Length"] = stringify(request.body.length());
 
   // TODO(bmahler): Use a 'Request' and a 'RequestEncoder' here!
   // Currently this does not handle 'gzip' content encoding,
@@ -909,10 +885,7 @@ Future<Response> _request(
   }
 
   out << "\r\n";
-
-  if (body.isSome()) {
-    out << body.get();
-  }
+  out << request.body;
 
   // Need to disambiguate the Socket::recv for binding below.
   Future<string> (Socket::*recv)(const Option<ssize_t>&) = &Socket::recv;
@@ -939,7 +912,16 @@ Future<Response> get(
     const URL& url,
     const Option<Headers>& headers)
 {
-  return internal::request(url, "GET", false, headers, None(), None());
+  Request request;
+  request.method = "GET";
+  request.url = url;
+  request.keepAlive = false;
+
+  if (headers.isSome()) {
+    request.headers = headers.get();
+  }
+
+  return internal::request(request, false);
 }
 
 
@@ -981,7 +963,24 @@ Future<Response> post(
     return Failure("Attempted to do a POST with a Content-Type but no body");
   }
 
-  return internal::request(url, "POST", false, headers, body, contentType);
+  Request request;
+  request.method = "POST";
+  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 internal::request(request, false);
 }
 
 
@@ -1007,7 +1006,16 @@ Future<Response> requestDelete(
     const URL& url,
     const Option<Headers>& headers)
 {
-  return internal::request(url, "DELETE", false, headers, None(), None());
+  Request request;
+  request.method = "DELETE";
+  request.url = url;
+  request.keepAlive = false;
+
+  if (headers.isSome()) {
+    request.headers = headers.get();
+  }
+
+  return internal::request(request, false);
 }
 
 
@@ -1035,7 +1043,16 @@ Future<Response> get(
     const URL& url,
     const Option<Headers>& headers)
 {
-  return internal::request(url, "GET", true, headers, None(), None());
+  Request request;
+  request.method = "GET";
+  request.url = url;
+  request.keepAlive = false;
+
+  if (headers.isSome()) {
+    request.headers = headers.get();
+  }
+
+  return internal::request(request, true);
 }
 
 
@@ -1077,7 +1094,24 @@ Future<Response> post(
     return Failure("Attempted to do a POST with a Content-Type but no body");
   }
 
-  return internal::request(url, "POST", true, headers, body, contentType);
+  Request request;
+  request.method = "POST";
+  request.url = url;
+  request.keepAlive = false;
+
+  if (body.isSome()) {
+    request.body = body.get();
+  }
+
+  if (headers.isSome()) {
+    request.headers = headers.get();
+  }
+
+  if (contentType.isSome()) {
+    request.headers["Content-Type"] = contentType.get();
+  }
+
+  return internal::request(request, true);
 }