base_test_server.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/test/spawned_test_server/base_test_server.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base64.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_reader.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/address_list.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/host_port_pair.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/test_completion_callback.h"
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/test_root_certs.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/host_resolver.h"
247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetHostname(BaseTestServer::Type type,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const BaseTestServer::SSLOptions& options) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (BaseTestServer::UsingSSL(type) &&
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      options.server_certificate ==
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          BaseTestServer::SSLOptions::CERT_MISMATCHED_NAME) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Return a different hostname string that resolves to the same hostname.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "localhost";
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use the 127.0.0.1 as default.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return BaseTestServer::kLocalhost;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetCiphersList(int cipher, base::ListValue* values) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cipher & BaseTestServer::SSLOptions::BULK_CIPHER_RC4)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    values->Append(new base::StringValue("rc4"));
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cipher & BaseTestServer::SSLOptions::BULK_CIPHER_AES128)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    values->Append(new base::StringValue("aes128"));
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cipher & BaseTestServer::SSLOptions::BULK_CIPHER_AES256)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    values->Append(new base::StringValue("aes256"));
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cipher & BaseTestServer::SSLOptions::BULK_CIPHER_3DES)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    values->Append(new base::StringValue("3des"));
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BaseTestServer::SSLOptions::SSLOptions()
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : server_certificate(CERT_OK),
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ocsp_status(OCSP_OK),
59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      cert_serial(0),
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request_client_certificate(false),
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bulk_ciphers(SSLOptions::BULK_CIPHER_ANY),
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      record_resume(false),
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      tls_intolerant(TLS_INTOLERANT_NONE),
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      fallback_scsv_enabled(false),
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      staple_ocsp_response(false) {}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BaseTestServer::SSLOptions::SSLOptions(
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BaseTestServer::SSLOptions::ServerCertificate cert)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : server_certificate(cert),
70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      ocsp_status(OCSP_OK),
71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      cert_serial(0),
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request_client_certificate(false),
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bulk_ciphers(SSLOptions::BULK_CIPHER_ANY),
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      record_resume(false),
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      tls_intolerant(TLS_INTOLERANT_NONE),
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      fallback_scsv_enabled(false),
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      staple_ocsp_response(false) {}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BaseTestServer::SSLOptions::~SSLOptions() {}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath BaseTestServer::SSLOptions::GetCertificateFile() const {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (server_certificate) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CERT_OK:
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CERT_MISMATCHED_NAME:
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return base::FilePath(FILE_PATH_LITERAL("ok_cert.pem"));
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CERT_EXPIRED:
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return base::FilePath(FILE_PATH_LITERAL("expired_cert.pem"));
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CERT_CHAIN_WRONG_ROOT:
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // This chain uses its own dedicated test root certificate to avoid
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // side-effects that may affect testing.
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return base::FilePath(FILE_PATH_LITERAL("redundant-server-chain.pem"));
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CERT_AUTO:
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return base::FilePath();
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return base::FilePath();
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string BaseTestServer::SSLOptions::GetOCSPArgument() const {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (server_certificate != CERT_AUTO)
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return std::string();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (ocsp_status) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case OCSP_OK:
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "ok";
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case OCSP_REVOKED:
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "revoked";
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case OCSP_INVALID:
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "invalid";
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case OCSP_UNAUTHORIZED:
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "unauthorized";
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case OCSP_UNKNOWN:
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "unknown";
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return std::string();
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char BaseTestServer::kLocalhost[] = "127.0.0.1";
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BaseTestServer::BaseTestServer(Type type, const std::string& host)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : type_(type),
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      started_(false),
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      log_to_console_(false) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Init(host);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BaseTestServer::BaseTestServer(Type type, const SSLOptions& ssl_options)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : ssl_options_(ssl_options),
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      type_(type),
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      started_(false),
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      log_to_console_(false) {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(UsingSSL(type));
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Init(GetHostname(type, ssl_options));
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BaseTestServer::~BaseTestServer() {}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const HostPortPair& BaseTestServer::host_port_pair() const {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(started_);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return host_port_pair_;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::DictionaryValue& BaseTestServer::server_data() const {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(started_);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(server_data_.get());
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return *server_data_;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string BaseTestServer::GetScheme() const {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type_) {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TYPE_FTP:
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "ftp";
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TYPE_HTTP:
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "http";
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TYPE_HTTPS:
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "https";
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TYPE_WS:
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "ws";
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TYPE_WSS:
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "wss";
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TYPE_TCP_ECHO:
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TYPE_UDP_ECHO:
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return std::string();
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BaseTestServer::GetAddressList(AddressList* address_list) const {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(address_list);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HostResolver> resolver(HostResolver::CreateDefaultResolver(NULL));
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostResolver::RequestInfo info(host_port_pair_);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCompletionCallback callback;
1783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  int rv = resolver->Resolve(info,
1793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                             DEFAULT_PRIORITY,
1803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                             address_list,
1813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                             callback.callback(),
1823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                             NULL,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             BoundNetLog());
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rv == ERR_IO_PENDING)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rv = callback.WaitForResult();
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rv != net::OK) {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Failed to resolve hostname: " << host_port_pair_.host();
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint16 BaseTestServer::GetPort() {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return host_port_pair_.port();
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BaseTestServer::SetPort(uint16 port) {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_port_pair_.set_port(port);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL BaseTestServer::GetURL(const std::string& path) const {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GURL(GetScheme() + "://" + host_port_pair_.ToString() + "/" + path);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL BaseTestServer::GetURLWithUser(const std::string& path,
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const std::string& user) const {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GURL(GetScheme() + "://" + user + "@" + host_port_pair_.ToString() +
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              "/" + path);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL BaseTestServer::GetURLWithUserAndPassword(const std::string& path,
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           const std::string& user,
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           const std::string& password) const {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GURL(GetScheme() + "://" + user + ":" + password + "@" +
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              host_port_pair_.ToString() + "/" + path);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BaseTestServer::GetFilePathWithReplacements(
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& original_file_path,
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<StringPair>& text_to_replace,
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string* replacement_path) {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string new_file_path = original_file_path;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool first_query_parameter = true;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::vector<StringPair>::const_iterator end = text_to_replace.end();
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::vector<StringPair>::const_iterator it = text_to_replace.begin();
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != end;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++it) {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& old_text = it->first;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& new_text = it->second;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string base64_old;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string base64_new;
233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::Base64Encode(old_text, &base64_old);
234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::Base64Encode(new_text, &base64_new);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (first_query_parameter) {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_file_path += "?";
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      first_query_parameter = false;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_file_path += "&";
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_file_path += "replace_text=";
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_file_path += base64_old;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_file_path += ":";
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_file_path += base64_new;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *replacement_path = new_file_path;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BaseTestServer::Init(const std::string& host) {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_port_pair_ = HostPortPair(host, 0);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(battre) Remove this after figuring out why the TestServer is flaky.
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://crbug.com/96594
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  log_to_console_ = true;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BaseTestServer::SetResourcePath(const base::FilePath& document_root,
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const base::FilePath& certificates_dir) {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This method shouldn't get called twice.
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(certificates_dir_.empty());
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  document_root_ = document_root;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  certificates_dir_ = certificates_dir;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!certificates_dir_.empty());
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BaseTestServer::ParseServerData(const std::string& server_data) {
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Server data: " << server_data;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::JSONReader json_reader;
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> value(json_reader.ReadToValue(server_data));
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!value.get() || !value->IsType(base::Value::TYPE_DICTIONARY)) {
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Could not parse server data: "
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               << json_reader.GetErrorMessage();
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  server_data_.reset(static_cast<base::DictionaryValue*>(value.release()));
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int port = 0;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!server_data_->GetInteger("port", &port)) {
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Could not find port value";
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((port <= 0) || (port > kuint16max)) {
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Invalid port value: " << port;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_port_pair_.set_port(port);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BaseTestServer::LoadTestRootCert() const {
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestRootCerts* root_certs = TestRootCerts::GetInstance();
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!root_certs)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should always use absolute path to load the root certificate.
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath root_certificate_path = certificates_dir_;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!certificates_dir_.IsAbsolute()) {
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath src_dir;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!PathService::Get(base::DIR_SOURCE_ROOT, &src_dir))
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root_certificate_path = src_dir.Append(certificates_dir_);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return root_certs->AddFromFile(
308eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      root_certificate_path.AppendASCII("root_ca_cert.pem"));
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BaseTestServer::SetupWhenServerStarted() {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(host_port_pair_.port());
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (UsingSSL(type_) && !LoadTestRootCert())
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  started_ = true;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed_port_.reset(new ScopedPortException(host_port_pair_.port()));
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BaseTestServer::CleanUpWhenStoppingServer() {
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestRootCerts* root_certs = TestRootCerts::GetInstance();
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root_certs->Clear();
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_port_pair_.set_port(0);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed_port_.reset();
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  started_ = false;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generates a dictionary of arguments to pass to the Python test server via
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the test server spawner, in the form of
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// { argument-name: argument-value, ... }
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns false if an invalid configuration is specified.
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BaseTestServer::GenerateArguments(base::DictionaryValue* arguments) const {
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(arguments);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arguments->SetString("host", host_port_pair_.host());
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arguments->SetInteger("port", host_port_pair_.port());
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arguments->SetString("data-dir", document_root_.value());
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (VLOG_IS_ON(1) || log_to_console_)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    arguments->Set("log-to-console", base::Value::CreateNullValue());
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (UsingSSL(type_)) {
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check the certificate arguments of the HTTPS server.
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath certificate_path(certificates_dir_);
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath certificate_file(ssl_options_.GetCertificateFile());
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!certificate_file.value().empty()) {
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      certificate_path = certificate_path.Append(certificate_file);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (certificate_path.IsAbsolute() &&
3527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          !base::PathExists(certificate_path)) {
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        LOG(ERROR) << "Certificate path " << certificate_path.value()
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   << " doesn't exist. Can't launch https server.";
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arguments->SetString("cert-and-key-file", certificate_path.value());
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check the client certificate related arguments.
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ssl_options_.request_client_certificate)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arguments->Set("ssl-client-auth", base::Value::CreateNullValue());
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<base::ListValue> ssl_client_certs(new base::ListValue());
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<base::FilePath>::const_iterator it;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (it = ssl_options_.client_authorities.begin();
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it != ssl_options_.client_authorities.end(); ++it) {
3687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      if (it->IsAbsolute() && !base::PathExists(*it)) {
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        LOG(ERROR) << "Client authority path " << it->value()
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   << " doesn't exist. Can't launch https server.";
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ssl_client_certs->Append(new base::StringValue(it->value()));
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ssl_client_certs->GetSize())
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arguments->Set("ssl-client-ca", ssl_client_certs.release());
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type_ == TYPE_HTTPS) {
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    arguments->Set("https", base::Value::CreateNullValue());
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string ocsp_arg = ssl_options_.GetOCSPArgument();
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ocsp_arg.empty())
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arguments->SetString("ocsp", ocsp_arg);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
387a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (ssl_options_.cert_serial != 0) {
388a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      arguments->Set("cert-serial",
389a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                     base::Value::CreateIntegerValue(ssl_options_.cert_serial));
390a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
391a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check bulk cipher argument.
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<base::ListValue> bulk_cipher_values(new base::ListValue());
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetCiphersList(ssl_options_.bulk_ciphers, bulk_cipher_values.get());
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bulk_cipher_values->GetSize())
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arguments->Set("ssl-bulk-cipher", bulk_cipher_values.release());
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ssl_options_.record_resume)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arguments->Set("https-record-resume", base::Value::CreateNullValue());
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ssl_options_.tls_intolerant != SSLOptions::TLS_INTOLERANT_NONE) {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arguments->Set("tls-intolerant",
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     new base::FundamentalValue(ssl_options_.tls_intolerant));
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (ssl_options_.fallback_scsv_enabled)
4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      arguments->Set("fallback-scsv", base::Value::CreateNullValue());
4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!ssl_options_.signed_cert_timestamps_tls_ext.empty()) {
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      std::string b64_scts_tls_ext;
4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Base64Encode(ssl_options_.signed_cert_timestamps_tls_ext,
4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         &b64_scts_tls_ext);
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      arguments->SetString("signed-cert-timestamps-tls-ext", b64_scts_tls_ext);
410a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (ssl_options_.staple_ocsp_response)
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      arguments->Set("staple-ocsp-response", base::Value::CreateNullValue());
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GenerateAdditionalArguments(arguments);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BaseTestServer::GenerateAdditionalArguments(
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* arguments) const {
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
424