|
@@ -1,17 +1,14 @@
|
|
|
package com.drake.net.interceptor
|
|
|
|
|
|
+import com.drake.net.body.name
|
|
|
+import com.drake.net.body.peekBytes
|
|
|
+import com.drake.net.body.value
|
|
|
import com.drake.net.log.LogRecorder
|
|
|
-import com.drake.net.request.logString
|
|
|
-import com.drake.net.response.logString
|
|
|
-import okhttp3.Interceptor
|
|
|
-import okhttp3.Request
|
|
|
-import okhttp3.Response
|
|
|
+import okhttp3.*
|
|
|
|
|
|
/**
|
|
|
* 网络日志记录器
|
|
|
* 可以参考此拦截器为项目中其他网络请求库配置. 本拦截器属于标准的OkHttp拦截器适用于所有OkHttp拦截器内核的网络请求库
|
|
|
- * 如果项目中的日志需要特殊情况, 例如请求体加密, 响应体解密, 请继承本拦截器进行自定义
|
|
|
- * 使用Request/Response的peekString函数可以复制请求和响应字符串
|
|
|
*
|
|
|
* 在正式环境下请禁用此日志记录器. 因为他会消耗少量网络速度
|
|
|
*
|
|
@@ -25,10 +22,6 @@ open class LogRecordInterceptor(
|
|
|
var responseByteCount: Long = 1024 * 1024 * 4
|
|
|
) : Interceptor {
|
|
|
|
|
|
- init {
|
|
|
- LogRecorder.enabled = enabled
|
|
|
- }
|
|
|
-
|
|
|
override fun intercept(chain: Interceptor.Chain): Response {
|
|
|
val request = chain.request()
|
|
|
if (!enabled) {
|
|
@@ -37,20 +30,12 @@ open class LogRecordInterceptor(
|
|
|
|
|
|
val generateId = LogRecorder.generateId()
|
|
|
LogRecorder.recordRequest(
|
|
|
- generateId,
|
|
|
- request.url.toString(),
|
|
|
- request.method,
|
|
|
- request.headers.toMultimap(),
|
|
|
- requestString(request)
|
|
|
+ generateId, request.url.toString(), request.method, request.headers.toMultimap(), requestString(request)
|
|
|
)
|
|
|
try {
|
|
|
val response = chain.proceed(request)
|
|
|
LogRecorder.recordResponse(
|
|
|
- generateId,
|
|
|
- System.currentTimeMillis(),
|
|
|
- response.code,
|
|
|
- response.headers.toMultimap(),
|
|
|
- responseString(response)
|
|
|
+ generateId, System.currentTimeMillis(), response.code, response.headers.toMultimap(), responseString(response)
|
|
|
)
|
|
|
return response
|
|
|
} catch (e: Exception) {
|
|
@@ -64,13 +49,29 @@ open class LogRecordInterceptor(
|
|
|
* 请求字符串
|
|
|
*/
|
|
|
protected open fun requestString(request: Request): String? {
|
|
|
- return request.logString(requestByteCount)
|
|
|
+ val body = request.body ?: return null
|
|
|
+ val mediaType = body.contentType()
|
|
|
+ return when {
|
|
|
+ body is MultipartBody -> body.parts.joinToString("&") {
|
|
|
+ "${it.name()}=${it.value()}"
|
|
|
+ }
|
|
|
+ body is FormBody -> body.peekBytes(requestByteCount).utf8()
|
|
|
+ arrayOf("plain", "json", "xml", "html").contains(mediaType?.subtype) -> body.peekBytes(requestByteCount).utf8()
|
|
|
+ else -> "$mediaType does not support output logs"
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 响应字符串
|
|
|
*/
|
|
|
protected open fun responseString(response: Response): String? {
|
|
|
- return response.logString(responseByteCount)
|
|
|
+ val body = response.body ?: return null
|
|
|
+ val mediaType = body.contentType()
|
|
|
+ val isPrintType = arrayOf("plain", "json", "xml", "html").contains(mediaType?.subtype)
|
|
|
+ return if (isPrintType) {
|
|
|
+ body.peekBytes(responseByteCount).utf8()
|
|
|
+ } else {
|
|
|
+ "$mediaType does not support output logs"
|
|
|
+ }
|
|
|
}
|
|
|
}
|