package com.doumee.lib_coremodel.http.interceptor.logging; 
 | 
  
 | 
import android.text.TextUtils; 
 | 
  
 | 
import org.json.JSONArray; 
 | 
import org.json.JSONException; 
 | 
import org.json.JSONObject; 
 | 
  
 | 
import java.io.IOException; 
 | 
import java.util.List; 
 | 
  
 | 
import okhttp3.FormBody; 
 | 
import okhttp3.Request; 
 | 
import okio.Buffer; 
 | 
  
 | 
/** 
 | 
 * @author ihsan on 09/02/2017. 
 | 
 */ 
 | 
  
 | 
class Printer { 
 | 
  
 | 
    private static final int JSON_INDENT = 3; 
 | 
  
 | 
    private static final String LINE_SEPARATOR = System.getProperty("line.separator"); 
 | 
    private static final String DOUBLE_SEPARATOR = LINE_SEPARATOR + LINE_SEPARATOR; 
 | 
  
 | 
    private static final String[] OMITTED_RESPONSE = {LINE_SEPARATOR, "Omitted response body"}; 
 | 
    private static final String[] OMITTED_REQUEST = {LINE_SEPARATOR, "Omitted request body"}; 
 | 
  
 | 
    private static final String N = "\n"; 
 | 
    private static final String T = "\t"; 
 | 
    private static final String REQUEST_UP_LINE = "┌────── Request ────────────────────────────────────────────────────────────────────────"; 
 | 
    private static final String END_LINE = "└───────────────────────────────────────────────────────────────────────────────────────"; 
 | 
    private static final String RESPONSE_UP_LINE = "┌────── Response ───────────────────────────────────────────────────────────────────────"; 
 | 
    private static final String BODY_TAG = "Body:"; 
 | 
    private static final String URL_TAG = "URL: "; 
 | 
    private static final String METHOD_TAG = "Method: @"; 
 | 
    private static final String HEADERS_TAG = "Headers:"; 
 | 
    private static final String STATUS_CODE_TAG = "Status Code: "; 
 | 
    private static final String RECEIVED_TAG = "Received in: "; 
 | 
    private static final String CORNER_UP = "┌ "; 
 | 
    private static final String CORNER_BOTTOM = "└ "; 
 | 
    private static final String CENTER_LINE = "├ "; 
 | 
    private static final String DEFAULT_LINE = "│ "; 
 | 
  
 | 
    protected Printer() { 
 | 
        throw new UnsupportedOperationException(); 
 | 
    } 
 | 
  
 | 
    private static boolean isEmpty(String line) { 
 | 
        return TextUtils.isEmpty(line) || N.equals(line) || T.equals(line) || TextUtils.isEmpty(line.trim()); 
 | 
    } 
 | 
  
 | 
    static void printJsonRequest(LoggingInterceptor.Builder builder, Request request) { 
 | 
        String requestBody = LINE_SEPARATOR + BODY_TAG + LINE_SEPARATOR + bodyToString(request); 
 | 
        String tag = builder.getTag(true); 
 | 
        if (builder.getLogger() == null) 
 | 
            I.log(builder.getType(), tag, REQUEST_UP_LINE); 
 | 
        logLines(builder.getType(), tag, new String[]{URL_TAG + request.url()}, builder.getLogger(), false); 
 | 
        logLines(builder.getType(), tag, getRequest(request, builder.getLevel()), builder.getLogger(), true); 
 | 
        if (request.body() instanceof FormBody) { 
 | 
            StringBuilder formBody = new StringBuilder(); 
 | 
            FormBody body = (FormBody) request.body(); 
 | 
            if (body != null && body.size() != 0) { 
 | 
                for (int i = 0; i < body.size(); i++) { 
 | 
                    formBody.append(body.encodedName(i) + "=" + body.encodedValue(i) + "&"); 
 | 
                } 
 | 
                formBody.delete(formBody.length() - 1, formBody.length()); 
 | 
                logLines(builder.getType(), tag, new String[]{formBody.toString()}, builder.getLogger(), true); 
 | 
            } 
 | 
        } 
 | 
        if (builder.getLevel() == Level.BASIC || builder.getLevel() == Level.BODY) { 
 | 
            logLines(builder.getType(), tag, requestBody.split(LINE_SEPARATOR), builder.getLogger(), true); 
 | 
        } 
 | 
        if (builder.getLogger() == null) 
 | 
            I.log(builder.getType(), tag, END_LINE); 
 | 
    } 
 | 
  
 | 
    static void printJsonResponse(LoggingInterceptor.Builder builder, long chainMs, boolean isSuccessful, 
 | 
                                  int code, String headers, String bodyString, List<String> segments) { 
 | 
        String responseBody = LINE_SEPARATOR + BODY_TAG + LINE_SEPARATOR + getJsonString(bodyString); 
 | 
        String tag = builder.getTag(false); 
 | 
        if (builder.getLogger() == null) 
 | 
            I.log(builder.getType(), tag, RESPONSE_UP_LINE); 
 | 
  
 | 
        logLines(builder.getType(), tag, getResponse(headers, chainMs, code, isSuccessful, 
 | 
                builder.getLevel(), segments), builder.getLogger(), true); 
 | 
        if (builder.getLevel() == Level.BASIC || builder.getLevel() == Level.BODY) { 
 | 
            logLines(builder.getType(), tag, responseBody.split(LINE_SEPARATOR), builder.getLogger(), true); 
 | 
        } 
 | 
        if (builder.getLogger() == null) 
 | 
            I.log(builder.getType(), tag, END_LINE); 
 | 
    } 
 | 
  
 | 
    static void printFileRequest(LoggingInterceptor.Builder builder, Request request) { 
 | 
        String tag = builder.getTag(true); 
 | 
        if (builder.getLogger() == null) 
 | 
            I.log(builder.getType(), tag, REQUEST_UP_LINE); 
 | 
        logLines(builder.getType(), tag, new String[]{URL_TAG + request.url()}, builder.getLogger(), false); 
 | 
        logLines(builder.getType(), tag, getRequest(request, builder.getLevel()), builder.getLogger(), true); 
 | 
        if (request.body() instanceof FormBody) { 
 | 
            StringBuilder formBody = new StringBuilder(); 
 | 
            FormBody body = (FormBody) request.body(); 
 | 
            if (body != null && body.size() != 0) { 
 | 
                for (int i = 0; i < body.size(); i++) { 
 | 
                    formBody.append(body.encodedName(i) + "=" + body.encodedValue(i) + "&"); 
 | 
                } 
 | 
                formBody.delete(formBody.length() - 1, formBody.length()); 
 | 
                logLines(builder.getType(), tag, new String[]{formBody.toString()}, builder.getLogger(), true); 
 | 
            } 
 | 
        } 
 | 
        if (builder.getLevel() == Level.BASIC || builder.getLevel() == Level.BODY) { 
 | 
            logLines(builder.getType(), tag, OMITTED_REQUEST, builder.getLogger(), true); 
 | 
        } 
 | 
        if (builder.getLogger() == null) 
 | 
            I.log(builder.getType(), tag, END_LINE); 
 | 
    } 
 | 
  
 | 
    static void printFileResponse(LoggingInterceptor.Builder builder, long chainMs, boolean isSuccessful, 
 | 
                                  int code, String headers, List<String> segments) { 
 | 
        String tag = builder.getTag(false); 
 | 
        if (builder.getLogger() == null) 
 | 
            I.log(builder.getType(), tag, RESPONSE_UP_LINE); 
 | 
  
 | 
        logLines(builder.getType(), tag, getResponse(headers, chainMs, code, isSuccessful, 
 | 
                builder.getLevel(), segments), builder.getLogger(), true); 
 | 
        logLines(builder.getType(), tag, OMITTED_RESPONSE, builder.getLogger(), true); 
 | 
        if (builder.getLogger() == null) 
 | 
            I.log(builder.getType(), tag, END_LINE); 
 | 
    } 
 | 
  
 | 
    private static String[] getRequest(Request request, Level level) { 
 | 
        String message; 
 | 
        String header = request.headers().toString(); 
 | 
        boolean loggableHeader = level == Level.HEADERS || level == Level.BASIC; 
 | 
        message = METHOD_TAG + request.method() + DOUBLE_SEPARATOR + 
 | 
                (isEmpty(header) ? "" : loggableHeader ? HEADERS_TAG + LINE_SEPARATOR + dotHeaders(header) : ""); 
 | 
        return message.split(LINE_SEPARATOR); 
 | 
    } 
 | 
  
 | 
    private static String[] getResponse(String header, long tookMs, int code, boolean isSuccessful, 
 | 
                                        Level level, List<String> segments) { 
 | 
        String message; 
 | 
        boolean loggableHeader = level == Level.HEADERS || level == Level.BASIC; 
 | 
        String segmentString = slashSegments(segments); 
 | 
        message = ((!TextUtils.isEmpty(segmentString) ? segmentString + " - " : "") + "is success : " 
 | 
                + isSuccessful + " - " + RECEIVED_TAG + tookMs + "ms" + DOUBLE_SEPARATOR + STATUS_CODE_TAG + 
 | 
                code + DOUBLE_SEPARATOR + (isEmpty(header) ? "" : loggableHeader ? HEADERS_TAG + LINE_SEPARATOR + 
 | 
                dotHeaders(header) : "")); 
 | 
        return message.split(LINE_SEPARATOR); 
 | 
    } 
 | 
  
 | 
    private static String slashSegments(List<String> segments) { 
 | 
        StringBuilder segmentString = new StringBuilder(); 
 | 
        for (String segment : segments) { 
 | 
            segmentString.append("/").append(segment); 
 | 
        } 
 | 
        return segmentString.toString(); 
 | 
    } 
 | 
  
 | 
    private static String dotHeaders(String header) { 
 | 
        String[] headers = header.split(LINE_SEPARATOR); 
 | 
        StringBuilder builder = new StringBuilder(); 
 | 
        String tag = "─ "; 
 | 
        if (headers.length > 1) { 
 | 
            for (int i = 0; i < headers.length; i++) { 
 | 
                if (i == 0) { 
 | 
                    tag = CORNER_UP; 
 | 
                } else if (i == headers.length - 1) { 
 | 
                    tag = CORNER_BOTTOM; 
 | 
                } else { 
 | 
                    tag = CENTER_LINE; 
 | 
                } 
 | 
                builder.append(tag).append(headers[i]).append("\n"); 
 | 
            } 
 | 
        } else { 
 | 
            for (String item : headers) { 
 | 
                builder.append(tag).append(item).append("\n"); 
 | 
            } 
 | 
        } 
 | 
        return builder.toString(); 
 | 
    } 
 | 
  
 | 
    private static void logLines(int type, String tag, String[] lines, Logger logger, boolean withLineSize) { 
 | 
        for (String line : lines) { 
 | 
            int lineLength = line.length(); 
 | 
            int MAX_LONG_SIZE = withLineSize ? 110 : lineLength; 
 | 
            for (int i = 0; i <= lineLength / MAX_LONG_SIZE; i++) { 
 | 
                int start = i * MAX_LONG_SIZE; 
 | 
                int end = (i + 1) * MAX_LONG_SIZE; 
 | 
                end = end > line.length() ? line.length() : end; 
 | 
                if (logger == null) { 
 | 
                    I.log(type, tag, DEFAULT_LINE + line.substring(start, end)); 
 | 
                } else { 
 | 
                    logger.log(type, tag, line.substring(start, end)); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    private static String bodyToString(final Request request) { 
 | 
        try { 
 | 
            final Request copy = request.newBuilder().build(); 
 | 
            final Buffer buffer = new Buffer(); 
 | 
            if (copy.body() == null) 
 | 
                return ""; 
 | 
            copy.body().writeTo(buffer); 
 | 
            return getJsonString(buffer.readUtf8()); 
 | 
        } catch (final IOException e) { 
 | 
            return "{\"err\": \"" + e.getMessage() + "\"}"; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    static String getJsonString(String msg) { 
 | 
        String message; 
 | 
        try { 
 | 
            if (msg.startsWith("{")) { 
 | 
                JSONObject jsonObject = new JSONObject(msg); 
 | 
                message = jsonObject.toString(JSON_INDENT); 
 | 
            } else if (msg.startsWith("[")) { 
 | 
                JSONArray jsonArray = new JSONArray(msg); 
 | 
                message = jsonArray.toString(JSON_INDENT); 
 | 
            } else { 
 | 
                message = msg; 
 | 
            } 
 | 
        } catch (JSONException e) { 
 | 
            message = msg; 
 | 
        } 
 | 
        return message; 
 | 
    } 
 | 
  
 | 
} 
 |