handleError method
Future<void>
handleError(
- DioError e,
- ErrorInterceptorHandler handler
)
Implementation
Future<void> handleError(DioError e, ErrorInterceptorHandler handler) async {
try {
var dio2 = Dio();
final prefs = await SharedPreferences.getInstance();
var rt = prefs.getString(prefixRefreshToken);
var ua = prefs.getString("ua");
final info = await PackageInfo.fromPlatform();
//check enc
Map<String, Object?>? keySet;
var headers = {
"User-Agent": ua,
"x-app-id": info.packageName,
"accept": defaultType,
Headers.contentTypeHeader: defaultType
};
var dataRefresh = {"refreshToken": rt};
//check enc
if (commonEncMode) {
keySet = await payloadEnc.generateKeyPair();
var encryptData = await payloadEnc.encryptData(dataRefresh, keySet);
var newPayload = {"cipherText": encryptData};
dataRefresh = newPayload;
final base64Str = buildEncKeyHeader(keySet);
headers = {...headers, encryptionKeyLabel: base64Str};
}
var response = await dio2.request(
appUrl + "/services/auth",
data: dataRefresh,
options: Options(method: "PATCH", headers: headers),
);
// print(response.requestOptions);
// print(response);
//check enc
if (commonEncMode) {
var ct = chiperType.fromJson(response.data);
// print(ct.cipherText);
var decrypt = await payloadEnc.decryptData(ct.cipherText!, keySet!);
var jsondecode = json.decode(decrypt);
response.data = jsondecode;
}
var res = RefreshTokenResponse.fromJson(response.data);
//set new token & expiry
prefs.setString(prefixRefreshToken, res.data!.attributes!.refreshToken!);
prefs.setString(prefixAccessToken, res.data!.attributes!.accessToken!);
prefs.setString(prefixExpiryToken, res.data!.attributes!.expiry!);
var atNew = res.data!.attributes!.accessToken!;
//retry new request
//set bearer
e.requestOptions.headers["Authorization"] = "Bearer " + atNew;
//create request with new access token
final opts = new Options(
method: e.requestOptions.method, headers: e.requestOptions.headers);
final cloneReq = await dio.request(e.requestOptions.path,
options: opts,
data: e.requestOptions.data,
queryParameters: e.requestOptions.queryParameters);
return handler.resolve(cloneReq);
} on DioError catch (e) {
// print(e.message);
// print("ERROR--HANDLE");
var title = e.response!.data["errors"]![0];
if (title["code"] == "IVREF") {
var evtCb = opts!.options?.eventCallback;
evtCb({"name": "invalid_refresh_token"});
}
handler.reject(e);
}
}