@@ -22,6 +22,7 @@ import java.nio.charset.Charset
22
22
import java.util.TreeSet
23
23
import java.util.concurrent.TimeUnit
24
24
import okhttp3.Headers
25
+ import okhttp3.HttpUrl
25
26
import okhttp3.Interceptor
26
27
import okhttp3.OkHttpClient
27
28
import okhttp3.Response
@@ -46,6 +47,8 @@ class HttpLoggingInterceptor
46
47
) : Interceptor {
47
48
@Volatile private var headersToRedact = emptySet<String >()
48
49
50
+ @Volatile private var queryParamsNameToRedact = emptySet<String >()
51
+
49
52
@set:JvmName(" level" )
50
53
@Volatile
51
54
var level = Level .NONE
@@ -132,6 +135,13 @@ class HttpLoggingInterceptor
132
135
headersToRedact = newHeadersToRedact
133
136
}
134
137
138
+ fun redactQueryParams (vararg name : String ) {
139
+ val newQueryParamsNameToRedact = TreeSet (String .CASE_INSENSITIVE_ORDER )
140
+ newQueryParamsNameToRedact + = queryParamsNameToRedact
141
+ newQueryParamsNameToRedact.addAll(name)
142
+ queryParamsNameToRedact = newQueryParamsNameToRedact
143
+ }
144
+
135
145
/* *
136
146
* Sets the level and returns this.
137
147
*
@@ -168,7 +178,7 @@ class HttpLoggingInterceptor
168
178
169
179
val connection = chain.connection()
170
180
var requestStartMessage =
171
- (" --> ${request.method} ${request.url}${if (connection != null ) " " + connection.protocol() else " " } " )
181
+ (" --> ${request.method} ${sanitizeUrl( request.url) }${if (connection != null ) " " + connection.protocol() else " " } " )
172
182
if (! logHeaders && requestBody != null ) {
173
183
requestStartMessage + = " (${requestBody.contentLength()} -byte body)"
174
184
}
@@ -251,7 +261,7 @@ class HttpLoggingInterceptor
251
261
buildString {
252
262
append(" <-- ${response.code} " )
253
263
if (response.message.isNotEmpty()) append(" ${response.message} " )
254
- append(" ${response.request.url} (${tookMs} ms" )
264
+ append(" ${sanitizeUrl( response.request.url) } (${tookMs} ms" )
255
265
if (! logHeaders) append(" , $bodySize body" )
256
266
append(" )" )
257
267
},
@@ -312,6 +322,29 @@ class HttpLoggingInterceptor
312
322
return response
313
323
}
314
324
325
+ private fun sanitizeUrl (url : HttpUrl ): String {
326
+ val params = ArrayList <Pair <String , String >>()
327
+ for (parameterName in url.queryParameterNames) {
328
+ params.add(
329
+ Pair (
330
+ first = parameterName,
331
+ second = if (parameterName in queryParamsNameToRedact) " ██" else url.queryParameter(parameterName) ? : " " ,
332
+ ),
333
+ )
334
+ }
335
+ val queryParamsBuilder = StringBuilder ()
336
+ val totalParam = params.size
337
+ if (totalParam > 0 ) {
338
+ queryParamsBuilder.append(" ?" )
339
+ params.forEachIndexed { index, param ->
340
+ val suffix = if (index != totalParam - 1 ) " &" else " "
341
+ queryParamsBuilder.append(" ${param.first} =${param.second}$suffix " )
342
+ }
343
+ }
344
+
345
+ return " ${url.toString().substringBefore(" ?" )}$queryParamsBuilder "
346
+ }
347
+
315
348
private fun logHeader (
316
349
headers : Headers ,
317
350
i : Int ,
0 commit comments