// Copyright (c) 2011 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_URL_REQUEST_URL_REQUEST_THROTTLER_HEADER_ADAPTER_H_
#define NET_URL_REQUEST_URL_REQUEST_THROTTLER_HEADER_ADAPTER_H_

#include <string>

#include "base/compiler_specific.h"
#include "base/memory/ref_counted.h"
#include "net/url_request/url_request_throttler_header_interface.h"

namespace net {

class HttpResponseHeaders;

// Adapter for the HTTP header interface of the URL request throttler component.
class URLRequestThrottlerHeaderAdapter
    : public URLRequestThrottlerHeaderInterface {
 public:
  explicit URLRequestThrottlerHeaderAdapter(HttpResponseHeaders* headers);
  ~URLRequestThrottlerHeaderAdapter() override;

  // Implementation of URLRequestThrottlerHeaderInterface
  std::string GetNormalizedValue(const std::string& key) const override;
  int GetResponseCode() const override;

 private:
  const scoped_refptr<HttpResponseHeaders> response_header_;
};

}  // namespace net

#endif  // NET_URL_REQUEST_URL_REQUEST_THROTTLER_HEADER_ADAPTER_H_
