base_test_server.cc revision 116680a4aac90f2aa7413d9095a592090648e557
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)
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string GetClientCertType(SSLClientCertType type) {
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  switch (type) {
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case CLIENT_CERT_RSA_SIGN:
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "rsa_sign";
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case CLIENT_CERT_DSS_SIGN:
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "dss_sign";
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case CLIENT_CERT_ECDSA_SIGN:
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "ecdsa_sign";
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    default:
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      NOTREACHED();
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "";
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid GetKeyExchangesList(int key_exchange, base::ListValue* values) {
580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (key_exchange & BaseTestServer::SSLOptions::KEY_EXCHANGE_RSA)
590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    values->Append(new base::StringValue("rsa"));
600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (key_exchange & BaseTestServer::SSLOptions::KEY_EXCHANGE_DHE_RSA)
610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    values->Append(new base::StringValue("dhe_rsa"));
620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetCiphersList(int cipher, base::ListValue* values) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cipher & BaseTestServer::SSLOptions::BULK_CIPHER_RC4)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    values->Append(new base::StringValue("rc4"));
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cipher & BaseTestServer::SSLOptions::BULK_CIPHER_AES128)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    values->Append(new base::StringValue("aes128"));
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cipher & BaseTestServer::SSLOptions::BULK_CIPHER_AES256)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    values->Append(new base::StringValue("aes256"));
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cipher & BaseTestServer::SSLOptions::BULK_CIPHER_3DES)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    values->Append(new base::StringValue("3des"));
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::StringValue* GetTLSIntoleranceType(
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    BaseTestServer::SSLOptions::TLSIntoleranceType type) {
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  switch (type) {
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case BaseTestServer::SSLOptions::TLS_INTOLERANCE_ALERT:
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return new base::StringValue("alert");
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case BaseTestServer::SSLOptions::TLS_INTOLERANCE_CLOSE:
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return new base::StringValue("close");
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case BaseTestServer::SSLOptions::TLS_INTOLERANCE_RESET:
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return new base::StringValue("reset");
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    default:
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      NOTREACHED();
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return new base::StringValue("");
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BaseTestServer::SSLOptions::SSLOptions()
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : server_certificate(CERT_OK),
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ocsp_status(OCSP_OK),
95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      cert_serial(0),
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request_client_certificate(false),
970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      key_exchanges(SSLOptions::KEY_EXCHANGE_ANY),
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bulk_ciphers(SSLOptions::BULK_CIPHER_ANY),
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      record_resume(false),
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      tls_intolerant(TLS_INTOLERANT_NONE),
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      tls_intolerance_type(TLS_INTOLERANCE_ALERT),
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      fallback_scsv_enabled(false),
1030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      staple_ocsp_response(false),
1040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      enable_npn(false) {}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BaseTestServer::SSLOptions::SSLOptions(
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BaseTestServer::SSLOptions::ServerCertificate cert)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : server_certificate(cert),
109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      ocsp_status(OCSP_OK),
110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      cert_serial(0),
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request_client_certificate(false),
1120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      key_exchanges(SSLOptions::KEY_EXCHANGE_ANY),
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bulk_ciphers(SSLOptions::BULK_CIPHER_ANY),
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      record_resume(false),
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      tls_intolerant(TLS_INTOLERANT_NONE),
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      tls_intolerance_type(TLS_INTOLERANCE_ALERT),
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      fallback_scsv_enabled(false),
1180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      staple_ocsp_response(false),
1190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      enable_npn(false) {}
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BaseTestServer::SSLOptions::~SSLOptions() {}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath BaseTestServer::SSLOptions::GetCertificateFile() const {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (server_certificate) {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CERT_OK:
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CERT_MISMATCHED_NAME:
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return base::FilePath(FILE_PATH_LITERAL("ok_cert.pem"));
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CERT_EXPIRED:
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return base::FilePath(FILE_PATH_LITERAL("expired_cert.pem"));
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CERT_CHAIN_WRONG_ROOT:
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // This chain uses its own dedicated test root certificate to avoid
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // side-effects that may affect testing.
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return base::FilePath(FILE_PATH_LITERAL("redundant-server-chain.pem"));
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CERT_AUTO:
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return base::FilePath();
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return base::FilePath();
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string BaseTestServer::SSLOptions::GetOCSPArgument() const {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (server_certificate != CERT_AUTO)
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return std::string();
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (ocsp_status) {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case OCSP_OK:
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "ok";
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case OCSP_REVOKED:
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "revoked";
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case OCSP_INVALID:
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "invalid";
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case OCSP_UNAUTHORIZED:
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "unauthorized";
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case OCSP_UNKNOWN:
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "unknown";
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return std::string();
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char BaseTestServer::kLocalhost[] = "127.0.0.1";
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BaseTestServer::BaseTestServer(Type type, const std::string& host)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : type_(type),
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      started_(false),
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      log_to_console_(false) {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Init(host);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BaseTestServer::BaseTestServer(Type type, const SSLOptions& ssl_options)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : ssl_options_(ssl_options),
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      type_(type),
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      started_(false),
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      log_to_console_(false) {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(UsingSSL(type));
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Init(GetHostname(type, ssl_options));
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BaseTestServer::~BaseTestServer() {}
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const HostPortPair& BaseTestServer::host_port_pair() const {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(started_);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return host_port_pair_;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::DictionaryValue& BaseTestServer::server_data() const {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(started_);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(server_data_.get());
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return *server_data_;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string BaseTestServer::GetScheme() const {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type_) {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TYPE_FTP:
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "ftp";
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TYPE_HTTP:
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "http";
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TYPE_HTTPS:
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "https";
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TYPE_WS:
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "ws";
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TYPE_WSS:
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return "wss";
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TYPE_TCP_ECHO:
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case TYPE_UDP_ECHO:
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return std::string();
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BaseTestServer::GetAddressList(AddressList* address_list) const {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(address_list);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HostResolver> resolver(HostResolver::CreateDefaultResolver(NULL));
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostResolver::RequestInfo info(host_port_pair_);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCompletionCallback callback;
2203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  int rv = resolver->Resolve(info,
2213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                             DEFAULT_PRIORITY,
2223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                             address_list,
2233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                             callback.callback(),
2243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                             NULL,
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             BoundNetLog());
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rv == ERR_IO_PENDING)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rv = callback.WaitForResult();
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rv != net::OK) {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Failed to resolve hostname: " << host_port_pair_.host();
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint16 BaseTestServer::GetPort() {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return host_port_pair_.port();
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BaseTestServer::SetPort(uint16 port) {
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_port_pair_.set_port(port);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL BaseTestServer::GetURL(const std::string& path) const {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GURL(GetScheme() + "://" + host_port_pair_.ToString() + "/" + path);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL BaseTestServer::GetURLWithUser(const std::string& path,
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const std::string& user) const {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GURL(GetScheme() + "://" + user + "@" + host_port_pair_.ToString() +
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              "/" + path);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL BaseTestServer::GetURLWithUserAndPassword(const std::string& path,
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           const std::string& user,
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           const std::string& password) const {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GURL(GetScheme() + "://" + user + ":" + password + "@" +
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              host_port_pair_.ToString() + "/" + path);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BaseTestServer::GetFilePathWithReplacements(
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& original_file_path,
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<StringPair>& text_to_replace,
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string* replacement_path) {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string new_file_path = original_file_path;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool first_query_parameter = true;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::vector<StringPair>::const_iterator end = text_to_replace.end();
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::vector<StringPair>::const_iterator it = text_to_replace.begin();
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != end;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++it) {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& old_text = it->first;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& new_text = it->second;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string base64_old;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string base64_new;
275a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::Base64Encode(old_text, &base64_old);
276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::Base64Encode(new_text, &base64_new);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (first_query_parameter) {
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_file_path += "?";
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      first_query_parameter = false;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_file_path += "&";
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_file_path += "replace_text=";
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_file_path += base64_old;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_file_path += ":";
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_file_path += base64_new;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *replacement_path = new_file_path;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BaseTestServer::Init(const std::string& host) {
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_port_pair_ = HostPortPair(host, 0);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(battre) Remove this after figuring out why the TestServer is flaky.
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://crbug.com/96594
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  log_to_console_ = true;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BaseTestServer::SetResourcePath(const base::FilePath& document_root,
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const base::FilePath& certificates_dir) {
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This method shouldn't get called twice.
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(certificates_dir_.empty());
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  document_root_ = document_root;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  certificates_dir_ = certificates_dir;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!certificates_dir_.empty());
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BaseTestServer::ParseServerData(const std::string& server_data) {
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Server data: " << server_data;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::JSONReader json_reader;
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> value(json_reader.ReadToValue(server_data));
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!value.get() || !value->IsType(base::Value::TYPE_DICTIONARY)) {
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Could not parse server data: "
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               << json_reader.GetErrorMessage();
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  server_data_.reset(static_cast<base::DictionaryValue*>(value.release()));
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int port = 0;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!server_data_->GetInteger("port", &port)) {
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Could not find port value";
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((port <= 0) || (port > kuint16max)) {
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "Invalid port value: " << port;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_port_pair_.set_port(port);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BaseTestServer::LoadTestRootCert() const {
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestRootCerts* root_certs = TestRootCerts::GetInstance();
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!root_certs)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should always use absolute path to load the root certificate.
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath root_certificate_path = certificates_dir_;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!certificates_dir_.IsAbsolute()) {
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath src_dir;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!PathService::Get(base::DIR_SOURCE_ROOT, &src_dir))
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root_certificate_path = src_dir.Append(certificates_dir_);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return root_certs->AddFromFile(
350eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      root_certificate_path.AppendASCII("root_ca_cert.pem"));
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BaseTestServer::SetupWhenServerStarted() {
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(host_port_pair_.port());
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (UsingSSL(type_) && !LoadTestRootCert())
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  started_ = true;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed_port_.reset(new ScopedPortException(host_port_pair_.port()));
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BaseTestServer::CleanUpWhenStoppingServer() {
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestRootCerts* root_certs = TestRootCerts::GetInstance();
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root_certs->Clear();
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_port_pair_.set_port(0);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed_port_.reset();
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  started_ = false;
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generates a dictionary of arguments to pass to the Python test server via
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the test server spawner, in the form of
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// { argument-name: argument-value, ... }
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns false if an invalid configuration is specified.
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BaseTestServer::GenerateArguments(base::DictionaryValue* arguments) const {
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(arguments);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arguments->SetString("host", host_port_pair_.host());
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arguments->SetInteger("port", host_port_pair_.port());
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arguments->SetString("data-dir", document_root_.value());
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (VLOG_IS_ON(1) || log_to_console_)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    arguments->Set("log-to-console", base::Value::CreateNullValue());
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (UsingSSL(type_)) {
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check the certificate arguments of the HTTPS server.
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath certificate_path(certificates_dir_);
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath certificate_file(ssl_options_.GetCertificateFile());
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!certificate_file.value().empty()) {
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      certificate_path = certificate_path.Append(certificate_file);
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (certificate_path.IsAbsolute() &&
3947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          !base::PathExists(certificate_path)) {
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        LOG(ERROR) << "Certificate path " << certificate_path.value()
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   << " doesn't exist. Can't launch https server.";
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arguments->SetString("cert-and-key-file", certificate_path.value());
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check the client certificate related arguments.
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ssl_options_.request_client_certificate)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arguments->Set("ssl-client-auth", base::Value::CreateNullValue());
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<base::ListValue> ssl_client_certs(new base::ListValue());
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<base::FilePath>::const_iterator it;
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (it = ssl_options_.client_authorities.begin();
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it != ssl_options_.client_authorities.end(); ++it) {
4107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      if (it->IsAbsolute() && !base::PathExists(*it)) {
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        LOG(ERROR) << "Client authority path " << it->value()
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   << " doesn't exist. Can't launch https server.";
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ssl_client_certs->Append(new base::StringValue(it->value()));
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ssl_client_certs->GetSize())
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arguments->Set("ssl-client-ca", ssl_client_certs.release());
420cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
421cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    scoped_ptr<base::ListValue> client_cert_types(new base::ListValue());
422cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for (size_t i = 0; i < ssl_options_.client_cert_types.size(); i++) {
423cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      client_cert_types->Append(new base::StringValue(
424cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          GetClientCertType(ssl_options_.client_cert_types[i])));
425cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
426cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (client_cert_types->GetSize())
427cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      arguments->Set("ssl-client-cert-type", client_cert_types.release());
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type_ == TYPE_HTTPS) {
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    arguments->Set("https", base::Value::CreateNullValue());
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string ocsp_arg = ssl_options_.GetOCSPArgument();
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ocsp_arg.empty())
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arguments->SetString("ocsp", ocsp_arg);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
437a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (ssl_options_.cert_serial != 0) {
438a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      arguments->Set("cert-serial",
439a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                     base::Value::CreateIntegerValue(ssl_options_.cert_serial));
440a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
441a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // Check key exchange argument.
4430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    scoped_ptr<base::ListValue> key_exchange_values(new base::ListValue());
4440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    GetKeyExchangesList(ssl_options_.key_exchanges, key_exchange_values.get());
4450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    if (key_exchange_values->GetSize())
4460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      arguments->Set("ssl-key-exchange", key_exchange_values.release());
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check bulk cipher argument.
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<base::ListValue> bulk_cipher_values(new base::ListValue());
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetCiphersList(ssl_options_.bulk_ciphers, bulk_cipher_values.get());
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bulk_cipher_values->GetSize())
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arguments->Set("ssl-bulk-cipher", bulk_cipher_values.release());
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ssl_options_.record_resume)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arguments->Set("https-record-resume", base::Value::CreateNullValue());
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (ssl_options_.tls_intolerant != SSLOptions::TLS_INTOLERANT_NONE) {
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arguments->Set("tls-intolerant",
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     new base::FundamentalValue(ssl_options_.tls_intolerant));
457116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      arguments->Set("tls-intolerance-type", GetTLSIntoleranceType(
458116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          ssl_options_.tls_intolerance_type));
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (ssl_options_.fallback_scsv_enabled)
4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      arguments->Set("fallback-scsv", base::Value::CreateNullValue());
4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!ssl_options_.signed_cert_timestamps_tls_ext.empty()) {
4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      std::string b64_scts_tls_ext;
4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Base64Encode(ssl_options_.signed_cert_timestamps_tls_ext,
4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         &b64_scts_tls_ext);
4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      arguments->SetString("signed-cert-timestamps-tls-ext", b64_scts_tls_ext);
467a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (ssl_options_.staple_ocsp_response)
4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      arguments->Set("staple-ocsp-response", base::Value::CreateNullValue());
4700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    if (ssl_options_.enable_npn)
4710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      arguments->Set("enable-npn", base::Value::CreateNullValue());
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GenerateAdditionalArguments(arguments);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BaseTestServer::GenerateAdditionalArguments(
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::DictionaryValue* arguments) const {
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
483