ae59c7e055
R=brianwilkerson@google.com BUG= Review URL: https://codereview.chromium.org//314173003 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@37039 260f80e4-7a28-3924-810f-c04153c831b5
158 lines
5.1 KiB
Dart
158 lines
5.1 KiB
Dart
// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
library get.handler;
|
|
|
|
import 'dart:io';
|
|
|
|
import 'package:analysis_server/src/socket_server.dart';
|
|
|
|
/**
|
|
* Instances of the class [GetHandler] handle GET requests.
|
|
*/
|
|
class GetHandler {
|
|
/**
|
|
* The path used to request the status of the analysis server as a whole.
|
|
*/
|
|
static const String STATUS_PATH = '/status';
|
|
|
|
/**
|
|
* The socket server whose status is to be reported on.
|
|
*/
|
|
SocketServer _server;
|
|
|
|
/**
|
|
* Initialize a newly created handler for GET requests.
|
|
*/
|
|
GetHandler(SocketServer this._server);
|
|
|
|
/**
|
|
* Handle a GET request received by the HTTP server.
|
|
*/
|
|
void handleGetRequest(HttpRequest request) {
|
|
String path = request.uri.path;
|
|
if (path == STATUS_PATH) {
|
|
_returnServerStatus(request);
|
|
} else {
|
|
_returnUnknownRequest(request);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Return a response indicating the status of the analysis server.
|
|
*/
|
|
void _returnServerStatus(HttpRequest request) {
|
|
HttpResponse response = request.response;
|
|
response.statusCode = HttpStatus.OK;
|
|
response.headers.add(HttpHeaders.CONTENT_TYPE, "text/html");
|
|
response.write('<html>');
|
|
response.write('<head>');
|
|
response.write('<title>Dart Analysis Server - Status</title>');
|
|
response.write('</head>');
|
|
response.write('<body>');
|
|
response.write('<h1>Analysis Server</h1>');
|
|
if (_server.analysisServer == null) {
|
|
response.write('<p>Not running</p>');
|
|
} else {
|
|
response.write('<p>Running</p>');
|
|
response.write('<h1>Analysis Contexts</h1>');
|
|
response.write('<h2>Summary</h2>');
|
|
response.write('<table>');
|
|
_writeRow(
|
|
response,
|
|
['Context', 'ERROR', 'FLUSHED', 'IN_PROCESS', 'INVALID', 'VALID'],
|
|
true);
|
|
// TODO(scheglov) replace with using folder based contexts
|
|
// _server.analysisServer.contextMap.forEach((String key, AnalysisContext context) {
|
|
// AnalysisContentStatistics statistics =
|
|
// (context as AnalysisContextImpl).statistics;
|
|
// int errorCount = 0;
|
|
// int flushedCount = 0;
|
|
// int inProcessCount = 0;
|
|
// int invalidCount = 0;
|
|
// int validCount = 0;
|
|
// statistics.cacheRows.forEach((AnalysisContentStatistics_CacheRow row) {
|
|
// errorCount += row.errorCount;
|
|
// flushedCount += row.flushedCount;
|
|
// inProcessCount += row.inProcessCount;
|
|
// invalidCount += row.invalidCount;
|
|
// validCount += row.validCount;
|
|
// });
|
|
// _writeRow(response, [
|
|
// '<a href="#context_$key">$key</a>',
|
|
// errorCount,
|
|
// flushedCount,
|
|
// inProcessCount,
|
|
// invalidCount,
|
|
// validCount]);
|
|
// });
|
|
response.write('</table>');
|
|
// _server.analysisServer.contextMap.forEach((String key, AnalysisContext context) {
|
|
// response.write('<h2><a name="context_$key">Analysis Context: $key</a></h2>');
|
|
// AnalysisContentStatistics statistics = (context as AnalysisContextImpl).statistics;
|
|
// response.write('<table>');
|
|
// _writeRow(
|
|
// response,
|
|
// ['Item', 'ERROR', 'FLUSHED', 'IN_PROCESS', 'INVALID', 'VALID'],
|
|
// true);
|
|
// statistics.cacheRows.forEach((AnalysisContentStatistics_CacheRow row) {
|
|
// _writeRow(
|
|
// response,
|
|
// [row.name,
|
|
// row.errorCount,
|
|
// row.flushedCount,
|
|
// row.inProcessCount,
|
|
// row.invalidCount,
|
|
// row.validCount]);
|
|
// });
|
|
// response.write('</table>');
|
|
// List<CaughtException> exceptions = statistics.exceptions;
|
|
// if (!exceptions.isEmpty) {
|
|
// response.write('<h2>Exceptions</h2>');
|
|
// exceptions.forEach((CaughtException exception) {
|
|
// response.write('<p>${exception.exception}</p>');
|
|
// });
|
|
// }
|
|
// });
|
|
}
|
|
response.write('</body>');
|
|
response.write('</html>');
|
|
response.close();
|
|
}
|
|
|
|
/**
|
|
* Return an error in response to an unrecognized request received by the HTTP
|
|
* server.
|
|
*/
|
|
void _returnUnknownRequest(HttpRequest request) {
|
|
HttpResponse response = request.response;
|
|
response.statusCode = HttpStatus.NOT_FOUND;
|
|
response.headers.add(HttpHeaders.CONTENT_TYPE, "text/plain");
|
|
response.write('Not found');
|
|
response.close();
|
|
}
|
|
|
|
/**
|
|
* Write a single row within a table to the given [response] object. The row
|
|
* will have one cell for each of the [columns], and will be a header row if
|
|
* [header] is `true`.
|
|
*/
|
|
void _writeRow(HttpResponse response, List<Object> columns, [bool header = false]) {
|
|
if (header) {
|
|
response.write('<th>');
|
|
} else {
|
|
response.write('<tr>');
|
|
}
|
|
columns.forEach((Object value) {
|
|
response.write('<td>');
|
|
response.write(value);
|
|
response.write('</td>');
|
|
});
|
|
if (header) {
|
|
response.write('</th>');
|
|
} else {
|
|
response.write('</tr>');
|
|
}
|
|
}
|
|
} |