导航菜单

页面标题

页面副标题

Perplexity v2.48.1 - HTTPClient.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);
    }
}