handle method

Handles one already-bounded platform-neutral HTTP request.

Implementation

Future<AcpHttpResponse> handle(AcpHttpRequest request) async {
  if (_isClosed) {
    return _text('ACP server is closed', 503);
  }
  final AcpHttpRequestPolicy? policy = _requestPolicy;
  if (policy != null) {
    final Future<bool> decision = Future<bool>.sync(() => policy(request));
    decision.ignore();
    try {
      final bool allowed = await _raceCancellation(
        decision,
        request.cancellationToken,
      ).timeout(_limits.initializeTimeout);
      if (!allowed) {
        return _text('Forbidden', 403);
      }
    } on _RequestAborted {
      return _text('Request aborted', 499);
    } on Object {
      return _text('Forbidden', 403);
    }
  }
  if (_isClosed) {
    return _text('ACP server is closed', 503);
  }
  return switch (request.method.toUpperCase()) {
    'POST' => _handlePost(request),
    'GET' => _handleGet(request),
    'DELETE' => _handleDelete(request),
    _ => _text('Method Not Allowed', 405),
  };
}