15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_HTTP_HTTP_VARY_DATA_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_HTTP_HTTP_VARY_DATA_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/md5.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_export.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Pickle;
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PickleIterator;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct HttpRequestInfo;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HttpResponseHeaders;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used to implement the HTTP/1.1 Vary header.  This class contains a MD5 hash
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// over the request headers indicated by a Vary header.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// While RFC 2616 requires strict request header comparisons, it is much
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cheaper to store a MD5 sum, which should be sufficient.  Storing a hash also
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// avoids messy privacy issues as some of the request headers could hold
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sensitive data (e.g., cookies).
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTE: This class does not hold onto the contents of the Vary header.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Instead, it relies on the consumer to store that and to supply it again to
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the MatchesRequest function for comparing against future HTTP requests.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE HttpVaryData {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpVaryData();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_valid() const { return is_valid_; }
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize from a request and its corresponding response headers.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if a Vary header was found in the response headers and that
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Vary header was not empty and did not contain the '*' value.  Upon
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // success, the object is also marked as valid such that is_valid() will
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // return true.  Otherwise, false is returned to indicate that this object
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is marked as invalid.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Init(const HttpRequestInfo& request_info,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const HttpResponseHeaders& response_headers);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize from a pickle that contains data generated by a call to the
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // vary data's Persist method.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Upon success, true is returned and the object is marked as valid such that
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is_valid() will return true.  Otherwise, false is returned to indicate
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that this object is marked as invalid.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool InitFromPickle(const Pickle& pickle, PickleIterator* pickle_iter);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call this method to persist the vary data. Illegal to call this on an
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // invalid object.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Persist(Pickle* pickle) const;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call this method to test if the given request matches the previous request
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // with which this vary data corresponds.  The |cached_response_headers| must
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be the same response headers used to generate this vary data.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool MatchesRequest(const HttpRequestInfo& request_info,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const HttpResponseHeaders& cached_response_headers) const;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the corresponding request header value.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string GetRequestValue(const HttpRequestInfo& request_info,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const std::string& request_header);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Append to the MD5 context for the given request header.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void AddField(const HttpRequestInfo& request_info,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const std::string& request_header,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       base::MD5Context* context);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A digested version of the request headers corresponding to the Vary header.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::MD5Digest request_digest_;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True when request_digest_ contains meaningful data.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_valid_;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NET_HTTP_HTTP_VARY_DATA_H_
87