| // 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_ |