executeRequest<RequestType extends DeekWebRequest, ResponseType> method
Future<DeekWebResponse<RequestType, ResponseType> >
executeRequest<RequestType extends DeekWebRequest, ResponseType>(
- DeekWebRequest<
ResponseType> request
Executes a DeekWebRequest asynchronously.
Implementation
Future<DeekWebResponse<RequestType, ResponseType>>
executeRequest<RequestType extends DeekWebRequest, ResponseType>(
DeekWebRequest<ResponseType> request) async {
// Generate a new CV and notify listeners.
// TODO: Optionally pass in the CV with the request.
String requestId = const Uuid().v4().toString();
_notifyRequestStarted(requestId, request.name);
var latencyTimer = Stopwatch();
latencyTimer.start();
late DeekWebResponse<RequestType, ResponseType> result;
try {
_logger?.info(
"DeekWebClient: [$requestId] Starting ${request.method} request ${request.name} to ${request.uriForLogging}");
// Execute the request and mark the time
var response = await _executeRequest(request, requestId);
int httpTime = latencyTimer.elapsedMilliseconds;
_logger?.verbose(
"DeekWebClient: [$requestId] http time: $httpTime ms, response code ${response.statusCode}");
// Handle the response, including parsing it to the <ResponseType>
result = _handleResponse(response, request, latencyTimer, requestId);
int parseTime = latencyTimer.elapsedMilliseconds - httpTime;
_logger?.verbose("DeekWebClient: [$requestId] parse time: $parseTime ms");
// Notify listeners that the request is complete
_logger?.verbose(
"DeekWebClient: [$requestId] Completed ${request.name} in ${result.latencyMs} ms");
_notifyRequestCompleted(requestId, response.statusCode);
} on SocketException catch (e) {
// SocketException typically happens when there is no / broken network
// connection.
_logger?.error("DeekWebClient: [$requestId] SocketException: $e");
result = DeekWebResponse.fromError(
request: request, exception: DeekWebException.fromException(e));
_notifyRequestError(requestId, error: "SocketException");
} on ClientException catch (e) {
// ClientException is thrown by web when there is no / broken network
// connection.
_logger?.error("DeekWebClient: [$requestId] ClientException: $e");
result = DeekWebResponse.fromError(
request: request, exception: DeekWebException.fromException(e));
_notifyRequestError(requestId, error: "ClientException");
}
return result;
}