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/10/06 02:11:24 UTC

[2/4] mesos git commit: Pulled out an encode function for http::Request encoding.

Pulled out an encode function for http::Request encoding.

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


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

Branch: refs/heads/master
Commit: 5fc202555cb5d5ea0d90e1dc791a69c3893ab69e
Parents: 9c39861
Author: Benjamin Mahler <be...@gmail.com>
Authored: Mon Sep 21 11:39:54 2015 -0700
Committer: Benjamin Mahler <be...@gmail.com>
Committed: Mon Oct 5 16:04:48 2015 -0700

----------------------------------------------------------------------
 3rdparty/libprocess/src/http.cpp | 136 ++++++++++++++++++----------------
 1 file changed, 72 insertions(+), 64 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/5fc20255/3rdparty/libprocess/src/http.cpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/src/http.cpp b/3rdparty/libprocess/src/http.cpp
index d992533..3dd7898 100644
--- a/3rdparty/libprocess/src/http.cpp
+++ b/3rdparty/libprocess/src/http.cpp
@@ -622,9 +622,79 @@ ostream& operator<<(ostream& stream, const URL& url)
   return stream;
 }
 
-
 namespace internal {
 
+string encode(const Request& request)
+{
+  // TODO(bmahler): Replace this with a RequestEncoder.
+  std::ostringstream out;
+
+  out << request.method
+      << " /" << strings::remove(request.url.path, "/", strings::PREFIX);
+
+  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, request.url.query) {
+      query.push_back(key + "=" + value);
+    }
+
+    out << "?" << strings::join("&", query);
+  }
+
+  if (request.url.fragment.isSome()) {
+    out << "#" << request.url.fragment.get();
+  }
+
+  out << " HTTP/1.1\r\n";
+
+  // Overwrite headers as necessary.
+  Headers headers = request.headers;
+
+  // Need to specify the 'Host' header.
+  CHECK(request.url.domain.isSome() || request.url.ip.isSome());
+
+  if (request.url.domain.isSome()) {
+    headers["Host"] = request.url.domain.get();
+  } else if (request.url.ip.isSome()) {
+    headers["Host"] = stringify(request.url.ip.get());
+  }
+
+  // Add port for non-standard ports.
+  if (request.url.port.isSome() &&
+      request.url.port != 80 &&
+      request.url.port != 443) {
+    headers["Host"] += ":" + stringify(request.url.port.get());
+  }
+
+  if (!request.keepAlive) {
+    // Tell the server to close the connection when it's done.
+    headers["Connection"] = "close";
+  }
+
+  // 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,
+  // unless the caller manually compresses the 'body'. For
+  // streaming requests we must wipe 'gzip' as an acceptable
+  // encoding as we don't currently have streaming gzip utilities
+  // to support decoding a streaming gzip response!
+
+  // Emit the headers.
+  foreachpair (const string& key, const string& value, headers) {
+    out << key << ": " << value << "\r\n";
+  }
+
+  out << "\r\n";
+  out << request.body;
+
+  return out.str();
+}
+
+
 // Forward declarations.
 Future<string> _convert(
     Pipe::Reader reader,
@@ -825,74 +895,12 @@ Future<Response> _request(
     const Request& request,
     bool streamedResponse)
 {
-  std::ostringstream out;
-
-  out << request.method
-      << " /" << strings::remove(request.url.path, "/", strings::PREFIX);
-
-  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, request.url.query) {
-      query.push_back(key + "=" + value);
-    }
-
-    out << "?" << strings::join("&", query);
-  }
-
-  if (request.url.fragment.isSome()) {
-    out << "#" << request.url.fragment.get();
-  }
-
-  out << " HTTP/1.1\r\n";
-
-  // Overwrite headers as necessary.
-  Headers headers = request.headers;
-
-  // Need to specify the 'Host' header.
-  if (request.url.domain.isSome()) {
-    // Use ONLY domain for standard ports.
-    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"] =
-        request.url.domain.get() + ":" + stringify(request.url.port.get());
-    }
-  } else {
-    headers["Host"] = stringify(address);
-  }
-
-  // Tell the server to close the connection when it's done.
-  headers["Connection"] = "close";
-
-  // 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,
-  // unless the caller manually compresses the 'body'. For
-  // streaming requests we must wipe 'gzip' as an acceptable
-  // encoding as we don't currently have streaming gzip utilities
-  // to support decoding a streaming gzip response!
-
-  // Emit the headers.
-  foreachpair (const string& key, const string& value, headers) {
-    out << key << ": " << value << "\r\n";
-  }
-
-  out << "\r\n";
-  out << request.body;
-
   // Need to disambiguate the Socket::recv for binding below.
   Future<string> (Socket::*recv)(const Option<ssize_t>&) = &Socket::recv;
 
   Owned<StreamingResponseDecoder> decoder(new StreamingResponseDecoder());
 
-  Future<Response> pipeResponse = socket.send(out.str())
+  Future<Response> pipeResponse = socket.send(encode(request))
     .then(lambda::function<Future<string>(void)>(
               lambda::bind(recv, socket, None())))
     .then(lambda::bind(&internal::decode, socket, decoder, lambda::_1));