12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#ifndef NET_TEST_EMBEDDED_TEST_SERVER_HTTP_RESPONSE_H_
6b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#define NET_TEST_EMBEDDED_TEST_SERVER_HTTP_RESPONSE_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <map>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <vector>
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/compiler_specific.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/http/http_status_code.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)namespace net {
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace test_server {
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Interface for HTTP response implementations.
2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class HttpResponse{
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~HttpResponse();
2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Returns raw contents to be written to the network socket
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // in response. If you intend to make this a valid HTTP response,
2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // it should start with "HTTP/x.x" line, followed by response headers.
2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual std::string ToResponseString() const = 0;
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This class is used to handle basic HTTP responses with commonly used
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// response headers such as "Content-Type".
3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class BasicHttpResponse : public HttpResponse {
3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  BasicHttpResponse();
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~BasicHttpResponse();
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The response code.
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  HttpStatusCode code() const { return code_; }
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void set_code(HttpStatusCode code) { code_ = code; }
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The content of the response.
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string& content() const { return content_; }
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_content(const std::string& content) { content_ = content; }
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The content type.
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string& content_type() const { return content_type_; }
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_content_type(const std::string& content_type) {
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_type_ = content_type;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Adds a custom header.
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddCustomHeader(const std::string& key, const std::string& value) {
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    custom_headers_.push_back(std::make_pair(key, value));
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Generates and returns a http response string.
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual std::string ToResponseString() const OVERRIDE;
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  HttpStatusCode code_;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string content_;
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string content_type_;
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::vector<std::pair<std::string, std::string> > custom_headers_;
6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BasicHttpResponse);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
68b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}  // namespace test_server
69b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}  // namespace net
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
71b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#endif  // NET_TEST_EMBEDDED_TEST_SERVER_HTTP_RESPONSE_H_
72