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); 
 | 
        } 
 | 
    } 
 | 
  
 | 
} 
 |