// 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? 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); }