From 3d6509f815abe5b426dc168b8e6b47254f382328 Mon Sep 17 00:00:00 2001 From: adamw Date: Tue, 6 Mar 2018 15:07:26 +0100 Subject: Add a "RelaxedWithBrackets" query fragment encoding --- core/src/main/scala/com/softwaremill/sttp/Uri.scala | 15 ++++++++++++++- core/src/test/scala/com/softwaremill/sttp/UriTests.scala | 4 +++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/core/src/main/scala/com/softwaremill/sttp/Uri.scala b/core/src/main/scala/com/softwaremill/sttp/Uri.scala index 7ae0013..58f483c 100644 --- a/core/src/main/scala/com/softwaremill/sttp/Uri.scala +++ b/core/src/main/scala/com/softwaremill/sttp/Uri.scala @@ -140,6 +140,8 @@ case class Uri(scheme: String, encode(Rfc3986.QueryNoStandardDelims, spaceAsPlus = true, encodePlus = true)(s) case QueryFragmentEncoding.Relaxed => encode(Rfc3986.Query, spaceAsPlus = true)(s) + case QueryFragmentEncoding.RelaxedWithBrackets => + encode(Rfc3986.QueryWithBrackets, spaceAsPlus = true)(s) } private object Rfc3986 { @@ -158,6 +160,7 @@ case class Uri(scheme: String, val Fragment: Set[Char] = Query val QueryNoStandardDelims: Set[Char] = Query -- Set('&', '=') + val QueryWithBrackets: Set[Char] = Query ++ Set('[', ']') } private val IpV6Pattern = "[0-9a-fA-F:]+".r @@ -263,9 +266,19 @@ object Uri { /** * Doesn't encode any of the reserved characters, leaving intact all - * characters allow in the query string as defined by RFC3986. + * characters allowed in the query string as defined by RFC3986. */ case object Relaxed extends QueryFragmentEncoding + + /** + * Doesn't encode any of the reserved characters, leaving intact all + * characters allowed in the query string as defined by RFC3986 as well + * as the characters `[` and `]`. These brackets aren't legal in the + * query part of the URI, but some servers use them unencoded. See + * https://stackoverflow.com/questions/11490326/is-array-syntax-using-square-brackets-in-url-query-strings-valid + * for discussion. + */ + case object RelaxedWithBrackets extends QueryFragmentEncoding } case class UserInfo(username: String, password: Option[String]) diff --git a/core/src/test/scala/com/softwaremill/sttp/UriTests.scala b/core/src/test/scala/com/softwaremill/sttp/UriTests.scala index 5250303..86d694c 100644 --- a/core/src/test/scala/com/softwaremill/sttp/UriTests.scala +++ b/core/src/test/scala/com/softwaremill/sttp/UriTests.scala @@ -76,7 +76,9 @@ class UriTests extends FunSuite with Matchers { List(QF.Plain("ą/ę&+;?", encoding = QueryFragmentEncoding.Relaxed)) -> "%C4%85/%C4%99&+;?", List(QF.KeyValue("k", "v1,v2", valueEncoding = QueryFragmentEncoding.All)) -> "k=v1%2Cv2", List(QF.KeyValue("k", "v1,v2")) -> "k=v1,v2", - List(QF.KeyValue("k", "+1234")) -> "k=%2B1234" + List(QF.KeyValue("k", "+1234")) -> "k=%2B1234", + List(QF.KeyValue("k", "[]")) -> "k=%5B%5D", + List(QF.KeyValue("k", "[]", valueEncoding = QueryFragmentEncoding.RelaxedWithBrackets)) -> "k=[]" ) for { -- cgit v1.2.3