Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / components / data_reduction_proxy / common / data_reduction_proxy_headers.h
index 88b0cd0..849ade0 100644 (file)
@@ -9,20 +9,73 @@
 
 #include "base/macros.h"
 #include "base/time/time.h"
-#include "net/http/http_response_headers.h"
 #include "net/proxy/proxy_service.h"
 
+namespace net {
+
+class HttpResponseHeaders;
+
+}  // namespace net
+
 namespace data_reduction_proxy {
 
+// Values of the UMA DataReductionProxy.BypassType{Primary|Fallback}
+// and DataReductionProxy.BlockType{Primary|Fallback} histograms.
+// This enum must remain synchronized with the enum of the same
+// name in metrics/histograms/histograms.xml.
+enum DataReductionProxyBypassType {
+  // Bypass due to explicit instruction for the current request.
+  BYPASS_EVENT_TYPE_CURRENT = 0,
+
+  // Bypass the proxy for less than one minute.
+  BYPASS_EVENT_TYPE_SHORT = 1,
+
+  // Bypass the proxy for one to five minutes.
+  BYPASS_EVENT_TYPE_MEDIUM = 2,
+
+  // Bypass the proxy for more than five minutes.
+  BYPASS_EVENT_TYPE_LONG = 3,
+
+  // Bypass due to a 4xx missing via header.
+  BYPASS_EVENT_TYPE_MISSING_VIA_HEADER_4XX = 4,
+
+  // Bypass due to other missing via header, excluding 4xx errors.
+  BYPASS_EVENT_TYPE_MISSING_VIA_HEADER_OTHER = 5,
+
+  // Bypass due to 407 response from proxy without a challenge.
+  BYPASS_EVENT_TYPE_MALFORMED_407 = 6,
+
+  // Bypass due to a 500 internal server error
+  BYPASS_EVENT_TYPE_STATUS_500_HTTP_INTERNAL_SERVER_ERROR = 7,
+
+  // Bypass because the request URI was too long.
+  BYPASS_EVENT_TYPE_STATUS_502_HTTP_BAD_GATEWAY = 8,
+
+  // Bypass due to a 503 response.
+  BYPASS_EVENT_TYPE_STATUS_503_HTTP_SERVICE_UNAVAILABLE = 9,
+
+  // Bypass due to any network error.
+  BYPASS_EVENT_TYPE_NETWORK_ERROR = 10,
+
+  // This must always be last.
+  BYPASS_EVENT_TYPE_MAX = 11
+};
+
 // Contains instructions contained in the Chrome-Proxy header.
 struct DataReductionProxyInfo {
-  DataReductionProxyInfo() : bypass_all(false) {}
+  DataReductionProxyInfo()
+      : bypass_all(false), mark_proxies_as_bad(false) {}
 
   // True if Chrome should bypass all available data reduction proxies. False
   // if only the currently connected data reduction proxy should be bypassed.
   bool bypass_all;
 
-  // Amount of time to bypass the data reduction proxy or proxies.
+  // True iff Chrome should mark the data reduction proxy or proxies as bad for
+  // the period of time specified in |bypass_duration|.
+  bool mark_proxies_as_bad;
+
+  // Amount of time to bypass the data reduction proxy or proxies. This value is
+  // ignored if |mark_proxies_as_bad| is false.
   base::TimeDelta bypass_duration;
 };
 
@@ -32,28 +85,62 @@ struct DataReductionProxyInfo {
 // (as specified in |ProxyList::UpdateRetryInfoOnFallback|) should be used.
 // If all available data reduction proxies should by bypassed, |bypass_all| is
 // set to true. |proxy_info| must be non-NULL.
-bool GetDataReductionProxyInfo(
-    const net::HttpResponseHeaders* headers,
-    DataReductionProxyInfo* proxy_info);
+bool ParseHeadersAndSetProxyInfo(const net::HttpResponseHeaders* headers,
+                                 DataReductionProxyInfo* proxy_info);
 
-// Returns true if the response contain the data reduction proxy Via header
-// value. Used to check the integrity of data reduction proxy responses.
-bool HasDataReductionProxyViaHeader(const net::HttpResponseHeaders* headers);
+// Returns true if the response contains the data reduction proxy Via header
+// value. If non-NULL, sets |has_intermediary| to true if another server added
+// a Via header after the data reduction proxy, and to false otherwise. Used to
+// check the integrity of data reduction proxy responses and whether there are
+// other middleboxes between the data reduction proxy and the client.
+bool HasDataReductionProxyViaHeader(const net::HttpResponseHeaders* headers,
+                                    bool* has_intermediary);
 
 // Returns the reason why the Chrome proxy should be bypassed or not, and
 // populates |proxy_info| with information on how long to bypass if
 // applicable.
-net::ProxyService::DataReductionProxyBypassEventType
-GetDataReductionProxyBypassEventType(
+DataReductionProxyBypassType GetDataReductionProxyBypassType(
     const net::HttpResponseHeaders* headers,
     DataReductionProxyInfo* proxy_info);
 
+// Searches for the specified Chrome-Proxy action, and if present saves its
+// value as a string in |action_value|. Only returns the first one and ignores
+// the rest if multiple actions match |action_prefix|.
+bool GetDataReductionProxyActionValue(
+    const net::HttpResponseHeaders* headers,
+    const std::string& action_prefix,
+    std::string* action_value);
+
 // Searches for the specified Chrome-Proxy action, and if present interprets
 // its value as a duration in seconds.
-bool GetDataReductionProxyBypassDuration(
+bool ParseHeadersAndSetBypassDuration(const net::HttpResponseHeaders* headers,
+                                      const std::string& action_prefix,
+                                      base::TimeDelta* bypass_duration);
+
+// Gets the fingerprint of the Chrome-Proxy header.
+bool GetDataReductionProxyActionFingerprintChromeProxy(
     const net::HttpResponseHeaders* headers,
-    const std::string& action_prefix,
-    base::TimeDelta* duration);
+    std::string* chrome_proxy_fingerprint);
+
+// Gets the fingerprint of the Via header.
+bool GetDataReductionProxyActionFingerprintVia(
+    const net::HttpResponseHeaders* headers,
+    std::string* via_fingerprint);
+
+// Gets the fingerprint of a list of headers.
+bool GetDataReductionProxyActionFingerprintOtherHeaders(
+    const net::HttpResponseHeaders* headers,
+    std::string* other_headers_fingerprint);
+
+// Gets the fingerprint of Content-Length header.
+bool GetDataReductionProxyActionFingerprintContentLength(
+    const net::HttpResponseHeaders* headers,
+    std::string* content_length_fingerprint);
+
+// Returns values of the Chrome-Proxy header, but with its fingerprint removed.
+void GetDataReductionProxyHeaderWithFingerprintRemoved(
+    const net::HttpResponseHeaders* headers,
+    std::vector<std::string>* values);
 
 }  // namespace data_reduction_proxy
 #endif  // COMPONENTS_DATA_REDUCTION_PROXY_COMMON_DATA_REDUCTION_PROXY_HEADERS_H_