handleHttpRequest method

Future<bool> handleHttpRequest(
  1. HttpRequest request
)

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;
  }
}