| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library analysis_server.src.server.http_server; | 5 library analysis_server.src.server.http_server; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'dart:io'; | 8 import 'dart:io'; |
| 9 | 9 |
| 10 import 'package:analysis_server/src/channel/web_socket_channel.dart'; | 10 import 'package:analysis_server/src/channel/web_socket_channel.dart'; |
| 11 import 'package:analysis_server/src/socket_server.dart'; | 11 import 'package:analysis_server/src/socket_server.dart'; |
| 12 import 'package:analysis_server/src/status/get_handler.dart'; | 12 import 'package:analysis_server/src/status/get_handler.dart'; |
| 13 import 'package:analysis_server/src/status/get_handler2.dart'; | 13 import 'package:analysis_server/src/status/get_handler2.dart'; |
| 14 | 14 |
| 15 /** | 15 /** |
| 16 * Instances of the class [HttpServer] implement a simple HTTP server. The | 16 * Instances of the class [HttpServer] implement a simple HTTP server. The |
| 17 * primary responsibility of this server is to listen for an UPGRADE request and | 17 * server: |
| 18 * to start an analysis server. | 18 * |
| 19 * - listens for an UPGRADE request in order to start an analysis server |
| 20 * - serves diagnostic information as html pages |
| 19 */ | 21 */ |
| 20 class HttpAnalysisServer { | 22 class HttpAnalysisServer { |
| 21 /** | 23 /** |
| 22 * Number of lines of print output to capture. | 24 * Number of lines of print output to capture. |
| 23 */ | 25 */ |
| 24 static const int MAX_PRINT_BUFFER_LENGTH = 1000; | 26 static const int MAX_PRINT_BUFFER_LENGTH = 1000; |
| 25 | 27 |
| 26 /** | 28 /** |
| 27 * An object that can handle either a WebSocket connection or a connection | 29 * An object that can handle either a WebSocket connection or a connection |
| 28 * to the client over stdio. | 30 * to the client over stdio. |
| (...skipping 13 matching lines...) Expand all Loading... |
| 42 /** | 44 /** |
| 43 * Last PRINT_BUFFER_LENGTH lines printed. | 45 * Last PRINT_BUFFER_LENGTH lines printed. |
| 44 */ | 46 */ |
| 45 List<String> _printBuffer = <String>[]; | 47 List<String> _printBuffer = <String>[]; |
| 46 | 48 |
| 47 /** | 49 /** |
| 48 * Initialize a newly created HTTP server. | 50 * Initialize a newly created HTTP server. |
| 49 */ | 51 */ |
| 50 HttpAnalysisServer(this.socketServer); | 52 HttpAnalysisServer(this.socketServer); |
| 51 | 53 |
| 54 /** |
| 55 * Return the port this server is bound to. |
| 56 */ |
| 57 Future<int> get boundPort async => (await _server)?.port; |
| 58 |
| 52 void close() { | 59 void close() { |
| 53 _server.then((HttpServer server) { | 60 _server.then((HttpServer server) { |
| 54 server.close(); | 61 server.close(); |
| 55 }); | 62 }); |
| 56 } | 63 } |
| 57 | 64 |
| 58 /** | 65 /** |
| 59 * Record that the given line was printed out by the analysis server. | 66 * Record that the given line was printed out by the analysis server. |
| 60 */ | 67 */ |
| 61 void recordPrint(String line) { | 68 void recordPrint(String line) { |
| 62 _printBuffer.add(line); | 69 _printBuffer.add(line); |
| 63 if (_printBuffer.length > MAX_PRINT_BUFFER_LENGTH) { | 70 if (_printBuffer.length > MAX_PRINT_BUFFER_LENGTH) { |
| 64 _printBuffer.removeRange( | 71 _printBuffer.removeRange( |
| 65 0, _printBuffer.length - MAX_PRINT_BUFFER_LENGTH); | 72 0, _printBuffer.length - MAX_PRINT_BUFFER_LENGTH); |
| 66 } | 73 } |
| 67 } | 74 } |
| 68 | 75 |
| 69 /** | 76 /** |
| 70 * Begin serving HTTP requests over the given port. | 77 * Begin serving HTTP requests over the given port. |
| 71 */ | 78 */ |
| 72 void serveHttp(int port) { | 79 Future<int> serveHttp([int initialPort]) async { |
| 73 _server = HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, port); | 80 if (_server != null) { |
| 74 _server.then(_handleServer).catchError((_) {/* Ignore errors. */}); | 81 return boundPort; |
| 82 } |
| 83 |
| 84 try { |
| 85 _server = |
| 86 HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, initialPort ?? 0); |
| 87 HttpServer server = await _server; |
| 88 _handleServer(server); |
| 89 return server.port; |
| 90 } catch (ignore) { |
| 91 return null; |
| 92 } |
| 75 } | 93 } |
| 76 | 94 |
| 77 /** | 95 /** |
| 78 * Handle a GET request received by the HTTP server. | 96 * Handle a GET request received by the HTTP server. |
| 79 */ | 97 */ |
| 80 void _handleGetRequest(HttpRequest request) { | 98 void _handleGetRequest(HttpRequest request) { |
| 81 if (getHandler == null) { | 99 if (getHandler == null) { |
| 82 if (socketServer.analysisServer.options.enableNewAnalysisDriver) { | 100 if (socketServer.analysisServer.options.enableNewAnalysisDriver) { |
| 83 getHandler = new GetHandler2(socketServer, _printBuffer); | 101 getHandler = new GetHandler2(socketServer, _printBuffer); |
| 84 } else { | 102 } else { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 104 _returnUnknownRequest(request); | 122 _returnUnknownRequest(request); |
| 105 } | 123 } |
| 106 }); | 124 }); |
| 107 } | 125 } |
| 108 | 126 |
| 109 /** | 127 /** |
| 110 * Handle an UPGRADE request received by the HTTP server by creating and | 128 * Handle an UPGRADE request received by the HTTP server by creating and |
| 111 * running an analysis server on a [WebSocket]-based communication channel. | 129 * running an analysis server on a [WebSocket]-based communication channel. |
| 112 */ | 130 */ |
| 113 void _handleWebSocket(WebSocket socket) { | 131 void _handleWebSocket(WebSocket socket) { |
| 132 // TODO(devoncarew): This serves the analysis server over a websocket |
| 133 // connection for historical reasons (and should probably be removed). |
| 114 socketServer.createAnalysisServer(new WebSocketServerChannel( | 134 socketServer.createAnalysisServer(new WebSocketServerChannel( |
| 115 socket, socketServer.instrumentationService)); | 135 socket, socketServer.instrumentationService)); |
| 116 } | 136 } |
| 117 | 137 |
| 118 /** | 138 /** |
| 119 * Return an error in response to an unrecognized request received by the HTTP | 139 * Return an error in response to an unrecognized request received by the HTTP |
| 120 * server. | 140 * server. |
| 121 */ | 141 */ |
| 122 void _returnUnknownRequest(HttpRequest request) { | 142 void _returnUnknownRequest(HttpRequest request) { |
| 123 HttpResponse response = request.response; | 143 HttpResponse response = request.response; |
| 124 response.statusCode = HttpStatus.NOT_FOUND; | 144 response.statusCode = HttpStatus.NOT_FOUND; |
| 125 response.headers.contentType = | 145 response.headers.contentType = |
| 126 new ContentType("text", "plain", charset: "utf-8"); | 146 new ContentType("text", "plain", charset: "utf-8"); |
| 127 response.write('Not found'); | 147 response.write('Not found'); |
| 128 response.close(); | 148 response.close(); |
| 129 } | 149 } |
| 130 } | 150 } |
| OLD | NEW |