/*
* 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);
}
}
}