// Copyright 2015 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 "net/test/url_request/ssl_certificate_error_job.h"

#include <string>

#include "base/bind.h"
#include "base/macros.h"
#include "base/strings/stringprintf.h"
#include "base/threading/thread_task_runner_handle.h"
#include "net/ssl/ssl_info.h"
#include "net/url_request/url_request.h"
#include "net/url_request/url_request_filter.h"
#include "net/url_request/url_request_interceptor.h"

namespace net {

namespace {

const char kMockHostname[] = "mock.ssl.cert.error.request";

class MockJobInterceptor : public URLRequestInterceptor {
 public:
  MockJobInterceptor() = default;
  ~MockJobInterceptor() override = default;

  // URLRequestJobFactory::ProtocolHandler implementation:
  URLRequestJob* MaybeInterceptRequest(
      URLRequest* request,
      NetworkDelegate* network_delegate) const override {
    return new SSLCertificateErrorJob(request, network_delegate);
  }

 private:
  DISALLOW_COPY_AND_ASSIGN(MockJobInterceptor);
};

}  // namespace

SSLCertificateErrorJob::SSLCertificateErrorJob(
    URLRequest* request,
    NetworkDelegate* network_delegate)
    : URLRequestJob(request, network_delegate), weak_factory_(this) {
}

void SSLCertificateErrorJob::Start() {
  base::ThreadTaskRunnerHandle::Get()->PostTask(
      FROM_HERE, base::Bind(&SSLCertificateErrorJob::NotifyError,
                            weak_factory_.GetWeakPtr()));
}

void SSLCertificateErrorJob::AddUrlHandler() {
  URLRequestFilter* filter = URLRequestFilter::GetInstance();
  filter->AddHostnameInterceptor(
      "https", kMockHostname,
      std::unique_ptr<URLRequestInterceptor>(new MockJobInterceptor()));
}

GURL SSLCertificateErrorJob::GetMockUrl() {
  return GURL(base::StringPrintf("https://%s", kMockHostname));
}

SSLCertificateErrorJob::~SSLCertificateErrorJob() = default;

void SSLCertificateErrorJob::NotifyError() {
  SSLInfo info;
  info.cert_status = CERT_STATUS_DATE_INVALID;
  NotifySSLCertificateError(info, true);
}

}  // namespace net
