sendRequest<T> method

Future<T> sendRequest<T>(
  1. SendWebContext info
)

Implementation

Future<T> sendRequest<T>(SendWebContext info) async {
  Response? res = null;
  try {
    var req = await createRequest(info);

    if (urlFilter != null) {
      urlFilter!(req.url.toString());
    }

    var streamedRes = await client.send(req);
    res = await Response.fromStream(streamedRes);
  } on Exception catch (e) {
    Log.debug("sendRequest() createResponse: $e");
    return await handleError(null, e);
  }

  try {
    var response = await createResponse(res, info);
    return response;
  } on Exception catch (e) {
    var debug = Log.isDebugEnabled();
    if (debug) Log.debug("sendRequest(): statusCode:${res.statusCode}, $e");
    if (res.statusCode == 401) {
      if (refreshToken != null || useTokenCookie) {
        var jwtRequest = GetAccessToken(refreshToken: this.refreshToken);
        var url = refreshTokenUri ?? createUrlFromDto("POST", jwtRequest);

        var jwtInfo = SendWebContext(
            method: "POST", request: jwtRequest, args: null, url: url);
        try {
          var jwtReq = await createRequest(jwtInfo);
          var jwtStreamedRes = await client.send(jwtReq);
          var jwtRes = await Response.fromStream(jwtStreamedRes);
          var jwtResponse =
              await (createResponse<GetAccessTokenResponse>(jwtRes, jwtInfo)
                  as FutureOr<GetAccessTokenResponse>);
          bearerToken = jwtResponse.accessToken;
          if (debug) Log.debug("sendRequest(): bearerToken refreshed");
          return await _resendRequest<T>(info);
        } on Exception catch (jwtEx) {
          if (debug) Log.debug("sendRequest(): jwtEx: $jwtEx");
          return await handleError(
              res, jwtEx, WebServiceExceptionType.RefreshTokenException);
        }
      }

      if (onAuthenticationRequired != null) {
        await onAuthenticationRequired!();
        return await _resendRequest<T>(info);
      }
    }

    return await handleError(res, e);
  }
}