package com.kickstarter.services.interceptors; import android.net.Uri; import android.support.annotation.NonNull; import com.kickstarter.libs.AndroidPayCapability; import com.kickstarter.libs.Build; import com.kickstarter.libs.CurrentUserType; import com.kickstarter.libs.InternalToolsType; import com.kickstarter.services.KSUri; import java.io.IOException; import okhttp3.Interceptor; import okhttp3.Request; import okhttp3.Response; import static com.kickstarter.libs.utils.ObjectUtils.isNotNull; /** * Interceptor for web requests to Kickstarter, not API requests. Used by web views and the web client. */ public final class WebRequestInterceptor implements Interceptor { private final @NonNull CurrentUserType currentUser; private final @NonNull String endpoint; private final @NonNull InternalToolsType internalTools; private final @NonNull Build build; private final @NonNull AndroidPayCapability androidPayCapability; public WebRequestInterceptor(final @NonNull CurrentUserType currentUser, final @NonNull String endpoint, final InternalToolsType internalTools, final @NonNull Build build, final @NonNull AndroidPayCapability androidPayCapability) { this.currentUser = currentUser; this.endpoint = endpoint; this.internalTools = internalTools; this.build = build; this.androidPayCapability = androidPayCapability; } @Override public Response intercept(final @NonNull Chain chain) throws IOException { return chain.proceed(request(chain.request())); } private Request request(final @NonNull Request initialRequest) { if (!shouldIntercept(initialRequest)) { return initialRequest; } final Request.Builder requestBuilder = initialRequest.newBuilder() .header("User-Agent", userAgent()); final String basicAuthorizationHeader = internalTools.basicAuthorizationHeader(); if (currentUser.exists()) { requestBuilder.addHeader("Authorization", "token " + currentUser.getAccessToken()); } else if (shouldAddBasicAuthorizationHeader(initialRequest) && isNotNull(basicAuthorizationHeader)) { requestBuilder.addHeader("Authorization", basicAuthorizationHeader); } if (androidPayCapability.isCapable()) { requestBuilder.addHeader("Kickstarter-Android-Pay", "1"); } return requestBuilder.build(); } private boolean shouldIntercept(final @NonNull Request request) { return KSUri.isWebUri(Uri.parse(request.url().toString()), endpoint); } private boolean shouldAddBasicAuthorizationHeader(final @NonNull Request request) { if (currentUser.exists()) { return false; } final Uri initialRequestUri = Uri.parse(request.url().toString()); return KSUri.isHivequeenUri(initialRequestUri, endpoint) || KSUri.isStagingUri(initialRequestUri, endpoint); } private @NonNull String userAgent() { // TODO: Check whether device is mobile or tablet, append to user agent return new StringBuilder() .append("Kickstarter Android Mobile Variant/") .append(build.variant()) .append(" Code/") .append(build.versionCode()) .append(" Version/") .append(build.versionName()) .toString(); } }