QQ浏览器 v12.2.3.7053版本的 MD5 值为:8285ab3059e5c8b521a264dfbc5c3685

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


package com.tencent.mtt.search.network;

import android.content.Intent;
import android.os.Handler;
import android.text.TextUtils;
import com.huawei.hms.support.hianalytics.HiAnalyticsConstant;
import com.taf.UniPacket;
import com.tencent.common.featuretoggle.FeatureToggle;
import com.tencent.common.http.NetUtils;
import com.tencent.common.manifest.AppManifest;
import com.tencent.common.manifest.EventEmiter;
import com.tencent.common.manifest.EventMessage;
import com.tencent.common.serverconfig.IPListDataManager;
import com.tencent.common.serverconfig.IPListUtils;
import com.tencent.common.serverconfig.netchecker.BaseWupSelfChecker;
import com.tencent.common.serverconfig.netchecker.WupIPV6SelfChecker;
import com.tencent.common.task.QBTask;
import com.tencent.common.threadpool.BrowserExecutorSupplier;
import com.tencent.mtt.ContextHolder;
import com.tencent.mtt.base.network.ConnectionConfiguration;
import com.tencent.mtt.base.network.ConnectionListener;
import com.tencent.mtt.base.network.Packet;
import com.tencent.mtt.base.network.PacketReadObserver;
import com.tencent.mtt.base.network.PacketWriteObserver;
import com.tencent.mtt.base.network.StreamConnection;
import com.tencent.mtt.base.network.StreamConnectionListener;
import com.tencent.mtt.base.stat.StatManager;
import com.tencent.mtt.browser.engine.AppBroadcastObserver;
import com.tencent.mtt.browser.engine.AppBroadcastReceiver;
import com.tencent.mtt.search.DirectFunnelReporter;
import com.tencent.mtt.search.facade.ITKDSearchUrlResolver;
import com.tencent.mtt.search.network.MTT.SmartBox_AssociateReq;
import com.tencent.mtt.search.statistics.SearchLog;
import com.tencent.mtt.twsdk.qbinfo.TWSettingManager;
import com.tencent.searchfortkd.BuildConfig;
import com.tencent.tbs.common.internal.service.StatServerHolder;
import com.xiaomi.mipush.sdk.Constants;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
import tmsdk.common.gourd.vine.IMessageCenter;
import tmsdk.common.gourd.vine.cirrus.ESharkCode;

public class SearchStreamConnection extends StreamConnection implements BaseWupSelfChecker.ISelfCheckCallback, ConnectionListener, PacketReadObserver, PacketWriteObserver, StreamConnectionListener, AppBroadcastObserver {
    private static Map<String, String> g = new HashMap();
    private static boolean r = false;
    private static String s = "wup.imtt.qq.com:14000";
    private static String t = "14.18.180.112:18002";
    private static final String[] u = {"Network is unreachable", "Connection refused", ESharkCode.ERR_SOCKET_NO_ROUTE_2, "Connection reset by peer", "Host is unresolved", "Transport endpoint is not connected", "The operation timed out", ESharkCode.ERR_SOCKET_PERMISSION_DENIED_ELSE, "Connection timed out"};
    private static final String[] v = {"sm_f5", "sm_f4", "sm_f3", "sm_f9", "sm_f8", "sm_f10", "sm_f11", "sm_f6", "sm_f7"};

    private ArrayList<String> f70347c;
    private ArrayList<Packet> k;
    private ISearchConnectionListener q;

    private String f70348d = null;
    private int e = -1;
    private WupIPV6SelfChecker f = null;
    private boolean h = false;
    private boolean i = false;
    private Handler j = null;
    private boolean l = false;
    private int m = 0;
    private int n = 0;
    private int o = 0;
    private volatile boolean p = false;
    private long w = 0;
    private final String x = "2";

    public SearchStreamConnection() {
        String b2;
        int c2;
        this.f70347c = null;
        this.k = null;
        p();
        if (this.f70347c == null) {
            n();
            if (this.f70347c == null) {
                this.f70347c = new ArrayList<>();
                this.f70347c.add(s);
            }
        }
        String r2 = r();
        if (FeatureToggle.a(BuildConfig.FEATURE_TOGGLE_867476225) && this.i) {
            b2 = this.f70348d;
            c2 = this.e;
        } else {
            b2 = b(r2);
            c2 = c(r2);
        }
        ConnectionConfiguration connectionConfiguration = new ConnectionConfiguration(b2, c2, 4);
        connectionConfiguration.d(0);
        connectionConfiguration.b(10000);
        a(connectionConfiguration);
        a(true);
        a((PacketReadObserver) this);
        a((PacketWriteObserver) this);
        this.k = new ArrayList<>();
        AppBroadcastReceiver.a().a(this);
    }

    private void a(String str) {
        int lastIndexOf;
        if (TextUtils.isEmpty(str) || (lastIndexOf = str.lastIndexOf(Constants.COLON_SEPARATOR)) < 0 || lastIndexOf >= str.length()) {
            s();
            return;
        }
        a(str, lastIndexOf);
        if (TextUtils.isEmpty(this.f70348d) || this.e == -1) {
            return;
        }
        q();
        b(0);
        g.put(IPListUtils.a(ContextHolder.getAppContext()), str);
    }

    private void a(String str, int i) {
        this.f70348d = str.substring(0, i);
        try {
            this.e = Integer.valueOf(str.substring(i + 1, str.length())).intValue();
        } catch (Exception unused) {
            SearchLog.a("搜索网络连接", "提取IP地址信息", "提取IPv6Host和Port出错,Host:" + this.f70348d + ",Port:" + this.e, -1);
            s();
        }
    }

    private void a(String str, String str2) {
        String str3;
        if (TextUtils.isEmpty(str2)) {
            str3 = "ipv6地址为空";
        } else {
            int lastIndexOf = str2.lastIndexOf(Constants.COLON_SEPARATOR);
            if (lastIndexOf >= 0 && lastIndexOf < str2.length()) {
                a(str2, lastIndexOf);
                if (TextUtils.isEmpty(this.f70348d) || this.e == -1) {
                    this.i = false;
                    return;
                }
                SearchLog.a("搜索网络连接", "请求IP列表", "Ipv6Host和Port合规,ipv6Host:" + this.f70348d + ",ipv6Port:" + this.e, 1);
                this.i = true;
                g.put(str, str2);
                return;
            }
            str3 = "ipv6地址不合法";
        }
        SearchLog.a("搜索网络连接", "请求IP列表", str3, -1);
        this.i = false;
        s();
    }

    private void a(Throwable th) {
        try {
            String b2 = b(th);
            if (TextUtils.isEmpty(b2)) {
                return;
            }
            HashMap hashMap = new HashMap();
            hashMap.put("" + r(), b2);
            StatManager.b().b("SmartBoxFail", hashMap);
        } catch (Exception unused) {
        }
    }

    private String b(String str) {
        String[] split;
        if (TextUtils.isEmpty(str) || (split = str.split(Constants.COLON_SEPARATOR)) == null || split.length <= 0) {
            return null;
        }
        return split[0];
    }

    private String b(Throwable th) {
        if (th == null) {
            return null;
        }
        for (int i = 0; i < u.length; i++) {
            try {
                if (th.getMessage().toLowerCase().contains(u[i].toLowerCase())) {
                    return v[i];
                }
            } catch (Exception unused) {
            }
        }
        return null;
    }

    private void b(boolean z) {
        int c2;
        String str;
        if (TextUtils.isEmpty(this.f70348d) || (c2 = this.e) == -1) {
            ArrayList<String> arrayList = this.f70347c;
            int size = arrayList != null ? arrayList.size() : 0;
            if (z) {
                this.m++;
                if (this.m >= size) {
                    this.m = 0;
                }
            }
            String r2 = r();
            String b2 = b(r2);
            c2 = c(r2);
            str = b2;
        } else {
            str = this.f70348d;
            this.i = true;
        }
        ConnectionConfiguration i = i();
        i.a(str);
        i.a(c2);
        a(i);
    }

    private int c(String str) {
        String[] split;
        if (TextUtils.isEmpty(str) || (split = str.split(Constants.COLON_SEPARATOR)) == null || split.length <= 1) {
            return -1;
        }
        try {
            return Integer.parseInt(split[1]);
        } catch (NumberFormatException unused) {
            return -1;
        }
    }

    private void n() {
        String str;
        String str2;
        String str3;
        if (FeatureToggle.a(BuildConfig.FEATURE_TOGGLE_867476225)) {
            String a2 = IPListUtils.a(ContextHolder.getAppContext());
            if (!g.containsKey(a2) || TextUtils.isEmpty(g.get(a2))) {
                this.f70347c = IPListDataManager.a(ContextHolder.getAppContext()).b("2", true);
                ArrayList<String> arrayList = this.f70347c;
                str = "请求IP列表";
                if (arrayList == null || arrayList.size() <= 0) {
                    SearchLog.a("搜索网络连接", "请求IP列表", "ipv6列表为空,请求ipv4列表", 2);
                } else {
                    str2 = this.f70347c.get(0);
                    str3 = "请求ipv6地址:" + str2;
                }
            } else {
                str2 = g.get(a2);
                str3 = "获取缓存内ipv6地址:" + str2;
                str = "请求缓存IP列表";
            }
            SearchLog.a("搜索网络连接", str, str3, 2);
            a(a2, str2);
            return;
        }
        this.f70347c = IPListDataManager.a(ContextHolder.getAppContext()).a("2");
    }

    private void o() {
        String a2 = IPListUtils.a(ContextHolder.getAppContext());
        if (g.containsKey(a2) && !TextUtils.isEmpty(g.get(a2))) {
            a(g.get(a2));
            return;
        }
        this.f = new WupIPV6SelfChecker("2", ContextHolder.getAppContext());
        this.f.a(this);
        if (this.f.a()) {
            return;
        }
        a("2", IPListDataManager.a(ContextHolder.getAppContext()).b("2", true));
    }

    private void p() {
        int b2 = TWSettingManager.a().b("key_search_direct_env", 0);
        if (b2 != 0) {
            if (b2 == 1) {
                r = true;
                s = "113.96.232.149:14000";
                t = "113.96.232.149:14000";
                return;
            } else if (b2 == 2) {
                r = true;
                s = "14.18.180.112:18002";
                t = "14.18.180.112:18002";
            }
        }
        r = false;
        s = "wup.imtt.qq.com:14000";
        t = "14.18.180.112:18002";
    }

    private void q() {
        b(true);
    }

    private String r() {
        ArrayList<String> arrayList = this.f70347c;
        if (arrayList == null || arrayList.size() == 0 || this.m >= this.f70347c.size()) {
            return s;
        }
        ITKDSearchUrlResolver iTKDSearchUrlResolver = (ITKDSearchUrlResolver) AppManifest.getInstance().queryExtension(ITKDSearchUrlResolver.class, null);
        if (iTKDSearchUrlResolver == null) {
            throw new IllegalArgumentException("请实现ITKDSearchUrlResolver");
        }
        String resolveValidUrl = iTKDSearchUrlResolver.resolveValidUrl(this.f70347c.get(this.m));
        if (TextUtils.isEmpty(resolveValidUrl)) {
            return s;
        }
        if (resolveValidUrl.startsWith(NetUtils.SCHEME_HTTP)) {
            resolveValidUrl = resolveValidUrl.substring(7);
        }
        return r ? s : resolveValidUrl;
    }

    private void s() {
        this.f70348d = null;
        this.e = -1;
        g.remove(IPListUtils.a(ContextHolder.getAppContext()));
    }

    @Override
    public void a() {
    }

    public void a(UniPacket uniPacket) {
        if (this.q == null) {
            SearchLog.b("收到回包", "传不下去了,mSearchConnectionListener是空的", "SearchStreamConnection", -1);
            DirectFunnelReporter.a(30);
        } else {
            SearchLog.b("收到回包", "把packet包往下传", "SearchStreamConnection", -1);
            DirectFunnelReporter.a(uniPacket == null ? 25 : 29);
            this.q.a(uniPacket);
        }
    }

    @Override
    public void a(Packet packet) {
        int i;
        byte[] a2;
        UniPacket uniPacket;
        SearchLog.b("收到回包", "收到了后台回来的packet", "", -1);
        DirectFunnelReporter.a(24);
        UniPacket uniPacket2 = null;
        if (packet != null) {
            try {
                a2 = packet.a();
                uniPacket = new UniPacket();
            } catch (Exception e) {
                e = e;
            }
            if (a2 != null) {
                try {
                } catch (Exception e2) {
                    e = e2;
                    uniPacket2 = uniPacket;
                    SearchLog.b("收到回包", "解析pkt的时候出现bug", e.getMessage(), -1);
                    i = 28;
                    DirectFunnelReporter.a(i);
                    a(uniPacket2);
                }
                if (a2.length >= 1) {
                    SearchLog.b("收到回包", "data不为空并且data长度大于1", "", -1);
                    uniPacket.setEncodeName("UTF-8");
                    uniPacket.setProtocolClassNamePrefs("com.tencent.mtt.search.network.MTT");
                    uniPacket.decode(a2);
                    uniPacket2 = uniPacket;
                    a(uniPacket2);
                }
            }
            SearchLog.b("收到回包", "data为空或长度小于1", "", -1);
            DirectFunnelReporter.a(27);
            uniPacket2 = uniPacket;
            a(uniPacket2);
        }
        SearchLog.b("收到回包", "pkt为空", "", -1);
        i = 26;
        DirectFunnelReporter.a(i);
        a(uniPacket2);
    }

    @Override
    public void a(Packet packet, Exception exc) {
        DirectFunnelReporter.a(40);
    }

    public void a(ISearchConnectionListener iSearchConnectionListener) {
        this.q = iSearchConnectionListener;
    }

    @Override
    public void a(Exception exc) {
    }

    @Override
    public void a(String str, List<String> list) {
        ArrayList<String> b2 = IPListDataManager.a(ContextHolder.getAppContext()).b("2", true);
        if (b2 == null || b2.size() <= 0) {
            s();
        } else {
            a(b2.get(0));
        }
    }

    @Override
    public boolean a(int i) {
        return i > 0 && i < 10240000;
    }

    @Override
    public void a_(Exception exc) {
        a((Throwable) exc);
        if (!TextUtils.isEmpty(this.f70348d) && this.e != -1) {
            HashMap hashMap = new HashMap();
            hashMap.put("type", "ipv6_search_socket_fail");
            hashMap.put("k1", this.f70348d + Constants.COLON_SEPARATOR + this.e);
            EventEmiter.getDefault().emit(new EventMessage("com.tencent.mtt.operation.res.OperationResManager.STAT_WITH_BEACON", hashMap));
            StatServerHolder.userBehaviorStatistics("AWNWF53_IPV6_SEARCH_SOCKET_0");
        }
        if (this.i) {
            s();
            b(false);
        } else {
            this.o++;
            if (this.o >= 1) {
                this.o = 0;
                this.n++;
                if (this.n >= 5) {
                    m();
                    return;
                }
                q();
            }
        }
        if (this.p) {
            return;
        }
        b(1000);
    }

    @Override
    public void aj_() {
        synchronized (this.k) {
            for (int size = this.k.size() - 1; size >= 0; size--) {
                if (c(this.k.get(size))) {
                    DirectFunnelReporter.a(45);
                } else {
                    DirectFunnelReporter.a(46);
                }
            }
            this.k.clear();
        }
        if (!TextUtils.isEmpty(this.f70348d) && this.e != -1) {
            StatServerHolder.userBehaviorStatistics("AWNWF53_IPV6_SEARCH_SOCKET_1");
        }
        if (FeatureToggle.a(BuildConfig.FEATURE_TOGGLE_867476225) || this.h) {
            return;
        }
        o();
        this.h = true;
    }

    public void b(int i) {
        try {
            this.p = false;
            a((PacketReadObserver) this);
            a((PacketWriteObserver) this);
            a((StreamConnectionListener) this);
            if (this.j == null) {
                this.j = new Handler(BrowserExecutorSupplier.getStreamConnLooper());
            }
            this.j.postDelayed(new BrowserExecutorSupplier.BackgroundRunable() {
                @Override
                public void doRun() {
                    try {
                        SearchStreamConnection.this.h();
                        SearchStreamConnection.this.j();
                    } catch (Exception unused) {
                    }
                }
            }, i);
        } catch (Exception | OutOfMemoryError unused) {
        }
    }

    @Override
    public void b(Packet packet) {
        DirectFunnelReporter.a(21);
    }

    public boolean b(UniPacket uniPacket) {
        ArrayList<Packet> arrayList;
        this.w = System.currentTimeMillis();
        Packet packet = new Packet(uniPacket.encode());
        if (f()) {
            boolean c2 = c(packet);
            DirectFunnelReporter.a(c2 ? 43 : 44);
            return c2;
        }
        DirectFunnelReporter.a(42);
        b(0);
        if (FeatureToggle.a(BuildConfig.FEATURE_TOGGLE_CLIP_868907863)) {
            Object obj = uniPacket.get(HiAnalyticsConstant.Direction.REQUEST);
            if ((obj instanceof SmartBox_AssociateReq) && ((SmartBox_AssociateReq) obj).iIndex == 0) {
                return false;
            }
        }
        synchronized (this.k) {
            if (this.l) {
                arrayList = this.k;
            } else {
                this.k.clear();
                arrayList = this.k;
            }
            arrayList.add(packet);
        }
        return false;
    }

    public boolean l() {
        return f() || !this.p;
    }

    public void m() {
        Handler handler;
        this.p = true;
        a((StreamConnectionListener) null);
        a((PacketReadObserver) null);
        a((PacketWriteObserver) null);
        AppBroadcastReceiver.a().b(this);
        this.q = null;
        if (FeatureToggle.a(BuildConfig.FEATURE_TOGGLE_867476225) && (handler = this.j) != null) {
            handler.removeCallbacksAndMessages(null);
        }
        if (f()) {
            QBTask.c(new Callable<Object>() {
                @Override
                public Object call() throws Exception {
                    SearchStreamConnection.this.h();
                    return null;
                }
            });
        }
    }

    @Override
    public void onBroadcastReceiver(Intent intent) {
        if (IMessageCenter.MSG_SYS_CONNECTIVITY_ACTION.equals(intent.getAction())) {
            o();
        }
    }
}