@@ -301,7 +301,9 @@ case class Uri(
301301 /** Serializes the query to a string, encoding the segments. The leading `?` is not included. Might be an empty
302302 * string, if there's no query.
303303 */
304- def queryToString : String = {
304+ def queryToString : String = queryToStringSafe()
305+
306+ private def queryToStringSafe (sensitiveQueryParams : Set [String ] = Set .empty): String = {
305307 @ tailrec
306308 def encodeQuerySegments (qss : List [QuerySegment ], previousWasPlain : Boolean , sb : StringBuilder ): String =
307309 qss match {
@@ -317,7 +319,7 @@ case class Uri(
317319
318320 case KeyValue (k, v, kEnc, vEnc) :: t =>
319321 if (! previousWasPlain) sb.append(" &" )
320- sb.append(kEnc(k)).append(" =" ).append(vEnc(v))
322+ sb.append(kEnc(k)).append(" =" ).append(if (sensitiveQueryParams(k)) " *** " else vEnc(v))
321323 encodeQuerySegments(t, previousWasPlain = false , sb)
322324 }
323325 encodeQuerySegments(querySegments.toList, previousWasPlain = true , new StringBuilder ())
@@ -331,14 +333,19 @@ case class Uri(
331333 fragmentSegment.fold(" " )(s => s.encoded)
332334 }
333335
334- override def toString : String = {
336+ override def toString : String = toStringSafe()
337+
338+ /** @return
339+ * Representation where sensitive query params value is omitted.
340+ */
341+ def toStringSafe (sensitiveQueryParams : Set [String ] = Set .empty): String = {
335342 val schemeS = scheme.map(s => encode(Rfc3986 .Scheme )(s) + " :" ).getOrElse(" " )
336343 val authorityS = authority.fold(" " )(_.toString)
337344
338345 val pathS = pathToString
339346
340347 val queryPrefixS = if (querySegments.isEmpty) " " else " ?"
341- val queryS = queryToString
348+ val queryS = queryToStringSafe(sensitiveQueryParams)
342349
343350 val fragS = fragmentSegment.fold(" " )(s => " #" + s.encoded)
344351
0 commit comments