正在查看: Perplexity v2.48.1 应用的 HTTPClient.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
正在查看: Perplexity v2.48.1 应用的 HTTPClient.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
package com.revenuecat.purchases.common;
import android.os.Build;
import com.google.firebase.perf.network.FirebasePerfUrlConnection;
import com.revenuecat.purchases.Store;
import com.revenuecat.purchases.VerificationResult;
import com.revenuecat.purchases.common.diagnostics.DiagnosticsTracker;
import com.revenuecat.purchases.common.networking.ETagManager;
import com.revenuecat.purchases.common.networking.Endpoint;
import com.revenuecat.purchases.common.networking.HTTPRequest;
import com.revenuecat.purchases.common.networking.HTTPResult;
import com.revenuecat.purchases.common.networking.MapConverter;
import com.revenuecat.purchases.common.networking.RCHTTPStatusCodes;
import com.revenuecat.purchases.common.verification.SigningManager;
import com.revenuecat.purchases.interfaces.StorefrontProvider;
import com.revenuecat.purchases.utils.MapExtensionsKt;
import gm.i;
import gm.j;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
import kotlin.KotlinVersion;
import kotlin.Metadata;
import kotlin.Pair;
import kotlin.collections.MapsKt;
import kotlin.io.TextStreamsKt;
import kotlin.jvm.internal.DefaultConstructorMarker;
import kotlin.jvm.internal.Intrinsics;
import kotlin.jvm.internal.SourceDebugExtension;
import kotlin.time.Duration;
import org.json.JSONObject;
@Metadata(d1 = {"\u0000²\u0001\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0004\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\u000e\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010$\n\u0002\b\u0003\n\u0002\u0010\u000b\n\u0002\b\u0005\n\u0002\u0018\u0002\n\u0002\b\u0003\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0010 \n\u0002\u0018\u0002\n\u0002\b\t\n\u0002\u0018\u0002\n\u0002\b\u0005\b\u0000\u0018\u0000 L2\u00020\u0001:\u0001LBM\u0012\u0006\u0010\u0002\u001a\u00020\u0003\u0012\u0006\u0010\u0004\u001a\u00020\u0005\u0012\b\u0010\u0006\u001a\u0004\u0018\u00010\u0007\u0012\u0006\u0010\b\u001a\u00020\t\u0012\u0006\u0010\n\u001a\u00020\u000b\u0012\b\b\u0002\u0010\f\u001a\u00020\r\u0012\b\b\u0002\u0010\u000e\u001a\u00020\u000f\u0012\b\b\u0002\u0010\u0010\u001a\u00020\u0011¢\u0006\u0002\u0010\u0012J\u0010\u0010\u0015\u001a\u00020\u00162\u0006\u0010\u0017\u001a\u00020\u0018H\u0002J\u0010\u0010\u0015\u001a\u00020\u00192\u0006\u0010\u001a\u001a\u00020\u001bH\u0002J\u0006\u0010\u001c\u001a\u00020\u001dJ\u0010\u0010\u001e\u001a\u00020\u001f2\u0006\u0010 \u001a\u00020!H\u0002J\u0018\u0010\"\u001a\n $*\u0004\u0018\u00010#0#2\u0006\u0010%\u001a\u00020&H\u0002JT\u0010'\u001a\u000e\u0012\u0004\u0012\u00020#\u0012\u0004\u0012\u00020#0(2\u0012\u0010)\u001a\u000e\u0012\u0004\u0012\u00020#\u0012\u0004\u0012\u00020#0(2\u0006\u0010*\u001a\u00020#2\u0006\u0010+\u001a\u00020,2\b\u0010-\u001a\u0004\u0018\u00010#2\u0006\u0010.\u001a\u00020,2\b\u0010/\u001a\u0004\u0018\u00010#H\u0002J\u0012\u00100\u001a\u0004\u0018\u00010\u00182\u0006\u0010%\u001a\u00020\u001fH\u0002J\u0012\u00101\u001a\u0004\u0018\u0001022\u0006\u0010%\u001a\u00020&H\u0002J\u0012\u00103\u001a\u0004\u0018\u00010#2\u0006\u0010%\u001a\u00020&H\u0002J\b\u00104\u001a\u00020#H\u0002Jj\u00105\u001a\u0004\u0018\u0001062\u0006\u00107\u001a\u0002082\u0006\u00109\u001a\u00020:2\u0016\u0010;\u001a\u0012\u0012\u0004\u0012\u00020#\u0012\u0006\u0012\u0004\u0018\u00010\u0001\u0018\u00010(2\u001a\u0010<\u001a\u0016\u0012\u0010\u0012\u000e\u0012\u0004\u0012\u00020#\u0012\u0004\u0012\u00020#0>\u0018\u00010=2\u0012\u0010?\u001a\u000e\u0012\u0004\u0012\u00020#\u0012\u0004\u0012\u00020#0(2\u0006\u0010+\u001a\u00020,H\u0002Jh\u0010@\u001a\u0002062\u0006\u00107\u001a\u0002082\u0006\u00109\u001a\u00020:2\u0016\u0010;\u001a\u0012\u0012\u0004\u0012\u00020#\u0012\u0006\u0012\u0004\u0018\u00010\u0001\u0018\u00010(2\u001a\u0010<\u001a\u0016\u0012\u0010\u0012\u000e\u0012\u0004\u0012\u00020#\u0012\u0004\u0012\u00020#0>\u0018\u00010=2\u0012\u0010?\u001a\u000e\u0012\u0004\u0012\u00020#\u0012\u0004\u0012\u00020#0(2\b\b\u0002\u0010+\u001a\u00020,J\u0010\u0010A\u001a\u00020#2\u0006\u0010\u0017\u001a\u00020\u0018H\u0002J2\u0010B\u001a\u00020\u001d2\u0006\u00109\u001a\u00020:2\u0006\u0010C\u001a\u0002022\u0006\u0010D\u001a\u00020,2\b\u0010E\u001a\u0004\u0018\u0001062\u0006\u0010F\u001a\u00020,H\u0002J6\u0010G\u001a\u00020H2\u0006\u0010*\u001a\u00020#2\u0006\u0010%\u001a\u00020&2\b\u0010I\u001a\u0004\u0018\u00010#2\b\u0010-\u001a\u0004\u0018\u00010#2\b\u0010/\u001a\u0004\u0018\u00010#H\u0002J\u0018\u0010J\u001a\u00020\u001d2\u0006\u0010K\u001a\u00020\u00192\u0006\u0010;\u001a\u00020#H\u0002R\u000e\u0010\u0002\u001a\u00020\u0003X\u0082\u0004¢\u0006\u0002\n\u0000R\u000e\u0010\f\u001a\u00020\rX\u0082\u0004¢\u0006\u0002\n\u0000R\u0010\u0010\u0006\u001a\u0004\u0018\u00010\u0007X\u0082\u0004¢\u0006\u0002\n\u0000R\u000e\u0010\u0004\u001a\u00020\u0005X\u0082\u0004¢\u0006\u0002\n\u0000R\u000e\u0010\u0010\u001a\u00020\u0011X\u0082\u0004¢\u0006\u0002\n\u0000R\u000e\u0010\u000e\u001a\u00020\u000fX\u0082\u0004¢\u0006\u0002\n\u0000R\u0011\u0010\b\u001a\u00020\t¢\u0006\b\n\u0000\u001a\u0004\b\u0013\u0010\u0014R\u000e\u0010\n\u001a\u00020\u000bX\u0082\u0004¢\u0006\u0002\n\u0000¨\u0006M"}, d2 = {"Lcom/revenuecat/purchases/common/HTTPClient;", "", "appConfig", "Lcom/revenuecat/purchases/common/AppConfig;", "eTagManager", "Lcom/revenuecat/purchases/common/networking/ETagManager;", "diagnosticsTrackerIfEnabled", "Lcom/revenuecat/purchases/common/diagnostics/DiagnosticsTracker;", "signingManager", "Lcom/revenuecat/purchases/common/verification/SigningManager;", "storefrontProvider", "Lcom/revenuecat/purchases/interfaces/StorefrontProvider;", "dateProvider", "Lcom/revenuecat/purchases/common/DateProvider;", "mapConverter", "Lcom/revenuecat/purchases/common/networking/MapConverter;", "localeProvider", "Lcom/revenuecat/purchases/common/LocaleProvider;", "(Lcom/revenuecat/purchases/common/AppConfig;Lcom/revenuecat/purchases/common/networking/ETagManager;Lcom/revenuecat/purchases/common/diagnostics/DiagnosticsTracker;Lcom/revenuecat/purchases/common/verification/SigningManager;Lcom/revenuecat/purchases/interfaces/StorefrontProvider;Lcom/revenuecat/purchases/common/DateProvider;Lcom/revenuecat/purchases/common/networking/MapConverter;Lcom/revenuecat/purchases/common/LocaleProvider;)V", "getSigningManager", "()Lcom/revenuecat/purchases/common/verification/SigningManager;", "buffer", "Ljava/io/BufferedReader;", "inputStream", "Ljava/io/InputStream;", "Ljava/io/BufferedWriter;", "outputStream", "Ljava/io/OutputStream;", "clearCaches", "", "getConnection", "Ljava/net/HttpURLConnection;", "request", "Lcom/revenuecat/purchases/common/networking/HTTPRequest;", "getETagHeader", "", "kotlin.jvm.PlatformType", "connection", "Ljava/net/URLConnection;", "getHeaders", "", "authenticationHeaders", "urlPath", "refreshETag", "", "nonce", "shouldSignResponse", "postFieldsToSignHeader", "getInputStream", "getRequestDateHeader", "Ljava/util/Date;", "getRequestTimeHeader", "getXPlatformHeader", "performCall", "Lcom/revenuecat/purchases/common/networking/HTTPResult;", "baseURL", "Ljava/net/URL;", "endpoint", "Lcom/revenuecat/purchases/common/networking/Endpoint;", "body", "postFieldsToSign", "", "Lkotlin/Pair;", "requestHeaders", "performRequest", "readFully", "trackHttpRequestPerformedIfNeeded", "requestStartTime", "callSuccessful", "callResult", "isRetry", "verifyResponse", "Lcom/revenuecat/purchases/VerificationResult;", "payload", "writeFully", "writer", "Companion", "purchases_defaultsRelease"}, k = 1, mv = {1, 8, 0}, xi = 48)
@SourceDebugExtension
public final class HTTPClient {
public static final int NO_STATUS_CODE = -1;
private final AppConfig appConfig;
private final DateProvider dateProvider;
private final DiagnosticsTracker diagnosticsTrackerIfEnabled;
private final ETagManager eTagManager;
private final LocaleProvider localeProvider;
private final MapConverter mapConverter;
private final SigningManager signingManager;
private final StorefrontProvider storefrontProvider;
@Metadata(k = 3, mv = {1, 8, 0}, xi = 48)
public class WhenMappings {
public static final int[] $EnumSwitchMapping$0;
static {
int[] iArr = new int[Store.values().length];
try {
iArr[Store.AMAZON.ordinal()] = 1;
} catch (NoSuchFieldError unused) {
}
$EnumSwitchMapping$0 = iArr;
}
}
public HTTPClient(AppConfig appConfig, ETagManager eTagManager, DiagnosticsTracker diagnosticsTracker, SigningManager signingManager, StorefrontProvider storefrontProvider, DateProvider dateProvider, MapConverter mapConverter, LocaleProvider localeProvider) {
Intrinsics.h(appConfig, "appConfig");
Intrinsics.h(eTagManager, "eTagManager");
Intrinsics.h(signingManager, "signingManager");
Intrinsics.h(storefrontProvider, "storefrontProvider");
Intrinsics.h(dateProvider, "dateProvider");
Intrinsics.h(mapConverter, "mapConverter");
Intrinsics.h(localeProvider, "localeProvider");
this.appConfig = appConfig;
this.eTagManager = eTagManager;
this.diagnosticsTrackerIfEnabled = diagnosticsTracker;
this.signingManager = signingManager;
this.storefrontProvider = storefrontProvider;
this.dateProvider = dateProvider;
this.mapConverter = mapConverter;
this.localeProvider = localeProvider;
}
private final BufferedReader buffer(InputStream inputStream) {
return new BufferedReader(new InputStreamReader(inputStream));
}
private final HttpURLConnection getConnection(HTTPRequest request) {
URLConnection uRLConnection = (URLConnection) FirebasePerfUrlConnection.instrument(request.getFullURL().openConnection());
Intrinsics.f(uRLConnection, "null cannot be cast to non-null type java.net.HttpURLConnection");
HttpURLConnection httpURLConnection = (HttpURLConnection) uRLConnection;
for (Map.Entry<String, String> entry : request.getHeaders().entrySet()) {
httpURLConnection.addRequestProperty(entry.getKey(), entry.getValue());
}
JSONObject body = request.getBody();
if (body != null) {
httpURLConnection.setDoOutput(true);
httpURLConnection.setRequestMethod("POST");
OutputStream outputStream = httpURLConnection.getOutputStream();
Intrinsics.g(outputStream, "os");
BufferedWriter buffer = buffer(outputStream);
String jSONObject = body.toString();
Intrinsics.g(jSONObject, "body.toString()");
writeFully(buffer, jSONObject);
}
return httpURLConnection;
}
private final String getETagHeader(URLConnection connection) {
return connection.getHeaderField("X-RevenueCat-ETag");
}
private final Map<String, String> getHeaders(Map<String, String> authenticationHeaders, String urlPath, boolean refreshETag, String nonce, boolean shouldSignResponse, String postFieldsToSignHeader) {
return MapExtensionsKt.filterNotNullValues(MapsKt.k0(MapsKt.k0(MapsKt.g0(new Pair[]{new Pair("Content-Type", "application/json"), new Pair("X-Platform", getXPlatformHeader()), new Pair("X-Platform-Flavor", this.appConfig.getPlatformInfo().getFlavor()), new Pair("X-Platform-Flavor-Version", this.appConfig.getPlatformInfo().getVersion()), new Pair("X-Platform-Version", String.valueOf(Build.VERSION.SDK_INT)), new Pair("X-Platform-Device", Build.MODEL), new Pair("X-Platform-Brand", Build.BRAND), new Pair("X-Version", "8.17.0"), new Pair("X-Preferred-Locales", i.M(this.localeProvider.getCurrentLocalesLanguageTags(), '-', '_')), new Pair("X-Client-Locale", this.appConfig.getLanguageTag()), new Pair("X-Client-Version", this.appConfig.getVersionName()), new Pair("X-Client-Bundle-ID", this.appConfig.getPackageName()), new Pair("X-Observer-Mode-Enabled", this.appConfig.getFinishTransactions() ? "false" : "true"), new Pair("X-Nonce", nonce), new Pair(HTTPRequest.POST_PARAMS_HASH, postFieldsToSignHeader), new Pair("X-Custom-Entitlements-Computation", this.appConfig.getCustomEntitlementComputation() ? "true" : null), new Pair("X-Storefront", this.storefrontProvider.getStorefront()), new Pair("X-Is-Debug-Build", String.valueOf(this.appConfig.getIsDebugBuild())), new Pair("X-Kotlin-Version", KotlinVersion.X.toString()), new Pair("X-Is-Backgrounded", String.valueOf(this.appConfig.isAppBackgrounded()))}), authenticationHeaders), this.eTagManager.getETagHeaders$purchases_defaultsRelease(urlPath, shouldSignResponse, refreshETag)));
}
private final InputStream getInputStream(HttpURLConnection connection) {
try {
return connection.getInputStream();
} catch (Exception e) {
if (!(e instanceof IllegalArgumentException ? true : e instanceof IOException)) {
throw e;
}
LogWrapperKt.log(LogIntent.WARNING, String.format("Unable to start a network connection due to a network configuration issue: %s", Arrays.copyOf(new Object[]{e.getMessage()}, 1)));
return connection.getErrorStream();
}
}
private final Date getRequestDateHeader(URLConnection connection) {
String requestTimeHeader = getRequestTimeHeader(connection);
if (requestTimeHeader != null) {
return new Date(Long.parseLong(requestTimeHeader));
}
return null;
}
private final String getRequestTimeHeader(URLConnection connection) {
String headerField = connection.getHeaderField(HTTPResult.REQUEST_TIME_HEADER_NAME);
if (headerField == null || j.b0(headerField)) {
return null;
}
return headerField;
}
private final String getXPlatformHeader() {
return WhenMappings.$EnumSwitchMapping$0[this.appConfig.getStore().ordinal()] == 1 ? "amazon" : "android";
}
private final com.revenuecat.purchases.common.networking.HTTPResult performCall(java.net.URL r20, com.revenuecat.purchases.common.networking.Endpoint r21, java.util.Map<java.lang.String, ? extends java.lang.Object> r22, java.util.List<kotlin.Pair<java.lang.String, java.lang.String>> r23, java.util.Map<java.lang.String, java.lang.String> r24, boolean r25) {
throw new UnsupportedOperationException("Method not decompiled: com.revenuecat.purchases.common.HTTPClient.performCall(java.net.URL, com.revenuecat.purchases.common.networking.Endpoint, java.util.Map, java.util.List, java.util.Map, boolean):com.revenuecat.purchases.common.networking.HTTPResult");
}
public static HTTPResult performRequest$default(HTTPClient hTTPClient, URL url, Endpoint endpoint, Map map, List list, Map map2, boolean z, int i, Object obj) {
if ((i & 32) != 0) {
z = false;
}
return hTTPClient.performRequest(url, endpoint, map, list, map2, z);
}
private final String readFully(InputStream inputStream) {
return TextStreamsKt.b(buffer(inputStream));
}
private final void trackHttpRequestPerformedIfNeeded(Endpoint endpoint, Date requestStartTime, boolean callSuccessful, HTTPResult callResult, boolean isRetry) {
VerificationResult verificationResult;
DiagnosticsTracker diagnosticsTracker = this.diagnosticsTrackerIfEnabled;
if (diagnosticsTracker != null) {
long between = DurationExtensionsKt.between(Duration.x, requestStartTime, this.dateProvider.getNow());
int responseCode = callSuccessful ? callResult != null ? callResult.getResponseCode() : RCHTTPStatusCodes.NOT_MODIFIED : -1;
HTTPResult.Origin origin = callResult != null ? callResult.getOrigin() : null;
if (callResult == null || (verificationResult = callResult.getVerificationResult()) == null) {
verificationResult = VerificationResult.NOT_REQUESTED;
}
diagnosticsTracker.m346trackHttpRequestPerformed5fuBHu4(endpoint, between, callSuccessful && RCHTTPStatusCodes.INSTANCE.isSuccessful(responseCode), responseCode, callResult != null ? callResult.getBackendErrorCode() : null, origin, verificationResult, isRetry);
}
}
private final VerificationResult verifyResponse(String urlPath, URLConnection connection, String payload, String nonce, String postFieldsToSignHeader) {
return this.signingManager.verifyResponse(urlPath, connection.getHeaderField(HTTPResult.SIGNATURE_HEADER_NAME), nonce, payload, getRequestTimeHeader(connection), getETagHeader(connection), postFieldsToSignHeader);
}
private final void writeFully(BufferedWriter writer, String body) {
writer.write(body);
writer.flush();
}
public final void clearCaches() {
this.eTagManager.clearCaches$purchases_defaultsRelease();
}
public final SigningManager getSigningManager() {
return this.signingManager;
}
public final HTTPResult performRequest(URL baseURL, Endpoint endpoint, Map<String, ? extends Object> body, List<Pair<String, String>> postFieldsToSign, Map<String, String> requestHeaders, boolean refreshETag) {
Intrinsics.h(baseURL, "baseURL");
Intrinsics.h(endpoint, "endpoint");
Intrinsics.h(requestHeaders, "requestHeaders");
if (this.appConfig.getForceServerErrors()) {
LogUtilsKt.warnLog("Forcing server error for request to " + endpoint.getPath());
return new HTTPResult(500, "", HTTPResult.Origin.BACKEND, null, VerificationResult.NOT_REQUESTED);
}
Date now = this.dateProvider.getNow();
try {
HTTPResult performCall = performCall(baseURL, endpoint, body, postFieldsToSign, requestHeaders, refreshETag);
trackHttpRequestPerformedIfNeeded(endpoint, now, true, performCall, refreshETag);
if (performCall != null) {
return performCall;
}
LogWrapperKt.log(LogIntent.WARNING, "We were expecting to be able to return a cached response, but we can't find it. Retrying call with a new ETag");
return performRequest(baseURL, endpoint, body, postFieldsToSign, requestHeaders, true);
} catch (Throwable th) {
trackHttpRequestPerformedIfNeeded(endpoint, now, false, null, refreshETag);
throw th;
}
}
private final BufferedWriter buffer(OutputStream outputStream) {
return new BufferedWriter(new OutputStreamWriter(outputStream));
}
public HTTPClient(AppConfig appConfig, ETagManager eTagManager, DiagnosticsTracker diagnosticsTracker, SigningManager signingManager, StorefrontProvider storefrontProvider, DateProvider dateProvider, MapConverter mapConverter, LocaleProvider localeProvider, int i, DefaultConstructorMarker defaultConstructorMarker) {
this(appConfig, eTagManager, diagnosticsTracker, signingManager, storefrontProvider, (i & 32) != 0 ? new DefaultDateProvider() : dateProvider, (i & 64) != 0 ? new MapConverter() : mapConverter, (i & 128) != 0 ? new DefaultLocaleProvider() : localeProvider);
}
}