package com.wouterbreukink.onedrive.client; import com.google.api.client.http.HttpRequest; import com.google.api.client.http.HttpResponse; import com.google.api.client.http.HttpStatusCodes; import com.google.api.client.http.HttpUnsuccessfulResponseHandler; import com.google.api.client.util.BackOff; import com.google.api.client.util.BackOffUtils; import com.google.api.client.util.ExponentialBackOff; import com.google.api.client.util.Sleeper; import com.wouterbreukink.onedrive.client.authoriser.AuthorisationProvider; import java.io.IOException; class OneDriveResponseHandler implements HttpUnsuccessfulResponseHandler { private final Sleeper sleeper = Sleeper.DEFAULT; private final BackOff backOff = new ExponentialBackOff(); private final AuthorisationProvider authoriser; public OneDriveResponseHandler(AuthorisationProvider authoriser) { this.authoriser = authoriser; } @Override public boolean handleResponse(HttpRequest request, HttpResponse response, boolean supportsRetry) throws IOException { if (!supportsRetry) { return false; } if (response.getStatusCode() == HttpStatusCodes.STATUS_CODE_UNAUTHORIZED) { authoriser.refresh(); return true; } // check if back-off is required for this response if (isRequired(response)) { try { return BackOffUtils.next(sleeper, backOff); } catch (InterruptedException exception) { // ignore } } return false; } public boolean isRequired(HttpResponse httpResponse) { return httpResponse.getStatusCode() / 100 == 5 || httpResponse.getStatusCode() == 429; } }