in github-label-notifier/symbolizer/lib/server.dart [24:75]
Future<void> serve(Object address, int port,
{@required Symbolizer symbolizer, @required Bot bot}) async {
final handlers = <String, _RequestHandler>{
'/symbolize': (issue) => symbolizer.symbolize(issue['body']),
'/command': (event) async {
final repoOrgMember = const {'MEMBER', 'OWNER'}
.contains(event['comment']['author_association']);
final commentEvent = IssueCommentEvent.fromJson(event);
final repo = RepositorySlug.full(event['repository']['full_name']);
await bot.executeCommand(repo, commentEvent.issue, commentEvent.comment,
authorized: repoOrgMember);
return {'status': 'ok'};
},
};
// Start the server.
final server = await HttpServer.bind(address, port);
_log.info('Listening on ${server.address}:${server.port}');
// Intentionally not processing requests in parallel to avoid racing
// in symbol cache.
await for (HttpRequest request in server) {
_log.info('Incoming request: ${request.method} ${request.requestedUri}');
final handler = handlers[request.requestedUri.path];
if (request.method != 'POST' || handler == null) {
request.response
..statusCode = 404
..write('Not found');
unawaited(request.response.close());
continue;
}
try {
final requestObj =
await utf8.decoder.bind(request).transform(json.decoder).first;
final responseJson = jsonEncode(await handler(requestObj));
request.response
..statusCode = HttpStatus.ok
..headers.add(HttpHeaders.contentTypeHeader, 'application/json')
..write(responseJson);
} catch (e, st) {
request.response
..statusCode = HttpStatus.internalServerError
..headers.add(HttpHeaders.contentTypeHeader, 'application/json')
..write(jsonEncode({
'status': 'error',
'message': e.toString(),
'stacktrace': st.toString(),
}));
}
unawaited(request.response.close());
}
}