chromium/ios/web/public/test/http_server/html_response_provider_impl.h

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

#ifndef IOS_WEB_PUBLIC_TEST_HTTP_SERVER_HTML_RESPONSE_PROVIDER_IMPL_H_
#define IOS_WEB_PUBLIC_TEST_HTTP_SERVER_HTML_RESPONSE_PROVIDER_IMPL_H_

#include <map>
#include <string>

#include "base/memory/ref_counted.h"
#import "ios/web/public/test/http_server/data_response_provider.h"
#import "ios/web/public/test/http_server/response_provider.h"
#include "net/http/http_response_headers.h"
#include "net/http/http_status_code.h"
#include "url/gurl.h"

// This class encapsulates the logic needed to map a request URL to a response.
// The mapping -- between URL to response -- is maintained internally, use
// `CanHandleRequest` to check if a request can be handled and use
// `GetResponseHeadersAndBody` to actually handle the request.
class HtmlResponseProviderImpl {
 public:
  // Encapsulates the body and headers that make up a response.
  struct Response {
    Response(const std::string& body,
             const scoped_refptr<net::HttpResponseHeaders>& headers);
    Response(const Response&);
    Response();
    ~Response();

    std::string body;
    scoped_refptr<net::HttpResponseHeaders> headers;
  };
  // Constructs an HtmlResponseProviderImpl that does not respond to any
  // request.
  HtmlResponseProviderImpl();
  // Constructs an HtmlResponseProviderImpl that generates a simple string
  // response to a URL based on the mapping present in `responses`.
  explicit HtmlResponseProviderImpl(
      const std::map<GURL, std::string>& responses);
  // Constructs an HtmlResponseProvider that generates a simple string response
  // to a URL with set cookie in the headers based on the mapping present in
  // `responses`.
  explicit HtmlResponseProviderImpl(
      const std::map<GURL, std::pair<std::string, std::string>>& responses);
  // Constructs an HtmlResponseProviderImpl that generates a response to a URL
  // based on the mapping present in `responses`.
  explicit HtmlResponseProviderImpl(const std::map<GURL, Response>& responses);

  virtual ~HtmlResponseProviderImpl();

  // Creates a response based on a redirect to `destination_url`.
  static HtmlResponseProviderImpl::Response GetRedirectResponse(
      const GURL& destination_url,
      const net::HttpStatusCode& http_status);

  // Creates a response with `net::HTTP_OK`.
  static HtmlResponseProviderImpl::Response GetSimpleResponse(
      const std::string& body);

  // Returns true if the request can be handled.
  bool CanHandleRequest(const web::ResponseProvider::Request& request);
  // Returns the headers and the response body.
  void GetResponseHeadersAndBody(
      const web::ResponseProvider::Request& request,
      scoped_refptr<net::HttpResponseHeaders>* headers,
      std::string* response_body);

 private:
  const std::map<GURL, Response> responses_;
};

#endif  // IOS_WEB_PUBLIC_TEST_HTTP_SERVER_HTML_RESPONSE_PROVIDER_IMPL_H_