mirror of
https://github.com/square/okhttp.git
synced 2025-08-01 16:06:56 +03:00
Add a proper Kotlin constructor for Request (#7208)
* Add a proper Kotlin constructor for Request This turns out to be very useful throughout our test suite. * Dump updated API * Fix multipleTags Kotlin conversion
This commit is contained in:
@ -26,6 +26,7 @@ import mockwebserver3.MockResponse
|
|||||||
import mockwebserver3.MockWebServer
|
import mockwebserver3.MockWebServer
|
||||||
import mockwebserver3.junit5.internal.MockWebServerExtension
|
import mockwebserver3.junit5.internal.MockWebServerExtension
|
||||||
import okhttp3.AsyncDns
|
import okhttp3.AsyncDns
|
||||||
|
import okhttp3.HttpUrl.Companion.toHttpUrl
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
import okhttp3.tls.HandshakeCertificates
|
import okhttp3.tls.HandshakeCertificates
|
||||||
@ -74,7 +75,7 @@ class AndroidAsyncDnsTest(val server: MockWebServer) {
|
|||||||
fun testRequest() {
|
fun testRequest() {
|
||||||
server.enqueue(MockResponse())
|
server.enqueue(MockResponse())
|
||||||
|
|
||||||
val call = client.newCall(Request.Builder().url(server.url("/")).build())
|
val call = client.newCall(Request(server.url("/")))
|
||||||
|
|
||||||
call.execute().use { response ->
|
call.execute().use { response ->
|
||||||
assertThat(response.code).isEqualTo(200)
|
assertThat(response.code).isEqualTo(200)
|
||||||
@ -85,7 +86,7 @@ class AndroidAsyncDnsTest(val server: MockWebServer) {
|
|||||||
fun testRequestExternal() {
|
fun testRequestExternal() {
|
||||||
assumeNetwork()
|
assumeNetwork()
|
||||||
|
|
||||||
val call = client.newCall(Request.Builder().url("https://google.com/robots.txt").build())
|
val call = client.newCall(Request("https://google.com/robots.txt".toHttpUrl()))
|
||||||
|
|
||||||
call.execute().use { response ->
|
call.execute().use { response ->
|
||||||
assertThat(response.code).isEqualTo(200)
|
assertThat(response.code).isEqualTo(200)
|
||||||
@ -94,7 +95,7 @@ class AndroidAsyncDnsTest(val server: MockWebServer) {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testRequestInvalid() {
|
fun testRequestInvalid() {
|
||||||
val call = client.newCall(Request.Builder().url("https://google.invalid/").build())
|
val call = client.newCall(Request("https://google.invalid/".toHttpUrl()))
|
||||||
|
|
||||||
try {
|
try {
|
||||||
call.execute()
|
call.execute()
|
||||||
@ -171,7 +172,7 @@ class AndroidAsyncDnsTest(val server: MockWebServer) {
|
|||||||
.build()
|
.build()
|
||||||
|
|
||||||
val call =
|
val call =
|
||||||
client.newCall(Request.Builder().url("https://google.com/robots.txt").build())
|
client.newCall(Request("https://google.com/robots.txt".toHttpUrl()))
|
||||||
|
|
||||||
call.execute().use { response ->
|
call.execute().use { response ->
|
||||||
assertThat(response.code).isEqualTo(200)
|
assertThat(response.code).isEqualTo(200)
|
||||||
|
@ -49,7 +49,7 @@ class SuspendCallTest(
|
|||||||
|
|
||||||
private var client = clientTestRule.newClientBuilder().build()
|
private var client = clientTestRule.newClientBuilder().build()
|
||||||
|
|
||||||
val request = Request.Builder().url(server.url("/")).build()
|
val request = Request(server.url("/"))
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun suspendCall() {
|
fun suspendCall() {
|
||||||
|
@ -171,17 +171,11 @@ class TestValueFactory : Closeable {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun newRequest(address: Address): Request {
|
|
||||||
return Request.Builder()
|
|
||||||
.url(address.url)
|
|
||||||
.build()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun newRoutePlanner(
|
fun newRoutePlanner(
|
||||||
client: OkHttpClient,
|
client: OkHttpClient,
|
||||||
address: Address = newAddress(),
|
address: Address = newAddress(),
|
||||||
): RealRoutePlanner {
|
): RealRoutePlanner {
|
||||||
val call = RealCall(client, newRequest(address), forWebSocket = false)
|
val call = RealCall(client, Request(address.url), forWebSocket = false)
|
||||||
return RealRoutePlanner(client, address, call, newChain(call))
|
return RealRoutePlanner(client, address, call, newChain(call))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -999,6 +999,8 @@ public final class okhttp3/Request {
|
|||||||
public final fun -deprecated_headers ()Lokhttp3/Headers;
|
public final fun -deprecated_headers ()Lokhttp3/Headers;
|
||||||
public final fun -deprecated_method ()Ljava/lang/String;
|
public final fun -deprecated_method ()Ljava/lang/String;
|
||||||
public final fun -deprecated_url ()Lokhttp3/HttpUrl;
|
public final fun -deprecated_url ()Lokhttp3/HttpUrl;
|
||||||
|
public fun <init> (Lokhttp3/HttpUrl;Lokhttp3/Headers;Ljava/lang/String;Lokhttp3/RequestBody;)V
|
||||||
|
public synthetic fun <init> (Lokhttp3/HttpUrl;Lokhttp3/Headers;Ljava/lang/String;Lokhttp3/RequestBody;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
|
||||||
public final fun body ()Lokhttp3/RequestBody;
|
public final fun body ()Lokhttp3/RequestBody;
|
||||||
public final fun cacheControl ()Lokhttp3/CacheControl;
|
public final fun cacheControl ()Lokhttp3/CacheControl;
|
||||||
public final fun header (Ljava/lang/String;)Ljava/lang/String;
|
public final fun header (Ljava/lang/String;)Ljava/lang/String;
|
||||||
|
@ -22,7 +22,7 @@ import okhttp3.internal.commonEmptyRequestBody
|
|||||||
* An HTTP request. Instances of this class are immutable if their [body] is null or itself
|
* An HTTP request. Instances of this class are immutable if their [body] is null or itself
|
||||||
* immutable.
|
* immutable.
|
||||||
*/
|
*/
|
||||||
expect class Request {
|
expect class Request private constructor(builder: Builder) {
|
||||||
val url: HttpUrlRepresentation
|
val url: HttpUrlRepresentation
|
||||||
val method: String
|
val method: String
|
||||||
val headers: Headers
|
val headers: Headers
|
||||||
|
@ -15,6 +15,15 @@
|
|||||||
*/
|
*/
|
||||||
package okhttp3
|
package okhttp3
|
||||||
|
|
||||||
|
import java.io.Closeable
|
||||||
|
import java.io.File
|
||||||
|
import java.io.Flushable
|
||||||
|
import java.io.IOException
|
||||||
|
import java.security.cert.Certificate
|
||||||
|
import java.security.cert.CertificateEncodingException
|
||||||
|
import java.security.cert.CertificateException
|
||||||
|
import java.security.cert.CertificateFactory
|
||||||
|
import java.util.TreeSet
|
||||||
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
|
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
|
||||||
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
||||||
import okhttp3.internal.EMPTY_HEADERS
|
import okhttp3.internal.EMPTY_HEADERS
|
||||||
@ -23,6 +32,7 @@ import okhttp3.internal.cache.CacheStrategy
|
|||||||
import okhttp3.internal.cache.DiskLruCache
|
import okhttp3.internal.cache.DiskLruCache
|
||||||
import okhttp3.internal.closeQuietly
|
import okhttp3.internal.closeQuietly
|
||||||
import okhttp3.internal.concurrent.TaskRunner
|
import okhttp3.internal.concurrent.TaskRunner
|
||||||
|
import okhttp3.internal.http.HttpMethod
|
||||||
import okhttp3.internal.http.StatusLine
|
import okhttp3.internal.http.StatusLine
|
||||||
import okhttp3.internal.platform.Platform
|
import okhttp3.internal.platform.Platform
|
||||||
import okhttp3.internal.platform.Platform.Companion.WARN
|
import okhttp3.internal.platform.Platform.Companion.WARN
|
||||||
@ -41,17 +51,6 @@ import okio.Path.Companion.toOkioPath
|
|||||||
import okio.Sink
|
import okio.Sink
|
||||||
import okio.Source
|
import okio.Source
|
||||||
import okio.buffer
|
import okio.buffer
|
||||||
import java.io.Closeable
|
|
||||||
import java.io.File
|
|
||||||
import java.io.Flushable
|
|
||||||
import java.io.IOException
|
|
||||||
import java.security.cert.Certificate
|
|
||||||
import java.security.cert.CertificateEncodingException
|
|
||||||
import java.security.cert.CertificateException
|
|
||||||
import java.security.cert.CertificateFactory
|
|
||||||
import java.util.NoSuchElementException
|
|
||||||
import java.util.TreeSet
|
|
||||||
import okhttp3.internal.http.HttpMethod
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Caches HTTP and HTTPS responses to the filesystem so they may be reused, saving time and
|
* Caches HTTP and HTTPS responses to the filesystem so they may be reused, saving time and
|
||||||
@ -648,11 +647,7 @@ class Cache(
|
|||||||
fun response(snapshot: DiskLruCache.Snapshot): Response {
|
fun response(snapshot: DiskLruCache.Snapshot): Response {
|
||||||
val contentType = responseHeaders["Content-Type"]
|
val contentType = responseHeaders["Content-Type"]
|
||||||
val contentLength = responseHeaders["Content-Length"]
|
val contentLength = responseHeaders["Content-Length"]
|
||||||
val cacheRequest = Request.Builder()
|
val cacheRequest = Request(url, varyHeaders, requestMethod)
|
||||||
.url(url)
|
|
||||||
.method(requestMethod, null)
|
|
||||||
.headers(varyHeaders)
|
|
||||||
.build()
|
|
||||||
return Response.Builder()
|
return Response.Builder()
|
||||||
.request(cacheRequest)
|
.request(cacheRequest)
|
||||||
.protocol(protocol)
|
.protocol(protocol)
|
||||||
|
@ -32,18 +32,52 @@ import okhttp3.internal.commonPut
|
|||||||
import okhttp3.internal.commonRemoveHeader
|
import okhttp3.internal.commonRemoveHeader
|
||||||
import okhttp3.internal.toImmutableMap
|
import okhttp3.internal.toImmutableMap
|
||||||
|
|
||||||
actual class Request internal constructor(
|
actual class Request internal actual constructor(builder: Builder) {
|
||||||
@get:JvmName("url") actual val url: HttpUrl,
|
@get:JvmName("url")
|
||||||
@get:JvmName("method") actual val method: String,
|
actual val url: HttpUrl = checkNotNull(builder.url) { "url == null" }
|
||||||
@get:JvmName("headers") actual val headers: Headers,
|
|
||||||
@get:JvmName("body") actual val body: RequestBody?,
|
@get:JvmName("method")
|
||||||
internal val tags: Map<Class<*>, Any>
|
actual val method: String = builder.method
|
||||||
) {
|
|
||||||
|
@get:JvmName("headers")
|
||||||
|
actual val headers: Headers = builder.headers.build()
|
||||||
|
|
||||||
|
@get:JvmName("body")
|
||||||
|
actual val body: RequestBody? = builder.body
|
||||||
|
|
||||||
|
internal val tags: Map<Class<*>, Any> = builder.tags.toImmutableMap()
|
||||||
|
|
||||||
internal actual var lazyCacheControl: CacheControl? = null
|
internal actual var lazyCacheControl: CacheControl? = null
|
||||||
|
|
||||||
actual val isHttps: Boolean
|
actual val isHttps: Boolean
|
||||||
get() = url.isHttps
|
get() = url.isHttps
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new request.
|
||||||
|
*
|
||||||
|
* Use [Builder] for more fluent construction, including helper methods for various HTTP methods.
|
||||||
|
*
|
||||||
|
* @param method defaults to "GET" if [body] is null, and "POST" otherwise.
|
||||||
|
*/
|
||||||
|
constructor(
|
||||||
|
url: HttpUrl,
|
||||||
|
headers: Headers = Headers.headersOf(),
|
||||||
|
method: String = "\u0000", // Sentinel value chooses based on what the body is.
|
||||||
|
body: RequestBody? = null,
|
||||||
|
) : this(
|
||||||
|
Builder()
|
||||||
|
.url(url)
|
||||||
|
.headers(headers)
|
||||||
|
.method(
|
||||||
|
when {
|
||||||
|
method != "\u0000" -> method
|
||||||
|
body != null -> "POST"
|
||||||
|
else -> "GET"
|
||||||
|
},
|
||||||
|
body
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
actual fun header(name: String): String? = commonHeader(name)
|
actual fun header(name: String): String? = commonHeader(name)
|
||||||
|
|
||||||
actual fun headers(name: String): List<String> = commonHeaders(name)
|
actual fun headers(name: String): List<String> = commonHeaders(name)
|
||||||
@ -222,14 +256,6 @@ actual class Request internal constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
actual open fun build(): Request {
|
actual open fun build() = Request(this)
|
||||||
return Request(
|
|
||||||
checkNotNull(url) { "url == null" },
|
|
||||||
method,
|
|
||||||
headers.build(),
|
|
||||||
body,
|
|
||||||
tags.toImmutableMap()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -88,7 +88,7 @@ class Http1ExchangeCodec(
|
|||||||
|
|
||||||
override fun createRequestBody(request: Request, contentLength: Long): Sink {
|
override fun createRequestBody(request: Request, contentLength: Long): Sink {
|
||||||
return when {
|
return when {
|
||||||
request.body != null && request.body.isDuplex() -> throw ProtocolException(
|
request.body?.isDuplex() == true -> throw ProtocolException(
|
||||||
"Duplex connections are not supported for HTTP/1")
|
"Duplex connections are not supported for HTTP/1")
|
||||||
request.isChunked -> newChunkedSink() // Stream a request body of unknown length.
|
request.isChunked -> newChunkedSink() // Stream a request body of unknown length.
|
||||||
contentLength != -1L -> newKnownLengthSink() // Stream a request body of a known length.
|
contentLength != -1L -> newKnownLengthSink() // Stream a request body of a known length.
|
||||||
|
@ -161,7 +161,7 @@ class CacheCorruptionTest(
|
|||||||
)
|
)
|
||||||
.hostnameVerifier(NULL_HOSTNAME_VERIFIER)
|
.hostnameVerifier(NULL_HOSTNAME_VERIFIER)
|
||||||
.build()
|
.build()
|
||||||
val request: Request = Request.Builder().url(server.url("/")).build()
|
val request: Request = Request(server.url("/"))
|
||||||
val response1: Response = client.newCall(request).execute()
|
val response1: Response = client.newCall(request).execute()
|
||||||
val bodySource = response1.body.source()
|
val bodySource = response1.body.source()
|
||||||
assertThat(bodySource.readUtf8()).isEqualTo("ABC.1")
|
assertThat(bodySource.readUtf8()).isEqualTo("ABC.1")
|
||||||
|
@ -274,7 +274,7 @@ class CallHandshakeTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun makeRequest(client: OkHttpClient): Handshake {
|
private fun makeRequest(client: OkHttpClient): Handshake {
|
||||||
val call = client.newCall(Request.Builder().url(server.url("/")).build())
|
val call = client.newCall(Request(server.url("/")))
|
||||||
return call.execute().use { it.handshake!! }
|
return call.execute().use { it.handshake!! }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -65,9 +65,7 @@ class CallKotlinTest(
|
|||||||
server.enqueue(MockResponse().setBody("abc"))
|
server.enqueue(MockResponse().setBody("abc"))
|
||||||
server.enqueue(MockResponse().setBody("def"))
|
server.enqueue(MockResponse().setBody("def"))
|
||||||
|
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
|
|
||||||
val call = client.newCall(request)
|
val call = client.newCall(request)
|
||||||
val response1 = call.execute()
|
val response1 = call.execute()
|
||||||
@ -204,9 +202,7 @@ class CallKotlinTest(
|
|||||||
.setSocketPolicy(SocketPolicy.SHUTDOWN_OUTPUT_AT_END))
|
.setSocketPolicy(SocketPolicy.SHUTDOWN_OUTPUT_AT_END))
|
||||||
server.enqueue(MockResponse().setBody("b"))
|
server.enqueue(MockResponse().setBody("b"))
|
||||||
|
|
||||||
val requestA = Request.Builder()
|
val requestA = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
val responseA = client.newCall(requestA).execute()
|
val responseA = client.newCall(requestA).execute()
|
||||||
|
|
||||||
assertThat(responseA.body.string()).isEqualTo("a")
|
assertThat(responseA.body.string()).isEqualTo("a")
|
||||||
@ -216,10 +212,10 @@ class CallKotlinTest(
|
|||||||
connection!!.idleAtNs -= IDLE_CONNECTION_HEALTHY_NS
|
connection!!.idleAtNs -= IDLE_CONNECTION_HEALTHY_NS
|
||||||
Thread.sleep(250)
|
Thread.sleep(250)
|
||||||
|
|
||||||
val requestB = Request.Builder()
|
val requestB = Request(
|
||||||
.url(server.url("/"))
|
url = server.url("/"),
|
||||||
.post("b".toRequestBody("text/plain".toMediaType()))
|
body = "b".toRequestBody("text/plain".toMediaType()),
|
||||||
.build()
|
)
|
||||||
val responseB = client.newCall(requestB).execute()
|
val responseB = client.newCall(requestB).execute()
|
||||||
assertThat(responseB.body.string()).isEqualTo("b")
|
assertThat(responseB.body.string()).isEqualTo("b")
|
||||||
assertThat(server.takeRequest().sequenceNumber).isEqualTo(0)
|
assertThat(server.takeRequest().sequenceNumber).isEqualTo(0)
|
||||||
@ -238,7 +234,7 @@ class CallKotlinTest(
|
|||||||
.connectTimeout(Duration.ofMillis(100))
|
.connectTimeout(Duration.ofMillis(100))
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
val request = Request.Builder().url(server.url("/")).build()
|
val request = Request(server.url("/"))
|
||||||
try {
|
try {
|
||||||
client.newCall(request).execute()
|
client.newCall(request).execute()
|
||||||
fail("")
|
fail("")
|
||||||
@ -260,7 +256,7 @@ class CallKotlinTest(
|
|||||||
.dns(DoubleInetAddressDns()) // Two routes so we get two failures.
|
.dns(DoubleInetAddressDns()) // Two routes so we get two failures.
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
val request = Request.Builder().url(server.url("/")).build()
|
val request = Request(server.url("/"))
|
||||||
try {
|
try {
|
||||||
client.newCall(request).execute()
|
client.newCall(request).execute()
|
||||||
fail("")
|
fail("")
|
||||||
@ -282,10 +278,7 @@ class CallKotlinTest(
|
|||||||
)
|
)
|
||||||
server.enqueue(MockResponse())
|
server.enqueue(MockResponse())
|
||||||
|
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
|
|
||||||
val call = client.newCall(request)
|
val call = client.newCall(request)
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
|
|
||||||
|
@ -265,9 +265,7 @@ open class CallTest(
|
|||||||
val response = client.newCall(headRequest).execute()
|
val response = client.newCall(headRequest).execute()
|
||||||
assertThat(response.code).isEqualTo(200)
|
assertThat(response.code).isEqualTo(200)
|
||||||
assertArrayEquals(ByteArray(0), response.body.bytes())
|
assertArrayEquals(ByteArray(0), response.body.bytes())
|
||||||
val getRequest = Request.Builder()
|
val getRequest = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
executeSynchronously(getRequest)
|
executeSynchronously(getRequest)
|
||||||
.assertCode(200)
|
.assertCode(200)
|
||||||
.assertBody("abc")
|
.assertBody("abc")
|
||||||
@ -293,9 +291,7 @@ open class CallTest(
|
|||||||
.assertCode(200)
|
.assertCode(200)
|
||||||
.assertHeader("Content-Encoding", "chunked")
|
.assertHeader("Content-Encoding", "chunked")
|
||||||
.assertBody("")
|
.assertBody("")
|
||||||
val getRequest = Request.Builder()
|
val getRequest = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
executeSynchronously(getRequest)
|
executeSynchronously(getRequest)
|
||||||
.assertCode(200)
|
.assertCode(200)
|
||||||
.assertBody("abc")
|
.assertBody("abc")
|
||||||
@ -315,10 +311,10 @@ open class CallTest(
|
|||||||
|
|
||||||
@Test fun post() {
|
@Test fun post() {
|
||||||
server.enqueue(MockResponse().setBody("abc"))
|
server.enqueue(MockResponse().setBody("abc"))
|
||||||
val request = Request.Builder()
|
val request = Request(
|
||||||
.url(server.url("/"))
|
url = server.url("/"),
|
||||||
.post("def".toRequestBody("text/plain".toMediaType()))
|
body = "def".toRequestBody("text/plain".toMediaType()),
|
||||||
.build()
|
)
|
||||||
executeSynchronously(request)
|
executeSynchronously(request)
|
||||||
.assertCode(200)
|
.assertCode(200)
|
||||||
.assertBody("abc")
|
.assertBody("abc")
|
||||||
@ -651,9 +647,7 @@ open class CallTest(
|
|||||||
@Test fun legalToExecuteTwiceCloning() {
|
@Test fun legalToExecuteTwiceCloning() {
|
||||||
server.enqueue(MockResponse().setBody("abc"))
|
server.enqueue(MockResponse().setBody("abc"))
|
||||||
server.enqueue(MockResponse().setBody("def"))
|
server.enqueue(MockResponse().setBody("def"))
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
val call = client.newCall(request)
|
val call = client.newCall(request)
|
||||||
val response1 = call.execute()
|
val response1 = call.execute()
|
||||||
val cloned = call.clone()
|
val cloned = call.clone()
|
||||||
@ -665,9 +659,7 @@ open class CallTest(
|
|||||||
@Test fun legalToExecuteTwiceCloning_Async() {
|
@Test fun legalToExecuteTwiceCloning_Async() {
|
||||||
server.enqueue(MockResponse().setBody("abc"))
|
server.enqueue(MockResponse().setBody("abc"))
|
||||||
server.enqueue(MockResponse().setBody("def"))
|
server.enqueue(MockResponse().setBody("def"))
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
val call = client.newCall(request)
|
val call = client.newCall(request)
|
||||||
call.enqueue(callback)
|
call.enqueue(callback)
|
||||||
val cloned = call.clone()
|
val cloned = call.clone()
|
||||||
@ -701,9 +693,7 @@ open class CallTest(
|
|||||||
|
|
||||||
@Test fun exceptionThrownByOnResponseIsRedactedAndLogged() {
|
@Test fun exceptionThrownByOnResponseIsRedactedAndLogged() {
|
||||||
server.enqueue(MockResponse())
|
server.enqueue(MockResponse())
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/secret"))
|
||||||
.url(server.url("/secret"))
|
|
||||||
.build()
|
|
||||||
client.newCall(request).enqueue(object : Callback {
|
client.newCall(request).enqueue(object : Callback {
|
||||||
override fun onFailure(call: Call, e: IOException) {
|
override fun onFailure(call: Call, e: IOException) {
|
||||||
fail<Unit>()
|
fail<Unit>()
|
||||||
@ -915,9 +905,7 @@ open class CallTest(
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
.build()
|
.build()
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
executeSynchronously(request)
|
executeSynchronously(request)
|
||||||
.assertCode(200)
|
.assertCode(200)
|
||||||
}
|
}
|
||||||
@ -942,9 +930,7 @@ open class CallTest(
|
|||||||
response
|
response
|
||||||
})
|
})
|
||||||
.build()
|
.build()
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
executeSynchronously(request).assertBody("abc")
|
executeSynchronously(request).assertBody("abc")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1068,9 +1054,7 @@ open class CallTest(
|
|||||||
.setBody("abc")
|
.setBody("abc")
|
||||||
.addHeader("Content-Type: text/plain")
|
.addHeader("Content-Type: text/plain")
|
||||||
)
|
)
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
client.newCall(request).enqueue(callback)
|
client.newCall(request).enqueue(callback)
|
||||||
callback.await(request.url).assertHandshake()
|
callback.await(request.url).assertHandshake()
|
||||||
}
|
}
|
||||||
@ -1224,9 +1208,7 @@ open class CallTest(
|
|||||||
handshakeCertificates.trustManager
|
handshakeCertificates.trustManager
|
||||||
)
|
)
|
||||||
.build()
|
.build()
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
client.newCall(request).enqueue(callback)
|
client.newCall(request).enqueue(callback)
|
||||||
callback.await(request.url).assertBody("abc")
|
callback.await(request.url).assertBody("abc")
|
||||||
}
|
}
|
||||||
@ -1339,11 +1321,7 @@ open class CallTest(
|
|||||||
.build()
|
.build()
|
||||||
server.useHttps(handshakeCertificates.sslSocketFactory(), false)
|
server.useHttps(handshakeCertificates.sslSocketFactory(), false)
|
||||||
server.enqueue(MockResponse())
|
server.enqueue(MockResponse())
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
try {
|
try {
|
||||||
call.execute()
|
call.execute()
|
||||||
fail<Unit>()
|
fail<Unit>()
|
||||||
@ -1422,10 +1400,10 @@ open class CallTest(
|
|||||||
|
|
||||||
@Test fun post_Async() {
|
@Test fun post_Async() {
|
||||||
server.enqueue(MockResponse().setBody("abc"))
|
server.enqueue(MockResponse().setBody("abc"))
|
||||||
val request = Request.Builder()
|
val request = Request(
|
||||||
.url(server.url("/"))
|
url = server.url("/"),
|
||||||
.post("def".toRequestBody("text/plain".toMediaType()))
|
body = "def".toRequestBody("text/plain".toMediaType())
|
||||||
.build()
|
)
|
||||||
client.newCall(request).enqueue(callback)
|
client.newCall(request).enqueue(callback)
|
||||||
callback.await(request.url)
|
callback.await(request.url)
|
||||||
.assertCode(200)
|
.assertCode(200)
|
||||||
@ -1452,10 +1430,10 @@ open class CallTest(
|
|||||||
|
|
||||||
listener.clearAllEvents()
|
listener.clearAllEvents()
|
||||||
|
|
||||||
val request2 = Request.Builder()
|
val request2 = Request(
|
||||||
.url(server.url("/"))
|
url = server.url("/"),
|
||||||
.post("body!".toRequestBody("text/plain".toMediaType()))
|
body = "body!".toRequestBody("text/plain".toMediaType()),
|
||||||
.build()
|
)
|
||||||
try {
|
try {
|
||||||
client.newCall(request2).execute()
|
client.newCall(request2).execute()
|
||||||
fail()
|
fail()
|
||||||
@ -1500,10 +1478,10 @@ open class CallTest(
|
|||||||
val request1 = Request.Builder().url(server.url("/")).build()
|
val request1 = Request.Builder().url(server.url("/")).build()
|
||||||
val response1 = client.newCall(request1).execute()
|
val response1 = client.newCall(request1).execute()
|
||||||
assertThat(response1.body.string()).isEqualTo("abc")
|
assertThat(response1.body.string()).isEqualTo("abc")
|
||||||
val request2 = Request.Builder()
|
val request2 = Request(
|
||||||
.url(server.url("/"))
|
server.url("/"),
|
||||||
.post("body!".toRequestBody("text/plain".toMediaType()))
|
body = "body!".toRequestBody("text/plain".toMediaType()),
|
||||||
.build()
|
)
|
||||||
val response2 = client.newCall(request2).execute()
|
val response2 = client.newCall(request2).execute()
|
||||||
assertThat(response2.body.string()).isEqualTo("def")
|
assertThat(response2.body.string()).isEqualTo("def")
|
||||||
val get = server.takeRequest()
|
val get = server.takeRequest()
|
||||||
@ -1664,15 +1642,11 @@ open class CallTest(
|
|||||||
client = client.newBuilder()
|
client = client.newBuilder()
|
||||||
.cache(cache)
|
.cache(cache)
|
||||||
.build()
|
.build()
|
||||||
val request1 = Request.Builder()
|
val request1 = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
client.newCall(request1).enqueue(callback)
|
client.newCall(request1).enqueue(callback)
|
||||||
callback.await(request1.url).assertCode(200).assertBody("A")
|
callback.await(request1.url).assertCode(200).assertBody("A")
|
||||||
assertThat(server.takeRequest().getHeader("If-None-Match")).isNull()
|
assertThat(server.takeRequest().getHeader("If-None-Match")).isNull()
|
||||||
val request2 = Request.Builder()
|
val request2 = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
client.newCall(request2).enqueue(callback)
|
client.newCall(request2).enqueue(callback)
|
||||||
callback.await(request2.url).assertCode(200).assertBody("A")
|
callback.await(request2.url).assertCode(200).assertBody("A")
|
||||||
assertThat(server.takeRequest().getHeader("If-None-Match")).isEqualTo("v1")
|
assertThat(server.takeRequest().getHeader("If-None-Match")).isEqualTo("v1")
|
||||||
@ -1743,15 +1717,11 @@ open class CallTest(
|
|||||||
client = client.newBuilder()
|
client = client.newBuilder()
|
||||||
.cache(cache)
|
.cache(cache)
|
||||||
.build()
|
.build()
|
||||||
val request1 = Request.Builder()
|
val request1 = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
client.newCall(request1).enqueue(callback)
|
client.newCall(request1).enqueue(callback)
|
||||||
callback.await(request1.url).assertCode(200).assertBody("A")
|
callback.await(request1.url).assertCode(200).assertBody("A")
|
||||||
assertThat(server.takeRequest().getHeader("If-None-Match")).isNull()
|
assertThat(server.takeRequest().getHeader("If-None-Match")).isNull()
|
||||||
val request2 = Request.Builder()
|
val request2 = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
client.newCall(request2).enqueue(callback)
|
client.newCall(request2).enqueue(callback)
|
||||||
callback.await(request2.url).assertCode(200).assertBody("B")
|
callback.await(request2.url).assertCode(200).assertBody("B")
|
||||||
assertThat(server.takeRequest().getHeader("If-None-Match")).isEqualTo("v1")
|
assertThat(server.takeRequest().getHeader("If-None-Match")).isEqualTo("v1")
|
||||||
@ -1830,10 +1800,10 @@ open class CallTest(
|
|||||||
)
|
)
|
||||||
server.enqueue(MockResponse().setBody("Page 2"))
|
server.enqueue(MockResponse().setBody("Page 2"))
|
||||||
val response = client.newCall(
|
val response = client.newCall(
|
||||||
Request.Builder()
|
Request(
|
||||||
.url(server.url("/page1"))
|
url = server.url("/page1"),
|
||||||
.post("Request Body".toRequestBody("text/plain".toMediaType()))
|
body = "Request Body".toRequestBody("text/plain".toMediaType()),
|
||||||
.build()
|
)
|
||||||
).execute()
|
).execute()
|
||||||
assertThat(response.body.string()).isEqualTo("Page 2")
|
assertThat(response.body.string()).isEqualTo("Page 2")
|
||||||
val page1 = server.takeRequest()
|
val page1 = server.takeRequest()
|
||||||
@ -1852,9 +1822,7 @@ open class CallTest(
|
|||||||
.setBody("You took too long!")
|
.setBody("You took too long!")
|
||||||
)
|
)
|
||||||
server.enqueue(MockResponse().setBody("Body"))
|
server.enqueue(MockResponse().setBody("Body"))
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
val response = client.newCall(request).execute()
|
val response = client.newCall(request).execute()
|
||||||
assertThat(response.body.string()).isEqualTo("Body")
|
assertThat(response.body.string()).isEqualTo("Body")
|
||||||
}
|
}
|
||||||
@ -1868,9 +1836,7 @@ open class CallTest(
|
|||||||
.setHeader("Retry-After", "1")
|
.setHeader("Retry-After", "1")
|
||||||
.setBody("You took too long!")
|
.setBody("You took too long!")
|
||||||
)
|
)
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
val response = client.newCall(request).execute()
|
val response = client.newCall(request).execute()
|
||||||
assertThat(response.body.string()).isEqualTo("You took too long!")
|
assertThat(response.body.string()).isEqualTo("You took too long!")
|
||||||
}
|
}
|
||||||
@ -1884,10 +1850,10 @@ open class CallTest(
|
|||||||
.setBody("You took too long!")
|
.setBody("You took too long!")
|
||||||
)
|
)
|
||||||
server.enqueue(MockResponse().setBody("Body"))
|
server.enqueue(MockResponse().setBody("Body"))
|
||||||
val request = Request.Builder()
|
val request = Request(
|
||||||
.url(server.url("/"))
|
server.url("/"),
|
||||||
.post("Hello".toRequestBody("text/plain".toMediaType()))
|
body = "Hello".toRequestBody("text/plain".toMediaType()),
|
||||||
.build()
|
)
|
||||||
val response = client.newCall(request).execute()
|
val response = client.newCall(request).execute()
|
||||||
assertThat(response.body.string()).isEqualTo("Body")
|
assertThat(response.body.string()).isEqualTo("Body")
|
||||||
val request1 = server.takeRequest()
|
val request1 = server.takeRequest()
|
||||||
@ -1907,9 +1873,7 @@ open class CallTest(
|
|||||||
client = client.newBuilder()
|
client = client.newBuilder()
|
||||||
.retryOnConnectionFailure(false)
|
.retryOnConnectionFailure(false)
|
||||||
.build()
|
.build()
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
val response = client.newCall(request).execute()
|
val response = client.newCall(request).execute()
|
||||||
assertThat(response.code).isEqualTo(408)
|
assertThat(response.code).isEqualTo(408)
|
||||||
assertThat(response.body!!.string()).isEqualTo("You took too long!")
|
assertThat(response.body!!.string()).isEqualTo("You took too long!")
|
||||||
@ -1930,9 +1894,7 @@ open class CallTest(
|
|||||||
.setHeader("Connection", "Close")
|
.setHeader("Connection", "Close")
|
||||||
.setBody("You took too long!")
|
.setBody("You took too long!")
|
||||||
)
|
)
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
val response = client.newCall(request).execute()
|
val response = client.newCall(request).execute()
|
||||||
assertThat(response.code).isEqualTo(408)
|
assertThat(response.code).isEqualTo(408)
|
||||||
assertThat(response.body.string()).isEqualTo("You took too long!")
|
assertThat(response.body.string()).isEqualTo("You took too long!")
|
||||||
@ -1956,9 +1918,7 @@ open class CallTest(
|
|||||||
.setHeader("Retry-After", "0")
|
.setHeader("Retry-After", "0")
|
||||||
.setBody("You took too long!")
|
.setBody("You took too long!")
|
||||||
)
|
)
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
val response = client.newCall(request).execute()
|
val response = client.newCall(request).execute()
|
||||||
assertThat(response.code).isEqualTo(503)
|
assertThat(response.code).isEqualTo(503)
|
||||||
assertThat(response.body.string()).isEqualTo("You took too long!")
|
assertThat(response.body.string()).isEqualTo("You took too long!")
|
||||||
@ -1975,9 +1935,7 @@ open class CallTest(
|
|||||||
.setBody("You took too long!")
|
.setBody("You took too long!")
|
||||||
)
|
)
|
||||||
server.enqueue(MockResponse().setBody("Body"))
|
server.enqueue(MockResponse().setBody("Body"))
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
val response = client.newCall(request).execute()
|
val response = client.newCall(request).execute()
|
||||||
assertThat(response.body.string()).isEqualTo("Body")
|
assertThat(response.body.string()).isEqualTo("Body")
|
||||||
}
|
}
|
||||||
@ -1993,9 +1951,9 @@ open class CallTest(
|
|||||||
MockResponse()
|
MockResponse()
|
||||||
.setBody("thank you for retrying")
|
.setBody("thank you for retrying")
|
||||||
)
|
)
|
||||||
val request = Request.Builder()
|
val request = Request(
|
||||||
.url(server.url("/"))
|
url = server.url("/"),
|
||||||
.post(object : RequestBody() {
|
body = object : RequestBody() {
|
||||||
var attempt = 0
|
var attempt = 0
|
||||||
override fun contentType(): MediaType? {
|
override fun contentType(): MediaType? {
|
||||||
return null
|
return null
|
||||||
@ -2004,8 +1962,8 @@ open class CallTest(
|
|||||||
override fun writeTo(sink: BufferedSink) {
|
override fun writeTo(sink: BufferedSink) {
|
||||||
sink.writeUtf8("attempt " + attempt++)
|
sink.writeUtf8("attempt " + attempt++)
|
||||||
}
|
}
|
||||||
})
|
},
|
||||||
.build()
|
)
|
||||||
val response = client.newCall(request).execute()
|
val response = client.newCall(request).execute()
|
||||||
assertThat(response.code).isEqualTo(200)
|
assertThat(response.code).isEqualTo(200)
|
||||||
assertThat(response.body.string()).isEqualTo("thank you for retrying")
|
assertThat(response.body.string()).isEqualTo("thank you for retrying")
|
||||||
@ -2025,9 +1983,9 @@ open class CallTest(
|
|||||||
MockResponse()
|
MockResponse()
|
||||||
.setBody("thank you for retrying")
|
.setBody("thank you for retrying")
|
||||||
)
|
)
|
||||||
val request = Request.Builder()
|
val request = Request(
|
||||||
.url(server.url("/"))
|
url = server.url("/"),
|
||||||
.post(object : RequestBody() {
|
body = object : RequestBody() {
|
||||||
var attempt = 0
|
var attempt = 0
|
||||||
override fun contentType(): MediaType? {
|
override fun contentType(): MediaType? {
|
||||||
return null
|
return null
|
||||||
@ -2040,8 +1998,8 @@ open class CallTest(
|
|||||||
override fun isOneShot(): Boolean {
|
override fun isOneShot(): Boolean {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
})
|
},
|
||||||
.build()
|
)
|
||||||
val response = client.newCall(request).execute()
|
val response = client.newCall(request).execute()
|
||||||
assertThat(response.code).isEqualTo(503)
|
assertThat(response.code).isEqualTo(503)
|
||||||
assertThat(response.body.string()).isEqualTo("please retry")
|
assertThat(response.body.string()).isEqualTo("please retry")
|
||||||
@ -2128,11 +2086,7 @@ open class CallTest(
|
|||||||
client = client.newBuilder()
|
client = client.newBuilder()
|
||||||
.cookieJar(JavaNetCookieJar(cookieManager))
|
.cookieJar(JavaNetCookieJar(cookieManager))
|
||||||
.build()
|
.build()
|
||||||
val response = client.newCall(
|
val response = client.newCall(Request(server.url("/page1"))).execute()
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/page1"))
|
|
||||||
.build()
|
|
||||||
).execute()
|
|
||||||
assertThat(response.body.string()).isEqualTo("Page 2")
|
assertThat(response.body.string()).isEqualTo("Page 2")
|
||||||
val request1 = server.takeRequest()
|
val request1 = server.takeRequest()
|
||||||
assertThat(request1.getHeader("Cookie")).isEqualTo("c=cookie")
|
assertThat(request1.getHeader("Cookie")).isEqualTo("c=cookie")
|
||||||
@ -2331,11 +2285,7 @@ open class CallTest(
|
|||||||
.setSocketPolicy(SocketPolicy.STALL_SOCKET_AT_START)
|
.setSocketPolicy(SocketPolicy.STALL_SOCKET_AT_START)
|
||||||
)
|
)
|
||||||
val cancelDelayMillis = 300L
|
val cancelDelayMillis = 300L
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/").newBuilder().scheme(scheme!!).build()))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/").newBuilder().scheme(scheme!!).build())
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
cancelLater(call, cancelDelayMillis)
|
cancelLater(call, cancelDelayMillis)
|
||||||
val startNanos = System.nanoTime()
|
val startNanos = System.nanoTime()
|
||||||
try {
|
try {
|
||||||
@ -2361,11 +2311,7 @@ open class CallTest(
|
|||||||
chain.proceed(chain.request())
|
chain.proceed(chain.request())
|
||||||
})
|
})
|
||||||
.build()
|
.build()
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/a")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/a"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
call.enqueue(callback)
|
call.enqueue(callback)
|
||||||
call.cancel()
|
call.cancel()
|
||||||
latch.countDown()
|
latch.countDown()
|
||||||
@ -2373,11 +2319,7 @@ open class CallTest(
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test fun cancelAll() {
|
@Test fun cancelAll() {
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
call.enqueue(callback)
|
call.enqueue(callback)
|
||||||
client.dispatcher.cancelAll()
|
client.dispatcher.cancelAll()
|
||||||
callback.await(server.url("/")).assertFailure("Canceled", "Socket closed", "Socket is closed")
|
callback.await(server.url("/")).assertFailure("Canceled", "Socket closed", "Socket is closed")
|
||||||
@ -2396,7 +2338,7 @@ open class CallTest(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
client = client.newBuilder().eventListener(listener).build()
|
client = client.newBuilder().eventListener(listener).build()
|
||||||
val call = client.newCall(Request.Builder().url(server.url("/a")).build())
|
val call = client.newCall(Request(server.url("/a")))
|
||||||
try {
|
try {
|
||||||
call.execute()
|
call.execute()
|
||||||
fail<Unit>()
|
fail<Unit>()
|
||||||
@ -2411,7 +2353,7 @@ open class CallTest(
|
|||||||
|
|
||||||
@Test fun cancelBeforeBodyIsRead() {
|
@Test fun cancelBeforeBodyIsRead() {
|
||||||
server.enqueue(MockResponse().setBody("def").throttleBody(1, 750, TimeUnit.MILLISECONDS))
|
server.enqueue(MockResponse().setBody("def").throttleBody(1, 750, TimeUnit.MILLISECONDS))
|
||||||
val call = client.newCall(Request.Builder().url(server.url("/a")).build())
|
val call = client.newCall(Request(server.url("/a")))
|
||||||
val executor = Executors.newSingleThreadExecutor()
|
val executor = Executors.newSingleThreadExecutor()
|
||||||
val result = executor.submit<Response?> { call.execute() }
|
val result = executor.submit<Response?> { call.execute() }
|
||||||
Thread.sleep(100) // wait for it to go in flight.
|
Thread.sleep(100) // wait for it to go in flight.
|
||||||
@ -2425,7 +2367,7 @@ open class CallTest(
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test fun cancelInFlightBeforeResponseReadThrowsIOE() {
|
@Test fun cancelInFlightBeforeResponseReadThrowsIOE() {
|
||||||
val request = Request.Builder().url(server.url("/a")).build()
|
val request = Request(server.url("/a"))
|
||||||
val call = client.newCall(request)
|
val call = client.newCall(request)
|
||||||
server.dispatcher = object : mockwebserver3.Dispatcher() {
|
server.dispatcher = object : mockwebserver3.Dispatcher() {
|
||||||
override fun dispatch(request: RecordedRequest): MockResponse {
|
override fun dispatch(request: RecordedRequest): MockResponse {
|
||||||
@ -2462,8 +2404,8 @@ open class CallTest(
|
|||||||
client = client.newBuilder()
|
client = client.newBuilder()
|
||||||
.dispatcher(dispatcher)
|
.dispatcher(dispatcher)
|
||||||
.build()
|
.build()
|
||||||
val requestA = Request.Builder().url(server.url("/a")).build()
|
val requestA = Request(server.url("/a"))
|
||||||
val requestB = Request.Builder().url(server.url("/b")).build()
|
val requestB = Request(server.url("/b"))
|
||||||
val callA = client.newCall(requestA)
|
val callA = client.newCall(requestA)
|
||||||
val callB = client.newCall(requestB)
|
val callB = client.newCall(requestB)
|
||||||
server.dispatcher = object : mockwebserver3.Dispatcher() {
|
server.dispatcher = object : mockwebserver3.Dispatcher() {
|
||||||
@ -2492,7 +2434,7 @@ open class CallTest(
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test fun canceledBeforeResponseReadSignalsOnFailure() {
|
@Test fun canceledBeforeResponseReadSignalsOnFailure() {
|
||||||
val requestA = Request.Builder().url(server.url("/a")).build()
|
val requestA = Request(server.url("/a"))
|
||||||
val call = client.newCall(requestA)
|
val call = client.newCall(requestA)
|
||||||
server.dispatcher = object : mockwebserver3.Dispatcher() {
|
server.dispatcher = object : mockwebserver3.Dispatcher() {
|
||||||
override fun dispatch(request: RecordedRequest): MockResponse {
|
override fun dispatch(request: RecordedRequest): MockResponse {
|
||||||
@ -2527,7 +2469,7 @@ open class CallTest(
|
|||||||
val latch = CountDownLatch(1)
|
val latch = CountDownLatch(1)
|
||||||
val bodyRef = AtomicReference<String?>()
|
val bodyRef = AtomicReference<String?>()
|
||||||
val failureRef = AtomicBoolean()
|
val failureRef = AtomicBoolean()
|
||||||
val request = Request.Builder().url(server.url("/a")).build()
|
val request = Request(server.url("/a"))
|
||||||
val call = client.newCall(request)
|
val call = client.newCall(request)
|
||||||
call.enqueue(object : Callback {
|
call.enqueue(object : Callback {
|
||||||
override fun onFailure(call: Call, e: IOException) {
|
override fun onFailure(call: Call, e: IOException) {
|
||||||
@ -2571,7 +2513,7 @@ open class CallTest(
|
|||||||
throw AssertionError() // We expect an exception.
|
throw AssertionError() // We expect an exception.
|
||||||
})
|
})
|
||||||
.build()
|
.build()
|
||||||
val call = client.newCall(Request.Builder().url(server.url("/a")).build())
|
val call = client.newCall(Request(server.url("/a")))
|
||||||
call.cancel()
|
call.cancel()
|
||||||
try {
|
try {
|
||||||
call.execute()
|
call.execute()
|
||||||
@ -2782,10 +2724,10 @@ open class CallTest(
|
|||||||
MockResponse()
|
MockResponse()
|
||||||
.add100Continue()
|
.add100Continue()
|
||||||
)
|
)
|
||||||
val request = Request.Builder()
|
val request = Request(
|
||||||
.url(server.url("/"))
|
url = server.url("/"),
|
||||||
.post("abc".toRequestBody("text/plain".toMediaType()))
|
body = "abc".toRequestBody("text/plain".toMediaType()),
|
||||||
.build()
|
)
|
||||||
executeSynchronously(request)
|
executeSynchronously(request)
|
||||||
.assertCode(200)
|
.assertCode(200)
|
||||||
.assertSuccessful()
|
.assertSuccessful()
|
||||||
@ -2807,10 +2749,10 @@ open class CallTest(
|
|||||||
MockResponse()
|
MockResponse()
|
||||||
.setStatus("HTTP/1.1 100 Continue")
|
.setStatus("HTTP/1.1 100 Continue")
|
||||||
)
|
)
|
||||||
val request = Request.Builder()
|
val request = Request(
|
||||||
.url(server.url("/"))
|
url = server.url("/"),
|
||||||
.post("abc".toRequestBody("text/plain".toMediaType()))
|
body = "abc".toRequestBody("text/plain".toMediaType()),
|
||||||
.build()
|
)
|
||||||
val call = client.newCall(request)
|
val call = client.newCall(request)
|
||||||
try {
|
try {
|
||||||
call.execute()
|
call.execute()
|
||||||
@ -2840,11 +2782,7 @@ open class CallTest(
|
|||||||
.post("abc".toRequestBody("text/plain".toMediaType()))
|
.post("abc".toRequestBody("text/plain".toMediaType()))
|
||||||
.build()
|
.build()
|
||||||
)
|
)
|
||||||
executeSynchronously(
|
executeSynchronously(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
assertThat(server.takeRequest().sequenceNumber).isEqualTo(0)
|
assertThat(server.takeRequest().sequenceNumber).isEqualTo(0)
|
||||||
assertThat(server.takeRequest().sequenceNumber).isEqualTo(1)
|
assertThat(server.takeRequest().sequenceNumber).isEqualTo(1)
|
||||||
}
|
}
|
||||||
@ -2866,11 +2804,7 @@ open class CallTest(
|
|||||||
.post("abc".toRequestBody("text/plain".toMediaType()))
|
.post("abc".toRequestBody("text/plain".toMediaType()))
|
||||||
.build()
|
.build()
|
||||||
)
|
)
|
||||||
executeSynchronously(
|
executeSynchronously(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
assertThat(server.takeRequest().sequenceNumber).isEqualTo(0)
|
assertThat(server.takeRequest().sequenceNumber).isEqualTo(0)
|
||||||
assertThat(server.takeRequest().sequenceNumber).isEqualTo(0)
|
assertThat(server.takeRequest().sequenceNumber).isEqualTo(0)
|
||||||
}
|
}
|
||||||
@ -2887,11 +2821,7 @@ open class CallTest(
|
|||||||
.post("abc".toRequestBody("text/plain".toMediaType()))
|
.post("abc".toRequestBody("text/plain".toMediaType()))
|
||||||
.build()
|
.build()
|
||||||
)
|
)
|
||||||
executeSynchronously(
|
executeSynchronously(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
assertThat(server.takeRequest().sequenceNumber).isEqualTo(0)
|
assertThat(server.takeRequest().sequenceNumber).isEqualTo(0)
|
||||||
assertThat(server.takeRequest().sequenceNumber).isEqualTo(1)
|
assertThat(server.takeRequest().sequenceNumber).isEqualTo(1)
|
||||||
}
|
}
|
||||||
@ -2919,9 +2849,7 @@ open class CallTest(
|
|||||||
.dns(dns)
|
.dns(dns)
|
||||||
.build()
|
.build()
|
||||||
server.enqueue(MockResponse())
|
server.enqueue(MockResponse())
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/").newBuilder().host("android.com").build())
|
||||||
.url(server.url("/").newBuilder().host("android.com").build())
|
|
||||||
.build()
|
|
||||||
executeSynchronously(request).assertCode(200)
|
executeSynchronously(request).assertCode(200)
|
||||||
dns.assertRequests("android.com")
|
dns.assertRequests("android.com")
|
||||||
}
|
}
|
||||||
@ -2935,9 +2863,7 @@ open class CallTest(
|
|||||||
.dns(dns)
|
.dns(dns)
|
||||||
.build()
|
.build()
|
||||||
server.enqueue(MockResponse())
|
server.enqueue(MockResponse())
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/").newBuilder().host("android.com").build())
|
||||||
.url(server.url("/").newBuilder().host("android.com").build())
|
|
||||||
.build()
|
|
||||||
executeSynchronously(request).assertFailure("$dns returned no addresses for android.com")
|
executeSynchronously(request).assertFailure("$dns returned no addresses for android.com")
|
||||||
dns.assertRequests("android.com")
|
dns.assertRequests("android.com")
|
||||||
}
|
}
|
||||||
@ -2962,10 +2888,10 @@ open class CallTest(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
val call = client.newCall(
|
val call = client.newCall(
|
||||||
Request.Builder()
|
Request(
|
||||||
.url(server.url("/"))
|
url = server.url("/"),
|
||||||
.post(requestBody)
|
body = requestBody
|
||||||
.build()
|
)
|
||||||
)
|
)
|
||||||
call.execute().use { response ->
|
call.execute().use { response ->
|
||||||
assertThat(response.code).isEqualTo(200)
|
assertThat(response.code).isEqualTo(200)
|
||||||
@ -3040,9 +2966,7 @@ open class CallTest(
|
|||||||
.proxy(server.toProxyAddress())
|
.proxy(server.toProxyAddress())
|
||||||
.hostnameVerifier(hostnameVerifier)
|
.hostnameVerifier(hostnameVerifier)
|
||||||
.build()
|
.build()
|
||||||
val request = Request.Builder()
|
val request = Request("https://android.com/foo".toHttpUrl())
|
||||||
.url("https://android.com/foo")
|
|
||||||
.build()
|
|
||||||
try {
|
try {
|
||||||
client.newCall(request).execute()
|
client.newCall(request).execute()
|
||||||
fail<Unit>()
|
fail<Unit>()
|
||||||
@ -3077,9 +3001,7 @@ open class CallTest(
|
|||||||
.proxyAuthenticator(RecordingOkAuthenticator("password", "Basic"))
|
.proxyAuthenticator(RecordingOkAuthenticator("password", "Basic"))
|
||||||
.hostnameVerifier(RecordingHostnameVerifier())
|
.hostnameVerifier(RecordingHostnameVerifier())
|
||||||
.build()
|
.build()
|
||||||
val request = Request.Builder()
|
val request = Request("https://android.com/foo".toHttpUrl())
|
||||||
.url("https://android.com/foo")
|
|
||||||
.build()
|
|
||||||
val response = client.newCall(request).execute()
|
val response = client.newCall(request).execute()
|
||||||
assertThat(response.body.string()).isEqualTo("response body")
|
assertThat(response.body.string()).isEqualTo("response body")
|
||||||
val connect1 = server.takeRequest()
|
val connect1 = server.takeRequest()
|
||||||
@ -3108,9 +3030,7 @@ open class CallTest(
|
|||||||
.proxy(server.toProxyAddress())
|
.proxy(server.toProxyAddress())
|
||||||
.proxyAuthenticator(RecordingOkAuthenticator("password", "Basic"))
|
.proxyAuthenticator(RecordingOkAuthenticator("password", "Basic"))
|
||||||
.build()
|
.build()
|
||||||
val request = Request.Builder()
|
val request = Request("http://android.com/foo".toHttpUrl())
|
||||||
.url("http://android.com/foo")
|
|
||||||
.build()
|
|
||||||
val response = client.newCall(request).execute()
|
val response = client.newCall(request).execute()
|
||||||
assertThat(response.body.string()).isEqualTo("response body")
|
assertThat(response.body.string()).isEqualTo("response body")
|
||||||
val get1 = server.takeRequest()
|
val get1 = server.takeRequest()
|
||||||
@ -3152,9 +3072,7 @@ open class CallTest(
|
|||||||
.proxyAuthenticator(RecordingOkAuthenticator("password", "Basic"))
|
.proxyAuthenticator(RecordingOkAuthenticator("password", "Basic"))
|
||||||
.hostnameVerifier(RecordingHostnameVerifier())
|
.hostnameVerifier(RecordingHostnameVerifier())
|
||||||
.build()
|
.build()
|
||||||
val request = Request.Builder()
|
val request = Request("https://android.com/foo".toHttpUrl())
|
||||||
.url("https://android.com/foo")
|
|
||||||
.build()
|
|
||||||
val response = client.newCall(request).execute()
|
val response = client.newCall(request).execute()
|
||||||
assertThat(response.body.string()).isEqualTo("response body")
|
assertThat(response.body.string()).isEqualTo("response body")
|
||||||
|
|
||||||
@ -3188,9 +3106,7 @@ open class CallTest(
|
|||||||
.proxyAuthenticator(RecordingOkAuthenticator("password", "Basic"))
|
.proxyAuthenticator(RecordingOkAuthenticator("password", "Basic"))
|
||||||
.hostnameVerifier(RecordingHostnameVerifier())
|
.hostnameVerifier(RecordingHostnameVerifier())
|
||||||
.build()
|
.build()
|
||||||
val request = Request.Builder()
|
val request = Request("https://android.com/foo".toHttpUrl())
|
||||||
.url("https://android.com/foo")
|
|
||||||
.build()
|
|
||||||
try {
|
try {
|
||||||
client.newCall(request).execute()
|
client.newCall(request).execute()
|
||||||
fail<Unit>()
|
fail<Unit>()
|
||||||
@ -3265,9 +3181,7 @@ open class CallTest(
|
|||||||
.build()
|
.build()
|
||||||
}
|
}
|
||||||
.build()
|
.build()
|
||||||
val request = Request.Builder()
|
val request = Request("https://android.com/foo".toHttpUrl())
|
||||||
.url("https://android.com/foo")
|
|
||||||
.build()
|
|
||||||
executeSynchronously(request).assertSuccessful()
|
executeSynchronously(request).assertSuccessful()
|
||||||
val connect = server.takeRequest()
|
val connect = server.takeRequest()
|
||||||
assertThat(connect.method).isEqualTo("CONNECT")
|
assertThat(connect.method).isEqualTo("CONNECT")
|
||||||
@ -3310,9 +3224,7 @@ open class CallTest(
|
|||||||
.build()
|
.build()
|
||||||
}
|
}
|
||||||
.build()
|
.build()
|
||||||
val request = Request.Builder()
|
val request = Request("https://android.com/foo".toHttpUrl())
|
||||||
.url("https://android.com/foo")
|
|
||||||
.build()
|
|
||||||
executeSynchronously(request).assertSuccessful()
|
executeSynchronously(request).assertSuccessful()
|
||||||
val connect1 = server.takeRequest()
|
val connect1 = server.takeRequest()
|
||||||
assertThat(connect1.method).isEqualTo("CONNECT")
|
assertThat(connect1.method).isEqualTo("CONNECT")
|
||||||
@ -3337,9 +3249,7 @@ open class CallTest(
|
|||||||
)
|
)
|
||||||
.proxy(server.toProxyAddress())
|
.proxy(server.toProxyAddress())
|
||||||
.build()
|
.build()
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
try {
|
try {
|
||||||
client.newCall(request).execute()
|
client.newCall(request).execute()
|
||||||
fail<Unit>()
|
fail<Unit>()
|
||||||
@ -3428,7 +3338,7 @@ open class CallTest(
|
|||||||
.addHeader("content-length: 0")
|
.addHeader("content-length: 0")
|
||||||
.addHeaderLenient("a b", "c")
|
.addHeaderLenient("a b", "c")
|
||||||
)
|
)
|
||||||
val call = client.newCall(Request.Builder().url(server.url("/")).build())
|
val call = client.newCall(Request(server.url("/")))
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.header("a b")).isEqualTo("c")
|
assertThat(response.header("a b")).isEqualTo("c")
|
||||||
}
|
}
|
||||||
@ -3440,7 +3350,7 @@ open class CallTest(
|
|||||||
.addHeader("content-length: 0")
|
.addHeader("content-length: 0")
|
||||||
.addHeaderLenient("a\tb", "c")
|
.addHeaderLenient("a\tb", "c")
|
||||||
)
|
)
|
||||||
val call = client.newCall(Request.Builder().url(server.url("/")).build())
|
val call = client.newCall(Request(server.url("/")))
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.header("a\tb")).isEqualTo("c")
|
assertThat(response.header("a\tb")).isEqualTo("c")
|
||||||
}
|
}
|
||||||
@ -3463,19 +3373,17 @@ open class CallTest(
|
|||||||
)
|
)
|
||||||
.build()
|
.build()
|
||||||
server2.shutdown()
|
server2.shutdown()
|
||||||
val request = Request.Builder()
|
val request = Request(
|
||||||
.url(server.url("/"))
|
url = server.url("/"),
|
||||||
.post("abc".toRequestBody("text/plain".toMediaType()))
|
body = "abc".toRequestBody("text/plain".toMediaType()),
|
||||||
.build()
|
)
|
||||||
executeSynchronously(request)
|
executeSynchronously(request)
|
||||||
assertThat(server.takeRequest().body.readUtf8()).isEqualTo("abc")
|
assertThat(server.takeRequest().body.readUtf8()).isEqualTo("abc")
|
||||||
}
|
}
|
||||||
|
|
||||||
@Disabled // This may fail in DNS lookup, which we don't have timeouts for.
|
@Disabled // This may fail in DNS lookup, which we don't have timeouts for.
|
||||||
@Test fun invalidHost() {
|
@Test fun invalidHost() {
|
||||||
val request = Request.Builder()
|
val request = Request("http://1234.1.1.1/".toHttpUrl())
|
||||||
.url("http://1234.1.1.1/".toHttpUrl())
|
|
||||||
.build()
|
|
||||||
executeSynchronously(request)
|
executeSynchronously(request)
|
||||||
.assertFailure(UnknownHostException::class.java)
|
.assertFailure(UnknownHostException::class.java)
|
||||||
}
|
}
|
||||||
@ -3511,10 +3419,10 @@ open class CallTest(
|
|||||||
private fun upload(chunked: Boolean, size: Int, writeSize: Int) {
|
private fun upload(chunked: Boolean, size: Int, writeSize: Int) {
|
||||||
server.enqueue(MockResponse())
|
server.enqueue(MockResponse())
|
||||||
executeSynchronously(
|
executeSynchronously(
|
||||||
Request.Builder()
|
Request(
|
||||||
.url(server.url("/"))
|
url = server.url("/"),
|
||||||
.post(requestBody(chunked, size.toLong(), writeSize))
|
body = requestBody(chunked, size.toLong(), writeSize),
|
||||||
.build()
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3530,9 +3438,7 @@ open class CallTest(
|
|||||||
.host("::1")
|
.host("::1")
|
||||||
.port(port)
|
.port(port)
|
||||||
.build()
|
.build()
|
||||||
val request = Request.Builder()
|
val request = Request(url)
|
||||||
.url(url)
|
|
||||||
.build()
|
|
||||||
val response = client.newCall(request).execute()
|
val response = client.newCall(request).execute()
|
||||||
assertThat(response.body.string()).isEqualTo("response body")
|
assertThat(response.body.string()).isEqualTo("response body")
|
||||||
val connect = server.takeRequest()
|
val connect = server.takeRequest()
|
||||||
@ -3557,9 +3463,7 @@ open class CallTest(
|
|||||||
.host("::1")
|
.host("::1")
|
||||||
.port(port)
|
.port(port)
|
||||||
.build()
|
.build()
|
||||||
val request = Request.Builder()
|
val request = Request(url)
|
||||||
.url(url)
|
|
||||||
.build()
|
|
||||||
val response = client.newCall(request).execute()
|
val response = client.newCall(request).execute()
|
||||||
assertThat(response.body.string()).isEqualTo("response body")
|
assertThat(response.body.string()).isEqualTo("response body")
|
||||||
val connect = server.takeRequest()
|
val connect = server.takeRequest()
|
||||||
@ -3590,9 +3494,7 @@ open class CallTest(
|
|||||||
.host("127.0.0.1")
|
.host("127.0.0.1")
|
||||||
.port(port)
|
.port(port)
|
||||||
.build()
|
.build()
|
||||||
val request = Request.Builder()
|
val request = Request(url)
|
||||||
.url(url)
|
|
||||||
.build()
|
|
||||||
val response = client.newCall(request).execute()
|
val response = client.newCall(request).execute()
|
||||||
assertThat(response.body.string()).isEqualTo("response body")
|
assertThat(response.body.string()).isEqualTo("response body")
|
||||||
val connect = server.takeRequest()
|
val connect = server.takeRequest()
|
||||||
@ -3623,9 +3525,7 @@ open class CallTest(
|
|||||||
.host("127.0.0.1")
|
.host("127.0.0.1")
|
||||||
.port(port)
|
.port(port)
|
||||||
.build()
|
.build()
|
||||||
val request = Request.Builder()
|
val request = Request(url)
|
||||||
.url(url)
|
|
||||||
.build()
|
|
||||||
val response = client.newCall(request).execute()
|
val response = client.newCall(request).execute()
|
||||||
assertThat(response.body.string()).isEqualTo("response body")
|
assertThat(response.body.string()).isEqualTo("response body")
|
||||||
val connect = server.takeRequest()
|
val connect = server.takeRequest()
|
||||||
@ -3650,9 +3550,7 @@ open class CallTest(
|
|||||||
.host("any-host-name")
|
.host("any-host-name")
|
||||||
.port(port)
|
.port(port)
|
||||||
.build()
|
.build()
|
||||||
val request = Request.Builder()
|
val request = Request(url)
|
||||||
.url(url)
|
|
||||||
.build()
|
|
||||||
val response = client.newCall(request).execute()
|
val response = client.newCall(request).execute()
|
||||||
assertThat(response.body.string()).isEqualTo("response body")
|
assertThat(response.body.string()).isEqualTo("response body")
|
||||||
val connect = server.takeRequest()
|
val connect = server.takeRequest()
|
||||||
@ -3677,9 +3575,7 @@ open class CallTest(
|
|||||||
.host("any-host-name")
|
.host("any-host-name")
|
||||||
.port(port)
|
.port(port)
|
||||||
.build()
|
.build()
|
||||||
val request = Request.Builder()
|
val request = Request(url)
|
||||||
.url(url)
|
|
||||||
.build()
|
|
||||||
val response = client.newCall(request).execute()
|
val response = client.newCall(request).execute()
|
||||||
assertThat(response.body.string()).isEqualTo("response body")
|
assertThat(response.body.string()).isEqualTo("response body")
|
||||||
val connect = server.takeRequest()
|
val connect = server.takeRequest()
|
||||||
@ -3753,9 +3649,7 @@ open class CallTest(
|
|||||||
client = clientTestRule.newClientBuilder()
|
client = clientTestRule.newClientBuilder()
|
||||||
.connectionPool(ConnectionPool(0, 10, TimeUnit.MILLISECONDS))
|
.connectionPool(ConnectionPool(0, 10, TimeUnit.MILLISECONDS))
|
||||||
.build()
|
.build()
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
client.newCall(request).execute() // Ignore the response so it gets leaked then GC'd.
|
client.newCall(request).execute() // Ignore the response so it gets leaked then GC'd.
|
||||||
awaitGarbageCollection()
|
awaitGarbageCollection()
|
||||||
val message = testLogHandler.take()
|
val message = testLogHandler.take()
|
||||||
@ -3773,9 +3667,7 @@ open class CallTest(
|
|||||||
client = clientTestRule.newClientBuilder()
|
client = clientTestRule.newClientBuilder()
|
||||||
.connectionPool(ConnectionPool(0, 10, TimeUnit.MILLISECONDS))
|
.connectionPool(ConnectionPool(0, 10, TimeUnit.MILLISECONDS))
|
||||||
.build()
|
.build()
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
val latch = CountDownLatch(1)
|
val latch = CountDownLatch(1)
|
||||||
client.newCall(request).enqueue(object : Callback {
|
client.newCall(request).enqueue(object : Callback {
|
||||||
override fun onFailure(call: Call, e: IOException) {
|
override fun onFailure(call: Call, e: IOException) {
|
||||||
@ -3806,9 +3698,7 @@ open class CallTest(
|
|||||||
client = client.newBuilder()
|
client = client.newBuilder()
|
||||||
.authenticator { _: Route?, _: Response -> throw IOException("IOException!") }
|
.authenticator { _: Route?, _: Response -> throw IOException("IOException!") }
|
||||||
.build()
|
.build()
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
executeSynchronously(request)
|
executeSynchronously(request)
|
||||||
.assertFailure(IOException::class.java)
|
.assertFailure(IOException::class.java)
|
||||||
assertThat(client.connectionPool.idleConnectionCount()).isEqualTo(1)
|
assertThat(client.connectionPool.idleConnectionCount()).isEqualTo(1)
|
||||||
@ -3824,9 +3714,7 @@ open class CallTest(
|
|||||||
throw IOException("IOException!")
|
throw IOException("IOException!")
|
||||||
}
|
}
|
||||||
.build()
|
.build()
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
executeSynchronously(request)
|
executeSynchronously(request)
|
||||||
.assertFailure(IOException::class.java)
|
.assertFailure(IOException::class.java)
|
||||||
assertThat(client.connectionPool.idleConnectionCount()).isEqualTo(1)
|
assertThat(client.connectionPool.idleConnectionCount()).isEqualTo(1)
|
||||||
@ -3860,9 +3748,7 @@ open class CallTest(
|
|||||||
val url = server.url("/").newBuilder()
|
val url = server.url("/").newBuilder()
|
||||||
.host(localIpAddress)
|
.host(localIpAddress)
|
||||||
.build()
|
.build()
|
||||||
val request = Request.Builder()
|
val request = Request(url)
|
||||||
.url(url)
|
|
||||||
.build()
|
|
||||||
executeSynchronously(request)
|
executeSynchronously(request)
|
||||||
.assertCode(200)
|
.assertCode(200)
|
||||||
|
|
||||||
@ -3881,10 +3767,10 @@ open class CallTest(
|
|||||||
throw FileNotFoundException()
|
throw FileNotFoundException()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
val request = Request.Builder()
|
val request = Request(
|
||||||
.url(server.url("/"))
|
url = server.url("/"),
|
||||||
.post(body)
|
body = body,
|
||||||
.build()
|
)
|
||||||
client = client.newBuilder()
|
client = client.newBuilder()
|
||||||
.dns(DoubleInetAddressDns())
|
.dns(DoubleInetAddressDns())
|
||||||
.build()
|
.build()
|
||||||
@ -3901,11 +3787,7 @@ open class CallTest(
|
|||||||
.setChunkedBody("HelloBonjour", 1024)
|
.setChunkedBody("HelloBonjour", 1024)
|
||||||
.setTrailers(headersOf("trailers", "boom"))
|
.setTrailers(headersOf("trailers", "boom"))
|
||||||
server.enqueue(mockResponse)
|
server.enqueue(mockResponse)
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
val source = response.body.source()
|
val source = response.body.source()
|
||||||
assertThat(response.header("h1")).isEqualTo("v1")
|
assertThat(response.header("h1")).isEqualTo("v1")
|
||||||
@ -3928,11 +3810,7 @@ open class CallTest(
|
|||||||
.setTrailers(headersOf("trailers", "boom"))
|
.setTrailers(headersOf("trailers", "boom"))
|
||||||
server.enqueue(mockResponse)
|
server.enqueue(mockResponse)
|
||||||
enableProtocol(Protocol.HTTP_2)
|
enableProtocol(Protocol.HTTP_2)
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
call.execute().use { response ->
|
call.execute().use { response ->
|
||||||
val source = response.body.source()
|
val source = response.body.source()
|
||||||
assertThat(response.header("h1")).isEqualTo("v1")
|
assertThat(response.header("h1")).isEqualTo("v1")
|
||||||
@ -3960,9 +3838,9 @@ open class CallTest(
|
|||||||
|
|
||||||
@Test fun requestBodyThrowsUnrelatedToNetwork() {
|
@Test fun requestBodyThrowsUnrelatedToNetwork() {
|
||||||
server.enqueue(MockResponse())
|
server.enqueue(MockResponse())
|
||||||
val request = Request.Builder()
|
val request = Request(
|
||||||
.url(server.url("/"))
|
url = server.url("/"),
|
||||||
.post(object : RequestBody() {
|
body = object : RequestBody() {
|
||||||
override fun contentType(): MediaType? {
|
override fun contentType(): MediaType? {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
@ -3971,8 +3849,8 @@ open class CallTest(
|
|||||||
sink.flush() // For determinism, always send a partial request to the server.
|
sink.flush() // For determinism, always send a partial request to the server.
|
||||||
throw IOException("boom")
|
throw IOException("boom")
|
||||||
}
|
}
|
||||||
})
|
},
|
||||||
.build()
|
)
|
||||||
executeSynchronously(request).assertFailure("boom")
|
executeSynchronously(request).assertFailure("boom")
|
||||||
assertThat(server.takeRequest().failure).isNotNull
|
assertThat(server.takeRequest().failure).isNotNull
|
||||||
}
|
}
|
||||||
@ -4001,11 +3879,7 @@ open class CallTest(
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
.build()
|
.build()
|
||||||
val call = cancelClient.newCall(
|
val call = cancelClient.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.body.string()).isEqualTo("abc")
|
assertThat(response.body.string()).isEqualTo("abc")
|
||||||
executeSynchronously("/").assertCode(200)
|
executeSynchronously("/").assertCode(200)
|
||||||
@ -4049,9 +3923,7 @@ open class CallTest(
|
|||||||
server.enqueue(MockResponse()
|
server.enqueue(MockResponse()
|
||||||
.setBody("this is the redirect target"))
|
.setBody("this is the redirect target"))
|
||||||
|
|
||||||
val call = client.newCall(Request.Builder()
|
val call = client.newCall(Request(server.url("/")))
|
||||||
.url(server.url("/"))
|
|
||||||
.build())
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.body.string()).isEqualTo("this is the redirect target")
|
assertThat(response.body.string()).isEqualTo("this is the redirect target")
|
||||||
assertThat(response.priorResponse?.body?.contentType())
|
assertThat(response.priorResponse?.body?.contentType())
|
||||||
@ -4079,10 +3951,10 @@ open class CallTest(
|
|||||||
.retryOnConnectionFailure(false)
|
.retryOnConnectionFailure(false)
|
||||||
.build()
|
.build()
|
||||||
val call = nonRetryingClient.newCall(
|
val call = nonRetryingClient.newCall(
|
||||||
Request.Builder()
|
Request(
|
||||||
.url(server.url("/"))
|
url = server.url("/"),
|
||||||
.post(requestBody)
|
body = requestBody,
|
||||||
.build()
|
)
|
||||||
)
|
)
|
||||||
try {
|
try {
|
||||||
call.execute()
|
call.execute()
|
||||||
|
@ -55,19 +55,17 @@ class ConnectionReuseTest {
|
|||||||
@Test fun connectionsAreReused() {
|
@Test fun connectionsAreReused() {
|
||||||
server.enqueue(MockResponse().setBody("a"))
|
server.enqueue(MockResponse().setBody("a"))
|
||||||
server.enqueue(MockResponse().setBody("b"))
|
server.enqueue(MockResponse().setBody("b"))
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
assertConnectionReused(request, request)
|
assertConnectionReused(request, request)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test fun connectionsAreReusedForPosts() {
|
@Test fun connectionsAreReusedForPosts() {
|
||||||
server.enqueue(MockResponse().setBody("a"))
|
server.enqueue(MockResponse().setBody("a"))
|
||||||
server.enqueue(MockResponse().setBody("b"))
|
server.enqueue(MockResponse().setBody("b"))
|
||||||
val request = Request.Builder()
|
val request = Request(
|
||||||
.url(server.url("/"))
|
url = server.url("/"),
|
||||||
.post("request body".toRequestBody("text/plain".toMediaType()))
|
body ="request body".toRequestBody("text/plain".toMediaType()),
|
||||||
.build()
|
)
|
||||||
assertConnectionReused(request, request)
|
assertConnectionReused(request, request)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,9 +74,7 @@ class ConnectionReuseTest {
|
|||||||
enableHttp2()
|
enableHttp2()
|
||||||
server.enqueue(MockResponse().setBody("a"))
|
server.enqueue(MockResponse().setBody("a"))
|
||||||
server.enqueue(MockResponse().setBody("b"))
|
server.enqueue(MockResponse().setBody("b"))
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
assertConnectionReused(request, request)
|
assertConnectionReused(request, request)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -89,9 +85,7 @@ class ConnectionReuseTest {
|
|||||||
.url(server.url("/"))
|
.url(server.url("/"))
|
||||||
.header("Connection", "close")
|
.header("Connection", "close")
|
||||||
.build()
|
.build()
|
||||||
val requestB = Request.Builder()
|
val requestB = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
assertConnectionNotReused(requestA, requestB)
|
assertConnectionNotReused(requestA, requestB)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -102,12 +96,8 @@ class ConnectionReuseTest {
|
|||||||
.setBody("a")
|
.setBody("a")
|
||||||
)
|
)
|
||||||
server.enqueue(MockResponse().setBody("b"))
|
server.enqueue(MockResponse().setBody("b"))
|
||||||
val requestA = Request.Builder()
|
val requestA = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
val requestB = Request(server.url("/"))
|
||||||
.build()
|
|
||||||
val requestB = Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
assertConnectionNotReused(requestA, requestB)
|
assertConnectionNotReused(requestA, requestB)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -119,9 +109,7 @@ class ConnectionReuseTest {
|
|||||||
.clearHeaders()
|
.clearHeaders()
|
||||||
)
|
)
|
||||||
server.enqueue(MockResponse().setBody("b"))
|
server.enqueue(MockResponse().setBody("b"))
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
assertConnectionNotReused(request, request)
|
assertConnectionNotReused(request, request)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -131,9 +119,7 @@ class ConnectionReuseTest {
|
|||||||
.build()
|
.build()
|
||||||
server.enqueue(MockResponse().setBody("a"))
|
server.enqueue(MockResponse().setBody("a"))
|
||||||
server.enqueue(MockResponse().setBody("b"))
|
server.enqueue(MockResponse().setBody("b"))
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
assertConnectionNotReused(request, request)
|
assertConnectionNotReused(request, request)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -148,9 +134,7 @@ class ConnectionReuseTest {
|
|||||||
.setBody("a")
|
.setBody("a")
|
||||||
)
|
)
|
||||||
server.enqueue(MockResponse().setBody("b"))
|
server.enqueue(MockResponse().setBody("b"))
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
val response = client.newCall(request).execute()
|
val response = client.newCall(request).execute()
|
||||||
assertThat(response.body.string()).isEqualTo("b")
|
assertThat(response.body.string()).isEqualTo("b")
|
||||||
assertThat(server.takeRequest().sequenceNumber).isEqualTo(0)
|
assertThat(server.takeRequest().sequenceNumber).isEqualTo(0)
|
||||||
@ -169,9 +153,7 @@ class ConnectionReuseTest {
|
|||||||
.setBody("a")
|
.setBody("a")
|
||||||
)
|
)
|
||||||
server.enqueue(MockResponse().setBody("b"))
|
server.enqueue(MockResponse().setBody("b"))
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
val response = client.newCall(request).execute()
|
val response = client.newCall(request).execute()
|
||||||
assertThat(response.body.string()).isEqualTo("b")
|
assertThat(response.body.string()).isEqualTo("b")
|
||||||
assertThat(server.takeRequest().sequenceNumber).isEqualTo(0)
|
assertThat(server.takeRequest().sequenceNumber).isEqualTo(0)
|
||||||
@ -182,9 +164,7 @@ class ConnectionReuseTest {
|
|||||||
server.enqueue(MockResponse().setBody("a"))
|
server.enqueue(MockResponse().setBody("a"))
|
||||||
server.enqueue(MockResponse().setSocketPolicy(SocketPolicy.DISCONNECT_AFTER_REQUEST))
|
server.enqueue(MockResponse().setSocketPolicy(SocketPolicy.DISCONNECT_AFTER_REQUEST))
|
||||||
server.enqueue(MockResponse().setBody("b"))
|
server.enqueue(MockResponse().setBody("b"))
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
val responseA = client.newCall(request).execute()
|
val responseA = client.newCall(request).execute()
|
||||||
assertThat(responseA.body.string()).isEqualTo("a")
|
assertThat(responseA.body.string()).isEqualTo("a")
|
||||||
assertThat(server.takeRequest().sequenceNumber).isEqualTo(0)
|
assertThat(server.takeRequest().sequenceNumber).isEqualTo(0)
|
||||||
@ -199,9 +179,7 @@ class ConnectionReuseTest {
|
|||||||
enableHttp2()
|
enableHttp2()
|
||||||
server.enqueue(MockResponse().setBody("a"))
|
server.enqueue(MockResponse().setBody("a"))
|
||||||
server.enqueue(MockResponse().setBody("b"))
|
server.enqueue(MockResponse().setBody("b"))
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
val response1 = client.newCall(request).execute()
|
val response1 = client.newCall(request).execute()
|
||||||
val response2 = client.newCall(request).execute()
|
val response2 = client.newCall(request).execute()
|
||||||
response1.body.string() // Discard the response body.
|
response1.body.string() // Discard the response body.
|
||||||
@ -216,9 +194,7 @@ class ConnectionReuseTest {
|
|||||||
client = client.newBuilder()
|
client = client.newBuilder()
|
||||||
.connectionPool(ConnectionPool(5, 250, TimeUnit.MILLISECONDS))
|
.connectionPool(ConnectionPool(5, 250, TimeUnit.MILLISECONDS))
|
||||||
.build()
|
.build()
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
val response1 = client.newCall(request).execute()
|
val response1 = client.newCall(request).execute()
|
||||||
assertThat(response1.body.string()).isEqualTo("a")
|
assertThat(response1.body.string()).isEqualTo("a")
|
||||||
|
|
||||||
@ -235,9 +211,7 @@ class ConnectionReuseTest {
|
|||||||
enableHttps()
|
enableHttps()
|
||||||
server.enqueue(MockResponse())
|
server.enqueue(MockResponse())
|
||||||
server.enqueue(MockResponse())
|
server.enqueue(MockResponse())
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
val response = client.newCall(request).execute()
|
val response = client.newCall(request).execute()
|
||||||
response.body.close()
|
response.body.close()
|
||||||
|
|
||||||
@ -262,9 +236,7 @@ class ConnectionReuseTest {
|
|||||||
enableHttps()
|
enableHttps()
|
||||||
server.enqueue(MockResponse())
|
server.enqueue(MockResponse())
|
||||||
server.enqueue(MockResponse())
|
server.enqueue(MockResponse())
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
val response1 = client.newCall(request).execute()
|
val response1 = client.newCall(request).execute()
|
||||||
response1.body.close()
|
response1.body.close()
|
||||||
|
|
||||||
@ -317,9 +289,7 @@ class ConnectionReuseTest {
|
|||||||
MockResponse()
|
MockResponse()
|
||||||
.setBody("/b is here")
|
.setBody("/b is here")
|
||||||
)
|
)
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
val call = client.newCall(request)
|
val call = client.newCall(request)
|
||||||
call.execute().use { response ->
|
call.execute().use { response ->
|
||||||
assertThat(
|
assertThat(
|
||||||
|
@ -121,11 +121,7 @@ class FastFallbackTest {
|
|||||||
.setBody("hello from IPv6")
|
.setBody("hello from IPv6")
|
||||||
)
|
)
|
||||||
|
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(url))
|
||||||
Request.Builder()
|
|
||||||
.url(url)
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.body.string()).isEqualTo("hello from IPv6")
|
assertThat(response.body.string()).isEqualTo("hello from IPv6")
|
||||||
|
|
||||||
@ -150,11 +146,7 @@ class FastFallbackTest {
|
|||||||
.setBody("hello from IPv6")
|
.setBody("hello from IPv6")
|
||||||
)
|
)
|
||||||
|
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(url))
|
||||||
Request.Builder()
|
|
||||||
.url(url)
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.body.string()).isEqualTo("hello from IPv6")
|
assertThat(response.body.string()).isEqualTo("hello from IPv6")
|
||||||
|
|
||||||
@ -171,11 +163,7 @@ class FastFallbackTest {
|
|||||||
.setBody("hello from IPv4")
|
.setBody("hello from IPv4")
|
||||||
)
|
)
|
||||||
|
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(url))
|
||||||
Request.Builder()
|
|
||||||
.url(url)
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.body.string()).isEqualTo("hello from IPv4")
|
assertThat(response.body.string()).isEqualTo("hello from IPv4")
|
||||||
|
|
||||||
@ -193,11 +181,7 @@ class FastFallbackTest {
|
|||||||
.setBody("hello from IPv6")
|
.setBody("hello from IPv6")
|
||||||
)
|
)
|
||||||
|
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(url))
|
||||||
Request.Builder()
|
|
||||||
.url(url)
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.body.string()).isEqualTo("hello from IPv6")
|
assertThat(response.body.string()).isEqualTo("hello from IPv6")
|
||||||
|
|
||||||
@ -212,11 +196,7 @@ class FastFallbackTest {
|
|||||||
serverIpv4.shutdown()
|
serverIpv4.shutdown()
|
||||||
serverIpv6.shutdown()
|
serverIpv6.shutdown()
|
||||||
|
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(url))
|
||||||
Request.Builder()
|
|
||||||
.url(url)
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
assertFailsWith<IOException> {
|
assertFailsWith<IOException> {
|
||||||
call.execute()
|
call.execute()
|
||||||
}
|
}
|
||||||
@ -239,11 +219,7 @@ class FastFallbackTest {
|
|||||||
.setBody("hello from IPv4")
|
.setBody("hello from IPv4")
|
||||||
)
|
)
|
||||||
|
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(url))
|
||||||
Request.Builder()
|
|
||||||
.url(url)
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.body.string()).isEqualTo("hello from IPv4")
|
assertThat(response.body.string()).isEqualTo("hello from IPv4")
|
||||||
|
|
||||||
@ -268,11 +244,7 @@ class FastFallbackTest {
|
|||||||
.fastFallback(false)
|
.fastFallback(false)
|
||||||
.callTimeout(1_000, TimeUnit.MILLISECONDS)
|
.callTimeout(1_000, TimeUnit.MILLISECONDS)
|
||||||
.build()
|
.build()
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(url))
|
||||||
Request.Builder()
|
|
||||||
.url(url)
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
try {
|
try {
|
||||||
call.execute()
|
call.execute()
|
||||||
fail("expected a timeout")
|
fail("expected a timeout")
|
||||||
@ -341,11 +313,7 @@ class FastFallbackTest {
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Confirm the retry succeeds on the same connection.
|
// Confirm the retry succeeds on the same connection.
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(url))
|
||||||
Request.Builder()
|
|
||||||
.url(url)
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.body.string()).isEqualTo("this was the 2nd request on IPv4")
|
assertThat(response.body.string()).isEqualTo("this was the 2nd request on IPv4")
|
||||||
assertThat(serverIpv4.takeRequest().sequenceNumber).isEqualTo(0)
|
assertThat(serverIpv4.takeRequest().sequenceNumber).isEqualTo(0)
|
||||||
|
@ -47,9 +47,7 @@ class InsecureForHostTest(
|
|||||||
.sslSocketFactory(clientCertificates.sslSocketFactory(), clientCertificates.trustManager)
|
.sslSocketFactory(clientCertificates.sslSocketFactory(), clientCertificates.trustManager)
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
val call = client.newCall(Request.Builder()
|
val call = client.newCall(Request(server.url("/")))
|
||||||
.url(server.url("/"))
|
|
||||||
.build())
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.code).isEqualTo(200)
|
assertThat(response.code).isEqualTo(200)
|
||||||
assertThat(response.handshake!!.cipherSuite).isNotNull()
|
assertThat(response.handshake!!.cipherSuite).isNotNull()
|
||||||
@ -79,9 +77,7 @@ class InsecureForHostTest(
|
|||||||
.sslSocketFactory(clientCertificates.sslSocketFactory(), clientCertificates.trustManager)
|
.sslSocketFactory(clientCertificates.sslSocketFactory(), clientCertificates.trustManager)
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
val call = client.newCall(Request.Builder()
|
val call = client.newCall(Request(server.url("/")))
|
||||||
.url(server.url("/"))
|
|
||||||
.build())
|
|
||||||
try {
|
try {
|
||||||
call.execute()
|
call.execute()
|
||||||
fail("")
|
fail("")
|
||||||
@ -103,9 +99,7 @@ class InsecureForHostTest(
|
|||||||
.sslSocketFactory(clientCertificates.sslSocketFactory(), clientCertificates.trustManager)
|
.sslSocketFactory(clientCertificates.sslSocketFactory(), clientCertificates.trustManager)
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
val call = client.newCall(Request.Builder()
|
val call = client.newCall(Request(server.url("/")))
|
||||||
.url(server.url("/"))
|
|
||||||
.build())
|
|
||||||
try {
|
try {
|
||||||
call.execute()
|
call.execute()
|
||||||
fail("")
|
fail("")
|
||||||
|
@ -62,7 +62,7 @@ class JSSETest(
|
|||||||
|
|
||||||
server.enqueue(MockResponse().setBody("abc"))
|
server.enqueue(MockResponse().setBody("abc"))
|
||||||
|
|
||||||
val request = Request.Builder().url(server.url("/")).build()
|
val request = Request(server.url("/"))
|
||||||
|
|
||||||
val response = client.newCall(request).execute()
|
val response = client.newCall(request).execute()
|
||||||
|
|
||||||
|
@ -963,6 +963,17 @@ class KotlinSourceModernTest {
|
|||||||
val cacheControl: CacheControl = request.cacheControl
|
val cacheControl: CacheControl = request.cacheControl
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun requestConstructor() {
|
||||||
|
Request(url = "".toHttpUrl())
|
||||||
|
Request(
|
||||||
|
url = "".toHttpUrl(),
|
||||||
|
headers = headersOf(),
|
||||||
|
method = "",
|
||||||
|
body = "".toRequestBody(null),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun requestBuilder() {
|
fun requestBuilder() {
|
||||||
val requestBody = "".toRequestBody(null)
|
val requestBody = "".toRequestBody(null)
|
||||||
|
@ -220,9 +220,7 @@ class OkHttpClientTest {
|
|||||||
server!!.enqueue(MockResponse().setBody("abc"))
|
server!!.enqueue(MockResponse().setBody("abc"))
|
||||||
ProxySelector.setDefault(null)
|
ProxySelector.setDefault(null)
|
||||||
val client = clientTestRule.newClient()
|
val client = clientTestRule.newClient()
|
||||||
val request = Request.Builder()
|
val request = Request(server!!.url("/"))
|
||||||
.url(server!!.url("/"))
|
|
||||||
.build()
|
|
||||||
val response = client.newCall(request).execute()
|
val response = client.newCall(request).execute()
|
||||||
assertThat(response.body.string()).isEqualTo("abc")
|
assertThat(response.body.string()).isEqualTo("abc")
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,7 @@ class OpenJSSETest(
|
|||||||
|
|
||||||
server.enqueue(MockResponse().setBody("abc"))
|
server.enqueue(MockResponse().setBody("abc"))
|
||||||
|
|
||||||
val request = Request.Builder().url(server.url("/")).build()
|
val request = Request(server.url("/"))
|
||||||
|
|
||||||
val response = client.newCall(request).execute()
|
val response = client.newCall(request).execute()
|
||||||
|
|
||||||
|
@ -1,371 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2013 Square, Inc.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package okhttp3;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileWriter;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.net.URI;
|
|
||||||
import java.util.UUID;
|
|
||||||
import okio.Buffer;
|
|
||||||
import okio.ByteString;
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
|
|
||||||
import static java.nio.charset.StandardCharsets.UTF_8;
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
|
||||||
import static org.junit.jupiter.api.Assertions.fail;
|
|
||||||
|
|
||||||
public final class RequestTest {
|
|
||||||
@Test public void string() throws Exception {
|
|
||||||
MediaType contentType = MediaType.get("text/plain; charset=utf-8");
|
|
||||||
RequestBody body = RequestBody.create("abc".getBytes(UTF_8), contentType);
|
|
||||||
assertThat(body.contentType()).isEqualTo(contentType);
|
|
||||||
assertThat(body.contentLength()).isEqualTo(3);
|
|
||||||
assertThat(bodyToHex(body)).isEqualTo("616263");
|
|
||||||
assertThat(bodyToHex(body)).overridingErrorMessage("Retransmit body").isEqualTo(
|
|
||||||
"616263");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test public void stringWithDefaultCharsetAdded() throws Exception {
|
|
||||||
MediaType contentType = MediaType.get("text/plain");
|
|
||||||
RequestBody body = RequestBody.create("\u0800", contentType);
|
|
||||||
assertThat(body.contentType()).isEqualTo(MediaType.get("text/plain; charset=utf-8"));
|
|
||||||
assertThat(body.contentLength()).isEqualTo(3);
|
|
||||||
assertThat(bodyToHex(body)).isEqualTo("e0a080");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test public void stringWithNonDefaultCharsetSpecified() throws Exception {
|
|
||||||
MediaType contentType = MediaType.get("text/plain; charset=utf-16be");
|
|
||||||
RequestBody body = RequestBody.create("\u0800", contentType);
|
|
||||||
assertThat(body.contentType()).isEqualTo(contentType);
|
|
||||||
assertThat(body.contentLength()).isEqualTo(2);
|
|
||||||
assertThat(bodyToHex(body)).isEqualTo("0800");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test public void byteArray() throws Exception {
|
|
||||||
MediaType contentType = MediaType.get("text/plain");
|
|
||||||
RequestBody body = RequestBody.create("abc".getBytes(UTF_8), contentType);
|
|
||||||
assertThat(body.contentType()).isEqualTo(contentType);
|
|
||||||
assertThat(body.contentLength()).isEqualTo(3);
|
|
||||||
assertThat(bodyToHex(body)).isEqualTo("616263");
|
|
||||||
assertThat(bodyToHex(body)).overridingErrorMessage("Retransmit body").isEqualTo(
|
|
||||||
"616263");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test public void byteArrayRange() throws Exception {
|
|
||||||
MediaType contentType = MediaType.get("text/plain");
|
|
||||||
RequestBody body = RequestBody.create(".abcd".getBytes(UTF_8), contentType, 1, 3);
|
|
||||||
assertThat(body.contentType()).isEqualTo(contentType);
|
|
||||||
assertThat(body.contentLength()).isEqualTo(3);
|
|
||||||
assertThat(bodyToHex(body)).isEqualTo("616263");
|
|
||||||
assertThat(bodyToHex(body)).overridingErrorMessage("Retransmit body").isEqualTo(
|
|
||||||
"616263");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test public void byteString() throws Exception {
|
|
||||||
MediaType contentType = MediaType.get("text/plain");
|
|
||||||
RequestBody body = RequestBody.create(ByteString.encodeUtf8("Hello"), contentType);
|
|
||||||
assertThat(body.contentType()).isEqualTo(contentType);
|
|
||||||
assertThat(body.contentLength()).isEqualTo(5);
|
|
||||||
assertThat(bodyToHex(body)).isEqualTo("48656c6c6f");
|
|
||||||
assertThat(bodyToHex(body)).overridingErrorMessage("Retransmit body").isEqualTo(
|
|
||||||
"48656c6c6f");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test public void file() throws Exception {
|
|
||||||
File file = File.createTempFile("RequestTest", "tmp");
|
|
||||||
FileWriter writer = new FileWriter(file);
|
|
||||||
writer.write("abc");
|
|
||||||
writer.close();
|
|
||||||
|
|
||||||
MediaType contentType = MediaType.get("text/plain");
|
|
||||||
RequestBody body = RequestBody.create(file, contentType);
|
|
||||||
assertThat(body.contentType()).isEqualTo(contentType);
|
|
||||||
assertThat(body.contentLength()).isEqualTo(3);
|
|
||||||
assertThat(bodyToHex(body)).isEqualTo("616263");
|
|
||||||
assertThat(bodyToHex(body)).overridingErrorMessage("Retransmit body").isEqualTo(
|
|
||||||
"616263");
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Common verbs used for apis such as GitHub, AWS, and Google Cloud. */
|
|
||||||
@Test public void crudVerbs() throws IOException {
|
|
||||||
MediaType contentType = MediaType.get("application/json");
|
|
||||||
RequestBody body = RequestBody.create("{}", contentType);
|
|
||||||
|
|
||||||
Request get = new Request.Builder().url("http://localhost/api").get().build();
|
|
||||||
assertThat(get.method()).isEqualTo("GET");
|
|
||||||
assertThat(get.body()).isNull();
|
|
||||||
|
|
||||||
Request head = new Request.Builder().url("http://localhost/api").head().build();
|
|
||||||
assertThat(head.method()).isEqualTo("HEAD");
|
|
||||||
assertThat(head.body()).isNull();
|
|
||||||
|
|
||||||
Request delete = new Request.Builder().url("http://localhost/api").delete().build();
|
|
||||||
assertThat(delete.method()).isEqualTo("DELETE");
|
|
||||||
assertThat(delete.body().contentLength()).isEqualTo(0L);
|
|
||||||
|
|
||||||
Request post = new Request.Builder().url("http://localhost/api").post(body).build();
|
|
||||||
assertThat(post.method()).isEqualTo("POST");
|
|
||||||
assertThat(post.body()).isEqualTo(body);
|
|
||||||
|
|
||||||
Request put = new Request.Builder().url("http://localhost/api").put(body).build();
|
|
||||||
assertThat(put.method()).isEqualTo("PUT");
|
|
||||||
assertThat(put.body()).isEqualTo(body);
|
|
||||||
|
|
||||||
Request patch = new Request.Builder().url("http://localhost/api").patch(body).build();
|
|
||||||
assertThat(patch.method()).isEqualTo("PATCH");
|
|
||||||
assertThat(patch.body()).isEqualTo(body);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test public void uninitializedURI() throws Exception {
|
|
||||||
Request request = new Request.Builder().url("http://localhost/api").build();
|
|
||||||
assertThat(request.url().uri()).isEqualTo(new URI("http://localhost/api"));
|
|
||||||
assertThat(request.url()).isEqualTo(HttpUrl.get("http://localhost/api"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test public void newBuilderUrlResetsUrl() {
|
|
||||||
Request requestWithoutCache = new Request.Builder().url("http://localhost/api").build();
|
|
||||||
Request builtRequestWithoutCache =
|
|
||||||
requestWithoutCache.newBuilder().url("http://localhost/api/foo").build();
|
|
||||||
assertThat(builtRequestWithoutCache.url()).isEqualTo(
|
|
||||||
HttpUrl.get("http://localhost/api/foo"));
|
|
||||||
|
|
||||||
Request requestWithCache = new Request.Builder().url("http://localhost/api").build();
|
|
||||||
// cache url object
|
|
||||||
requestWithCache.url();
|
|
||||||
Request builtRequestWithCache = requestWithCache.newBuilder().url(
|
|
||||||
"http://localhost/api/foo").build();
|
|
||||||
assertThat(builtRequestWithCache.url()).isEqualTo(
|
|
||||||
HttpUrl.get("http://localhost/api/foo"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test public void cacheControl() {
|
|
||||||
Request request = new Request.Builder()
|
|
||||||
.cacheControl(new CacheControl.Builder().noCache().build())
|
|
||||||
.url("https://square.com")
|
|
||||||
.build();
|
|
||||||
assertThat(request.headers("Cache-Control")).containsExactly("no-cache");
|
|
||||||
assertThat(request.cacheControl().noCache()).isTrue();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test public void emptyCacheControlClearsAllCacheControlHeaders() {
|
|
||||||
Request request = new Request.Builder()
|
|
||||||
.header("Cache-Control", "foo")
|
|
||||||
.cacheControl(new CacheControl.Builder().build())
|
|
||||||
.url("https://square.com")
|
|
||||||
.build();
|
|
||||||
assertThat(request.headers("Cache-Control")).isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test public void headerAcceptsPermittedCharacters() {
|
|
||||||
Request.Builder builder = new Request.Builder();
|
|
||||||
builder.header("AZab09~", "AZab09 ~");
|
|
||||||
builder.addHeader("AZab09~", "AZab09 ~");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test public void emptyNameForbidden() {
|
|
||||||
Request.Builder builder = new Request.Builder();
|
|
||||||
try {
|
|
||||||
builder.header("", "Value");
|
|
||||||
fail();
|
|
||||||
} catch (IllegalArgumentException expected) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
builder.addHeader("", "Value");
|
|
||||||
fail();
|
|
||||||
} catch (IllegalArgumentException expected) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test public void headerForbidsNullArguments() {
|
|
||||||
Request.Builder builder = new Request.Builder();
|
|
||||||
try {
|
|
||||||
builder.header(null, "Value");
|
|
||||||
fail();
|
|
||||||
} catch (NullPointerException expected) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
builder.addHeader(null, "Value");
|
|
||||||
fail();
|
|
||||||
} catch (NullPointerException expected) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
builder.header("Name", null);
|
|
||||||
fail();
|
|
||||||
} catch (NullPointerException expected) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
builder.addHeader("Name", null);
|
|
||||||
fail();
|
|
||||||
} catch (NullPointerException expected) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test public void headerAllowsTabOnlyInValues() {
|
|
||||||
Request.Builder builder = new Request.Builder();
|
|
||||||
builder.header("key", "sample\tvalue");
|
|
||||||
try {
|
|
||||||
builder.header("sample\tkey", "value");
|
|
||||||
fail();
|
|
||||||
} catch (IllegalArgumentException expected) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test public void headerForbidsControlCharacters() {
|
|
||||||
assertForbiddenHeader("\u0000");
|
|
||||||
assertForbiddenHeader("\r");
|
|
||||||
assertForbiddenHeader("\n");
|
|
||||||
assertForbiddenHeader("\u001f");
|
|
||||||
assertForbiddenHeader("\u007f");
|
|
||||||
assertForbiddenHeader("\u0080");
|
|
||||||
assertForbiddenHeader("\ud83c\udf69");
|
|
||||||
}
|
|
||||||
|
|
||||||
private void assertForbiddenHeader(String s) {
|
|
||||||
Request.Builder builder = new Request.Builder();
|
|
||||||
try {
|
|
||||||
builder.header(s, "Value");
|
|
||||||
fail();
|
|
||||||
} catch (IllegalArgumentException expected) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
builder.addHeader(s, "Value");
|
|
||||||
fail();
|
|
||||||
} catch (IllegalArgumentException expected) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
builder.header("Name", s);
|
|
||||||
fail();
|
|
||||||
} catch (IllegalArgumentException expected) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
builder.addHeader("Name", s);
|
|
||||||
fail();
|
|
||||||
} catch (IllegalArgumentException expected) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test public void noTag() {
|
|
||||||
Request request = new Request.Builder()
|
|
||||||
.url("https://square.com")
|
|
||||||
.build();
|
|
||||||
assertThat(request.tag()).isNull();
|
|
||||||
assertThat(request.tag(Object.class)).isNull();
|
|
||||||
assertThat(request.tag(UUID.class)).isNull();
|
|
||||||
assertThat(request.tag(String.class)).isNull();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test public void defaultTag() {
|
|
||||||
UUID tag = UUID.randomUUID();
|
|
||||||
Request request = new Request.Builder()
|
|
||||||
.url("https://square.com")
|
|
||||||
.tag(tag)
|
|
||||||
.build();
|
|
||||||
assertThat(request.tag()).isSameAs(tag);
|
|
||||||
assertThat(request.tag(Object.class)).isSameAs(tag);
|
|
||||||
assertThat(request.tag(UUID.class)).isNull();
|
|
||||||
assertThat(request.tag(String.class)).isNull();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test public void nullRemovesTag() {
|
|
||||||
Request request = new Request.Builder()
|
|
||||||
.url("https://square.com")
|
|
||||||
.tag("a")
|
|
||||||
.tag(null)
|
|
||||||
.build();
|
|
||||||
assertThat(request.tag()).isNull();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test public void removeAbsentTag() {
|
|
||||||
Request request = new Request.Builder()
|
|
||||||
.url("https://square.com")
|
|
||||||
.tag(null)
|
|
||||||
.build();
|
|
||||||
assertThat(request.tag()).isNull();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test public void objectTag() {
|
|
||||||
UUID tag = UUID.randomUUID();
|
|
||||||
Request request = new Request.Builder()
|
|
||||||
.url("https://square.com")
|
|
||||||
.tag(Object.class, tag)
|
|
||||||
.build();
|
|
||||||
assertThat(request.tag()).isSameAs(tag);
|
|
||||||
assertThat(request.tag(Object.class)).isSameAs(tag);
|
|
||||||
assertThat(request.tag(UUID.class)).isNull();
|
|
||||||
assertThat(request.tag(String.class)).isNull();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test public void typedTag() {
|
|
||||||
UUID uuidTag = UUID.randomUUID();
|
|
||||||
Request request = new Request.Builder()
|
|
||||||
.url("https://square.com")
|
|
||||||
.tag(UUID.class, uuidTag)
|
|
||||||
.build();
|
|
||||||
assertThat(request.tag()).isNull();
|
|
||||||
assertThat(request.tag(Object.class)).isNull();
|
|
||||||
assertThat(request.tag(UUID.class)).isSameAs(uuidTag);
|
|
||||||
assertThat(request.tag(String.class)).isNull();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test public void replaceOnlyTag() {
|
|
||||||
UUID uuidTag1 = UUID.randomUUID();
|
|
||||||
UUID uuidTag2 = UUID.randomUUID();
|
|
||||||
Request request = new Request.Builder()
|
|
||||||
.url("https://square.com")
|
|
||||||
.tag(UUID.class, uuidTag1)
|
|
||||||
.tag(UUID.class, uuidTag2)
|
|
||||||
.build();
|
|
||||||
assertThat(request.tag(UUID.class)).isSameAs(uuidTag2);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test public void multipleTags() {
|
|
||||||
UUID uuidTag = UUID.randomUUID();
|
|
||||||
String stringTag = "dilophosaurus";
|
|
||||||
Long longTag = 20170815L;
|
|
||||||
Object objectTag = new Object();
|
|
||||||
Request request = new Request.Builder()
|
|
||||||
.url("https://square.com")
|
|
||||||
.tag(Object.class, objectTag)
|
|
||||||
.tag(UUID.class, uuidTag)
|
|
||||||
.tag(String.class, stringTag)
|
|
||||||
.tag(Long.class, longTag)
|
|
||||||
.build();
|
|
||||||
assertThat(request.tag()).isSameAs(objectTag);
|
|
||||||
assertThat(request.tag(Object.class)).isSameAs(objectTag);
|
|
||||||
assertThat(request.tag(UUID.class)).isSameAs(uuidTag);
|
|
||||||
assertThat(request.tag(String.class)).isSameAs(stringTag);
|
|
||||||
assertThat(request.tag(Long.class)).isSameAs(longTag);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Confirm that we don't accidentally share the backing map between objects. */
|
|
||||||
@Test public void tagsAreImmutable() {
|
|
||||||
Request.Builder builder = new Request.Builder()
|
|
||||||
.url("https://square.com");
|
|
||||||
Request requestA = builder.tag(String.class, "a").build();
|
|
||||||
Request requestB = builder.tag(String.class, "b").build();
|
|
||||||
Request requestC = requestA.newBuilder().tag(String.class, "c").build();
|
|
||||||
assertThat(requestA.tag(String.class)).isSameAs("a");
|
|
||||||
assertThat(requestB.tag(String.class)).isSameAs("b");
|
|
||||||
assertThat(requestC.tag(String.class)).isSameAs("c");
|
|
||||||
}
|
|
||||||
|
|
||||||
private String bodyToHex(RequestBody body) throws IOException {
|
|
||||||
Buffer buffer = new Buffer();
|
|
||||||
body.writeTo(buffer);
|
|
||||||
return buffer.readByteString().hex();
|
|
||||||
}
|
|
||||||
}
|
|
448
okhttp/src/jvmTest/java/okhttp3/RequestTest.kt
Normal file
448
okhttp/src/jvmTest/java/okhttp3/RequestTest.kt
Normal file
@ -0,0 +1,448 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2013 Square, Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package okhttp3
|
||||||
|
|
||||||
|
import java.io.File
|
||||||
|
import java.io.FileWriter
|
||||||
|
import java.net.URI
|
||||||
|
import java.util.UUID
|
||||||
|
import okhttp3.Headers.Companion.headersOf
|
||||||
|
import okhttp3.HttpUrl.Companion.toHttpUrl
|
||||||
|
import okhttp3.MediaType.Companion.toMediaType
|
||||||
|
import okhttp3.RequestBody.Companion.asRequestBody
|
||||||
|
import okhttp3.RequestBody.Companion.toRequestBody
|
||||||
|
import okio.Buffer
|
||||||
|
import okio.ByteString.Companion.encodeUtf8
|
||||||
|
import org.assertj.core.api.Assertions.assertThat
|
||||||
|
import org.assertj.core.api.Assertions.fail
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
|
class RequestTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun constructor() {
|
||||||
|
val url = "https://example.com/".toHttpUrl()
|
||||||
|
val body = "hello".toRequestBody()
|
||||||
|
val headers = headersOf("User-Agent", "RequestTest")
|
||||||
|
val method = "PUT"
|
||||||
|
val request = Request(
|
||||||
|
url = url,
|
||||||
|
headers = headers,
|
||||||
|
method = method,
|
||||||
|
body = body
|
||||||
|
)
|
||||||
|
assertThat(request.url).isEqualTo(url)
|
||||||
|
assertThat(request.headers).isEqualTo(headers)
|
||||||
|
assertThat(request.method).isEqualTo(method)
|
||||||
|
assertThat(request.body).isEqualTo(body)
|
||||||
|
assertThat(request.tags).isEmpty()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun constructorNoBodyNoMethod() {
|
||||||
|
val url = "https://example.com/".toHttpUrl()
|
||||||
|
val headers = headersOf("User-Agent", "RequestTest")
|
||||||
|
val request = Request(
|
||||||
|
url = url,
|
||||||
|
headers = headers,
|
||||||
|
)
|
||||||
|
assertThat(request.url).isEqualTo(url)
|
||||||
|
assertThat(request.headers).isEqualTo(headers)
|
||||||
|
assertThat(request.method).isEqualTo("GET")
|
||||||
|
assertThat(request.body).isNull()
|
||||||
|
assertThat(request.tags).isEmpty()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun constructorNoMethod() {
|
||||||
|
val url = "https://example.com/".toHttpUrl()
|
||||||
|
val body = "hello".toRequestBody()
|
||||||
|
val headers = headersOf("User-Agent", "RequestTest")
|
||||||
|
val request = Request(
|
||||||
|
url = url,
|
||||||
|
headers = headers,
|
||||||
|
body = body
|
||||||
|
)
|
||||||
|
assertThat(request.url).isEqualTo(url)
|
||||||
|
assertThat(request.headers).isEqualTo(headers)
|
||||||
|
assertThat(request.method).isEqualTo("POST")
|
||||||
|
assertThat(request.body).isEqualTo(body)
|
||||||
|
assertThat(request.tags).isEmpty()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun constructorNoBody() {
|
||||||
|
val url = "https://example.com/".toHttpUrl()
|
||||||
|
val headers = headersOf("User-Agent", "RequestTest")
|
||||||
|
val method = "DELETE"
|
||||||
|
val request = Request(
|
||||||
|
url = url,
|
||||||
|
headers = headers,
|
||||||
|
method = method,
|
||||||
|
)
|
||||||
|
assertThat(request.url).isEqualTo(url)
|
||||||
|
assertThat(request.headers).isEqualTo(headers)
|
||||||
|
assertThat(request.method).isEqualTo(method)
|
||||||
|
assertThat(request.body).isNull()
|
||||||
|
assertThat(request.tags).isEmpty()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun string() {
|
||||||
|
val contentType = "text/plain; charset=utf-8".toMediaType()
|
||||||
|
val body = "abc".toByteArray().toRequestBody(contentType)
|
||||||
|
assertThat(body.contentType()).isEqualTo(contentType)
|
||||||
|
assertThat(body.contentLength()).isEqualTo(3)
|
||||||
|
assertThat(bodyToHex(body)).isEqualTo("616263")
|
||||||
|
assertThat(bodyToHex(body))
|
||||||
|
.overridingErrorMessage("Retransmit body")
|
||||||
|
.isEqualTo("616263")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun stringWithDefaultCharsetAdded() {
|
||||||
|
val contentType = "text/plain".toMediaType()
|
||||||
|
val body = "\u0800".toRequestBody(contentType)
|
||||||
|
assertThat(body.contentType()).isEqualTo("text/plain; charset=utf-8".toMediaType())
|
||||||
|
assertThat(body.contentLength()).isEqualTo(3)
|
||||||
|
assertThat(bodyToHex(body)).isEqualTo("e0a080")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun stringWithNonDefaultCharsetSpecified() {
|
||||||
|
val contentType = "text/plain; charset=utf-16be".toMediaType()
|
||||||
|
val body = "\u0800".toRequestBody(contentType)
|
||||||
|
assertThat(body.contentType()).isEqualTo(contentType)
|
||||||
|
assertThat(body.contentLength()).isEqualTo(2)
|
||||||
|
assertThat(bodyToHex(body)).isEqualTo("0800")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun byteArray() {
|
||||||
|
val contentType = "text/plain".toMediaType()
|
||||||
|
val body: RequestBody = "abc".toByteArray().toRequestBody(contentType)
|
||||||
|
assertThat(body.contentType()).isEqualTo(contentType)
|
||||||
|
assertThat(body.contentLength()).isEqualTo(3)
|
||||||
|
assertThat(bodyToHex(body)).isEqualTo("616263")
|
||||||
|
assertThat(bodyToHex(body))
|
||||||
|
.overridingErrorMessage("Retransmit body")
|
||||||
|
.isEqualTo("616263")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun byteArrayRange() {
|
||||||
|
val contentType = "text/plain".toMediaType()
|
||||||
|
val body: RequestBody = ".abcd".toByteArray().toRequestBody(contentType, 1, 3)
|
||||||
|
assertThat(body.contentType()).isEqualTo(contentType)
|
||||||
|
assertThat(body.contentLength()).isEqualTo(3)
|
||||||
|
assertThat(bodyToHex(body)).isEqualTo("616263")
|
||||||
|
assertThat(bodyToHex(body))
|
||||||
|
.overridingErrorMessage("Retransmit body")
|
||||||
|
.isEqualTo("616263")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun byteString() {
|
||||||
|
val contentType = "text/plain".toMediaType()
|
||||||
|
val body: RequestBody = "Hello".encodeUtf8().toRequestBody(contentType)
|
||||||
|
assertThat(body.contentType()).isEqualTo(contentType)
|
||||||
|
assertThat(body.contentLength()).isEqualTo(5)
|
||||||
|
assertThat(bodyToHex(body)).isEqualTo("48656c6c6f")
|
||||||
|
assertThat(bodyToHex(body))
|
||||||
|
.overridingErrorMessage("Retransmit body")
|
||||||
|
.isEqualTo("48656c6c6f")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun file() {
|
||||||
|
val file = File.createTempFile("RequestTest", "tmp")
|
||||||
|
val writer = FileWriter(file)
|
||||||
|
writer.write("abc")
|
||||||
|
writer.close()
|
||||||
|
val contentType = "text/plain".toMediaType()
|
||||||
|
val body: RequestBody = file.asRequestBody(contentType)
|
||||||
|
assertThat(body.contentType()).isEqualTo(contentType)
|
||||||
|
assertThat(body.contentLength()).isEqualTo(3)
|
||||||
|
assertThat(bodyToHex(body)).isEqualTo("616263")
|
||||||
|
assertThat(bodyToHex(body))
|
||||||
|
.overridingErrorMessage("Retransmit body")
|
||||||
|
.isEqualTo("616263")
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Common verbs used for apis such as GitHub, AWS, and Google Cloud. */
|
||||||
|
@Test
|
||||||
|
fun crudVerbs() {
|
||||||
|
val contentType = "application/json".toMediaType()
|
||||||
|
val body = "{}".toRequestBody(contentType)
|
||||||
|
|
||||||
|
val get = Request.Builder().url("http://localhost/api").get().build()
|
||||||
|
assertThat(get.method).isEqualTo("GET")
|
||||||
|
assertThat(get.body).isNull()
|
||||||
|
|
||||||
|
val head = Request.Builder().url("http://localhost/api").head().build()
|
||||||
|
assertThat(head.method).isEqualTo("HEAD")
|
||||||
|
assertThat(head.body).isNull()
|
||||||
|
|
||||||
|
val delete = Request.Builder().url("http://localhost/api").delete().build()
|
||||||
|
assertThat(delete.method).isEqualTo("DELETE")
|
||||||
|
assertThat(delete.body!!.contentLength()).isEqualTo(0L)
|
||||||
|
|
||||||
|
val post = Request.Builder().url("http://localhost/api").post(body).build()
|
||||||
|
assertThat(post.method).isEqualTo("POST")
|
||||||
|
assertThat(post.body).isEqualTo(body)
|
||||||
|
|
||||||
|
val put = Request.Builder().url("http://localhost/api").put(body).build()
|
||||||
|
assertThat(put.method).isEqualTo("PUT")
|
||||||
|
assertThat(put.body).isEqualTo(body)
|
||||||
|
|
||||||
|
val patch = Request.Builder().url("http://localhost/api").patch(body).build()
|
||||||
|
assertThat(patch.method).isEqualTo("PATCH")
|
||||||
|
assertThat(patch.body).isEqualTo(body)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun uninitializedURI() {
|
||||||
|
val request = Request.Builder().url("http://localhost/api").build()
|
||||||
|
assertThat(request.url.toUri()).isEqualTo(URI("http://localhost/api"))
|
||||||
|
assertThat(request.url).isEqualTo("http://localhost/api".toHttpUrl())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun newBuilderUrlResetsUrl() {
|
||||||
|
val requestWithoutCache = Request.Builder().url("http://localhost/api").build()
|
||||||
|
val builtRequestWithoutCache = requestWithoutCache.newBuilder().url("http://localhost/api/foo").build()
|
||||||
|
assertThat(builtRequestWithoutCache.url).isEqualTo(
|
||||||
|
"http://localhost/api/foo".toHttpUrl())
|
||||||
|
val requestWithCache = Request.Builder()
|
||||||
|
.url("http://localhost/api")
|
||||||
|
.build()
|
||||||
|
// cache url object
|
||||||
|
requestWithCache.url
|
||||||
|
val builtRequestWithCache = requestWithCache.newBuilder()
|
||||||
|
.url("http://localhost/api/foo")
|
||||||
|
.build()
|
||||||
|
assertThat(builtRequestWithCache.url)
|
||||||
|
.isEqualTo("http://localhost/api/foo".toHttpUrl())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun cacheControl() {
|
||||||
|
val request = Request.Builder()
|
||||||
|
.cacheControl(CacheControl.Builder().noCache().build())
|
||||||
|
.url("https://square.com")
|
||||||
|
.build()
|
||||||
|
assertThat(request.headers("Cache-Control")).containsExactly("no-cache")
|
||||||
|
assertThat(request.cacheControl.noCache).isTrue
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun emptyCacheControlClearsAllCacheControlHeaders() {
|
||||||
|
val request = Request.Builder()
|
||||||
|
.header("Cache-Control", "foo")
|
||||||
|
.cacheControl(CacheControl.Builder().build())
|
||||||
|
.url("https://square.com")
|
||||||
|
.build()
|
||||||
|
assertThat(request.headers("Cache-Control")).isEmpty()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun headerAcceptsPermittedCharacters() {
|
||||||
|
val builder = Request.Builder()
|
||||||
|
builder.header("AZab09~", "AZab09 ~")
|
||||||
|
builder.addHeader("AZab09~", "AZab09 ~")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun emptyNameForbidden() {
|
||||||
|
val builder = Request.Builder()
|
||||||
|
try {
|
||||||
|
builder.header("", "Value")
|
||||||
|
fail("")
|
||||||
|
} catch (expected: IllegalArgumentException) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
builder.addHeader("", "Value")
|
||||||
|
fail("")
|
||||||
|
} catch (expected: IllegalArgumentException) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun headerAllowsTabOnlyInValues() {
|
||||||
|
val builder = Request.Builder()
|
||||||
|
builder.header("key", "sample\tvalue")
|
||||||
|
try {
|
||||||
|
builder.header("sample\tkey", "value")
|
||||||
|
fail("")
|
||||||
|
} catch (expected: IllegalArgumentException) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun headerForbidsControlCharacters() {
|
||||||
|
assertForbiddenHeader("\u0000")
|
||||||
|
assertForbiddenHeader("\r")
|
||||||
|
assertForbiddenHeader("\n")
|
||||||
|
assertForbiddenHeader("\u001f")
|
||||||
|
assertForbiddenHeader("\u007f")
|
||||||
|
assertForbiddenHeader("\u0080")
|
||||||
|
assertForbiddenHeader("\ud83c\udf69")
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun assertForbiddenHeader(s: String) {
|
||||||
|
val builder = Request.Builder()
|
||||||
|
try {
|
||||||
|
builder.header(s, "Value")
|
||||||
|
fail("")
|
||||||
|
} catch (expected: IllegalArgumentException) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
builder.addHeader(s, "Value")
|
||||||
|
fail("")
|
||||||
|
} catch (expected: IllegalArgumentException) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
builder.header("Name", s)
|
||||||
|
fail("")
|
||||||
|
} catch (expected: IllegalArgumentException) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
builder.addHeader("Name", s)
|
||||||
|
fail("")
|
||||||
|
} catch (expected: IllegalArgumentException) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun noTag() {
|
||||||
|
val request = Request.Builder()
|
||||||
|
.url("https://square.com")
|
||||||
|
.build()
|
||||||
|
assertThat(request.tag()).isNull()
|
||||||
|
assertThat(request.tag(Any::class.java)).isNull()
|
||||||
|
assertThat(request.tag(UUID::class.java)).isNull()
|
||||||
|
assertThat(request.tag(String::class.java)).isNull()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun defaultTag() {
|
||||||
|
val tag = UUID.randomUUID()
|
||||||
|
val request = Request.Builder()
|
||||||
|
.url("https://square.com")
|
||||||
|
.tag(tag)
|
||||||
|
.build()
|
||||||
|
assertThat(request.tag()).isSameAs(tag)
|
||||||
|
assertThat(request.tag(Any::class.java)).isSameAs(tag)
|
||||||
|
assertThat(request.tag(UUID::class.java)).isNull()
|
||||||
|
assertThat(request.tag(String::class.java)).isNull()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun nullRemovesTag() {
|
||||||
|
val request = Request.Builder()
|
||||||
|
.url("https://square.com")
|
||||||
|
.tag("a")
|
||||||
|
.tag(null)
|
||||||
|
.build()
|
||||||
|
assertThat(request.tag()).isNull()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun removeAbsentTag() {
|
||||||
|
val request = Request.Builder()
|
||||||
|
.url("https://square.com")
|
||||||
|
.tag(null)
|
||||||
|
.build()
|
||||||
|
assertThat(request.tag()).isNull()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun objectTag() {
|
||||||
|
val tag = UUID.randomUUID()
|
||||||
|
val request = Request.Builder()
|
||||||
|
.url("https://square.com")
|
||||||
|
.tag(Any::class.java, tag)
|
||||||
|
.build()
|
||||||
|
assertThat(request.tag()).isSameAs(tag)
|
||||||
|
assertThat(request.tag(Any::class.java)).isSameAs(tag)
|
||||||
|
assertThat(request.tag(UUID::class.java)).isNull()
|
||||||
|
assertThat(request.tag(String::class.java)).isNull()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun typedTag() {
|
||||||
|
val uuidTag = UUID.randomUUID()
|
||||||
|
val request = Request.Builder()
|
||||||
|
.url("https://square.com")
|
||||||
|
.tag(UUID::class.java, uuidTag)
|
||||||
|
.build()
|
||||||
|
assertThat(request.tag()).isNull()
|
||||||
|
assertThat(request.tag(Any::class.java)).isNull()
|
||||||
|
assertThat(request.tag(UUID::class.java)).isSameAs(uuidTag)
|
||||||
|
assertThat(request.tag(String::class.java)).isNull()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun replaceOnlyTag() {
|
||||||
|
val uuidTag1 = UUID.randomUUID()
|
||||||
|
val uuidTag2 = UUID.randomUUID()
|
||||||
|
val request = Request.Builder()
|
||||||
|
.url("https://square.com")
|
||||||
|
.tag(UUID::class.java, uuidTag1)
|
||||||
|
.tag(UUID::class.java, uuidTag2)
|
||||||
|
.build()
|
||||||
|
assertThat(request.tag(UUID::class.java)).isSameAs(uuidTag2)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun multipleTags() {
|
||||||
|
val uuidTag = UUID.randomUUID()
|
||||||
|
val stringTag = "dilophosaurus"
|
||||||
|
val longTag = 20170815L as Long?
|
||||||
|
val objectTag = Any()
|
||||||
|
val request = Request.Builder()
|
||||||
|
.url("https://square.com")
|
||||||
|
.tag(Any::class.java, objectTag)
|
||||||
|
.tag(UUID::class.java, uuidTag)
|
||||||
|
.tag(String::class.java, stringTag)
|
||||||
|
.tag(Long::class.javaObjectType, longTag)
|
||||||
|
.build()
|
||||||
|
assertThat(request.tag()).isSameAs(objectTag)
|
||||||
|
assertThat(request.tag(Any::class.java)).isSameAs(objectTag)
|
||||||
|
assertThat(request.tag(UUID::class.java)).isSameAs(uuidTag)
|
||||||
|
assertThat(request.tag(String::class.java)).isSameAs(stringTag)
|
||||||
|
assertThat(request.tag(Long::class.javaObjectType)).isSameAs(longTag)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Confirm that we don't accidentally share the backing map between objects. */
|
||||||
|
@Test
|
||||||
|
fun tagsAreImmutable() {
|
||||||
|
val builder = Request.Builder()
|
||||||
|
.url("https://square.com")
|
||||||
|
val requestA = builder.tag(String::class.java, "a").build()
|
||||||
|
val requestB = builder.tag(String::class.java, "b").build()
|
||||||
|
val requestC = requestA.newBuilder().tag(String::class.java, "c").build()
|
||||||
|
assertThat(requestA.tag(String::class.java)).isSameAs("a")
|
||||||
|
assertThat(requestB.tag(String::class.java)).isSameAs("b")
|
||||||
|
assertThat(requestC.tag(String::class.java)).isSameAs("c")
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun bodyToHex(body: RequestBody): String {
|
||||||
|
val buffer = Buffer()
|
||||||
|
body.writeTo(buffer)
|
||||||
|
return buffer.readByteString().hex()
|
||||||
|
}
|
||||||
|
}
|
@ -73,10 +73,10 @@ class ServerTruncatesRequestTest(
|
|||||||
.apply { this.http2ErrorCode = ErrorCode.NO_ERROR.httpCode })
|
.apply { this.http2ErrorCode = ErrorCode.NO_ERROR.httpCode })
|
||||||
|
|
||||||
val call = client.newCall(
|
val call = client.newCall(
|
||||||
Request.Builder()
|
Request(
|
||||||
.url(server.url("/"))
|
url = server.url("/"),
|
||||||
.post(SlowRequestBody)
|
body = SlowRequestBody,
|
||||||
.build()
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
call.execute().use { response ->
|
call.execute().use { response ->
|
||||||
@ -129,10 +129,10 @@ class ServerTruncatesRequestTest(
|
|||||||
val requestBody = AsyncRequestBody()
|
val requestBody = AsyncRequestBody()
|
||||||
|
|
||||||
val call = client.newCall(
|
val call = client.newCall(
|
||||||
Request.Builder()
|
Request(
|
||||||
.url(server.url("/"))
|
url = server.url("/"),
|
||||||
.post(requestBody)
|
body = requestBody,
|
||||||
.build()
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
call.execute().use { response ->
|
call.execute().use { response ->
|
||||||
@ -181,10 +181,10 @@ class ServerTruncatesRequestTest(
|
|||||||
server.enqueue(mockResponse)
|
server.enqueue(mockResponse)
|
||||||
|
|
||||||
val call = client.newCall(
|
val call = client.newCall(
|
||||||
Request.Builder()
|
Request(
|
||||||
.url(server.url("/"))
|
url = server.url("/"),
|
||||||
.post(SlowRequestBody)
|
body = SlowRequestBody,
|
||||||
.build()
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
call.execute().use { response ->
|
call.execute().use { response ->
|
||||||
@ -216,11 +216,7 @@ class ServerTruncatesRequestTest(
|
|||||||
}
|
}
|
||||||
val localClient = client.newBuilder().eventListener(eventListener).build()
|
val localClient = client.newBuilder().eventListener(eventListener).build()
|
||||||
|
|
||||||
val call1 = localClient.newCall(
|
val call1 = localClient.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
|
|
||||||
call1.execute().use { response ->
|
call1.execute().use { response ->
|
||||||
assertThat(response.body.string()).isEqualTo("Req1")
|
assertThat(response.body.string()).isEqualTo("Req1")
|
||||||
@ -230,11 +226,7 @@ class ServerTruncatesRequestTest(
|
|||||||
|
|
||||||
eventListener.closed = true
|
eventListener.closed = true
|
||||||
|
|
||||||
val call2 = localClient.newCall(
|
val call2 = localClient.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
|
|
||||||
assertThrows<IOException>("fake socket failure") {
|
assertThrows<IOException>("fake socket failure") {
|
||||||
call2.execute()
|
call2.execute()
|
||||||
@ -253,10 +245,10 @@ class ServerTruncatesRequestTest(
|
|||||||
}
|
}
|
||||||
|
|
||||||
val callA = client.newCall(
|
val callA = client.newCall(
|
||||||
Request.Builder()
|
Request(
|
||||||
.url(server.url("/"))
|
url = server.url("/"),
|
||||||
.post(requestBody)
|
body = requestBody,
|
||||||
.build()
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -270,11 +262,7 @@ class ServerTruncatesRequestTest(
|
|||||||
|
|
||||||
// Confirm that the connection pool was not corrupted by making another call. This doesn't use
|
// Confirm that the connection pool was not corrupted by making another call. This doesn't use
|
||||||
// makeSimpleCall() because it uses the MockResponse enqueued above.
|
// makeSimpleCall() because it uses the MockResponse enqueued above.
|
||||||
val callB = client.newCall(
|
val callB = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
callB.execute().use { response ->
|
callB.execute().use { response ->
|
||||||
assertThat(response.body.string()).isEqualTo("abc")
|
assertThat(response.body.string()).isEqualTo("abc")
|
||||||
}
|
}
|
||||||
@ -282,11 +270,7 @@ class ServerTruncatesRequestTest(
|
|||||||
|
|
||||||
private fun makeSimpleCall() {
|
private fun makeSimpleCall() {
|
||||||
server.enqueue(MockResponse().setBody("healthy"))
|
server.enqueue(MockResponse().setBody("healthy"))
|
||||||
val callB = client.newCall(
|
val callB = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
callB.execute().use { response ->
|
callB.execute().use { response ->
|
||||||
assertThat(response.body.string()).isEqualTo("healthy")
|
assertThat(response.body.string()).isEqualTo("healthy")
|
||||||
}
|
}
|
||||||
|
@ -95,7 +95,7 @@ class SessionReuseTest(
|
|||||||
server.enqueue(MockResponse().setBody("abc1"))
|
server.enqueue(MockResponse().setBody("abc1"))
|
||||||
server.enqueue(MockResponse().setBody("abc2"))
|
server.enqueue(MockResponse().setBody("abc2"))
|
||||||
|
|
||||||
val request = Request.Builder().url(server.url("/")).build()
|
val request = Request(server.url("/"))
|
||||||
|
|
||||||
client.newCall(request).execute().use { response ->
|
client.newCall(request).execute().use { response ->
|
||||||
assertEquals(200, response.code)
|
assertEquals(200, response.code)
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -17,6 +17,7 @@ package okhttp3.internal.connection
|
|||||||
|
|
||||||
import okhttp3.ConnectionPool
|
import okhttp3.ConnectionPool
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
|
import okhttp3.Request
|
||||||
import okhttp3.TestUtil.awaitGarbageCollection
|
import okhttp3.TestUtil.awaitGarbageCollection
|
||||||
import okhttp3.TestValueFactory
|
import okhttp3.TestValueFactory
|
||||||
import okhttp3.internal.concurrent.TaskRunner
|
import okhttp3.internal.concurrent.TaskRunner
|
||||||
@ -76,7 +77,7 @@ class ConnectionPoolTest {
|
|||||||
val client = OkHttpClient.Builder()
|
val client = OkHttpClient.Builder()
|
||||||
.connectionPool(poolApi)
|
.connectionPool(poolApi)
|
||||||
.build()
|
.build()
|
||||||
val call = client.newCall(factory.newRequest(addressA)) as RealCall
|
val call = client.newCall(Request(addressA.url)) as RealCall
|
||||||
call.enterNetworkInterceptorExchange(call.request(), true, factory.newChain(call))
|
call.enterNetworkInterceptorExchange(call.request(), true, factory.newChain(call))
|
||||||
synchronized(c1) { call.acquireConnectionNoEvents(c1) }
|
synchronized(c1) { call.acquireConnectionNoEvents(c1) }
|
||||||
|
|
||||||
@ -188,7 +189,7 @@ class ConnectionPoolTest {
|
|||||||
val client = OkHttpClient.Builder()
|
val client = OkHttpClient.Builder()
|
||||||
.connectionPool(pool)
|
.connectionPool(pool)
|
||||||
.build()
|
.build()
|
||||||
val call = client.newCall(factory.newRequest(connection.route().address)) as RealCall
|
val call = client.newCall(Request(connection.route().address.url)) as RealCall
|
||||||
call.enterNetworkInterceptorExchange(call.request(), true, factory.newChain(call))
|
call.enterNetworkInterceptorExchange(call.request(), true, factory.newChain(call))
|
||||||
synchronized(connection) { call.acquireConnectionNoEvents(connection) }
|
synchronized(connection) { call.acquireConnectionNoEvents(connection) }
|
||||||
}
|
}
|
||||||
|
@ -145,9 +145,9 @@ class CancelTest {
|
|||||||
setUp(mode)
|
setUp(mode)
|
||||||
server.enqueue(MockResponse())
|
server.enqueue(MockResponse())
|
||||||
val call = client.newCall(
|
val call = client.newCall(
|
||||||
Request.Builder()
|
Request(
|
||||||
.url(server.url("/"))
|
url = server.url("/"),
|
||||||
.post(object : RequestBody() {
|
body = object : RequestBody() {
|
||||||
override fun contentType(): MediaType? {
|
override fun contentType(): MediaType? {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
@ -162,8 +162,8 @@ class CancelTest {
|
|||||||
}
|
}
|
||||||
fail("Expected connection to be closed")
|
fail("Expected connection to be closed")
|
||||||
}
|
}
|
||||||
})
|
},
|
||||||
.build()
|
)
|
||||||
)
|
)
|
||||||
cancelLater(call, 500)
|
cancelLater(call, 500)
|
||||||
try {
|
try {
|
||||||
@ -187,11 +187,7 @@ class CancelTest {
|
|||||||
)
|
)
|
||||||
.throttleBody(64 * 1024, 125, MILLISECONDS)
|
.throttleBody(64 * 1024, 125, MILLISECONDS)
|
||||||
) // 500 Kbps
|
) // 500 Kbps
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
cancelLater(call, 500)
|
cancelLater(call, 500)
|
||||||
val responseBody = response.body.byteStream()
|
val responseBody = response.body.byteStream()
|
||||||
@ -254,7 +250,7 @@ class CancelTest {
|
|||||||
assertThat(events).contains("ResponseFailed")
|
assertThat(events).contains("ResponseFailed")
|
||||||
assertThat(events).contains("ConnectionReleased")
|
assertThat(events).contains("ConnectionReleased")
|
||||||
|
|
||||||
val call2 = client.newCall(Request.Builder().url(server.url("/")).build())
|
val call2 = client.newCall(Request(server.url("/")))
|
||||||
call2.execute().use {
|
call2.execute().use {
|
||||||
assertEquals(".", it.body.string())
|
assertEquals(".", it.body.string())
|
||||||
}
|
}
|
||||||
|
@ -45,6 +45,7 @@ import okhttp3.Cookie
|
|||||||
import okhttp3.Credentials.basic
|
import okhttp3.Credentials.basic
|
||||||
import okhttp3.EventListener
|
import okhttp3.EventListener
|
||||||
import okhttp3.Headers.Companion.headersOf
|
import okhttp3.Headers.Companion.headersOf
|
||||||
|
import okhttp3.HttpUrl.Companion.toHttpUrl
|
||||||
import okhttp3.Interceptor
|
import okhttp3.Interceptor
|
||||||
import okhttp3.MediaType
|
import okhttp3.MediaType
|
||||||
import okhttp3.MediaType.Companion.toMediaType
|
import okhttp3.MediaType.Companion.toMediaType
|
||||||
@ -160,11 +161,7 @@ class HttpOverHttp2Test {
|
|||||||
.setBody("ABCDE")
|
.setBody("ABCDE")
|
||||||
.setStatus("HTTP/1.1 200 Sweet")
|
.setStatus("HTTP/1.1 200 Sweet")
|
||||||
)
|
)
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/foo")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/foo"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.body.string()).isEqualTo("ABCDE")
|
assertThat(response.body.string()).isEqualTo("ABCDE")
|
||||||
assertThat(response.code).isEqualTo(200)
|
assertThat(response.code).isEqualTo(200)
|
||||||
@ -183,11 +180,7 @@ class HttpOverHttp2Test {
|
|||||||
responseWithoutBody.status = "HTTP/1.1 204"
|
responseWithoutBody.status = "HTTP/1.1 204"
|
||||||
responseWithoutBody.removeHeader("Content-Length")
|
responseWithoutBody.removeHeader("Content-Length")
|
||||||
server.enqueue(responseWithoutBody)
|
server.enqueue(responseWithoutBody)
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/foo")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/foo"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
|
|
||||||
// Body contains nothing.
|
// Body contains nothing.
|
||||||
@ -229,11 +222,7 @@ class HttpOverHttp2Test {
|
|||||||
fun emptyResponse(protocol: Protocol, mockWebServer: MockWebServer) {
|
fun emptyResponse(protocol: Protocol, mockWebServer: MockWebServer) {
|
||||||
setUp(protocol, mockWebServer)
|
setUp(protocol, mockWebServer)
|
||||||
server.enqueue(MockResponse())
|
server.enqueue(MockResponse())
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/foo")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/foo"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.body.byteStream().read()).isEqualTo(-1)
|
assertThat(response.body.byteStream().read()).isEqualTo(-1)
|
||||||
response.body.close()
|
response.body.close()
|
||||||
@ -245,16 +234,16 @@ class HttpOverHttp2Test {
|
|||||||
val postBytes = "FGHIJ".toByteArray()
|
val postBytes = "FGHIJ".toByteArray()
|
||||||
server.enqueue(MockResponse().setBody("ABCDE"))
|
server.enqueue(MockResponse().setBody("ABCDE"))
|
||||||
val call = client.newCall(
|
val call = client.newCall(
|
||||||
Request.Builder()
|
Request(
|
||||||
.url(server.url("/foo"))
|
url = server.url("/foo"),
|
||||||
.post(object : RequestBody() {
|
body = object : RequestBody() {
|
||||||
override fun contentType(): MediaType = "text/plain; charset=utf-8".toMediaType()
|
override fun contentType(): MediaType = "text/plain; charset=utf-8".toMediaType()
|
||||||
|
|
||||||
override fun writeTo(sink: BufferedSink) {
|
override fun writeTo(sink: BufferedSink) {
|
||||||
sink.write(postBytes)
|
sink.write(postBytes)
|
||||||
}
|
}
|
||||||
})
|
},
|
||||||
.build()
|
)
|
||||||
)
|
)
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.body.string()).isEqualTo("ABCDE")
|
assertThat(response.body.string()).isEqualTo("ABCDE")
|
||||||
@ -270,9 +259,9 @@ class HttpOverHttp2Test {
|
|||||||
val postBytes = "FGHIJ".toByteArray()
|
val postBytes = "FGHIJ".toByteArray()
|
||||||
server.enqueue(MockResponse().setBody("ABCDE"))
|
server.enqueue(MockResponse().setBody("ABCDE"))
|
||||||
val call = client.newCall(
|
val call = client.newCall(
|
||||||
Request.Builder()
|
Request(
|
||||||
.url(server.url("/foo"))
|
url = server.url("/foo"),
|
||||||
.post(object : RequestBody() {
|
body = object : RequestBody() {
|
||||||
override fun contentType(): MediaType = "text/plain; charset=utf-8".toMediaType()
|
override fun contentType(): MediaType = "text/plain; charset=utf-8".toMediaType()
|
||||||
|
|
||||||
override fun contentLength(): Long = postBytes.size.toLong()
|
override fun contentLength(): Long = postBytes.size.toLong()
|
||||||
@ -280,8 +269,8 @@ class HttpOverHttp2Test {
|
|||||||
override fun writeTo(sink: BufferedSink) {
|
override fun writeTo(sink: BufferedSink) {
|
||||||
sink.write(postBytes)
|
sink.write(postBytes)
|
||||||
}
|
}
|
||||||
})
|
},
|
||||||
.build()
|
)
|
||||||
)
|
)
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.body.string()).isEqualTo("ABCDE")
|
assertThat(response.body.string()).isEqualTo("ABCDE")
|
||||||
@ -301,9 +290,9 @@ class HttpOverHttp2Test {
|
|||||||
val postBytes = "FGHIJ".toByteArray()
|
val postBytes = "FGHIJ".toByteArray()
|
||||||
server.enqueue(MockResponse().setBody("ABCDE"))
|
server.enqueue(MockResponse().setBody("ABCDE"))
|
||||||
val call = client.newCall(
|
val call = client.newCall(
|
||||||
Request.Builder()
|
Request(
|
||||||
.url(server.url("/foo"))
|
url = server.url("/foo"),
|
||||||
.post(object : RequestBody() {
|
body = object : RequestBody() {
|
||||||
override fun contentType(): MediaType = "text/plain; charset=utf-8".toMediaType()
|
override fun contentType(): MediaType = "text/plain; charset=utf-8".toMediaType()
|
||||||
|
|
||||||
override fun contentLength(): Long = postBytes.size.toLong()
|
override fun contentLength(): Long = postBytes.size.toLong()
|
||||||
@ -313,8 +302,8 @@ class HttpOverHttp2Test {
|
|||||||
sink.flush() // Http2Connection.writeData subject to write window
|
sink.flush() // Http2Connection.writeData subject to write window
|
||||||
sink.close() // Http2Connection.writeData empty frame
|
sink.close() // Http2Connection.writeData empty frame
|
||||||
}
|
}
|
||||||
})
|
},
|
||||||
.build()
|
)
|
||||||
)
|
)
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.body.string()).isEqualTo("ABCDE")
|
assertThat(response.body.string()).isEqualTo("ABCDE")
|
||||||
@ -330,16 +319,8 @@ class HttpOverHttp2Test {
|
|||||||
setUp(protocol, mockWebServer)
|
setUp(protocol, mockWebServer)
|
||||||
server.enqueue(MockResponse().setBody("ABCDEF"))
|
server.enqueue(MockResponse().setBody("ABCDEF"))
|
||||||
server.enqueue(MockResponse().setBody("GHIJKL"))
|
server.enqueue(MockResponse().setBody("GHIJKL"))
|
||||||
val call1 = client.newCall(
|
val call1 = client.newCall(Request(server.url("/r1")))
|
||||||
Request.Builder()
|
val call2 = client.newCall(Request(server.url("/r1")))
|
||||||
.url(server.url("/r1"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val call2 = client.newCall(
|
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/r1"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response1 = call1.execute()
|
val response1 = call1.execute()
|
||||||
val response2 = call2.execute()
|
val response2 = call2.execute()
|
||||||
assertThat(response1.body.source().readUtf8(3)).isEqualTo("ABC")
|
assertThat(response1.body.source().readUtf8(3)).isEqualTo("ABC")
|
||||||
@ -363,11 +344,7 @@ class HttpOverHttp2Test {
|
|||||||
MockResponse()
|
MockResponse()
|
||||||
.setBody("abc")
|
.setBody("abc")
|
||||||
)
|
)
|
||||||
val call1 = client.newCall(
|
val call1 = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response1 = call1.execute()
|
val response1 = call1.execute()
|
||||||
waitForDataFrames(Http2Connection.OKHTTP_CLIENT_WINDOW_SIZE)
|
waitForDataFrames(Http2Connection.OKHTTP_CLIENT_WINDOW_SIZE)
|
||||||
|
|
||||||
@ -377,11 +354,7 @@ class HttpOverHttp2Test {
|
|||||||
assertThat(response1.body.source().discard(1, TimeUnit.SECONDS))
|
assertThat(response1.body.source().discard(1, TimeUnit.SECONDS))
|
||||||
.overridingErrorMessage("Call should not have completed successfully.")
|
.overridingErrorMessage("Call should not have completed successfully.")
|
||||||
.isFalse
|
.isFalse
|
||||||
val call2 = client.newCall(
|
val call2 = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response2 = call2.execute()
|
val response2 = call2.execute()
|
||||||
assertThat(response2.body.string()).isEqualTo("abc")
|
assertThat(response2.body.string()).isEqualTo("abc")
|
||||||
}
|
}
|
||||||
@ -414,11 +387,7 @@ class HttpOverHttp2Test {
|
|||||||
MockResponse()
|
MockResponse()
|
||||||
.setBody("XXX")
|
.setBody("XXX")
|
||||||
)
|
)
|
||||||
val call1 = client.newCall(
|
val call1 = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response1 = call1.execute()
|
val response1 = call1.execute()
|
||||||
waitForDataFrames(Http2Connection.OKHTTP_CLIENT_WINDOW_SIZE)
|
waitForDataFrames(Http2Connection.OKHTTP_CLIENT_WINDOW_SIZE)
|
||||||
|
|
||||||
@ -426,11 +395,7 @@ class HttpOverHttp2Test {
|
|||||||
// the connection flow-control window.
|
// the connection flow-control window.
|
||||||
call1.cancel()
|
call1.cancel()
|
||||||
response1.close()
|
response1.close()
|
||||||
val call2 = client.newCall(
|
val call2 = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response2 = call2.execute()
|
val response2 = call2.execute()
|
||||||
assertThat(response2.body.string()).isEqualTo("abc")
|
assertThat(response2.body.string()).isEqualTo("abc")
|
||||||
}
|
}
|
||||||
@ -448,11 +413,7 @@ class HttpOverHttp2Test {
|
|||||||
MockResponse()
|
MockResponse()
|
||||||
.setBody("abc")
|
.setBody("abc")
|
||||||
)
|
)
|
||||||
val call1 = client.newCall(
|
val call1 = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response1 = call1.execute()
|
val response1 = call1.execute()
|
||||||
waitForDataFrames(Http2Connection.OKHTTP_CLIENT_WINDOW_SIZE)
|
waitForDataFrames(Http2Connection.OKHTTP_CLIENT_WINDOW_SIZE)
|
||||||
assertThat(response1.body.contentLength()).isEqualTo(
|
assertThat(response1.body.contentLength()).isEqualTo(
|
||||||
@ -463,11 +424,7 @@ class HttpOverHttp2Test {
|
|||||||
|
|
||||||
// Make a second call that should transmit the response headers. The response body won't be
|
// Make a second call that should transmit the response headers. The response body won't be
|
||||||
// transmitted until the flow-control window is updated from the first request.
|
// transmitted until the flow-control window is updated from the first request.
|
||||||
val call2 = client.newCall(
|
val call2 = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response2 = call2.execute()
|
val response2 = call2.execute()
|
||||||
assertThat(response2.code).isEqualTo(200)
|
assertThat(response2.code).isEqualTo(200)
|
||||||
|
|
||||||
@ -501,11 +458,7 @@ class HttpOverHttp2Test {
|
|||||||
.addHeader("Content-Encoding: gzip")
|
.addHeader("Content-Encoding: gzip")
|
||||||
.setBody(gzip("ABCABCABC"))
|
.setBody(gzip("ABCABCABC"))
|
||||||
)
|
)
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/r1")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/r1"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.body.string()).isEqualTo("ABCABCABC")
|
assertThat(response.body.string()).isEqualTo("ABCABCABC")
|
||||||
}
|
}
|
||||||
@ -527,11 +480,7 @@ class HttpOverHttp2Test {
|
|||||||
client = client.newBuilder()
|
client = client.newBuilder()
|
||||||
.authenticator(RecordingOkAuthenticator(credential, "Basic"))
|
.authenticator(RecordingOkAuthenticator(credential, "Basic"))
|
||||||
.build()
|
.build()
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.body.string()).isEqualTo("Successful auth!")
|
assertThat(response.body.string()).isEqualTo("Successful auth!")
|
||||||
val denied = server.takeRequest()
|
val denied = server.takeRequest()
|
||||||
@ -550,11 +499,7 @@ class HttpOverHttp2Test {
|
|||||||
.setBody("This page has moved!")
|
.setBody("This page has moved!")
|
||||||
)
|
)
|
||||||
server.enqueue(MockResponse().setBody("This is the new location!"))
|
server.enqueue(MockResponse().setBody("This is the new location!"))
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.body.string()).isEqualTo("This is the new location!")
|
assertThat(response.body.string()).isEqualTo("This is the new location!")
|
||||||
val request1 = server.takeRequest()
|
val request1 = server.takeRequest()
|
||||||
@ -567,11 +512,7 @@ class HttpOverHttp2Test {
|
|||||||
fun readAfterLastByte(protocol: Protocol, mockWebServer: MockWebServer) {
|
fun readAfterLastByte(protocol: Protocol, mockWebServer: MockWebServer) {
|
||||||
setUp(protocol, mockWebServer)
|
setUp(protocol, mockWebServer)
|
||||||
server.enqueue(MockResponse().setBody("ABC"))
|
server.enqueue(MockResponse().setBody("ABC"))
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
val inputStream = response.body.byteStream()
|
val inputStream = response.body.byteStream()
|
||||||
assertThat(inputStream.read()).isEqualTo('A'.code)
|
assertThat(inputStream.read()).isEqualTo('A'.code)
|
||||||
@ -592,11 +533,7 @@ class HttpOverHttp2Test {
|
|||||||
.build()
|
.build()
|
||||||
|
|
||||||
// Make a call expecting a timeout reading the response headers.
|
// Make a call expecting a timeout reading the response headers.
|
||||||
val call1 = client.newCall(
|
val call1 = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
try {
|
try {
|
||||||
call1.execute()
|
call1.execute()
|
||||||
fail<Any?>("Should have timed out!")
|
fail<Any?>("Should have timed out!")
|
||||||
@ -605,11 +542,7 @@ class HttpOverHttp2Test {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Confirm that a subsequent request on the same connection is not impacted.
|
// Confirm that a subsequent request on the same connection is not impacted.
|
||||||
val call2 = client.newCall(
|
val call2 = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response2 = call2.execute()
|
val response2 = call2.execute()
|
||||||
assertThat(response2.body.string()).isEqualTo("A")
|
assertThat(response2.body.string()).isEqualTo("A")
|
||||||
|
|
||||||
@ -635,11 +568,7 @@ class HttpOverHttp2Test {
|
|||||||
client = client.newBuilder()
|
client = client.newBuilder()
|
||||||
.readTimeout(Duration.ofSeconds(2))
|
.readTimeout(Duration.ofSeconds(2))
|
||||||
.build()
|
.build()
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.body.string()).isEqualTo(String(body))
|
assertThat(response.body.string()).isEqualTo(String(body))
|
||||||
}
|
}
|
||||||
@ -668,11 +597,7 @@ class HttpOverHttp2Test {
|
|||||||
.build()
|
.build()
|
||||||
|
|
||||||
// Make a call expecting a timeout reading the response body.
|
// Make a call expecting a timeout reading the response body.
|
||||||
val call1 = client.newCall(
|
val call1 = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response1 = call1.execute()
|
val response1 = call1.execute()
|
||||||
try {
|
try {
|
||||||
response1.body.string()
|
response1.body.string()
|
||||||
@ -682,11 +607,7 @@ class HttpOverHttp2Test {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Confirm that a subsequent request on the same connection is not impacted.
|
// Confirm that a subsequent request on the same connection is not impacted.
|
||||||
val call2 = client.newCall(
|
val call2 = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response2 = call2.execute()
|
val response2 = call2.execute()
|
||||||
assertThat(response2.body.string()).isEqualTo(body)
|
assertThat(response2.body.string()).isEqualTo(body)
|
||||||
|
|
||||||
@ -745,28 +666,16 @@ class HttpOverHttp2Test {
|
|||||||
.addHeader("cache-control: max-age=60")
|
.addHeader("cache-control: max-age=60")
|
||||||
.setBody("A")
|
.setBody("A")
|
||||||
)
|
)
|
||||||
val call1 = client.newCall(
|
val call1 = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response1 = call1.execute()
|
val response1 = call1.execute()
|
||||||
assertThat(response1.body.string()).isEqualTo("A")
|
assertThat(response1.body.string()).isEqualTo("A")
|
||||||
assertThat(cache.requestCount()).isEqualTo(1)
|
assertThat(cache.requestCount()).isEqualTo(1)
|
||||||
assertThat(cache.networkCount()).isEqualTo(1)
|
assertThat(cache.networkCount()).isEqualTo(1)
|
||||||
assertThat(cache.hitCount()).isEqualTo(0)
|
assertThat(cache.hitCount()).isEqualTo(0)
|
||||||
val call2 = client.newCall(
|
val call2 = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response2 = call2.execute()
|
val response2 = call2.execute()
|
||||||
assertThat(response2.body.string()).isEqualTo("A")
|
assertThat(response2.body.string()).isEqualTo("A")
|
||||||
val call3 = client.newCall(
|
val call3 = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response3 = call3.execute()
|
val response3 = call3.execute()
|
||||||
assertThat(response3.body.string()).isEqualTo("A")
|
assertThat(response3.body.string()).isEqualTo("A")
|
||||||
assertThat(cache.requestCount()).isEqualTo(3)
|
assertThat(cache.requestCount()).isEqualTo(3)
|
||||||
@ -789,21 +698,13 @@ class HttpOverHttp2Test {
|
|||||||
MockResponse()
|
MockResponse()
|
||||||
.setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED)
|
.setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED)
|
||||||
)
|
)
|
||||||
val call1 = client.newCall(
|
val call1 = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response1 = call1.execute()
|
val response1 = call1.execute()
|
||||||
assertThat(response1.body.string()).isEqualTo("A")
|
assertThat(response1.body.string()).isEqualTo("A")
|
||||||
assertThat(cache.requestCount()).isEqualTo(1)
|
assertThat(cache.requestCount()).isEqualTo(1)
|
||||||
assertThat(cache.networkCount()).isEqualTo(1)
|
assertThat(cache.networkCount()).isEqualTo(1)
|
||||||
assertThat(cache.hitCount()).isEqualTo(0)
|
assertThat(cache.hitCount()).isEqualTo(0)
|
||||||
val call2 = client.newCall(
|
val call2 = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response2 = call2.execute()
|
val response2 = call2.execute()
|
||||||
assertThat(response2.body.string()).isEqualTo("A")
|
assertThat(response2.body.string()).isEqualTo("A")
|
||||||
assertThat(cache.requestCount()).isEqualTo(2)
|
assertThat(cache.requestCount()).isEqualTo(2)
|
||||||
@ -827,19 +728,11 @@ class HttpOverHttp2Test {
|
|||||||
.addHeader("cache-control: max-age=60")
|
.addHeader("cache-control: max-age=60")
|
||||||
.setBody("EFGH")
|
.setBody("EFGH")
|
||||||
)
|
)
|
||||||
val call1 = client.newCall(
|
val call1 = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response1 = call1.execute()
|
val response1 = call1.execute()
|
||||||
assertThat(response1.body.source().readUtf8(2)).isEqualTo("AB")
|
assertThat(response1.body.source().readUtf8(2)).isEqualTo("AB")
|
||||||
response1.body.close()
|
response1.body.close()
|
||||||
val call2 = client.newCall(
|
val call2 = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response2 = call2.execute()
|
val response2 = call2.execute()
|
||||||
assertThat(response2.body.source().readUtf8()).isEqualTo("ABCD")
|
assertThat(response2.body.source().readUtf8()).isEqualTo("ABCD")
|
||||||
response2.body.close()
|
response2.body.close()
|
||||||
@ -859,11 +752,7 @@ class HttpOverHttp2Test {
|
|||||||
.cookieJar(cookieJar)
|
.cookieJar(cookieJar)
|
||||||
.build()
|
.build()
|
||||||
server.enqueue(MockResponse())
|
server.enqueue(MockResponse())
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.body.string()).isEqualTo("")
|
assertThat(response.body.string()).isEqualTo("")
|
||||||
val request = server.takeRequest()
|
val request = server.takeRequest()
|
||||||
@ -881,11 +770,7 @@ class HttpOverHttp2Test {
|
|||||||
MockResponse()
|
MockResponse()
|
||||||
.addHeader("set-cookie: a=b")
|
.addHeader("set-cookie: a=b")
|
||||||
)
|
)
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.body.string()).isEqualTo("")
|
assertThat(response.body.string()).isEqualTo("")
|
||||||
cookieJar.assertResponseCookies("a=b; path=/")
|
cookieJar.assertResponseCookies("a=b; path=/")
|
||||||
@ -904,21 +789,13 @@ class HttpOverHttp2Test {
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Disconnect before the stream is created. A connection is still established!
|
// Disconnect before the stream is created. A connection is still established!
|
||||||
val call1 = client.newCall(
|
val call1 = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call1.execute()
|
val response = call1.execute()
|
||||||
call1.cancel()
|
call1.cancel()
|
||||||
|
|
||||||
// That connection is pooled, and it works.
|
// That connection is pooled, and it works.
|
||||||
assertThat(client.connectionPool.connectionCount()).isEqualTo(1)
|
assertThat(client.connectionPool.connectionCount()).isEqualTo(1)
|
||||||
val call2 = client.newCall(
|
val call2 = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response2 = call2.execute()
|
val response2 = call2.execute()
|
||||||
assertThat(response2.body.string()).isEqualTo("def")
|
assertThat(response2.body.string()).isEqualTo("def")
|
||||||
assertThat(server.takeRequest().sequenceNumber).isEqualTo(0)
|
assertThat(server.takeRequest().sequenceNumber).isEqualTo(0)
|
||||||
@ -941,11 +818,7 @@ class HttpOverHttp2Test {
|
|||||||
MockResponse()
|
MockResponse()
|
||||||
.setBody("abc")
|
.setBody("abc")
|
||||||
)
|
)
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
try {
|
try {
|
||||||
call.execute()
|
call.execute()
|
||||||
fail<Any?>()
|
fail<Any?>()
|
||||||
@ -972,9 +845,7 @@ class HttpOverHttp2Test {
|
|||||||
.setBody("abc")
|
.setBody("abc")
|
||||||
)
|
)
|
||||||
|
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
val response = client.newCall(request).execute()
|
val response = client.newCall(request).execute()
|
||||||
assertThat(response.body.string()).isEqualTo("abc")
|
assertThat(response.body.string()).isEqualTo("abc")
|
||||||
assertThat(server.takeRequest().sequenceNumber).isEqualTo(0)
|
assertThat(server.takeRequest().sequenceNumber).isEqualTo(0)
|
||||||
@ -1009,9 +880,7 @@ class HttpOverHttp2Test {
|
|||||||
.setHttp2ErrorCode(ErrorCode.REFUSED_STREAM.httpCode)
|
.setHttp2ErrorCode(ErrorCode.REFUSED_STREAM.httpCode)
|
||||||
)
|
)
|
||||||
|
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
try {
|
try {
|
||||||
client.newCall(request).execute()
|
client.newCall(request).execute()
|
||||||
fail<Any?>()
|
fail<Any?>()
|
||||||
@ -1037,9 +906,7 @@ class HttpOverHttp2Test {
|
|||||||
MockResponse()
|
MockResponse()
|
||||||
.setBody("abc")
|
.setBody("abc")
|
||||||
)
|
)
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
|
|
||||||
// First call fails because it only has one route.
|
// First call fails because it only has one route.
|
||||||
try {
|
try {
|
||||||
@ -1079,9 +946,7 @@ class HttpOverHttp2Test {
|
|||||||
MockResponse()
|
MockResponse()
|
||||||
.setBody("def")
|
.setBody("def")
|
||||||
)
|
)
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
|
|
||||||
// First call makes a new connection and fails because it is the only route.
|
// First call makes a new connection and fails because it is the only route.
|
||||||
try {
|
try {
|
||||||
@ -1127,11 +992,7 @@ class HttpOverHttp2Test {
|
|||||||
MockResponse()
|
MockResponse()
|
||||||
.setBody("abc")
|
.setBody("abc")
|
||||||
)
|
)
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
try {
|
try {
|
||||||
call.execute()
|
call.execute()
|
||||||
fail<Any?>()
|
fail<Any?>()
|
||||||
@ -1169,11 +1030,7 @@ class HttpOverHttp2Test {
|
|||||||
client = client.newBuilder()
|
client = client.newBuilder()
|
||||||
.dns(DoubleInetAddressDns())
|
.dns(DoubleInetAddressDns())
|
||||||
.build()
|
.build()
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.body.string()).isEqualTo("abc")
|
assertThat(response.body.string()).isEqualTo("abc")
|
||||||
|
|
||||||
@ -1205,11 +1062,7 @@ class HttpOverHttp2Test {
|
|||||||
client = client.newBuilder()
|
client = client.newBuilder()
|
||||||
.dns(DoubleInetAddressDns())
|
.dns(DoubleInetAddressDns())
|
||||||
.build()
|
.build()
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.body.string()).isEqualTo("abc")
|
assertThat(response.body.string()).isEqualTo("abc")
|
||||||
|
|
||||||
@ -1249,11 +1102,7 @@ class HttpOverHttp2Test {
|
|||||||
callAndCancel(0, responseDequeuedLatches[0], requestCanceledLatches[0])
|
callAndCancel(0, responseDequeuedLatches[0], requestCanceledLatches[0])
|
||||||
|
|
||||||
// Make a second request to ensure the connection is reused.
|
// Make a second request to ensure the connection is reused.
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.body.string()).isEqualTo("def")
|
assertThat(response.body.string()).isEqualTo("def")
|
||||||
assertThat(server.takeRequest().sequenceNumber).isEqualTo(1)
|
assertThat(server.takeRequest().sequenceNumber).isEqualTo(1)
|
||||||
@ -1295,11 +1144,7 @@ class HttpOverHttp2Test {
|
|||||||
callAndCancel(1, responseDequeuedLatches[1], requestCanceledLatches[1])
|
callAndCancel(1, responseDequeuedLatches[1], requestCanceledLatches[1])
|
||||||
|
|
||||||
// Make a third request to ensure the connection is reused.
|
// Make a third request to ensure the connection is reused.
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.body.string()).isEqualTo("ghi")
|
assertThat(response.body.string()).isEqualTo("ghi")
|
||||||
assertThat(server.takeRequest().sequenceNumber).isEqualTo(2)
|
assertThat(server.takeRequest().sequenceNumber).isEqualTo(2)
|
||||||
@ -1332,11 +1177,7 @@ class HttpOverHttp2Test {
|
|||||||
expectedSequenceNumber: Int, responseDequeuedLatch: CountDownLatch?,
|
expectedSequenceNumber: Int, responseDequeuedLatch: CountDownLatch?,
|
||||||
requestCanceledLatch: CountDownLatch?
|
requestCanceledLatch: CountDownLatch?
|
||||||
) {
|
) {
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val latch = CountDownLatch(1)
|
val latch = CountDownLatch(1)
|
||||||
call.enqueue(object : Callback {
|
call.enqueue(object : Callback {
|
||||||
override fun onFailure(call: Call, e: IOException) {
|
override fun onFailure(call: Call, e: IOException) {
|
||||||
@ -1392,11 +1233,7 @@ class HttpOverHttp2Test {
|
|||||||
client = client.newBuilder()
|
client = client.newBuilder()
|
||||||
.retryOnConnectionFailure(false)
|
.retryOnConnectionFailure(false)
|
||||||
.build()
|
.build()
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
try {
|
try {
|
||||||
call.execute()
|
call.execute()
|
||||||
fail<Any?>()
|
fail<Any?>()
|
||||||
@ -1457,9 +1294,7 @@ class HttpOverHttp2Test {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Make the first request waiting until we get our auth challenge.
|
// Make the first request waiting until we get our auth challenge.
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
blockingAuthClient.newCall(request).enqueue(callback)
|
blockingAuthClient.newCall(request).enqueue(callback)
|
||||||
val response1 = responses.take()
|
val response1 = responses.take()
|
||||||
assertThat(response1).isEqualTo("")
|
assertThat(response1).isEqualTo("")
|
||||||
@ -1490,11 +1325,7 @@ class HttpOverHttp2Test {
|
|||||||
.addHeaderLenient("Alpha", "α")
|
.addHeaderLenient("Alpha", "α")
|
||||||
.addHeaderLenient("β", "Beta")
|
.addHeaderLenient("β", "Beta")
|
||||||
)
|
)
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
response.close()
|
response.close()
|
||||||
assertThat(response.header("Alpha")).isEqualTo("α")
|
assertThat(response.header("Alpha")).isEqualTo("α")
|
||||||
@ -1514,11 +1345,7 @@ class HttpOverHttp2Test {
|
|||||||
.setStatus("HTTP/1.1 200 Sweet")
|
.setStatus("HTTP/1.1 200 Sweet")
|
||||||
.withPush(pushPromise)
|
.withPush(pushPromise)
|
||||||
)
|
)
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/foo")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/foo"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.body.string()).isEqualTo("ABCDE")
|
assertThat(response.body.string()).isEqualTo("ABCDE")
|
||||||
assertThat(response.code).isEqualTo(200)
|
assertThat(response.code).isEqualTo(200)
|
||||||
@ -1547,11 +1374,7 @@ class HttpOverHttp2Test {
|
|||||||
.setStatus("HTTP/1.1 200 Sweet")
|
.setStatus("HTTP/1.1 200 Sweet")
|
||||||
.withPush(pushPromise)
|
.withPush(pushPromise)
|
||||||
)
|
)
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/foo")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/foo"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.body.string()).isEqualTo("ABCDE")
|
assertThat(response.body.string()).isEqualTo("ABCDE")
|
||||||
assertThat(response.code).isEqualTo(200)
|
assertThat(response.code).isEqualTo(200)
|
||||||
@ -1634,11 +1457,7 @@ class HttpOverHttp2Test {
|
|||||||
.setBodyDelay(750, TimeUnit.MILLISECONDS)
|
.setBodyDelay(750, TimeUnit.MILLISECONDS)
|
||||||
.setBody("ABC")
|
.setBody("ABC")
|
||||||
)
|
)
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.body.string()).isEqualTo("ABC")
|
assertThat(response.body.string()).isEqualTo("ABC")
|
||||||
assertThat(response.protocol).isEqualTo(protocol)
|
assertThat(response.protocol).isEqualTo(protocol)
|
||||||
@ -1678,11 +1497,7 @@ class HttpOverHttp2Test {
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Make a call. It'll fail as soon as our pings detect a problem.
|
// Make a call. It'll fail as soon as our pings detect a problem.
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val executeAtNanos = System.nanoTime()
|
val executeAtNanos = System.nanoTime()
|
||||||
try {
|
try {
|
||||||
call.execute()
|
call.execute()
|
||||||
@ -1725,11 +1540,7 @@ class HttpOverHttp2Test {
|
|||||||
)
|
)
|
||||||
|
|
||||||
// The first call times out.
|
// The first call times out.
|
||||||
val call1 = client.newCall(
|
val call1 = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
try {
|
try {
|
||||||
call1.execute()
|
call1.execute()
|
||||||
fail<Any?>()
|
fail<Any?>()
|
||||||
@ -1738,11 +1549,7 @@ class HttpOverHttp2Test {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// The second call times out because it uses the same bad connection.
|
// The second call times out because it uses the same bad connection.
|
||||||
val call2 = client.newCall(
|
val call2 = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
try {
|
try {
|
||||||
call2.execute()
|
call2.execute()
|
||||||
fail<Any?>()
|
fail<Any?>()
|
||||||
@ -1751,11 +1558,7 @@ class HttpOverHttp2Test {
|
|||||||
|
|
||||||
// But after the degraded pong timeout, that connection is abandoned.
|
// But after the degraded pong timeout, that connection is abandoned.
|
||||||
Thread.sleep(TimeUnit.NANOSECONDS.toMillis(Http2Connection.DEGRADED_PONG_TIMEOUT_NS.toLong()))
|
Thread.sleep(TimeUnit.NANOSECONDS.toMillis(Http2Connection.DEGRADED_PONG_TIMEOUT_NS.toLong()))
|
||||||
val call3 = client.newCall(
|
val call3 = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
call3.execute().use { response ->
|
call3.execute().use { response ->
|
||||||
assertThat(
|
assertThat(
|
||||||
response.body.string()
|
response.body.string()
|
||||||
@ -1784,11 +1587,7 @@ class HttpOverHttp2Test {
|
|||||||
)
|
)
|
||||||
|
|
||||||
// The first call times out.
|
// The first call times out.
|
||||||
val call1 = client.newCall(
|
val call1 = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
try {
|
try {
|
||||||
call1.execute().use { response ->
|
call1.execute().use { response ->
|
||||||
response.body.string()
|
response.body.string()
|
||||||
@ -1798,11 +1597,7 @@ class HttpOverHttp2Test {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// The second call succeeds.
|
// The second call succeeds.
|
||||||
val call2 = client.newCall(
|
val call2 = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
call2.execute().use { response ->
|
call2.execute().use { response ->
|
||||||
assertThat(
|
assertThat(
|
||||||
response.body.string()
|
response.body.string()
|
||||||
@ -1811,11 +1606,7 @@ class HttpOverHttp2Test {
|
|||||||
|
|
||||||
// Calls succeed after the degraded pong timeout because the degraded pong was received.
|
// Calls succeed after the degraded pong timeout because the degraded pong was received.
|
||||||
Thread.sleep(TimeUnit.NANOSECONDS.toMillis(Http2Connection.DEGRADED_PONG_TIMEOUT_NS.toLong()))
|
Thread.sleep(TimeUnit.NANOSECONDS.toMillis(Http2Connection.DEGRADED_PONG_TIMEOUT_NS.toLong()))
|
||||||
val call3 = client.newCall(
|
val call3 = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
call3.execute().use { response ->
|
call3.execute().use { response ->
|
||||||
assertThat(
|
assertThat(
|
||||||
response.body.string()
|
response.body.string()
|
||||||
@ -1859,11 +1650,7 @@ class HttpOverHttp2Test {
|
|||||||
|
|
||||||
// Read & write a full request to confirm settings are accepted.
|
// Read & write a full request to confirm settings are accepted.
|
||||||
server.enqueue(MockResponse().withSettings(settings))
|
server.enqueue(MockResponse().withSettings(settings))
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.body.string()).isEqualTo("")
|
assertThat(response.body.string()).isEqualTo("")
|
||||||
server.enqueue(
|
server.enqueue(
|
||||||
@ -1878,23 +1665,11 @@ class HttpOverHttp2Test {
|
|||||||
MockResponse()
|
MockResponse()
|
||||||
.setBody("GHI")
|
.setBody("GHI")
|
||||||
)
|
)
|
||||||
val call1 = client.newCall(
|
val call1 = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response1 = call1.execute()
|
val response1 = call1.execute()
|
||||||
val call2 = client.newCall(
|
val call2 = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response2 = call2.execute()
|
val response2 = call2.execute()
|
||||||
val call3 = client.newCall(
|
val call3 = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response3 = call3.execute()
|
val response3 = call3.execute()
|
||||||
assertThat(response1.body.string()).isEqualTo("ABC")
|
assertThat(response1.body.string()).isEqualTo("ABC")
|
||||||
assertThat(response2.body.string()).isEqualTo("DEF")
|
assertThat(response2.body.string()).isEqualTo("DEF")
|
||||||
@ -1932,21 +1707,13 @@ class HttpOverHttp2Test {
|
|||||||
connections.add(connection as RealConnection)
|
connections.add(connection as RealConnection)
|
||||||
}
|
}
|
||||||
}).build()
|
}).build()
|
||||||
val call1 = localClient.newCall(
|
val call1 = localClient.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response1 = call1.execute()
|
val response1 = call1.execute()
|
||||||
assertThat(response1.body.string()).isEqualTo("ABC")
|
assertThat(response1.body.string()).isEqualTo("ABC")
|
||||||
|
|
||||||
// Add delays for DISCONNECT_AT_END to propogate
|
// Add delays for DISCONNECT_AT_END to propogate
|
||||||
waitForConnectionShutdown(connections[0])
|
waitForConnectionShutdown(connections[0])
|
||||||
val call2 = localClient.newCall(
|
val call2 = localClient.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response2 = call2.execute()
|
val response2 = call2.execute()
|
||||||
assertThat(response2.body.string()).isEqualTo("DEF")
|
assertThat(response2.body.string()).isEqualTo("DEF")
|
||||||
assertThat(server.takeRequest().sequenceNumber).isEqualTo(0)
|
assertThat(server.takeRequest().sequenceNumber).isEqualTo(0)
|
||||||
@ -2005,11 +1772,7 @@ class HttpOverHttp2Test {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
.build()
|
.build()
|
||||||
val call = client2.newCall(
|
val call = client2.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.body.string()).isEqualTo("DEF")
|
assertThat(response.body.string()).isEqualTo("DEF")
|
||||||
assertThat(server.takeRequest().sequenceNumber).isEqualTo(0)
|
assertThat(server.takeRequest().sequenceNumber).isEqualTo(0)
|
||||||
@ -2129,11 +1892,7 @@ class HttpOverHttp2Test {
|
|||||||
client = client.newBuilder()
|
client = client.newBuilder()
|
||||||
.proxy(server.toProxyAddress())
|
.proxy(server.toProxyAddress())
|
||||||
.build()
|
.build()
|
||||||
val call1 = client.newCall(
|
val call1 = client.newCall(Request("https://android.com/call1".toHttpUrl()))
|
||||||
Request.Builder()
|
|
||||||
.url("https://android.com/call1")
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response2 = call1.execute()
|
val response2 = call1.execute()
|
||||||
assertThat(response2.body.string()).isEqualTo("call1 response")
|
assertThat(response2.body.string()).isEqualTo("call1 response")
|
||||||
val call1Connect = server.takeRequest()
|
val call1Connect = server.takeRequest()
|
||||||
@ -2166,11 +1925,7 @@ class HttpOverHttp2Test {
|
|||||||
})
|
})
|
||||||
.build()
|
.build()
|
||||||
server.enqueue(MockResponse())
|
server.enqueue(MockResponse())
|
||||||
val call = client.newCall(
|
val call = client.newCall(Request(server.url("/")))
|
||||||
Request.Builder()
|
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
)
|
|
||||||
val response = call.execute()
|
val response = call.execute()
|
||||||
assertThat(response.body.string()).isEqualTo("")
|
assertThat(response.body.string()).isEqualTo("")
|
||||||
val recordedRequest = server.takeRequest()
|
val recordedRequest = server.takeRequest()
|
||||||
@ -2249,16 +2004,16 @@ class HttpOverHttp2Test {
|
|||||||
server.enqueue(MockResponse())
|
server.enqueue(MockResponse())
|
||||||
val callReference = AtomicReference<Call?>()
|
val callReference = AtomicReference<Call?>()
|
||||||
val call = client.newCall(
|
val call = client.newCall(
|
||||||
Request.Builder()
|
Request(
|
||||||
.url(server.url("/"))
|
url = server.url("/"),
|
||||||
.post(object : RequestBody() {
|
body = object : RequestBody() {
|
||||||
override fun contentType() = "text/plain; charset=utf-8".toMediaType()
|
override fun contentType() = "text/plain; charset=utf-8".toMediaType()
|
||||||
|
|
||||||
override fun writeTo(sink: BufferedSink) {
|
override fun writeTo(sink: BufferedSink) {
|
||||||
callReference.get()!!.cancel()
|
callReference.get()!!.cancel()
|
||||||
}
|
}
|
||||||
})
|
},
|
||||||
.build()
|
)
|
||||||
)
|
)
|
||||||
callReference.set(call)
|
callReference.set(call)
|
||||||
try {
|
try {
|
||||||
|
@ -30,17 +30,43 @@ import okhttp3.internal.commonPost
|
|||||||
import okhttp3.internal.commonPut
|
import okhttp3.internal.commonPut
|
||||||
import okhttp3.internal.commonRemoveHeader
|
import okhttp3.internal.commonRemoveHeader
|
||||||
|
|
||||||
actual class Request internal constructor(
|
actual class Request internal actual constructor(builder: Builder) {
|
||||||
actual val url: String,
|
actual val url: String = checkNotNull(builder.url) { "url == null" }
|
||||||
actual val method: String,
|
actual val method: String = builder.method
|
||||||
actual val headers: Headers,
|
actual val headers: Headers = builder.headers.build()
|
||||||
actual val body: RequestBody?,
|
actual val body: RequestBody? = builder.body
|
||||||
) {
|
|
||||||
internal actual var lazyCacheControl: CacheControl? = null
|
internal actual var lazyCacheControl: CacheControl? = null
|
||||||
|
|
||||||
actual val isHttps: Boolean
|
actual val isHttps: Boolean
|
||||||
get() = url.startsWith("https://")
|
get() = url.startsWith("https://")
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new request.
|
||||||
|
*
|
||||||
|
* Use [Builder] for more fluent construction, including helper methods for various HTTP methods.
|
||||||
|
*
|
||||||
|
* @param method defaults to "GET" if [body] is null, and "POST" otherwise.
|
||||||
|
*/
|
||||||
|
constructor(
|
||||||
|
url: String,
|
||||||
|
headers: Headers = Headers.headersOf(),
|
||||||
|
method: String = "\u0000", // Sentinel value chooses based on what the body is.
|
||||||
|
body: RequestBody? = null,
|
||||||
|
) : this(
|
||||||
|
Builder()
|
||||||
|
.url(url)
|
||||||
|
.headers(headers)
|
||||||
|
.method(
|
||||||
|
when {
|
||||||
|
method != "\u0000" -> method
|
||||||
|
body != null -> "POST"
|
||||||
|
else -> "GET"
|
||||||
|
},
|
||||||
|
body
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
actual fun header(name: String): String? = commonHeader(name)
|
actual fun header(name: String): String? = commonHeader(name)
|
||||||
|
|
||||||
actual fun headers(name: String): List<String> = commonHeaders(name)
|
actual fun headers(name: String): List<String> = commonHeaders(name)
|
||||||
@ -153,13 +179,6 @@ actual class Request internal constructor(
|
|||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
actual open fun build(): Request {
|
actual open fun build() = Request(this)
|
||||||
return Request(
|
|
||||||
checkNotNull(url) { "url == null" },
|
|
||||||
method,
|
|
||||||
headers.build(),
|
|
||||||
body,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -46,9 +46,7 @@ class DevServer {
|
|||||||
|
|
||||||
fun run() {
|
fun run() {
|
||||||
try {
|
try {
|
||||||
val request = Request.Builder()
|
val request = Request(server.url("/"))
|
||||||
.url(server.url("/"))
|
|
||||||
.build()
|
|
||||||
|
|
||||||
client.newCall(request).execute().use { response ->
|
client.newCall(request).execute().use { response ->
|
||||||
if (!response.isSuccessful) throw IOException("Unexpected code $response")
|
if (!response.isSuccessful) throw IOException("Unexpected code $response")
|
||||||
|
@ -17,6 +17,7 @@ package okhttp3.recipes.kt
|
|||||||
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
|
import okhttp3.HttpUrl.Companion.toHttpUrl
|
||||||
import okhttp3.MediaType.Companion.toMediaType
|
import okhttp3.MediaType.Companion.toMediaType
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
@ -28,10 +29,10 @@ class PostFile {
|
|||||||
fun run() {
|
fun run() {
|
||||||
val file = File("README.md")
|
val file = File("README.md")
|
||||||
|
|
||||||
val request = Request.Builder()
|
val request = Request(
|
||||||
.url("https://api.github.com/markdown/raw")
|
url = "https://api.github.com/markdown/raw".toHttpUrl(),
|
||||||
.post(file.asRequestBody(MEDIA_TYPE_MARKDOWN))
|
body = file.asRequestBody(MEDIA_TYPE_MARKDOWN),
|
||||||
.build()
|
)
|
||||||
|
|
||||||
client.newCall(request).execute().use { response ->
|
client.newCall(request).execute().use { response ->
|
||||||
if (!response.isSuccessful) throw IOException("Unexpected code $response")
|
if (!response.isSuccessful) throw IOException("Unexpected code $response")
|
||||||
|
@ -17,6 +17,7 @@ package okhttp3.recipes.kt
|
|||||||
|
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
import okhttp3.FormBody
|
import okhttp3.FormBody
|
||||||
|
import okhttp3.HttpUrl.Companion.toHttpUrl
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
|
|
||||||
@ -27,10 +28,10 @@ class PostForm {
|
|||||||
val formBody = FormBody.Builder()
|
val formBody = FormBody.Builder()
|
||||||
.add("search", "Jurassic Park")
|
.add("search", "Jurassic Park")
|
||||||
.build()
|
.build()
|
||||||
val request = Request.Builder()
|
val request = Request(
|
||||||
.url("https://en.wikipedia.org/w/index.php")
|
url = "https://en.wikipedia.org/w/index.php".toHttpUrl(),
|
||||||
.post(formBody)
|
body = formBody,
|
||||||
.build()
|
)
|
||||||
|
|
||||||
client.newCall(request).execute().use { response ->
|
client.newCall(request).execute().use { response ->
|
||||||
if (!response.isSuccessful) throw IOException("Unexpected code $response")
|
if (!response.isSuccessful) throw IOException("Unexpected code $response")
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
package okhttp3.recipes.kt
|
package okhttp3.recipes.kt
|
||||||
|
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
|
import okhttp3.HttpUrl.Companion.toHttpUrl
|
||||||
import okhttp3.MediaType.Companion.toMediaType
|
import okhttp3.MediaType.Companion.toMediaType
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
@ -46,10 +47,10 @@ class PostStreaming {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val request = Request.Builder()
|
val request = Request(
|
||||||
.url("https://api.github.com/markdown/raw")
|
url = "https://api.github.com/markdown/raw".toHttpUrl(),
|
||||||
.post(requestBody)
|
body = requestBody,
|
||||||
.build()
|
)
|
||||||
|
|
||||||
client.newCall(request).execute().use { response ->
|
client.newCall(request).execute().use { response ->
|
||||||
if (!response.isSuccessful) throw IOException("Unexpected code $response")
|
if (!response.isSuccessful) throw IOException("Unexpected code $response")
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
package okhttp3.recipes.kt
|
package okhttp3.recipes.kt
|
||||||
|
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
|
import okhttp3.HttpUrl.Companion.toHttpUrl
|
||||||
import okhttp3.MediaType.Companion.toMediaType
|
import okhttp3.MediaType.Companion.toMediaType
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
@ -34,10 +35,10 @@ class PostString {
|
|||||||
| * _1.2_ August 11, 2013
|
| * _1.2_ August 11, 2013
|
||||||
|""".trimMargin()
|
|""".trimMargin()
|
||||||
|
|
||||||
val request = Request.Builder()
|
val request = Request(
|
||||||
.url("https://api.github.com/markdown/raw")
|
url = "https://api.github.com/markdown/raw".toHttpUrl(),
|
||||||
.post(postBody.toRequestBody(MEDIA_TYPE_MARKDOWN))
|
body = postBody.toRequestBody(MEDIA_TYPE_MARKDOWN),
|
||||||
.build()
|
)
|
||||||
|
|
||||||
client.newCall(request).execute().use { response ->
|
client.newCall(request).execute().use { response ->
|
||||||
if (!response.isSuccessful) throw IOException("Unexpected code $response")
|
if (!response.isSuccessful) throw IOException("Unexpected code $response")
|
||||||
|
Reference in New Issue
Block a user