package com.doumee.lib_coremodel.http.interceptor.logging;
|
|
import android.text.TextUtils;
|
|
import java.io.IOException;
|
import java.util.Iterator;
|
import java.util.List;
|
import java.util.Set;
|
import java.util.concurrent.TimeUnit;
|
|
import okhttp3.Headers;
|
import okhttp3.Interceptor;
|
import okhttp3.MediaType;
|
import okhttp3.Request;
|
import okhttp3.RequestBody;
|
import okhttp3.Response;
|
import okhttp3.ResponseBody;
|
import okhttp3.internal.platform.Platform;
|
|
/**
|
* @author ihsan on 09/02/2017.
|
*/
|
|
public class LoggingInterceptor implements Interceptor {
|
|
private boolean isDebug;
|
private Builder builder;
|
|
private LoggingInterceptor(Builder builder) {
|
this.builder = builder;
|
this.isDebug = builder.isDebug;
|
}
|
|
@Override
|
public Response intercept(Chain chain) throws IOException {
|
Request request = chain.request();
|
if (builder.getHeaders().size() > 0) {
|
Headers headers = request.headers();
|
Set<String> names = headers.names();
|
Iterator<String> iterator = names.iterator();
|
Request.Builder requestBuilder = request.newBuilder();
|
requestBuilder.headers(builder.getHeaders());
|
while (iterator.hasNext()) {
|
String name = iterator.next();
|
requestBuilder.addHeader(name, headers.get(name));
|
}
|
request = requestBuilder.build();
|
}
|
|
if (!isDebug || builder.getLevel() == Level.NONE) {
|
return chain.proceed(request);
|
}
|
RequestBody requestBody = request.body();
|
|
MediaType rContentType = null;
|
if (requestBody != null) {
|
rContentType = request.body().contentType();
|
}
|
|
String rSubtype = null;
|
if (rContentType != null) {
|
rSubtype = rContentType.subtype();
|
}
|
|
if (rSubtype != null && (rSubtype.contains("json")
|
|| rSubtype.contains("xml")
|
|| rSubtype.contains("plain")
|
|| rSubtype.contains("html"))) {
|
Printer.printJsonRequest(builder, request);
|
} else {
|
Printer.printFileRequest(builder, request);
|
}
|
|
long st = System.nanoTime();
|
Response response = chain.proceed(request);
|
|
List<String> segmentList = request.url().encodedPathSegments();
|
long chainMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - st);
|
String header = response.headers().toString();
|
int code = response.code();
|
boolean isSuccessful = response.isSuccessful();
|
ResponseBody responseBody = response.body();
|
MediaType contentType = responseBody.contentType();
|
|
String subtype = null;
|
ResponseBody body;
|
|
if (contentType != null) {
|
subtype = contentType.subtype();
|
}
|
|
if (subtype != null && (subtype.contains("json")
|
|| subtype.contains("xml")
|
|| subtype.contains("plain")
|
|| subtype.contains("html"))) {
|
String bodyString = responseBody.string();
|
//todo 隐藏返回
|
String bodyJson = Printer.getJsonString(bodyString);
|
Printer.printJsonResponse(builder, chainMs, isSuccessful, code, header, bodyJson, segmentList);
|
body = ResponseBody.create(contentType, bodyString);
|
} else {
|
Printer.printFileResponse(builder, chainMs, isSuccessful, code, header, segmentList);
|
return response;
|
}
|
return response.newBuilder().body(body).build();
|
}
|
|
@SuppressWarnings("unused")
|
public static class Builder {
|
|
private static String TAG = "LoggingI";
|
private boolean isDebug;
|
private int type = Platform.INFO;
|
private String requestTag;
|
private String responseTag;
|
private Level level = Level.BASIC;
|
private Headers.Builder builder;
|
private Logger logger;
|
|
public Builder() {
|
builder = new Headers.Builder();
|
}
|
|
int getType() {
|
return type;
|
}
|
|
Level getLevel() {
|
return level;
|
}
|
|
Headers getHeaders() {
|
return builder.build();
|
}
|
|
String getTag(boolean isRequest) {
|
if (isRequest) {
|
return TextUtils.isEmpty(requestTag) ? TAG : requestTag;
|
} else {
|
return TextUtils.isEmpty(responseTag) ? TAG : responseTag;
|
}
|
}
|
|
Logger getLogger() {
|
return logger;
|
}
|
|
/**
|
* @param name Filed
|
* @param value Value
|
* @return Builder
|
* Add a field with the specified value
|
*/
|
public Builder addHeader(String name, String value) {
|
builder.set(name, value);
|
return this;
|
}
|
|
/**
|
* @param level set log level
|
* @return Builder
|
* @see Level
|
*/
|
public Builder setLevel(Level level) {
|
this.level = level;
|
return this;
|
}
|
|
/**
|
* Set request and response each log tag
|
*
|
* @param tag general log tag
|
* @return Builder
|
*/
|
public Builder tag(String tag) {
|
TAG = tag;
|
return this;
|
}
|
|
/**
|
* Set request log tag
|
*
|
* @param tag request log tag
|
* @return Builder
|
*/
|
public Builder request(String tag) {
|
this.requestTag = tag;
|
return this;
|
}
|
|
/**
|
* Set response log tag
|
*
|
* @param tag response log tag
|
* @return Builder
|
*/
|
public Builder response(String tag) {
|
this.responseTag = tag;
|
return this;
|
}
|
|
/**
|
* @param isDebug set can sending log output
|
* @return Builder
|
*/
|
public Builder loggable(boolean isDebug) {
|
this.isDebug = isDebug;
|
return this;
|
}
|
|
/**
|
* @param type set sending log output type
|
* @return Builder
|
* @see Platform
|
*/
|
public Builder log(int type) {
|
this.type = type;
|
return this;
|
}
|
|
/**
|
* @param logger manuel logging interface
|
* @return Builder
|
* @see Logger
|
*/
|
public Builder logger(Logger logger) {
|
this.logger = logger;
|
return this;
|
}
|
|
public LoggingInterceptor build() {
|
return new LoggingInterceptor(this);
|
}
|
}
|
|
}
|