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