Tcash v4.1版本的 MD5 值为:54953883746c24854c9065ba91cea245

以下内容为反编译后的 OneSignalRestClient.java 源代码,内容仅作参考


package com.onesignal;

import android.net.TrafficStats;
import android.net.http.Headers;
import android.os.Build;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.onesignal.OneSignal;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.Thread;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.Scanner;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.protocol.HTTP;
import org.json.JSONObject;

public class OneSignalRestClient {
    private static final String BASE_URL = "https://api.onesignal.com/";
    static final String CACHE_KEY_GET_TAGS = "CACHE_KEY_GET_TAGS";
    static final String CACHE_KEY_REMOTE_PARAMS = "CACHE_KEY_REMOTE_PARAMS";
    private static final int GET_TIMEOUT = 60000;
    private static final String OS_ACCEPT_HEADER = "application/vnd.onesignal.v1+json";
    private static final String OS_API_VERSION = "1";
    private static final int THREAD_ID = 10000;
    private static final int TIMEOUT = 120000;

    OneSignalRestClient() {
    }

    public static abstract class ResponseHandler {
        void onSuccess(String response) {
        }

        void onFailure(int statusCode, String response, Throwable throwable) {
        }
    }

    private static int getThreadTimeout(int timeout) {
        return timeout + 5000;
    }

    public static void put(final String url, final JSONObject jsonBody, final ResponseHandler responseHandler) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                OneSignalRestClient.makeRequest(url, HttpPut.METHOD_NAME, jsonBody, responseHandler, OneSignalRestClient.TIMEOUT, null);
            }
        }, "OS_REST_ASYNC_PUT").start();
    }

    public static void post(final String url, final JSONObject jsonBody, final ResponseHandler responseHandler) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                OneSignalRestClient.makeRequest(url, "POST", jsonBody, responseHandler, OneSignalRestClient.TIMEOUT, null);
            }
        }, "OS_REST_ASYNC_POST").start();
    }

    public static void get(final String url, final ResponseHandler responseHandler, @NonNull final String cacheKey) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                OneSignalRestClient.makeRequest(url, null, null, responseHandler, OneSignalRestClient.GET_TIMEOUT, cacheKey);
            }
        }, "OS_REST_ASYNC_GET").start();
    }

    public static void getSync(String url, ResponseHandler responseHandler, @NonNull String cacheKey) {
        makeRequest(url, null, null, responseHandler, GET_TIMEOUT, cacheKey);
    }

    public static void putSync(String url, JSONObject jsonBody, ResponseHandler responseHandler) {
        makeRequest(url, HttpPut.METHOD_NAME, jsonBody, responseHandler, TIMEOUT, null);
    }

    public static void postSync(String url, JSONObject jsonBody, ResponseHandler responseHandler) {
        makeRequest(url, "POST", jsonBody, responseHandler, TIMEOUT, null);
    }

    public static void makeRequest(final String url, final String method, final JSONObject jsonBody, final ResponseHandler responseHandler, final int timeout, final String cacheKey) {
        if (method == null || !OneSignal.shouldLogUserPrivacyConsentErrorMessageForMethodName(null)) {
            final Thread[] callbackThread = new Thread[1];
            Thread connectionThread = new Thread(new Runnable() {
                @Override
                public void run() {
                    callbackThread[0] = OneSignalRestClient.startHTTPConnection(url, method, jsonBody, responseHandler, timeout, cacheKey);
                }
            }, "OS_HTTPConnection");
            connectionThread.start();
            try {
                connectionThread.join(getThreadTimeout(timeout));
                if (connectionThread.getState() != Thread.State.TERMINATED) {
                    connectionThread.interrupt();
                }
                if (callbackThread[0] != null) {
                    callbackThread[0].join();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static Thread startHTTPConnection(String url, String method, JSONObject jsonBody, ResponseHandler responseHandler, int timeout, @Nullable String cacheKey) {
        Thread callbackThread;
        String eTag;
        String eTag2;
        HttpURLConnection con = null;
        if (Build.VERSION.SDK_INT >= 26) {
            TrafficStats.setThreadStatsTag(THREAD_ID);
        }
        try {
            try {
                OneSignal.Log(OneSignal.LOG_LEVEL.DEBUG, "OneSignalRestClient: Making request to: https://api.onesignal.com/" + url);
                con = newHttpURLConnection(url);
                con.setUseCaches(false);
                con.setConnectTimeout(timeout);
                con.setReadTimeout(timeout);
                con.setRequestProperty("SDK-Version", "onesignal/android/031400");
                con.setRequestProperty("Accept", OS_ACCEPT_HEADER);
                if (jsonBody != null) {
                    con.setDoInput(true);
                }
                if (method != null) {
                    con.setRequestProperty(HTTP.CONTENT_TYPE, "application/json; charset=UTF-8");
                    con.setRequestMethod(method);
                    con.setDoOutput(true);
                }
                if (jsonBody != null) {
                    String strJsonBody = jsonBody.toString();
                    OneSignal.Log(OneSignal.LOG_LEVEL.DEBUG, "OneSignalRestClient: " + method + " SEND JSON: " + strJsonBody);
                    byte[] sendBytes = strJsonBody.getBytes("UTF-8");
                    con.setFixedLengthStreamingMode(sendBytes.length);
                    OutputStream outputStream = con.getOutputStream();
                    outputStream.write(sendBytes);
                }
                if (cacheKey != null && (eTag2 = OneSignalPrefs.getString(OneSignalPrefs.PREFS_ONESIGNAL, OneSignalPrefs.PREFS_OS_ETAG_PREFIX + cacheKey, null)) != null) {
                    con.setRequestProperty("if-none-match", eTag2);
                    OneSignal.Log(OneSignal.LOG_LEVEL.DEBUG, "OneSignalRestClient: Adding header if-none-match: " + eTag2);
                }
                int httpResponse = con.getResponseCode();
                OneSignal.Log(OneSignal.LOG_LEVEL.VERBOSE, "OneSignalRestClient: After con.getResponseCode to: https://api.onesignal.com/" + url);
                switch (httpResponse) {
                    case 200:
                    case HttpStatus.SC_ACCEPTED:
                        OneSignal.Log(OneSignal.LOG_LEVEL.DEBUG, "OneSignalRestClient: Successfully finished request to: https://api.onesignal.com/" + url);
                        Scanner scanner = new Scanner(con.getInputStream(), "UTF-8");
                        String json = scanner.useDelimiter("\\A").hasNext() ? scanner.next() : "";
                        scanner.close();
                        OneSignal.Log(OneSignal.LOG_LEVEL.DEBUG, "OneSignalRestClient: " + (method == null ? "GET" : method) + " RECEIVED JSON: " + json);
                        if (cacheKey != null && (eTag = con.getHeaderField(Headers.ETAG)) != null) {
                            OneSignal.Log(OneSignal.LOG_LEVEL.DEBUG, "OneSignalRestClient: Response has etag of " + eTag + " so caching the response.");
                            OneSignalPrefs.saveString(OneSignalPrefs.PREFS_ONESIGNAL, OneSignalPrefs.PREFS_OS_ETAG_PREFIX + cacheKey, eTag);
                            OneSignalPrefs.saveString(OneSignalPrefs.PREFS_ONESIGNAL, OneSignalPrefs.PREFS_OS_HTTP_CACHE_PREFIX + cacheKey, json);
                        }
                        callbackThread = callResponseHandlerOnSuccess(responseHandler, json);
                        break;
                    case 304:
                        String cachedResponse = OneSignalPrefs.getString(OneSignalPrefs.PREFS_ONESIGNAL, OneSignalPrefs.PREFS_OS_HTTP_CACHE_PREFIX + cacheKey, null);
                        OneSignal.Log(OneSignal.LOG_LEVEL.DEBUG, "OneSignalRestClient: " + (method == null ? "GET" : method) + " - Using Cached response due to 304: " + cachedResponse);
                        callbackThread = callResponseHandlerOnSuccess(responseHandler, cachedResponse);
                        break;
                    default:
                        OneSignal.Log(OneSignal.LOG_LEVEL.DEBUG, "OneSignalRestClient: Failed request to: https://api.onesignal.com/" + url);
                        InputStream inputStream = con.getErrorStream();
                        if (inputStream == null) {
                            inputStream = con.getInputStream();
                        }
                        String jsonResponse = null;
                        if (inputStream != null) {
                            Scanner scanner2 = new Scanner(inputStream, "UTF-8");
                            jsonResponse = scanner2.useDelimiter("\\A").hasNext() ? scanner2.next() : "";
                            scanner2.close();
                            OneSignal.Log(OneSignal.LOG_LEVEL.WARN, "OneSignalRestClient: " + method + " RECEIVED JSON: " + jsonResponse);
                        } else {
                            OneSignal.Log(OneSignal.LOG_LEVEL.WARN, "OneSignalRestClient: " + method + " HTTP Code: " + httpResponse + " No response body!");
                        }
                        callbackThread = callResponseHandlerOnFailure(responseHandler, httpResponse, jsonResponse, null);
                        break;
                }
            } catch (Throwable t) {
                if ((t instanceof ConnectException) || (t instanceof UnknownHostException)) {
                    OneSignal.Log(OneSignal.LOG_LEVEL.INFO, "OneSignalRestClient: Could not send last request, device is offline. Throwable: " + t.getClass().getName());
                } else {
                    OneSignal.Log(OneSignal.LOG_LEVEL.WARN, "OneSignalRestClient: " + method + " Error thrown from network stack. ", t);
                }
                callbackThread = callResponseHandlerOnFailure(responseHandler, -1, null, t);
                if (con != null) {
                    con.disconnect();
                }
            }
            return callbackThread;
        } finally {
            if (con != null) {
                con.disconnect();
            }
        }
    }

    private static Thread callResponseHandlerOnSuccess(final ResponseHandler handler, final String response) {
        if (handler == null) {
            return null;
        }
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                ResponseHandler.this.onSuccess(response);
            }
        }, "OS_REST_SUCCESS_CALLBACK");
        thread.start();
        return thread;
    }

    private static Thread callResponseHandlerOnFailure(final ResponseHandler handler, final int statusCode, final String response, final Throwable throwable) {
        if (handler == null) {
            return null;
        }
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                ResponseHandler.this.onFailure(statusCode, response, throwable);
            }
        }, "OS_REST_FAILURE_CALLBACK");
        thread.start();
        return thread;
    }

    private static HttpURLConnection newHttpURLConnection(String url) throws IOException {
        return (HttpURLConnection) new URL(BASE_URL + url).openConnection();
    }
}