/*
* Copyright (C) 2016 Amit Shekhar
* Copyright (C) 2011 Android Open Source Project
*
* 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.androidnetworking.internal;
/**
* Created by amitshekhar on 22/03/16.
*/
import android.content.Context;
import android.net.TrafficStats;
import com.androidnetworking.common.ANConstants;
import com.androidnetworking.common.ANRequest;
import com.androidnetworking.common.ConnectionClassManager;
import com.androidnetworking.interceptors.HttpLoggingInterceptor;
import com.androidnetworking.interceptors.HttpLoggingInterceptor.Level;
import com.androidnetworking.error.ANError;
import com.androidnetworking.utils.Utils;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import okhttp3.Headers;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import static com.androidnetworking.common.Method.DELETE;
import static com.androidnetworking.common.Method.GET;
import static com.androidnetworking.common.Method.HEAD;
import static com.androidnetworking.common.Method.PATCH;
import static com.androidnetworking.common.Method.POST;
import static com.androidnetworking.common.Method.PUT;
public final class InternalNetworking {
private InternalNetworking() {
}
public static OkHttpClient sHttpClient = getClient();
public static String sUserAgent = null;
public static Response performSimpleRequest(ANRequest request) throws ANError {
Request okHttpRequest;
Response okHttpResponse;
try {
Request.Builder builder = new Request.Builder().url(request.getUrl());
addHeadersToRequestBuilder(builder, request);
RequestBody requestBody = null;
switch (request.getMethod()) {
case GET: {
builder = builder.get();
break;
}
case POST: {
requestBody = request.getRequestBody();
builder = builder.post(requestBody);
break;
}
case PUT: {
requestBody = request.getRequestBody();
builder = builder.put(requestBody);
break;
}
case DELETE: {
requestBody = request.getRequestBody();
builder = builder.delete(requestBody);
break;
}
case HEAD: {
builder = builder.head();
break;
}
case PATCH: {
requestBody = request.getRequestBody();
builder = builder.patch(requestBody);
break;
}
}
if (request.getCacheControl() != null) {
builder.cacheControl(request.getCacheControl());
}
okHttpRequest = builder.build();
if (request.getOkHttpClient() != null) {
request.setCall(request.getOkHttpClient().newBuilder().cache(sHttpClient.cache()).build().newCall(okHttpRequest));
} else {
request.setCall(sHttpClient.newCall(okHttpRequest));
}
final long startTime = System.currentTimeMillis();
final long startBytes = TrafficStats.getTotalRxBytes();
okHttpResponse = request.getCall().execute();
final long timeTaken = System.currentTimeMillis() - startTime;
if (okHttpResponse.cacheResponse() == null) {
final long finalBytes = TrafficStats.getTotalRxBytes();
final long diffBytes;
if (startBytes == TrafficStats.UNSUPPORTED || finalBytes == TrafficStats.UNSUPPORTED) {
diffBytes = okHttpResponse.body().contentLength();
} else {
diffBytes = finalBytes - startBytes;
}
ConnectionClassManager.getInstance().updateBandwidth(diffBytes, timeTaken);
Utils.sendAnalytics(request.getAnalyticsListener(), timeTaken,
(requestBody != null &&
requestBody.contentLength() != 0) ? requestBody.contentLength() : -1,
okHttpResponse.body().contentLength(), false);
} else if (request.getAnalyticsListener() != null) {
if (okHttpResponse.networkResponse() == null) {
Utils.sendAnalytics(request.getAnalyticsListener(), timeTaken, 0, 0, true);
} else {
Utils.sendAnalytics(request.getAnalyticsListener(), timeTaken,
(requestBody != null && requestBody.contentLength() != 0) ? requestBody.contentLength() : -1,
0, true);
}
}
} catch (IOException ioe) {
throw new ANError(ioe);
}
return okHttpResponse;
}
public static Response performDownloadRequest(final ANRequest request) throws ANError {
Request okHttpRequest;
Response okHttpResponse;
try {
Request.Builder builder = new Request.Builder().url(request.getUrl());
addHeadersToRequestBuilder(builder, request);
builder = builder.get();
if (request.getCacheControl() != null) {
builder.cacheControl(request.getCacheControl());
}
okHttpRequest = builder.build();
OkHttpClient okHttpClient;
if (request.getOkHttpClient() != null) {
okHttpClient = request.getOkHttpClient().newBuilder().cache(sHttpClient.cache())
.addNetworkInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Response originalResponse = chain.proceed(chain.request());
return originalResponse.newBuilder()
.body(new ResponseProgressBody(originalResponse.body(),
request.getDownloadProgressListener()))
.build();
}
}).build();
} else {
okHttpClient = sHttpClient.newBuilder()
.addNetworkInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Response originalResponse = chain.proceed(chain.request());
return originalResponse.newBuilder()
.body(new ResponseProgressBody(originalResponse.body(),
request.getDownloadProgressListener()))
.build();
}
}).build();
}
request.setCall(okHttpClient.newCall(okHttpRequest));
final long startTime = System.currentTimeMillis();
final long startBytes = TrafficStats.getTotalRxBytes();
okHttpResponse = request.getCall().execute();
Utils.saveFile(okHttpResponse, request.getDirPath(), request.getFileName());
final long timeTaken = System.currentTimeMillis() - startTime;
if (okHttpResponse.cacheResponse() == null) {
final long finalBytes = TrafficStats.getTotalRxBytes();
final long diffBytes;
if (startBytes == TrafficStats.UNSUPPORTED || finalBytes == TrafficStats.UNSUPPORTED) {
diffBytes = okHttpResponse.body().contentLength();
} else {
diffBytes = finalBytes - startBytes;
}
ConnectionClassManager.getInstance().updateBandwidth(diffBytes, timeTaken);
Utils.sendAnalytics(request.getAnalyticsListener(), timeTaken, -1,
okHttpResponse.body().contentLength(), false);
} else if (request.getAnalyticsListener() != null) {
Utils.sendAnalytics(request.getAnalyticsListener(), timeTaken, -1, 0, true);
}
} catch (IOException ioe) {
try {
File destinationFile = new File(request.getDirPath() + File.separator + request.getFileName());
if (destinationFile.exists()) {
destinationFile.delete();
}
} catch (Exception e) {
e.printStackTrace();
}
throw new ANError(ioe);
}
return okHttpResponse;
}
public static Response performUploadRequest(ANRequest request) throws ANError {
Request okHttpRequest;
Response okHttpResponse;
try {
Request.Builder builder = new Request.Builder().url(request.getUrl());
addHeadersToRequestBuilder(builder, request);
final RequestBody requestBody = request.getMultiPartRequestBody();
final long requestBodyLength = requestBody.contentLength();
builder = builder.post(new RequestProgressBody(requestBody, request.getUploadProgressListener()));
if (request.getCacheControl() != null) {
builder.cacheControl(request.getCacheControl());
}
okHttpRequest = builder.build();
if (request.getOkHttpClient() != null) {
request.setCall(request.getOkHttpClient()
.newBuilder()
.cache(sHttpClient.cache())
.build()
.newCall(okHttpRequest));
} else {
request.setCall(sHttpClient.newCall(okHttpRequest));
}
final long startTime = System.currentTimeMillis();
okHttpResponse = request.getCall().execute();
final long timeTaken = System.currentTimeMillis() - startTime;
if (request.getAnalyticsListener() != null) {
if (okHttpResponse.cacheResponse() == null) {
Utils.sendAnalytics(request.getAnalyticsListener(), timeTaken,
requestBodyLength, okHttpResponse.body().contentLength(), false);
} else {
if (okHttpResponse.networkResponse() == null) {
Utils.sendAnalytics(request.getAnalyticsListener(), timeTaken, 0, 0, true);
} else {
Utils.sendAnalytics(request.getAnalyticsListener(), timeTaken,
requestBodyLength != 0 ? requestBodyLength : -1, 0, true);
}
}
}
} catch (IOException ioe) {
throw new ANError(ioe);
}
return okHttpResponse;
}
public static OkHttpClient getClient() {
if (sHttpClient == null) {
return getDefaultClient();
}
return sHttpClient;
}
public static void addHeadersToRequestBuilder(Request.Builder builder, ANRequest request) {
if (request.getUserAgent() != null) {
builder.addHeader(ANConstants.USER_AGENT, request.getUserAgent());
} else if (sUserAgent != null) {
request.setUserAgent(sUserAgent);
builder.addHeader(ANConstants.USER_AGENT, sUserAgent);
}
Headers requestHeaders = request.getHeaders();
if (requestHeaders != null) {
builder.headers(requestHeaders);
if (request.getUserAgent() != null && !requestHeaders.names().contains(ANConstants.USER_AGENT)) {
builder.addHeader(ANConstants.USER_AGENT, request.getUserAgent());
}
}
}
public static OkHttpClient getDefaultClient() {
return new OkHttpClient().newBuilder()
.connectTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.build();
}
public static void setClientWithCache(Context context) {
sHttpClient = new OkHttpClient().newBuilder()
.cache(Utils.getCache(context, ANConstants.MAX_CACHE_SIZE, ANConstants.CACHE_DIR_NAME))
.connectTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.build();
}
public static void setUserAgent(String userAgent) {
sUserAgent = userAgent;
}
public static void setClient(OkHttpClient okHttpClient) {
sHttpClient = okHttpClient;
}
public static void enableLogging(Level level) {
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(level);
sHttpClient = getClient()
.newBuilder()
.addInterceptor(logging)
.build();
}
}