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; }*/ }