aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoradamw <adam@warski.org>2018-03-06 15:07:26 +0100
committeradamw <adam@warski.org>2018-03-06 15:07:26 +0100
commit3d6509f815abe5b426dc168b8e6b47254f382328 (patch)
tree7b70711dd9c2bee1ba9209bc81bdd8819199d9a7
parenta38dfc9475c61e3cd6b489f35526ec8f4c70f6a5 (diff)
downloadsttp-3d6509f815abe5b426dc168b8e6b47254f382328.tar.gz
sttp-3d6509f815abe5b426dc168b8e6b47254f382328.tar.bz2
sttp-3d6509f815abe5b426dc168b8e6b47254f382328.zip
Add a "RelaxedWithBrackets" query fragment encoding
-rw-r--r--core/src/main/scala/com/softwaremill/sttp/Uri.scala15
-rw-r--r--core/src/test/scala/com/softwaremill/sttp/UriTests.scala4
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 {