base_test_server.cc revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
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), 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_client_certificate(false), 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bulk_ciphers(SSLOptions::BULK_CIPHER_ANY), 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) record_resume(false), 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tls_intolerant(TLS_INTOLERANT_NONE) {} 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BaseTestServer::SSLOptions::SSLOptions( 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BaseTestServer::SSLOptions::ServerCertificate cert) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : server_certificate(cert), 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_client_certificate(false), 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bulk_ciphers(SSLOptions::BULK_CIPHER_ANY), 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) record_resume(false), 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tls_intolerant(TLS_INTOLERANT_NONE) {} 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BaseTestServer::SSLOptions::~SSLOptions() {} 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath BaseTestServer::SSLOptions::GetCertificateFile() const { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (server_certificate) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CERT_OK: 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CERT_MISMATCHED_NAME: 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::FilePath(FILE_PATH_LITERAL("ok_cert.pem")); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CERT_EXPIRED: 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::FilePath(FILE_PATH_LITERAL("expired_cert.pem")); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CERT_CHAIN_WRONG_ROOT: 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This chain uses its own dedicated test root certificate to avoid 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // side-effects that may affect testing. 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::FilePath(FILE_PATH_LITERAL("redundant-server-chain.pem")); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case CERT_AUTO: 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::FilePath(); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::FilePath(); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string BaseTestServer::SSLOptions::GetOCSPArgument() const { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (server_certificate != CERT_AUTO) 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return std::string(); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (ocsp_status) { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OCSP_OK: 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "ok"; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OCSP_REVOKED: 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "revoked"; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OCSP_INVALID: 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "invalid"; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OCSP_UNAUTHORIZED: 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "unauthorized"; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case OCSP_UNKNOWN: 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "unknown"; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return std::string(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char BaseTestServer::kLocalhost[] = "127.0.0.1"; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BaseTestServer::BaseTestServer(Type type, const std::string& host) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : type_(type), 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) started_(false), 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_to_console_(false) { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Init(host); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BaseTestServer::BaseTestServer(Type type, const SSLOptions& ssl_options) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ssl_options_(ssl_options), 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type_(type), 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) started_(false), 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_to_console_(false) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(UsingSSL(type)); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Init(GetHostname(type, ssl_options)); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BaseTestServer::~BaseTestServer() {} 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const HostPortPair& BaseTestServer::host_port_pair() const { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(started_); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return host_port_pair_; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::DictionaryValue& BaseTestServer::server_data() const { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(started_); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(server_data_.get()); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *server_data_; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string BaseTestServer::GetScheme() const { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type_) { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TYPE_FTP: 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "ftp"; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TYPE_HTTP: 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "http"; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TYPE_HTTPS: 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "https"; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TYPE_WS: 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "ws"; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TYPE_WSS: 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "wss"; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TYPE_TCP_ECHO: 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TYPE_UDP_ECHO: 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return std::string(); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BaseTestServer::GetAddressList(AddressList* address_list) const { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(address_list); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HostResolver> resolver(HostResolver::CreateDefaultResolver(NULL)); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostResolver::RequestInfo info(host_port_pair_); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rv = resolver->Resolve(info, address_list, callback.callback(), NULL, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BoundNetLog()); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rv == ERR_IO_PENDING) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = callback.WaitForResult(); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rv != net::OK) { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Failed to resolve hostname: " << host_port_pair_.host(); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint16 BaseTestServer::GetPort() { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return host_port_pair_.port(); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BaseTestServer::SetPort(uint16 port) { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_port_pair_.set_port(port); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL BaseTestServer::GetURL(const std::string& path) const { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GURL(GetScheme() + "://" + host_port_pair_.ToString() + "/" + path); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL BaseTestServer::GetURLWithUser(const std::string& path, 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& user) const { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GURL(GetScheme() + "://" + user + "@" + host_port_pair_.ToString() + 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "/" + path); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL BaseTestServer::GetURLWithUserAndPassword(const std::string& path, 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& user, 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& password) const { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GURL(GetScheme() + "://" + user + ":" + password + "@" + 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_port_pair_.ToString() + "/" + path); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BaseTestServer::GetFilePathWithReplacements( 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& original_file_path, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<StringPair>& text_to_replace, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* replacement_path) { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string new_file_path = original_file_path; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool first_query_parameter = true; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<StringPair>::const_iterator end = text_to_replace.end(); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<StringPair>::const_iterator it = text_to_replace.begin(); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != end; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it) { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& old_text = it->first; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& new_text = it->second; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string base64_old; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string base64_new; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!base::Base64Encode(old_text, &base64_old)) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!base::Base64Encode(new_text, &base64_new)) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (first_query_parameter) { 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_file_path += "?"; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_query_parameter = false; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_file_path += "&"; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_file_path += "replace_text="; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_file_path += base64_old; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_file_path += ":"; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_file_path += base64_new; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *replacement_path = new_file_path; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BaseTestServer::Init(const std::string& host) { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_port_pair_ = HostPortPair(host, 0); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(battre) Remove this after figuring out why the TestServer is flaky. 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/96594 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log_to_console_ = true; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BaseTestServer::SetResourcePath(const base::FilePath& document_root, 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& certificates_dir) { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method shouldn't get called twice. 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(certificates_dir_.empty()); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_root_ = document_root; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) certificates_dir_ = certificates_dir; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!certificates_dir_.empty()); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BaseTestServer::ParseServerData(const std::string& server_data) { 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "Server data: " << server_data; 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::JSONReader json_reader; 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> value(json_reader.ReadToValue(server_data)); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value.get() || !value->IsType(base::Value::TYPE_DICTIONARY)) { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Could not parse server data: " 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << json_reader.GetErrorMessage(); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) server_data_.reset(static_cast<base::DictionaryValue*>(value.release())); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int port = 0; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!server_data_->GetInteger("port", &port)) { 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Could not find port value"; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((port <= 0) || (port > kuint16max)) { 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Invalid port value: " << port; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_port_pair_.set_port(port); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BaseTestServer::LoadTestRootCert() const { 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestRootCerts* root_certs = TestRootCerts::GetInstance(); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!root_certs) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should always use absolute path to load the root certificate. 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath root_certificate_path = certificates_dir_; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!certificates_dir_.IsAbsolute()) { 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath src_dir; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!PathService::Get(base::DIR_SOURCE_ROOT, &src_dir)) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_certificate_path = src_dir.Append(certificates_dir_); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return root_certs->AddFromFile( 299eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch root_certificate_path.AppendASCII("root_ca_cert.pem")); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BaseTestServer::SetupWhenServerStarted() { 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(host_port_pair_.port()); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (UsingSSL(type_) && !LoadTestRootCert()) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) started_ = true; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) allowed_port_.reset(new ScopedPortException(host_port_pair_.port())); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BaseTestServer::CleanUpWhenStoppingServer() { 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestRootCerts* root_certs = TestRootCerts::GetInstance(); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_certs->Clear(); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_port_pair_.set_port(0); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) allowed_port_.reset(); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) started_ = false; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generates a dictionary of arguments to pass to the Python test server via 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the test server spawner, in the form of 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// { argument-name: argument-value, ... } 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns false if an invalid configuration is specified. 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BaseTestServer::GenerateArguments(base::DictionaryValue* arguments) const { 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(arguments); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arguments->SetString("host", host_port_pair_.host()); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arguments->SetInteger("port", host_port_pair_.port()); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arguments->SetString("data-dir", document_root_.value()); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (VLOG_IS_ON(1) || log_to_console_) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arguments->Set("log-to-console", base::Value::CreateNullValue()); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (UsingSSL(type_)) { 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the certificate arguments of the HTTPS server. 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath certificate_path(certificates_dir_); 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath certificate_file(ssl_options_.GetCertificateFile()); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!certificate_file.value().empty()) { 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) certificate_path = certificate_path.Append(certificate_file); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (certificate_path.IsAbsolute() && 3437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch !base::PathExists(certificate_path)) { 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Certificate path " << certificate_path.value() 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " doesn't exist. Can't launch https server."; 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arguments->SetString("cert-and-key-file", certificate_path.value()); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the client certificate related arguments. 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ssl_options_.request_client_certificate) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arguments->Set("ssl-client-auth", base::Value::CreateNullValue()); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::ListValue> ssl_client_certs(new base::ListValue()); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<base::FilePath>::const_iterator it; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (it = ssl_options_.client_authorities.begin(); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != ssl_options_.client_authorities.end(); ++it) { 3597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (it->IsAbsolute() && !base::PathExists(*it)) { 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Client authority path " << it->value() 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " doesn't exist. Can't launch https server."; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ssl_client_certs->Append(new base::StringValue(it->value())); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ssl_client_certs->GetSize()) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arguments->Set("ssl-client-ca", ssl_client_certs.release()); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type_ == TYPE_HTTPS) { 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arguments->Set("https", base::Value::CreateNullValue()); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string ocsp_arg = ssl_options_.GetOCSPArgument(); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ocsp_arg.empty()) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arguments->SetString("ocsp", ocsp_arg); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check bulk cipher argument. 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::ListValue> bulk_cipher_values(new base::ListValue()); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCiphersList(ssl_options_.bulk_ciphers, bulk_cipher_values.get()); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bulk_cipher_values->GetSize()) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arguments->Set("ssl-bulk-cipher", bulk_cipher_values.release()); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ssl_options_.record_resume) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arguments->Set("https-record-resume", base::Value::CreateNullValue()); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ssl_options_.tls_intolerant != SSLOptions::TLS_INTOLERANT_NONE) { 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arguments->Set("tls-intolerant", 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new base::FundamentalValue(ssl_options_.tls_intolerant)); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GenerateAdditionalArguments(arguments); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BaseTestServer::GenerateAdditionalArguments( 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* arguments) const { 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 400