blob: dd26a48a00633f4c73f1b173570accf03e7cf5cd [file] [log] [blame]
// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:async';
import 'base_request.dart';
import 'client.dart';
import 'exception.dart';
import 'streamed_response.dart';
/// An HTTP request that can be aborted before it completes.
abstract mixin class Abortable implements BaseRequest {
/// Completion of this future aborts this request (if the client supports
/// abortion).
///
/// Requests/responses may be aborted at any time during their lifecycle.
///
/// * If completed before the request has been finalized and sent,
/// [Client.send] completes with [RequestAbortedException].
/// * If completed after the response headers are available, or whilst
/// streaming the response, clients inject [RequestAbortedException] into
/// the [StreamedResponse.stream] then close the stream.
/// * If completed after the response is fully complete, there is no effect.
///
/// A common pattern is aborting a request when another event occurs (such as
/// a user action): use a [Completer] to implement this. To implement a
/// timeout (to abort the request after a set time has elapsed), use
/// [Future.delayed].
///
/// This future must not complete with an error.
///
/// Some clients may not support abortion, or may not support this trigger.
abstract final Future<void>? abortTrigger;
}
/// Thrown when an HTTP request is aborted.
///
/// This exception is triggered when [Abortable.abortTrigger] completes.
class RequestAbortedException extends ClientException {
RequestAbortedException([Uri? uri])
: super('Request aborted by `abortTrigger`', uri);
}