diff options
Diffstat (limited to 'libs/networking/WordPressNetworking/src/main/java/org/wordpress/android/networking/AuthenticatorRequest.java')
-rw-r--r-- | libs/networking/WordPressNetworking/src/main/java/org/wordpress/android/networking/AuthenticatorRequest.java | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/libs/networking/WordPressNetworking/src/main/java/org/wordpress/android/networking/AuthenticatorRequest.java b/libs/networking/WordPressNetworking/src/main/java/org/wordpress/android/networking/AuthenticatorRequest.java new file mode 100644 index 000000000..40d2af7f3 --- /dev/null +++ b/libs/networking/WordPressNetworking/src/main/java/org/wordpress/android/networking/AuthenticatorRequest.java @@ -0,0 +1,96 @@ +package org.wordpress.android.networking; + +import com.android.volley.VolleyError; +import com.wordpress.rest.Oauth; +import com.wordpress.rest.RestClient; +import com.wordpress.rest.RestRequest; +import com.wordpress.rest.RestRequest.ErrorListener; + +/** + * Encapsulates the behaviour for asking the Authenticator for an access token. This + * allows the request maker to disregard the authentication state when making requests. + */ +public class AuthenticatorRequest { + private RestRequest mRequest; + private RestRequest.ErrorListener mListener; + private RestClient mRestClient; + private Authenticator mAuthenticator; + + protected AuthenticatorRequest(RestRequest request, ErrorListener listener, RestClient restClient, + Authenticator authenticator) { + mRequest = request; + mListener = listener; + mRestClient = restClient; + mAuthenticator = authenticator; + } + + public String getSiteId() { + return extractSiteIdFromUrl(mRestClient.getEndpointURL(), mRequest.getUrl()); + } + + /** + * Parse out the site ID from an URL. + * Note: For batch REST API calls, only the first siteID is returned + * + * @return The site ID + */ + public static String extractSiteIdFromUrl(String restEndpointUrl, String url) { + if (url == null) { + return null; + } + + final String sitePrefix = restEndpointUrl.endsWith("/") ? restEndpointUrl + "sites/" : restEndpointUrl + "/sites/"; + final String batchCallPrefix = restEndpointUrl.endsWith("/") ? restEndpointUrl + "batch/?urls%5B%5D=%2Fsites%2F" + : restEndpointUrl + "/batch/?urls%5B%5D=%2Fsites%2F"; + + if (url.startsWith(sitePrefix) && !sitePrefix.equals(url)) { + int marker = sitePrefix.length(); + if (url.indexOf("/", marker) < marker) { + return null; + } + return url.substring(marker, url.indexOf("/", marker)); + } else if (url.startsWith(batchCallPrefix) && !batchCallPrefix.equals(url)) { + int marker = batchCallPrefix.length(); + if (url.indexOf("%2F", marker) < marker) { + return null; + } + return url.substring(marker, url.indexOf("%2F", marker)); + } + + // not a sites/$siteId request or a batch request + return null; + } + + /** + * Attempt to send the request, checks to see if we have an access token and if not + * asks the Authenticator to authenticate the request. + * + * If no Authenticator is provided the request is always sent. + */ + protected void send(){ + if (mAuthenticator == null) { + mRestClient.send(mRequest); + } else { + mAuthenticator.authenticate(this); + } + } + + public void sendWithAccessToken(String token){ + mRequest.setAccessToken(token); + mRestClient.send(mRequest); + } + + public void sendWithAccessToken(Oauth.Token token){ + sendWithAccessToken(token.toString()); + } + + /** + * If an access token cannot be obtained the request can be aborted and the + * handler's onFailure method is called + */ + public void abort(VolleyError error){ + if (mListener != null) { + mListener.onErrorResponse(error); + } + } +} |