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() { |