// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef NET_BASE_SDCH_DICTIONARY_H_
#define NET_BASE_SDCH_DICTIONARY_H_

#include <stddef.h>

#include <memory>
#include <set>
#include <string>

#include "base/memory/ref_counted.h"
#include "base/time/time.h"
#include "net/base/net_export.h"
#include "net/base/sdch_problem_codes.h"
#include "url/gurl.h"

namespace base {
class Clock;
class Value;
}

namespace net {

// Contains all information for an SDCH dictionary.  This class is intended
// to be used with a RefCountedData<> wrappers.  These dictionaries
// are vended by SdchManager; see sdch_manager.h for details.
class NET_EXPORT_PRIVATE SdchDictionary {
 public:
  // Construct a vc-diff usable dictionary from the dictionary_text starting
  // at the given offset. The supplied client_hash should be used to
  // advertise the dictionary's availability relative to the suppplied URL.
  SdchDictionary(const std::string& dictionary_text,
                 size_t offset,
                 const std::string& client_hash,
                 const std::string& server_hash,
                 const GURL& url,
                 const std::string& domain,
                 const std::string& path,
                 const base::Time& expiration,
                 const std::set<int>& ports);

  ~SdchDictionary();

  // Sdch filters can get our text to use in decoding compressed data.
  const std::string& text() const { return text_; }

  const GURL& url() const { return url_; }
  const std::string& client_hash() const { return client_hash_; }
  const std::string& server_hash() const { return server_hash_; }
  const std::string& domain() const { return domain_; }
  const std::string& path() const { return path_; }
  const base::Time& expiration() const { return expiration_; }
  const std::set<int>& ports() const { return ports_; }

  // Security methods to check if we can establish a new dictionary with the
  // given data, that arrived in response to get of dictionary_url.
  static SdchProblemCode CanSet(const std::string& domain,
                                const std::string& path,
                                const std::set<int>& ports,
                                const GURL& dictionary_url);

  // Security method to check if we can use a dictionary to decompress a
  // target that arrived with a reference to this dictionary.
  SdchProblemCode CanUse(const GURL& referring_url) const;

  // Compare paths to see if they "match" for dictionary use.
  static bool PathMatch(const std::string& path,
                        const std::string& restriction);

  // Is this dictionary expired?
  bool Expired() const;

 private:
  friend class base::RefCountedData<SdchDictionary>;

  // Private copy-constructor to support RefCountedData<>, which requires
  // that an object stored in it be either DefaultConstructible or
  // CopyConstructible
  SdchDictionary(const SdchDictionary& rhs);

  // The actual text of the dictionary.
  std::string text_;

  // Part of the hash of text_ that the client uses to advertise the fact that
  // it has a specific dictionary pre-cached.
  std::string client_hash_;

  // Part of the hash of text_ that the server uses to identify the
  // dictionary it wants used for decoding.
  std::string server_hash_;

  // The GURL that arrived with the text_ in a URL request to specify where
  // this dictionary may be used.
  const GURL url_;

  // Metadate "headers" in before dictionary text contained the following:
  // Each dictionary payload consists of several headers, followed by the text
  // of the dictionary. The following are the known headers.
  const std::string domain_;
  const std::string path_;
  const base::Time expiration_;  // Implied by max-age.
  const std::set<int> ports_;

  void operator=(const SdchDictionary&) = delete;
};

}  // namespace net

#endif  // NET_BASE_SDCH_DICTIONARY_H_
