正在查看: 小柿子 v1.3.8 应用的 CronetHttpURLConnection.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
正在查看: 小柿子 v1.3.8 应用的 CronetHttpURLConnection.java JAVA 源代码文件
本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。
package aegon.chrome.net.urlconnection;
import aegon.chrome.net.CronetEngine;
import aegon.chrome.net.CronetException;
import aegon.chrome.net.ExperimentalUrlRequest;
import aegon.chrome.net.UrlRequest;
import aegon.chrome.net.UrlResponseInfo;
import android.annotation.SuppressLint;
import android.util.Pair;
import com.baidu.mobads.sdk.internal.an;
import com.czhj.volley.toolbox.HttpHeaderParser;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.nio.ByteBuffer;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.TreeMap;
import java.util.concurrent.Executor;
public class CronetHttpURLConnection extends HttpURLConnection {
private static final String CONTENT_LENGTH = "Content-Length";
private static final String TAG = CronetHttpURLConnection.class.getSimpleName();
private final CronetEngine mCronetEngine;
private IOException mException;
private boolean mHasResponseHeadersOrCompleted;
private CronetInputStream mInputStream;
private final MessageLoop mMessageLoop;
private boolean mOnRedirectCalled;
private CronetOutputStream mOutputStream;
private UrlRequest mRequest;
private final List<Pair<String, String>> mRequestHeaders;
private List<Map.Entry<String, String>> mResponseHeadersList;
private Map<String, List<String>> mResponseHeadersMap;
private UrlResponseInfo mResponseInfo;
private int mTrafficStatsTag;
private boolean mTrafficStatsTagSet;
private int mTrafficStatsUid;
private boolean mTrafficStatsUidSet;
public class CronetUrlRequestCallback extends UrlRequest.Callback {
public CronetUrlRequestCallback() {
}
private void setResponseDataCompleted(IOException iOException) {
CronetHttpURLConnection.this.mException = iOException;
if (CronetHttpURLConnection.this.mInputStream != null) {
CronetHttpURLConnection.this.mInputStream.setResponseDataCompleted(iOException);
}
if (CronetHttpURLConnection.this.mOutputStream != null) {
CronetHttpURLConnection.this.mOutputStream.setRequestCompleted(iOException);
}
CronetHttpURLConnection.this.mHasResponseHeadersOrCompleted = true;
CronetHttpURLConnection.this.mMessageLoop.quit();
}
@Override
public void onCanceled(UrlRequest urlRequest, UrlResponseInfo urlResponseInfo) {
CronetHttpURLConnection.this.mResponseInfo = urlResponseInfo;
setResponseDataCompleted(new IOException("disconnect() called"));
}
@Override
public void onFailed(UrlRequest urlRequest, UrlResponseInfo urlResponseInfo, CronetException cronetException) {
if (cronetException == null) {
throw new IllegalStateException("Exception cannot be null in onFailed.");
}
CronetHttpURLConnection.this.mResponseInfo = urlResponseInfo;
setResponseDataCompleted(cronetException);
}
@Override
public void onReadCompleted(UrlRequest urlRequest, UrlResponseInfo urlResponseInfo, ByteBuffer byteBuffer) {
CronetHttpURLConnection.this.mResponseInfo = urlResponseInfo;
CronetHttpURLConnection.this.mMessageLoop.quit();
}
@Override
public void onRedirectReceived(UrlRequest urlRequest, UrlResponseInfo urlResponseInfo, String str) {
CronetHttpURLConnection.this.mOnRedirectCalled = true;
try {
URL url = new URL(str);
boolean equals = url.getProtocol().equals(((HttpURLConnection) CronetHttpURLConnection.this).url.getProtocol());
if (((HttpURLConnection) CronetHttpURLConnection.this).instanceFollowRedirects) {
((HttpURLConnection) CronetHttpURLConnection.this).url = url;
}
if (((HttpURLConnection) CronetHttpURLConnection.this).instanceFollowRedirects && equals) {
CronetHttpURLConnection.this.mRequest.followRedirect();
return;
}
} catch (MalformedURLException unused) {
}
CronetHttpURLConnection.this.mResponseInfo = urlResponseInfo;
CronetHttpURLConnection.this.mRequest.cancel();
setResponseDataCompleted(null);
}
@Override
public void onResponseStarted(UrlRequest urlRequest, UrlResponseInfo urlResponseInfo) {
CronetHttpURLConnection.this.mResponseInfo = urlResponseInfo;
CronetHttpURLConnection.this.mHasResponseHeadersOrCompleted = true;
CronetHttpURLConnection.this.mMessageLoop.quit();
}
@Override
public void onSucceeded(UrlRequest urlRequest, UrlResponseInfo urlResponseInfo) {
CronetHttpURLConnection.this.mResponseInfo = urlResponseInfo;
setResponseDataCompleted(null);
}
}
public CronetHttpURLConnection(URL url, CronetEngine cronetEngine) {
super(url);
this.mCronetEngine = cronetEngine;
this.mMessageLoop = new MessageLoop();
this.mInputStream = new CronetInputStream(this);
this.mRequestHeaders = new ArrayList();
}
private void checkHasResponseHeaders() {
if (!this.mHasResponseHeadersOrCompleted) {
throw new IllegalStateException("No response.");
}
IOException iOException = this.mException;
if (iOException != null) {
throw iOException;
}
Objects.requireNonNull(this.mResponseInfo, "Response info is null when there is no exception.");
}
private int findRequestProperty(String str) {
for (int i2 = 0; i2 < this.mRequestHeaders.size(); i2++) {
if (((String) this.mRequestHeaders.get(i2).first).equalsIgnoreCase(str)) {
return i2;
}
}
return -1;
}
private Map<String, List<String>> getAllHeaders() {
Map<String, List<String>> map = this.mResponseHeadersMap;
if (map != null) {
return map;
}
TreeMap treeMap = new TreeMap(String.CASE_INSENSITIVE_ORDER);
for (Map.Entry<String, String> entry : getAllHeadersAsList()) {
ArrayList arrayList = new ArrayList();
if (treeMap.containsKey(entry.getKey())) {
arrayList.addAll((Collection) treeMap.get(entry.getKey()));
}
arrayList.add(entry.getValue());
treeMap.put(entry.getKey(), Collections.unmodifiableList(arrayList));
}
Map<String, List<String>> unmodifiableMap = Collections.unmodifiableMap(treeMap);
this.mResponseHeadersMap = unmodifiableMap;
return unmodifiableMap;
}
private List<Map.Entry<String, String>> getAllHeadersAsList() {
List<Map.Entry<String, String>> list = this.mResponseHeadersList;
if (list != null) {
return list;
}
this.mResponseHeadersList = new ArrayList();
for (Map.Entry<String, String> entry : this.mResponseInfo.getAllHeadersAsList()) {
if (!entry.getKey().equalsIgnoreCase("Content-Encoding")) {
this.mResponseHeadersList.add(new AbstractMap.SimpleImmutableEntry(entry));
}
}
List<Map.Entry<String, String>> unmodifiableList = Collections.unmodifiableList(this.mResponseHeadersList);
this.mResponseHeadersList = unmodifiableList;
return unmodifiableList;
}
private Map.Entry<String, String> getHeaderFieldEntry(int i2) {
try {
getResponse();
List<Map.Entry<String, String>> allHeadersAsList = getAllHeadersAsList();
if (i2 >= allHeadersAsList.size()) {
return null;
}
return allHeadersAsList.get(i2);
} catch (IOException unused) {
return null;
}
}
private void getResponse() {
CronetOutputStream cronetOutputStream = this.mOutputStream;
if (cronetOutputStream != null) {
cronetOutputStream.checkReceivedEnoughContent();
if (isChunkedUpload()) {
this.mOutputStream.close();
}
}
if (!this.mHasResponseHeadersOrCompleted) {
startRequest();
this.mMessageLoop.loop();
}
checkHasResponseHeaders();
}
@SuppressLint({"NewApi"})
private long getStreamingModeContentLength() {
long j2 = ((HttpURLConnection) this).fixedContentLength;
try {
long j3 = getClass().getField("fixedContentLengthLong").getLong(this);
return j3 != -1 ? j3 : j2;
} catch (IllegalAccessException | NoSuchFieldException unused) {
return j2;
}
}
private boolean isChunkedUpload() {
return ((HttpURLConnection) this).chunkLength > 0;
}
private final void setRequestPropertyInternal(String str, String str2, boolean z) {
if (((HttpURLConnection) this).connected) {
throw new IllegalStateException("Cannot modify request property after connection is made.");
}
int findRequestProperty = findRequestProperty(str);
if (findRequestProperty >= 0) {
if (!z) {
throw new UnsupportedOperationException("Cannot add multiple headers of the same key, " + str + ". crbug.com/432719.");
}
this.mRequestHeaders.remove(findRequestProperty);
}
this.mRequestHeaders.add(Pair.create(str, str2));
}
private void startRequest() {
if (((HttpURLConnection) this).connected) {
return;
}
ExperimentalUrlRequest.Builder builder = (ExperimentalUrlRequest.Builder) this.mCronetEngine.newUrlRequestBuilder(getURL().toString(), new CronetUrlRequestCallback(), this.mMessageLoop);
if (((HttpURLConnection) this).doOutput) {
if (((HttpURLConnection) this).method.equals(an.f594c)) {
((HttpURLConnection) this).method = an.f593b;
}
CronetOutputStream cronetOutputStream = this.mOutputStream;
if (cronetOutputStream != null) {
builder.setUploadDataProvider(cronetOutputStream.getUploadDataProvider(), (Executor) this.mMessageLoop);
if (getRequestProperty(CONTENT_LENGTH) == null && !isChunkedUpload()) {
addRequestProperty(CONTENT_LENGTH, Long.toString(this.mOutputStream.getUploadDataProvider().getLength()));
}
this.mOutputStream.setConnected();
} else if (getRequestProperty(CONTENT_LENGTH) == null) {
addRequestProperty(CONTENT_LENGTH, "0");
}
if (getRequestProperty(HttpHeaderParser.f5372a) == null) {
addRequestProperty(HttpHeaderParser.f5372a, "application/x-www-form-urlencoded");
}
}
for (Pair<String, String> pair : this.mRequestHeaders) {
builder.addHeader((String) pair.first, (String) pair.second);
}
if (!getUseCaches()) {
builder.disableCache();
}
builder.setHttpMethod(((HttpURLConnection) this).method);
if (this.mTrafficStatsTagSet) {
builder.setTrafficStatsTag(this.mTrafficStatsTag);
}
if (this.mTrafficStatsUidSet) {
builder.setTrafficStatsUid(this.mTrafficStatsUid);
}
ExperimentalUrlRequest build = builder.build();
this.mRequest = build;
build.start();
((HttpURLConnection) this).connected = true;
}
@Override
public final void addRequestProperty(String str, String str2) {
setRequestPropertyInternal(str, str2, false);
}
@Override
public void connect() {
getOutputStream();
startRequest();
}
@Override
public void disconnect() {
if (((HttpURLConnection) this).connected) {
this.mRequest.cancel();
}
}
@Override
public InputStream getErrorStream() {
try {
getResponse();
if (this.mResponseInfo.getHttpStatusCode() >= 400) {
return this.mInputStream;
}
return null;
} catch (IOException unused) {
return null;
}
}
@Override
public final String getHeaderField(String str) {
try {
getResponse();
Map<String, List<String>> allHeaders = getAllHeaders();
if (!allHeaders.containsKey(str)) {
return null;
}
return allHeaders.get(str).get(r4.size() - 1);
} catch (IOException unused) {
return null;
}
}
@Override
public final String getHeaderFieldKey(int i2) {
Map.Entry<String, String> headerFieldEntry = getHeaderFieldEntry(i2);
if (headerFieldEntry == null) {
return null;
}
return headerFieldEntry.getKey();
}
@Override
public Map<String, List<String>> getHeaderFields() {
try {
getResponse();
return getAllHeaders();
} catch (IOException unused) {
return Collections.emptyMap();
}
}
@Override
public InputStream getInputStream() {
getResponse();
if (!((HttpURLConnection) this).instanceFollowRedirects && this.mOnRedirectCalled) {
throw new IOException("Cannot read response body of a redirect.");
}
if (this.mResponseInfo.getHttpStatusCode() < 400) {
return this.mInputStream;
}
throw new FileNotFoundException(((HttpURLConnection) this).url.toString());
}
public void getMoreData(ByteBuffer byteBuffer) {
this.mRequest.read(byteBuffer);
this.mMessageLoop.loop(getReadTimeout());
}
@Override
public OutputStream getOutputStream() {
if (this.mOutputStream == null && ((HttpURLConnection) this).doOutput) {
if (((HttpURLConnection) this).connected) {
throw new ProtocolException("Cannot write to OutputStream after receiving response.");
}
if (isChunkedUpload()) {
this.mOutputStream = new CronetChunkedOutputStream(this, ((HttpURLConnection) this).chunkLength, this.mMessageLoop);
startRequest();
} else {
long streamingModeContentLength = getStreamingModeContentLength();
if (streamingModeContentLength != -1) {
this.mOutputStream = new CronetFixedModeOutputStream(this, streamingModeContentLength, this.mMessageLoop);
startRequest();
} else {
String requestProperty = getRequestProperty(CONTENT_LENGTH);
if (requestProperty == null) {
this.mOutputStream = new CronetBufferedOutputStream(this);
} else {
this.mOutputStream = new CronetBufferedOutputStream(this, Long.parseLong(requestProperty));
}
}
}
}
return this.mOutputStream;
}
@Override
public Map<String, List<String>> getRequestProperties() {
if (((HttpURLConnection) this).connected) {
throw new IllegalStateException("Cannot access request headers after connection is set.");
}
TreeMap treeMap = new TreeMap(String.CASE_INSENSITIVE_ORDER);
for (Pair<String, String> pair : this.mRequestHeaders) {
if (treeMap.containsKey(pair.first)) {
throw new IllegalStateException("Should not have multiple values.");
}
ArrayList arrayList = new ArrayList();
arrayList.add((String) pair.second);
treeMap.put((String) pair.first, Collections.unmodifiableList(arrayList));
}
return Collections.unmodifiableMap(treeMap);
}
@Override
public String getRequestProperty(String str) {
int findRequestProperty = findRequestProperty(str);
if (findRequestProperty >= 0) {
return (String) this.mRequestHeaders.get(findRequestProperty).second;
}
return null;
}
@Override
public int getResponseCode() {
getResponse();
return this.mResponseInfo.getHttpStatusCode();
}
@Override
public String getResponseMessage() {
getResponse();
return this.mResponseInfo.getHttpStatusText();
}
@Override
public void setConnectTimeout(int i2) {
}
@Override
public final void setRequestProperty(String str, String str2) {
setRequestPropertyInternal(str, str2, true);
}
public void setTrafficStatsTag(int i2) {
if (((HttpURLConnection) this).connected) {
throw new IllegalStateException("Cannot modify traffic stats tag after connection is made.");
}
this.mTrafficStatsTagSet = true;
this.mTrafficStatsTag = i2;
}
public void setTrafficStatsUid(int i2) {
if (((HttpURLConnection) this).connected) {
throw new IllegalStateException("Cannot modify traffic stats UID after connection is made.");
}
this.mTrafficStatsUidSet = true;
this.mTrafficStatsUid = i2;
}
@Override
public boolean usingProxy() {
return false;
}
@Override
public final String getHeaderField(int i2) {
Map.Entry<String, String> headerFieldEntry = getHeaderFieldEntry(i2);
if (headerFieldEntry == null) {
return null;
}
return headerFieldEntry.getValue();
}
}