gzip 输入流支持
This commit is contained in:
@ -15,19 +15,21 @@
|
||||
*/
|
||||
package com.arialyy.aria.core.download.downloader;
|
||||
|
||||
import android.util.Log;
|
||||
import android.text.TextUtils;
|
||||
import com.arialyy.aria.core.download.DownloadTaskEntity;
|
||||
import com.arialyy.aria.util.SSLContextUtil;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.ProtocolException;
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
import java.util.Set;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
import java.util.zip.InflaterInputStream;
|
||||
import javax.net.ssl.HttpsURLConnection;
|
||||
import javax.net.ssl.SSLContext;
|
||||
import javax.net.ssl.SSLSocketFactory;
|
||||
import org.apache.commons.net.ftp.FTPClient;
|
||||
|
||||
/**
|
||||
* Created by lyy on 2017/1/18.
|
||||
@ -35,6 +37,26 @@ import org.apache.commons.net.ftp.FTPClient;
|
||||
*/
|
||||
class ConnectionHelp {
|
||||
|
||||
/**
|
||||
* 转换HttpUrlConnect的inputStream流
|
||||
*
|
||||
* @return {@link GZIPInputStream}、{@link InflaterInputStream}
|
||||
* @throws IOException
|
||||
*/
|
||||
static InputStream convertInputStream(HttpURLConnection connection) throws IOException {
|
||||
String encoding = connection.getContentEncoding();
|
||||
if (TextUtils.isEmpty(encoding)) {
|
||||
return connection.getInputStream();
|
||||
}
|
||||
if (encoding.contains("gzip")) {
|
||||
return new GZIPInputStream(connection.getInputStream());
|
||||
} else if (encoding.contains("deflate")) {
|
||||
return new InflaterInputStream(connection.getInputStream());
|
||||
} else {
|
||||
return connection.getInputStream();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理链接
|
||||
*
|
||||
|
@ -24,7 +24,9 @@ import com.arialyy.aria.core.download.DownloadTaskEntity;
|
||||
import com.arialyy.aria.util.ALog;
|
||||
import com.arialyy.aria.util.CheckUtil;
|
||||
import com.arialyy.aria.util.CommonUtil;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
import java.net.URLDecoder;
|
||||
@ -90,7 +92,7 @@ class HttpFileInfoThread implements Runnable {
|
||||
}
|
||||
}
|
||||
int code = conn.getResponseCode();
|
||||
boolean isComplete = false;
|
||||
boolean end = false;
|
||||
if (TextUtils.isEmpty(mEntity.getMd5Code())) {
|
||||
String md5Code = conn.getHeaderField("Content-MD5");
|
||||
mEntity.setMd5Code(md5Code);
|
||||
@ -123,14 +125,25 @@ class HttpFileInfoThread implements Runnable {
|
||||
}
|
||||
mEntity.setFileSize(len);
|
||||
mTaskEntity.setSupportBP(true);
|
||||
isComplete = true;
|
||||
end = true;
|
||||
} else if (code == HttpURLConnection.HTTP_OK) {
|
||||
if (!checkLen(len) && !isChunked) {
|
||||
if (conn.getHeaderField("Content-Type").equals("text/html")) {
|
||||
BufferedReader reader =
|
||||
new BufferedReader(new InputStreamReader(ConnectionHelp.convertInputStream(conn)));
|
||||
StringBuilder sb = new StringBuilder();
|
||||
String line;
|
||||
while ((line = reader.readLine()) != null) {
|
||||
sb.append(line);
|
||||
}
|
||||
reader.close();
|
||||
handle302Turn(conn, CommonUtil.getWindowReplaceUrl(sb.toString()));
|
||||
return;
|
||||
} else if (!checkLen(len) && !isChunked) {
|
||||
return;
|
||||
}
|
||||
mEntity.setFileSize(len);
|
||||
mTaskEntity.setSupportBP(false);
|
||||
isComplete = true;
|
||||
end = true;
|
||||
} else if (code == HttpURLConnection.HTTP_NOT_FOUND) {
|
||||
failDownload("任务【" + mEntity.getUrl() + "】下载失败,错误码:404", true);
|
||||
} else if (code == HttpURLConnection.HTTP_MOVED_TEMP
|
||||
@ -143,7 +156,7 @@ class HttpFileInfoThread implements Runnable {
|
||||
} else {
|
||||
failDownload("任务【" + mEntity.getUrl() + "】下载失败,错误码:" + code, true);
|
||||
}
|
||||
if (isComplete) {
|
||||
if (end) {
|
||||
mTaskEntity.setChunked(isChunked);
|
||||
mTaskEntity.update();
|
||||
if (onFileInfoListener != null) {
|
||||
|
@ -74,8 +74,7 @@ final class HttpThreadTask extends AbsThreadTask<DownloadEntity, DownloadTaskEnt
|
||||
conn.setConnectTimeout(STATE.CONNECT_TIME_OUT);
|
||||
conn.setReadTimeout(STATE.READ_TIME_OUT); //设置读取流的等待时间,必须设置该参数
|
||||
|
||||
//is = conn.getInputStream();
|
||||
is = new BufferedInputStream(conn.getInputStream());
|
||||
is = new BufferedInputStream(ConnectionHelp.convertInputStream(conn));
|
||||
//创建可设置位置的文件
|
||||
file = new BufferedRandomAccessFile(mConfig.TEMP_FILE, "rwd", mBufSize);
|
||||
//设置每条线程写入文件的位置
|
||||
|
@ -394,7 +394,7 @@ class DelegateFind extends AbsDelegate {
|
||||
//当设置了主键,而且主键的类型为integer时,查询RowID等于主键
|
||||
entity.rowID = cursor.getInt(
|
||||
cursor.getColumnIndex(TextUtils.isEmpty(primaryName) ? "rowid" : primaryName));
|
||||
mDataCache.put(getCacheKey(entity), entity);
|
||||
//mDataCache.put(getCacheKey(entity), entity);
|
||||
entitys.add(entity);
|
||||
}
|
||||
closeCursor(cursor);
|
||||
|
@ -62,7 +62,7 @@ class DelegateUpdate extends AbsDelegate {
|
||||
db = checkDb(db);
|
||||
Class<?> clazz = dbEntity.getClass();
|
||||
List<Field> fields = CommonUtil.getAllFields(clazz);
|
||||
DbEntity cacheEntity = mDataCache.get(getCacheKey(dbEntity));
|
||||
//DbEntity cacheEntity = mDataCache.get(getCacheKey(dbEntity));
|
||||
if (fields != null && fields.size() > 0) {
|
||||
ContentValues values = new ContentValues();
|
||||
try {
|
||||
@ -71,11 +71,14 @@ class DelegateUpdate extends AbsDelegate {
|
||||
if (isIgnore(dbEntity, field)) {
|
||||
continue;
|
||||
}
|
||||
if (cacheEntity != null
|
||||
&& field.get(dbEntity) == field.get(cacheEntity)
|
||||
&& !field.getName().equals("state")) { //在LruCache中 state字段总是不能重新赋值...
|
||||
continue;
|
||||
}
|
||||
//if (cacheEntity != null
|
||||
// && field.get(dbEntity).equals(field.get(cacheEntity))
|
||||
// && !field.getName().equals("state")) { //在LruCache中 state字段总是不能重新赋值...
|
||||
// Log.d(TAG, field.get(dbEntity) + "");
|
||||
// Log.d(TAG, field.get(cacheEntity) + "");
|
||||
//
|
||||
// continue;
|
||||
//}
|
||||
String value;
|
||||
Type type = field.getType();
|
||||
if (type == Map.class && checkMap(field)) {
|
||||
@ -98,7 +101,7 @@ class DelegateUpdate extends AbsDelegate {
|
||||
ALog.d(TAG, "没有数据更新");
|
||||
}
|
||||
}
|
||||
mDataCache.put(getCacheKey(dbEntity), dbEntity);
|
||||
//mDataCache.put(getCacheKey(dbEntity), dbEntity);
|
||||
close(db);
|
||||
}
|
||||
|
||||
|
@ -69,6 +69,27 @@ import java.util.regex.Pattern;
|
||||
public class CommonUtil {
|
||||
private static final String TAG = "CommonUtil";
|
||||
|
||||
/**
|
||||
* 拦截window.location.replace数据
|
||||
*
|
||||
* @return 重定向url
|
||||
*/
|
||||
public static String getWindowReplaceUrl(String text) {
|
||||
if (TextUtils.isEmpty(text)) {
|
||||
ALog.e(TAG, "拦截数据为null");
|
||||
return null;
|
||||
}
|
||||
String reg = Regular.REG_WINLOD_REPLACE;
|
||||
Pattern p = Pattern.compile(reg);
|
||||
Matcher m = p.matcher(text);
|
||||
if (m.find()){
|
||||
String s = m.group();
|
||||
s = s.substring(9, s.length() - 2);
|
||||
return s;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取sdcard app的缓存目录
|
||||
*
|
||||
|
@ -33,5 +33,5 @@ public interface Regular {
|
||||
/**
|
||||
* 匹配window.location.replace
|
||||
*/
|
||||
String REG_WINLOD_REPLACE = "\\.*replace(\\.*)\\.*";
|
||||
String REG_WINLOD_REPLACE = "replace\\(\".*\"\\)";
|
||||
}
|
||||
|
@ -4,6 +4,7 @@
|
||||
- 重构Aria的ORM模型
|
||||
- 可在任意类中使用Aria了,[使用方法](http://aria.laoyuyu.me/aria_doc/start/any_java.html)
|
||||
- window.location.replace("http://xxxx")类型的重定向支持
|
||||
- 适配gzip、deflate 压缩类型的输入流
|
||||
+ v_3.3.16
|
||||
- 修复一个activity启动多次,无法进行回掉的bug https://github.com/AriaLyy/Aria/issues/200
|
||||
- 优化target代码结构,移除路径被占用的提示
|
||||
|
@ -3,7 +3,6 @@ package com.arialyy.simple.test;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import com.arialyy.aria.core.Aria;
|
||||
import com.arialyy.aria.core.download.DownloadEntity;
|
||||
import com.arialyy.aria.core.inf.AbsEntity;
|
||||
import com.arialyy.simple.R;
|
||||
import com.arialyy.simple.base.BaseActivity;
|
||||
@ -18,7 +17,9 @@ public class AnyRunActivity extends BaseActivity<ActivityTestBinding> {
|
||||
AnyRunnModule module;
|
||||
String[] urls;
|
||||
int index = 0;
|
||||
String URL = "http://static.gaoshouyou.com/d/12/0d/7f120f50c80d2e7b8c4ba24ece4f9cdd.apk";
|
||||
//String URL = "http://static.gaoshouyou.com/d/12/0d/7f120f50c80d2e7b8c4ba24ece4f9cdd.apk";
|
||||
String URL =
|
||||
"https://www.baidu.com/link?url=_LFCuTPtnzFxVJByJ504QymRywIA1Z_T5xUxe9ZLuxcGM0C_RcdpWyB1eGjbJC-e5wv5wAKM4WmLMAS5KeF6EZJHB8Va3YqZUiaErqK_pxm&wd=&eqid=e8583fe70002d126000000065a99f864";
|
||||
|
||||
@Override protected int setLayoutId() {
|
||||
return R.layout.activity_test;
|
||||
@ -30,7 +31,6 @@ public class AnyRunActivity extends BaseActivity<ActivityTestBinding> {
|
||||
mBar.setVisibility(View.GONE);
|
||||
module = new AnyRunnModule(this);
|
||||
urls = getResources().getStringArray(R.array.group_urls);
|
||||
|
||||
}
|
||||
|
||||
public void onClick(View view) {
|
||||
@ -41,7 +41,6 @@ public class AnyRunActivity extends BaseActivity<ActivityTestBinding> {
|
||||
// module.start(urls[index]);
|
||||
// index++;
|
||||
//}
|
||||
//module.start("https://www.baidu.com/link?url=_LFCuTPtnzFxVJByJ504QymRywIA1Z_T5xUxe9ZLuxcGM0C_RcdpWyB1eGjbJC-e5wv5wAKM4WmLMAS5KeF6EZJHB8Va3YqZUiaErqK_pxm&wd=&eqid=e8583fe70002d126000000065a99f864");
|
||||
module.start(URL);
|
||||
break;
|
||||
case R.id.stop:
|
||||
|
@ -67,9 +67,9 @@ public class AnyRunnModule {
|
||||
mUrl = url;
|
||||
Aria.download(this)
|
||||
.load(url)
|
||||
.addHeader("Accept-Encoding", "gzip, deflate")
|
||||
.addHeader("Accept-Encoding", "gzip")
|
||||
.setRequestMode(RequestEnum.GET)
|
||||
.setFilePath(Environment.getExternalStorageDirectory().getPath() + "/ggsg123.apk")
|
||||
.setFilePath(Environment.getExternalStorageDirectory().getPath() + "/ggsg1234.apk")
|
||||
.resetState()
|
||||
.start();
|
||||
}
|
||||
|
Reference in New Issue
Block a user