package com.example.smart.reqeust.interceptor import android.text.TextUtils import android.util.Log import okhttp3.* import okio.Buffer import java.io.IOException class LoggingInterceptor :Interceptor{ private val tag = "DHLoggingInterceptor" @Throws(IOException::class) override fun intercept(chain: Interceptor.Chain): Response { val request = chain.request() logForRequest(request) val response = chain.proceed(request) return logForResponse(response) } private fun logForResponse(response: Response): Response { try { Log.e(tag, "========response'log=======") val builder = response.newBuilder() val clone = builder.build() Log.e(tag, "url : " + clone.request.url) Log.e(tag, "code : " + clone.code) Log.e(tag, "protocol : " + clone.protocol) if (!TextUtils.isEmpty(clone.message)) { Log.e(tag, "message : " + clone.message) } var body = clone.body if (body != null) { val mediaType = body.contentType() if (mediaType != null) { Log.e(tag, "responseBody's contentType : $mediaType") if (isText(mediaType)) { val resp = body.string() Log.e(tag, "responseBody's content : $resp") body = ResponseBody.create(mediaType, resp) return response.newBuilder().body(body).build() } else { Log.e( tag, "responseBody's content : " + " maybe [file part] , too large too print , ignored!" ) } } } Log.e(tag, "========response'log=======end") } catch (e: Exception) { Log.e(tag, "e.printStackTrace();") } return response } private fun logForRequest(request: Request) { try { val url = request.url.toString() val headers = request.headers Log.e(tag, "========request'log=======") Log.e(tag, "method : " + request.method) Log.e(tag, "url : $url") if (headers.size > 0) { Log.e(tag, "headers size: " + headers.size) Log.e(tag, "headers : $headers") } val requestBody = request.body if (requestBody != null) { val mediaType = requestBody.contentType() if (mediaType != null) { Log.e( tag, "requestBody's contentType : $mediaType" ) if (isText(mediaType)) { Log.e( tag, "requestBody's content : " + bodyToString(request) ) } else { Log.e( tag, "requestBody's content : " + " maybe [file part] , too large too print , ignored!" ) } } } Log.e(tag, "========request'log=======end") } catch (e: Exception) { Log.e(tag, "e.printStackTrace();") } } private fun isText(mediaType: MediaType): Boolean { if (mediaType.type == "text") { return true } if (mediaType.subtype == "json" || mediaType.subtype == "xml" || mediaType.subtype == "html" || mediaType.subtype == "webviewhtml") return true return false } private fun bodyToString(request: Request): String { return try { val copy = request.newBuilder().build() val buffer = Buffer() copy.body!!.writeTo(buffer) buffer.readUtf8() } catch (e: IOException) { "something error when show requestBody." } } }