Skip to content

Commit a45792a

Browse files
Eugene Ostroukhovaddaleax
Eugene Ostroukhov
authored andcommittedJul 11, 2017
inspector: perform DNS lookup for host
PR-URL: #13478 Fixes: #13477 Reviewed-By: Sam Roberts <[email protected]> Reviewed-By: Refael Ackermann <[email protected]> Reviewed-By: Ben Noordhuis <[email protected]>
1 parent 820b011 commit a45792a

7 files changed

+343
-163
lines changed
 

‎src/inspector_agent.cc

+1-7
Original file line numberDiff line numberDiff line change
@@ -702,13 +702,7 @@ void Url(const FunctionCallbackInfo<Value>& args) {
702702

703703
if (ids.empty()) return;
704704

705-
std::string url = "ws://";
706-
url += io->host();
707-
url += ":";
708-
url += std::to_string(io->port());
709-
url += "/";
710-
url += ids[0];
711-
705+
std::string url = FormatWsAddress(io->host(), io->port(), ids[0], true);
712706
args.GetReturnValue().Set(OneByteString(env->isolate(), url.c_str()));
713707
}
714708

‎src/inspector_io.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ void InspectorIo::ThreadMain() {
313313
uv_sem_post(&thread_start_sem_);
314314
return;
315315
}
316-
port_ = server.port(); // Safe, main thread is waiting on semaphore.
316+
port_ = server.Port(); // Safe, main thread is waiting on semaphore.
317317
if (!wait_for_connect_) {
318318
uv_sem_post(&thread_start_sem_);
319319
}

‎src/inspector_io.h

+4
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ class StringView;
2828
namespace node {
2929
namespace inspector {
3030

31+
std::string FormatWsAddress(const std::string& host, int port,
32+
const std::string& target_id,
33+
bool include_protocol);
34+
3135
class InspectorIoDelegate;
3236

3337
enum class InspectorAction {

‎src/inspector_socket.h

+1
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ class InspectorSocket {
6363
bool ws_mode;
6464
bool shutting_down;
6565
bool connection_eof;
66+
6667
private:
6768
DISALLOW_COPY_AND_ASSIGN(InspectorSocket);
6869
};

‎src/inspector_socket_server.cc

+256-126
Large diffs are not rendered by default.

‎src/inspector_socket_server.h

+18-19
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ namespace inspector {
1818

1919
class Closer;
2020
class SocketSession;
21+
class ServerSocket;
2122

2223
class SocketServerDelegate {
2324
public:
@@ -54,43 +55,41 @@ class InspectorSocketServer {
5455
// kKill
5556
void TerminateConnections();
5657

57-
int port() {
58-
return port_;
58+
int Port() const;
59+
60+
// Server socket lifecycle. There may be multiple sockets
61+
void ServerSocketListening(ServerSocket* server_socket);
62+
void ServerSocketClosed(ServerSocket* server_socket);
63+
64+
// Session connection lifecycle
65+
bool HandleGetRequest(InspectorSocket* socket, const std::string& path);
66+
bool SessionStarted(SocketSession* session, const std::string& id);
67+
void SessionTerminated(SocketSession* session);
68+
void MessageReceived(int session_id, const std::string& message) {
69+
delegate_->MessageReceived(session_id, message);
5970
}
6071

61-
private:
62-
static bool HandshakeCallback(InspectorSocket* socket,
63-
enum inspector_handshake_event state,
64-
const std::string& path);
65-
static void SocketConnectedCallback(uv_stream_t* server, int status);
66-
static void ServerClosedCallback(uv_handle_t* server);
67-
template<typename SomeUvStruct>
68-
static InspectorSocketServer* From(SomeUvStruct* server) {
69-
return node::ContainerOf(&InspectorSocketServer::server_,
70-
reinterpret_cast<uv_tcp_t*>(server));
72+
int GenerateSessionId() {
73+
return next_session_id_++;
7174
}
72-
bool RespondToGet(InspectorSocket* socket, const std::string& path);
75+
76+
private:
7377
void SendListResponse(InspectorSocket* socket);
74-
void ReadCallback(InspectorSocket* socket, ssize_t read, const uv_buf_t* buf);
75-
bool SessionStarted(SocketSession* session, const std::string& id);
76-
void SessionTerminated(SocketSession* session);
7778
bool TargetExists(const std::string& id);
78-
SocketServerDelegate* Delegate() { return delegate_; }
7979

8080
enum class ServerState {kNew, kRunning, kStopping, kStopped};
8181
uv_loop_t* loop_;
8282
SocketServerDelegate* const delegate_;
8383
const std::string host_;
8484
int port_;
8585
std::string path_;
86-
uv_tcp_t server_;
86+
std::vector<ServerSocket*> server_sockets_;
8787
Closer* closer_;
8888
std::map<int, SocketSession*> connected_sessions_;
8989
int next_session_id_;
9090
FILE* out_;
9191
ServerState state_;
9292

93-
friend class SocketSession;
9493
friend class Closer;
9594
};
9695

‎test/cctest/test_inspector_socket_server.cc

+62-10
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ static const char WS_HANDSHAKE_RESPONSE[] =
2626
{ \
2727
Timeout timeout(&loop); \
2828
while ((condition) && !timeout.timed_out) { \
29-
uv_run(&loop, UV_RUN_NOWAIT); \
29+
uv_run(&loop, UV_RUN_ONCE); \
3030
} \
3131
ASSERT_FALSE((condition)); \
3232
}
@@ -41,6 +41,7 @@ class Timeout {
4141
explicit Timeout(uv_loop_t* loop) : timed_out(false), done_(false) {
4242
uv_timer_init(loop, &timer_);
4343
uv_timer_start(&timer_, Timeout::set_flag, 5000, 0);
44+
uv_unref(reinterpret_cast<uv_handle_t*>(&timer_));
4445
}
4546

4647
~Timeout() {
@@ -163,18 +164,20 @@ class SocketWrapper {
163164
connected_(false),
164165
sending_(false) { }
165166

166-
void Connect(std::string host, int port) {
167+
void Connect(std::string host, int port, bool v6 = false) {
167168
closed_ = false;
168169
connection_failed_ = false;
169170
connected_ = false;
170171
eof_ = false;
171172
contents_.clear();
172173
uv_tcp_init(loop_, &socket_);
173-
sockaddr_in addr;
174-
uv_ip4_addr(host.c_str(), port, &addr);
175-
int err = uv_tcp_connect(&connect_, &socket_,
176-
reinterpret_cast<const sockaddr*>(&addr),
177-
Connected_);
174+
union {sockaddr generic; sockaddr_in v4; sockaddr_in6 v6;} addr;
175+
if (v6) {
176+
uv_ip6_addr(host.c_str(), port, &addr.v6);
177+
} else {
178+
uv_ip4_addr(host.c_str(), port, &addr.v4);
179+
}
180+
int err = uv_tcp_connect(&connect_, &socket_, &addr.generic, Connected_);
178181
ASSERT_EQ(0, err);
179182
SPIN_WHILE(!connected_)
180183
uv_read_start(reinterpret_cast<uv_stream_t*>(&socket_), AllocCallback,
@@ -306,9 +309,14 @@ class SocketWrapper {
306309
class ServerHolder {
307310
public:
308311
template <typename Delegate>
309-
ServerHolder(Delegate* delegate, uv_loop_t* loop, int port, FILE* out = NULL)
312+
ServerHolder(Delegate* delegate, uv_loop_t* loop, int port)
313+
: ServerHolder(delegate, loop, HOST, port, NULL) { }
314+
315+
template <typename Delegate>
316+
ServerHolder(Delegate* delegate, uv_loop_t* loop, const std::string host,
317+
int port, FILE* out)
310318
: closed(false), paused(false),
311-
server_(delegate, loop, HOST, port, out) {
319+
server_(delegate, loop, host, port, out) {
312320
delegate->Connect(&server_);
313321
}
314322

@@ -317,7 +325,7 @@ class ServerHolder {
317325
}
318326

319327
int port() {
320-
return server_.port();
328+
return server_.Port();
321329
}
322330

323331
static void CloseCallback(InspectorSocketServer* server) {
@@ -575,3 +583,47 @@ TEST_F(InspectorSocketServerTest, TerminatingSessionReportsDone) {
575583
socket1.ExpectEOF();
576584
SPIN_WHILE(!delegate.done);
577585
}
586+
587+
TEST_F(InspectorSocketServerTest, FailsToBindToNodejsHost) {
588+
TestInspectorServerDelegate delegate;
589+
ServerHolder server(&delegate, &loop, "nodejs.org", 0, nullptr);
590+
ASSERT_FALSE(server->Start());
591+
SPIN_WHILE(uv_loop_alive(&loop));
592+
}
593+
594+
bool has_ipv6_address() {
595+
uv_interface_address_s* addresses = nullptr;
596+
int address_count = 0;
597+
int err = uv_interface_addresses(&addresses, &address_count);
598+
if (err != 0) {
599+
return false;
600+
}
601+
bool has_address = false;
602+
for (int i = 0; i < address_count; i++) {
603+
if (addresses[i].address.address6.sin6_family == AF_INET6) {
604+
has_address = true;
605+
}
606+
}
607+
uv_free_interface_addresses(addresses, address_count);
608+
return has_address;
609+
}
610+
611+
TEST_F(InspectorSocketServerTest, BindsToIpV6) {
612+
if (!has_ipv6_address()) {
613+
fprintf(stderr, "No IPv6 network detected\n");
614+
return;
615+
}
616+
TestInspectorServerDelegate delegate;
617+
ServerHolder server(&delegate, &loop, "::", 0, NULL);
618+
ASSERT_TRUE(server->Start());
619+
620+
SocketWrapper socket1(&loop);
621+
socket1.Connect("[::]", server.port(), true);
622+
socket1.Write(WsHandshakeRequest(MAIN_TARGET_ID));
623+
socket1.Expect(WS_HANDSHAKE_RESPONSE);
624+
server->Stop(ServerHolder::CloseCallback);
625+
SPIN_WHILE(!server.closed);
626+
ASSERT_FALSE(delegate.done);
627+
socket1.Close();
628+
SPIN_WHILE(!delegate.done);
629+
}

0 commit comments

Comments
 (0)
Please sign in to comment.