send method

  1. @override
Future<StreamedResponse> send(
  1. BaseRequest request
)

Sends an HTTP request and asynchronously returns the response.

Implementers should call BaseRequest.finalize to get the body of the request as a ByteStream. They shouldn't make any assumptions about the state of the stream; it could have data written to it asynchronously at a later point, or it could already be closed when it's returned. Any internal HTTP errors should be wrapped as ClientExceptions.

Implementation

@override
Future<http.StreamedResponse> send(http.BaseRequest request) async {
  String? requestEventId;

  assert(() {
    final context = CausalityZone.currentContext();
    final event = CausalEvent(
      parentId: context?.eventId,
      type: CausalEventType.networkEvent,
      description: 'HTTP ${request.method} ${request.url.path}',
      metadata: {
        'method': request.method,
        'url': request.url.toString(),
        'path': request.url.path,
        'phase': 'request',
        'content_length': request.contentLength ?? 0,
      },
    );
    TrinityEventBus.instance.emit(event);
    requestEventId = event.id;
    return true;
  }());

  try {
    final response = await _inner.send(request);

    assert(() {
      TrinityEventBus.instance.emit(CausalEvent(
        parentId: requestEventId,
        type: CausalEventType.networkEvent,
        description:
            'HTTP ${response.statusCode} ${request.method} ${request.url.path}',
        metadata: {
          'method': request.method,
          'url': request.url.toString(),
          'path': request.url.path,
          'phase': 'response',
          'status_code': response.statusCode,
          'content_length': response.contentLength ?? 0,
        },
      ));
      return true;
    }());

    return response;
  } catch (error) {
    assert(() {
      TrinityEventBus.instance.emit(CausalEvent(
        parentId: requestEventId,
        type: CausalEventType.networkEvent,
        description: 'HTTP ERROR ${request.method} ${request.url.path}',
        metadata: {
          'method': request.method,
          'url': request.url.toString(),
          'path': request.url.path,
          'phase': 'error',
          'error_type': error.runtimeType.toString(),
          'error_message': error.toString(),
        },
      ));
      return true;
    }());
    rethrow;
  }
}