| // Copyright (c) 2012 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_TEST_EMBEDDED_TEST_SERVER_HTTP_RESPONSE_H_ | |
| #define NET_TEST_EMBEDDED_TEST_SERVER_HTTP_RESPONSE_H_ | |
| #include <string> | |
| #include "base/callback.h" | |
| #include "base/compiler_specific.h" | |
| #include "base/macros.h" | |
| #include "base/strings/string_split.h" | |
| #include "base/time/time.h" | |
| #include "net/http/http_status_code.h" | |
| namespace net { | |
| namespace test_server { | |
| // Callback called when the response is done being sent. | |
| using SendCompleteCallback = base::Callback<void(void)>; | |
| // Callback called when the response is ready to be sent that takes the | |
| // |response| that is being sent along with the callback |write_done| that is | |
| // called when the response has been fully written. | |
| using SendBytesCallback = | |
| base::Callback<void(const std::string& response, | |
| const SendCompleteCallback& write_done)>; | |
| // Interface for HTTP response implementations. | |
| class HttpResponse{ | |
| public: | |
| virtual ~HttpResponse(); | |
| // |send| will send the specified data to the network socket, and invoke | |
| // |write_done| when complete. When the entire response has been sent, | |
| // |done| must be called. | |
| virtual void SendResponse(const SendBytesCallback& send, | |
| const SendCompleteCallback& done) = 0; | |
| }; | |
| // This class is used to handle basic HTTP responses with commonly used | |
| // response headers such as "Content-Type". Sends the response immediately. | |
| class BasicHttpResponse : public HttpResponse { | |
| public: | |
| BasicHttpResponse(); | |
| ~BasicHttpResponse() override; | |
| // The response code. | |
| HttpStatusCode code() const { return code_; } | |
| void set_code(HttpStatusCode code) { code_ = code; } | |
| // The content of the response. | |
| const std::string& content() const { return content_; } | |
| void set_content(const std::string& content) { content_ = content; } | |
| // The content type. | |
| const std::string& content_type() const { return content_type_; } | |
| void set_content_type(const std::string& content_type) { | |
| content_type_ = content_type; | |
| } | |
| // Adds a custom header. | |
| void AddCustomHeader(const std::string& key, const std::string& value) { | |
| custom_headers_.push_back(std::make_pair(key, value)); | |
| } | |
| // Generates and returns a http response string. | |
| std::string ToResponseString() const; | |
| void SendResponse(const SendBytesCallback& send, | |
| const SendCompleteCallback& done) override; | |
| private: | |
| HttpStatusCode code_; | |
| std::string content_; | |
| std::string content_type_; | |
| base::StringPairs custom_headers_; | |
| DISALLOW_COPY_AND_ASSIGN(BasicHttpResponse); | |
| }; | |
| class DelayedHttpResponse : public BasicHttpResponse { | |
| public: | |
| DelayedHttpResponse(const base::TimeDelta delay); | |
| ~DelayedHttpResponse() override; | |
| // Issues a delayed send to the to the task runner. | |
| void SendResponse(const SendBytesCallback& send, | |
| const SendCompleteCallback& done) override; | |
| private: | |
| // The delay time for the response. | |
| const base::TimeDelta delay_; | |
| DISALLOW_COPY_AND_ASSIGN(DelayedHttpResponse); | |
| }; | |
| class RawHttpResponse : public HttpResponse { | |
| public: | |
| RawHttpResponse(const std::string& headers, const std::string& contents); | |
| ~RawHttpResponse() override; | |
| void SendResponse(const SendBytesCallback& send, | |
| const SendCompleteCallback& done) override; | |
| void AddHeader(const std::string& key_value_pair); | |
| private: | |
| std::string headers_; | |
| const std::string contents_; | |
| DISALLOW_COPY_AND_ASSIGN(RawHttpResponse); | |
| }; | |
| // "Response" where the server doesn't actually respond until the server is | |
| // destroyed. | |
| class HungResponse : public HttpResponse { | |
| public: | |
| HungResponse() {} | |
| ~HungResponse() override {} | |
| void SendResponse(const SendBytesCallback& send, | |
| const SendCompleteCallback& done) override; | |
| private: | |
| DISALLOW_COPY_AND_ASSIGN(HungResponse); | |
| }; | |
| } // namespace test_server | |
| } // namespace net | |
| #endif // NET_TEST_EMBEDDED_TEST_SERVER_HTTP_RESPONSE_H_ |