send method
AWSHttpOperation<AWSBaseHttpResponse>
send(
- AWSBaseHttpRequest request, {
- 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;
}