handleRequest method
- HttpRequest request
override
Handles an incoming HttpRequest.
Override this method to customize request handling, such as adding REST endpoints alongside WebSocket support, custom authentication, or request logging.
The default implementation filters connections using filterConnections, then upgrades the request to a WebSocket via handleWebSocketUpgrade.
Implementation
@override
Future<void> handleRequest(HttpRequest request) async {
// On /info, we show server info
if (request.uri.path == '/info') {
showPublicInfo(this, request);
return;
}
// Validate the Swamp protocol version on WebSocket upgrade requests.
final protocols = request.headers['Sec-WebSocket-Protocol'];
if (protocols != null && protocols.isNotEmpty) {
final requested = protocols
.expand((h) => h.split(','))
.map((p) => p.trim())
.toList();
final match = requested.firstWhereOrNull((p) {
final v = parseSwampSubprotocol(p);
return v != null && kSwampSupportedProtocols.contains(v);
});
if (match == null) {
log(
'Client requested unsupported protocol(s): $requested',
LogLevel.warning,
);
request.response.statusCode = HttpStatus.badRequest;
request.response.headers.contentType = ContentType.json;
request.response.write(
jsonEncode({
'error': 'unsupported_protocol',
'supported': kSwampSupportedProtocols
.map((v) => swampSubprotocol(v))
.toList(),
}),
);
request.response.close();
return;
}
}
return super.handleRequest(request);
}