/* * Copyright 2014-2015 GameUp * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package io.gameup.android.http; import android.net.Uri; import com.squareup.okhttp.MediaType; import com.squareup.okhttp.Request; import com.squareup.okhttp.RequestBody; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URL; import io.gameup.android.GameUp; import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.NonNull; import okio.ByteString; /** * Utility class that provides convenient pre-configured connection creation. */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class RequestFactory { /** User Agent string to be used in API calls. */ private final static String REQUEST_USER_AGENT = GameUp.USER_AGENT_TEMPLATE.replace( GameUp._WEBVIEW_USER_AGENT_, System.getProperty("http.agent")); /** Standard media type to use with all requests. */ private static final MediaType APPLICATION_JSON_MEDIA_TYPE = MediaType.parse("application/json"); /** * Prepare a HEAD request to the given path. * * @param uri The URL string to connect to. * @param apiKey The API key to use for authentication. * @return A Request ready to be sent via a OkHttpClient. */ public static Request head(final @NonNull Uri uri, final @NonNull String apiKey) { return head(uri, apiKey, ""); } /** * Prepare a HEAD request to the given path. * * @param uri The URL string to connect to. * @param apiKey The API key to use for authentication. * @param token The gamer token to use for authentication. * @return A Request ready to be sent via a OkHttpClient. */ public static Request head(final @NonNull Uri uri, final @NonNull String apiKey, final @NonNull String token) { return create(uri, apiKey, token) .head() .build(); } /** * Prepare a GET request to the given path. * * @param uri The URL string to connect to. * @param apiKey The API key to use for authentication. * @return A Request ready to be sent via a OkHttpClient. */ public static Request get(final @NonNull Uri uri, final @NonNull String apiKey) { return get(uri, apiKey, ""); } /** * Prepare a GET request to the given path. * * @param uri The URL string to connect to. * @param apiKey The API key to use for authentication. * @param token The gamer token to use for authentication. * @return A Request ready to be sent via a OkHttpClient. */ public static Request get(final @NonNull Uri uri, final @NonNull String apiKey, final @NonNull String token) { return create(uri, apiKey, token) .get() .build(); } /** * Prepare a PUT request to the given path with the given data. * * @param uri The URL string to connect to. * @param apiKey The API key to use for authentication. * @param token The gamer token to use for authentication. * @return A Request ready to be sent via a OkHttpClient. */ public static Request put(final @NonNull Uri uri, final @NonNull String apiKey, final @NonNull String token, final @NonNull String body) { try { return create(uri, apiKey, token) .put(RequestBody.create(APPLICATION_JSON_MEDIA_TYPE, body.getBytes("UTF-8"))) .build(); } catch(final UnsupportedEncodingException e) { // No UTF-8 support? throw new RuntimeException(e); } } /** * Prepare a POST request to the given path with the given data. * * @param uri The URL string to connect to. * @param apiKey The API key to use for authentication. * @return A Request ready to be sent via a OkHttpClient. */ public static Request post(final @NonNull Uri uri, final @NonNull String apiKey, final @NonNull String body) { return post(uri, apiKey, "", body); } /** * Prepare a POST request to the given path with the given data. * * @param uri The URL string to connect to. * @param apiKey The API key to use for authentication. * @param token The gamer token to use for authentication. * @return A Request ready to be sent via a OkHttpClient. */ public static Request post(final @NonNull Uri uri, final @NonNull String apiKey, final @NonNull String token, final @NonNull String body) { try { return create(uri, apiKey, token) .post(RequestBody.create(APPLICATION_JSON_MEDIA_TYPE, body.getBytes("UTF-8"))) .build(); } catch(final UnsupportedEncodingException e) { // No UTF-8 support? throw new RuntimeException(e); } } /** * Prepare a PATCH request to the given path with the given data. * * @param uri The URL string to connect to. * @param apiKey The API key to use for authentication. * @return A Request ready to be sent via a OkHttpClient. */ public static Request patch(final @NonNull Uri uri, final @NonNull String apiKey, final @NonNull String body) { return patch(uri, apiKey, "", body); } /** * Prepare a PATCH request to the given path with the given data. * * @param uri The URL string to connect to. * @param apiKey The API key to use for authentication. * @param token The gamer token to use for authentication. * @return A Request ready to be sent via a OkHttpClient. */ public static Request patch(final @NonNull Uri uri, final @NonNull String apiKey, final @NonNull String token, final @NonNull String body) { try { return create(uri, apiKey, token) .patch(RequestBody.create(APPLICATION_JSON_MEDIA_TYPE, body.getBytes("UTF-8"))) .build(); } catch(final UnsupportedEncodingException e) { // No UTF-8 support? throw new RuntimeException(e); } } /** * Prepare a DELETE request to the given path. * * @param uri The URL string to connect to. * @param apiKey The API key to use for authentication. * @param token The gamer token to use for authentication. * @return A Request ready to be sent via a OkHttpClient. */ public static Request delete(final @NonNull Uri uri, final @NonNull String apiKey, final @NonNull String token) { return create(uri, apiKey, token) .delete() .build(); } /** * Return a builder configured with all common headers and options. * * @param uri The URL string to connect to. * @param apiKey The API key to use for authentication. * @param token The gamer token to use for authentication. * @return A Request.Builder with only the method (and optionally request * body) to be set before use. */ private static Request.Builder create(final @NonNull Uri uri, final @NonNull String apiKey, final @NonNull String token) { try { return new Request.Builder() .url(new URL(uri.toString())) .header("User-Agent", REQUEST_USER_AGENT) .header("Content-Type", "application/json") .header("Accept", "application/json") .header("Authorization", "Basic " + ByteString.of( (apiKey + ":" + token).getBytes("ISO-8859-1")) .base64()); } catch(final IOException e) { throw new RuntimeException(e); } } }