diff --git a/src/ptvsd/adapter/channels.py b/src/ptvsd/adapter/channels.py index efb5c18e..948957e0 100644 --- a/src/ptvsd/adapter/channels.py +++ b/src/ptvsd/adapter/channels.py @@ -42,9 +42,7 @@ class Channels(singleton.ThreadSafeSingleton): server_sock = socket.create_server(host, port) try: log.info( - "ptvsd debugServer waiting for connection on {0}:{1}...", - host, - port, + "ptvsd debugServer waiting for connection on {0}:{1}...", host, port ) sock, (ide_host, ide_port) = server_sock.accept() finally: @@ -65,13 +63,44 @@ class Channels(singleton.ThreadSafeSingleton): }, ) - @singleton.autolocked_method def connect_to_server(self, address): assert self.server is None - raise NotImplementedError + + # Import message handlers lazily to avoid circular imports. + from ptvsd.adapter import messages + + host, port = address + sock = socket.create_client() + sock.connect(address) + + server_stream = messaging.JsonIOStream.from_socket(sock, "server") + + self.server = messaging.JsonMessageChannel( + server_stream, messages.ServerMessages(), server_stream.name + ) + self.server.start() @singleton.autolocked_method def accept_connection_from_server(self, address): assert self.server is None - raise NotImplementedError + + # Import message handlers lazily to avoid circular imports. + from ptvsd.adapter import messages + + host, port = address + server_sock = socket.create_server(host, port) + try: + log.info( + "ptvsd adapter waiting for connection on {0}:{1}...", host, port + ) + sock, (server_host, server_port) = server_sock.accept() + finally: + server_sock.close() + log.info("Debug server connection accepted from {0}:{1}.", server_host, server_port) + server_stream = messaging.JsonIOStream.from_socket(sock, "server") + + self.server = messaging.JsonMessageChannel( + server_stream, messages.ServerMessages(), server_stream.name + ) + self.server.start() diff --git a/src/ptvsd/adapter/messages.py b/src/ptvsd/adapter/messages.py index 1db2ad6f..bb6ab47d 100644 --- a/src/ptvsd/adapter/messages.py +++ b/src/ptvsd/adapter/messages.py @@ -6,7 +6,7 @@ from __future__ import absolute_import, print_function, unicode_literals import ptvsd from ptvsd.common import log, messaging, singleton -from ptvsd.adapter import channels, debuggee, state +from ptvsd.adapter import channels, debuggee, state, options class Shared(singleton.ThreadSafeSingleton): @@ -136,8 +136,11 @@ class IDEMessages(Messages): # Handles various attributes common to both "launch" and "attach". def _debug_config(self, request): assert request.command in ("launch", "attach") - pass # TODO: options and debugOptions - pass # TODO: pathMappings (unless server does that entirely?) + + # TODO: Change all old VS style debugger settings to debugOptions + # See https://github.com/microsoft/ptvsd/issues/1219 + pass + @_replay_to_server @_only_allowed_while("initializing") @@ -155,8 +158,10 @@ class IDEMessages(Messages): self.terminate_on_disconnect = False self._debug_config(request) - # TODO: get address and port - channels.connect_to_server() + options.host = request.arguments.get("host", options.host) + options.port = int(request.arguments.get("port", options.port)) + + self._channels.connect_to_server(address=(options.host, options.port)) return self._configure() @@ -166,7 +171,7 @@ class IDEMessages(Messages): def _configure(self): log.debug("Replaying previously received messages to server.") - for msg in self.initial_messages: + for msg in self._initial_messages: # TODO: validate server response to ensure it matches our own earlier. self._server.propagate(msg) diff --git a/src/ptvsd/adapter/options.py b/src/ptvsd/adapter/options.py new file mode 100644 index 00000000..7d9c33e3 --- /dev/null +++ b/src/ptvsd/adapter/options.py @@ -0,0 +1,10 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See LICENSE in the project root +# for license information. + + +host = "127.0.0.1" +"""Default host name for the debug server""" + +port = 5678 +"""Default port for the debug server""" \ No newline at end of file