Index: pkg/analysis_server/lib/src/server/http_server.dart |
diff --git a/pkg/analysis_server/lib/src/server/http_server.dart b/pkg/analysis_server/lib/src/server/http_server.dart |
index 85c355700c0aa4c5438f25b221e0564db3c07eb9..48057fd4d54170f558d4f09f67a0069013b5f561 100644 |
--- a/pkg/analysis_server/lib/src/server/http_server.dart |
+++ b/pkg/analysis_server/lib/src/server/http_server.dart |
@@ -14,8 +14,10 @@ import 'package:analysis_server/src/status/get_handler2.dart'; |
/** |
* Instances of the class [HttpServer] implement a simple HTTP server. The |
- * primary responsibility of this server is to listen for an UPGRADE request and |
- * to start an analysis server. |
+ * server: |
+ * |
+ * - listens for an UPGRADE request in order to start an analysis server |
+ * - serves diagnostic information as html pages |
*/ |
class HttpAnalysisServer { |
/** |
@@ -49,6 +51,11 @@ class HttpAnalysisServer { |
*/ |
HttpAnalysisServer(this.socketServer); |
+ /** |
+ * Return the port this server is bound to. |
+ */ |
+ Future<int> get boundPort async => (await _server)?.port; |
+ |
void close() { |
_server.then((HttpServer server) { |
server.close(); |
@@ -69,9 +76,20 @@ class HttpAnalysisServer { |
/** |
* Begin serving HTTP requests over the given port. |
*/ |
- void serveHttp(int port) { |
- _server = HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, port); |
- _server.then(_handleServer).catchError((_) {/* Ignore errors. */}); |
+ Future<int> serveHttp([int initialPort]) async { |
+ if (_server != null) { |
+ return boundPort; |
+ } |
+ |
+ try { |
+ _server = |
+ HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, initialPort ?? 0); |
+ HttpServer server = await _server; |
+ _handleServer(server); |
+ return server.port; |
+ } catch (ignore) { |
+ return null; |
+ } |
} |
/** |
@@ -111,6 +129,8 @@ class HttpAnalysisServer { |
* running an analysis server on a [WebSocket]-based communication channel. |
*/ |
void _handleWebSocket(WebSocket socket) { |
+ // TODO(devoncarew): This serves the analysis server over a websocket |
+ // connection for historical reasons (and should probably be removed). |
socketServer.createAnalysisServer(new WebSocketServerChannel( |
socket, socketServer.instrumentationService)); |
} |