#ifndef NET_TEST_EMBEDDED_TEST_SERVER_HTTP_RESPONSE_H_
#define NET_TEST_EMBEDDED_TEST_SERVER_HTTP_RESPONSE_H_
#include <optional>
#include <string>
#include <string_view>
#include "base/compiler_specific.h"
#include "base/functional/bind.h"
#include "base/functional/callback.h"
#include "base/functional/callback_helpers.h"
#include "base/memory/weak_ptr.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_split.h"
#include "base/time/time.h"
#include "net/http/http_status_code.h"
namespace net::test_server {
class HttpResponse;
class HttpResponseDelegate {
public:
HttpResponseDelegate();
virtual ~HttpResponseDelegate();
HttpResponseDelegate(HttpResponseDelegate&) = delete;
HttpResponseDelegate& operator=(const HttpResponseDelegate&) = delete;
virtual void AddResponse(std::unique_ptr<HttpResponse> response) = 0;
virtual void SendResponseHeaders(HttpStatusCode status,
const std::string& status_reason,
const base::StringPairs& headers) = 0;
virtual void SendRawResponseHeaders(const std::string& headers) = 0;
virtual void SendContents(const std::string& contents,
base::OnceClosure callback = base::DoNothing()) = 0;
virtual void FinishResponse() = 0;
virtual void SendContentsAndFinish(const std::string& contents) = 0;
virtual void SendHeadersContentAndFinish(HttpStatusCode status,
const std::string& status_reason,
const base::StringPairs& headers,
const std::string& contents) = 0;
};
class HttpResponse {
public:
virtual ~HttpResponse();
virtual void SendResponse(base::WeakPtr<HttpResponseDelegate> delegate) = 0;
};
class BasicHttpResponse : public HttpResponse {
public:
BasicHttpResponse();
BasicHttpResponse(const BasicHttpResponse&) = delete;
BasicHttpResponse& operator=(const BasicHttpResponse&) = delete;
~BasicHttpResponse() override;
HttpStatusCode code() const { return code_; }
void set_code(HttpStatusCode code) { code_ = code; }
std::string reason() const {
if (reason_) {
return *reason_;
} else {
return GetHttpReasonPhrase(code_);
}
}
void set_reason(std::optional<std::string> reason) {
reason_ = std::move(reason);
}
const std::string& content() const { return content_; }
void set_content(std::string_view content) {
content_ = std::string{content};
}
const std::string& content_type() const { return content_type_; }
void set_content_type(std::string_view content_type) {
content_type_ = std::string{content_type};
}
void AddCustomHeader(std::string_view key, std::string_view value) {
custom_headers_.emplace_back(key, value);
}
std::string ToResponseString() const;
base::StringPairs BuildHeaders() const;
void SendResponse(base::WeakPtr<HttpResponseDelegate> delegate) override;
private:
HttpStatusCode code_ = HTTP_OK;
std::optional<std::string> reason_;
std::string content_;
std::string content_type_;
base::StringPairs custom_headers_;
base::WeakPtrFactory<BasicHttpResponse> weak_factory_{this};
};
class DelayedHttpResponse : public BasicHttpResponse {
public:
explicit DelayedHttpResponse(const base::TimeDelta delay);
DelayedHttpResponse(const DelayedHttpResponse&) = delete;
DelayedHttpResponse& operator=(const DelayedHttpResponse&) = delete;
~DelayedHttpResponse() override;
void SendResponse(base::WeakPtr<HttpResponseDelegate> delegate) override;
private:
const base::TimeDelta delay_;
};
class RawHttpResponse : public HttpResponse {
public:
RawHttpResponse(const std::string& headers, const std::string& contents);
RawHttpResponse(const RawHttpResponse&) = delete;
RawHttpResponse& operator=(const RawHttpResponse&) = delete;
~RawHttpResponse() override;
void SendResponse(base::WeakPtr<HttpResponseDelegate> delegate) override;
void AddHeader(const std::string& key_value_pair);
private:
std::string headers_;
const std::string contents_;
};
class HungResponse : public HttpResponse {
public:
HungResponse() = default;
HungResponse(const HungResponse&) = delete;
HungResponse& operator=(const HungResponse&) = delete;
~HungResponse() override = default;
void SendResponse(base::WeakPtr<HttpResponseDelegate> delegate) override;
};
class HungAfterHeadersHttpResponse : public HttpResponse {
public:
explicit HungAfterHeadersHttpResponse(base::StringPairs headers = {});
~HungAfterHeadersHttpResponse() override;
void SendResponse(base::WeakPtr<HttpResponseDelegate> delegate) override;
private:
base::StringPairs headers_;
};
}
#endif