blob: 842cb46e035226d8c68403a77616c9dc7aa0ca19 [file] [log] [blame]
// Copyright 2016 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/browser/service_worker/service_worker_blob_reader.h"
#include <utility>
#include "storage/browser/blob/blob_data_handle.h"
#include "storage/browser/blob/blob_url_request_job_factory.h"
namespace content {
ServiceWorkerBlobReader::ServiceWorkerBlobReader(
ServiceWorkerURLRequestJob* owner)
: owner_(owner) {}
ServiceWorkerBlobReader::~ServiceWorkerBlobReader() {}
void ServiceWorkerBlobReader::Start(
std::unique_ptr<storage::BlobDataHandle> blob_data_handle,
const net::URLRequestContext* request_context) {
blob_request_ = storage::BlobProtocolHandler::CreateBlobRequest(
std::move(blob_data_handle), request_context, this);
blob_request_->Start();
}
void ServiceWorkerBlobReader::OnReceivedRedirect(
net::URLRequest* request,
const net::RedirectInfo& redirect_info,
bool* defer_redirect) {
NOTREACHED();
}
void ServiceWorkerBlobReader::OnAuthRequired(
net::URLRequest* request,
net::AuthChallengeInfo* auth_info) {
NOTREACHED();
}
void ServiceWorkerBlobReader::OnCertificateRequested(
net::URLRequest* request,
net::SSLCertRequestInfo* cert_request_info) {
NOTREACHED();
}
void ServiceWorkerBlobReader::OnSSLCertificateError(
net::URLRequest* request,
const net::SSLInfo& ssl_info,
bool fatal) {
NOTREACHED();
}
void ServiceWorkerBlobReader::OnResponseStarted(net::URLRequest* request,
int net_error) {
// TODO(falken): This should check net_error per URLRequest::Delegate
// contract.
// TODO(falken): Add Content-Length, Content-Type if they were not provided in
// the ServiceWorkerResponse.
owner_->OnResponseStarted();
}
void ServiceWorkerBlobReader::OnReadCompleted(net::URLRequest* request,
int bytes_read) {
if (!request->status().is_success()) {
owner_->RecordResult(ServiceWorkerMetrics::REQUEST_JOB_ERROR_BLOB_READ);
} else if (bytes_read == 0) {
owner_->RecordResult(ServiceWorkerMetrics::REQUEST_JOB_BLOB_RESPONSE);
}
net::URLRequestStatus status = request->status();
owner_->OnReadRawDataComplete(status.is_success() ? bytes_read
: status.error());
}
int ServiceWorkerBlobReader::ReadRawData(net::IOBuffer* buf, int buf_size) {
int bytes_read = 0;
blob_request_->Read(buf, buf_size, &bytes_read);
net::URLRequestStatus status = blob_request_->status();
if (status.status() != net::URLRequestStatus::SUCCESS)
return status.error();
if (bytes_read == 0) {
owner_->RecordResult(ServiceWorkerMetrics::REQUEST_JOB_BLOB_RESPONSE);
}
return bytes_read;
}
} // namespace content