pda/zhuike/.svn/pristine/e8/e8db5a1d3762c4b6d6e88a34d20...

258 lines
8.7 KiB
Plaintext

package com.novelbook.android.netutils;
import android.text.TextUtils;
import android.util.Log;
import com.novelbook.android.netapi.RandomHost;
import com.novelbook.android.utils.Constants;
import com.novelbook.android.utils.REUtil;
import org.json.JSONException;
import java.io.IOException;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
public class RetryInterceptor implements Interceptor {
private static final String TAG=RetryInterceptor.class.getSimpleName();
int RetryCount = 10;
public RetryInterceptor(){
}
/* public RetryInterceptor(RandomHost rh) {
this.rh=rh;
}*/
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
String oldUrl = request.url().toString();
Log.d(TAG, "HttpMethods intercept: request url:"+oldUrl);
String prefix = REUtil.match("(?i)http[s]?://[^/]+", oldUrl);
Log.d(TAG, "HttpMethods intercept: prefix:"+prefix);
if (prefix == null){
Response response = doRequest(chain, request);
if(response!=null)
{
return response;
}else
{
int i=0;
while(response==null && i<3){
response = doRequest(chain, request);
i++;
Log.d(TAG, String.format("HttpMethods intercept:a retried %s, response is null? %s",i, response == null));
}
if(response==null) {
throw new IOException();
}else {
return response;
}
}
}
String path = oldUrl.substring(prefix.length());
Log.d(TAG, "HttpMethods intercept: path:"+path);
RandomHost rh = null;
boolean isMainApi =path.equals("/api/g/");
if(oldUrl.indexOf("xiaoshuofenxiang.com") == -1 || !path.startsWith("/api/") || NetUtil.getHost(isMainApi)==null){
// rh = null;
if(oldUrl.indexOf("xiaoshuofenxiang.com")!=-1) {
Request.Builder requestBuilder = request.newBuilder();
requestBuilder.removeHeader("User-Agent").addHeader("User-Agent", HttpMethods.LOCALUSERAGENT);
request =requestBuilder.build();
}
Response response = doRequest(chain, request);
if(response!=null)
{
return response;
}else
{
int i=0;
while(response==null && i<3){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
response = doRequest(chain, request);
i++;
Log.d(TAG, String.format("HttpMethods intercept:b retried %s,%s,response is null? %s",i,request.url(), response == null));
}
if(response==null) {
throw new IOException();
}else {
return response;
}
}
}
try {
rh = new RandomHost(NetUtil.getHost(isMainApi), path);
Log.d(TAG, "HttpMethods intercept: create new RandomHost--------------------------");
} catch (JSONException e) {
Log.e(TAG, "intercept: ", e);
}
Response response = null;
while (true) {
String newPrefix = rh.next();
if ("".equals(newPrefix)) break;
String newUrl = newPrefix + path;
Log.d(TAG, "HttpMethods intercept: trying url is " + newUrl);
Request newRequest = null;
try {
Request.Builder requestBuilder = request.newBuilder();
requestBuilder.removeHeader("User-Agent").addHeader("User-Agent", HttpMethods.LOCALUSERAGENT)
.url(newUrl);
if (path.equals("/api/g/")) {
// if(new Date().getTime() - Constants.LAST_G > Constants.MAXAGE_G){ //
if (Constants.LAST_G == 0) {
requestBuilder.header("Cache-Control", "public, max-age=0");
Log.d(TAG, "prepare book access main api with force maxage=0");
}
}
newRequest = requestBuilder.build();
} catch (Exception e) {
Log.e(TAG, "HttpMethods intercept: " + newUrl);
Log.e(TAG, "HttpMethods intercept: ", e);
continue;
}
if (response != null) { try {response.close();} catch (IllegalStateException e) {} }
response = doRequest(chain, newRequest);
Log.d(TAG, String.format("HttpMethods intercept: %s, response is null? %s, ua %s",newRequest.url(), response == null,newRequest.header("User-Agent")));
/* int i=0;
while((response==null || !response.isSuccessful() )&& i<5){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
response = doRequest(chain, newRequest);
i++;
Log.d(TAG, String.format("HttpMethods intercept:C retried %s,%s, response is null? %s",i,newRequest.url(), response == null));
}*/
if (response != null) {
Log.d(TAG, String.format("HttpMethods intercept: response .code? %s", response.code()));
}
if (response != null && response.isSuccessful()) {
// rh = null;
Log.d(TAG, String.format("HttpMethods intercept isHostExpires get path %s" ,path));
if (path.equals("/api/g/") || path.equals("/api/g")) {
Log.d(TAG, String.format("HttpMethods intercept isHostExpires get main api %s" ,path));
String cacheControl = response.header("Cache-Control");
Log.d(TAG, String.format("HttpMethods intercept isHostExpires, cacheControl %s" ,cacheControl));
if(!TextUtils.isEmpty(cacheControl)) {
try {
Constants.MAXAGE_G = Integer.parseInt(cacheControl.substring("max-age=".length()));
Log.d(TAG, String.format("HttpMethods intercept isHostExpires Constants.MAXAGE_G: %s" ,Constants.MAXAGE_G));
}catch (Exception e)
{
Log.e(TAG, "intercept: parse max age error", e);
}
}
}
return response;
}
}
/* int tryCount=0;
String url =oldUrl;
while ( (response==null ||!response.isSuccessful()) && tryCount <= RetryCount) {
// if(tryCount>3)
{ //三次不成功后换其他url
url = switchServer(path);
if (url.equals(oldUrl)) {
url = switchServer(path);
}
if(TextUtils.isEmpty(url)){
return null;
}
}
Request newRequest = null;
try {
newRequest = request.newBuilder().url(url).build();
} catch (Exception e) {
Log.e(TAG, "HttpMethods intercept: "+url);
Log.e(TAG, "HttpMethods intercept: ", e);
return null;
}
Log.d("HttpMethods intercept", "Request is not successful - " + tryCount);
Log.d(TAG, "HttpMethods intercept: trying url is "+url);
tryCount++;
// retry the request
response = doRequest(chain, newRequest);
}*/
Log.d(TAG, String.format("HttpMethods intercept: set rh null,return response"));
rh = null;
if (response == null) {
throw new IOException();
}
return response;
}
private Response doRequest(Chain chain, Request request) throws IOException {
Response response = null;
Log.d(TAG, String.format("HttpMethods ua: %s, ua %s",request.url(), request.header("User-Agent")));
try {
response = chain.proceed(request);
} catch (Exception e) {
Log.e(TAG, "doRequest: error, " + request.url(),e );
}
return response;
}
/*private String switchServer(String key) {
String newUrl = rh.next();
if(TextUtils.isEmpty(newUrl)){
return newUrl;
}
*//* if(!newUrl.endsWith("/")){
newUrl+="/";
}*//*
return newUrl +key;
}*/
}