onResponse method
Called when the response is about to be resolved.
Implementation
@override
void onResponse(Response response, ResponseInterceptorHandler handler) {
try {
// Decrypt body
final decryptedBody = _decryptResponseBody(response.data);
if (decryptedBody != null) {
response.data = decryptedBody;
}
// Getting response token (from decrypted body or header)
String? responseToken;
final tokenSource = decryptedBody ?? response.data;
if (response.realUri.path.contains('/getMpinDetails') &&
tokenSource is Map &&
tokenSource['map'] is Map) {
final res = tokenSource['map'] as Map;
if (res['token'] != null) {
responseToken = res['token'].toString();
} else if (response.headers['token'] != null &&
response.headers['token']!.isNotEmpty) {
responseToken = response.headers['token']!.first;
}
} else {
if (tokenSource is Map && tokenSource['token'] != null) {
responseToken = tokenSource['token'].toString();
} else if (response.headers['token'] != null &&
response.headers['token']!.isNotEmpty) {
responseToken = response.headers['token']!.first;
}
}
// Decrypting response token for comparison
String? decryptedResponseToken = responseToken != null
? decryptString(encryptedText: responseToken)
: null;
if (decryptedResponseToken != null &&
decryptedResponseToken == expectedTokenValue) {
handler.next(response);
} else {
handler.reject(
DioException(
requestOptions: response.requestOptions,
error: 'TokenMismatchException',
message: 'Token does not match expected value',
response: response,
),
);
}
} catch (e) {
handler.reject(
DioException(
requestOptions: response.requestOptions,
error: 'TokenCheckException',
message: 'Error during token check: $e',
response: response,
),
);
}
}