完善 HttpHelper

This commit is contained in:
seven332 committed 2014-06-28 02:36:15 +08:00
1 parent d7e42a760c
commit db3fe7e446
10 files changed
+331 -257

No files matched your search

+1
View File
@@ -144,6 +144,7 @@
<string name="em_unexpected_response_code">非预期的响应码:%d</string>
<string name="em_redirection_error">太多重定向</string>
<string name="em_host_error">主机错误</string>
<string name="em_get_body_error">获取正文失败</string>
<string name="em_invalid_request">无效的请求</string>
<string name="em_no_sdcard">未挂载 SD卡</string>
+1
View File
@@ -145,6 +145,7 @@
<string name="em_unexpected_response_code">Unexpected response code : %d</string>
<string name="em_redirection_error">Too many redirects</string>
<string name="em_host_error">Host error</string>
<string name="em_get_body_error">Get body error</string>
<string name="em_invalid_request">Invalid request</string>
<string name="em_no_sdcard">SD card is Unmounted</string>
@@ -131,9 +131,4 @@ public class GallerysDownloader {
void onGalleryDownloadFailed(DownloadInfo downloadInfo, String eMsg);
void onGalleryDownloadCompleted(DownloadInfo downloadInfo);
}
}
+26 -17
View File
@@ -272,7 +272,8 @@ public class EhClient {
final HttpHelper hp = new HttpHelper(mAppContext);
hp.setOnRespondListener(new HttpHelper.OnRespondListener() {
@Override
public void onSuccess(String body) {
public void onSuccess(Object obj) {
String body = (String)obj;
LoginParser parser = new LoginParser();
if (parser.parser(body)) {
mInfo.login(username, parser.displayname);
@@ -360,7 +361,8 @@ public class EhClient {
HttpHelper hp = new HttpHelper(mAppContext);
hp.setOnRespondListener(new HttpHelper.OnRespondListener() {
@Override
public void onSuccess(String body) {
public void onSuccess(Object obj) {
String body = (String)obj;
ListParser parser = new ListParser();
switch (parser.parser(body)) {
case ListParser.ALL:
@@ -398,7 +400,8 @@ public class EhClient {
HttpHelper hp = new HttpHelper(mAppContext);
hp.setOnRespondListener(new HttpHelper.OnRespondListener() {
@Override
public void onSuccess(String body) {
public void onSuccess(Object obj) {
String body = (String)obj;
DetailParser parser = new DetailParser();
int mode = DetailParser.DETAIL | DetailParser.TAG
| DetailParser.PREVIEW_INFO | DetailParser.PREVIEW
@@ -463,7 +466,8 @@ public class EhClient {
HttpHelper hp = new HttpHelper(mAppContext);
hp.setOnRespondListener(new HttpHelper.OnRespondListener() {
@Override
public void onSuccess(String body) {
public void onSuccess(Object obj) {
String body = (String)obj;
DetailParser parser = new DetailParser();
parser.setMode(DetailParser.PREVIEW);
if (parser.parser(body) == DetailParser.PREVIEW) {
@@ -905,10 +909,11 @@ public class EhClient {
HttpHelper hp = new HttpHelper(mAppContext);
hp.setOnRespondListener(new HttpHelper.OnRespondListener() {
@Override
public void onSuccess(String pageContent) {
public void onSuccess(Object obj) {
String body = (String)obj;
DetailParser parser = new DetailParser();
parser.setMode(DetailParser.COMMENT);
if (parser.parser(pageContent) == DetailParser.COMMENT) {
if (parser.parser(body) == DetailParser.COMMENT) {
listener.onSuccess(parser.comments);
} else {
listener.onFailure("parser error"); // TODO
@@ -958,9 +963,10 @@ public class EhClient {
HttpHelper hp = new HttpHelper(mAppContext);
hp.setOnRespondListener(new HttpHelper.OnRespondListener() {
@Override
public void onSuccess(String pageContext) {
public void onSuccess(Object obj) {
String body = (String)obj;
RateParser parser = new RateParser();
if (parser.parser(pageContext)) {
if (parser.parser(body)) {
listener.onSuccess(parser.mRatingAvg, parser.mRatingCnt);
} else {
listener.onFailure("parser error"); // TODO
@@ -1008,9 +1014,10 @@ public class EhClient {
HttpHelper hp = new HttpHelper(mAppContext);
hp.setOnRespondListener(new HttpHelper.OnRespondListener() {
@Override
public void onSuccess(String pageContext) {
public void onSuccess(Object obj) {
String body = (String)obj;
VoteParser parser = new VoteParser();
if (parser.parser(pageContext)) {
if (parser.parser(body)) {
listener.onSuccess(parser.mTagPane);
} else {
listener.onFailure("parser error"); // TODO
@@ -1065,10 +1072,10 @@ public class EhClient {
HttpHelper hp = new HttpHelper(mAppContext);
hp.setOnRespondListener(new HttpHelper.OnRespondListener() {
@Override
public void onSuccess(String pageContext) {
public void onSuccess(Object obj) {
String body = (String)obj;
AddToFavoriteParser parser = new AddToFavoriteParser();
if (parser.parser(pageContext)) {
if (parser.parser(body)) {
listener.onSuccess();
// Analytics
Analytics.addToFavoriteGallery(mAppContext, gid, token);
@@ -1185,9 +1192,10 @@ public class EhClient {
HttpHelper hp = new HttpHelper(mAppContext);
hp.setOnRespondListener(new HttpHelper.OnRespondListener() {
@Override
public void onSuccess(String pageContext) {
public void onSuccess(Object obj) {
String body = (String)obj;
ListParser parser = new ListParser();
int re = parser.parser(pageContext);
int re = parser.parser(body);
if (re == ListParser.ALL) {
listener.onSuccess(parser.giList, parser.indexPerPage, parser.maxPage);
} else if (re == ListParser.NOT_FOUND) {
@@ -1240,10 +1248,11 @@ public class EhClient {
HttpHelper hp = new HttpHelper(mAppContext);
hp.setOnRespondListener(new HttpHelper.OnRespondListener() {
@Override
public void onSuccess(String pageContext) {
public void onSuccess(Object obj) {
String body = (String)obj;
try {
List<GalleryInfo> gis = new ArrayList<GalleryInfo>();
JSONObject js = new JSONObject(pageContext);
JSONObject js = new JSONObject(body);
js = js.getJSONObject("popular");
if (!js.has("galleries")) {
@@ -48,6 +48,7 @@ public class EhInfo {
private static final Bitmap.CompressFormat AVATAR_FORMAT = Bitmap.CompressFormat.PNG;
private static Bitmap DEFAULT_AVATAR;
public static final String EX_HOST = "exhentai.org";
public static final String[] COOKIABLE_HOSTS = {"exhentai.org",
"g.e-hentai.org", "forums.e-hentai.org"};
@@ -1,21 +0,0 @@
/*
* Copyright (C) 2014 Hippo Seven
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.hippo.ehviewer.exception;
public class RedirectionException extends Exception {
private static final long serialVersionUID = 1L;
}
@@ -1,37 +0,0 @@
/*
* Copyright (C) 2014 Hippo Seven
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.hippo.ehviewer.exception;
public class ResponseCodeException extends Exception {
private static final long serialVersionUID = 1L;
private static final String eMsg = "Error response code";
private int mResponseCode;
public ResponseCodeException(int responseCode) {
this(responseCode, eMsg);
}
public ResponseCodeException(int responseCode, String message) {
super(message);
mResponseCode = responseCode;
}
public int getResponseCode() {
return mResponseCode;
}
}
@@ -1,21 +0,0 @@
/*
* Copyright (C) 2014 Hippo Seven
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.hippo.ehviewer.exception;
public class SadPandaException extends Exception {
private static final long serialVersionUID = 1L;
}
+3 -12
View File
@@ -36,8 +36,6 @@ import com.hippo.ehviewer.util.Log;
import com.hippo.ehviewer.R;
import com.hippo.ehviewer.exception.FileException;
import com.hippo.ehviewer.exception.NoSdCardException;
import com.hippo.ehviewer.exception.RedirectionException;
import com.hippo.ehviewer.exception.ResponseCodeException;
import com.hippo.ehviewer.exception.StopRequestException;
import com.hippo.ehviewer.util.Util;
@@ -146,13 +144,6 @@ public class Downloader implements Runnable {
else if (mException instanceof UnknownHostException)
return mContext.getString(R.string.em_unknown_host);
else if (mException instanceof ResponseCodeException)
return String.format(mContext.getString(R.string.em_unexpected_response_code),
((ResponseCodeException)mException).getResponseCode());
else if (mException instanceof RedirectionException)
return mContext.getString(R.string.em_redirection_error);
else if (mException instanceof SocketException)
return "SocketException : " + mException.getMessage();
@@ -267,7 +258,7 @@ public class Downloader implements Runnable {
continue;
default:
throw new ResponseCodeException(responseCode);
//throw new ResponseCodeException(responseCode);
}
} catch (Exception e) {
throw e;
@@ -276,7 +267,7 @@ public class Downloader implements Runnable {
conn.disconnect();
}
}
throw new RedirectionException();
//throw new RedirectionException();
}
/**
@@ -287,7 +278,7 @@ public class Downloader implements Runnable {
private void processResponseHeaders(HttpURLConnection conn) {
mTotalSize = conn.getContentLength();
// bytes 500-999/1234
//
String range;
if ((range = conn.getHeaderField("Content-Range")) != null) { // Support Content-Range
boolean newNum = true;
+299 -144
View File
@@ -16,24 +16,20 @@
package com.hippo.ehviewer.network;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.CookieHandler;
import java.net.CookieManager;
import java.net.CookiePolicy;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.net.URLEncoder;
import java.net.UnknownHostException;
import java.util.List;
import java.util.Map;
import java.util.zip.GZIPInputStream;
import org.apache.http.conn.ConnectTimeoutException;
@@ -42,9 +38,7 @@ import org.json.JSONObject;
import com.hippo.ehviewer.R;
import com.hippo.ehviewer.ehclient.EhClient;
import com.hippo.ehviewer.ehclient.EhInfo;
import com.hippo.ehviewer.exception.RedirectionException;
import com.hippo.ehviewer.exception.ResponseCodeException;
import com.hippo.ehviewer.exception.SadPandaException;
import com.hippo.ehviewer.exception.StopRequestException;
import com.hippo.ehviewer.util.Constants;
import com.hippo.ehviewer.util.Ui;
import com.hippo.ehviewer.util.Util;
@@ -67,13 +61,18 @@ public class HttpHelper {
private static final String TAG = "HttpHelper";
public static final String SAD_PANDA_ERROR = "Sad Panda";
public static final String HAPPY_PANDA_BODY = "Happy Panda";
public static final String DOWNLOAD_STOP = "Stop";
public static final String DOWNLOAD_OK = "Download";
private static String DEFAULT_CHARSET = "utf-8";
private static String CHARSET_KEY = "charset=";
class Package {
Object obj;
OnRespondListener listener;
String str;
public Package(Object obj, OnRespondListener listener) {
this.obj = obj;
this.listener = listener;
}
}
private static Handler mHandler;
@@ -90,13 +89,13 @@ public class HttpHelper {
public void handleMessage(Message msg) {
Package p = (Package)msg.obj;
OnRespondListener listener = p.listener;
String str = p.str;
Object obj = p.obj;
switch (msg.what) {
case Constants.TRUE:
listener.onSuccess(str);
listener.onSuccess(obj);
break;
case Constants.FALSE:
listener.onFailure(str);
listener.onFailure((String)obj);
break;
}
}
@@ -104,7 +103,7 @@ public class HttpHelper {
}
public interface OnRespondListener {
void onSuccess(String body);
void onSuccess(Object body);
void onFailure(String eMsg);
}
@@ -114,7 +113,6 @@ public class HttpHelper {
public HttpHelper(Context context) {
mContext = context;
mContext.getApplicationContext();
}
@@ -153,49 +151,13 @@ public class HttpHelper {
else if (e instanceof SadPandaException)
return SAD_PANDA_ERROR;
else if (e instanceof GetBodyException)
return "获取失败"; // TODO
else
return e.getMessage();
}
private String getBody(HttpURLConnection conn)
throws IOException {
String pageContext = null;
InputStream is = null;
ByteArrayOutputStream baos = null;
try {
is = conn.getInputStream();
String encoding = conn.getContentEncoding();
if (encoding != null && encoding.equals("gzip"))
is = new GZIPInputStream(is);
int length = conn.getContentLength();
if (length >= 0)
baos = new ByteArrayOutputStream(length);
else
baos = new ByteArrayOutputStream();
Util.copy(is, baos, Constant.BUFFER_SIZE);
// Get charset
String charset = null;
String contentType = conn.getContentType();
int index = -1;
if (contentType != null
&& (index = contentType.indexOf(CHARSET_KEY)) != -1) {
charset = contentType.substring(index + CHARSET_KEY.length());
} else
charset = DEFAULT_CHARSET;
pageContext = baos.toString(charset);
} catch (IOException e) {
throw e;
} finally {
Util.closeStreamQuietly(is);
Util.closeStreamQuietly(baos);
}
return pageContext;
}
private boolean isUrlCookiable(URL url) {
String host = url.getHost();
for (String h : EhInfo.COOKIABLE_HOSTS) {
@@ -205,7 +167,7 @@ public class HttpHelper {
return false;
}
private String requst(RequestHelper rh, String urlStr) {
private Object requst(RequestHelper rh, String urlStr) {
mException = null;
int redirectionCount = 0;
URL url = null;
@@ -221,7 +183,6 @@ public class HttpHelper {
while (redirectionCount++ < Constant.MAX_REDIRECTS) {
conn = (HttpURLConnection) url.openConnection();
conn.setInstanceFollowRedirects(true);
conn.addRequestProperty("Accept-Encoding", "gzip");
conn.setRequestProperty("User-Agent", Constant.userAgent);
conn.setConnectTimeout(Constant.DEFAULT_TIMEOUT);
conn.setReadTimeout(Constant.DEFAULT_TIMEOUT);
@@ -237,32 +198,30 @@ public class HttpHelper {
case HttpURLConnection.HTTP_OK:
case HttpURLConnection.HTTP_PARTIAL:
// Test sad panda
String contentType = conn.getHeaderField("Content-Type");
if (contentType != null && contentType.equals("image/gif"))
throw new SadPandaException();
if (url.getHost().equals(EhInfo.EX_HOST)) {
String contentType = conn.getHeaderField("Content-Type");
if (contentType != null && contentType.equals("image/gif"))
throw new SadPandaException();
}
// Store cookie if necessary
if (isCookiable)
EhInfo.getInstance(mContext).storeCookie(conn);
// Get body if necessary
String body = rh.isNeedBody();
if (body == null)
body = getBody(conn);
// Get object connection
Object obj = rh.onAfterConnect(conn);
// Send to UI thread if necessary
if (msg != null) {
Package p = new Package();
p.listener = mListener;
p.str = body;
msg.obj = p;
msg.obj = new Package(obj, mListener);
msg.what = Constants.TRUE;
mHandler.sendMessage(msg);
}
return body;
return obj;
// redirect
case HttpURLConnection.HTTP_MOVED_PERM:
case HttpURLConnection.HTTP_MOVED_TEMP:
case HttpURLConnection.HTTP_SEE_OTHER:
case Constant.HTTP_TEMP_REDIRECT:
final String location = conn.getHeaderField("Location");
conn.disconnect();
url = new URL(url, location);
continue;
@@ -270,15 +229,13 @@ public class HttpHelper {
throw new ResponseCodeException(responseCode);
}
}
throw new RedirectionException();
} catch (Exception e) {
mException = e;
e.printStackTrace();
if (msg != null) {
Package p = new Package();
p.listener = mListener;
p.str = getEMsg();
msg.obj = p;
msg.obj = new Package(getEMsg(), mListener);
msg.what = Constants.FALSE;
mHandler.sendMessage(msg);
}
@@ -287,17 +244,23 @@ public class HttpHelper {
if (conn != null)
conn.disconnect();
}
mException = new RedirectionException();
return null;
}
interface RequestHelper {
private interface RequestHelper {
/**
* Add header or do something else for HttpURLConnection before connect
* @param conn
* @throws Exception
*/
public void onBeforeConnect(HttpURLConnection conn) throws Exception;
/**
* If need body, return null, otherwise return a string used as body
* Get what do you need from HttpURLConnection after connect
* Return null means get error
* @param conn
* @return
* @throws Exception
*/
public String isNeedBody();
public Object onAfterConnect(HttpURLConnection conn) throws Exception;
}
/**
@@ -306,35 +269,88 @@ public class HttpHelper {
private class CheckSpHelper implements RequestHelper {
@Override
public void onBeforeConnect(HttpURLConnection conn)
throws ProtocolException {
throws Exception {
conn.setRequestMethod("HEAD");
}
@Override
public String isNeedBody() {
public Object onAfterConnect(HttpURLConnection conn)
throws Exception {
return HAPPY_PANDA_BODY;
}
}
private abstract class GetStringHelper implements RequestHelper {
@Override
public void onBeforeConnect(HttpURLConnection conn)
throws Exception {
conn.addRequestProperty("Accept-Encoding", "gzip");
}
private String getBody(HttpURLConnection conn)
throws Exception {
String body = null;
InputStream is = null;
ByteArrayOutputStream baos = null;
try {
is = conn.getInputStream();
String encoding = conn.getContentEncoding();
if (encoding != null && encoding.equals("gzip"))
is = new GZIPInputStream(is);
int length = conn.getContentLength();
if (length >= 0)
baos = new ByteArrayOutputStream(length);
else
baos = new ByteArrayOutputStream();
Util.copy(is, baos, Constant.BUFFER_SIZE);
// Get charset
String charset = null;
String contentType = conn.getContentType();
int index = -1;
if (contentType != null
&& (index = contentType.indexOf(CHARSET_KEY)) != -1) {
charset = contentType.substring(index + CHARSET_KEY.length());
} else
charset = DEFAULT_CHARSET;
body = baos.toString(charset);
if (body == null)
throw new GetBodyException();
} catch (Exception e) {
throw e;
} finally {
Util.closeStreamQuietly(is);
Util.closeStreamQuietly(baos);
}
return body;
}
@Override
public Object onAfterConnect(HttpURLConnection conn)
throws Exception {
return getBody(conn);
}
}
/**
* RequstHelper for GET method
*/
private class GetHelper implements RequestHelper {
private class GetHelper extends GetStringHelper {
@Override
public void onBeforeConnect(HttpURLConnection conn)
throws ProtocolException {
throws Exception {
super.onBeforeConnect(conn);
conn.setRequestMethod("GET");
}
@Override
public String isNeedBody() {
return null;
}
}
/**
* RequstHelper for post form data, use POST method
*/
private class PostFormHelper implements RequestHelper {
private class PostFormHelper extends GetStringHelper {
private String[][] mArgs;
public PostFormHelper(String[][] args) {
@@ -344,6 +360,7 @@ public class HttpHelper {
@Override
public void onBeforeConnect(HttpURLConnection conn)
throws Exception {
super.onBeforeConnect(conn);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
@@ -367,16 +384,12 @@ public class HttpHelper {
out.flush();
out.close();
}
@Override
public String isNeedBody() {
return null;
}
}
/**
* RequstHelper for post json, use POST method
*/
private class PostJsonHelper implements RequestHelper {
private class PostJsonHelper extends GetStringHelper {
private JSONObject mJo;
public PostJsonHelper(JSONObject jo) {
@@ -385,6 +398,7 @@ public class HttpHelper {
@Override
public void onBeforeConnect(HttpURLConnection conn) throws Exception {
super.onBeforeConnect(conn);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
@@ -396,18 +410,155 @@ public class HttpHelper {
out.flush();
out.close();
}
}
private class GetImageHelper implements RequestHelper {
@Override
public String isNeedBody() {
return null;
public void onBeforeConnect(HttpURLConnection conn)
throws Exception {
conn.setRequestMethod("GET");
}
@Override
public Object onAfterConnect(HttpURLConnection conn)
throws Exception {
Bitmap bmp = BitmapFactory.decodeStream(conn.getInputStream(), null, Ui.getBitmapOpt());
if (bmp == null)
throw new GetBodyException();
return bmp;
}
}
public interface OnDownloadListener {
public void onDownloadStartConnect();
/**
* If totalSize -1 for can't get length info
* @param totalSize
*/
public void onDownloadStartDownload(int totalSize);
public void onDownloadStatusUpdate(int downloadSize, int totalSize);
/**
* FAILED or COMPLETED or STOPED
* @param status
*/
public void onDownloadOver(int status, String eMsg);
}
public class DownloadControlor {
private boolean mStop = false;
public void stop() {
mStop = true;
}
public void reset() {
mStop = false;
}
public boolean isStop() {
return mStop;
}
}
private class DownloadHelper implements RequestHelper {
private File mDir;
private String mFileName;
private DownloadControlor mControlor;
private OnDownloadListener mListener;
private int mContentLength;
private int mReceivedSize;
public DownloadHelper(File dir, String fileName, DownloadControlor controlor, OnDownloadListener listener) {
mDir = dir;
mFileName = fileName;
mControlor = controlor;
mListener = listener;
}
@Override
public void onBeforeConnect(HttpURLConnection conn) throws Exception {
conn.setRequestMethod("GET");
conn.addRequestProperty("Range", "bytes=0-");
mListener.onDownloadStartConnect();
}
private int getContentLength(HttpURLConnection conn) {
int contentLength = conn.getContentLength();
String range;
if (contentLength == -1 &&
(range = conn.getHeaderField("Content-Range")) != null) {
// Content-Range looks like bytes 500-999/1234
contentLength = 0;
int step = 0;
boolean isNum = false;
char ch;
for (int i = 0; i < range.length(); i++) {
ch = range.charAt(i);
if (ch >= '0' && ch <= '9') {
if (!isNum) {
isNum = true;
step++;
}
} else {
isNum = false;
}
if (isNum && step == 3)
contentLength = contentLength * 10 + ch - '0';
}
}
return contentLength;
}
@Override
public Object onAfterConnect(HttpURLConnection conn) throws Exception {
mContentLength = getContentLength(conn);
mListener.onDownloadStartDownload(mContentLength);
// Make sure parent exist
mDir.mkdirs();
File file = new File(mDir, mFileName);
try {
transferData(conn.getInputStream(), new FileOutputStream(file));
return DOWNLOAD_OK;
} catch (StopRequestException e) {
return DOWNLOAD_STOP;
} catch (Exception e) {
throw e;
}
}
private void transferData(InputStream in, OutputStream out)
throws Exception {
final byte data[] = new byte[Constant.BUFFER_SIZE];
mReceivedSize = 0;
while (true) {
if (mControlor.isStop())
throw new StopRequestException();
int bytesRead = in.read(data);
if (bytesRead == -1)
break;
out.write(data, 0, bytesRead);
mReceivedSize += bytesRead;
mListener.onDownloadStatusUpdate(mReceivedSize, mContentLength);
}
if (mContentLength != -1 && mReceivedSize != mContentLength)
throw new UncompletedException();
}
}
/**
* Check Sad Panda
* Check Sad Panda.
* If get Sad Panda, return null,
* else return HttpHelper.HAPPY_PANDA_BODY
* @return
*/
public String checkSadPanda() {
return requst(new CheckSpHelper(), EhClient.EX_HEADER);
return (String)requst(new CheckSpHelper(), EhClient.EX_HEADER);
}
/**
@@ -416,7 +567,7 @@ public class HttpHelper {
* @return
*/
public String get(String url) {
return requst(new GetHelper(), url);
return (String)requst(new GetHelper(), url);
}
/**
@@ -426,7 +577,7 @@ public class HttpHelper {
* @return
*/
public String postForm(String url, String[][] args) {
return requst(new PostFormHelper(args), url);
return (String)requst(new PostFormHelper(args), url);
}
/**
@@ -436,55 +587,59 @@ public class HttpHelper {
* @return
*/
public String postJson(String url, JSONObject json) {
return requst(new PostJsonHelper(json), url);
return (String)requst(new PostJsonHelper(json), url);
}
public Bitmap getImage(String urlStr) {
mException = null;
/**
* Get image
* @param url
* @return
*/
public Bitmap getImage(String url) {
return (Bitmap)requst(new GetImageHelper(), url);
}
public String download(String url, File dir, String file,
DownloadControlor controlor, OnDownloadListener listener) {
return (String)requst(new DownloadHelper(dir, file,
controlor, listener), url);
}
/** Exceptions **/
public class SadPandaException extends Exception {
private static final long serialVersionUID = 1L;
}
public class GetBodyException extends Exception {
private static final long serialVersionUID = 1L;
}
public class RedirectionException extends Exception {
private static final long serialVersionUID = 1L;
}
public class UncompletedException extends Exception {
private static final long serialVersionUID = 1L;
}
public class ResponseCodeException extends Exception {
int redirectionCount = 0;
URL url = null;
HttpURLConnection conn = null;
private static final long serialVersionUID = 1L;
private static final String eMsg = "Error response code";
private int mResponseCode;
try {
Log.d(TAG, "Http get image " + urlStr);
url = new URL(urlStr);
while (redirectionCount++ < Constant.MAX_REDIRECTS) {
conn = (HttpURLConnection)url.openConnection();
conn.setRequestProperty("User-Agent", Constant.userAgent);
conn.setConnectTimeout(Constant.DEFAULT_TIMEOUT);
conn.setReadTimeout(Constant.DEFAULT_TIMEOUT);
conn.setRequestMethod("GET");
conn.connect();
final int responseCode = conn.getResponseCode();
switch (responseCode) {
case HttpURLConnection.HTTP_OK:
case HttpURLConnection.HTTP_PARTIAL:
Bitmap bitmap = BitmapFactory.decodeStream(conn.getInputStream(), null, Ui.getBitmapOpt());
return bitmap;
case HttpURLConnection.HTTP_MOVED_PERM:
case HttpURLConnection.HTTP_MOVED_TEMP:
case HttpURLConnection.HTTP_SEE_OTHER:
case Constant.HTTP_TEMP_REDIRECT:
final String location = conn.getHeaderField("Location");
url = new URL(url, location);
continue;
default:
throw new ResponseCodeException(responseCode);
}
}
} catch (Exception e) {
mException = e;
e.printStackTrace();
return null;
} finally {
if (conn != null)
conn.disconnect();
public ResponseCodeException(int responseCode) {
this(responseCode, eMsg);
}
public ResponseCodeException(int responseCode, String message) {
super(message);
mResponseCode = responseCode;
}
public int getResponseCode() {
return mResponseCode;
}
mException = new RedirectionException();
return null;
}
}