| Index: net/test/embedded_test_server/embedded_test_server.cc
|
| diff --git a/net/test/embedded_test_server/embedded_test_server.cc b/net/test/embedded_test_server/embedded_test_server.cc
|
| index 3d57df5ed6a28d8638d7761bde540c5f2c8789a1..0f89bd9c9e4ad8aec00628a3a8ea2bdc849abddc 100644
|
| --- a/net/test/embedded_test_server/embedded_test_server.cc
|
| +++ b/net/test/embedded_test_server/embedded_test_server.cc
|
| @@ -23,6 +23,7 @@
|
| #include "crypto/rsa_private_key.h"
|
| #include "net/base/ip_endpoint.h"
|
| #include "net/base/net_errors.h"
|
| +#include "net/base/port_util.h"
|
| #include "net/cert/pem_tokenizer.h"
|
| #include "net/cert/test_root_certs.h"
|
| #include "net/log/net_log_source.h"
|
| @@ -92,21 +93,38 @@ bool EmbeddedTestServer::Start() {
|
| bool EmbeddedTestServer::InitializeAndListen() {
|
| DCHECK(!Started());
|
|
|
| - listen_socket_.reset(new TCPServerSocket(nullptr, NetLogSource()));
|
| + const int max_tries = 5;
|
| + int num_tries = 0;
|
| + bool is_valid_port = false;
|
|
|
| - int result = listen_socket_->ListenWithAddressAndPort("127.0.0.1", 0, 10);
|
| - if (result) {
|
| - LOG(ERROR) << "Listen failed: " << ErrorToString(result);
|
| - listen_socket_.reset();
|
| - return false;
|
| - }
|
| + do {
|
| + if (++num_tries > max_tries) {
|
| + LOG(ERROR) << "Failed to listen on a valid port after " << max_tries
|
| + << " attempts.";
|
| + listen_socket_.reset();
|
| + return false;
|
| + }
|
|
|
| - result = listen_socket_->GetLocalAddress(&local_endpoint_);
|
| - if (result != OK) {
|
| - LOG(ERROR) << "GetLocalAddress failed: " << ErrorToString(result);
|
| - listen_socket_.reset();
|
| - return false;
|
| - }
|
| + listen_socket_.reset(new TCPServerSocket(nullptr, NetLogSource()));
|
| +
|
| + int result = listen_socket_->ListenWithAddressAndPort("127.0.0.1", 0, 10);
|
| + if (result) {
|
| + LOG(ERROR) << "Listen failed: " << ErrorToString(result);
|
| + listen_socket_.reset();
|
| + return false;
|
| + }
|
| +
|
| + result = listen_socket_->GetLocalAddress(&local_endpoint_);
|
| + if (result != OK) {
|
| + LOG(ERROR) << "GetLocalAddress failed: " << ErrorToString(result);
|
| + listen_socket_.reset();
|
| + return false;
|
| + }
|
| +
|
| + port_ = local_endpoint_.port();
|
| + is_valid_port |= net::IsPortAllowedForScheme(
|
| + port_, is_using_ssl_ ? url::kHttpsScheme : url::kHttpScheme);
|
| + } while (!is_valid_port);
|
|
|
| if (is_using_ssl_) {
|
| base_url_ = GURL("https://" + local_endpoint_.ToString());
|
| @@ -117,7 +135,6 @@ bool EmbeddedTestServer::InitializeAndListen() {
|
| } else {
|
| base_url_ = GURL("http://" + local_endpoint_.ToString());
|
| }
|
| - port_ = local_endpoint_.port();
|
|
|
| listen_socket_->DetachFromThread();
|
|
|
|
|