handleRequest method

  1. @override
Future<void> handleRequest(
  1. 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);
}