| Index: net/test/test_server_win.cc
|
| diff --git a/net/test/test_server_win.cc b/net/test/test_server_win.cc
|
| index 64437cd46d6a2aa8348d67c8b63f0400a8b71d7c..0fa7003541c21f6e16d3ca38a200724c94e6361f 100644
|
| --- a/net/test/test_server_win.cc
|
| +++ b/net/test/test_server_win.cc
|
| @@ -86,6 +86,26 @@ void UnblockPipe(HANDLE handle, bool* unblocked) {
|
| *unblocked = true;
|
| }
|
|
|
| +// Given a file handle, reads into |buffer| until |bytes_max| bytes
|
| +// has been read or an error has been encountered (which includes
|
| +// |unblocked| being set to true; see UnblockPipe() above). Returns
|
| +// true if the read was successful.
|
| +bool ReadData(bool* unblocked, HANDLE fd, DWORD bytes_max, uint8* buffer) {
|
| + DWORD bytes_read = 0;
|
| + while (bytes_read < bytes_max) {
|
| + DWORD num_bytes;
|
| + if (!ReadFile(fd, buffer + bytes_read, bytes_max - bytes_read,
|
| + &num_bytes, NULL))
|
| + return false;
|
| + if (num_bytes <= 0)
|
| + return false;
|
| + if (*unblocked)
|
| + return false;
|
| + bytes_read += num_bytes;
|
| + }
|
| + return true;
|
| +}
|
| +
|
| } // namespace
|
|
|
| namespace net {
|
| @@ -146,6 +166,9 @@ bool TestServer::LaunchPython(const FilePath& testserver_path) {
|
| }
|
|
|
| bool TestServer::WaitToStart() {
|
| + ScopedHandle read_fd(child_read_fd_.Take());
|
| + ScopedHandle write_fd(child_write_fd_.Take());
|
| +
|
| base::Thread thread("test_server_watcher");
|
| if (!thread.Start())
|
| return false;
|
| @@ -153,37 +176,19 @@ bool TestServer::WaitToStart() {
|
| // Prepare a timeout in case the server fails to start.
|
| bool unblocked = false;
|
| thread.message_loop()->PostDelayedTask(FROM_HERE,
|
| - NewRunnableFunction(UnblockPipe, child_write_fd_.Get(), &unblocked),
|
| + NewRunnableFunction(UnblockPipe, write_fd.Get(), &unblocked),
|
| TestTimeouts::action_max_timeout_ms());
|
|
|
| - // Try to read two bytes from the pipe indicating the ephemeral port number.
|
| - uint16 port;
|
| - uint8* buffer = reinterpret_cast<uint8*>(&port);
|
| - DWORD bytes_read = 0;
|
| - DWORD bytes_max = sizeof(port);
|
| - while (bytes_read < bytes_max) {
|
| - DWORD num_bytes;
|
| - if (!ReadFile(child_read_fd_, buffer + bytes_read, bytes_max - bytes_read,
|
| - &num_bytes, NULL))
|
| - break;
|
| - if (num_bytes <= 0)
|
| - break;
|
| - bytes_read += num_bytes;
|
| - }
|
| - thread.Stop();
|
| - child_read_fd_.Close();
|
| - child_write_fd_.Close();
|
| -
|
| - // If we hit the timeout, fail.
|
| - if (unblocked)
|
| + uint32 server_data_len = 0;
|
| + if (!ReadData(&unblocked, read_fd.Get(), sizeof(server_data_len),
|
| + reinterpret_cast<uint8*>(&server_data_len)))
|
| return false;
|
| -
|
| - // If not enough bytes were read, fail.
|
| - if (bytes_read < bytes_max)
|
| + std::string server_data(server_data_len, '\0');
|
| + if (!ReadData(&unblocked, read_fd.Get(), server_data_len,
|
| + reinterpret_cast<uint8*>(&server_data[0])))
|
| return false;
|
|
|
| - host_port_pair_.set_port(port);
|
| - return true;
|
| + return ParseServerData(server_data);
|
| }
|
|
|
| bool TestServer::CheckCATrusted() {
|
|
|