/*
 * Copyright 2015 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef COBALT_CSP_SOURCE_H_
#define COBALT_CSP_SOURCE_H_

#include <string>

#include "base/basictypes.h"
#include "cobalt/csp/content_security_policy.h"
#include "googleurl/src/gurl.h"

namespace cobalt {
namespace csp {

struct SourceConfig {
  enum WildcardDisposition {
    kHasWildcard,
    kNoWildcard,
  };
  SourceConfig()
      : port(url_parse::PORT_UNSPECIFIED),
        host_wildcard(kNoWildcard),
        port_wildcard(kNoWildcard) {}

  std::string scheme;
  std::string host;
  std::string path;
  int port;
  WildcardDisposition host_wildcard;
  WildcardDisposition port_wildcard;
};

class Source {
 public:
  Source(ContentSecurityPolicy* policy, const SourceConfig& config);
  bool Matches(const GURL& url,
               ContentSecurityPolicy::RedirectStatus redirect_status =
                   ContentSecurityPolicy::kDidNotRedirect) const;

 private:
  bool SchemeMatches(const GURL& url) const;
  bool HostMatches(const GURL& url) const;
  bool PathMatches(const GURL& url) const;
  bool PortMatches(const GURL& url) const;
  bool IsSchemeOnly() const;

  ContentSecurityPolicy* policy_;
  SourceConfig config_;
};

}  // namespace csp
}  // namespace cobalt

#endif  // COBALT_CSP_SOURCE_H_
