handleHttpRequest method
Main entry point to handle an incoming HTTP request.
Returns true if this server handled the request, false otherwise.
Implementation
Future<bool> handleHttpRequest(HttpRequest request) async {
// Route only requests that match our path
if (request.uri.path != path) return false;
webhookLogger.info(
'received request ${request.uri} ${request.method}, '
'upgrade: ${request.headers.value('Connection')}',
);
try {
final Map<String, dynamic> req = await _parseRequestBody(request);
final event = req['event'];
final data = req['data'];
// Validate the webhook secret / signature if required
if (validateWebhookSecret) {
await _validateSignature(request, req);
}
// WebSocket path
/*if (_isWebSocketUpgrade(request) && supportsWebSockets) {
if (event != 'room.call') {
webhookLogger.warning(
'received invalid event on websocket $req (expected room.call)');
_badRequest(request);
return true;
}
final websocket = await WebSocketTransformer.upgrade(request);
// Equivalent to aiohttp WebSocketResponse + WebSocketServerProtocol
final protocol = WebSocketServerProtocol(
socket: websocket,
token: data['token'] as String,
url: data['room_url'] as String,
);
await RoomClient.withServerProtocol(protocol, (room) async {
await onCallAnswered(room);
webhookLogger.fine('connected to room');
await room.protocol.waitForClose();
});
return true;
} else {*/
// Plain HTTP webhook
webhookLogger.fine('received webhook event=$event data=$data');
await onWebhook(payload: req);
request.response.statusCode = HttpStatus.ok;
request.response.headers.contentType = ContentType.json;
request.response.write(jsonEncode({'ok': true}));
await request.response.close();
return true;
//}
} on HttpException catch (e, st) {
webhookLogger.warning('bad request: $e', e, st);
request.response.statusCode = HttpStatus.badRequest;
await request.response.close();
return true;
} on WebSocketException {
// If upgrade failed, just rethrow – outer layer decides what to do.
rethrow;
} on Exception catch (ex, st) {
webhookLogger.severe(
'unable to establish connection to agent $ex',
ex,
st,
);
request.response.statusCode = HttpStatus.internalServerError;
await request.response.close();
return true;
}
}