send method

  1. @override
AWSHttpOperation<AWSBaseHttpResponse> send(
  1. AWSBaseHttpRequest request, {
  2. FutureOr<void> onCancel()?,
})
inherited

Sends request using the underlying HTTP protocol and returns the streaming response.

Implementation

@override
AWSHttpOperation send(
  AWSBaseHttpRequest request, {
  FutureOr<void> Function()? onCancel,
}) {
  final requestProgressController = StreamController<int>.broadcast();
  final responseProgressController = StreamController<int>.broadcast();
  // Inner request cancellation should happen before `onCancel` callback.
  final cancelTrigger = Completer<void>.sync();

  FutureOr<void> wrappedOnCancel() {
    _logger.verbose('onCancel triggered');
    requestProgressController.close();
    responseProgressController.close();
    cancelTrigger.complete();
    return onCancel?.call();
  }

  final completer = CancelableCompleter<AWSBaseHttpResponse>(
    onCancel: wrappedOnCancel,
  );
  final operation = AWSHttpOperation(
    completer.operation,
    onCancel: wrappedOnCancel,
    requestProgress: requestProgressController.stream,
    responseProgress: responseProgressController.stream,
  );

  Future<void>(() async {
    if (supportedProtocols.supports(AlpnProtocol.http2)) {
      if (request.scheme == 'https') {
        return _sendH2(
          request: request,
          logger: operation.logger,
          completer: completer,
          cancelTrigger: cancelTrigger,
          requestProgress: requestProgressController,
          responseProgress: responseProgressController,
        );
      }
      operation.logger.warn(
        'HTTP/2 does not support insecure "http://" requests',
      );
    }
    if (supportedProtocols.supports(AlpnProtocol.http1_1)) {
      return _sendH1(
        logger: operation.logger,
        request: request,
        completer: completer,
        cancelTrigger: cancelTrigger,
        requestProgress: requestProgressController,
        responseProgress: responseProgressController,
      );
    }
    completer.completeError(
      AWSHttpException(
        request,
        const SocketException('Unsupported protocol/scheme combination'),
      ),
    );
  }).catchError((Object e, StackTrace st) {
    completer.completeError(AWSHttpException(request, e), st);
  });

  return operation;
}