blob: f73e7605da010760f06028d169de74bf27e1fb8c [file] [log] [blame]
// Copyright 2017 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.
#include "content/public/test/slow_download_http_response.h"
#include "base/bind.h"
#include "base/strings/stringprintf.h"
#include "base/threading/thread_task_runner_handle.h"
namespace content {
namespace {
static bool g_should_finish_download = false;
void SendResponseBodyDone(const net::test_server::SendBytesCallback& send,
const net::test_server::SendCompleteCallback& done);
// Sends the response body with the given size.
void SendResponseBody(const net::test_server::SendBytesCallback& send,
const net::test_server::SendCompleteCallback& done,
bool finish_download) {
int data_size = finish_download
? SlowDownloadHttpResponse::kSecondDownloadSize
: SlowDownloadHttpResponse::kFirstDownloadSize;
std::string response(data_size, '*');
if (finish_download)
send.Run(response, done);
else
send.Run(response, base::Bind(&SendResponseBodyDone, send, done));
}
// Called when the response body was sucessfully sent.
void SendResponseBodyDone(const net::test_server::SendBytesCallback& send,
const net::test_server::SendCompleteCallback& done) {
if (g_should_finish_download) {
base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
FROM_HERE, base::BindOnce(&SendResponseBody, send, done, true),
base::TimeDelta::FromMilliseconds(100));
} else {
base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
FROM_HERE, base::BindOnce(&SendResponseBodyDone, send, done),
base::TimeDelta::FromMilliseconds(100));
}
}
} // namespace
// static
const char SlowDownloadHttpResponse::kSlowDownloadHostName[] =
"url.handled.by.slow.download";
const char SlowDownloadHttpResponse::kUnknownSizeUrl[] =
"/download-unknown-size";
const char SlowDownloadHttpResponse::kKnownSizeUrl[] = "/download-known-size";
const char SlowDownloadHttpResponse::kFinishDownloadUrl[] = "/download-finish";
const int SlowDownloadHttpResponse::kFirstDownloadSize = 1024 * 35;
const int SlowDownloadHttpResponse::kSecondDownloadSize = 1024 * 10;
// static
std::unique_ptr<net::test_server::HttpResponse>
SlowDownloadHttpResponse::HandleSlowDownloadRequest(
const net::test_server::HttpRequest& request) {
if (request.relative_url != kUnknownSizeUrl &&
request.relative_url != kKnownSizeUrl &&
request.relative_url != kFinishDownloadUrl) {
return nullptr;
}
auto response =
std::make_unique<SlowDownloadHttpResponse>(request.relative_url);
return std::move(response);
}
SlowDownloadHttpResponse::SlowDownloadHttpResponse(const std::string& url)
: url_(url) {}
SlowDownloadHttpResponse::~SlowDownloadHttpResponse() = default;
void SlowDownloadHttpResponse::SendResponse(
const net::test_server::SendBytesCallback& send,
const net::test_server::SendCompleteCallback& done) {
std::string response;
response.append("HTTP/1.1 200 OK\r\n");
if (base::LowerCaseEqualsASCII(kFinishDownloadUrl, url_)) {
response.append("Content-type: text/plain\r\n");
response.append("\r\n");
g_should_finish_download = true;
send.Run(response, done);
} else {
response.append("Content-type: application/octet-stream\r\n");
response.append("Cache-Control: max-age=0\r\n");
if (base::LowerCaseEqualsASCII(kKnownSizeUrl, url_)) {
response.append(base::StringPrintf(
"Content-Length: %d\r\n", kFirstDownloadSize + kSecondDownloadSize));
}
response.append("\r\n");
send.Run(response, base::Bind(&SendResponseBody, send, done, false));
}
}
} // namespace content