send method
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;
}
}