Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions okhttp/src/commonJvmAndroid/kotlin/okhttp3/HttpUrl.kt
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import okhttp3.internal.url.FRAGMENT_ENCODE_SET
import okhttp3.internal.url.FRAGMENT_ENCODE_SET_URI
import okhttp3.internal.url.PASSWORD_ENCODE_SET
import okhttp3.internal.url.PATH_SEGMENT_ENCODE_SET
import okhttp3.internal.url.PATH_SEGMENT_ENCODE_SET_RAW
import okhttp3.internal.url.PATH_SEGMENT_ENCODE_SET_URI
import okhttp3.internal.url.QUERY_COMPONENT_ENCODE_SET
import okhttp3.internal.url.QUERY_COMPONENT_ENCODE_SET_URI
Expand Down Expand Up @@ -1045,7 +1046,7 @@ class HttpUrl private constructor(
index: Int,
pathSegment: String,
) = apply {
val canonicalPathSegment = pathSegment.canonicalize(encodeSet = PATH_SEGMENT_ENCODE_SET)
val canonicalPathSegment = pathSegment.canonicalize(encodeSet = PATH_SEGMENT_ENCODE_SET_RAW)
require(!isDot(canonicalPathSegment) && !isDotDot(canonicalPathSegment)) {
"unexpected path segment: $pathSegment"
}
Expand Down Expand Up @@ -1547,7 +1548,7 @@ class HttpUrl private constructor(
input.canonicalize(
pos = pos,
limit = limit,
encodeSet = PATH_SEGMENT_ENCODE_SET,
encodeSet = if (alreadyEncoded) PATH_SEGMENT_ENCODE_SET else PATH_SEGMENT_ENCODE_SET_RAW,
alreadyEncoded = alreadyEncoded,
)
if (isDot(segment)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ internal val HEX_DIGITS =
internal const val USERNAME_ENCODE_SET = " \"':;<=>@[]^`{}|/\\?#"
internal const val PASSWORD_ENCODE_SET = " \"':;<=>@[]^`{}|/\\?#"
internal const val PATH_SEGMENT_ENCODE_SET = " \"<>^`{}|/\\?#"
internal const val PATH_SEGMENT_ENCODE_SET_RAW = " \"<>^`{}|/\\?#[]"
internal const val PATH_SEGMENT_ENCODE_SET_URI = "[]"
internal const val QUERY_ENCODE_SET = " \"'<>#"
internal const val QUERY_COMPONENT_REENCODE_SET = " \"'<>#&="
Expand Down
2 changes: 1 addition & 1 deletion okhttp/src/jvmTest/kotlin/okhttp3/HttpUrlJvmTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ open class HttpUrlJvmTest {
.addPathSegment("=[]:;\"~|?#@^/$%*")
.build()
assertThat(url.toString())
.isEqualTo("http://host/=[]:;%22~%7C%3F%23@%5E%2F$%25*")
.isEqualTo("http://host/=%5B%5D:;%22~%7C%3F%23@%5E%2F$%25*")
assertThat(url.toUri().toString())
.isEqualTo("http://host/=%5B%5D:;%22~%7C%3F%23@%5E%2F$%25*")
}
Expand Down
40 changes: 40 additions & 0 deletions okhttp/src/jvmTest/kotlin/okhttp3/HttpUrlTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -1535,6 +1535,35 @@ open class HttpUrlTest {
).isEqualTo("/a/b/c/%252e%252e")
}

@Test
fun addPathSegmentEncodesSquareBrackets() {
val url =
parse("http://host/")
.newBuilder()
.addPathSegment("a[0]")
.build()
assertThat(url.encodedPath).isEqualTo("/a%5B0%5D")
assertThat(url.pathSegments).containsExactly("a[0]")
}

@Test
fun addEncodedPathSegmentRetainsSquareBrackets() {
val url =
parse("http://host/")
.newBuilder()
.addEncodedPathSegment("a[0]")
.build()
assertThat(url.encodedPath).isEqualTo("/a[0]")
assertThat(url.pathSegments).containsExactly("a[0]")
}

@Test
fun parseRetainsSquareBracketsInPath() {
val url = parse("http://host/a[0]")
assertThat(url.encodedPath).isEqualTo("/a[0]")
assertThat(url.pathSegments).containsExactly("a[0]")
}

@Test
fun addPathSegmentDotDotPopsDirectory() {
val base = parse("http://host/a/b/c")
Expand Down Expand Up @@ -1635,6 +1664,17 @@ open class HttpUrlTest {
).isEqualTo("/%252e/b/c")
}

@Test
fun setPathSegmentEncodesSquareBrackets() {
val url =
parse("http://host/a/b/c")
.newBuilder()
.setPathSegment(0, "x[0]")
.build()
assertThat(url.encodedPath).isEqualTo("/x%5B0%5D/b/c")
assertThat(url.pathSegments).containsExactly("x[0]", "b", "c")
}

@Test
fun setPathSegmentAcceptsEmpty() {
val base = parse("http://host/a/b/c")
Expand Down
Loading