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();
}
}
}