blob: 1465c4556235eac545610e0bbb3f746062fcea80 [file] [log] [blame]
Avi Drissman64595482022-09-14 20:52:291// Copyright 2012 The Chromium Authors
[email protected]d8a5e9f92012-11-15 08:20:212// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]b6e5b6c62013-05-07 17:50:265#include "net/test/embedded_test_server/http_response.h"
[email protected]d8a5e9f92012-11-15 08:20:216
Aaron Tagliaboschid4ad7a302021-09-24 19:51:517#include <iterator>
8#include <map>
9#include <string>
David Benjamin34627872019-11-27 20:11:3210#include <utility>
11
Hans Wennborg0924470b2020-04-27 21:08:0512#include "base/check.h"
Aaron Tagliaboschid4ad7a302021-09-24 19:51:5113#include "base/containers/flat_map.h"
[email protected]d8a5e9f92012-11-15 08:20:2114#include "base/format_macros.h"
Avi Drissman41c4a412023-01-11 22:45:3715#include "base/functional/bind.h"
16#include "base/functional/callback_forward.h"
Aaron Tagliaboschid4ad7a302021-09-24 19:51:5117#include "base/logging.h"
Peter Kasting017c1ba2022-10-28 15:26:3318#include "base/ranges/algorithm.h"
Aaron Tagliaboschid4ad7a302021-09-24 19:51:5119#include "base/strings/string_number_conversions.h"
20#include "base/strings/string_split.h"
jam29f1aed42017-06-06 21:37:4321#include "base/strings/string_util.h"
[email protected]4dc3ad4f2013-06-11 07:15:5022#include "base/strings/stringprintf.h"
Sean Maher52fa5a72022-11-14 15:53:2523#include "base/task/sequenced_task_runner.h"
[email protected]c1dffe82013-06-26 20:59:0524#include "net/http/http_status_code.h"
Aaron Tagliaboschid4ad7a302021-09-24 19:51:5125#include "net/test/embedded_test_server/http_request.h"
[email protected]d8a5e9f92012-11-15 08:20:2126
Tsuyoshi Horo4f516be2022-06-14 11:53:1327namespace net::test_server {
[email protected]d8a5e9f92012-11-15 08:20:2128
Aaron Tagliaboschid4ad7a302021-09-24 19:51:5129HttpResponseDelegate::HttpResponseDelegate() = default;
30HttpResponseDelegate::~HttpResponseDelegate() = default;
31
Chris Watkins7a41d3552017-12-01 02:13:2732HttpResponse::~HttpResponse() = default;
[email protected]d8a5e9f92012-11-15 08:20:2133
svaldez6e7e82a22015-10-28 19:39:5334RawHttpResponse::RawHttpResponse(const std::string& headers,
35 const std::string& contents)
36 : headers_(headers), contents_(contents) {}
37
Chris Watkins7a41d3552017-12-01 02:13:2738RawHttpResponse::~RawHttpResponse() = default;
svaldez6e7e82a22015-10-28 19:39:5339
Aaron Tagliaboschid4ad7a302021-09-24 19:51:5140void RawHttpResponse::SendResponse(
41 base::WeakPtr<HttpResponseDelegate> delegate) {
jam29f1aed42017-06-06 21:37:4342 if (!headers_.empty()) {
Aaron Tagliaboschid4ad7a302021-09-24 19:51:5143 std::string response = headers_;
Min Qin32c60fd2017-10-02 23:38:2344 // LocateEndOfHeadersHelper() searches for the first "\n\n" and "\n\r\n" as
45 // the end of the header.
46 std::size_t index = response.find_last_not_of("\r\n");
47 if (index != std::string::npos)
48 response.erase(index + 1);
49 response += "\n\n";
Aaron Tagliaboschid4ad7a302021-09-24 19:51:5150 delegate->SendRawResponseHeaders(response);
jam29f1aed42017-06-06 21:37:4351 }
Aaron Tagliaboschid4ad7a302021-09-24 19:51:5152
53 delegate->SendContentsAndFinish(contents_);
svaldez6e7e82a22015-10-28 19:39:5354}
55
56void RawHttpResponse::AddHeader(const std::string& key_value_pair) {
57 headers_.append(base::StringPrintf("%s\r\n", key_value_pair.c_str()));
58}
59
Tsuyoshi Horo8e0dfac22022-06-09 01:42:5760BasicHttpResponse::BasicHttpResponse() = default;
[email protected]0d31fbc2013-05-28 17:00:3761
Chris Watkins7a41d3552017-12-01 02:13:2762BasicHttpResponse::~BasicHttpResponse() = default;
[email protected]0d31fbc2013-05-28 17:00:3763
64std::string BasicHttpResponse::ToResponseString() const {
Aaron Tagliaboschid4ad7a302021-09-24 19:51:5165 base::StringPairs headers = BuildHeaders();
[email protected]d8a5e9f92012-11-15 08:20:2166 // Response line with headers.
67 std::string response_builder;
68
[email protected]d8a5e9f92012-11-15 08:20:2169 // TODO(mtomasz): For http/1.0 requests, send http/1.0.
svaldez6e7e82a22015-10-28 19:39:5370
Aaron Tagliaboschid4ad7a302021-09-24 19:51:5171 base::StringAppendF(&response_builder, "HTTP/1.1 %d %s\r\n", code_,
72 reason().c_str());
73
74 for (const auto& header : headers)
75 base::StringAppendF(&response_builder, "%s: %s\r\n", header.first.c_str(),
76 header.second.c_str());
77
[email protected]d8a5e9f92012-11-15 08:20:2178 base::StringAppendF(&response_builder, "\r\n");
79
80 return response_builder + content_;
81}
82
Aaron Tagliaboschid4ad7a302021-09-24 19:51:5183base::StringPairs BasicHttpResponse::BuildHeaders() const {
84 base::StringPairs headers;
85 headers.emplace_back("Connection", "close");
86 headers.emplace_back("Content-Length", base::NumberToString(content_.size()));
87 headers.emplace_back("Content-Type", content_type_);
88
Peter Kasting017c1ba2022-10-28 15:26:3389 base::ranges::copy(custom_headers_, std::back_inserter(headers));
Aaron Tagliaboschid4ad7a302021-09-24 19:51:5190
91 return headers;
92}
93
94void BasicHttpResponse::SendResponse(
95 base::WeakPtr<HttpResponseDelegate> delegate) {
96 delegate->SendHeadersContentAndFinish(code_, reason(), BuildHeaders(),
97 content_);
svaldez6e7e82a22015-10-28 19:39:5398}
99
Eric Robinsonc93faeb2018-05-14 02:38:00100DelayedHttpResponse::DelayedHttpResponse(const base::TimeDelta delay)
101 : delay_(delay) {}
102
103DelayedHttpResponse::~DelayedHttpResponse() = default;
104
Aaron Tagliaboschid4ad7a302021-09-24 19:51:51105void DelayedHttpResponse::SendResponse(
106 base::WeakPtr<HttpResponseDelegate> delegate) {
Sean Maher52fa5a72022-11-14 15:53:25107 base::SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask(
Aaron Tagliaboschid4ad7a302021-09-24 19:51:51108 FROM_HERE,
109 base::BindOnce(&HttpResponseDelegate::SendHeadersContentAndFinish,
110 delegate, code(), reason(), BuildHeaders(), content()),
David Benjamin34627872019-11-27 20:11:32111 delay_);
Eric Robinsonc93faeb2018-05-14 02:38:00112}
113
Aaron Tagliaboschid4ad7a302021-09-24 19:51:51114void HungResponse::SendResponse(base::WeakPtr<HttpResponseDelegate> delegate) {}
115
116HungAfterHeadersHttpResponse::HungAfterHeadersHttpResponse(
117 base::StringPairs headers)
118 : headers_(headers) {}
119HungAfterHeadersHttpResponse::~HungAfterHeadersHttpResponse() = default;
120
121void HungAfterHeadersHttpResponse::SendResponse(
122 base::WeakPtr<HttpResponseDelegate> delegate) {
Ryan Sturm0aedcdf2022-04-13 04:35:42123 delegate->SendResponseHeaders(HTTP_OK, "OK", headers_);
Aaron Tagliaboschid4ad7a302021-09-24 19:51:51124}
mmenke173a6aa2016-10-17 19:14:09125
Tsuyoshi Horo4f516be2022-06-14 11:53:13126} // namespace net::test_server