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/03/25 01:02:13 UTC
[04/12] mesos git commit: Moved http::Request::accepts from header
into cpp file.
Moved http::Request::accepts from header into cpp file.
Review: https://reviews.apache.org/r/32336
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/0a5e973a
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/0a5e973a
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/0a5e973a
Branch: refs/heads/master
Commit: 0a5e973a95f83c97557c180d2f4426e181f4caeb
Parents: 9b14ba2
Author: Benjamin Mahler <be...@gmail.com>
Authored: Tue Mar 17 12:26:00 2015 -0700
Committer: Benjamin Mahler <be...@gmail.com>
Committed: Tue Mar 24 16:47:18 2015 -0700
----------------------------------------------------------------------
3rdparty/libprocess/include/process/http.hpp | 63 +--------------------
3rdparty/libprocess/src/http.cpp | 68 +++++++++++++++++++++++
2 files changed, 69 insertions(+), 62 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/0a5e973a/3rdparty/libprocess/include/process/http.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/include/process/http.hpp b/3rdparty/libprocess/include/process/http.hpp
index 2b36698..1b40b4f 100644
--- a/3rdparty/libprocess/include/process/http.hpp
+++ b/3rdparty/libprocess/include/process/http.hpp
@@ -25,7 +25,6 @@
#include <stout/memory.hpp>
#include <stout/none.hpp>
#include <stout/nothing.hpp>
-#include <stout/numify.hpp>
#include <stout/option.hpp>
#include <stout/stringify.hpp>
#include <stout/strings.hpp>
@@ -62,67 +61,7 @@ struct Request
// Returns whether the encoding is considered acceptable in the request.
// TODO(bmahler): Consider this logic being in decoder.hpp, and having the
// Request contain a member variable for each popular HTTP 1.0/1.1 header.
- bool accepts(const std::string& encoding) const
- {
- // See RFC 2616, section 14.3 for the details.
- Option<std::string> accepted = headers.get("Accept-Encoding");
-
- if (accepted.isNone()) {
- return false;
- }
-
- // Remove spaces and tabs for easier parsing.
- accepted = strings::remove(accepted.get(), " ");
- accepted = strings::remove(accepted.get(), "\t");
- accepted = strings::remove(accepted.get(), "\n");
-
- // From RFC 2616:
- // 1. If the content-coding is one of the content-codings listed in
- // the Accept-Encoding field, then it is acceptable, unless it is
- // accompanied by a qvalue of 0. (As defined in section 3.9, a
- // qvalue of 0 means "not acceptable.")
- // 2. The special "*" symbol in an Accept-Encoding field matches any
- // available content-coding not explicitly listed in the header
- // field.
-
- // First we'll look for the encoding specified explicitly, then '*'.
- std::vector<std::string> candidates;
- candidates.push_back(encoding); // Rule 1.
- candidates.push_back("*"); // Rule 2.
-
- foreach (std::string& candidate, candidates) {
- // Is the candidate one of the accepted encodings?
- foreach (const std::string& _encoding,
- strings::tokenize(accepted.get(), ",")) {
- if (strings::startsWith(_encoding, candidate)) {
- // Is there a 0 q value? Ex: 'gzip;q=0.0'.
- const std::map<std::string, std::vector<std::string> >& values =
- strings::pairs(_encoding, ";", "=");
-
- // Look for { "q": ["0"] }.
- if (values.count("q") == 0 || values.find("q")->second.size() != 1) {
- // No q value, or malformed q value.
- return true;
- }
-
- // Is the q value > 0?
- Try<double> value = numify<double>(values.find("q")->second[0]);
- return value.isSome() && value.get() > 0;
- }
- }
- }
-
- // NOTE: 3 and 4 are partially ignored since we can only provide gzip.
- // 3. If multiple content-codings are acceptable, then the acceptable
- // content-coding with the highest non-zero qvalue is preferred.
- // 4. The "identity" content-coding is always acceptable, unless
- // specifically refused because the Accept-Encoding field includes
- // "identity;q=0", or because the field includes "*;q=0" and does
- // not explicitly include the "identity" content-coding. If the
- // Accept-Encoding field-value is empty, then only the "identity"
- // encoding is acceptable.
- return false;
- }
+ bool accepts(const std::string& encoding) const;
};
http://git-wip-us.apache.org/repos/asf/mesos/blob/0a5e973a/3rdparty/libprocess/src/http.cpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/src/http.cpp b/3rdparty/libprocess/src/http.cpp
index 276cecd..1865546 100644
--- a/3rdparty/libprocess/src/http.cpp
+++ b/3rdparty/libprocess/src/http.cpp
@@ -6,6 +6,7 @@
#include <cstring>
#include <deque>
#include <iostream>
+#include <map>
#include <queue>
#include <string>
#include <vector>
@@ -16,16 +17,20 @@
#include <process/owned.hpp>
#include <process/socket.hpp>
+#include <stout/foreach.hpp>
#include <stout/ip.hpp>
#include <stout/lambda.hpp>
#include <stout/net.hpp>
#include <stout/nothing.hpp>
+#include <stout/numify.hpp>
#include <stout/option.hpp>
+#include <stout/strings.hpp>
#include <stout/try.hpp>
#include "decoder.hpp"
using std::deque;
+using std::map;
using std::queue;
using std::string;
using std::vector;
@@ -39,6 +44,69 @@ using process::network::Socket;
namespace process {
namespace http {
+
+bool Request::accepts(const string& encoding) const
+{
+ // See RFC 2616, section 14.3 for the details.
+ Option<string> accepted = headers.get("Accept-Encoding");
+
+ if (accepted.isNone()) {
+ return false;
+ }
+
+ // Remove spaces and tabs for easier parsing.
+ accepted = strings::remove(accepted.get(), " ");
+ accepted = strings::remove(accepted.get(), "\t");
+ accepted = strings::remove(accepted.get(), "\n");
+
+ // From RFC 2616:
+ // 1. If the content-coding is one of the content-codings listed in
+ // the Accept-Encoding field, then it is acceptable, unless it is
+ // accompanied by a qvalue of 0. (As defined in section 3.9, a
+ // qvalue of 0 means "not acceptable.")
+ // 2. The special "*" symbol in an Accept-Encoding field matches any
+ // available content-coding not explicitly listed in the header
+ // field.
+
+ // First we'll look for the encoding specified explicitly, then '*'.
+ vector<string> candidates;
+ candidates.push_back(encoding); // Rule 1.
+ candidates.push_back("*"); // Rule 2.
+
+ foreach (const string& candidate, candidates) {
+ // Is the candidate one of the accepted encodings?
+ foreach (const string& _encoding, strings::tokenize(accepted.get(), ",")) {
+ if (strings::startsWith(_encoding, candidate)) {
+ // Is there a 0 q value? Ex: 'gzip;q=0.0'.
+ const map<string, vector<string> >& values =
+ strings::pairs(_encoding, ";", "=");
+
+ // Look for { "q": ["0"] }.
+ if (values.count("q") == 0 || values.find("q")->second.size() != 1) {
+ // No q value, or malformed q value.
+ return true;
+ }
+
+ // Is the q value > 0?
+ Try<double> value = numify<double>(values.find("q")->second[0]);
+ return value.isSome() && value.get() > 0;
+ }
+ }
+ }
+
+ // NOTE: 3 and 4 are partially ignored since we can only provide gzip.
+ // 3. If multiple content-codings are acceptable, then the acceptable
+ // content-coding with the highest non-zero qvalue is preferred.
+ // 4. The "identity" content-coding is always acceptable, unless
+ // specifically refused because the Accept-Encoding field includes
+ // "identity;q=0", or because the field includes "*;q=0" and does
+ // not explicitly include the "identity" content-coding. If the
+ // Accept-Encoding field-value is empty, then only the "identity"
+ // encoding is acceptable.
+ return false;
+}
+
+
Pipe::Reader Pipe::reader() const
{
return Pipe::Reader(data);