diff --git a/mockwebserver-deprecated/src/main/kotlin/okhttp3/mockwebserver/bridge.kt b/mockwebserver-deprecated/src/main/kotlin/okhttp3/mockwebserver/bridge.kt index 5fa1ce1a6..a789b90fd 100644 --- a/mockwebserver-deprecated/src/main/kotlin/okhttp3/mockwebserver/bridge.kt +++ b/mockwebserver-deprecated/src/main/kotlin/okhttp3/mockwebserver/bridge.kt @@ -39,23 +39,23 @@ internal fun Dispatcher.wrap(): mockwebserver3.Dispatcher { } internal fun MockResponse.wrap(): mockwebserver3.MockResponse { - val result = mockwebserver3.MockResponse() + val result = mockwebserver3.MockResponse.Builder() val copyFromWebSocketListener = webSocketListener if (copyFromWebSocketListener != null) { - result.withWebSocketUpgrade(copyFromWebSocketListener) + result.webSocketUpgrade(copyFromWebSocketListener) } val body = getBody() - if (body != null) result.setBody(body) + if (body != null) result.body(body) for (pushPromise in pushPromises) { - result.withPush(pushPromise.wrap()) + result.addPush(pushPromise.wrap()) } - result.withSettings(settings) + result.settings(settings) result.status = status - result.headers = headers - result.trailers = trailers + result.headers(headers) + result.trailers(trailers) result.socketPolicy = when (socketPolicy) { SocketPolicy.EXPECT_CONTINUE, SocketPolicy.CONTINUE_ALWAYS -> { result.add100Continue() @@ -69,9 +69,9 @@ internal fun MockResponse.wrap(): mockwebserver3.MockResponse { } result.http2ErrorCode = http2ErrorCode result.throttleBody(throttleBytesPerPeriod, getThrottlePeriod(MILLISECONDS), MILLISECONDS) - result.setBodyDelay(getBodyDelay(MILLISECONDS), MILLISECONDS) - result.setHeadersDelay(getHeadersDelay(MILLISECONDS), MILLISECONDS) - return result + result.bodyDelay(getBodyDelay(MILLISECONDS), MILLISECONDS) + result.headersDelay(getHeadersDelay(MILLISECONDS), MILLISECONDS) + return result.build() } private fun PushPromise.wrap(): mockwebserver3.PushPromise { diff --git a/mockwebserver-junit5/src/test/java/mockwebserver3/junit5/internal/ExtensionLifecycleTest.kt b/mockwebserver-junit5/src/test/java/mockwebserver3/junit5/internal/ExtensionLifecycleTest.kt index ff37eb535..f5a269e59 100644 --- a/mockwebserver-junit5/src/test/java/mockwebserver3/junit5/internal/ExtensionLifecycleTest.kt +++ b/mockwebserver-junit5/src/test/java/mockwebserver3/junit5/internal/ExtensionLifecycleTest.kt @@ -37,14 +37,14 @@ class ExtensionLifecycleTest { fun setup(server: MockWebServer) { _server = server assertThat(server.started).isTrue() - server.enqueue(MockResponse().setResponseCode(200)) + server.enqueue(MockResponse()) } @AfterEach fun tearDown(server: MockWebServer) { assertThat(_server).isSameAs(server) assertThat(server.started).isTrue() - server.enqueue(MockResponse().setResponseCode(200)) + server.enqueue(MockResponse()) } @Test diff --git a/mockwebserver/api/mockwebserver3.api b/mockwebserver/api/mockwebserver3.api index 2e32e3c41..057b08ef1 100644 --- a/mockwebserver/api/mockwebserver3.api +++ b/mockwebserver/api/mockwebserver3.api @@ -5,22 +5,17 @@ public abstract class mockwebserver3/Dispatcher { public fun shutdown ()V } -public final class mockwebserver3/MockResponse : java/lang/Cloneable { +public final class mockwebserver3/MockResponse { public static final field Companion Lmockwebserver3/MockResponse$Companion; - public final fun -deprecated_getHeaders ()Lokhttp3/Headers; - public final fun -deprecated_getHttp2ErrorCode ()I - public final fun -deprecated_getSocketPolicy ()Lmockwebserver3/SocketPolicy; - public final fun -deprecated_getStatus ()Ljava/lang/String; - public final fun -deprecated_getTrailers ()Lokhttp3/Headers; public fun ()V - public final fun add100Continue ()Lmockwebserver3/MockResponse; - public final fun addHeader (Ljava/lang/String;)Lmockwebserver3/MockResponse; - public final fun addHeader (Ljava/lang/String;Ljava/lang/Object;)Lmockwebserver3/MockResponse; - public final fun addHeaderLenient (Ljava/lang/String;Ljava/lang/Object;)Lmockwebserver3/MockResponse; - public final fun addInformationalResponse (Lmockwebserver3/MockResponse;)Lmockwebserver3/MockResponse; - public final fun clearHeaders ()Lmockwebserver3/MockResponse; - public synthetic fun clone ()Ljava/lang/Object; - public fun clone ()Lmockwebserver3/MockResponse; + public fun (I)V + public fun (ILokhttp3/Headers;)V + public fun (ILokhttp3/Headers;Ljava/lang/String;)V + public fun (ILokhttp3/Headers;Ljava/lang/String;Z)V + public fun (ILokhttp3/Headers;Ljava/lang/String;ZLmockwebserver3/SocketPolicy;)V + public fun (ILokhttp3/Headers;Ljava/lang/String;ZLmockwebserver3/SocketPolicy;I)V + public synthetic fun (ILokhttp3/Headers;Ljava/lang/String;ZLmockwebserver3/SocketPolicy;IILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Lmockwebserver3/MockResponse$Builder;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getBody ()Lokio/Buffer; public final fun getBodyDelay (Ljava/util/concurrent/TimeUnit;)J public final fun getCode ()I @@ -39,33 +34,57 @@ public final class mockwebserver3/MockResponse : java/lang/Cloneable { public final fun getThrottlePeriod (Ljava/util/concurrent/TimeUnit;)J public final fun getTrailers ()Lokhttp3/Headers; public final fun getWebSocketListener ()Lokhttp3/WebSocketListener; - public final fun headers (Lokhttp3/Headers;)V - public final fun http2ErrorCode (I)V - public final fun inTunnel ()Lmockwebserver3/MockResponse; public final fun isDuplex ()Z - public final fun removeHeader (Ljava/lang/String;)Lmockwebserver3/MockResponse; - public final fun setBody (Ljava/lang/String;)Lmockwebserver3/MockResponse; - public final fun setBody (Lmockwebserver3/internal/duplex/DuplexResponseBody;)Lmockwebserver3/MockResponse; - public final fun setBody (Lokio/Buffer;)Lmockwebserver3/MockResponse; - public final fun setBodyDelay (JLjava/util/concurrent/TimeUnit;)Lmockwebserver3/MockResponse; - public final fun setChunkedBody (Ljava/lang/String;I)Lmockwebserver3/MockResponse; - public final fun setChunkedBody (Lokio/Buffer;I)Lmockwebserver3/MockResponse; - public final fun setHeader (Ljava/lang/String;Ljava/lang/Object;)Lmockwebserver3/MockResponse; - public final fun setHeaders (Lokhttp3/Headers;)Lmockwebserver3/MockResponse; - public final fun setHeadersDelay (JLjava/util/concurrent/TimeUnit;)Lmockwebserver3/MockResponse; - public final fun setHttp2ErrorCode (I)Lmockwebserver3/MockResponse; - public final fun setResponseCode (I)Lmockwebserver3/MockResponse; - public final fun setSocketPolicy (Lmockwebserver3/SocketPolicy;)Lmockwebserver3/MockResponse; - public final fun setStatus (Ljava/lang/String;)Lmockwebserver3/MockResponse; - public final fun setTrailers (Lokhttp3/Headers;)Lmockwebserver3/MockResponse; - public final fun socketPolicy (Lmockwebserver3/SocketPolicy;)V - public final fun status (Ljava/lang/String;)V - public final fun throttleBody (JJLjava/util/concurrent/TimeUnit;)Lmockwebserver3/MockResponse; + public final fun newBuilder ()Lmockwebserver3/MockResponse$Builder; public fun toString ()Ljava/lang/String; - public final fun trailers (Lokhttp3/Headers;)V - public final fun withPush (Lmockwebserver3/PushPromise;)Lmockwebserver3/MockResponse; - public final fun withSettings (Lokhttp3/internal/http2/Settings;)Lmockwebserver3/MockResponse; - public final fun withWebSocketUpgrade (Lokhttp3/WebSocketListener;)Lmockwebserver3/MockResponse; +} + +public final class mockwebserver3/MockResponse$Builder : java/lang/Cloneable { + public fun ()V + public final fun add100Continue ()Lmockwebserver3/MockResponse$Builder; + public final fun addHeader (Ljava/lang/String;)Lmockwebserver3/MockResponse$Builder; + public final fun addHeader (Ljava/lang/String;Ljava/lang/Object;)Lmockwebserver3/MockResponse$Builder; + public final fun addHeaderLenient (Ljava/lang/String;Ljava/lang/Object;)Lmockwebserver3/MockResponse$Builder; + public final fun addInformationalResponse (Lmockwebserver3/MockResponse;)Lmockwebserver3/MockResponse$Builder; + public final fun addPush (Lmockwebserver3/PushPromise;)Lmockwebserver3/MockResponse$Builder; + public final fun body (Ljava/lang/String;)Lmockwebserver3/MockResponse$Builder; + public final fun body (Lmockwebserver3/internal/duplex/DuplexResponseBody;)Lmockwebserver3/MockResponse$Builder; + public final fun body (Lokio/Buffer;)Lmockwebserver3/MockResponse$Builder; + public final fun bodyDelay (JLjava/util/concurrent/TimeUnit;)Lmockwebserver3/MockResponse$Builder; + public final fun build ()Lmockwebserver3/MockResponse; + public final fun chunkedBody (Ljava/lang/String;I)Lmockwebserver3/MockResponse$Builder; + public final fun chunkedBody (Lokio/Buffer;I)Lmockwebserver3/MockResponse$Builder; + public final fun clearHeaders ()Lmockwebserver3/MockResponse$Builder; + public synthetic fun clone ()Ljava/lang/Object; + public fun clone ()Lmockwebserver3/MockResponse$Builder; + public final fun code (I)Lmockwebserver3/MockResponse$Builder; + public final fun getCode ()I + public final fun getDuplexResponseBody ()Lmockwebserver3/internal/duplex/DuplexResponseBody; + public final fun getHttp2ErrorCode ()I + public final fun getInTunnel ()Z + public final fun getInformationalResponses ()Ljava/util/List; + public final fun getPushPromises ()Ljava/util/List; + public final fun getSettings ()Lokhttp3/internal/http2/Settings; + public final fun getSocketPolicy ()Lmockwebserver3/SocketPolicy; + public final fun getStatus ()Ljava/lang/String; + public final fun getThrottleBytesPerPeriod ()J + public final fun getWebSocketListener ()Lokhttp3/WebSocketListener; + public final fun headers (Lokhttp3/Headers;)Lmockwebserver3/MockResponse$Builder; + public final fun headersDelay (JLjava/util/concurrent/TimeUnit;)Lmockwebserver3/MockResponse$Builder; + public final fun http2ErrorCode (I)Lmockwebserver3/MockResponse$Builder; + public final fun inTunnel ()Lmockwebserver3/MockResponse$Builder; + public final fun removeHeader (Ljava/lang/String;)Lmockwebserver3/MockResponse$Builder; + public final fun setCode (I)V + public final fun setHeader (Ljava/lang/String;Ljava/lang/Object;)Lmockwebserver3/MockResponse$Builder; + public final fun setHttp2ErrorCode (I)V + public final fun setSocketPolicy (Lmockwebserver3/SocketPolicy;)V + public final fun setStatus (Ljava/lang/String;)V + public final fun settings (Lokhttp3/internal/http2/Settings;)Lmockwebserver3/MockResponse$Builder; + public final fun socketPolicy (Lmockwebserver3/SocketPolicy;)Lmockwebserver3/MockResponse$Builder; + public final fun status (Ljava/lang/String;)Lmockwebserver3/MockResponse$Builder; + public final fun throttleBody (JJLjava/util/concurrent/TimeUnit;)Lmockwebserver3/MockResponse$Builder; + public final fun trailers (Lokhttp3/Headers;)Lmockwebserver3/MockResponse$Builder; + public final fun webSocketUpgrade (Lokhttp3/WebSocketListener;)Lmockwebserver3/MockResponse$Builder; } public final class mockwebserver3/MockResponse$Companion { diff --git a/mockwebserver/src/main/kotlin/mockwebserver3/Dispatcher.kt b/mockwebserver/src/main/kotlin/mockwebserver3/Dispatcher.kt index f44df52a8..75537fa0f 100644 --- a/mockwebserver/src/main/kotlin/mockwebserver3/Dispatcher.kt +++ b/mockwebserver/src/main/kotlin/mockwebserver3/Dispatcher.kt @@ -31,7 +31,7 @@ abstract class Dispatcher { * request bodies. */ open fun peek(): MockResponse { - return MockResponse().apply { this.socketPolicy = SocketPolicy.KEEP_OPEN } + return MockResponse(socketPolicy = SocketPolicy.KEEP_OPEN) } /** diff --git a/mockwebserver/src/main/kotlin/mockwebserver3/MockResponse.kt b/mockwebserver/src/main/kotlin/mockwebserver3/MockResponse.kt index bfe09425e..af10cce60 100644 --- a/mockwebserver/src/main/kotlin/mockwebserver3/MockResponse.kt +++ b/mockwebserver/src/main/kotlin/mockwebserver3/MockResponse.kt @@ -18,22 +18,17 @@ package mockwebserver3 import java.util.concurrent.TimeUnit import mockwebserver3.internal.duplex.DuplexResponseBody import okhttp3.Headers +import okhttp3.Headers.Companion.headersOf import okhttp3.WebSocketListener import okhttp3.internal.addHeaderLenient import okhttp3.internal.http2.Settings import okio.Buffer /** A scripted response to be replayed by the mock web server. */ -class MockResponse : Cloneable { - var inTunnel = false - private set - - var informationalResponses: List = listOf() - private set +class MockResponse { /** Returns the HTTP response line, such as "HTTP/1.1 200 OK". */ - @set:JvmName("status") - var status: String = "" + val status: String val code: Int get() { @@ -49,352 +44,397 @@ class MockResponse : Cloneable { return statusParts[2] } - private var headersBuilder = Headers.Builder() - private var trailersBuilder = Headers.Builder() + val headers: Headers + val trailers: Headers - /** The HTTP headers, such as "Content-Length: 0". */ - @set:JvmName("headers") - var headers: Headers - get() = headersBuilder.build() - set(value) { - this.headersBuilder = value.newBuilder() - } + val body: Buffer? + get() { return field?.clone() } - @set:JvmName("trailers") - var trailers: Headers - get() = trailersBuilder.build() - set(value) { - this.trailersBuilder = value.newBuilder() - } + val inTunnel: Boolean + val informationalResponses: List - private var body: Buffer? = null + val throttleBytesPerPeriod: Long + private val throttlePeriodAmount: Long + private val throttlePeriodUnit: TimeUnit - var throttleBytesPerPeriod: Long = Long.MAX_VALUE - private set - private var throttlePeriodAmount = 1L - private var throttlePeriodUnit = TimeUnit.SECONDS - - @set:JvmName("socketPolicy") - var socketPolicy: SocketPolicy = SocketPolicy.KEEP_OPEN + val socketPolicy: SocketPolicy /** * Sets the [HTTP/2 error code](https://tools.ietf.org/html/rfc7540#section-7) to be - * returned when resetting the stream. - * This is only valid with [SocketPolicy.RESET_STREAM_AT_START] and - * [SocketPolicy.DO_NOT_READ_REQUEST_BODY]. + * returned when resetting the stream. This is only valid with + * [SocketPolicy.RESET_STREAM_AT_START] and [SocketPolicy.DO_NOT_READ_REQUEST_BODY]. */ - @set:JvmName("http2ErrorCode") - var http2ErrorCode: Int = -1 + val http2ErrorCode: Int - private var bodyDelayAmount = 0L - private var bodyDelayUnit = TimeUnit.MILLISECONDS + private val bodyDelayAmount: Long + private val bodyDelayUnit: TimeUnit - private var headersDelayAmount = 0L - private var headersDelayUnit = TimeUnit.MILLISECONDS + private val headersDelayAmount: Long + private var headersDelayUnit: TimeUnit + + val pushPromises: List + + val settings: Settings + + val webSocketListener: WebSocketListener? + val duplexResponseBody: DuplexResponseBody? - private var promises = mutableListOf() - var settings: Settings = Settings() - private set - var webSocketListener: WebSocketListener? = null - private set - var duplexResponseBody: DuplexResponseBody? = null - private set val isDuplex: Boolean get() = duplexResponseBody != null - /** Returns the streams the server will push with this response. */ - val pushPromises: List - get() = promises - - /** Creates a new mock response with an empty body. */ - init { - setResponseCode(200) - setHeader("Content-Length", 0L) - } - - public override fun clone(): MockResponse { - val result = super.clone() as MockResponse - result.headersBuilder = headersBuilder.build().newBuilder() - result.promises = promises.toMutableList() - return result - } - - @JvmName("-deprecated_getStatus") - @Deprecated( - message = "moved to var", - replaceWith = ReplaceWith(expression = "status"), - level = DeprecationLevel.ERROR) - fun getStatus(): String = status - - /** - * Sets the status and returns this. - * - * This was deprecated in OkHttp 4.0 in favor of the [status] val. In OkHttp 4.3 it is - * un-deprecated because Java callers can't chain when assigning Kotlin vals. (The getter remains - * deprecated). - */ - fun setStatus(status: String) = apply { - this.status = status - } - - fun setResponseCode(code: Int): MockResponse { - val reason = when (code) { - in 100..199 -> "Informational" - in 200..299 -> "OK" - in 300..399 -> "Redirection" - in 400..499 -> "Client Error" - in 500..599 -> "Server Error" - else -> "Mock Response" + @JvmOverloads + constructor( + code: Int = 200, + headers: Headers = headersOf(), + body: String = "", + inTunnel: Boolean = false, + socketPolicy: SocketPolicy = SocketPolicy.KEEP_OPEN, + http2ErrorCode: Int = -1, + ) : this(Builder() + .apply { + this.code = code + this.headers.addAll(headers) + if (inTunnel) inTunnel() + this.body(body) + this.socketPolicy = socketPolicy + this.http2ErrorCode = http2ErrorCode } - return apply { status = "HTTP/1.1 $code $reason" } - } + ) - /** - * Removes all HTTP headers including any "Content-Length" and "Transfer-encoding" headers that - * were added by default. - */ - fun clearHeaders() = apply { - headersBuilder = Headers.Builder() - } - - /** - * Adds [header] as an HTTP header. For well-formed HTTP [header] should contain a - * name followed by a colon and a value. - */ - fun addHeader(header: String) = apply { - headersBuilder.add(header) - } - - /** - * Adds a new header with the name and value. This may be used to add multiple headers with the - * same name. - */ - fun addHeader(name: String, value: Any) = apply { - headersBuilder.add(name, value.toString()) - } - - /** - * Adds a new header with the name and value. This may be used to add multiple headers with the - * same name. Unlike [addHeader] this does not validate the name and - * value. - */ - fun addHeaderLenient(name: String, value: Any) = apply { - addHeaderLenient(headersBuilder, name, value.toString()) - } - - /** - * Removes all headers named [name], then adds a new header with the name and value. - */ - fun setHeader(name: String, value: Any) = apply { - removeHeader(name) - addHeader(name, value) - } - - /** Removes all headers named [name]. */ - fun removeHeader(name: String) = apply { - headersBuilder.removeAll(name) - } - - /** Returns a copy of the raw HTTP payload. */ - fun getBody(): Buffer? = body?.clone() - - fun setBody(body: Buffer) = apply { - setHeader("Content-Length", body.size) - this.body = body.clone() // Defensive copy. - } - - /** Sets the response body to the UTF-8 encoded bytes of [body]. */ - fun setBody(body: String): MockResponse = setBody(Buffer().writeUtf8(body)) - - fun setBody(duplexResponseBody: DuplexResponseBody) = apply { - this.duplexResponseBody = duplexResponseBody - } - - /** - * Sets the response body to [body], chunked every [maxChunkSize] bytes. - */ - fun setChunkedBody(body: Buffer, maxChunkSize: Int) = apply { - removeHeader("Content-Length") - headersBuilder.add(CHUNKED_BODY_HEADER) - - val bytesOut = Buffer() - while (!body.exhausted()) { - val chunkSize = minOf(body.size, maxChunkSize.toLong()) - bytesOut.writeHexadecimalUnsignedLong(chunkSize) - bytesOut.writeUtf8("\r\n") - bytesOut.write(body, chunkSize) - bytesOut.writeUtf8("\r\n") + private constructor(builder: Builder) { + this.status = builder.status + this.headers = builder.headers.build() + this.trailers = builder.trailers.build() + this.body = builder.body?.clone() + this.inTunnel = builder.inTunnel + this.informationalResponses = builder.informationalResponses.toList() + this.throttleBytesPerPeriod = builder.throttleBytesPerPeriod + this.throttlePeriodAmount = builder.throttlePeriodAmount + this.throttlePeriodUnit = builder.throttlePeriodUnit + this.socketPolicy = builder.socketPolicy + this.http2ErrorCode = builder.http2ErrorCode + this.bodyDelayAmount = builder.bodyDelayAmount + this.bodyDelayUnit = builder.bodyDelayUnit + this.headersDelayAmount = builder.headersDelayAmount + this.headersDelayUnit = builder.headersDelayUnit + this.pushPromises = builder.pushPromises.toList() + this.settings = Settings().apply { + merge(builder.settings) } - bytesOut.writeUtf8("0\r\n") // Last chunk. Trailers follow! - this.body = bytesOut - } - - /** - * Sets the response body to the UTF-8 encoded bytes of [body], - * chunked every [maxChunkSize] bytes. - */ - fun setChunkedBody(body: String, maxChunkSize: Int): MockResponse = - setChunkedBody(Buffer().writeUtf8(body), maxChunkSize) - - @JvmName("-deprecated_getHeaders") - @Deprecated( - message = "moved to var", - replaceWith = ReplaceWith(expression = "headers"), - level = DeprecationLevel.ERROR) - fun getHeaders(): Headers = headers - - /** - * Sets the headers and returns this. - * - * This was deprecated in OkHttp 4.0 in favor of the [headers] val. In OkHttp 4.3 it is - * un-deprecated because Java callers can't chain when assigning Kotlin vals. (The getter remains - * deprecated). - */ - fun setHeaders(headers: Headers) = apply { this.headers = headers } - - @JvmName("-deprecated_getTrailers") - @Deprecated( - message = "moved to var", - replaceWith = ReplaceWith(expression = "trailers"), - level = DeprecationLevel.ERROR) - fun getTrailers(): Headers = trailers - - /** - * Sets the trailers and returns this. - * - * This was deprecated in OkHttp 4.0 in favor of the [trailers] val. In OkHttp 4.3 it is - * un-deprecated because Java callers can't chain when assigning Kotlin vals. (The getter remains - * deprecated). - */ - fun setTrailers(trailers: Headers) = apply { this.trailers = trailers } - - @JvmName("-deprecated_getSocketPolicy") - @Deprecated( - message = "moved to var", - replaceWith = ReplaceWith(expression = "socketPolicy"), - level = DeprecationLevel.ERROR) - fun getSocketPolicy(): SocketPolicy = socketPolicy - - /** - * Sets the socket policy and returns this. - * - * This was deprecated in OkHttp 4.0 in favor of the [socketPolicy] val. In OkHttp 4.3 it is - * un-deprecated because Java callers can't chain when assigning Kotlin vals. (The getter remains - * deprecated). - */ - fun setSocketPolicy(socketPolicy: SocketPolicy) = apply { - this.socketPolicy = socketPolicy - } - - @JvmName("-deprecated_getHttp2ErrorCode") - @Deprecated( - message = "moved to var", - replaceWith = ReplaceWith(expression = "http2ErrorCode"), - level = DeprecationLevel.ERROR) - fun getHttp2ErrorCode(): Int = http2ErrorCode - - /** - * Sets the HTTP/2 error code and returns this. - * - * This was deprecated in OkHttp 4.0 in favor of the [http2ErrorCode] val. In OkHttp 4.3 it is - * un-deprecated because Java callers can't chain when assigning Kotlin vals. (The getter remains - * deprecated). - */ - fun setHttp2ErrorCode(http2ErrorCode: Int) = apply { - this.http2ErrorCode = http2ErrorCode - } - - /** - * Throttles the request reader and response writer to sleep for the given period after each - * series of [bytesPerPeriod] bytes are transferred. Use this to simulate network behavior. - */ - fun throttleBody(bytesPerPeriod: Long, period: Long, unit: TimeUnit) = apply { - throttleBytesPerPeriod = bytesPerPeriod - throttlePeriodAmount = period - throttlePeriodUnit = unit + this.webSocketListener = builder.webSocketListener + this.duplexResponseBody = builder.duplexResponseBody } fun getThrottlePeriod(unit: TimeUnit): Long = unit.convert(throttlePeriodAmount, throttlePeriodUnit) - /** - * Set the delayed time of the response body to [delay]. This applies to the response body - * only; response headers are not affected. - */ - fun setBodyDelay(delay: Long, unit: TimeUnit) = apply { - bodyDelayAmount = delay - bodyDelayUnit = unit - } - fun getBodyDelay(unit: TimeUnit): Long = unit.convert(bodyDelayAmount, bodyDelayUnit) - fun setHeadersDelay(delay: Long, unit: TimeUnit) = apply { - headersDelayAmount = delay - headersDelayUnit = unit - } - fun getHeadersDelay(unit: TimeUnit): Long = unit.convert(headersDelayAmount, headersDelayUnit) - /** - * When [protocols][MockWebServer.protocols] include [HTTP_2][okhttp3.Protocol], this attaches a - * pushed stream to this response. - */ - fun withPush(promise: PushPromise) = apply { - promises.add(promise) - } - - /** - * When [protocols][MockWebServer.protocols] include [HTTP_2][okhttp3.Protocol], this pushes - * [settings] before writing the response. - */ - fun withSettings(settings: Settings) = apply { - this.settings = settings - } - - /** - * Attempts to perform a web socket upgrade on the connection. - * This will overwrite any previously set status or body. - */ - fun withWebSocketUpgrade(listener: WebSocketListener) = apply { - status = "HTTP/1.1 101 Switching Protocols" - setHeader("Connection", "Upgrade") - setHeader("Upgrade", "websocket") - body = null - webSocketListener = listener - } - - /** - * Configures this response to be served as a response to an HTTP CONNECT request, either for - * doing HTTPS through an HTTP proxy, or HTTP/2 prior knowledge through an HTTP proxy. - * - * When a new connection is received, all in-tunnel responses are served before the connection is - * upgraded to HTTPS or HTTP/2. - */ - fun inTunnel() = apply { - removeHeader("Content-Length") - inTunnel = true - } - - /** - * Adds an HTTP 1xx response to precede this response. Note that this response's - * [headers delay][setHeadersDelay] applies after this response is transmitted. Set a - * headers delay on that response to delay its transmission. - */ - fun addInformationalResponse(response: MockResponse) = apply { - informationalResponses += response - } - - fun add100Continue() = apply { - addInformationalResponse( - MockResponse() - .setResponseCode(100) - ) - } + fun newBuilder(): Builder = Builder(this) override fun toString(): String = status + class Builder : Cloneable { + var inTunnel: Boolean + internal set + + val informationalResponses: MutableList + + var status: String + + var code: Int + get() { + val statusParts = status.split(' ', limit = 3) + require(statusParts.size >= 2) { "Unexpected status: $status" } + return statusParts[1].toInt() + } + set(value) { + val reason = when (value) { + in 100..199 -> "Informational" + in 200..299 -> "OK" + in 300..399 -> "Redirection" + in 400..499 -> "Client Error" + in 500..599 -> "Server Error" + else -> "Mock Response" + } + status = "HTTP/1.1 $value $reason" + } + + internal var headers: Headers.Builder + + internal var trailers: Headers.Builder + + internal var body: Buffer? + + var throttleBytesPerPeriod: Long + private set + internal var throttlePeriodAmount: Long + internal var throttlePeriodUnit: TimeUnit + + var socketPolicy: SocketPolicy + + var http2ErrorCode: Int + + internal var bodyDelayAmount: Long + internal var bodyDelayUnit: TimeUnit + + internal var headersDelayAmount: Long + internal var headersDelayUnit: TimeUnit + + /** The streams the server will push with this response. */ + val pushPromises: MutableList + + val settings: Settings + var webSocketListener: WebSocketListener? + private set + var duplexResponseBody: DuplexResponseBody? + private set + + constructor() { + this.inTunnel = false + this.informationalResponses = mutableListOf() + this.status = "HTTP/1.1 200 OK" + this.body = null + this.headers = Headers.Builder() + .add("Content-Length", "0") + this.trailers = Headers.Builder() + this.throttleBytesPerPeriod = Long.MAX_VALUE + this.throttlePeriodAmount = 1L + this.throttlePeriodUnit = TimeUnit.SECONDS + this.socketPolicy = SocketPolicy.KEEP_OPEN + this.http2ErrorCode = -1 + this.bodyDelayAmount = 0L + this.bodyDelayUnit = TimeUnit.MILLISECONDS + this.headersDelayAmount = 0L + this.headersDelayUnit = TimeUnit.MILLISECONDS + this.pushPromises = mutableListOf() + this.settings = Settings() + this.webSocketListener = null + this.duplexResponseBody = null + } + + internal constructor(mockResponse: MockResponse) { + this.inTunnel = mockResponse.inTunnel + this.informationalResponses = mockResponse.informationalResponses.toMutableList() + this.status = mockResponse.status + this.headers = mockResponse.headers.newBuilder() + this.trailers = mockResponse.trailers.newBuilder() + this.body = mockResponse.body + this.throttleBytesPerPeriod = mockResponse.throttleBytesPerPeriod + this.throttlePeriodAmount = mockResponse.throttlePeriodAmount + this.throttlePeriodUnit = mockResponse.throttlePeriodUnit + this.socketPolicy = mockResponse.socketPolicy + this.http2ErrorCode = mockResponse.http2ErrorCode + this.bodyDelayAmount = mockResponse.bodyDelayAmount + this.bodyDelayUnit = mockResponse.bodyDelayUnit + this.headersDelayAmount = mockResponse.headersDelayAmount + this.headersDelayUnit = mockResponse.headersDelayUnit + this.pushPromises = mockResponse.pushPromises.toMutableList() + this.settings = Settings().apply { + merge(mockResponse.settings) + } + this.webSocketListener = mockResponse.webSocketListener + this.duplexResponseBody = mockResponse.duplexResponseBody + } + + fun code(code: Int) = apply { + this.code = code + } + + /** Sets the status and returns this. */ + fun status(status: String) = apply { + this.status = status + } + + /** + * Removes all HTTP headers including any "Content-Length" and "Transfer-encoding" headers that + * were added by default. + */ + fun clearHeaders() = apply { + headers = Headers.Builder() + } + + /** + * Adds [header] as an HTTP header. For well-formed HTTP [header] should contain a name followed + * by a colon and a value. + */ + fun addHeader(header: String) = apply { + headers.add(header) + } + + /** + * Adds a new header with the name and value. This may be used to add multiple headers with the + * same name. + */ + fun addHeader(name: String, value: Any) = apply { + headers.add(name, value.toString()) + } + + /** + * Adds a new header with the name and value. This may be used to add multiple headers with the + * same name. Unlike [addHeader] this does not validate the name and + * value. + */ + fun addHeaderLenient(name: String, value: Any) = apply { + addHeaderLenient(headers, name, value.toString()) + } + + /** Removes all headers named [name], then adds a new header with the name and value. */ + fun setHeader(name: String, value: Any) = apply { + removeHeader(name) + addHeader(name, value) + } + + /** Removes all headers named [name]. */ + fun removeHeader(name: String) = apply { + headers.removeAll(name) + } + + fun body(body: Buffer) = apply { + setHeader("Content-Length", body.size) + this.body = body.clone() // Defensive copy. + } + + /** Sets the response body to the UTF-8 encoded bytes of [body]. */ + fun body(body: String): Builder = body(Buffer().writeUtf8(body)) + + fun body(duplexResponseBody: DuplexResponseBody) = apply { + this.duplexResponseBody = duplexResponseBody + } + + /** + * Sets the response body to [body], chunked every [maxChunkSize] bytes. + */ + fun chunkedBody(body: Buffer, maxChunkSize: Int) = apply { + removeHeader("Content-Length") + headers.add(CHUNKED_BODY_HEADER) + + val bytesOut = Buffer() + while (!body.exhausted()) { + val chunkSize = minOf(body.size, maxChunkSize.toLong()) + bytesOut.writeHexadecimalUnsignedLong(chunkSize) + bytesOut.writeUtf8("\r\n") + bytesOut.write(body, chunkSize) + bytesOut.writeUtf8("\r\n") + } + bytesOut.writeUtf8("0\r\n") // Last chunk. Trailers follow! + this.body = bytesOut + } + + /** + * Sets the response body to the UTF-8 encoded bytes of [body], + * chunked every [maxChunkSize] bytes. + */ + fun chunkedBody(body: String, maxChunkSize: Int): Builder = + chunkedBody(Buffer().writeUtf8(body), maxChunkSize) + + /** Sets the headers and returns this. */ + fun headers(headers: Headers) = apply { + this.headers = headers.newBuilder() + } + + /** Sets the trailers and returns this. */ + fun trailers(trailers: Headers) = apply { + this.trailers = trailers.newBuilder() + } + + /** Sets the socket policy and returns this. */ + fun socketPolicy(socketPolicy: SocketPolicy) = apply { + this.socketPolicy = socketPolicy + } + + /** Sets the HTTP/2 error code and returns this. */ + fun http2ErrorCode(http2ErrorCode: Int) = apply { + this.http2ErrorCode = http2ErrorCode + } + + /** + * Throttles the request reader and response writer to sleep for the given period after each + * series of [bytesPerPeriod] bytes are transferred. Use this to simulate network behavior. + */ + fun throttleBody(bytesPerPeriod: Long, period: Long, unit: TimeUnit) = apply { + throttleBytesPerPeriod = bytesPerPeriod + throttlePeriodAmount = period + throttlePeriodUnit = unit + } + + /** + * Set the delayed time of the response body to [delay]. This applies to the response body + * only; response headers are not affected. + */ + fun bodyDelay(delay: Long, unit: TimeUnit) = apply { + bodyDelayAmount = delay + bodyDelayUnit = unit + } + + fun headersDelay(delay: Long, unit: TimeUnit) = apply { + headersDelayAmount = delay + headersDelayUnit = unit + } + + /** + * When [protocols][MockWebServer.protocols] include [HTTP_2][okhttp3.Protocol], this attaches a + * pushed stream to this response. + */ + fun addPush(promise: PushPromise) = apply { + this.pushPromises += promise + } + + /** + * When [protocols][MockWebServer.protocols] include [HTTP_2][okhttp3.Protocol], this pushes + * [settings] before writing the response. + */ + fun settings(settings: Settings) = apply { + this.settings.clear() + this.settings.merge(settings) + } + + /** + * Attempts to perform a web socket upgrade on the connection. + * This will overwrite any previously set status or body. + */ + fun webSocketUpgrade(listener: WebSocketListener) = apply { + status = "HTTP/1.1 101 Switching Protocols" + setHeader("Connection", "Upgrade") + setHeader("Upgrade", "websocket") + body = null + webSocketListener = listener + } + + /** + * Configures this response to be served as a response to an HTTP CONNECT request, either for + * doing HTTPS through an HTTP proxy, or HTTP/2 prior knowledge through an HTTP proxy. + * + * When a new connection is received, all in-tunnel responses are served before the connection is + * upgraded to HTTPS or HTTP/2. + */ + fun inTunnel() = apply { + removeHeader("Content-Length") + inTunnel = true + } + + /** + * Adds an HTTP 1xx response to precede this response. Note that this response's + * [headers delay][headersDelay] applies after this response is transmitted. Set a + * headers delay on that response to delay its transmission. + */ + fun addInformationalResponse(response: MockResponse) = apply { + informationalResponses += response + } + + fun add100Continue() = apply { + addInformationalResponse(MockResponse(code = 100)) + } + + public override fun clone(): Builder = build().newBuilder() + + fun build(): MockResponse = MockResponse(this) + } + companion object { private const val CHUNKED_BODY_HEADER = "Transfer-encoding: chunked" } diff --git a/mockwebserver/src/main/kotlin/mockwebserver3/MockWebServer.kt b/mockwebserver/src/main/kotlin/mockwebserver3/MockWebServer.kt index 4c2732385..7a9b58da6 100644 --- a/mockwebserver/src/main/kotlin/mockwebserver3/MockWebServer.kt +++ b/mockwebserver/src/main/kotlin/mockwebserver3/MockWebServer.kt @@ -357,7 +357,7 @@ class MockWebServer : Closeable { * replaced with [setDispatcher][dispatcher]. */ fun enqueue(response: MockResponse) = - (dispatcher as QueueDispatcher).enqueueResponse(response.clone()) + (dispatcher as QueueDispatcher).enqueueResponse(response) /** * Starts the server on the loopback interface for the given port. @@ -795,9 +795,10 @@ class MockWebServer : Closeable { response: MockResponse ) { val key = request.getHeader("Sec-WebSocket-Key") - response.setHeader("Sec-WebSocket-Accept", WebSocketProtocol.acceptHeader(key!!)) - - writeHttpResponse(socket, sink, response) + val webSocketResponse = response.newBuilder() + .setHeader("Sec-WebSocket-Accept", WebSocketProtocol.acceptHeader(key!!)) + .build() + writeHttpResponse(socket, sink, webSocketResponse) // Adapt the request and response into our Request and Response domain model. val scheme = if (request.tlsVersion != null) "https" else "http" @@ -807,9 +808,9 @@ class MockWebServer : Closeable { .headers(request.headers) .build() val fancyResponse = Response.Builder() - .code(response.code) - .message(response.message) - .headers(response.headers) + .code(webSocketResponse.code) + .message(webSocketResponse.message) + .headers(webSocketResponse.headers) .request(fancyRequest) .protocol(Protocol.HTTP_1_1) .build() @@ -821,13 +822,13 @@ class MockWebServer : Closeable { val webSocket = RealWebSocket( taskRunner = taskRunner, originalRequest = fancyRequest, - listener = response.webSocketListener!!, + listener = webSocketResponse.webSocketListener!!, random = SecureRandom(), pingIntervalMillis = 0, - extensions = WebSocketExtensions.parse(response.headers), + extensions = WebSocketExtensions.parse(webSocketResponse.headers), minimumDeflateSize = 0L // Compress all messages if compression is enabled. ) - response.webSocketListener!!.onOpen(webSocket, fancyResponse) + webSocketResponse.webSocketListener!!.onOpen(webSocket, fancyResponse) val name = "MockWebServer WebSocket ${request.path!!}" webSocket.initReaderAndWriter(name, streams) try { @@ -850,7 +851,7 @@ class MockWebServer : Closeable { writeHeaders(sink, response.headers) - val body = response.getBody() ?: return + val body = response.body ?: return sleepIfDelayed(response.getBodyDelay(TimeUnit.MILLISECONDS)) throttledTransfer(response, socket, body, sink, body.size, false) @@ -1116,7 +1117,7 @@ class MockWebServer : Closeable { val bodyDelayMs = response.getBodyDelay(TimeUnit.MILLISECONDS) val trailers = response.trailers - val body = response.getBody() + val body = response.body val outFinished = (body == null && response.pushPromises.isEmpty() && !response.isDuplex) @@ -1173,7 +1174,7 @@ class MockWebServer : Closeable { socket = socket ) ) - val hasBody = pushPromise.response.getBody() != null + val hasBody = pushPromise.response.body != null val pushedStream = stream.connection.pushStream(stream.id, pushedHeaders, hasBody) writeResponse(pushedStream, request, pushPromise.response) } @@ -1184,10 +1185,10 @@ class MockWebServer : Closeable { init { MwsDuplexAccess.instance = object : MwsDuplexAccess() { override fun setBody( - mockResponse: MockResponse, - duplexResponseBody: DuplexResponseBody + mockResponseBuilder: MockResponse.Builder, + duplexResponseBody: DuplexResponseBody, ) { - mockResponse.setBody(duplexResponseBody) + mockResponseBuilder.body(duplexResponseBody) } } } diff --git a/mockwebserver/src/main/kotlin/mockwebserver3/QueueDispatcher.kt b/mockwebserver/src/main/kotlin/mockwebserver3/QueueDispatcher.kt index 7e38e99c6..2f11931b6 100644 --- a/mockwebserver/src/main/kotlin/mockwebserver3/QueueDispatcher.kt +++ b/mockwebserver/src/main/kotlin/mockwebserver3/QueueDispatcher.kt @@ -34,7 +34,7 @@ open class QueueDispatcher : Dispatcher() { val requestLine = request.requestLine if (requestLine == "GET /favicon.ico HTTP/1.1") { logger.info("served $requestLine") - return MockResponse().setResponseCode(HttpURLConnection.HTTP_NOT_FOUND) + return MockResponse(code = HttpURLConnection.HTTP_NOT_FOUND) } if (failFastResponse != null && responseQueue.peek() == null) { @@ -69,7 +69,7 @@ open class QueueDispatcher : Dispatcher() { open fun setFailFast(failFast: Boolean) { val failFastResponse = if (failFast) { - MockResponse().setResponseCode(HttpURLConnection.HTTP_NOT_FOUND) + MockResponse(code = HttpURLConnection.HTTP_NOT_FOUND) } else { null } @@ -85,9 +85,7 @@ open class QueueDispatcher : Dispatcher() { * Enqueued on shutdown to release threads waiting on [dispatch]. Note that this response * isn't transmitted because the connection is closed before this response is returned. */ - private val DEAD_LETTER = MockResponse().apply { - this.status = "HTTP/1.1 $HTTP_UNAVAILABLE shutting down" - } + private val DEAD_LETTER = MockResponse(code = HTTP_UNAVAILABLE) private val logger = Logger.getLogger(QueueDispatcher::class.java.name) } diff --git a/mockwebserver/src/main/kotlin/okhttp3/internal/duplex/MwsDuplexAccess.kt b/mockwebserver/src/main/kotlin/okhttp3/internal/duplex/MwsDuplexAccess.kt index 33e71b170..330371a6e 100644 --- a/mockwebserver/src/main/kotlin/okhttp3/internal/duplex/MwsDuplexAccess.kt +++ b/mockwebserver/src/main/kotlin/okhttp3/internal/duplex/MwsDuplexAccess.kt @@ -24,7 +24,10 @@ import mockwebserver3.internal.duplex.DuplexResponseBody */ abstract class MwsDuplexAccess { - abstract fun setBody(mockResponse: MockResponse, duplexResponseBody: DuplexResponseBody) + abstract fun setBody( + mockResponseBuilder: MockResponse.Builder, + duplexResponseBody: DuplexResponseBody, + ) companion object { @JvmField var instance: MwsDuplexAccess? = null diff --git a/mockwebserver/src/test/java/mockwebserver3/MockWebServerTest.java b/mockwebserver/src/test/java/mockwebserver3/MockWebServerTest.java index 82243a6b1..da03bdebf 100644 --- a/mockwebserver/src/test/java/mockwebserver3/MockWebServerTest.java +++ b/mockwebserver/src/test/java/mockwebserver3/MockWebServerTest.java @@ -51,7 +51,6 @@ import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Timeout; import org.junit.jupiter.api.extension.RegisterExtension; - import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Arrays.asList; import static java.util.concurrent.TimeUnit.MILLISECONDS; @@ -83,9 +82,9 @@ public final class MockWebServerTest { } @Test public void defaultMockResponse() { - MockResponse response = new MockResponse(); - assertThat(headersToList(response)).containsExactly("Content-Length: 0"); - assertThat(response.getStatus()).isEqualTo("HTTP/1.1 200 OK"); + MockResponse.Builder builder = new MockResponse.Builder(); + assertThat(headersToList(builder)).containsExactly("Content-Length: 0"); + assertThat(builder.getStatus()).isEqualTo("HTTP/1.1 200 OK"); } @Test public void setResponseMockReason() { @@ -99,56 +98,57 @@ public final class MockWebServerTest { "Mock Response" }; for (int i = 0; i < 600; i++) { - MockResponse response = new MockResponse().setResponseCode(i); + MockResponse.Builder builder = new MockResponse.Builder().code(i); String expectedReason = reasons[i / 100]; - assertThat(response.getStatus()).isEqualTo(("HTTP/1.1 " + i + " " + expectedReason)); - assertThat(headersToList(response)).containsExactly("Content-Length: 0"); + assertThat(builder.getStatus()).isEqualTo(("HTTP/1.1 " + i + " " + expectedReason)); + assertThat(headersToList(builder)).containsExactly("Content-Length: 0"); } } @Test public void setStatusControlsWholeStatusLine() { - MockResponse response = new MockResponse().setStatus("HTTP/1.1 202 That'll do pig"); - assertThat(headersToList(response)).containsExactly("Content-Length: 0"); - assertThat(response.getStatus()).isEqualTo("HTTP/1.1 202 That'll do pig"); + MockResponse.Builder builder = new MockResponse.Builder().status("HTTP/1.1 202 That'll do pig"); + assertThat(headersToList(builder)).containsExactly("Content-Length: 0"); + assertThat(builder.getStatus()).isEqualTo("HTTP/1.1 202 That'll do pig"); } @Test public void setBodyAdjustsHeaders() throws IOException { - MockResponse response = new MockResponse().setBody("ABC"); - assertThat(headersToList(response)).containsExactly("Content-Length: 3"); + MockResponse.Builder builder = new MockResponse.Builder().body("ABC"); + assertThat(headersToList(builder)).containsExactly("Content-Length: 3"); + MockResponse response = builder.build(); assertThat(response.getBody().readUtf8()).isEqualTo("ABC"); } @Test public void mockResponseAddHeader() { - MockResponse response = new MockResponse() + MockResponse.Builder builder = new MockResponse.Builder() .clearHeaders() .addHeader("Cookie: s=square") .addHeader("Cookie", "a=android"); - assertThat(headersToList(response)).containsExactly("Cookie: s=square", "Cookie: a=android"); + assertThat(headersToList(builder)).containsExactly("Cookie: s=square", "Cookie: a=android"); } @Test public void mockResponseSetHeader() { - MockResponse response = new MockResponse() + MockResponse.Builder builder = new MockResponse.Builder() .clearHeaders() .addHeader("Cookie: s=square") .addHeader("Cookie: a=android") .addHeader("Cookies: delicious"); - response.setHeader("cookie", "r=robot"); - assertThat(headersToList(response)).containsExactly("Cookies: delicious", "cookie: r=robot"); + builder.setHeader("cookie", "r=robot"); + assertThat(headersToList(builder)).containsExactly("Cookies: delicious", "cookie: r=robot"); } @Test public void mockResponseSetHeaders() { - MockResponse response = new MockResponse() + MockResponse.Builder builder = new MockResponse.Builder() .clearHeaders() .addHeader("Cookie: s=square") .addHeader("Cookies: delicious"); - response.setHeaders(new Headers.Builder().add("Cookie", "a=android").build()); + builder.headers(new Headers.Builder().add("Cookie", "a=android").build()); - assertThat(headersToList(response)).containsExactly("Cookie: a=android"); + assertThat(headersToList(builder)).containsExactly("Cookie: a=android"); } @Test public void regularResponse() throws Exception { - server.enqueue(new MockResponse().setBody("hello world")); + server.enqueue(new MockResponse.Builder().body("hello world").build()); URL url = server.url("/").url(); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); @@ -167,11 +167,14 @@ public final class MockWebServerTest { } @Test public void redirect() throws Exception { - server.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_MOVED_TEMP) .addHeader("Location: " + server.url("/new-path")) - .setBody("This page has moved!")); - server.enqueue(new MockResponse().setBody("This is the new location!")); + .body("This page has moved!") + .build()); + server.enqueue(new MockResponse.Builder() + .body("This is the new location!") + .build()); URLConnection connection = server.url("/").url().openConnection(); InputStream in = connection.getInputStream(); @@ -194,7 +197,9 @@ public final class MockWebServerTest { Thread.sleep(1000); } catch (InterruptedException ignored) { } - server.enqueue(new MockResponse().setBody("enqueued in the background")); + server.enqueue(new MockResponse.Builder() + .body("enqueued in the background") + .build()); }).start(); URLConnection connection = server.url("/").url().openConnection(); @@ -204,10 +209,11 @@ public final class MockWebServerTest { } @Test public void nonHexadecimalChunkSize() throws Exception { - server.enqueue(new MockResponse() - .setBody("G\r\nxxxxxxxxxxxxxxxx\r\n0\r\n\r\n") + server.enqueue(new MockResponse.Builder() + .body("G\r\nxxxxxxxxxxxxxxxx\r\n0\r\n\r\n") .clearHeaders() - .addHeader("Transfer-encoding: chunked")); + .addHeader("Transfer-encoding: chunked") + .build()); URLConnection connection = server.url("/").url().openConnection(); InputStream in = connection.getInputStream(); @@ -219,11 +225,14 @@ public final class MockWebServerTest { } @Test public void responseTimeout() throws Exception { - server.enqueue(new MockResponse() - .setBody("ABC") + server.enqueue(new MockResponse.Builder() + .body("ABC") .clearHeaders() - .addHeader("Content-Length: 4")); - server.enqueue(new MockResponse().setBody("DEF")); + .addHeader("Content-Length: 4") + .build()); + server.enqueue(new MockResponse.Builder() + .body("DEF") + .build()); URLConnection urlConnection = server.url("/").url().openConnection(); urlConnection.setReadTimeout(1000); @@ -250,7 +259,9 @@ public final class MockWebServerTest { @Disabled("Not actually failing where expected") @Test public void disconnectAtStart() throws Exception { - server.enqueue(new MockResponse().setSocketPolicy(SocketPolicy.DISCONNECT_AT_START)); + server.enqueue(new MockResponse.Builder() + .socketPolicy(SocketPolicy.DISCONNECT_AT_START) + .build()); server.enqueue(new MockResponse()); // The jdk's HttpUrlConnection is a bastard. server.enqueue(new MockResponse()); try { @@ -262,9 +273,13 @@ public final class MockWebServerTest { } @Test public void clearDispatcherQueue() throws Exception { - server.enqueue(new MockResponse().setBody("A")); + server.enqueue(new MockResponse.Builder() + .body("A") + .build()); ((QueueDispatcher) server.getDispatcher()).clear(); - server.enqueue(new MockResponse().setBody("B")); + server.enqueue(new MockResponse.Builder() + .body("B") + .build()); InputStream in = server.url("/a").url().openConnection().getInputStream(); assertThat(in.read()).isEqualTo('B'); @@ -277,8 +292,9 @@ public final class MockWebServerTest { @Test public void throttleRequest() throws Exception { TestUtil.assumeNotWindows(); - server.enqueue(new MockResponse() - .throttleBody(3, 500, TimeUnit.MILLISECONDS)); + server.enqueue(new MockResponse.Builder() + .throttleBody(3, 500, TimeUnit.MILLISECONDS) + .build()); long startNanos = System.nanoTime(); URLConnection connection = server.url("/").url().openConnection(); @@ -298,9 +314,10 @@ public final class MockWebServerTest { @Test public void throttleResponse() throws Exception { TestUtil.assumeNotWindows(); - server.enqueue(new MockResponse() - .setBody("ABCDEF") - .throttleBody(3, 500, TimeUnit.MILLISECONDS)); + server.enqueue(new MockResponse.Builder() + .body("ABCDEF") + .throttleBody(3, 500, TimeUnit.MILLISECONDS) + .build()); long startNanos = System.nanoTime(); URLConnection connection = server.url("/").url().openConnection(); @@ -321,9 +338,10 @@ public final class MockWebServerTest { @Test public void delayResponse() throws IOException { TestUtil.assumeNotWindows(); - server.enqueue(new MockResponse() - .setBody("ABCDEF") - .setBodyDelay(1, SECONDS)); + server.enqueue(new MockResponse.Builder() + .body("ABCDEF") + .bodyDelay(1, SECONDS) + .build()); long startNanos = System.nanoTime(); URLConnection connection = server.url("/").url().openConnection(); @@ -337,7 +355,9 @@ public final class MockWebServerTest { } @Test public void disconnectRequestHalfway() throws Exception { - server.enqueue(new MockResponse().setSocketPolicy(SocketPolicy.DISCONNECT_DURING_REQUEST_BODY)); + server.enqueue(new MockResponse.Builder() + .socketPolicy(SocketPolicy.DISCONNECT_DURING_REQUEST_BODY) + .build()); // Limit the size of the request body that the server holds in memory to an arbitrary // 3.5 MBytes so this test can pass on devices with little memory. server.setBodyLimit(7 * 512 * 1024); @@ -368,9 +388,10 @@ public final class MockWebServerTest { } @Test public void disconnectResponseHalfway() throws IOException { - server.enqueue(new MockResponse() - .setBody("ab") - .setSocketPolicy(SocketPolicy.DISCONNECT_DURING_RESPONSE_BODY)); + server.enqueue(new MockResponse.Builder() + .body("ab") + .socketPolicy(SocketPolicy.DISCONNECT_DURING_RESPONSE_BODY) + .build()); URLConnection connection = server.url("/").url().openConnection(); assertThat(connection.getContentLength()).isEqualTo(2); @@ -386,8 +407,8 @@ public final class MockWebServerTest { } } - private List headersToList(MockResponse response) { - Headers headers = response.getHeaders(); + private List headersToList(MockResponse.Builder response) { + Headers headers = response.build().getHeaders(); int size = headers.size(); List headerList = new ArrayList<>(size); for (int i = 0; i < size; i++) { @@ -445,7 +466,9 @@ public final class MockWebServerTest { } @Test public void requestUrlReconstructed() throws Exception { - server.enqueue(new MockResponse().setBody("hello world")); + server.enqueue(new MockResponse.Builder() + .body("hello world") + .build()); URL url = server.url("/a/deep/path?key=foo%20bar").url(); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); @@ -467,7 +490,9 @@ public final class MockWebServerTest { } @Test public void shutdownServerAfterRequest() throws Exception { - server.enqueue(new MockResponse().setSocketPolicy(SocketPolicy.SHUTDOWN_SERVER_AFTER_RESPONSE)); + server.enqueue(new MockResponse.Builder() + .socketPolicy(SocketPolicy.SHUTDOWN_SERVER_AFTER_RESPONSE) + .build()); URL url = server.url("/").url(); @@ -485,7 +510,9 @@ public final class MockWebServerTest { } @Test public void http100Continue() throws Exception { - server.enqueue(new MockResponse().setBody("response")); + server.enqueue(new MockResponse.Builder() + .body("response") + .build()); URL url = server.url("/").url(); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); @@ -502,10 +529,11 @@ public final class MockWebServerTest { } @Test public void multiple1xxResponses() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .add100Continue() .add100Continue() - .setBody("response")); + .body("response") + .build()); URL url = server.url("/").url(); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); @@ -553,7 +581,9 @@ public final class MockWebServerTest { @Test public void https() throws Exception { HandshakeCertificates handshakeCertificates = localhost(); server.useHttps(handshakeCertificates.sslSocketFactory()); - server.enqueue(new MockResponse().setBody("abc")); + server.enqueue(new MockResponse.Builder() + .body("abc") + .build()); HttpUrl url = server.url("/"); HttpsURLConnection connection = (HttpsURLConnection) url.url().openConnection(); @@ -595,7 +625,9 @@ public final class MockWebServerTest { .build(); server.useHttps(serverHandshakeCertificates.sslSocketFactory()); - server.enqueue(new MockResponse().setBody("abc")); + server.enqueue(new MockResponse.Builder() + .body("abc") + .build()); server.requestClientAuth(); HeldCertificate clientCertificate = new HeldCertificate.Builder() @@ -628,7 +660,9 @@ public final class MockWebServerTest { } @Test public void proxiedRequestGetsCorrectRequestUrl() throws Exception { - server.enqueue(new MockResponse().setBody("Result")); + server.enqueue(new MockResponse.Builder() + .body("Result") + .build()); OkHttpClient proxiedClient = new OkHttpClient.Builder() .proxy(server.toProxyAddress()) diff --git a/okhttp-coroutines/src/jvmTest/kotlin/okhttp3/SuspendCallTest.kt b/okhttp-coroutines/src/jvmTest/kotlin/okhttp3/SuspendCallTest.kt index e5f8662aa..785613169 100644 --- a/okhttp-coroutines/src/jvmTest/kotlin/okhttp3/SuspendCallTest.kt +++ b/okhttp-coroutines/src/jvmTest/kotlin/okhttp3/SuspendCallTest.kt @@ -39,7 +39,6 @@ import org.junit.jupiter.api.fail import java.io.IOException import java.util.concurrent.TimeUnit import kotlin.time.Duration.Companion.seconds -import kotlin.time.ExperimentalTime import org.junit.jupiter.api.BeforeEach @ExtendWith(MockWebServerExtension::class) @@ -61,7 +60,7 @@ class SuspendCallTest { @Test fun suspendCall() { runTest { - server.enqueue(MockResponse().setBody("abc")) + server.enqueue(MockResponse(body = "abc")) val call = client.newCall(request) @@ -77,9 +76,10 @@ class SuspendCallTest { fun timeoutCall() { runTest { server.enqueue( - MockResponse() - .setBodyDelay(5, TimeUnit.SECONDS) - .setBody("abc") + MockResponse.Builder() + .bodyDelay(5, TimeUnit.SECONDS) + .body("abc") + .build() ) val call = client.newCall(request) @@ -105,9 +105,10 @@ class SuspendCallTest { fun cancelledCall() { runTest { server.enqueue( - MockResponse() - .setBodyDelay(5, TimeUnit.SECONDS) - .setBody("abc") + MockResponse.Builder() + .bodyDelay(5, TimeUnit.SECONDS) + .body("abc") + .build() ) val call = client.newCall(request) @@ -132,9 +133,10 @@ class SuspendCallTest { fun failedCall() { runTest { server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.DISCONNECT_AFTER_REQUEST) - .setBody("abc") + MockResponse( + body = "abc", + socketPolicy = SocketPolicy.DISCONNECT_AFTER_REQUEST, + ) ) val call = client.newCall(request) diff --git a/okhttp-dnsoverhttps/src/test/java/okhttp3/dnsoverhttps/DnsOverHttpsTest.java b/okhttp-dnsoverhttps/src/test/java/okhttp3/dnsoverhttps/DnsOverHttpsTest.java index c55e9d9c4..b5da35a5e 100644 --- a/okhttp-dnsoverhttps/src/test/java/okhttp3/dnsoverhttps/DnsOverHttpsTest.java +++ b/okhttp-dnsoverhttps/src/test/java/okhttp3/dnsoverhttps/DnsOverHttpsTest.java @@ -178,7 +178,10 @@ public class DnsOverHttpsTest { server.enqueue(dnsResponse( "0000818000010003000000000567726170680866616365626f6f6b03636f6d0000010001c00c00050001" + "00000a6d000603617069c012c0300005000100000cde000c04737461720463313072c012c04200010" - + "0010000003b00049df00112").setHeader("cache-control", "private, max-age=298")); + + "0010000003b00049df00112") + .newBuilder() + .setHeader("cache-control", "private, max-age=298") + .build()); List result = cachedDns.lookup("google.com"); @@ -201,7 +204,10 @@ public class DnsOverHttpsTest { server.enqueue(dnsResponse( "0000818000010003000000000567726170680866616365626f6f6b03636f6d0000010001c00c00050001" + "00000a6d000603617069c012c0300005000100000cde000c04737461720463313072c012c04200010" - + "0010000003b00049df00112").setHeader("cache-control", "max-age=1")); + + "0010000003b00049df00112") + .newBuilder() + .setHeader("cache-control", "max-age=1") + .build()); List result = cachedDns.lookup("google.com"); @@ -217,7 +223,10 @@ public class DnsOverHttpsTest { server.enqueue(dnsResponse( "0000818000010003000000000567726170680866616365626f6f6b03636f6d0000010001c00c00050001" + "00000a6d000603617069c012c0300005000100000cde000c04737461720463313072c012c04200010" - + "0010000003b00049df00112").setHeader("cache-control", "max-age=1")); + + "0010000003b00049df00112") + .newBuilder() + .setHeader("cache-control", "max-age=1") + .build()); result = cachedDns.lookup("google.com"); assertThat(result).isEqualTo(singletonList(address("157.240.1.18"))); @@ -229,9 +238,11 @@ public class DnsOverHttpsTest { } private MockResponse dnsResponse(String s) { - return new MockResponse().setBody(new Buffer().write(ByteString.decodeHex(s))) + return new MockResponse.Builder() + .body(new Buffer().write(ByteString.decodeHex(s))) .addHeader("content-type", "application/dns-message") - .addHeader("content-length", s.length() / 2); + .addHeader("content-length", s.length() / 2) + .build(); } private DnsOverHttps buildLocalhost(OkHttpClient bootstrapClient, boolean includeIPv6) { diff --git a/okhttp-logging-interceptor/src/test/java/okhttp3/logging/HttpLoggingInterceptorTest.java b/okhttp-logging-interceptor/src/test/java/okhttp3/logging/HttpLoggingInterceptorTest.java index 0eddae34f..32e2127fd 100644 --- a/okhttp-logging-interceptor/src/test/java/okhttp3/logging/HttpLoggingInterceptorTest.java +++ b/okhttp-logging-interceptor/src/test/java/okhttp3/logging/HttpLoggingInterceptorTest.java @@ -167,9 +167,10 @@ public final class HttpLoggingInterceptorTest { @Test public void basicResponseBody() throws IOException { setLevel(Level.BASIC); - server.enqueue(new MockResponse() - .setBody("Hello!") - .setHeader("Content-Type", PLAIN)); + server.enqueue(new MockResponse.Builder() + .body("Hello!") + .setHeader("Content-Type", PLAIN) + .build()); Response response = client.newCall(request().build()).execute(); response.body().close(); @@ -187,9 +188,10 @@ public final class HttpLoggingInterceptorTest { @Test public void basicChunkedResponseBody() throws IOException { setLevel(Level.BASIC); - server.enqueue(new MockResponse() - .setChunkedBody("Hello!", 2) - .setHeader("Content-Type", PLAIN)); + server.enqueue(new MockResponse.Builder() + .chunkedBody("Hello!", 2) + .setHeader("Content-Type", PLAIN) + .build()); Response response = client.newCall(request().build()).execute(); response.body().close(); @@ -378,9 +380,10 @@ public final class HttpLoggingInterceptorTest { @Test public void headersResponseBody() throws IOException { setLevel(Level.HEADERS); - server.enqueue(new MockResponse() - .setBody("Hello!") - .setHeader("Content-Type", PLAIN)); + server.enqueue(new MockResponse.Builder() + .body("Hello!") + .setHeader("Content-Type", PLAIN) + .build()); Response response = client.newCall(request().build()).execute(); response.body().close(); @@ -446,8 +449,9 @@ public final class HttpLoggingInterceptorTest { } private void bodyGetNoBody(int code) throws IOException { - server.enqueue(new MockResponse() - .setStatus("HTTP/1.1 " + code + " No Content")); + server.enqueue(new MockResponse.Builder() + .status("HTTP/1.1 " + code + " No Content") + .build()); Response response = client.newCall(request().build()).execute(); response.body().close(); @@ -512,9 +516,10 @@ public final class HttpLoggingInterceptorTest { @Test public void bodyResponseBody() throws IOException { setLevel(Level.BODY); - server.enqueue(new MockResponse() - .setBody("Hello!") - .setHeader("Content-Type", PLAIN)); + server.enqueue(new MockResponse.Builder() + .body("Hello!") + .setHeader("Content-Type", PLAIN) + .build()); Response response = client.newCall(request().build()).execute(); response.body().close(); @@ -548,9 +553,10 @@ public final class HttpLoggingInterceptorTest { @Test public void bodyResponseBodyChunked() throws IOException { setLevel(Level.BODY); - server.enqueue(new MockResponse() - .setChunkedBody("Hello!", 2) - .setHeader("Content-Type", PLAIN)); + server.enqueue(new MockResponse.Builder() + .chunkedBody("Hello!", 2) + .setHeader("Content-Type", PLAIN) + .build()); Response response = client.newCall(request().build()).execute(); response.body().close(); @@ -584,9 +590,10 @@ public final class HttpLoggingInterceptorTest { @Test public void bodyRequestGzipEncoded() throws IOException { setLevel(Level.BODY); - server.enqueue(new MockResponse() - .setHeader("Content-Type", PLAIN) - .setBody(new Buffer().writeUtf8("Uncompressed"))); + server.enqueue(new MockResponse.Builder() + .setHeader("Content-Type", PLAIN) + .body(new Buffer().writeUtf8("Uncompressed")) + .build()); Response response = client.newCall(request() .addHeader("Content-Encoding", "gzip") @@ -620,11 +627,12 @@ public final class HttpLoggingInterceptorTest { @Test public void bodyResponseGzipEncoded() throws IOException { setLevel(Level.BODY); - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .setHeader("Content-Encoding", "gzip") .setHeader("Content-Type", PLAIN) - .setBody(new Buffer().write(ByteString.decodeBase64( - "H4sIAAAAAAAAAPNIzcnJ11HwQKIAdyO+9hMAAAA=")))); + .body(new Buffer().write(ByteString.decodeBase64( + "H4sIAAAAAAAAAPNIzcnJ11HwQKIAdyO+9hMAAAA="))) + .build()); Response response = client.newCall(request().build()).execute(); ResponseBody responseBody = response.body(); @@ -662,12 +670,13 @@ public final class HttpLoggingInterceptorTest { @Test public void bodyResponseUnknownEncoded() throws IOException { setLevel(Level.BODY); - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() // It's invalid to return this if not requested, but the server might anyway .setHeader("Content-Encoding", "br") .setHeader("Content-Type", PLAIN) - .setBody(new Buffer().write(ByteString.decodeBase64( - "iwmASGVsbG8sIEhlbGxvLCBIZWxsbwoD")))); + .body(new Buffer().write(ByteString.decodeBase64( + "iwmASGVsbG8sIEhlbGxvLCBIZWxsbwoD"))) + .build()); Response response = client.newCall(request().build()).execute(); response.body().close(); @@ -699,9 +708,9 @@ public final class HttpLoggingInterceptorTest { @Test public void bodyResponseIsStreaming() throws IOException { setLevel(Level.BODY); - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .setHeader("Content-Type", "text/event-stream") - .setChunkedBody("" + .chunkedBody("" + "event: add\n" + "data: 73857293\n" + "\n" @@ -711,6 +720,7 @@ public final class HttpLoggingInterceptorTest { + "event: add\n" + "data: 113411\n" + "\n", 8) + .build() ); Response response = client.newCall(request().build()).execute(); response.body().close(); @@ -741,9 +751,10 @@ public final class HttpLoggingInterceptorTest { @Test public void bodyGetMalformedCharset() throws IOException { setLevel(Level.BODY); - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .setHeader("Content-Type", "text/html; charset=0") - .setBody("Body with unknown charset")); + .body("Body with unknown charset") + .build()); Response response = client.newCall(request().build()).execute(); response.body().close(); @@ -785,9 +796,10 @@ public final class HttpLoggingInterceptorTest { buffer.writeUtf8CodePoint(0x0a); buffer.writeUtf8CodePoint(0x1a); buffer.writeUtf8CodePoint(0x0a); - server.enqueue(new MockResponse() - .setBody(buffer) - .setHeader("Content-Type", "image/png; charset=utf-8")); + server.enqueue(new MockResponse.Builder() + .body(buffer) + .setHeader("Content-Type", "image/png; charset=utf-8") + .build()); Response response = client.newCall(request().build()).execute(); response.body().close(); @@ -874,8 +886,9 @@ public final class HttpLoggingInterceptorTest { .addInterceptor(applicationInterceptor) .build(); - server.enqueue( - new MockResponse().addHeader("SeNsItIvE", "Value").addHeader("Not-Sensitive", "Value")); + server.enqueue(new MockResponse.Builder() + .addHeader("SeNsItIvE", "Value").addHeader("Not-Sensitive", "Value") + .build()); Response response = client .newCall( @@ -924,8 +937,9 @@ public final class HttpLoggingInterceptorTest { setLevel(Level.BODY); - server.enqueue(new MockResponse() - .setBody("Hello response!")); + server.enqueue(new MockResponse.Builder() + .body("Hello response!") + .build()); RequestBody asyncRequestBody = new RequestBody() { @Override public @Nullable MediaType contentType() { @@ -966,8 +980,9 @@ public final class HttpLoggingInterceptorTest { setLevel(Level.BODY); - server.enqueue(new MockResponse() - .setBody("Hello response!")); + server.enqueue(new MockResponse.Builder() + .body("Hello response!") + .build()); RequestBody asyncRequestBody = new RequestBody() { @Override public @Nullable MediaType contentType() { diff --git a/okhttp-logging-interceptor/src/test/java/okhttp3/logging/LoggingEventListenerTest.java b/okhttp-logging-interceptor/src/test/java/okhttp3/logging/LoggingEventListenerTest.java index b14ee3114..1d274942b 100644 --- a/okhttp-logging-interceptor/src/test/java/okhttp3/logging/LoggingEventListenerTest.java +++ b/okhttp-logging-interceptor/src/test/java/okhttp3/logging/LoggingEventListenerTest.java @@ -77,7 +77,10 @@ public final class LoggingEventListenerTest { public void get() throws Exception { TestUtil.assumeNotWindows(); - server.enqueue(new MockResponse().setBody("Hello!").setHeader("Content-Type", PLAIN)); + server.enqueue(new MockResponse.Builder() + .body("Hello!") + .setHeader("Content-Type", PLAIN) + .build()); Response response = client.newCall(request().build()).execute(); assertThat(response.body()).isNotNull(); response.body().bytes(); @@ -223,7 +226,9 @@ public final class LoggingEventListenerTest { server.useHttps(handshakeCertificates.sslSocketFactory()); server.setProtocols(asList(HTTP_2, HTTP_1_1)); - server.enqueue(new MockResponse().setSocketPolicy(SocketPolicy.FAIL_HANDSHAKE)); + server.enqueue(new MockResponse.Builder() + .socketPolicy(SocketPolicy.FAIL_HANDSHAKE) + .build()); url = server.url("/"); try { diff --git a/okhttp-sse/src/test/java/okhttp3/sse/internal/EventSourceHttpTest.java b/okhttp-sse/src/test/java/okhttp3/sse/internal/EventSourceHttpTest.java index e76293885..4c3d0110f 100644 --- a/okhttp-sse/src/test/java/okhttp3/sse/internal/EventSourceHttpTest.java +++ b/okhttp-sse/src/test/java/okhttp3/sse/internal/EventSourceHttpTest.java @@ -56,9 +56,11 @@ public final class EventSourceHttpTest { } @Test public void event() { - server.enqueue(new MockResponse().setBody("" - + "data: hey\n" - + "\n").setHeader("content-type", "text/event-stream")); + server.enqueue(new MockResponse.Builder() + .body("" + + "data: hey\n" + + "\n").setHeader("content-type", "text/event-stream") + .build()); EventSource source = newEventSource(); @@ -70,9 +72,11 @@ public final class EventSourceHttpTest { } @Test public void cancelInEventShortCircuits() throws IOException { - server.enqueue(new MockResponse().setBody("" - + "data: hey\n" - + "\n").setHeader("content-type", "text/event-stream")); + server.enqueue(new MockResponse.Builder() + .body("" + + "data: hey\n" + + "\n").setHeader("content-type", "text/event-stream") + .build()); listener.enqueueCancel(); // Will cancel in onOpen(). newEventSource(); @@ -81,18 +85,24 @@ public final class EventSourceHttpTest { } @Test public void badContentType() { - server.enqueue(new MockResponse().setBody("" - + "data: hey\n" - + "\n").setHeader("content-type", "text/plain")); + server.enqueue(new MockResponse.Builder() + .body("" + + "data: hey\n" + + "\n").setHeader("content-type", "text/plain") + .build()); newEventSource(); listener.assertFailure("Invalid content-type: text/plain"); } @Test public void badResponseCode() { - server.enqueue(new MockResponse().setBody("" - + "data: hey\n" - + "\n").setHeader("content-type", "text/event-stream").setResponseCode(401)); + server.enqueue(new MockResponse.Builder() + .body("" + + "data: hey\n" + + "\n") + .setHeader("content-type", "text/event-stream") + .code(401) + .build()); newEventSource(); listener.assertFailure(null); @@ -103,10 +113,11 @@ public final class EventSourceHttpTest { .callTimeout(250, TimeUnit.MILLISECONDS) .build(); - server.enqueue(new MockResponse() - .setBodyDelay(500, TimeUnit.MILLISECONDS) + server.enqueue(new MockResponse.Builder() + .bodyDelay(500, TimeUnit.MILLISECONDS) .setHeader("content-type", "text/event-stream") - .setBody("data: hey\n\n")); + .body("data: hey\n\n") + .build()); EventSource source = newEventSource(); @@ -122,19 +133,22 @@ public final class EventSourceHttpTest { .callTimeout(250, TimeUnit.MILLISECONDS) .build(); - server.enqueue(new MockResponse() - .setHeadersDelay(500, TimeUnit.MILLISECONDS) + server.enqueue(new MockResponse.Builder() + .headersDelay(500, TimeUnit.MILLISECONDS) .setHeader("content-type", "text/event-stream") - .setBody("data: hey\n\n")); + .body("data: hey\n\n") + .build()); newEventSource(); listener.assertFailure("timeout"); } @Test public void retainsAccept() throws InterruptedException { - server.enqueue(new MockResponse().setBody("" - + "data: hey\n" - + "\n").setHeader("content-type", "text/event-stream")); + server.enqueue(new MockResponse.Builder() + .body("" + + "data: hey\n" + + "\n").setHeader("content-type", "text/event-stream") + .build()); EventSource source = newEventSource("text/plain"); @@ -146,9 +160,11 @@ public final class EventSourceHttpTest { } @Test public void setsMissingAccept() throws InterruptedException { - server.enqueue(new MockResponse().setBody("" - + "data: hey\n" - + "\n").setHeader("content-type", "text/event-stream")); + server.enqueue(new MockResponse.Builder() + .body("" + + "data: hey\n" + + "\n").setHeader("content-type", "text/event-stream") + .build()); EventSource source = newEventSource(); diff --git a/okhttp-sse/src/test/java/okhttp3/sse/internal/EventSourcesHttpTest.java b/okhttp-sse/src/test/java/okhttp3/sse/internal/EventSourcesHttpTest.java index 1353ea19b..9383e2b7a 100644 --- a/okhttp-sse/src/test/java/okhttp3/sse/internal/EventSourcesHttpTest.java +++ b/okhttp-sse/src/test/java/okhttp3/sse/internal/EventSourcesHttpTest.java @@ -52,9 +52,11 @@ public final class EventSourcesHttpTest { } @Test public void processResponse() throws IOException { - server.enqueue(new MockResponse().setBody("" - + "data: hey\n" - + "\n").setHeader("content-type", "text/event-stream")); + server.enqueue(new MockResponse.Builder() + .body("" + + "data: hey\n" + + "\n").setHeader("content-type", "text/event-stream") + .build()); Request request = new Request.Builder() .url(server.url("/")) @@ -68,9 +70,11 @@ public final class EventSourcesHttpTest { } @Test public void cancelShortCircuits() throws IOException { - server.enqueue(new MockResponse().setBody("" - + "data: hey\n" - + "\n").setHeader("content-type", "text/event-stream")); + server.enqueue(new MockResponse.Builder() + .body("" + + "data: hey\n" + + "\n").setHeader("content-type", "text/event-stream") + .build()); listener.enqueueCancel(); // Will cancel in onOpen(). Request request = new Request.Builder() diff --git a/okhttp/src/jvmTest/java/okhttp3/CacheCorruptionTest.kt b/okhttp/src/jvmTest/java/okhttp3/CacheCorruptionTest.kt index be0bc4a47..86e619a69 100644 --- a/okhttp/src/jvmTest/java/okhttp3/CacheCorruptionTest.kt +++ b/okhttp/src/jvmTest/java/okhttp3/CacheCorruptionTest.kt @@ -15,8 +15,19 @@ */ package okhttp3 +import java.net.CookieManager +import java.net.ResponseCache +import java.text.DateFormat +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale +import java.util.TimeZone +import java.util.concurrent.TimeUnit +import javax.net.ssl.HostnameVerifier +import javax.net.ssl.SSLSession import mockwebserver3.MockResponse import mockwebserver3.MockWebServer +import okhttp3.Headers.Companion.headersOf import okhttp3.internal.buildCache import okhttp3.okio.LoggingFilesystem import okhttp3.testing.PlatformRule @@ -28,16 +39,6 @@ import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.RegisterExtension -import java.net.CookieManager -import java.net.ResponseCache -import java.text.DateFormat -import java.text.SimpleDateFormat -import java.util.Date -import java.util.Locale -import java.util.TimeZone -import java.util.concurrent.TimeUnit -import javax.net.ssl.HostnameVerifier -import javax.net.ssl.SSLSession class CacheCorruptionTest { var fileSystem = FakeFileSystem() @@ -145,16 +146,22 @@ class CacheCorruptionTest { private fun testCorruptingCache(corruptor: () -> Unit): Response { server.useHttps(handshakeCertificates.sslSocketFactory()) server.enqueue( - MockResponse() - .addHeader("Last-Modified: " + formatDate(-1, TimeUnit.HOURS)) - .addHeader("Expires: " + formatDate(1, TimeUnit.HOURS)) - .setBody("ABC.1") + MockResponse( + headers = headersOf( + "Last-Modified", formatDate(-1, TimeUnit.HOURS)!!, + "Expires", formatDate(1, TimeUnit.HOURS)!!, + ), + body = "ABC.1", + ) ) server.enqueue( - MockResponse() - .addHeader("Last-Modified: " + formatDate(-1, TimeUnit.HOURS)) - .addHeader("Expires: " + formatDate(1, TimeUnit.HOURS)) - .setBody("ABC.2") + MockResponse( + headers = headersOf( + "Last-Modified", formatDate(-1, TimeUnit.HOURS)!!, + "Expires", formatDate(1, TimeUnit.HOURS)!!, + ), + body = "ABC.2", + ) ) client = client.newBuilder() .sslSocketFactory( @@ -162,7 +169,7 @@ class CacheCorruptionTest { ) .hostnameVerifier(NULL_HOSTNAME_VERIFIER) .build() - val request: Request = Request(server.url("/")) + val request = Request(server.url("/")) val response1: Response = client.newCall(request).execute() val bodySource = response1.body.source() assertThat(bodySource.readUtf8()).isEqualTo("ABC.1") diff --git a/okhttp/src/jvmTest/java/okhttp3/CacheTest.java b/okhttp/src/jvmTest/java/okhttp3/CacheTest.java index ff73e2df5..e7992d24d 100644 --- a/okhttp/src/jvmTest/java/okhttp3/CacheTest.java +++ b/okhttp/src/jvmTest/java/okhttp3/CacheTest.java @@ -16,7 +16,6 @@ package okhttp3; -import javax.net.ssl.HostnameVerifier; import java.io.IOException; import java.net.CookieManager; import java.net.HttpURLConnection; @@ -26,14 +25,15 @@ import java.security.cert.Certificate; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicReference; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.NoSuchElementException; import java.util.TimeZone; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; +import javax.net.ssl.HostnameVerifier; import mockwebserver3.MockResponse; import mockwebserver3.MockWebServer; import mockwebserver3.RecordedRequest; @@ -56,7 +56,6 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; - import static mockwebserver3.SocketPolicy.DISCONNECT_AT_END; import static okhttp3.internal.Internal.cacheGet; import static okhttp3.tls.internal.TlsUtil.localhost; @@ -169,30 +168,31 @@ public final class CacheTest { int expectedResponseCode = responseCode; server = new MockWebServer(); - MockResponse mockResponse = new MockResponse() + MockResponse.Builder builder = new MockResponse.Builder() .addHeader("Last-Modified: " + formatDate(-1, TimeUnit.HOURS)) .addHeader("Expires: " + formatDate(1, TimeUnit.HOURS)) - .setResponseCode(responseCode) - .setBody("ABCDE") + .code(responseCode) + .body("ABCDE") .addHeader("WWW-Authenticate: challenge"); if (responseCode == HttpURLConnection.HTTP_PROXY_AUTH) { - mockResponse.addHeader("Proxy-Authenticate: Basic realm=\"protected area\""); + builder.addHeader("Proxy-Authenticate: Basic realm=\"protected area\""); } else if (responseCode == HttpURLConnection.HTTP_UNAUTHORIZED) { - mockResponse.addHeader("WWW-Authenticate: Basic realm=\"protected area\""); + builder.addHeader("WWW-Authenticate: Basic realm=\"protected area\""); } else if (responseCode == HttpURLConnection.HTTP_NO_CONTENT || responseCode == HttpURLConnection.HTTP_RESET) { - mockResponse.setBody(""); // We forbid bodies for 204 and 205. + builder.body(""); // We forbid bodies for 204 and 205. } - server.enqueue(mockResponse); + server.enqueue(builder.build()); if (responseCode == HttpURLConnection.HTTP_CLIENT_TIMEOUT) { // 408's are a bit of an outlier because we may repeat the request if we encounter this // response code. In this scenario, there are 2 responses: the initial 408 and then the 200 // because of the retry. We just want to ensure the initial 408 isn't cached. expectedResponseCode = 200; - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .setHeader("Cache-Control", "no-store") - .setBody("FGHIJ")); + .body("FGHIJ") + .build()); } server.start(); @@ -233,12 +233,12 @@ public final class CacheTest { * http://code.google.com/p/android/issues/detail?id=8175 */ private void testResponseCaching(TransferKind transferKind) throws IOException { - MockResponse mockResponse = new MockResponse() + MockResponse.Builder mockResponse = new MockResponse.Builder() .addHeader("Last-Modified: " + formatDate(-1, TimeUnit.HOURS)) .addHeader("Expires: " + formatDate(1, TimeUnit.HOURS)) - .setStatus("HTTP/1.1 200 Fantastic"); + .status("HTTP/1.1 200 Fantastic"); transferKind.setBody(mockResponse, "I love puppies but hate spiders", 1); - server.enqueue(mockResponse); + server.enqueue(mockResponse.build()); // Make sure that calling skip() doesn't omit bytes from the cache. Request request = new Request.Builder().url(server.url("/")).build(); @@ -270,10 +270,11 @@ public final class CacheTest { @Test public void secureResponseCaching() throws IOException { server.useHttps(handshakeCertificates.sslSocketFactory()); - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Last-Modified: " + formatDate(-1, TimeUnit.HOURS)) .addHeader("Expires: " + formatDate(1, TimeUnit.HOURS)) - .setBody("ABC")); + .body("ABC") + .build()); client = client.newBuilder() .sslSocketFactory( @@ -308,17 +309,20 @@ public final class CacheTest { } @Test public void responseCachingAndRedirects() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Last-Modified: " + formatDate(-1, TimeUnit.HOURS)) .addHeader("Expires: " + formatDate(1, TimeUnit.HOURS)) - .setResponseCode(HttpURLConnection.HTTP_MOVED_PERM) - .addHeader("Location: /foo")); - server.enqueue(new MockResponse() + .code(HttpURLConnection.HTTP_MOVED_PERM) + .addHeader("Location: /foo") + .build()); + server.enqueue(new MockResponse.Builder() .addHeader("Last-Modified: " + formatDate(-1, TimeUnit.HOURS)) .addHeader("Expires: " + formatDate(1, TimeUnit.HOURS)) - .setBody("ABC")); - server.enqueue(new MockResponse() - .setBody("DEF")); + .body("ABC") + .build()); + server.enqueue(new MockResponse.Builder() + .body("DEF") + .build()); Request request = new Request.Builder().url(server.url("/")).build(); Response response1 = client.newCall(request).execute(); @@ -334,14 +338,17 @@ public final class CacheTest { } @Test public void redirectToCachedResult() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Cache-Control: max-age=60") - .setBody("ABC")); - server.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_MOVED_PERM) - .addHeader("Location: /foo")); - server.enqueue(new MockResponse() - .setBody("DEF")); + .body("ABC") + .build()); + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_MOVED_PERM) + .addHeader("Location: /foo") + .build()); + server.enqueue(new MockResponse.Builder() + .body("DEF") + .build()); Request request1 = new Request.Builder().url(server.url("/foo")).build(); Response response1 = client.newCall(request1).execute(); @@ -368,17 +375,20 @@ public final class CacheTest { @Test public void secureResponseCachingAndRedirects() throws IOException { server.useHttps(handshakeCertificates.sslSocketFactory()); - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Last-Modified: " + formatDate(-1, TimeUnit.HOURS)) .addHeader("Expires: " + formatDate(1, TimeUnit.HOURS)) - .setResponseCode(HttpURLConnection.HTTP_MOVED_PERM) - .addHeader("Location: /foo")); - server.enqueue(new MockResponse() + .code(HttpURLConnection.HTTP_MOVED_PERM) + .addHeader("Location: /foo") + .build()); + server.enqueue(new MockResponse.Builder() .addHeader("Last-Modified: " + formatDate(-1, TimeUnit.HOURS)) .addHeader("Expires: " + formatDate(1, TimeUnit.HOURS)) - .setBody("ABC")); - server.enqueue(new MockResponse() - .setBody("DEF")); + .body("ABC") + .build()); + server.enqueue(new MockResponse.Builder() + .body("DEF") + .build()); client = client.newBuilder() .sslSocketFactory( @@ -411,18 +421,21 @@ public final class CacheTest { */ @Test public void secureResponseCachingAndProtocolRedirects() throws IOException { server2.useHttps(handshakeCertificates.sslSocketFactory()); - server2.enqueue(new MockResponse() + server2.enqueue(new MockResponse.Builder() .addHeader("Last-Modified: " + formatDate(-1, TimeUnit.HOURS)) .addHeader("Expires: " + formatDate(1, TimeUnit.HOURS)) - .setBody("ABC")); - server2.enqueue(new MockResponse() - .setBody("DEF")); + .body("ABC") + .build()); + server2.enqueue(new MockResponse.Builder() + .body("DEF") + .build()); - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Last-Modified: " + formatDate(-1, TimeUnit.HOURS)) .addHeader("Expires: " + formatDate(1, TimeUnit.HOURS)) - .setResponseCode(HttpURLConnection.HTTP_MOVED_PERM) - .addHeader("Location: " + server2.url("/"))); + .code(HttpURLConnection.HTTP_MOVED_PERM) + .addHeader("Location: " + server2.url("/")) + .build()); client = client.newBuilder() .sslSocketFactory( @@ -468,17 +481,21 @@ public final class CacheTest { private void temporaryRedirectCachedWithCachingHeader( int responseCode, String headerName, String headerValue) throws Exception { - server.enqueue(new MockResponse() - .setResponseCode(responseCode) + server.enqueue(new MockResponse.Builder() + .code(responseCode) .addHeader(headerName, headerValue) - .addHeader("Location", "/a")); - server.enqueue(new MockResponse() + .addHeader("Location", "/a") + .build()); + server.enqueue(new MockResponse.Builder() .addHeader(headerName, headerValue) - .setBody("a")); - server.enqueue(new MockResponse() - .setBody("b")); - server.enqueue(new MockResponse() - .setBody("c")); + .body("a") + .build()); + server.enqueue(new MockResponse.Builder() + .body("b") + .build()); + server.enqueue(new MockResponse.Builder() + .body("c") + .build()); HttpUrl url = server.url("/"); assertThat(get(url).body().string()).isEqualTo("a"); @@ -486,13 +503,16 @@ public final class CacheTest { } private void temporaryRedirectNotCachedWithoutCachingHeader(int responseCode) throws Exception { - server.enqueue(new MockResponse() - .setResponseCode(responseCode) - .addHeader("Location", "/a")); - server.enqueue(new MockResponse() - .setBody("a")); - server.enqueue(new MockResponse() - .setBody("b")); + server.enqueue(new MockResponse.Builder() + .code(responseCode) + .addHeader("Location", "/a") + .build()); + server.enqueue(new MockResponse.Builder() + .body("a") + .build()); + server.enqueue(new MockResponse.Builder() + .body("b") + .build()); HttpUrl url = server.url("/"); assertThat(get(url).body().string()).isEqualTo("a"); @@ -501,14 +521,17 @@ public final class CacheTest { /** https://github.com/square/okhttp/issues/2198 */ @Test public void cachedRedirect() throws IOException { - server.enqueue(new MockResponse() - .setResponseCode(301) + server.enqueue(new MockResponse.Builder() + .code(301) .addHeader("Cache-Control: max-age=60") - .addHeader("Location: /bar")); - server.enqueue(new MockResponse() - .setBody("ABC")); - server.enqueue(new MockResponse() - .setBody("ABC")); + .addHeader("Location: /bar") + .build()); + server.enqueue(new MockResponse.Builder() + .body("ABC") + .build()); + server.enqueue(new MockResponse.Builder() + .body("ABC") + .build()); Request request1 = new Request.Builder().url(server.url("/")).build(); Response response1 = client.newCall(request1).execute(); @@ -534,11 +557,12 @@ public final class CacheTest { } private void testServerPrematureDisconnect(TransferKind transferKind) throws IOException { - MockResponse mockResponse = new MockResponse(); + MockResponse.Builder mockResponse = new MockResponse.Builder(); transferKind.setBody(mockResponse, "ABCDE\nFGHIJKLMNOPQRSTUVWXYZ", 16); - server.enqueue(truncateViolently(mockResponse, 16)); - server.enqueue(new MockResponse() - .setBody("Request #2")); + server.enqueue(truncateViolently(mockResponse, 16).build()); + server.enqueue(new MockResponse.Builder() + .body("Request #2") + .build()); BufferedSource bodySource = get(server.url("/")).body().source(); assertThat(bodySource.readUtf8Line()).isEqualTo("ABCDE"); @@ -572,12 +596,13 @@ public final class CacheTest { private void testClientPrematureDisconnect(TransferKind transferKind) throws IOException { // Setting a low transfer speed ensures that stream discarding will time out. - MockResponse mockResponse = new MockResponse() + MockResponse.Builder builder = new MockResponse.Builder() .throttleBody(6, 1, TimeUnit.SECONDS); - transferKind.setBody(mockResponse, "ABCDE\nFGHIJKLMNOPQRSTUVWXYZ", 1024); - server.enqueue(mockResponse); - server.enqueue(new MockResponse() - .setBody("Request #2")); + transferKind.setBody(builder, "ABCDE\nFGHIJKLMNOPQRSTUVWXYZ", 1024); + server.enqueue(builder.build()); + server.enqueue(new MockResponse.Builder() + .body("Request #2") + .build()); Response response1 = get(server.url("/")); BufferedSource in = response1.body().source(); @@ -602,10 +627,11 @@ public final class CacheTest { // served: 5 seconds ago // default lifetime: (105 - 5) / 10 = 10 seconds // expires: 10 seconds from served date = 5 seconds from now - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Last-Modified: " + formatDate(-105, TimeUnit.SECONDS)) .addHeader("Date: " + formatDate(-5, TimeUnit.SECONDS)) - .setBody("A")); + .body("A") + .build()); HttpUrl url = server.url("/"); Response response1 = get(url); @@ -622,9 +648,10 @@ public final class CacheTest { // default lifetime: (115 - 15) / 10 = 10 seconds // expires: 10 seconds from served date = 5 seconds ago String lastModifiedDate = formatDate(-115, TimeUnit.SECONDS); - RecordedRequest conditionalRequest = assertConditionallyCached(new MockResponse() + RecordedRequest conditionalRequest = assertConditionallyCached(new MockResponse.Builder() .addHeader("Last-Modified: " + lastModifiedDate) - .addHeader("Date: " + formatDate(-15, TimeUnit.SECONDS))); + .addHeader("Date: " + formatDate(-15, TimeUnit.SECONDS)) + .build()); assertThat(conditionalRequest.getHeader("If-Modified-Since")).isEqualTo( lastModifiedDate); } @@ -634,10 +661,11 @@ public final class CacheTest { // served: 5 days ago // default lifetime: (105 - 5) / 10 = 10 days // expires: 10 days from served date = 5 days from now - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Last-Modified: " + formatDate(-105, TimeUnit.DAYS)) .addHeader("Date: " + formatDate(-5, TimeUnit.DAYS)) - .setBody("A")); + .body("A") + .build()); assertThat(get(server.url("/")).body().string()).isEqualTo("A"); Response response = get(server.url("/")); @@ -647,12 +675,14 @@ public final class CacheTest { } @Test public void noDefaultExpirationForUrlsWithQueryString() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Last-Modified: " + formatDate(-105, TimeUnit.SECONDS)) .addHeader("Date: " + formatDate(-5, TimeUnit.SECONDS)) - .setBody("A")); - server.enqueue(new MockResponse() - .setBody("B")); + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .build()); HttpUrl url = server.url("/").newBuilder().addQueryParameter("foo", "bar").build(); assertThat(get(url).body().string()).isEqualTo("A"); @@ -661,36 +691,41 @@ public final class CacheTest { @Test public void expirationDateInThePastWithLastModifiedHeader() throws Exception { String lastModifiedDate = formatDate(-2, TimeUnit.HOURS); - RecordedRequest conditionalRequest = assertConditionallyCached(new MockResponse() + RecordedRequest conditionalRequest = assertConditionallyCached(new MockResponse.Builder() .addHeader("Last-Modified: " + lastModifiedDate) - .addHeader("Expires: " + formatDate(-1, TimeUnit.HOURS))); + .addHeader("Expires: " + formatDate(-1, TimeUnit.HOURS)) + .build()); assertThat(conditionalRequest.getHeader("If-Modified-Since")).isEqualTo( lastModifiedDate); } @Test public void expirationDateInThePastWithNoLastModifiedHeader() throws Exception { - assertNotCached(new MockResponse() - .addHeader("Expires: " + formatDate(-1, TimeUnit.HOURS))); + assertNotCached(new MockResponse.Builder() + .addHeader("Expires: " + formatDate(-1, TimeUnit.HOURS)) + .build()); } @Test public void expirationDateInTheFuture() throws Exception { - assertFullyCached(new MockResponse() - .addHeader("Expires: " + formatDate(1, TimeUnit.HOURS))); + assertFullyCached(new MockResponse.Builder() + .addHeader("Expires: " + formatDate(1, TimeUnit.HOURS)) + .build()); } @Test public void maxAgePreferredWithMaxAgeAndExpires() throws Exception { - assertFullyCached(new MockResponse() + assertFullyCached(new MockResponse.Builder() .addHeader("Date: " + formatDate(0, TimeUnit.HOURS)) .addHeader("Expires: " + formatDate(-1, TimeUnit.HOURS)) - .addHeader("Cache-Control: max-age=60")); + .addHeader("Cache-Control: max-age=60") + .build()); } @Test public void maxAgeInThePastWithDateAndLastModifiedHeaders() throws Exception { String lastModifiedDate = formatDate(-2, TimeUnit.HOURS); - RecordedRequest conditionalRequest = assertConditionallyCached(new MockResponse() + RecordedRequest conditionalRequest = assertConditionallyCached(new MockResponse.Builder() .addHeader("Date: " + formatDate(-120, TimeUnit.SECONDS)) .addHeader("Last-Modified: " + lastModifiedDate) - .addHeader("Cache-Control: max-age=60")); + .addHeader("Cache-Control: max-age=60") + .build()); assertThat(conditionalRequest.getHeader("If-Modified-Since")).isEqualTo( lastModifiedDate); } @@ -698,47 +733,54 @@ public final class CacheTest { @Test public void maxAgeInThePastWithDateHeaderButNoLastModifiedHeader() throws Exception { // Chrome interprets max-age relative to the local clock. Both our cache // and Firefox both use the earlier of the local and server's clock. - assertNotCached(new MockResponse() + assertNotCached(new MockResponse.Builder() .addHeader("Date: " + formatDate(-120, TimeUnit.SECONDS)) - .addHeader("Cache-Control: max-age=60")); + .addHeader("Cache-Control: max-age=60") + .build()); } @Test public void maxAgeInTheFutureWithDateHeader() throws Exception { - assertFullyCached(new MockResponse() + assertFullyCached(new MockResponse.Builder() .addHeader("Date: " + formatDate(0, TimeUnit.HOURS)) - .addHeader("Cache-Control: max-age=60")); + .addHeader("Cache-Control: max-age=60") + .build()); } @Test public void maxAgeInTheFutureWithNoDateHeader() throws Exception { - assertFullyCached(new MockResponse() - .addHeader("Cache-Control: max-age=60")); + assertFullyCached(new MockResponse.Builder() + .addHeader("Cache-Control: max-age=60") + .build()); } @Test public void maxAgeWithLastModifiedButNoServedDate() throws Exception { - assertFullyCached(new MockResponse() + assertFullyCached(new MockResponse.Builder() .addHeader("Last-Modified: " + formatDate(-120, TimeUnit.SECONDS)) - .addHeader("Cache-Control: max-age=60")); + .addHeader("Cache-Control: max-age=60") + .build()); } @Test public void maxAgeInTheFutureWithDateAndLastModifiedHeaders() throws Exception { - assertFullyCached(new MockResponse() + assertFullyCached(new MockResponse.Builder() .addHeader("Last-Modified: " + formatDate(-120, TimeUnit.SECONDS)) .addHeader("Date: " + formatDate(0, TimeUnit.SECONDS)) - .addHeader("Cache-Control: max-age=60")); + .addHeader("Cache-Control: max-age=60") + .build()); } @Test public void maxAgePreferredOverLowerSharedMaxAge() throws Exception { - assertFullyCached(new MockResponse() + assertFullyCached(new MockResponse.Builder() .addHeader("Date: " + formatDate(-2, TimeUnit.MINUTES)) .addHeader("Cache-Control: s-maxage=60") - .addHeader("Cache-Control: max-age=180")); + .addHeader("Cache-Control: max-age=180") + .build()); } @Test public void maxAgePreferredOverHigherMaxAge() throws Exception { - assertNotCached(new MockResponse() + assertNotCached(new MockResponse.Builder() .addHeader("Date: " + formatDate(-2, TimeUnit.MINUTES)) .addHeader("Cache-Control: s-maxage=180") - .addHeader("Cache-Control: max-age=60")); + .addHeader("Cache-Control: max-age=60") + .build()); } @Test public void requestMethodOptionsIsNotCached() throws Exception { @@ -774,11 +816,13 @@ public final class CacheTest { private void testRequestMethod(String requestMethod, boolean expectCached) throws Exception { // 1. Seed the cache (potentially). // 2. Expect a cache hit or miss. - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Expires: " + formatDate(1, TimeUnit.HOURS)) - .addHeader("X-Response-ID: 1")); - server.enqueue(new MockResponse() - .addHeader("X-Response-ID: 2")); + .addHeader("X-Response-ID: 1") + .build()); + server.enqueue(new MockResponse.Builder() + .addHeader("X-Response-ID: 2") + .build()); HttpUrl url = server.url("/"); @@ -821,13 +865,16 @@ public final class CacheTest { // 1. Seed the cache. // 2. Invalidate it. // 3. Expect a cache miss. - server.enqueue(new MockResponse() - .setBody("A") - .addHeader("Expires: " + formatDate(1, TimeUnit.HOURS))); - server.enqueue(new MockResponse() - .setBody("B")); - server.enqueue(new MockResponse() - .setBody("C")); + server.enqueue(new MockResponse.Builder() + .body("A") + .addHeader("Expires: " + formatDate(1, TimeUnit.HOURS)) + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .build()); + server.enqueue(new MockResponse.Builder() + .body("C") + .build()); HttpUrl url = server.url("/"); @@ -847,14 +894,17 @@ public final class CacheTest { // 1. Seed the cache. // 2. Invalidate it with an uncacheable response. // 3. Expect a cache miss. - server.enqueue(new MockResponse() - .setBody("A") - .addHeader("Expires: " + formatDate(1, TimeUnit.HOURS))); - server.enqueue(new MockResponse() - .setBody("B") - .setResponseCode(500)); - server.enqueue(new MockResponse() - .setBody("C")); + server.enqueue(new MockResponse.Builder() + .body("A") + .addHeader("Expires: " + formatDate(1, TimeUnit.HOURS)) + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .code(500) + .build()); + server.enqueue(new MockResponse.Builder() + .body("C") + .build()); HttpUrl url = server.url("/"); @@ -874,14 +924,17 @@ public final class CacheTest { // 1. Seed the cache. // 2. Invalidate it. // 3. Expect a cache miss. - server.enqueue(new MockResponse() - .setBody("A") - .addHeader("Expires: " + formatDate(1, TimeUnit.HOURS))); - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() + .body("A") + .addHeader("Expires: " + formatDate(1, TimeUnit.HOURS)) + .build()); + server.enqueue(new MockResponse.Builder() .clearHeaders() - .setResponseCode(HttpURLConnection.HTTP_NO_CONTENT)); - server.enqueue(new MockResponse() - .setBody("C")); + .code(HttpURLConnection.HTTP_NO_CONTENT) + .build()); + server.enqueue(new MockResponse.Builder() + .body("C") + .build()); HttpUrl url = server.url("/"); @@ -898,81 +951,92 @@ public final class CacheTest { } @Test public void etag() throws Exception { - RecordedRequest conditionalRequest = assertConditionallyCached(new MockResponse() - .addHeader("ETag: v1")); + RecordedRequest conditionalRequest = assertConditionallyCached(new MockResponse.Builder() + .addHeader("ETag: v1") + .build()); assertThat(conditionalRequest.getHeader("If-None-Match")).isEqualTo("v1"); } /** If both If-Modified-Since and If-None-Match conditions apply, send only If-None-Match. */ @Test public void etagAndExpirationDateInThePast() throws Exception { String lastModifiedDate = formatDate(-2, TimeUnit.HOURS); - RecordedRequest conditionalRequest = assertConditionallyCached(new MockResponse() + RecordedRequest conditionalRequest = assertConditionallyCached(new MockResponse.Builder() .addHeader("ETag: v1") .addHeader("Last-Modified: " + lastModifiedDate) - .addHeader("Expires: " + formatDate(-1, TimeUnit.HOURS))); + .addHeader("Expires: " + formatDate(-1, TimeUnit.HOURS)) + .build()); assertThat(conditionalRequest.getHeader("If-None-Match")).isEqualTo("v1"); assertThat(conditionalRequest.getHeader("If-Modified-Since")).isNull(); } @Test public void etagAndExpirationDateInTheFuture() throws Exception { - assertFullyCached(new MockResponse() + assertFullyCached(new MockResponse.Builder() .addHeader("ETag: v1") .addHeader("Last-Modified: " + formatDate(-2, TimeUnit.HOURS)) - .addHeader("Expires: " + formatDate(1, TimeUnit.HOURS))); + .addHeader("Expires: " + formatDate(1, TimeUnit.HOURS)) + .build()); } @Test public void cacheControlNoCache() throws Exception { - assertNotCached(new MockResponse() - .addHeader("Cache-Control: no-cache")); + assertNotCached(new MockResponse.Builder() + .addHeader("Cache-Control: no-cache") + .build()); } @Test public void cacheControlNoCacheAndExpirationDateInTheFuture() throws Exception { String lastModifiedDate = formatDate(-2, TimeUnit.HOURS); - RecordedRequest conditionalRequest = assertConditionallyCached(new MockResponse() + RecordedRequest conditionalRequest = assertConditionallyCached(new MockResponse.Builder() .addHeader("Last-Modified: " + lastModifiedDate) .addHeader("Expires: " + formatDate(1, TimeUnit.HOURS)) - .addHeader("Cache-Control: no-cache")); + .addHeader("Cache-Control: no-cache") + .build()); assertThat(conditionalRequest.getHeader("If-Modified-Since")).isEqualTo( lastModifiedDate); } @Test public void pragmaNoCache() throws Exception { - assertNotCached(new MockResponse() - .addHeader("Pragma: no-cache")); + assertNotCached(new MockResponse.Builder() + .addHeader("Pragma: no-cache") + .build()); } @Test public void pragmaNoCacheAndExpirationDateInTheFuture() throws Exception { String lastModifiedDate = formatDate(-2, TimeUnit.HOURS); - RecordedRequest conditionalRequest = assertConditionallyCached(new MockResponse() + RecordedRequest conditionalRequest = assertConditionallyCached(new MockResponse.Builder() .addHeader("Last-Modified: " + lastModifiedDate) .addHeader("Expires: " + formatDate(1, TimeUnit.HOURS)) - .addHeader("Pragma: no-cache")); + .addHeader("Pragma: no-cache") + .build()); assertThat(conditionalRequest.getHeader("If-Modified-Since")).isEqualTo( lastModifiedDate); } @Test public void cacheControlNoStore() throws Exception { - assertNotCached(new MockResponse() - .addHeader("Cache-Control: no-store")); + assertNotCached(new MockResponse.Builder() + .addHeader("Cache-Control: no-store") + .build()); } @Test public void cacheControlNoStoreAndExpirationDateInTheFuture() throws Exception { - assertNotCached(new MockResponse() + assertNotCached(new MockResponse.Builder() .addHeader("Last-Modified: " + formatDate(-2, TimeUnit.HOURS)) .addHeader("Expires: " + formatDate(1, TimeUnit.HOURS)) - .addHeader("Cache-Control: no-store")); + .addHeader("Cache-Control: no-store") + .build()); } @Test public void partialRangeResponsesDoNotCorruptCache() throws Exception { // 1. Request a range. // 2. Request a full document, expecting a cache miss. - server.enqueue(new MockResponse() - .setBody("AA") - .setResponseCode(HttpURLConnection.HTTP_PARTIAL) + server.enqueue(new MockResponse.Builder() + .body("AA") + .code(HttpURLConnection.HTTP_PARTIAL) .addHeader("Expires: " + formatDate(1, TimeUnit.HOURS)) - .addHeader("Content-Range: bytes 1000-1001/2000")); - server.enqueue(new MockResponse() - .setBody("BB")); + .addHeader("Content-Range: bytes 1000-1001/2000") + .build()); + server.enqueue(new MockResponse.Builder() + .body("BB") + .build()); HttpUrl url = server.url("/"); @@ -994,15 +1058,18 @@ public final class CacheTest { * https://github.com/square/okhttp/issues/2886 */ @Test public void serverReturnsDocumentOlderThanCache() throws Exception { - server.enqueue(new MockResponse() - .setBody("A") + server.enqueue(new MockResponse.Builder() + .body("A") .addHeader("Last-Modified: " + formatDate(-2, TimeUnit.HOURS)) - .addHeader("Expires: " + formatDate(-1, TimeUnit.HOURS))); - server.enqueue(new MockResponse() - .setBody("B") - .addHeader("Last-Modified: " + formatDate(-4, TimeUnit.HOURS))); - server.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED)); + .addHeader("Expires: " + formatDate(-1, TimeUnit.HOURS)) + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .addHeader("Last-Modified: " + formatDate(-4, TimeUnit.HOURS)) + .build()); + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_NOT_MODIFIED) + .build()); HttpUrl url = server.url("/"); @@ -1012,12 +1079,14 @@ public final class CacheTest { } @Test public void clientSideNoStore() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Cache-Control: max-age=60") - .setBody("A")); - server.enqueue(new MockResponse() + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() .addHeader("Cache-Control: max-age=60") - .setBody("B")); + .body("B") + .build()); Request request1 = new Request.Builder() .url(server.url("/")) @@ -1034,25 +1103,30 @@ public final class CacheTest { } @Test public void nonIdentityEncodingAndConditionalCache() throws Exception { - assertNonIdentityEncodingCached(new MockResponse() + assertNonIdentityEncodingCached(new MockResponse.Builder() .addHeader("Last-Modified: " + formatDate(-2, TimeUnit.HOURS)) - .addHeader("Expires: " + formatDate(-1, TimeUnit.HOURS))); + .addHeader("Expires: " + formatDate(-1, TimeUnit.HOURS)) + .build()); } @Test public void nonIdentityEncodingAndFullCache() throws Exception { - assertNonIdentityEncodingCached(new MockResponse() + assertNonIdentityEncodingCached(new MockResponse.Builder() .addHeader("Last-Modified: " + formatDate(-2, TimeUnit.HOURS)) - .addHeader("Expires: " + formatDate(1, TimeUnit.HOURS))); + .addHeader("Expires: " + formatDate(1, TimeUnit.HOURS)) + .build()); } private void assertNonIdentityEncodingCached(MockResponse response) throws Exception { - server.enqueue(response - .setBody(gzip("ABCABCABC")) - .addHeader("Content-Encoding: gzip")); - server.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED)); - server.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED)); + server.enqueue(response.newBuilder() + .body(gzip("ABCABCABC")) + .addHeader("Content-Encoding: gzip") + .build()); + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_NOT_MODIFIED) + .build()); + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_NOT_MODIFIED) + .build()); // At least three request/response pairs are required because after the first request is cached // a different execution path might be taken. Thus modifications to the cache applied during @@ -1063,17 +1137,20 @@ public final class CacheTest { } @Test public void previouslyNotGzippedContentIsNotModifiedAndSpecifiesGzipEncoding() throws Exception { - server.enqueue(new MockResponse() - .setBody("ABCABCABC") - .addHeader("Content-Type: text/plain") - .addHeader("Last-Modified: " + formatDate(-2, TimeUnit.HOURS)) - .addHeader("Expires: " + formatDate(-1, TimeUnit.HOURS))); - server.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED) - .addHeader("Content-Type: text/plain") - .addHeader("Content-Encoding: gzip")); - server.enqueue(new MockResponse() - .setBody("DEFDEFDEF")); + server.enqueue(new MockResponse.Builder() + .body("ABCABCABC") + .addHeader("Content-Type: text/plain") + .addHeader("Last-Modified: " + formatDate(-2, TimeUnit.HOURS)) + .addHeader("Expires: " + formatDate(-1, TimeUnit.HOURS)) + .build()); + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_NOT_MODIFIED) + .addHeader("Content-Type: text/plain") + .addHeader("Content-Encoding: gzip") + .build()); + server.enqueue(new MockResponse.Builder() + .body("DEFDEFDEF") + .build()); assertThat(get(server.url("/")).body().string()).isEqualTo("ABCABCABC"); assertThat(get(server.url("/")).body().string()).isEqualTo("ABCABCABC"); @@ -1081,18 +1158,21 @@ public final class CacheTest { } @Test public void changedGzippedContentIsNotModifiedAndSpecifiesNewEncoding() throws Exception { - server.enqueue(new MockResponse() - .setBody(gzip("ABCABCABC")) - .addHeader("Content-Type: text/plain") - .addHeader("Last-Modified: " + formatDate(-2, TimeUnit.HOURS)) - .addHeader("Expires: " + formatDate(-1, TimeUnit.HOURS)) - .addHeader("Content-Encoding: gzip")); - server.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED) - .addHeader("Content-Type: text/plain") - .addHeader("Content-Encoding: identity")); - server.enqueue(new MockResponse() - .setBody("DEFDEFDEF")); + server.enqueue(new MockResponse.Builder() + .body(gzip("ABCABCABC")) + .addHeader("Content-Type: text/plain") + .addHeader("Last-Modified: " + formatDate(-2, TimeUnit.HOURS)) + .addHeader("Expires: " + formatDate(-1, TimeUnit.HOURS)) + .addHeader("Content-Encoding: gzip") + .build()); + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_NOT_MODIFIED) + .addHeader("Content-Type: text/plain") + .addHeader("Content-Encoding: identity") + .build()); + server.enqueue(new MockResponse.Builder() + .body("DEFDEFDEF") + .build()); assertThat(get(server.url("/")).body().string()).isEqualTo("ABCABCABC"); assertThat(get(server.url("/")).body().string()).isEqualTo("ABCABCABC"); @@ -1100,16 +1180,19 @@ public final class CacheTest { } @Test public void notModifiedSpecifiesEncoding() throws Exception { - server.enqueue(new MockResponse() - .setBody(gzip("ABCABCABC")) + server.enqueue(new MockResponse.Builder() + .body(gzip("ABCABCABC")) .addHeader("Content-Encoding: gzip") .addHeader("Last-Modified: " + formatDate(-2, TimeUnit.HOURS)) - .addHeader("Expires: " + formatDate(-1, TimeUnit.HOURS))); - server.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED) - .addHeader("Content-Encoding: gzip")); - server.enqueue(new MockResponse() - .setBody("DEFDEFDEF")); + .addHeader("Expires: " + formatDate(-1, TimeUnit.HOURS)) + .build()); + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_NOT_MODIFIED) + .addHeader("Content-Encoding: gzip") + .build()); + server.enqueue(new MockResponse.Builder() + .body("DEFDEFDEF") + .build()); assertThat(get(server.url("/")).body().string()).isEqualTo("ABCABCABC"); assertThat(get(server.url("/")).body().string()).isEqualTo("ABCABCABC"); @@ -1118,13 +1201,15 @@ public final class CacheTest { /** https://github.com/square/okhttp/issues/947 */ @Test public void gzipAndVaryOnAcceptEncoding() throws Exception { - server.enqueue(new MockResponse() - .setBody(gzip("ABCABCABC")) + server.enqueue(new MockResponse.Builder() + .body(gzip("ABCABCABC")) .addHeader("Content-Encoding: gzip") .addHeader("Vary: Accept-Encoding") - .addHeader("Cache-Control: max-age=60")); - server.enqueue(new MockResponse() - .setBody("FAIL")); + .addHeader("Cache-Control: max-age=60") + .build()); + server.enqueue(new MockResponse.Builder() + .body("FAIL") + .build()); assertThat(get(server.url("/")).body().string()).isEqualTo("ABCABCABC"); assertThat(get(server.url("/")).body().string()).isEqualTo("ABCABCABC"); @@ -1133,12 +1218,14 @@ public final class CacheTest { @Test public void conditionalCacheHitIsNotDoublePooled() throws Exception { clientTestRule.ensureAllConnectionsReleased(); - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("ETag: v1") - .setBody("A")); - server.enqueue(new MockResponse() + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() .clearHeaders() - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED)); + .code(HttpURLConnection.HTTP_NOT_MODIFIED) + .build()); assertThat(get(server.url("/")).body().string()).isEqualTo("A"); assertThat(get(server.url("/")).body().string()).isEqualTo("A"); @@ -1146,19 +1233,22 @@ public final class CacheTest { } @Test public void expiresDateBeforeModifiedDate() throws Exception { - assertConditionallyCached(new MockResponse() + assertConditionallyCached(new MockResponse.Builder() .addHeader("Last-Modified: " + formatDate(-1, TimeUnit.HOURS)) - .addHeader("Expires: " + formatDate(-2, TimeUnit.HOURS))); + .addHeader("Expires: " + formatDate(-2, TimeUnit.HOURS)) + .build()); } @Test public void requestMaxAge() throws IOException { - server.enqueue(new MockResponse() - .setBody("A") + server.enqueue(new MockResponse.Builder() + .body("A") .addHeader("Last-Modified: " + formatDate(-2, TimeUnit.HOURS)) .addHeader("Date: " + formatDate(-1, TimeUnit.MINUTES)) - .addHeader("Expires: " + formatDate(1, TimeUnit.HOURS))); - server.enqueue(new MockResponse() - .setBody("B")); + .addHeader("Expires: " + formatDate(1, TimeUnit.HOURS)) + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .build()); assertThat(get(server.url("/")).body().string()).isEqualTo("A"); @@ -1171,12 +1261,14 @@ public final class CacheTest { } @Test public void requestMinFresh() throws IOException { - server.enqueue(new MockResponse() - .setBody("A") + server.enqueue(new MockResponse.Builder() + .body("A") .addHeader("Cache-Control: max-age=60") - .addHeader("Date: " + formatDate(0, TimeUnit.MINUTES))); - server.enqueue(new MockResponse() - .setBody("B")); + .addHeader("Date: " + formatDate(0, TimeUnit.MINUTES)) + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .build()); assertThat(get(server.url("/")).body().string()).isEqualTo("A"); @@ -1189,12 +1281,14 @@ public final class CacheTest { } @Test public void requestMaxStale() throws IOException { - server.enqueue(new MockResponse() - .setBody("A") + server.enqueue(new MockResponse.Builder() + .body("A") .addHeader("Cache-Control: max-age=120") - .addHeader("Date: " + formatDate(-4, TimeUnit.MINUTES))); - server.enqueue(new MockResponse() - .setBody("B")); + .addHeader("Date: " + formatDate(-4, TimeUnit.MINUTES)) + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .build()); assertThat(get(server.url("/")).body().string()).isEqualTo("A"); @@ -1210,12 +1304,14 @@ public final class CacheTest { @Test public void requestMaxStaleDirectiveWithNoValue() throws IOException { // Add a stale response to the cache. - server.enqueue(new MockResponse() - .setBody("A") + server.enqueue(new MockResponse.Builder() + .body("A") .addHeader("Cache-Control: max-age=120") - .addHeader("Date: " + formatDate(-4, TimeUnit.MINUTES))); - server.enqueue(new MockResponse() - .setBody("B")); + .addHeader("Date: " + formatDate(-4, TimeUnit.MINUTES)) + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .build()); assertThat(get(server.url("/")).body().string()).isEqualTo("A"); @@ -1231,12 +1327,14 @@ public final class CacheTest { } @Test public void requestMaxStaleNotHonoredWithMustRevalidate() throws IOException { - server.enqueue(new MockResponse() - .setBody("A") + server.enqueue(new MockResponse.Builder() + .body("A") .addHeader("Cache-Control: max-age=120, must-revalidate") - .addHeader("Date: " + formatDate(-4, TimeUnit.MINUTES))); - server.enqueue(new MockResponse() - .setBody("B")); + .addHeader("Date: " + formatDate(-4, TimeUnit.MINUTES)) + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .build()); assertThat(get(server.url("/")).body().string()).isEqualTo("A"); @@ -1264,10 +1362,11 @@ public final class CacheTest { } @Test public void requestOnlyIfCachedWithFullResponseCached() throws IOException { - server.enqueue(new MockResponse() - .setBody("A") + server.enqueue(new MockResponse.Builder() + .body("A") .addHeader("Cache-Control: max-age=30") - .addHeader("Date: " + formatDate(0, TimeUnit.MINUTES))); + .addHeader("Date: " + formatDate(0, TimeUnit.MINUTES)) + .build()); assertThat(get(server.url("/")).body().string()).isEqualTo("A"); Request request = new Request.Builder() @@ -1282,10 +1381,11 @@ public final class CacheTest { } @Test public void requestOnlyIfCachedWithConditionalResponseCached() throws IOException { - server.enqueue(new MockResponse() - .setBody("A") + server.enqueue(new MockResponse.Builder() + .body("A") .addHeader("Cache-Control: max-age=30") - .addHeader("Date: " + formatDate(-1, TimeUnit.MINUTES))); + .addHeader("Date: " + formatDate(-1, TimeUnit.MINUTES)) + .build()); assertThat(get(server.url("/")).body().string()).isEqualTo("A"); Request request = new Request.Builder() @@ -1301,8 +1401,9 @@ public final class CacheTest { } @Test public void requestOnlyIfCachedWithUnhelpfulResponseCached() throws IOException { - server.enqueue(new MockResponse() - .setBody("A")); + server.enqueue(new MockResponse.Builder() + .body("A") + .build()); assertThat(get(server.url("/")).body().string()).isEqualTo("A"); Request request = new Request.Builder() @@ -1318,13 +1419,15 @@ public final class CacheTest { } @Test public void requestCacheControlNoCache() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Last-Modified: " + formatDate(-120, TimeUnit.SECONDS)) .addHeader("Date: " + formatDate(0, TimeUnit.SECONDS)) .addHeader("Cache-Control: max-age=60") - .setBody("A")); - server.enqueue(new MockResponse() - .setBody("B")); + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .build()); HttpUrl url = server.url("/"); assertThat(get(url).body().string()).isEqualTo("A"); @@ -1337,13 +1440,15 @@ public final class CacheTest { } @Test public void requestPragmaNoCache() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Last-Modified: " + formatDate(-120, TimeUnit.SECONDS)) .addHeader("Date: " + formatDate(0, TimeUnit.SECONDS)) .addHeader("Cache-Control: max-age=60") - .setBody("A")); - server.enqueue(new MockResponse() - .setBody("B")); + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .build()); HttpUrl url = server.url("/"); assertThat(get(url).body().string()).isEqualTo("A"); @@ -1356,9 +1461,10 @@ public final class CacheTest { } @Test public void clientSuppliedIfModifiedSinceWithCachedResult() throws Exception { - MockResponse response = new MockResponse() + MockResponse response = new MockResponse.Builder() .addHeader("ETag: v3") - .addHeader("Cache-Control: max-age=0"); + .addHeader("Cache-Control: max-age=0") + .build(); String ifModifiedSinceDate = formatDate(-24, TimeUnit.HOURS); RecordedRequest request = assertClientSuppliedCondition(response, "If-Modified-Since", ifModifiedSinceDate); @@ -1368,10 +1474,11 @@ public final class CacheTest { @Test public void clientSuppliedIfNoneMatchSinceWithCachedResult() throws Exception { String lastModifiedDate = formatDate(-3, TimeUnit.MINUTES); - MockResponse response = new MockResponse() + MockResponse response = new MockResponse.Builder() .addHeader("Last-Modified: " + lastModifiedDate) .addHeader("Date: " + formatDate(-2, TimeUnit.MINUTES)) - .addHeader("Cache-Control: max-age=0"); + .addHeader("Cache-Control: max-age=0") + .build(); RecordedRequest request = assertClientSuppliedCondition(response, "If-None-Match", "v1"); assertThat(request.getHeader("If-None-Match")).isEqualTo("v1"); assertThat(request.getHeader("If-Modified-Since")).isNull(); @@ -1379,9 +1486,12 @@ public final class CacheTest { private RecordedRequest assertClientSuppliedCondition(MockResponse seed, String conditionName, String conditionValue) throws Exception { - server.enqueue(seed.setBody("A")); - server.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED)); + server.enqueue(seed.newBuilder() + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_NOT_MODIFIED) + .build()); HttpUrl url = server.url("/"); assertThat(get(url).body().string()).isEqualTo("A"); @@ -1412,12 +1522,14 @@ public final class CacheTest { String servedString = dateFormat.format(servedDate); // This response should be conditionally cached. - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Last-Modified: " + lastModifiedString) .addHeader("Expires: " + servedString) - .setBody("A")); - server.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED)); + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_NOT_MODIFIED) + .build()); assertThat(get(server.url("/")).body().string()).isEqualTo("A"); assertThat(get(server.url("/")).body().string()).isEqualTo("A"); @@ -1432,8 +1544,9 @@ public final class CacheTest { } @Test public void clientSuppliedConditionWithoutCachedResult() throws Exception { - server.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED)); + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_NOT_MODIFIED) + .build()); Request request = new Request.Builder() .url(server.url("/")) @@ -1445,11 +1558,13 @@ public final class CacheTest { } @Test public void authorizationRequestFullyCached() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Cache-Control: max-age=60") - .setBody("A")); - server.enqueue(new MockResponse() - .setBody("B")); + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .build()); HttpUrl url = server.url("/"); Request request = new Request.Builder() @@ -1462,26 +1577,31 @@ public final class CacheTest { } @Test public void contentLocationDoesNotPopulateCache() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Cache-Control: max-age=60") .addHeader("Content-Location: /bar") - .setBody("A")); - server.enqueue(new MockResponse() - .setBody("B")); + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .build()); assertThat(get(server.url("/foo")).body().string()).isEqualTo("A"); assertThat(get(server.url("/bar")).body().string()).isEqualTo("B"); } @Test public void connectionIsReturnedToPoolAfterConditionalSuccess() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Last-Modified: " + formatDate(-1, TimeUnit.HOURS)) .addHeader("Cache-Control: max-age=0") - .setBody("A")); - server.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED)); - server.enqueue(new MockResponse() - .setBody("B")); + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_NOT_MODIFIED) + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .build()); assertThat(get(server.url("/a")).body().string()).isEqualTo("A"); assertThat(get(server.url("/a")).body().string()).isEqualTo("A"); @@ -1493,14 +1613,17 @@ public final class CacheTest { } @Test public void statisticsConditionalCacheMiss() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Last-Modified: " + formatDate(-1, TimeUnit.HOURS)) .addHeader("Cache-Control: max-age=0") - .setBody("A")); - server.enqueue(new MockResponse() - .setBody("B")); - server.enqueue(new MockResponse() - .setBody("C")); + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .build()); + server.enqueue(new MockResponse.Builder() + .body("C") + .build()); assertThat(get(server.url("/")).body().string()).isEqualTo("A"); assertThat(cache.requestCount()).isEqualTo(1); @@ -1514,14 +1637,17 @@ public final class CacheTest { } @Test public void statisticsConditionalCacheHit() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Last-Modified: " + formatDate(-1, TimeUnit.HOURS)) .addHeader("Cache-Control: max-age=0") - .setBody("A")); - server.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED)); - server.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED)); + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_NOT_MODIFIED) + .build()); + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_NOT_MODIFIED) + .build()); assertThat(get(server.url("/")).body().string()).isEqualTo("A"); assertThat(cache.requestCount()).isEqualTo(1); @@ -1535,9 +1661,10 @@ public final class CacheTest { } @Test public void statisticsFullCacheHit() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Cache-Control: max-age=60") - .setBody("A")); + .body("A") + .build()); assertThat(get(server.url("/")).body().string()).isEqualTo("A"); assertThat(cache.requestCount()).isEqualTo(1); @@ -1551,12 +1678,14 @@ public final class CacheTest { } @Test public void varyMatchesChangedRequestHeaderField() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Cache-Control: max-age=60") .addHeader("Vary: Accept-Language") - .setBody("A")); - server.enqueue(new MockResponse() - .setBody("B")); + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .build()); HttpUrl url = server.url("/"); Request frRequest = new Request.Builder() @@ -1575,12 +1704,14 @@ public final class CacheTest { } @Test public void varyMatchesUnchangedRequestHeaderField() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Cache-Control: max-age=60") .addHeader("Vary: Accept-Language") - .setBody("A")); - server.enqueue(new MockResponse() - .setBody("B")); + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .build()); HttpUrl url = server.url("/"); Request request = new Request.Builder() @@ -1598,24 +1729,28 @@ public final class CacheTest { } @Test public void varyMatchesAbsentRequestHeaderField() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Cache-Control: max-age=60") .addHeader("Vary: Foo") - .setBody("A")); - server.enqueue(new MockResponse() - .setBody("B")); + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .build()); assertThat(get(server.url("/")).body().string()).isEqualTo("A"); assertThat(get(server.url("/")).body().string()).isEqualTo("A"); } @Test public void varyMatchesAddedRequestHeaderField() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Cache-Control: max-age=60") .addHeader("Vary: Foo") - .setBody("A")); - server.enqueue(new MockResponse() - .setBody("B")); + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .build()); assertThat(get(server.url("/")).body().string()).isEqualTo("A"); Request request = new Request.Builder() @@ -1626,12 +1761,14 @@ public final class CacheTest { } @Test public void varyMatchesRemovedRequestHeaderField() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Cache-Control: max-age=60") .addHeader("Vary: Foo") - .setBody("A")); - server.enqueue(new MockResponse() - .setBody("B")); + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .build()); Request request = new Request.Builder() .url(server.url("/")).header("Foo", "bar") @@ -1642,12 +1779,14 @@ public final class CacheTest { } @Test public void varyFieldsAreCaseInsensitive() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Cache-Control: max-age=60") .addHeader("Vary: ACCEPT-LANGUAGE") - .setBody("A")); - server.enqueue(new MockResponse() - .setBody("B")); + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .build()); HttpUrl url = server.url("/"); Request request = new Request.Builder() @@ -1665,13 +1804,15 @@ public final class CacheTest { } @Test public void varyMultipleFieldsWithMatch() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Cache-Control: max-age=60") .addHeader("Vary: Accept-Language, Accept-Charset") .addHeader("Vary: Accept-Encoding") - .setBody("A")); - server.enqueue(new MockResponse() - .setBody("B")); + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .build()); HttpUrl url = server.url("/"); Request request = new Request.Builder() @@ -1693,13 +1834,15 @@ public final class CacheTest { } @Test public void varyMultipleFieldsWithNoMatch() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Cache-Control: max-age=60") .addHeader("Vary: Accept-Language, Accept-Charset") .addHeader("Vary: Accept-Encoding") - .setBody("A")); - server.enqueue(new MockResponse() - .setBody("B")); + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .build()); HttpUrl url = server.url("/"); Request frRequest = new Request.Builder() @@ -1721,12 +1864,14 @@ public final class CacheTest { } @Test public void varyMultipleFieldValuesWithMatch() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Cache-Control: max-age=60") .addHeader("Vary: Accept-Language") - .setBody("A")); - server.enqueue(new MockResponse() - .setBody("B")); + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .build()); HttpUrl url = server.url("/"); Request request1 = new Request.Builder() @@ -1747,12 +1892,14 @@ public final class CacheTest { } @Test public void varyMultipleFieldValuesWithNoMatch() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Cache-Control: max-age=60") .addHeader("Vary: Accept-Language") - .setBody("A")); - server.enqueue(new MockResponse() - .setBody("B")); + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .build()); HttpUrl url = server.url("/"); Request request1 = new Request.Builder() @@ -1773,12 +1920,14 @@ public final class CacheTest { } @Test public void varyAsterisk() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Cache-Control: max-age=60") .addHeader("Vary: *") - .setBody("A")); - server.enqueue(new MockResponse() - .setBody("B")); + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .build()); assertThat(get(server.url("/")).body().string()).isEqualTo("A"); assertThat(get(server.url("/")).body().string()).isEqualTo("B"); @@ -1786,12 +1935,14 @@ public final class CacheTest { @Test public void varyAndHttps() throws Exception { server.useHttps(handshakeCertificates.sslSocketFactory()); - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Cache-Control: max-age=60") .addHeader("Vary: Accept-Language") - .setBody("A")); - server.enqueue(new MockResponse() - .setBody("B")); + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .build()); client = client.newBuilder() .sslSocketFactory( @@ -1821,14 +1972,16 @@ public final class CacheTest { .cookieJar(cookieJar) .build(); - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Set-Cookie: a=FIRST") .addHeader("Last-Modified: " + formatDate(-1, TimeUnit.HOURS)) .addHeader("Cache-Control: max-age=0") - .setBody("A")); - server.enqueue(new MockResponse() + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() .addHeader("Set-Cookie: a=SECOND") - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED)); + .code(HttpURLConnection.HTTP_NOT_MODIFIED) + .build()); HttpUrl url = server.url("/"); assertThat(get(url).body().string()).isEqualTo("A"); @@ -1838,14 +1991,16 @@ public final class CacheTest { } @Test public void getHeadersReturnsNetworkEndToEndHeaders() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Allow: GET, HEAD") .addHeader("Last-Modified: " + formatDate(-1, TimeUnit.HOURS)) .addHeader("Cache-Control: max-age=0") - .setBody("A")); - server.enqueue(new MockResponse() + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() .addHeader("Allow: GET, HEAD, PUT") - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED)); + .code(HttpURLConnection.HTTP_NOT_MODIFIED) + .build()); Response response1 = get(server.url("/")); assertThat(response1.body().string()).isEqualTo("A"); @@ -1857,14 +2012,16 @@ public final class CacheTest { } @Test public void getHeadersReturnsCachedHopByHopHeaders() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Transfer-Encoding: identity") .addHeader("Last-Modified: " + formatDate(-1, TimeUnit.HOURS)) .addHeader("Cache-Control: max-age=0") - .setBody("A")); - server.enqueue(new MockResponse() + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() .addHeader("Transfer-Encoding: none") - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED)); + .code(HttpURLConnection.HTTP_NOT_MODIFIED) + .build()); Response response1 = get(server.url("/")); assertThat(response1.body().string()).isEqualTo("A"); @@ -1876,13 +2033,15 @@ public final class CacheTest { } @Test public void getHeadersDeletesCached100LevelWarnings() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Warning: 199 test danger") .addHeader("Last-Modified: " + formatDate(-1, TimeUnit.HOURS)) .addHeader("Cache-Control: max-age=0") - .setBody("A")); - server.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED)); + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_NOT_MODIFIED) + .build()); Response response1 = get(server.url("/")); assertThat(response1.body().string()).isEqualTo("A"); @@ -1894,13 +2053,15 @@ public final class CacheTest { } @Test public void getHeadersRetainsCached200LevelWarnings() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Warning: 299 test danger") .addHeader("Last-Modified: " + formatDate(-1, TimeUnit.HOURS)) .addHeader("Cache-Control: max-age=0") - .setBody("A")); - server.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED)); + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_NOT_MODIFIED) + .build()); Response response1 = get(server.url("/")); assertThat(response1.body().string()).isEqualTo("A"); @@ -1912,24 +2073,28 @@ public final class CacheTest { } @Test public void doNotCachePartialResponse() throws Exception { - assertNotCached(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_PARTIAL) + assertNotCached(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_PARTIAL) .addHeader("Date: " + formatDate(0, TimeUnit.HOURS)) .addHeader("Content-Range: bytes 100-100/200") - .addHeader("Cache-Control: max-age=60")); + .addHeader("Cache-Control: max-age=60") + .build()); } @Test public void conditionalHitUpdatesCache() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Last-Modified: " + formatDate(0, TimeUnit.SECONDS)) .addHeader("Cache-Control: max-age=0") - .setBody("A")); - server.enqueue(new MockResponse() + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() .addHeader("Cache-Control: max-age=30") .addHeader("Allow: GET, HEAD") - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED)); - server.enqueue(new MockResponse() - .setBody("B")); + .code(HttpURLConnection.HTTP_NOT_MODIFIED) + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .build()); // A cache miss writes the cache. long t0 = System.currentTimeMillis(); @@ -1959,10 +2124,11 @@ public final class CacheTest { } @Test public void responseSourceHeaderCached() throws IOException { - server.enqueue(new MockResponse() - .setBody("A") + server.enqueue(new MockResponse.Builder() + .body("A") .addHeader("Cache-Control: max-age=30") - .addHeader("Date: " + formatDate(0, TimeUnit.MINUTES))); + .addHeader("Date: " + formatDate(0, TimeUnit.MINUTES)) + .build()); assertThat(get(server.url("/")).body().string()).isEqualTo("A"); Request request = new Request.Builder() @@ -1973,14 +2139,16 @@ public final class CacheTest { } @Test public void responseSourceHeaderConditionalCacheFetched() throws IOException { - server.enqueue(new MockResponse() - .setBody("A") + server.enqueue(new MockResponse.Builder() + .body("A") .addHeader("Cache-Control: max-age=30") - .addHeader("Date: " + formatDate(-31, TimeUnit.MINUTES))); - server.enqueue(new MockResponse() - .setBody("B") + .addHeader("Date: " + formatDate(-31, TimeUnit.MINUTES)) + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") .addHeader("Cache-Control: max-age=30") - .addHeader("Date: " + formatDate(0, TimeUnit.MINUTES))); + .addHeader("Date: " + formatDate(0, TimeUnit.MINUTES)) + .build()); assertThat(get(server.url("/")).body().string()).isEqualTo("A"); Response response = get(server.url("/")); @@ -1988,12 +2156,14 @@ public final class CacheTest { } @Test public void responseSourceHeaderConditionalCacheNotFetched() throws IOException { - server.enqueue(new MockResponse() - .setBody("A") + server.enqueue(new MockResponse.Builder() + .body("A") .addHeader("Cache-Control: max-age=0") - .addHeader("Date: " + formatDate(0, TimeUnit.MINUTES))); - server.enqueue(new MockResponse() - .setResponseCode(304)); + .addHeader("Date: " + formatDate(0, TimeUnit.MINUTES)) + .build()); + server.enqueue(new MockResponse.Builder() + .code(304) + .build()); assertThat(get(server.url("/")).body().string()).isEqualTo("A"); Response response = get(server.url("/")); @@ -2001,8 +2171,9 @@ public final class CacheTest { } @Test public void responseSourceHeaderFetched() throws IOException { - server.enqueue(new MockResponse() - .setBody("A")); + server.enqueue(new MockResponse.Builder() + .body("A") + .build()); Response response = get(server.url("/")); assertThat(response.body().string()).isEqualTo("A"); @@ -2012,9 +2183,10 @@ public final class CacheTest { Headers.Builder headers = new Headers.Builder() .add("Cache-Control: max-age=120"); Internal.addHeaderLenient(headers, ": A"); - server.enqueue(new MockResponse() - .setHeaders(headers.build()) - .setBody("body")); + server.enqueue(new MockResponse.Builder() + .headers(headers.build()) + .body("body") + .build()); Response response = get(server.url("/")); assertThat(response.header("")).isEqualTo("A"); @@ -2030,9 +2202,10 @@ public final class CacheTest { */ @Test public void testGoldenCacheResponse() throws Exception { cache.close(); - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .clearHeaders() - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED)); + .code(HttpURLConnection.HTTP_NOT_MODIFIED) + .build()); HttpUrl url = server.url("/"); String urlKey = Cache.key(url); @@ -2223,11 +2396,13 @@ public final class CacheTest { } @Test public void evictAll() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Cache-Control: max-age=60") - .setBody("A")); - server.enqueue(new MockResponse() - .setBody("B")); + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .build()); HttpUrl url = server.url("/"); assertThat(get(url).body().string()).isEqualTo("A"); @@ -2237,11 +2412,13 @@ public final class CacheTest { } @Test public void networkInterceptorInvokedForConditionalGet() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("ETag: v1") - .setBody("A")); - server.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED)); + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_NOT_MODIFIED) + .build()); // Seed the cache. HttpUrl url = server.url("/"); @@ -2261,9 +2438,10 @@ public final class CacheTest { } @Test public void networkInterceptorNotInvokedForFullyCached() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Cache-Control: max-age=60") - .setBody("A")); + .body("A") + .build()); // Seed the cache. HttpUrl url = server.url("/"); @@ -2278,18 +2456,21 @@ public final class CacheTest { @Test public void iterateCache() throws Exception { // Put some responses in the cache. - server.enqueue(new MockResponse() - .setBody("a")); + server.enqueue(new MockResponse.Builder() + .body("a") + .build()); HttpUrl urlA = server.url("/a"); assertThat(get(urlA).body().string()).isEqualTo("a"); - server.enqueue(new MockResponse() - .setBody("b")); + server.enqueue(new MockResponse.Builder() + .body("b") + .build()); HttpUrl urlB = server.url("/b"); assertThat(get(urlB).body().string()).isEqualTo("b"); - server.enqueue(new MockResponse() - .setBody("c")); + server.enqueue(new MockResponse.Builder() + .body("c") + .build()); HttpUrl urlC = server.url("/c"); assertThat(get(urlC).body().string()).isEqualTo("c"); @@ -2313,9 +2494,10 @@ public final class CacheTest { @Test public void iteratorRemoveFromCache() throws Exception { // Put a response in the cache. - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Cache-Control: max-age=60") - .setBody("a")); + .body("a") + .build()); HttpUrl url = server.url("/a"); assertThat(get(url).body().string()).isEqualTo("a"); @@ -2325,15 +2507,17 @@ public final class CacheTest { i.remove(); // Confirm that subsequent requests suffer a cache miss. - server.enqueue(new MockResponse() - .setBody("b")); + server.enqueue(new MockResponse.Builder() + .body("b") + .build()); assertThat(get(url).body().string()).isEqualTo("b"); } @Test public void iteratorRemoveWithoutNextThrows() throws Exception { // Put a response in the cache. - server.enqueue(new MockResponse() - .setBody("a")); + server.enqueue(new MockResponse.Builder() + .body("a") + .build()); HttpUrl url = server.url("/a"); assertThat(get(url).body().string()).isEqualTo("a"); @@ -2348,8 +2532,9 @@ public final class CacheTest { @Test public void iteratorRemoveOncePerCallToNext() throws Exception { // Put a response in the cache. - server.enqueue(new MockResponse() - .setBody("a")); + server.enqueue(new MockResponse.Builder() + .body("a") + .build()); HttpUrl url = server.url("/a"); assertThat(get(url).body().string()).isEqualTo("a"); @@ -2367,8 +2552,9 @@ public final class CacheTest { @Test public void elementEvictedBetweenHasNextAndNext() throws Exception { // Put a response in the cache. - server.enqueue(new MockResponse() - .setBody("a")); + server.enqueue(new MockResponse.Builder() + .body("a") + .build()); HttpUrl url = server.url("/a"); assertThat(get(url).body().string()).isEqualTo("a"); @@ -2386,8 +2572,9 @@ public final class CacheTest { @Test public void elementEvictedBeforeHasNextIsOmitted() throws Exception { // Put a response in the cache. - server.enqueue(new MockResponse() - .setBody("a")); + server.enqueue(new MockResponse.Builder() + .body("a") + .build()); HttpUrl url = server.url("/a"); assertThat(get(url).body().string()).isEqualTo("a"); @@ -2405,16 +2592,20 @@ public final class CacheTest { /** Test https://github.com/square/okhttp/issues/1712. */ @Test public void conditionalMissUpdatesCache() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("ETag: v1") - .setBody("A")); - server.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED)); - server.enqueue(new MockResponse() + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_NOT_MODIFIED) + .build()); + server.enqueue(new MockResponse.Builder() .addHeader("ETag: v2") - .setBody("B")); - server.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED)); + .body("B") + .build()); + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_NOT_MODIFIED) + .build()); HttpUrl url = server.url("/"); assertThat(get(url).body().string()).isEqualTo("A"); @@ -2429,17 +2620,19 @@ public final class CacheTest { } @Test public void combinedCacheHeadersCanBeNonAscii() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Last-Modified: " + formatDate(-1, TimeUnit.HOURS)) .addHeader("Cache-Control: max-age=0") .addHeaderLenient("Alpha", "α") .addHeaderLenient("β", "Beta") - .setBody("abcd")); - server.enqueue(new MockResponse() + .body("abcd") + .build()); + server.enqueue(new MockResponse.Builder() .addHeader("Transfer-Encoding: none") .addHeaderLenient("Gamma", "Γ") .addHeaderLenient("Δ", "Delta") - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED)); + .code(HttpURLConnection.HTTP_NOT_MODIFIED) + .build()); Response response1 = get(server.url("/")); assertThat(response1.header("Alpha")).isEqualTo("α"); @@ -2455,12 +2648,14 @@ public final class CacheTest { } @Test public void etagConditionCanBeNonAscii() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeaderLenient("Etag", "α") .addHeader("Cache-Control: max-age=0") - .setBody("abcd")); - server.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED)); + .body("abcd") + .build()); + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_NOT_MODIFIED) + .build()); Response response1 = get(server.url("/")); assertThat(response1.body().string()).isEqualTo("abcd"); @@ -2473,18 +2668,20 @@ public final class CacheTest { } @Test public void conditionalHitHeadersCombined() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Etag", "a") .addHeader("Cache-Control: max-age=0") .addHeader("A: a1") .addHeader("B: b2") .addHeader("B: b3") - .setBody("abcd")); - server.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED) + .body("abcd") + .build()); + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_NOT_MODIFIED) .addHeader("B: b4") .addHeader("B: b5") - .addHeader("C: c6")); + .addHeader("C: c6") + .build()); Response response1 = get(server.url("/")); assertThat(response1.body().string()).isEqualTo("abcd"); @@ -2528,9 +2725,12 @@ public final class CacheTest { } private void assertNotCached(MockResponse response) throws Exception { - server.enqueue(response.setBody("A")); - server.enqueue(new MockResponse() - .setBody("B")); + server.enqueue(response.newBuilder() + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .build()); HttpUrl url = server.url("/"); assertThat(get(url).body().string()).isEqualTo("A"); @@ -2540,16 +2740,23 @@ public final class CacheTest { /** @return the request with the conditional get headers. */ private RecordedRequest assertConditionallyCached(MockResponse response) throws Exception { // scenario 1: condition succeeds - server.enqueue(response.setBody("A").setStatus("HTTP/1.1 200 A-OK")); - server.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED)); + server.enqueue(response.newBuilder() + .body("A") + .status("HTTP/1.1 200 A-OK") + .build()); + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_NOT_MODIFIED) + .build()); // scenario 2: condition fails - server.enqueue(response.setBody("B") - .setStatus("HTTP/1.1 200 B-OK")); - server.enqueue(new MockResponse() - .setStatus("HTTP/1.1 200 C-OK") - .setBody("C")); + server.enqueue(response.newBuilder() + .body("B") + .status("HTTP/1.1 200 B-OK") + .build()); + server.enqueue(new MockResponse.Builder() + .status("HTTP/1.1 200 C-OK") + .body("C") + .build()); HttpUrl valid = server.url("/valid"); Response response1 = get(valid); @@ -2576,11 +2783,13 @@ public final class CacheTest { } @Test public void immutableIsCached() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Cache-Control", "immutable, max-age=10") - .setBody("A")); - server.enqueue(new MockResponse() - .setBody("B")); + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() + .body("B") + .build()); HttpUrl url = server.url("/"); assertThat(get(url).body().string()).isEqualTo("A"); @@ -2588,13 +2797,16 @@ public final class CacheTest { } @Test public void immutableIsCachedAfterMultipleCalls() throws Exception { - server.enqueue(new MockResponse() - .setBody("A")); - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() + .body("A") + .build()); + server.enqueue(new MockResponse.Builder() .addHeader("Cache-Control", "immutable, max-age=10") - .setBody("B")); - server.enqueue(new MockResponse() - .setBody("C")); + .body("B") + .build()); + server.enqueue(new MockResponse.Builder() + .body("C") + .build()); HttpUrl url = server.url("/"); assertThat(get(url).body().string()).isEqualTo("A"); @@ -2608,10 +2820,11 @@ public final class CacheTest { // default lifetime: (115 - 15) / 10 = 10 seconds // expires: 10 seconds from served date = 5 seconds ago String lastModifiedDate = formatDate(-115, TimeUnit.SECONDS); - RecordedRequest conditionalRequest = assertConditionallyCached(new MockResponse() + RecordedRequest conditionalRequest = assertConditionallyCached(new MockResponse.Builder() .addHeader("Cache-Control: immutable") .addHeader("Last-Modified: " + lastModifiedDate) - .addHeader("Date: " + formatDate(-15, TimeUnit.SECONDS))); + .addHeader("Date: " + formatDate(-15, TimeUnit.SECONDS)) + .build()); assertThat(conditionalRequest.getHeader("If-Modified-Since")).isEqualTo( lastModifiedDate); } @@ -2664,8 +2877,8 @@ public final class CacheTest { } private void assertFullyCached(MockResponse response) throws Exception { - server.enqueue(response.setBody("A")); - server.enqueue(response.setBody("B")); + server.enqueue(response.newBuilder().body("A").build()); + server.enqueue(response.newBuilder().body("B").build()); HttpUrl url = server.url("/"); assertThat(get(url).body().string()).isEqualTo("A"); @@ -2676,38 +2889,39 @@ public final class CacheTest { * Shortens the body of {@code response} but not the corresponding headers. Only useful to test * how clients respond to the premature conclusion of the HTTP body. */ - private MockResponse truncateViolently(MockResponse response, int numBytesToKeep) { - response.setSocketPolicy(DISCONNECT_AT_END); + private MockResponse.Builder truncateViolently(MockResponse.Builder builder, int numBytesToKeep) { + MockResponse response = builder.build(); + builder.socketPolicy(DISCONNECT_AT_END); Headers headers = response.getHeaders(); Buffer truncatedBody = new Buffer(); truncatedBody.write(response.getBody(), numBytesToKeep); - response.setBody(truncatedBody); - response.setHeaders(headers); - return response; + builder.body(truncatedBody); + builder.headers(headers); + return builder; } enum TransferKind { CHUNKED { - @Override void setBody(MockResponse response, Buffer content, int chunkSize) { - response.setChunkedBody(content, chunkSize); + @Override void setBody(MockResponse.Builder response, Buffer content, int chunkSize) { + response.chunkedBody(content, chunkSize); } }, FIXED_LENGTH { - @Override void setBody(MockResponse response, Buffer content, int chunkSize) { - response.setBody(content); + @Override void setBody(MockResponse.Builder response, Buffer content, int chunkSize) { + response.body(content); } }, END_OF_STREAM { - @Override void setBody(MockResponse response, Buffer content, int chunkSize) { - response.setBody(content); - response.setSocketPolicy(DISCONNECT_AT_END); + @Override void setBody(MockResponse.Builder response, Buffer content, int chunkSize) { + response.body(content); + response.socketPolicy(DISCONNECT_AT_END); response.removeHeader("Content-Length"); } }; - abstract void setBody(MockResponse response, Buffer content, int chunkSize) throws IOException; + abstract void setBody(MockResponse.Builder response, Buffer content, int chunkSize) throws IOException; - void setBody(MockResponse response, String content, int chunkSize) throws IOException { + void setBody(MockResponse.Builder response, String content, int chunkSize) throws IOException { setBody(response, new Buffer().writeUtf8(content), chunkSize); } } diff --git a/okhttp/src/jvmTest/java/okhttp3/CallHandshakeTest.kt b/okhttp/src/jvmTest/java/okhttp3/CallHandshakeTest.kt index 61deb33d7..2c06c4fce 100644 --- a/okhttp/src/jvmTest/java/okhttp3/CallHandshakeTest.kt +++ b/okhttp/src/jvmTest/java/okhttp3/CallHandshakeTest.kt @@ -15,6 +15,7 @@ */ package okhttp3 +import javax.net.ssl.SSLSocket import mockwebserver3.MockResponse import mockwebserver3.MockWebServer import okhttp3.CipherSuite.Companion.TLS_AES_128_GCM_SHA256 @@ -35,7 +36,6 @@ import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.RegisterExtension -import javax.net.ssl.SSLSocket class CallHandshakeTest { private lateinit var client: OkHttpClient @@ -62,7 +62,7 @@ class CallHandshakeTest { fun setup(server: MockWebServer) { this.server = server - server.enqueue(MockResponse().setResponseCode(200)) + server.enqueue(MockResponse()) client = clientTestRule.newClientBuilder() .sslSocketFactory( diff --git a/okhttp/src/jvmTest/java/okhttp3/CallKotlinTest.kt b/okhttp/src/jvmTest/java/okhttp3/CallKotlinTest.kt index 71c078207..668643461 100644 --- a/okhttp/src/jvmTest/java/okhttp3/CallKotlinTest.kt +++ b/okhttp/src/jvmTest/java/okhttp3/CallKotlinTest.kt @@ -63,8 +63,8 @@ class CallKotlinTest { @Test fun legalToExecuteTwiceCloning() { - server.enqueue(MockResponse().setBody("abc")) - server.enqueue(MockResponse().setBody("def")) + server.enqueue(MockResponse(body = "abc")) + server.enqueue(MockResponse(body = "def")) val request = Request(server.url("/")) @@ -83,7 +83,7 @@ class CallKotlinTest { fun testMockWebserverRequest() { enableTls() - server.enqueue(MockResponse().setBody("abc")) + server.enqueue(MockResponse(body = "abc")) val request = Request.Builder().url(server.url("/")).build() @@ -130,15 +130,9 @@ class CallKotlinTest { } } - server.enqueue(MockResponse().apply { - setResponseCode(201) - }) - server.enqueue(MockResponse().apply { - setResponseCode(204) - }) - server.enqueue(MockResponse().apply { - setResponseCode(204) - }) + server.enqueue(MockResponse(code = 201)) + server.enqueue(MockResponse(code = 204)) + server.enqueue(MockResponse(code = 204)) val endpointUrl = server.url("/endpoint") @@ -192,9 +186,13 @@ class CallKotlinTest { }) .build() - server.enqueue(MockResponse().setBody("a") - .setSocketPolicy(SocketPolicy.SHUTDOWN_OUTPUT_AT_END)) - server.enqueue(MockResponse().setBody("b")) + server.enqueue( + MockResponse( + body = "a", + socketPolicy = SocketPolicy.SHUTDOWN_OUTPUT_AT_END + ) + ) + server.enqueue(MockResponse(body = "b")) val requestA = Request(server.url("/")) val responseA = client.newCall(requestA).execute() @@ -243,8 +241,8 @@ class CallKotlinTest { /** Confirm suppressed exceptions that occur after connecting are returned. */ @Test fun httpExceptionsAreReturnedAsSuppressed() { - server.enqueue(MockResponse().setSocketPolicy(SocketPolicy.DISCONNECT_AT_START)) - server.enqueue(MockResponse().setSocketPolicy(SocketPolicy.DISCONNECT_AT_START)) + server.enqueue(MockResponse(socketPolicy = SocketPolicy.DISCONNECT_AT_START)) + server.enqueue(MockResponse(socketPolicy = SocketPolicy.DISCONNECT_AT_START)) client = client.newBuilder() .dns(DoubleInetAddressDns()) // Two routes so we get two failures. @@ -266,9 +264,10 @@ class CallKotlinTest { @Test fun responseRequestIsLastRedirect() { server.enqueue( - MockResponse() - .setResponseCode(302) - .addHeader("Location: /b") + MockResponse( + code = 302, + headers = headersOf("Location", "/b"), + ) ) server.enqueue(MockResponse()) diff --git a/okhttp/src/jvmTest/java/okhttp3/CallTest.kt b/okhttp/src/jvmTest/java/okhttp3/CallTest.kt index 33ba20355..ee0bb67a0 100644 --- a/okhttp/src/jvmTest/java/okhttp3/CallTest.kt +++ b/okhttp/src/jvmTest/java/okhttp3/CallTest.kt @@ -125,7 +125,8 @@ open class CallTest { fileSystem = LoggingFilesystem(fileSystem) ) - @BeforeEach fun setUp( + @BeforeEach + fun setUp( server: MockWebServer, @MockWebServerInstance("server2") server2: MockWebServer ) { @@ -136,19 +137,21 @@ open class CallTest { platform.assumeNotBouncyCastle() } - @AfterEach fun tearDown() { + @AfterEach + fun tearDown() { cache.close() fileSystem.checkNoOpenFiles() } - @Test fun get() { + @Test + fun get() { server.enqueue( - MockResponse() - .setBody("abc") + MockResponse.Builder() + .body("abc") .clearHeaders() .addHeader("content-type: text/plain") .addHeader("content-length", "3") - ) + .build()) val sentAt = System.currentTimeMillis() val recordedResponse = executeSynchronously("/", "User-Agent", "SyncApiTest") val receivedAt = System.currentTimeMillis() @@ -170,12 +173,14 @@ open class CallTest { assertThat(recordedRequest.getHeader("Content-Length")).isNull() } - @Test fun buildRequestUsingHttpUrl() { + @Test + fun buildRequestUsingHttpUrl() { server.enqueue(MockResponse()) executeSynchronously("/").assertSuccessful() } - @Test fun invalidScheme() { + @Test + fun invalidScheme() { val requestBuilder = Request.Builder() try { requestBuilder.url("ftp://hostname/path") @@ -185,7 +190,8 @@ open class CallTest { } } - @Test fun invalidPort() { + @Test + fun invalidPort() { val requestBuilder = Request.Builder() try { requestBuilder.url("http://localhost:65536/") @@ -195,28 +201,35 @@ open class CallTest { } } - @Test fun getReturns500() { - server.enqueue(MockResponse().setResponseCode(500)) + @Test + fun getReturns500() { + server.enqueue(MockResponse(code = 500)) executeSynchronously("/") .assertCode(500) .assertNotSuccessful() } - @Test fun get_HTTP_2() { + @Test + fun get_HTTP_2() { enableProtocol(Protocol.HTTP_2) get() } - @Test fun get_HTTPS() { + @Test + fun get_HTTPS() { enableTls() get() } - @Test fun repeatedHeaderNames() { + @Test + fun repeatedHeaderNames() { server.enqueue( - MockResponse() - .addHeader("B", "123") - .addHeader("B", "234") + MockResponse( + headers = headersOf( + "B", "123", + "B", "234", + ) + ) ) executeSynchronously("/", "A", "345", "A", "456") .assertCode(200) @@ -225,12 +238,14 @@ open class CallTest { assertThat(recordedRequest.headers.values("A")).containsExactly("345", "456") } - @Test fun repeatedHeaderNames_HTTP_2() { + @Test + fun repeatedHeaderNames_HTTP_2() { enableProtocol(Protocol.HTTP_2) repeatedHeaderNames() } - @Test fun getWithRequestBody() { + @Test + fun getWithRequestBody() { server.enqueue(MockResponse()) try { Request.Builder().method("GET", "abc".toRequestBody("text/plain".toMediaType())) @@ -239,8 +254,13 @@ open class CallTest { } } - @Test fun head() { - server.enqueue(MockResponse().addHeader("Content-Type: text/plain")) + @Test + fun head() { + server.enqueue( + MockResponse( + headers = headersOf("Content-Type", "text/plain") + ) + ) val request = Request.Builder() .url(server.url("/")) .head() @@ -256,15 +276,15 @@ open class CallTest { assertThat(recordedRequest.getHeader("Content-Length")).isNull() } - @Test fun headResponseContentLengthIsIgnored() { + @Test + fun headResponseContentLengthIsIgnored() { server.enqueue( - MockResponse() + MockResponse.Builder() .clearHeaders() .addHeader("Content-Length", "100") - ) + .build()) server.enqueue( - MockResponse() - .setBody("abc") + MockResponse(body = "abc") ) val headRequest = Request.Builder() .url(server.url("/")) @@ -281,16 +301,14 @@ open class CallTest { assertThat(server.takeRequest().sequenceNumber).isEqualTo(1) } - @Test fun headResponseContentEncodingIsIgnored() { + @Test + fun headResponseContentEncodingIsIgnored() { server.enqueue( - MockResponse() + MockResponse.Builder() .clearHeaders() .addHeader("Content-Encoding", "chunked") - ) - server.enqueue( - MockResponse() - .setBody("abc") - ) + .build()) + server.enqueue(MockResponse(body = "abc")) val headRequest = Request.Builder() .url(server.url("/")) .head() @@ -307,18 +325,21 @@ open class CallTest { assertThat(server.takeRequest().sequenceNumber).isEqualTo(1) } - @Test fun head_HTTPS() { + @Test + fun head_HTTPS() { enableTls() head() } - @Test fun head_HTTP_2() { + @Test + fun head_HTTP_2() { enableProtocol(Protocol.HTTP_2) head() } - @Test fun post() { - server.enqueue(MockResponse().setBody("abc")) + @Test + fun post() { + server.enqueue(MockResponse(body = "abc")) val request = Request( url = server.url("/"), body = "def".toRequestBody("text/plain".toMediaType()), @@ -333,18 +354,21 @@ open class CallTest { assertThat(recordedRequest.getHeader("Content-Type")).isEqualTo("text/plain; charset=utf-8") } - @Test fun post_HTTPS() { + @Test + fun post_HTTPS() { enableTls() post() } - @Test fun post_HTTP_2() { + @Test + fun post_HTTP_2() { enableProtocol(Protocol.HTTP_2) post() } - @Test fun postZeroLength() { - server.enqueue(MockResponse().setBody("abc")) + @Test + fun postZeroLength() { + server.enqueue(MockResponse(body = "abc")) val request = Request.Builder() .url(server.url("/")) .method("POST", ByteArray(0).toRequestBody(null)) @@ -359,47 +383,55 @@ open class CallTest { assertThat(recordedRequest.getHeader("Content-Type")).isNull() } - @Test fun postZerolength_HTTPS() { + @Test + fun postZerolength_HTTPS() { enableTls() postZeroLength() } - @Test fun postZerolength_HTTP_2() { + @Test + fun postZerolength_HTTP_2() { enableProtocol(Protocol.HTTP_2) postZeroLength() } - @Test fun postBodyRetransmittedAfterAuthorizationFail() { + @Test + fun postBodyRetransmittedAfterAuthorizationFail() { postBodyRetransmittedAfterAuthorizationFail("abc") } - @Test fun postBodyRetransmittedAfterAuthorizationFail_HTTPS() { + @Test + fun postBodyRetransmittedAfterAuthorizationFail_HTTPS() { enableTls() postBodyRetransmittedAfterAuthorizationFail("abc") } - @Test fun postBodyRetransmittedAfterAuthorizationFail_HTTP_2() { + @Test + fun postBodyRetransmittedAfterAuthorizationFail_HTTP_2() { enableProtocol(Protocol.HTTP_2) postBodyRetransmittedAfterAuthorizationFail("abc") } /** Don't explode when resending an empty post. https://github.com/square/okhttp/issues/1131 */ - @Test fun postEmptyBodyRetransmittedAfterAuthorizationFail() { + @Test + fun postEmptyBodyRetransmittedAfterAuthorizationFail() { postBodyRetransmittedAfterAuthorizationFail("") } - @Test fun postEmptyBodyRetransmittedAfterAuthorizationFail_HTTPS() { + @Test + fun postEmptyBodyRetransmittedAfterAuthorizationFail_HTTPS() { enableTls() postBodyRetransmittedAfterAuthorizationFail("") } - @Test fun postEmptyBodyRetransmittedAfterAuthorizationFail_HTTP_2() { + @Test + fun postEmptyBodyRetransmittedAfterAuthorizationFail_HTTP_2() { enableProtocol(Protocol.HTTP_2) postBodyRetransmittedAfterAuthorizationFail("") } private fun postBodyRetransmittedAfterAuthorizationFail(body: String) { - server.enqueue(MockResponse().setResponseCode(401)) + server.enqueue(MockResponse(code = 401)) server.enqueue(MockResponse()) val request = Request.Builder() .url(server.url("/")) @@ -422,11 +454,12 @@ open class CallTest { assertThat(recordedRequest2.getHeader("Authorization")).isEqualTo(credential) } - @Test fun attemptAuthorization20Times() { + @Test + fun attemptAuthorization20Times() { for (i in 0..19) { - server.enqueue(MockResponse().setResponseCode(401)) + server.enqueue(MockResponse(code = 401)) } - server.enqueue(MockResponse().setBody("Success!")) + server.enqueue(MockResponse(body = "Success!")) val credential = basic("jesse", "secret") client = client.newBuilder() .authenticator(RecordingOkAuthenticator(credential, null)) @@ -436,9 +469,10 @@ open class CallTest { .assertBody("Success!") } - @Test fun doesNotAttemptAuthorization21Times() { + @Test + fun doesNotAttemptAuthorization21Times() { for (i in 0..20) { - server.enqueue(MockResponse().setResponseCode(401)) + server.enqueue(MockResponse(code = 401)) } val credential = basic("jesse", "secret") client = client.newBuilder() @@ -456,12 +490,14 @@ open class CallTest { * We had a bug where we were passing a null route to the authenticator. * https://github.com/square/okhttp/issues/3809 */ - @Test fun authenticateWithNoConnection() { + @Test + fun authenticateWithNoConnection() { server.enqueue( - MockResponse() - .addHeader("Connection: close") - .setResponseCode(401) - .setSocketPolicy(SocketPolicy.DISCONNECT_AT_END) + MockResponse( + code = 401, + headers = headersOf("Connection", "close"), + socketPolicy = SocketPolicy.DISCONNECT_AT_END + ) ) val authenticator = RecordingOkAuthenticator(null, null) client = client.newBuilder() @@ -472,8 +508,9 @@ open class CallTest { assertThat(authenticator.onlyRoute()).isNotNull } - @Test fun delete() { - server.enqueue(MockResponse().setBody("abc")) + @Test + fun delete() { + server.enqueue(MockResponse(body = "abc")) val request = Request.Builder() .url(server.url("/")) .delete() @@ -488,18 +525,21 @@ open class CallTest { assertThat(recordedRequest.getHeader("Content-Type")).isNull() } - @Test fun delete_HTTPS() { + @Test + fun delete_HTTPS() { enableTls() delete() } - @Test fun delete_HTTP_2() { + @Test + fun delete_HTTP_2() { enableProtocol(Protocol.HTTP_2) delete() } - @Test fun deleteWithRequestBody() { - server.enqueue(MockResponse().setBody("abc")) + @Test + fun deleteWithRequestBody() { + server.enqueue(MockResponse(body = "abc")) val request = Request.Builder() .url(server.url("/")) .method("DELETE", "def".toRequestBody("text/plain".toMediaType())) @@ -512,8 +552,9 @@ open class CallTest { assertThat(recordedRequest.body.readUtf8()).isEqualTo("def") } - @Test fun put() { - server.enqueue(MockResponse().setBody("abc")) + @Test + fun put() { + server.enqueue(MockResponse(body = "abc")) val request = Request.Builder() .url(server.url("/")) .put("def".toRequestBody("text/plain".toMediaType())) @@ -530,18 +571,21 @@ open class CallTest { ) } - @Test fun put_HTTPS() { + @Test + fun put_HTTPS() { enableTls() put() } - @Test fun put_HTTP_2() { + @Test + fun put_HTTP_2() { enableProtocol(Protocol.HTTP_2) put() } - @Test fun patch() { - server.enqueue(MockResponse().setBody("abc")) + @Test + fun patch() { + server.enqueue(MockResponse(body = "abc")) val request = Request.Builder() .url(server.url("/")) .patch("def".toRequestBody("text/plain".toMediaType())) @@ -556,18 +600,21 @@ open class CallTest { assertThat(recordedRequest.getHeader("Content-Type")).isEqualTo("text/plain; charset=utf-8") } - @Test fun patch_HTTP_2() { + @Test + fun patch_HTTP_2() { enableProtocol(Protocol.HTTP_2) patch() } - @Test fun patch_HTTPS() { + @Test + fun patch_HTTPS() { enableTls() patch() } - @Test fun customMethodWithBody() { - server.enqueue(MockResponse().setBody("abc")) + @Test + fun customMethodWithBody() { + server.enqueue(MockResponse(body = "abc")) val request = Request.Builder() .url(server.url("/")) .method("CUSTOM", "def".toRequestBody("text/plain".toMediaType())) @@ -583,7 +630,8 @@ open class CallTest { .isEqualTo("text/plain; charset=utf-8") } - @Test fun unspecifiedRequestBodyContentTypeDoesNotGetDefault() { + @Test + fun unspecifiedRequestBodyContentTypeDoesNotGetDefault() { server.enqueue(MockResponse()) val request = Request.Builder() .url(server.url("/")) @@ -596,11 +644,13 @@ open class CallTest { assertThat(recordedRequest.body.readUtf8()).isEqualTo("abc") } - @Test fun illegalToExecuteTwice() { + @Test + fun illegalToExecuteTwice() { server.enqueue( - MockResponse() - .setBody("abc") - .addHeader("Content-Type: text/plain") + MockResponse( + headers = headersOf("Content-Type", "text/plain"), + body = "abc", + ) ) val request = Request.Builder() .url(server.url("/")) @@ -624,11 +674,13 @@ open class CallTest { assertThat(server.takeRequest().getHeader("User-Agent")).isEqualTo("SyncApiTest") } - @Test fun illegalToExecuteTwice_Async() { + @Test + fun illegalToExecuteTwice_Async() { server.enqueue( - MockResponse() - .setBody("abc") - .addHeader("Content-Type: text/plain") + MockResponse( + headers = headersOf("Content-Type", "text/plain"), + body = "abc", + ) ) val request = Request.Builder() .url(server.url("/")) @@ -652,9 +704,10 @@ open class CallTest { callback.await(request.url).assertSuccessful() } - @Test fun legalToExecuteTwiceCloning() { - server.enqueue(MockResponse().setBody("abc")) - server.enqueue(MockResponse().setBody("def")) + @Test + fun legalToExecuteTwiceCloning() { + server.enqueue(MockResponse(body = "abc")) + server.enqueue(MockResponse(body = "def")) val request = Request(server.url("/")) val call = client.newCall(request) val response1 = call.execute() @@ -664,9 +717,10 @@ open class CallTest { assertThat("def").isEqualTo(response2.body.string()) } - @Test fun legalToExecuteTwiceCloning_Async() { - server.enqueue(MockResponse().setBody("abc")) - server.enqueue(MockResponse().setBody("def")) + @Test + fun legalToExecuteTwiceCloning_Async() { + server.enqueue(MockResponse(body = "abc")) + server.enqueue(MockResponse(body = "def")) val request = Request(server.url("/")) val call = client.newCall(request) call.enqueue(callback) @@ -681,11 +735,13 @@ open class CallTest { assertThat(bodies).contains("def") } - @Test fun get_Async() { + @Test + fun get_Async() { server.enqueue( - MockResponse() - .setBody("abc") - .addHeader("Content-Type: text/plain") + MockResponse( + headers = headersOf("Content-Type", "text/plain"), + body = "abc", + ) ) val request = Request.Builder() .url(server.url("/")) @@ -699,7 +755,8 @@ open class CallTest { assertThat(server.takeRequest().getHeader("User-Agent")).isEqualTo("AsyncApiTest") } - @Test fun exceptionThrownByOnResponseIsRedactedAndLogged() { + @Test + fun exceptionThrownByOnResponseIsRedactedAndLogged() { server.enqueue(MockResponse()) val request = Request(server.url("/secret")) client.newCall(request).enqueue(object : Callback { @@ -715,10 +772,11 @@ open class CallTest { .isEqualTo("INFO: Callback failure for call to " + server.url("/") + "...") } - @Test fun connectionPooling() { - server.enqueue(MockResponse().setBody("abc")) - server.enqueue(MockResponse().setBody("def")) - server.enqueue(MockResponse().setBody("ghi")) + @Test + fun connectionPooling() { + server.enqueue(MockResponse(body = "abc")) + server.enqueue(MockResponse(body = "def")) + server.enqueue(MockResponse(body = "ghi")) executeSynchronously("/a").assertBody("abc") executeSynchronously("/b").assertBody("def") executeSynchronously("/c").assertBody("ghi") @@ -733,10 +791,11 @@ open class CallTest { * * https://github.com/square/okhttp/issues/5519 */ - @Test fun connectionPoolingWithFreshClientSamePool() { - server.enqueue(MockResponse().setBody("abc")) - server.enqueue(MockResponse().setBody("def")) - server.enqueue(MockResponse().setBody("ghi")) + @Test + fun connectionPoolingWithFreshClientSamePool() { + server.enqueue(MockResponse(body = "abc")) + server.enqueue(MockResponse(body = "def")) + server.enqueue(MockResponse(body = "ghi")) client = OkHttpClient.Builder() .connectionPool(client.connectionPool) .proxy(server.toProxyAddress()) @@ -757,13 +816,14 @@ open class CallTest { assertThat(server.takeRequest().sequenceNumber).isEqualTo(2) } - @Test fun connectionPoolingWithClientBuiltOffProxy() { + @Test + fun connectionPoolingWithClientBuiltOffProxy() { client = OkHttpClient.Builder() .proxy(server.toProxyAddress()) .build() - server.enqueue(MockResponse().setBody("abc")) - server.enqueue(MockResponse().setBody("def")) - server.enqueue(MockResponse().setBody("ghi")) + server.enqueue(MockResponse(body = "abc")) + server.enqueue(MockResponse(body = "def")) + server.enqueue(MockResponse(body = "ghi")) client = client.newBuilder().build() executeSynchronously("/a").assertBody("abc") client = client.newBuilder().build() @@ -775,10 +835,11 @@ open class CallTest { assertThat(server.takeRequest().sequenceNumber).isEqualTo(2) } - @Test fun connectionPooling_Async() { - server.enqueue(MockResponse().setBody("abc")) - server.enqueue(MockResponse().setBody("def")) - server.enqueue(MockResponse().setBody("ghi")) + @Test + fun connectionPooling_Async() { + server.enqueue(MockResponse(body = "abc")) + server.enqueue(MockResponse(body = "def")) + server.enqueue(MockResponse(body = "ghi")) client.newCall(Request.Builder().url(server.url("/a")).build()).enqueue(callback) callback.await(server.url("/a")).assertBody("abc") client.newCall(Request.Builder().url(server.url("/b")).build()).enqueue(callback) @@ -790,9 +851,10 @@ open class CallTest { assertThat(server.takeRequest().sequenceNumber).isEqualTo(2) } - @Test fun connectionReuseWhenResponseBodyConsumed_Async() { - server.enqueue(MockResponse().setBody("abc")) - server.enqueue(MockResponse().setBody("def")) + @Test + fun connectionReuseWhenResponseBodyConsumed_Async() { + server.enqueue(MockResponse(body = "abc")) + server.enqueue(MockResponse(body = "def")) val request = Request.Builder().url(server.url("/a")).build() client.newCall(request).enqueue(object : Callback { override fun onFailure(call: Call, e: IOException) { @@ -816,9 +878,13 @@ open class CallTest { assertThat(server.takeRequest().sequenceNumber).isEqualTo(1) } - @Test fun timeoutsUpdatedOnReusedConnections() { - server.enqueue(MockResponse().setBody("abc")) - server.enqueue(MockResponse().setBody("def").throttleBody(1, 750, TimeUnit.MILLISECONDS)) + @Test + fun timeoutsUpdatedOnReusedConnections() { + server.enqueue(MockResponse(body = "abc")) + server.enqueue(MockResponse.Builder() + .body("def") + .throttleBody(1, 750, TimeUnit.MILLISECONDS) + .build()) // First request: time out after 1s. client = client.newBuilder() @@ -851,16 +917,11 @@ open class CallTest { } /** https://github.com/square/okhttp/issues/442 */ - @Test fun tlsTimeoutsNotRetried() { + @Test + fun tlsTimeoutsNotRetried() { enableTls() - server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.NO_RESPONSE) - ) - server.enqueue( - MockResponse() - .setBody("unreachable!") - ) + server.enqueue(MockResponse(socketPolicy = SocketPolicy.NO_RESPONSE)) + server.enqueue(MockResponse(body = "unreachable!")) client = client.newBuilder() .readTimeout(Duration.ofMillis(100)) .build() @@ -877,14 +938,12 @@ open class CallTest { * Make a request with two routes. The first route will time out because it's connecting to a * special address that never connects. The automatic retry will succeed. */ - @Test fun connectTimeoutsAttemptsAlternateRoute() { + @Test + fun connectTimeoutsAttemptsAlternateRoute() { val proxySelector = RecordingProxySelector() proxySelector.proxies.add(Proxy(Proxy.Type.HTTP, TestUtil.UNREACHABLE_ADDRESS_IPV4)) proxySelector.proxies.add(server.toProxyAddress()) - server.enqueue( - MockResponse() - .setBody("success!") - ) + server.enqueue(MockResponse(body = "success!")) client = client.newBuilder() .proxySelector(proxySelector) .readTimeout(Duration.ofMillis(100)) @@ -897,11 +956,9 @@ open class CallTest { } /** https://github.com/square/okhttp/issues/4875 */ - @Test fun interceptorRecoversWhenRoutesExhausted() { - server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.DISCONNECT_AT_START) - ) + @Test + fun interceptorRecoversWhenRoutesExhausted() { + server.enqueue(MockResponse(socketPolicy = SocketPolicy.DISCONNECT_AT_START)) server.enqueue(MockResponse()) client = client.newBuilder() .addInterceptor(Interceptor { chain: Interceptor.Chain -> @@ -919,10 +976,10 @@ open class CallTest { } /** https://github.com/square/okhttp/issues/4761 */ - @Test fun interceptorCallsProceedWithoutClosingPriorResponse() { + @Test + fun interceptorCallsProceedWithoutClosingPriorResponse() { server.enqueue( - MockResponse() - .setBody("abc") + MockResponse(body = "abc") ) client = clientTestRule.newClientBuilder() .addInterceptor(Interceptor { chain: Interceptor.Chain -> @@ -946,14 +1003,11 @@ open class CallTest { * Make a request with two routes. The first route will fail because the null server connects but * never responds. The manual retry will succeed. */ - @Test fun readTimeoutFails() { - server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.STALL_SOCKET_AT_START) - ) + @Test + fun readTimeoutFails() { + server.enqueue(MockResponse(socketPolicy = SocketPolicy.STALL_SOCKET_AT_START)) server2.enqueue( - MockResponse() - .setBody("success!") + MockResponse(body = "success!") ) val proxySelector = RecordingProxySelector() proxySelector.proxies.add(server.toProxyAddress()) @@ -971,7 +1025,8 @@ open class CallTest { } /** https://github.com/square/okhttp/issues/1801 */ - @Test fun asyncCallEngineInitialized() { + @Test + fun asyncCallEngineInitialized() { val c = client.newBuilder() .addInterceptor(Interceptor { throw IOException() }) .build() @@ -981,7 +1036,8 @@ open class CallTest { assertThat(response.request).isEqualTo(request) } - @Test fun reusedSinksGetIndependentTimeoutInstances() { + @Test + fun reusedSinksGetIndependentTimeoutInstances() { server.enqueue(MockResponse()) server.enqueue(MockResponse()) @@ -1022,9 +1078,10 @@ open class CallTest { assertThat(server.takeRequest().sequenceNumber).isEqualTo(1) } - @Test fun reusedSourcesGetIndependentTimeoutInstances() { - server.enqueue(MockResponse().setBody("abc")) - server.enqueue(MockResponse().setBody("def")) + @Test + fun reusedSourcesGetIndependentTimeoutInstances() { + server.enqueue(MockResponse(body = "abc")) + server.enqueue(MockResponse(body = "def")) // Call 1: set a deadline on the response body. val request1 = Request.Builder().url(server.url("/")).build() @@ -1045,29 +1102,34 @@ open class CallTest { assertThat(server.takeRequest().sequenceNumber).isEqualTo(1) } - @Test fun tls() { + @Test + fun tls() { enableTls() server.enqueue( - MockResponse() - .setBody("abc") - .addHeader("Content-Type: text/plain") + MockResponse( + headers = headersOf("Content-Type", "text/plain"), + body = "abc", + ) ) executeSynchronously("/").assertHandshake() } - @Test fun tls_Async() { + @Test + fun tls_Async() { enableTls() server.enqueue( - MockResponse() - .setBody("abc") - .addHeader("Content-Type: text/plain") + MockResponse( + headers = headersOf("Content-Type", "text/plain"), + body = "abc", + ) ) val request = Request(server.url("/")) client.newCall(request).enqueue(callback) callback.await(request.url).assertHandshake() } - @Test fun recoverWhenRetryOnConnectionFailureIsTrue() { + @Test + fun recoverWhenRetryOnConnectionFailureIsTrue() { // Set to 2 because the seeding request will count down before the retried request does. val requestFinished = CountDownLatch(2) val dispatcher: QueueDispatcher = object : QueueDispatcher() { @@ -1078,11 +1140,9 @@ open class CallTest { return super.dispatch(request) } } - dispatcher.enqueueResponse(MockResponse().setBody("seed connection pool")) - dispatcher.enqueueResponse( - MockResponse().setSocketPolicy(SocketPolicy.DISCONNECT_AFTER_REQUEST) - ) - dispatcher.enqueueResponse(MockResponse().setBody("retry success")) + dispatcher.enqueueResponse(MockResponse(body = "seed connection pool")) + dispatcher.enqueueResponse(MockResponse(socketPolicy = SocketPolicy.DISCONNECT_AFTER_REQUEST)) + dispatcher.enqueueResponse(MockResponse(body = "retry success")) server.dispatcher = dispatcher listener = object : RecordingEventListener() { override fun requestHeadersEnd(call: Call, request: Request) { @@ -1110,15 +1170,17 @@ open class CallTest { listener.removeUpToEvent(CallEnd::class.java) } - @Test fun recoverWhenRetryOnConnectionFailureIsTrue_HTTP2() { + @Test + fun recoverWhenRetryOnConnectionFailureIsTrue_HTTP2() { enableProtocol(Protocol.HTTP_2) recoverWhenRetryOnConnectionFailureIsTrue() } - @Test fun noRecoverWhenRetryOnConnectionFailureIsFalse() { - server.enqueue(MockResponse().setBody("seed connection pool")) - server.enqueue(MockResponse().setSocketPolicy(SocketPolicy.DISCONNECT_AFTER_REQUEST)) - server.enqueue(MockResponse().setBody("unreachable!")) + @Test + fun noRecoverWhenRetryOnConnectionFailureIsFalse() { + server.enqueue(MockResponse(body = "seed connection pool")) + server.enqueue(MockResponse(socketPolicy = SocketPolicy.DISCONNECT_AFTER_REQUEST)) + server.enqueue(MockResponse(body = "unreachable!")) client = client.newBuilder() .dns(DoubleInetAddressDns()) .retryOnConnectionFailure(false) @@ -1141,10 +1203,11 @@ open class CallTest { noRecoverWhenRetryOnConnectionFailureIsFalse() } - @Test fun tlsHandshakeFailure_noFallbackByDefault() { + @Test + fun tlsHandshakeFailure_noFallbackByDefault() { server.useHttps(handshakeCertificates.sslSocketFactory()) - server.enqueue(MockResponse().setSocketPolicy(SocketPolicy.FAIL_HANDSHAKE)) - server.enqueue(MockResponse().setBody("response that will never be received")) + server.enqueue(MockResponse(socketPolicy = SocketPolicy.FAIL_HANDSHAKE)) + server.enqueue(MockResponse(body = "response that will never be received")) val response = executeSynchronously("/") response.assertFailure( SSLException::class.java, // JDK 11 response to the FAIL_HANDSHAKE @@ -1154,10 +1217,11 @@ open class CallTest { assertThat(client.connectionSpecs).doesNotContain(ConnectionSpec.COMPATIBLE_TLS) } - @Test fun recoverFromTlsHandshakeFailure() { + @Test + fun recoverFromTlsHandshakeFailure() { server.useHttps(handshakeCertificates.sslSocketFactory()) - server.enqueue(MockResponse().setSocketPolicy(SocketPolicy.FAIL_HANDSHAKE)) - server.enqueue(MockResponse().setBody("abc")) + server.enqueue(MockResponse(socketPolicy = SocketPolicy.FAIL_HANDSHAKE)) + server.enqueue(MockResponse(body = "abc")) client = client.newBuilder() .hostnameVerifier( RecordingHostnameVerifier() @@ -1170,7 +1234,8 @@ open class CallTest { executeSynchronously("/").assertBody("abc") } - @Test fun recoverFromTlsHandshakeFailure_tlsFallbackScsvEnabled() { + @Test + fun recoverFromTlsHandshakeFailure_tlsFallbackScsvEnabled() { platform.assumeNotConscrypt() val tlsFallbackScsv = "TLS_FALLBACK_SCSV" val supportedCiphers = listOf(*handshakeCertificates.sslSocketFactory().supportedCipherSuites) @@ -1179,7 +1244,7 @@ open class CallTest { return } server.useHttps(handshakeCertificates.sslSocketFactory()) - server.enqueue(MockResponse().setSocketPolicy(SocketPolicy.FAIL_HANDSHAKE)) + server.enqueue(MockResponse(socketPolicy = SocketPolicy.FAIL_HANDSHAKE)) val clientSocketFactory = RecordingSSLSocketFactory( handshakeCertificates.sslSocketFactory() ) @@ -1204,10 +1269,11 @@ open class CallTest { .contains(tlsFallbackScsv) } - @Test fun recoverFromTlsHandshakeFailure_Async() { + @Test + fun recoverFromTlsHandshakeFailure_Async() { server.useHttps(handshakeCertificates.sslSocketFactory()) - server.enqueue(MockResponse().setSocketPolicy(SocketPolicy.FAIL_HANDSHAKE)) - server.enqueue(MockResponse().setBody("abc")) + server.enqueue(MockResponse(socketPolicy = SocketPolicy.FAIL_HANDSHAKE)) + server.enqueue(MockResponse(body = "abc")) client = client.newBuilder() .hostnameVerifier( RecordingHostnameVerifier() @@ -1223,7 +1289,8 @@ open class CallTest { callback.await(request.url).assertBody("abc") } - @Test fun noRecoveryFromTlsHandshakeFailureWhenTlsFallbackIsDisabled() { + @Test + fun noRecoveryFromTlsHandshakeFailureWhenTlsFallbackIsDisabled() { client = client.newBuilder() .connectionSpecs(listOf(ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT)) .hostnameVerifier(RecordingHostnameVerifier()) @@ -1233,7 +1300,7 @@ open class CallTest { ) .build() server.useHttps(handshakeCertificates.sslSocketFactory()) - server.enqueue(MockResponse().setSocketPolicy(SocketPolicy.FAIL_HANDSHAKE)) + server.enqueue(MockResponse(socketPolicy = SocketPolicy.FAIL_HANDSHAKE)) val request = Request.Builder().url(server.url("/")).build() try { client.newCall(request).execute() @@ -1249,7 +1316,8 @@ open class CallTest { } } - @Test fun tlsHostnameVerificationFailure() { + @Test + fun tlsHostnameVerificationFailure() { assumeNotWindows() server.enqueue(MockResponse()) val serverCertificate = HeldCertificate.Builder() @@ -1274,7 +1342,8 @@ open class CallTest { * Anonymous cipher suites were disabled in OpenJDK because they're rarely used and permit * man-in-the-middle attacks. https://bugs.openjdk.java.net/browse/JDK-8212823 */ - @Test fun anonCipherSuiteUnsupported() { + @Test + fun anonCipherSuiteUnsupported() { platform.assumeNotConscrypt() // The _anon_ suites became unsupported in "1.8.0_201" and "11.0.2". @@ -1307,7 +1376,8 @@ open class CallTest { .assertFailure(SSLHandshakeException::class.java) } - @Test fun cleartextCallsFailWhenCleartextIsDisabled() { + @Test + fun cleartextCallsFailWhenCleartextIsDisabled() { // Configure the client with only TLS configurations. No cleartext! client = client.newBuilder() .connectionSpecs(listOf(ConnectionSpec.MODERN_TLS, ConnectionSpec.COMPATIBLE_TLS)) @@ -1324,7 +1394,8 @@ open class CallTest { } } - @Test fun httpsCallsFailWhenProtocolIsH2PriorKnowledge() { + @Test + fun httpsCallsFailWhenProtocolIsH2PriorKnowledge() { client = client.newBuilder() .protocols(listOf(Protocol.H2_PRIOR_KNOWLEDGE)) .build() @@ -1339,12 +1410,14 @@ open class CallTest { } } - @Test fun setFollowSslRedirectsFalse() { + @Test + fun setFollowSslRedirectsFalse() { enableTls() server.enqueue( - MockResponse() - .setResponseCode(301) - .addHeader("Location: http://square.com") + MockResponse( + code = 301, + headers = headersOf("Location", "http://square.com"), + ) ) client = client.newBuilder() .followSslRedirects(false) @@ -1355,7 +1428,8 @@ open class CallTest { response.body.close() } - @Test fun matchingPinnedCertificate() { + @Test + fun matchingPinnedCertificate() { // Fails on 11.0.1 https://github.com/square/okhttp/issues/4703 enableTls() server.enqueue(MockResponse()) @@ -1384,7 +1458,8 @@ open class CallTest { response2.body.close() } - @Test fun unmatchingPinnedCertificate() { + @Test + fun unmatchingPinnedCertificate() { enableTls() server.enqueue(MockResponse()) @@ -1407,8 +1482,9 @@ open class CallTest { } } - @Test fun post_Async() { - server.enqueue(MockResponse().setBody("abc")) + @Test + fun post_Async() { + server.enqueue(MockResponse(body = "abc")) val request = Request( url = server.url("/"), body = "def".toRequestBody("text/plain".toMediaType()) @@ -1423,10 +1499,11 @@ open class CallTest { assertThat(recordedRequest.getHeader("Content-Type")).isEqualTo("text/plain; charset=utf-8") } - @Test fun serverHalfClosingBeforeResponse() { - server.enqueue(MockResponse().setBody("abc")) - server.enqueue(MockResponse().setSocketPolicy(SocketPolicy.HALF_CLOSE_AFTER_REQUEST)) - server.enqueue(MockResponse().setBody("abc")) + @Test + fun serverHalfClosingBeforeResponse() { + server.enqueue(MockResponse(body = "abc")) + server.enqueue(MockResponse(socketPolicy = SocketPolicy.HALF_CLOSE_AFTER_REQUEST)) + server.enqueue(MockResponse(body = "abc")) val client = client.newBuilder() .retryOnConnectionFailure(false) @@ -1478,10 +1555,11 @@ open class CallTest { assertThat(get2.sequenceNumber).isEqualTo(0) } - @Test fun postBodyRetransmittedOnFailureRecovery() { - server.enqueue(MockResponse().setBody("abc")) - server.enqueue(MockResponse().setSocketPolicy(SocketPolicy.DISCONNECT_AFTER_REQUEST)) - server.enqueue(MockResponse().setBody("def")) + @Test + fun postBodyRetransmittedOnFailureRecovery() { + server.enqueue(MockResponse(body = "abc")) + server.enqueue(MockResponse(socketPolicy = SocketPolicy.DISCONNECT_AFTER_REQUEST)) + server.enqueue(MockResponse(body = "def")) // Seed the connection pool so we have something that can fail. val request1 = Request.Builder().url(server.url("/")).build() @@ -1503,18 +1581,23 @@ open class CallTest { assertThat(post2.sequenceNumber).isEqualTo(0) } - @Test fun postBodyRetransmittedOnFailureRecovery_HTTP2() { + @Test + fun postBodyRetransmittedOnFailureRecovery_HTTP2() { enableProtocol(Protocol.HTTP_2) postBodyRetransmittedOnFailureRecovery() } - @Test fun cacheHit() { + @Test + fun cacheHit() { server.enqueue( - MockResponse() - .addHeader("ETag: v1") - .addHeader("Cache-Control: max-age=60") - .addHeader("Vary: Accept-Charset") - .setBody("A") + MockResponse( + headers = headersOf( + "ETag", "v1", + "Cache-Control", "max-age=60", + "Vary", "Accept-Charset", + ), + body = "A", + ) ) client = client.newBuilder() .cache(cache) @@ -1572,19 +1655,24 @@ open class CallTest { cacheHit.assertNoNetworkResponse() } - @Test fun conditionalCacheHit() { + @Test + fun conditionalCacheHit() { server.enqueue( - MockResponse() - .addHeader("ETag: v1") - .addHeader("Vary: Accept-Charset") - .addHeader("Donut: a") - .setBody("A") + MockResponse( + headers = headersOf( + "ETag", "v1", + "Vary", "Accept-Charset", + "Donut", "a", + ), + body = "A", + ) ) server.enqueue( - MockResponse().clearHeaders() + MockResponse.Builder() + .clearHeaders() .addHeader("Donut: b") - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED) - ) + .code(HttpURLConnection.HTTP_NOT_MODIFIED) + .build()) client = client.newBuilder() .cache(cache) .build() @@ -1641,13 +1729,19 @@ open class CallTest { .assertReceivedResponseAtMillis(request2SentAt, request2ReceivedAt) } - @Test fun conditionalCacheHit_Async() { - server.enqueue(MockResponse().setBody("A").addHeader("ETag: v1")) + @Test + fun conditionalCacheHit_Async() { server.enqueue( - MockResponse() - .clearHeaders() - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED) + MockResponse( + headers = headersOf("ETag", "v1"), + body = "A", + ) ) + server.enqueue( + MockResponse.Builder() + .clearHeaders() + .code(HttpURLConnection.HTTP_NOT_MODIFIED) + .build()) client = client.newBuilder() .cache(cache) .build() @@ -1661,18 +1755,23 @@ open class CallTest { assertThat(server.takeRequest().getHeader("If-None-Match")).isEqualTo("v1") } - @Test fun conditionalCacheMiss() { + @Test + fun conditionalCacheMiss() { server.enqueue( - MockResponse() - .addHeader("ETag: v1") - .addHeader("Vary: Accept-Charset") - .addHeader("Donut: a") - .setBody("A") + MockResponse( + headers = headersOf( + "ETag", "v1", + "Vary", "Accept-Charset", + "Donut", "a", + ), + body = "A", + ) ) server.enqueue( - MockResponse() - .addHeader("Donut: b") - .setBody("B") + MockResponse( + headers = headersOf("Donut", "b"), + body = "B", + ) ) client = client.newBuilder() .cache(cache) @@ -1720,9 +1819,15 @@ open class CallTest { .assertReceivedResponseAtMillis(request2SentAt, request2ReceivedAt) } - @Test fun conditionalCacheMiss_Async() { - server.enqueue(MockResponse().setBody("A").addHeader("ETag: v1")) - server.enqueue(MockResponse().setBody("B")) + @Test + fun conditionalCacheMiss_Async() { + server.enqueue( + MockResponse( + body = "A", + headers = headersOf("ETag", "v1") + ) + ) + server.enqueue(MockResponse(body = "B")) client = client.newBuilder() .cache(cache) .build() @@ -1736,7 +1841,8 @@ open class CallTest { assertThat(server.takeRequest().getHeader("If-None-Match")).isEqualTo("v1") } - @Test fun onlyIfCachedReturns504WhenNotCached() { + @Test + fun onlyIfCachedReturns504WhenNotCached() { executeSynchronously("/", "Cache-Control", "only-if-cached") .assertCode(504) .assertBody("") @@ -1744,16 +1850,18 @@ open class CallTest { .assertNoCacheResponse() } - @Test fun networkDropsOnConditionalGet() { + @Test + fun networkDropsOnConditionalGet() { client = client.newBuilder() .cache(cache) .build() // Seed the cache. server.enqueue( - MockResponse() - .addHeader("ETag: v1") - .setBody("A") + MockResponse( + headers = headersOf("ETag", "v1"), + body = "A", + ) ) executeSynchronously("/") .assertCode(200) @@ -1766,22 +1874,29 @@ open class CallTest { executeSynchronously("/").assertFailure(UnknownHostException::class.java) } - @Test fun redirect() { + @Test + fun redirect() { server.enqueue( - MockResponse() - .setResponseCode(301) - .addHeader("Location: /b") - .addHeader("Test", "Redirect from /a to /b") - .setBody("/a has moved!") + MockResponse( + code = 301, + headers = headersOf( + "Location", "/b", + "Test", "Redirect from /a to /b", + ), + body = "/a has moved!", + ) ) server.enqueue( - MockResponse() - .setResponseCode(302) - .addHeader("Location: /c") - .addHeader("Test", "Redirect from /b to /c") - .setBody("/b has moved!") + MockResponse( + code = 302, + headers = headersOf( + "Location", "/c", + "Test", "Redirect from /b to /c", + ), + body = "/b has moved!", + ) ) - server.enqueue(MockResponse().setBody("C")) + server.enqueue(MockResponse(body = "C")) executeSynchronously("/a") .assertCode(200) .assertBody("C") @@ -1800,14 +1915,16 @@ open class CallTest { assertThat(server.takeRequest().sequenceNumber).isEqualTo(2) } - @Test fun postRedirectsToGet() { + @Test + fun postRedirectsToGet() { server.enqueue( - MockResponse() - .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) - .addHeader("Location: /page2") - .setBody("This page has moved!") + MockResponse( + code = HttpURLConnection.HTTP_MOVED_TEMP, + headers = headersOf("Location", "/page2"), + body = "This page has moved!", + ) ) - server.enqueue(MockResponse().setBody("Page 2")) + server.enqueue(MockResponse(body = "Page 2")) val response = client.newCall( Request( url = server.url("/page1"), @@ -1822,43 +1939,51 @@ open class CallTest { assertThat(page2.requestLine).isEqualTo("GET /page2 HTTP/1.1") } - @Test fun getClientRequestTimeout() { + @Test + fun getClientRequestTimeout() { server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.DISCONNECT_AT_END) - .setResponseCode(408) - .setHeader("Connection", "Close") - .setBody("You took too long!") + MockResponse( + code = 408, + headers = headersOf("Connection", "Close"), + body = "You took too long!", + socketPolicy = SocketPolicy.DISCONNECT_AT_END, + ) ) - server.enqueue(MockResponse().setBody("Body")) + server.enqueue(MockResponse(body = "Body")) val request = Request(server.url("/")) val response = client.newCall(request).execute() assertThat(response.body.string()).isEqualTo("Body") } - @Test fun getClientRequestTimeoutWithBackPressure() { + @Test + fun getClientRequestTimeoutWithBackPressure() { server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.DISCONNECT_AT_END) - .setResponseCode(408) - .setHeader("Connection", "Close") - .setHeader("Retry-After", "1") - .setBody("You took too long!") + MockResponse( + code = 408, + headers = headersOf( + "Connection", "Close", + "Retry-After", "1", + ), + body = "You took too long!", + socketPolicy = SocketPolicy.DISCONNECT_AT_END, + ) ) val request = Request(server.url("/")) val response = client.newCall(request).execute() assertThat(response.body.string()).isEqualTo("You took too long!") } - @Test fun requestBodyRetransmittedOnClientRequestTimeout() { + @Test + fun requestBodyRetransmittedOnClientRequestTimeout() { server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.DISCONNECT_AT_END) - .setResponseCode(408) - .setHeader("Connection", "Close") - .setBody("You took too long!") + MockResponse( + code = 408, + headers = headersOf("Connection", "Close"), + body = "You took too long!", + socketPolicy = SocketPolicy.DISCONNECT_AT_END, + ) ) - server.enqueue(MockResponse().setBody("Body")) + server.enqueue(MockResponse(body = "Body")) val request = Request( server.url("/"), body = "Hello".toRequestBody("text/plain".toMediaType()), @@ -1871,13 +1996,15 @@ open class CallTest { assertThat(request2.body.readUtf8()).isEqualTo("Hello") } - @Test fun disableClientRequestTimeoutRetry() { + @Test + fun disableClientRequestTimeoutRetry() { server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.DISCONNECT_AT_END) - .setResponseCode(408) - .setHeader("Connection", "Close") - .setBody("You took too long!") + MockResponse( + code = 408, + headers = headersOf("Connection", "Close"), + body = "You took too long!", + socketPolicy = SocketPolicy.DISCONNECT_AT_END, + ) ) client = client.newBuilder() .retryOnConnectionFailure(false) @@ -1888,20 +2015,23 @@ open class CallTest { assertThat(response.body.string()).isEqualTo("You took too long!") } - @Test fun maxClientRequestTimeoutRetries() { + @Test + fun maxClientRequestTimeoutRetries() { server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.DISCONNECT_AT_END) - .setResponseCode(408) - .setHeader("Connection", "Close") - .setBody("You took too long!") + MockResponse( + code = 408, + headers = headersOf("Connection", "Close"), + body = "You took too long!", + socketPolicy = SocketPolicy.DISCONNECT_AT_END, + ) ) server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.DISCONNECT_AT_END) - .setResponseCode(408) - .setHeader("Connection", "Close") - .setBody("You took too long!") + MockResponse( + code = 408, + headers = headersOf("Connection", "Close"), + body = "You took too long!", + socketPolicy = SocketPolicy.DISCONNECT_AT_END, + ) ) val request = Request(server.url("/")) val response = client.newCall(request).execute() @@ -1910,22 +2040,29 @@ open class CallTest { assertThat(server.requestCount).isEqualTo(2) } - @Test fun maxUnavailableTimeoutRetries() { + @Test + fun maxUnavailableTimeoutRetries() { server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.DISCONNECT_AT_END) - .setResponseCode(503) - .setHeader("Connection", "Close") - .setHeader("Retry-After", "0") - .setBody("You took too long!") + MockResponse( + code = 503, + headers = headersOf( + "Connection", "Close", + "Retry-After", "0", + ), + body = "You took too long!", + socketPolicy = SocketPolicy.DISCONNECT_AT_END, + ) ) server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.DISCONNECT_AT_END) - .setResponseCode(503) - .setHeader("Connection", "Close") - .setHeader("Retry-After", "0") - .setBody("You took too long!") + MockResponse( + code = 503, + headers = headersOf( + "Connection", "Close", + "Retry-After", "0", + ), + body = "You took too long!", + socketPolicy = SocketPolicy.DISCONNECT_AT_END, + ) ) val request = Request(server.url("/")) val response = client.newCall(request).execute() @@ -1934,31 +2071,36 @@ open class CallTest { assertThat(server.requestCount).isEqualTo(2) } - @Test fun retryOnUnavailableWith0RetryAfter() { + @Test + fun retryOnUnavailableWith0RetryAfter() { server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.DISCONNECT_AT_END) - .setResponseCode(503) - .setHeader("Connection", "Close") - .setHeader("Retry-After", "0") - .setBody("You took too long!") + MockResponse( + code = 503, + headers = headersOf( + "Connection", "Close", + "Retry-After", "0", + ), + body = "You took too long!", + socketPolicy = SocketPolicy.DISCONNECT_AT_END, + ) ) - server.enqueue(MockResponse().setBody("Body")) + server.enqueue(MockResponse(body = "Body")) val request = Request(server.url("/")) val response = client.newCall(request).execute() assertThat(response.body.string()).isEqualTo("Body") } - @Test fun canRetryNormalRequestBody() { + @Test + fun canRetryNormalRequestBody() { server.enqueue( - MockResponse() - .setResponseCode(503) - .setHeader("Retry-After", "0") - .setBody("please retry") + MockResponse( + code = 503, + headers = headersOf("Retry-After", "0"), + body = "please retry", + ) ) server.enqueue( - MockResponse() - .setBody("thank you for retrying") + MockResponse(body = "thank you for retrying") ) val request = Request( url = server.url("/"), @@ -1981,16 +2123,17 @@ open class CallTest { assertThat(server.requestCount).isEqualTo(2) } - @Test fun cannotRetryOneShotRequestBody() { + @Test + fun cannotRetryOneShotRequestBody() { server.enqueue( - MockResponse() - .setResponseCode(503) - .setHeader("Retry-After", "0") - .setBody("please retry") + MockResponse( + code = 503, + headers = headersOf("Retry-After", "0"), + body = "please retry", + ) ) server.enqueue( - MockResponse() - .setBody("thank you for retrying") + MockResponse(body = "thank you for retrying") ) val request = Request( url = server.url("/"), @@ -2016,15 +2159,17 @@ open class CallTest { assertThat(server.requestCount).isEqualTo(1) } - @Test fun propfindRedirectsToPropfindAndMaintainsRequestBody() { + @Test + fun propfindRedirectsToPropfindAndMaintainsRequestBody() { // given server.enqueue( - MockResponse() - .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) - .addHeader("Location: /page2") - .setBody("This page has moved!") + MockResponse( + code = HttpURLConnection.HTTP_MOVED_TEMP, + headers = headersOf("Location", "/page2"), + body = "This page has moved!", + ) ) - server.enqueue(MockResponse().setBody("Page 2")) + server.enqueue(MockResponse(body = "Page 2")) // when val response = client.newCall( @@ -2044,11 +2189,15 @@ open class CallTest { assertThat(page2.body.readUtf8()).isEqualTo("Request Body") } - @Test fun responseCookies() { + @Test + fun responseCookies() { server.enqueue( - MockResponse() - .addHeader("Set-Cookie", "a=b; Expires=Thu, 01 Jan 1970 00:00:00 GMT") - .addHeader("Set-Cookie", "c=d; Expires=Fri, 02 Jan 1970 23:59:59 GMT; path=/bar; secure") + MockResponse( + headers = headersOf( + "Set-Cookie", "a=b; Expires=Thu, 01 Jan 1970 00:00:00 GMT", + "Set-Cookie", "c=d; Expires=Fri, 02 Jan 1970 23:59:59 GMT; path=/bar; secure", + ) + ) ) val cookieJar = RecordingCookieJar() client = client.newBuilder() @@ -2063,7 +2212,8 @@ open class CallTest { .isEqualTo("c=d; expires=Fri, 02 Jan 1970 23:59:59 GMT; path=/bar; secure") } - @Test fun requestCookies() { + @Test + fun requestCookies() { server.enqueue(MockResponse()) val cookieJar = RecordingCookieJar() cookieJar.enqueueRequestCookies( @@ -2078,12 +2228,14 @@ open class CallTest { assertThat(recordedRequest.getHeader("Cookie")).isEqualTo("a=b; c=d") } - @Test fun redirectsDoNotIncludeTooManyCookies() { - server2.enqueue(MockResponse().setBody("Page 2")) + @Test + fun redirectsDoNotIncludeTooManyCookies() { + server2.enqueue(MockResponse(body = "Page 2")) server.enqueue( - MockResponse() - .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) - .addHeader("Location: " + server2.url("/")) + MockResponse( + code = HttpURLConnection.HTTP_MOVED_TEMP, + headers = headersOf("Location", server2.url("/").toString()), + ) ) val cookieManager = CookieManager(null, CookiePolicy.ACCEPT_ORIGINAL_SERVER) val cookie = HttpCookie("c", "cookie") @@ -2103,16 +2255,15 @@ open class CallTest { assertThat(request2.getHeader("Cookie")).isNull() } - @Test fun redirectsDoNotIncludeTooManyAuthHeaders() { - server2.enqueue(MockResponse().setBody("Page 2")) + @Test + fun redirectsDoNotIncludeTooManyAuthHeaders() { + server2.enqueue(MockResponse(body = "Page 2")) + server.enqueue(MockResponse(code = 401)) server.enqueue( - MockResponse() - .setResponseCode(401) - ) - server.enqueue( - MockResponse() - .setResponseCode(302) - .addHeader("Location: " + server2.url("/b")) + MockResponse( + code = 302, + headers = headersOf("Location", server2.url("/b").toString()), + ) ) client = client.newBuilder() .authenticator(RecordingOkAuthenticator(basic("jesse", "secret"), null)) @@ -2125,22 +2276,29 @@ open class CallTest { assertThat(redirectRequest.path).isEqualTo("/b") } - @Test fun redirect_Async() { + @Test + fun redirect_Async() { server.enqueue( - MockResponse() - .setResponseCode(301) - .addHeader("Location: /b") - .addHeader("Test", "Redirect from /a to /b") - .setBody("/a has moved!") + MockResponse( + code = 301, + headers = headersOf( + "Location", "/b", + "Test", "Redirect from /a to /b" + ), + body = "/a has moved!", + ) ) server.enqueue( - MockResponse() - .setResponseCode(302) - .addHeader("Location: /c") - .addHeader("Test", "Redirect from /b to /c") - .setBody("/b has moved!") + MockResponse( + code = 302, + headers = headersOf( + "Location", "/c", + "Test", "Redirect from /b to /c" + ), + body = "/b has moved!", + ) ) - server.enqueue(MockResponse().setBody("C")) + server.enqueue(MockResponse(body = "C")) val request = Request.Builder().url(server.url("/a")).build() client.newCall(request).enqueue(callback) callback.await(server.url("/a")) @@ -2162,32 +2320,36 @@ open class CallTest { } @Tag("Slow") - @Test fun follow20Redirects() { + @Test + fun follow20Redirects() { for (i in 0..19) { server.enqueue( - MockResponse() - .setResponseCode(301) - .addHeader("Location: /" + (i + 1)) - .setBody("Redirecting to /" + (i + 1)) + MockResponse( + code = 301, + headers = headersOf("Location", "/${i + 1}"), + body = "Redirecting to /" + (i + 1), + ) ) } - server.enqueue(MockResponse().setBody("Success!")) + server.enqueue(MockResponse(body = "Success!")) executeSynchronously("/0") .assertCode(200) .assertBody("Success!") } @Tag("Slow") - @Test fun follow20Redirects_Async() { + @Test + fun follow20Redirects_Async() { for (i in 0..19) { server.enqueue( - MockResponse() - .setResponseCode(301) - .addHeader("Location: /" + (i + 1)) - .setBody("Redirecting to /" + (i + 1)) + MockResponse( + code = 301, + headers = headersOf("Location", "/" + (i + 1)), + body = "Redirecting to /" + (i + 1), + ) ) } - server.enqueue(MockResponse().setBody("Success!")) + server.enqueue(MockResponse(body = "Success!")) val request = Request.Builder().url(server.url("/0")).build() client.newCall(request).enqueue(callback) callback.await(server.url("/0")) @@ -2196,13 +2358,15 @@ open class CallTest { } @Tag("Slow") - @Test fun doesNotFollow21Redirects() { + @Test + fun doesNotFollow21Redirects() { for (i in 0..20) { server.enqueue( - MockResponse() - .setResponseCode(301) - .addHeader("Location: /" + (i + 1)) - .setBody("Redirecting to /" + (i + 1)) + MockResponse( + code = 301, + headers = headersOf("Location", "/${i + 1}"), + body = "Redirecting to /${i + 1}", + ) ) } try { @@ -2214,13 +2378,15 @@ open class CallTest { } @Tag("Slow") - @Test fun doesNotFollow21Redirects_Async() { + @Test + fun doesNotFollow21Redirects_Async() { for (i in 0..20) { server.enqueue( - MockResponse() - .setResponseCode(301) - .addHeader("Location: /" + (i + 1)) - .setBody("Redirecting to /" + (i + 1)) + MockResponse( + code = 301, + headers = headersOf("Location", "/${i + 1}"), + body = "Redirecting to /${i + 1}", + ) ) } val request = Request.Builder().url(server.url("/0")).build() @@ -2228,34 +2394,39 @@ open class CallTest { callback.await(server.url("/0")).assertFailure("Too many follow-up requests: 21") } - @Test fun http204WithBodyDisallowed() { + @Test + fun http204WithBodyDisallowed() { server.enqueue( - MockResponse() - .setResponseCode(204) - .setBody("I'm not even supposed to be here today.") + MockResponse( + code = 204, + body = "I'm not even supposed to be here today.", + ) ) executeSynchronously("/") .assertFailure("HTTP 204 had non-zero Content-Length: 39") } - @Test fun http205WithBodyDisallowed() { + @Test + fun http205WithBodyDisallowed() { server.enqueue( - MockResponse() - .setResponseCode(205) - .setBody("I'm not even supposed to be here today.") + MockResponse( + code = 205, + body = "I'm not even supposed to be here today.", + ) ) executeSynchronously("/") .assertFailure("HTTP 205 had non-zero Content-Length: 39") } - @Test fun httpWithExcessiveHeaders() { + @Test + fun httpWithExcessiveHeaders() { val longLine = "HTTP/1.1 200 " + stringFill('O', 256 * 1024) + "K" server.protocols = listOf(Protocol.HTTP_1_1) server.enqueue( - MockResponse() - .setStatus(longLine) - .setBody("I'm not even supposed to be here today.") - ) + MockResponse.Builder() + .status(longLine) + .body("I'm not even supposed to be here today.") + .build()) executeSynchronously("/") .assertFailureMatches(".*unexpected end of stream on " + server.url("/").redact()) } @@ -2266,7 +2437,8 @@ open class CallTest { return String(value) } - @Test fun canceledBeforeExecute() { + @Test + fun canceledBeforeExecute() { val call = client.newCall(Request.Builder().url(server.url("/a")).build()) call.cancel() try { @@ -2278,21 +2450,20 @@ open class CallTest { } @Tag("Slowish") - @Test fun cancelDuringHttpConnect() { + @Test + fun cancelDuringHttpConnect() { cancelDuringConnect("http") } @Tag("Slowish") - @Test fun cancelDuringHttpsConnect() { + @Test + fun cancelDuringHttpsConnect() { cancelDuringConnect("https") } /** Cancel a call that's waiting for connect to complete. */ private fun cancelDuringConnect(scheme: String?) { - server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.STALL_SOCKET_AT_START) - ) + server.enqueue(MockResponse(socketPolicy = SocketPolicy.STALL_SOCKET_AT_START)) val cancelDelayMillis = 300L val call = client.newCall(Request(server.url("/").newBuilder().scheme(scheme!!).build())) cancelLater(call, cancelDelayMillis) @@ -2307,7 +2478,8 @@ open class CallTest { .isCloseTo(cancelDelayMillis.toFloat(), Offset.offset(100f)) } - @Test fun cancelImmediatelyAfterEnqueue() { + @Test + fun cancelImmediatelyAfterEnqueue() { server.enqueue(MockResponse()) val latch = CountDownLatch(1) client = client.newBuilder() @@ -2327,15 +2499,17 @@ open class CallTest { callback.await(server.url("/a")).assertFailure("Canceled", "Socket closed", "Socket is closed") } - @Test fun cancelAll() { + @Test + fun cancelAll() { val call = client.newCall(Request(server.url("/"))) call.enqueue(callback) client.dispatcher.cancelAll() callback.await(server.url("/")).assertFailure("Canceled", "Socket closed", "Socket is closed") } - @Test fun cancelWhileRequestHeadersAreSent() { - server.enqueue(MockResponse().setBody("A")) + @Test + fun cancelWhileRequestHeadersAreSent() { + server.enqueue(MockResponse(body = "A")) val listener: EventListener = object : EventListener() { override fun requestHeadersStart(call: Call) { try { @@ -2355,13 +2529,18 @@ open class CallTest { } } - @Test fun cancelWhileRequestHeadersAreSent_HTTP_2() { + @Test + fun cancelWhileRequestHeadersAreSent_HTTP_2() { enableProtocol(Protocol.HTTP_2) cancelWhileRequestHeadersAreSent() } - @Test fun cancelBeforeBodyIsRead() { - server.enqueue(MockResponse().setBody("def").throttleBody(1, 750, TimeUnit.MILLISECONDS)) + @Test + fun cancelBeforeBodyIsRead() { + server.enqueue(MockResponse.Builder() + .body("def") + .throttleBody(1, 750, TimeUnit.MILLISECONDS) + .build()) val call = client.newCall(Request(server.url("/a"))) val executor = Executors.newSingleThreadExecutor() val result = executor.submit { call.execute() } @@ -2375,13 +2554,14 @@ open class CallTest { assertThat(server.requestCount).isEqualTo(1) } - @Test fun cancelInFlightBeforeResponseReadThrowsIOE() { + @Test + fun cancelInFlightBeforeResponseReadThrowsIOE() { val request = Request(server.url("/a")) val call = client.newCall(request) server.dispatcher = object : mockwebserver3.Dispatcher() { override fun dispatch(request: RecordedRequest): MockResponse { call.cancel() - return MockResponse().setBody("A") + return MockResponse(body = "A") } } try { @@ -2392,12 +2572,14 @@ open class CallTest { assertThat(server.takeRequest().path).isEqualTo("/a") } - @Test fun cancelInFlightBeforeResponseReadThrowsIOE_HTTPS() { + @Test + fun cancelInFlightBeforeResponseReadThrowsIOE_HTTPS() { enableTls() cancelInFlightBeforeResponseReadThrowsIOE() } - @Test fun cancelInFlightBeforeResponseReadThrowsIOE_HTTP_2() { + @Test + fun cancelInFlightBeforeResponseReadThrowsIOE_HTTP_2() { enableProtocol(Protocol.HTTP_2) cancelInFlightBeforeResponseReadThrowsIOE() } @@ -2406,7 +2588,8 @@ open class CallTest { * This test puts a request in front of one that is to be canceled, so that it is canceled before * I/O takes place. */ - @Test fun canceledBeforeIOSignalsOnFailure() { + @Test + fun canceledBeforeIOSignalsOnFailure() { // Force requests to be executed serially. val dispatcher = Dispatcher(client.dispatcher.executorService) dispatcher.maxRequests = 1 @@ -2421,7 +2604,7 @@ open class CallTest { var nextResponse = 'A' override fun dispatch(request: RecordedRequest): MockResponse { callB.cancel() - return MockResponse().setBody((nextResponse++).toString()) + return MockResponse(body = (nextResponse++).toString()) } } callA.enqueue(callback) @@ -2432,23 +2615,26 @@ open class CallTest { callback.await(requestB.url).assertFailure("Canceled", "Socket closed") } - @Test fun canceledBeforeIOSignalsOnFailure_HTTPS() { + @Test + fun canceledBeforeIOSignalsOnFailure_HTTPS() { enableTls() canceledBeforeIOSignalsOnFailure() } - @Test fun canceledBeforeIOSignalsOnFailure_HTTP_2() { + @Test + fun canceledBeforeIOSignalsOnFailure_HTTP_2() { enableProtocol(Protocol.HTTP_2) canceledBeforeIOSignalsOnFailure() } - @Test fun canceledBeforeResponseReadSignalsOnFailure() { + @Test + fun canceledBeforeResponseReadSignalsOnFailure() { val requestA = Request(server.url("/a")) val call = client.newCall(requestA) server.dispatcher = object : mockwebserver3.Dispatcher() { override fun dispatch(request: RecordedRequest): MockResponse { call.cancel() - return MockResponse().setBody("A") + return MockResponse(body = "A") } } call.enqueue(callback) @@ -2459,12 +2645,14 @@ open class CallTest { ) } - @Test fun canceledBeforeResponseReadSignalsOnFailure_HTTPS() { + @Test + fun canceledBeforeResponseReadSignalsOnFailure_HTTPS() { enableTls() canceledBeforeResponseReadSignalsOnFailure() } - @Test fun canceledBeforeResponseReadSignalsOnFailure_HTTP_2() { + @Test + fun canceledBeforeResponseReadSignalsOnFailure_HTTP_2() { enableProtocol(Protocol.HTTP_2) canceledBeforeResponseReadSignalsOnFailure() } @@ -2473,8 +2661,9 @@ open class CallTest { * There's a race condition where the cancel may apply after the stream has already been * processed. */ - @Test fun canceledAfterResponseIsDeliveredBreaksStreamButSignalsOnce() { - server.enqueue(MockResponse().setBody("A")) + @Test + fun canceledAfterResponseIsDeliveredBreaksStreamButSignalsOnce() { + server.enqueue(MockResponse(body = "A")) val latch = CountDownLatch(1) val bodyRef = AtomicReference() val failureRef = AtomicBoolean() @@ -2515,7 +2704,8 @@ open class CallTest { canceledAfterResponseIsDeliveredBreaksStreamButSignalsOnce() } - @Test fun cancelWithInterceptor() { + @Test + fun cancelWithInterceptor() { client = client.newBuilder() .addInterceptor(Interceptor { chain: Interceptor.Chain -> chain.proceed(chain.request()) @@ -2532,14 +2722,15 @@ open class CallTest { assertThat(server.requestCount).isEqualTo(0) } - @Test fun gzip() { + @Test + fun gzip() { val gzippedBody = gzip("abcabcabc") val bodySize = java.lang.Long.toString(gzippedBody.size) server.enqueue( - MockResponse() - .setBody(gzippedBody) + MockResponse.Builder() + .body(gzippedBody) .addHeader("Content-Encoding: gzip") - ) + .build()) // Confirm that the user request doesn't have Accept-Encoding, and the user // response doesn't have a Content-Encoding or Content-Length. @@ -2558,33 +2749,32 @@ open class CallTest { } /** https://github.com/square/okhttp/issues/1927 */ - @Test fun gzipResponseAfterAuthenticationChallenge() { + @Test + fun gzipResponseAfterAuthenticationChallenge() { + server.enqueue(MockResponse(code = 401)) server.enqueue( - MockResponse() - .setResponseCode(401) - ) - server.enqueue( - MockResponse() - .setBody(gzip("abcabcabc")) + MockResponse.Builder() + .body(gzip("abcabcabc")) .addHeader("Content-Encoding: gzip") - ) + .build()) client = client.newBuilder() .authenticator(RecordingOkAuthenticator("password", null)) .build() executeSynchronously("/").assertBody("abcabcabc") } - @Test fun rangeHeaderPreventsAutomaticGzip() { + @Test + fun rangeHeaderPreventsAutomaticGzip() { val gzippedBody = gzip("abcabcabc") // Enqueue a gzipped response. Our request isn't expecting it, but that's okay. server.enqueue( - MockResponse() - .setResponseCode(HttpURLConnection.HTTP_PARTIAL) - .setBody(gzippedBody) + MockResponse.Builder() + .code(HttpURLConnection.HTTP_PARTIAL) + .body(gzippedBody) .addHeader("Content-Encoding: gzip") .addHeader("Content-Range: bytes 0-" + (gzippedBody.size - 1)) - ) + .build()) // Make a range request. val request = Request.Builder() @@ -2605,9 +2795,10 @@ open class CallTest { assertThat(recordedRequest.getHeader("Accept-Encoding")).isNull() } - @Test fun asyncResponseCanBeConsumedLater() { - server.enqueue(MockResponse().setBody("abc")) - server.enqueue(MockResponse().setBody("def")) + @Test + fun asyncResponseCanBeConsumedLater() { + server.enqueue(MockResponse(body = "abc")) + server.enqueue(MockResponse(body = "def")) val request = Request.Builder() .url(server.url("/")) .header("User-Agent", "SyncApiTest") @@ -2641,21 +2832,24 @@ open class CallTest { response.body.close() } - @Test fun userAgentIsIncludedByDefault() { + @Test + fun userAgentIsIncludedByDefault() { server.enqueue(MockResponse()) executeSynchronously("/") val recordedRequest = server.takeRequest() assertThat(recordedRequest.getHeader("User-Agent")).matches(userAgent) } - @Test fun setFollowRedirectsFalse() { + @Test + fun setFollowRedirectsFalse() { server.enqueue( - MockResponse() - .setResponseCode(302) - .addHeader("Location: /b") - .setBody("A") + MockResponse( + code = 302, + headers = headersOf("Location", "/b"), + body = "A", + ) ) - server.enqueue(MockResponse().setBody("B")) + server.enqueue(MockResponse(body = "B")) client = client.newBuilder() .followRedirects(false) .build() @@ -2664,11 +2858,11 @@ open class CallTest { .assertCode(302) } - @Test fun expect100ContinueNonEmptyRequestBody() { - server.enqueue( - MockResponse() + @Test + fun expect100ContinueNonEmptyRequestBody() { + server.enqueue(MockResponse.Builder() .add100Continue() - ) + .build()) val request = Request.Builder() .url(server.url("/")) .header("Expect", "100-continue") @@ -2680,7 +2874,8 @@ open class CallTest { assertThat(server.takeRequest().body.readUtf8()).isEqualTo("abc") } - @Test fun expect100ContinueEmptyRequestBody() { + @Test + fun expect100ContinueEmptyRequestBody() { server.enqueue(MockResponse()) val request = Request.Builder() .url(server.url("/")) @@ -2692,17 +2887,16 @@ open class CallTest { .assertSuccessful() } - @Test fun expect100ContinueEmptyRequestBody_HTTP2() { + @Test + fun expect100ContinueEmptyRequestBody_HTTP2() { enableProtocol(Protocol.HTTP_2) expect100ContinueEmptyRequestBody() } @Tag("Slowish") - @Test fun expect100ContinueTimesOutWithoutContinue() { - server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.NO_RESPONSE) - ) + @Test + fun expect100ContinueTimesOutWithoutContinue() { + server.enqueue(MockResponse(socketPolicy = SocketPolicy.NO_RESPONSE)) client = client.newBuilder() .readTimeout(Duration.ofMillis(500)) .build() @@ -2728,11 +2922,12 @@ open class CallTest { expect100ContinueTimesOutWithoutContinue() } - @Test fun serverRespondsWithUnsolicited100Continue() { + @Test + fun serverRespondsWithUnsolicited100Continue() { server.enqueue( - MockResponse() + MockResponse.Builder() .add100Continue() - ) + .build()) val request = Request( url = server.url("/"), body = "abc".toRequestBody("text/plain".toMediaType()), @@ -2744,22 +2939,23 @@ open class CallTest { assertThat(recordedRequest.body.readUtf8()).isEqualTo("abc") } - @Test fun serverRespondsWithEarlyHintsHttp2() { + @Test + fun serverRespondsWithEarlyHintsHttp2() { enableProtocol(Protocol.HTTP_2) serverRespondsWithEarlyHints() } - @Test fun serverRespondsWithEarlyHints() { - val mockResponse = MockResponse() + @Test + fun serverRespondsWithEarlyHints() { server.enqueue( - mockResponse.apply { - addInformationalResponse( - MockResponse() - .setResponseCode(103) - .setHeaders(headersOf("Link", "; rel=preload; as=style")) - ) - } - ) + MockResponse.Builder() + .addInformationalResponse( + MockResponse( + code = 103, + headers = headersOf("Link", "; rel=preload; as=style"), + ) + ).build() + ) val request = Request( url = server.url("/"), body = "abc".toRequestBody("text/plain".toMediaType()), @@ -2772,20 +2968,19 @@ open class CallTest { assertThat(recordedRequest.headers["Link"]).isNull() } - @Test fun serverRespondsWithUnsolicited100Continue_HTTP2() { + @Test + fun serverRespondsWithUnsolicited100Continue_HTTP2() { enableProtocol(Protocol.HTTP_2) serverRespondsWithUnsolicited100Continue() } @Tag("Slow") - @Test fun serverRespondsWith100ContinueOnly() { + @Test + fun serverRespondsWith100ContinueOnly() { client = client.newBuilder() .readTimeout(Duration.ofSeconds(1)) .build() - server.enqueue( - MockResponse() - .setStatus("HTTP/1.1 100 Continue") - ) + server.enqueue(MockResponse(code = 100)) val request = Request( url = server.url("/"), body = "abc".toRequestBody("text/plain".toMediaType()), @@ -2801,16 +2996,18 @@ open class CallTest { } @Tag("Slow") - @Test fun serverRespondsWith100ContinueOnly_HTTP2() { + @Test + fun serverRespondsWith100ContinueOnly_HTTP2() { enableProtocol(Protocol.HTTP_2) serverRespondsWith100ContinueOnly() } - @Test fun successfulExpectContinuePermitsConnectionReuse() { + @Test + fun successfulExpectContinuePermitsConnectionReuse() { server.enqueue( - MockResponse() + MockResponse.Builder() .add100Continue() - ) + .build()) server.enqueue(MockResponse()) executeSynchronously( Request.Builder() @@ -2825,13 +3022,15 @@ open class CallTest { } @Tag("Slow") - @Test fun successfulExpectContinuePermitsConnectionReuseWithHttp2() { + @Test + fun successfulExpectContinuePermitsConnectionReuseWithHttp2() { enableProtocol(Protocol.HTTP_2) successfulExpectContinuePermitsConnectionReuse() } @Tag("Slow") - @Test fun unsuccessfulExpectContinuePreventsConnectionReuse() { + @Test + fun unsuccessfulExpectContinuePreventsConnectionReuse() { server.enqueue(MockResponse()) server.enqueue(MockResponse()) executeSynchronously( @@ -2846,7 +3045,8 @@ open class CallTest { assertThat(server.takeRequest().sequenceNumber).isEqualTo(0) } - @Test fun unsuccessfulExpectContinuePermitsConnectionReuseWithHttp2() { + @Test + fun unsuccessfulExpectContinuePermitsConnectionReuseWithHttp2() { platform.assumeHttp2Support() enableProtocol(Protocol.HTTP_2) server.enqueue(MockResponse()) @@ -2864,21 +3064,23 @@ open class CallTest { } /** We forbid non-ASCII characters in outgoing request headers, but accept UTF-8. */ - @Test fun responseHeaderParsingIsLenient() { + @Test + fun responseHeaderParsingIsLenient() { val headersBuilder = Headers.Builder() headersBuilder.add("Content-Length", "0") addHeaderLenient(headersBuilder, "a\tb: c\u007fd") addHeaderLenient(headersBuilder, ": ef") addHeaderLenient(headersBuilder, "\ud83c\udf69: \u2615\ufe0f") val headers = headersBuilder.build() - server.enqueue(MockResponse().setHeaders(headers)) + server.enqueue(MockResponse(headers = headers)) executeSynchronously("/") .assertHeader("a\tb", "c\u007fd") .assertHeader("\ud83c\udf69", "\u2615\ufe0f") .assertHeader("", "ef") } - @Test fun customDns() { + @Test + fun customDns() { // Configure a DNS that returns our local MockWebServer for android.com. val dns = FakeDns() dns["android.com"] = Dns.SYSTEM.lookup(server.url("/").host) @@ -2891,7 +3093,8 @@ open class CallTest { dns.assertRequests("android.com") } - @Test fun dnsReturnsZeroIpAddresses() { + @Test + fun dnsReturnsZeroIpAddresses() { // Configure a DNS that returns our local MockWebServer for android.com. val dns = FakeDns() val ipAddresses = mutableListOf() @@ -2907,10 +3110,11 @@ open class CallTest { /** We had a bug where failed HTTP/2 calls could break the entire connection. */ @Flaky - @Test fun failingCallsDoNotInterfereWithConnection() { + @Test + fun failingCallsDoNotInterfereWithConnection() { enableProtocol(Protocol.HTTP_2) - server.enqueue(MockResponse().setBody("Response 1")) - server.enqueue(MockResponse().setBody("Response 2")) + server.enqueue(MockResponse(body = "Response 1")) + server.enqueue(MockResponse(body = "Response 2")) val requestBody: RequestBody = object : RequestBody() { override fun contentType(): MediaType? { return null @@ -2943,15 +3147,13 @@ open class CallTest { } /** Test which headers are sent unencrypted to the HTTP proxy. */ - @Test fun proxyConnectOmitsApplicationHeaders() { + @Test + fun proxyConnectOmitsApplicationHeaders() { server.useHttps(handshakeCertificates.sslSocketFactory()) server.enqueue( - MockResponse() - .inTunnel() - ) + MockResponse(inTunnel = true)) server.enqueue( - MockResponse() - .setBody("encrypted response from the origin server") + MockResponse(body = "encrypted response from the origin server") ) val hostnameVerifier = RecordingHostnameVerifier() client = client.newBuilder() @@ -2986,13 +3188,14 @@ open class CallTest { * We had a bug where OkHttp would crash if HTTP proxies returned a truncated response. * https://github.com/square/okhttp/issues/5727 */ - @Test fun proxyUpgradeFailsWithTruncatedResponse() { + @Test + fun proxyUpgradeFailsWithTruncatedResponse() { server.enqueue( - MockResponse() - .setBody("abc") + MockResponse.Builder() + .body("abc") .setHeader("Content-Length", "5") - .setSocketPolicy(SocketPolicy.DISCONNECT_AT_END) - ) + .socketPolicy(SocketPolicy.DISCONNECT_AT_END) + .build()) val hostnameVerifier = RecordingHostnameVerifier() client = client.newBuilder() .sslSocketFactory( @@ -3012,21 +3215,20 @@ open class CallTest { } /** Respond to a proxy authorization challenge. */ - @Test fun proxyAuthenticateOnConnect() { + @Test + fun proxyAuthenticateOnConnect() { server.useHttps(handshakeCertificates.sslSocketFactory()) server.enqueue( - MockResponse() - .inTunnel() - .setResponseCode(407) - .addHeader("Proxy-Authenticate: Basic realm=\"localhost\"") + MockResponse( + code = 407, + headers = headersOf("Proxy-Authenticate", "Basic realm=\"localhost\""), + inTunnel = true, + ) ) server.enqueue( - MockResponse() - .inTunnel() - ) + MockResponse(inTunnel = true)) server.enqueue( - MockResponse() - .setBody("response body") + MockResponse(body = "response body") ) client = client.newBuilder() .sslSocketFactory( @@ -3052,15 +3254,16 @@ open class CallTest { } /** Confirm that the proxy authenticator works for unencrypted HTTP proxies. */ - @Test fun httpProxyAuthenticate() { + @Test + fun httpProxyAuthenticate() { server.enqueue( - MockResponse() - .setResponseCode(407) - .addHeader("Proxy-Authenticate: Basic realm=\"localhost\"") + MockResponse( + code = 407, + headers = headersOf("Proxy-Authenticate", "Basic realm=\"localhost\""), + ) ) server.enqueue( - MockResponse() - .setBody("response body") + MockResponse(body = "response body") ) client = client.newBuilder() .proxy(server.toProxyAddress()) @@ -3081,23 +3284,22 @@ open class CallTest { * OkHttp has a bug where a `Connection: close` response header is not honored when establishing a * TLS tunnel. https://github.com/square/okhttp/issues/2426 */ - @Test fun proxyAuthenticateOnConnectWithConnectionClose() { + @Test + fun proxyAuthenticateOnConnectWithConnectionClose() { server.useHttps(handshakeCertificates.sslSocketFactory()) server.protocols = listOf(Protocol.HTTP_1_1) server.enqueue( - MockResponse() - .inTunnel() - .setResponseCode(407) - .addHeader("Proxy-Authenticate: Basic realm=\"localhost\"") - .addHeader("Connection: close") + MockResponse( + code = 407, + headers = headersOf( + "Proxy-Authenticate", "Basic realm=\"localhost\"", + "Connection", "close", + ), + inTunnel = true, + ) ) - server.enqueue( - MockResponse() - .inTunnel() - ) - server.enqueue( - MockResponse() - .setBody("response body") + server.enqueue(MockResponse(inTunnel = true)) + server.enqueue(MockResponse(body = "response body") ) client = client.newBuilder() .sslSocketFactory( @@ -3122,16 +3324,20 @@ open class CallTest { assertThat(server.takeRequest().sequenceNumber).isEqualTo(1) } - @Test fun tooManyProxyAuthFailuresWithConnectionClose() { + @Test + fun tooManyProxyAuthFailuresWithConnectionClose() { server.useHttps(handshakeCertificates.sslSocketFactory()) server.protocols = listOf(Protocol.HTTP_1_1) for (i in 0..20) { server.enqueue( - MockResponse() - .inTunnel() - .setResponseCode(407) - .addHeader("Proxy-Authenticate: Basic realm=\"localhost\"") - .addHeader("Connection: close") + MockResponse( + code = 407, + headers = headersOf( + "Proxy-Authenticate", "Basic realm=\"localhost\"", + "Connection", "close", + ), + inTunnel = true, + ) ) } client = client.newBuilder() @@ -3156,16 +3362,11 @@ open class CallTest { * We used to have that behavior but it is problematic because unrelated requests end up sharing * credentials. Worse, that approach leaks proxy credentials to the origin server. */ - @Test fun noPreemptiveProxyAuthorization() { + @Test + fun noPreemptiveProxyAuthorization() { server.useHttps(handshakeCertificates.sslSocketFactory()) - server.enqueue( - MockResponse() - .inTunnel() - ) - server.enqueue( - MockResponse() - .setBody("response body") - ) + server.enqueue(MockResponse(inTunnel = true)) + server.enqueue(MockResponse(body = "response body")) client = client.newBuilder() .sslSocketFactory( handshakeCertificates.sslSocketFactory(), @@ -3187,16 +3388,11 @@ open class CallTest { } /** Confirm that we can send authentication information without being prompted first. */ - @Test fun preemptiveProxyAuthentication() { + @Test + fun preemptiveProxyAuthentication() { server.useHttps(handshakeCertificates.sslSocketFactory()) - server.enqueue( - MockResponse() - .inTunnel() - ) - server.enqueue( - MockResponse() - .setBody("encrypted response from the origin server") - ) + server.enqueue(MockResponse(inTunnel = true)) + server.enqueue(MockResponse(body = "encrypted response from the origin server")) val credential = basic("jesse", "password1") client = client.newBuilder() .sslSocketFactory( @@ -3228,19 +3424,18 @@ open class CallTest { assertThat(get.path).isEqualTo("/foo") } - @Test fun preemptiveThenReactiveProxyAuthentication() { + @Test + fun preemptiveThenReactiveProxyAuthentication() { server.useHttps(handshakeCertificates.sslSocketFactory()) server.enqueue( - MockResponse() - .inTunnel() - .setResponseCode(HttpURLConnection.HTTP_PROXY_AUTH) - .addHeader("Proxy-Authenticate", "Basic realm=\"localhost\"") - .setBody("proxy auth required") - ) - server.enqueue( - MockResponse() - .inTunnel() + MockResponse( + code = HttpURLConnection.HTTP_PROXY_AUTH, + headers = headersOf("Proxy-Authenticate", "Basic realm=\"localhost\""), + body = "proxy auth required", + inTunnel = true, + ) ) + server.enqueue(MockResponse(inTunnel = true)) server.enqueue(MockResponse()) val challengeSchemes: MutableList = ArrayList() val credential = basic("jesse", "password1") @@ -3271,12 +3466,15 @@ open class CallTest { } /** https://github.com/square/okhttp/issues/4915 */ - @Test @Disabled fun proxyDisconnectsAfterRequest() { + @Test + @Disabled + fun proxyDisconnectsAfterRequest() { server.useHttps(handshakeCertificates.sslSocketFactory()) server.enqueue( - MockResponse() - .inTunnel() - .setSocketPolicy(SocketPolicy.DISCONNECT_AFTER_REQUEST) + MockResponse( + inTunnel = true, + socketPolicy = SocketPolicy.DISCONNECT_AFTER_REQUEST, + ) ) client = client.newBuilder() .sslSocketFactory( @@ -3293,7 +3491,8 @@ open class CallTest { } } - @Test fun interceptorGetsHttp2() { + @Test + fun interceptorGetsHttp2() { platform.assumeHttp2Support() enableProtocol(Protocol.HTTP_2) @@ -3313,43 +3512,48 @@ open class CallTest { assertThat(protocolRef.get()).isEqualTo(Protocol.HTTP_2) } - @Test fun serverSendsInvalidResponseHeaders() { + @Test + fun serverSendsInvalidResponseHeaders() { server.enqueue( - MockResponse() - .setStatus("HTP/1.1 200 OK") - ) + MockResponse.Builder() + .status("HTP/1.1 200 OK") + .build()) executeSynchronously("/") .assertFailure("Unexpected status line: HTP/1.1 200 OK") } - @Test fun serverSendsInvalidCodeTooLarge() { + @Test + fun serverSendsInvalidCodeTooLarge() { server.enqueue( - MockResponse() - .setStatus("HTTP/1.1 2147483648 OK") - ) + MockResponse.Builder() + .status("HTTP/1.1 2147483648 OK") + .build()) executeSynchronously("/") .assertFailure("Unexpected status line: HTTP/1.1 2147483648 OK") } - @Test fun serverSendsInvalidCodeNotANumber() { + @Test + fun serverSendsInvalidCodeNotANumber() { server.enqueue( - MockResponse() - .setStatus("HTTP/1.1 00a OK") - ) + MockResponse.Builder() + .status("HTTP/1.1 00a OK") + .build()) executeSynchronously("/") .assertFailure("Unexpected status line: HTTP/1.1 00a OK") } - @Test fun serverSendsUnnecessaryWhitespace() { + @Test + fun serverSendsUnnecessaryWhitespace() { server.enqueue( - MockResponse() - .setStatus(" HTTP/1.1 200 OK") - ) + MockResponse.Builder() + .status(" HTTP/1.1 200 OK") + .build()) executeSynchronously("/") .assertFailure("Unexpected status line: HTTP/1.1 200 OK") } - @Test fun requestHeaderNameWithSpaceForbidden() { + @Test + fun requestHeaderNameWithSpaceForbidden() { try { Request.Builder().addHeader("a b", "c") fail() @@ -3358,7 +3562,8 @@ open class CallTest { } } - @Test fun requestHeaderNameWithTabForbidden() { + @Test + fun requestHeaderNameWithTabForbidden() { try { Request.Builder().addHeader("a\tb", "c") fail() @@ -3367,37 +3572,41 @@ open class CallTest { } } - @Test fun responseHeaderNameWithSpacePermitted() { + @Test + fun responseHeaderNameWithSpacePermitted() { server.enqueue( - MockResponse() + MockResponse.Builder() .clearHeaders() .addHeader("content-length: 0") .addHeaderLenient("a b", "c") - ) + .build()) val call = client.newCall(Request(server.url("/"))) val response = call.execute() assertThat(response.header("a b")).isEqualTo("c") } - @Test fun responseHeaderNameWithTabPermitted() { + @Test + fun responseHeaderNameWithTabPermitted() { server.enqueue( - MockResponse() + MockResponse.Builder() .clearHeaders() .addHeader("content-length: 0") .addHeaderLenient("a\tb", "c") - ) + .build()) val call = client.newCall(Request(server.url("/"))) val response = call.execute() assertThat(response.header("a\tb")).isEqualTo("c") } - @Test fun connectFails() { + @Test + fun connectFails() { server.shutdown() executeSynchronously("/") .assertFailure(IOException::class.java) } - @Test fun requestBodySurvivesRetries() { + @Test + fun requestBodySurvivesRetries() { server.enqueue(MockResponse()) // Enable a misconfigured proxy selector to guarantee that the request is retried. @@ -3418,34 +3627,39 @@ open class CallTest { } @Disabled // This may fail in DNS lookup, which we don't have timeouts for. - @Test fun invalidHost() { + @Test + fun invalidHost() { val request = Request("http://1234.1.1.1/".toHttpUrl()) executeSynchronously(request) .assertFailure(UnknownHostException::class.java) } - @Test fun uploadBodySmallChunkedEncoding() { + @Test + fun uploadBodySmallChunkedEncoding() { upload(true, 1048576, 256) val recordedRequest = server.takeRequest() assertThat(recordedRequest.bodySize).isEqualTo(1048576) assertThat(recordedRequest.chunkSizes).isNotEmpty } - @Test fun uploadBodyLargeChunkedEncoding() { + @Test + fun uploadBodyLargeChunkedEncoding() { upload(true, 1048576, 65536) val recordedRequest = server.takeRequest() assertThat(recordedRequest.bodySize).isEqualTo(1048576) assertThat(recordedRequest.chunkSizes).isNotEmpty } - @Test fun uploadBodySmallFixedLength() { + @Test + fun uploadBodySmallFixedLength() { upload(false, 1048576, 256) val recordedRequest = server.takeRequest() assertThat(recordedRequest.bodySize).isEqualTo(1048576) assertThat(recordedRequest.chunkSizes).isEmpty() } - @Test fun uploadBodyLargeFixedLength() { + @Test + fun uploadBodyLargeFixedLength() { upload(false, 1048576, 65536) val recordedRequest = server.takeRequest() assertThat(recordedRequest.bodySize).isEqualTo(1048576) @@ -3463,11 +3677,11 @@ open class CallTest { } /** https://github.com/square/okhttp/issues/2344 */ - @Test fun ipv6HostHasSquareBracesHttp1() { + @Test + fun ipv6HostHasSquareBracesHttp1() { configureClientAndServerProxies(http2 = false) server.enqueue( - MockResponse() - .setBody("response body") + MockResponse(body = "response body") ) val port = server.port val url = server.url("/").newBuilder() @@ -3488,11 +3702,11 @@ open class CallTest { assertThat(get.requestUrl).isEqualTo(url) } - @Test fun ipv6HostHasSquareBracesHttp2() { + @Test + fun ipv6HostHasSquareBracesHttp2() { configureClientAndServerProxies(http2 = true) server.enqueue( - MockResponse() - .setBody("response body") + MockResponse(body = "response body") ) val port = server.port val url = server.url("/").newBuilder() @@ -3519,11 +3733,11 @@ open class CallTest { assertThat(get.requestUrl).isEqualTo(url) } - @Test fun ipv4IpHostHasNoSquareBracesHttp1() { + @Test + fun ipv4IpHostHasNoSquareBracesHttp1() { configureClientAndServerProxies(http2 = false) server.enqueue( - MockResponse() - .setBody("response body") + MockResponse(body = "response body") ) val port = server.port val url = server.url("/").newBuilder() @@ -3550,11 +3764,11 @@ open class CallTest { assertThat(get.requestUrl).isEqualTo(url) } - @Test fun ipv4IpHostHasNoSquareBracesHttp2() { + @Test + fun ipv4IpHostHasNoSquareBracesHttp2() { configureClientAndServerProxies(http2 = true) server.enqueue( - MockResponse() - .setBody("response body") + MockResponse(body = "response body") ) val port = server.port val url = server.url("/").newBuilder() @@ -3575,11 +3789,11 @@ open class CallTest { assertThat(get.requestUrl).isEqualTo(url) } - @Test fun hostnameRequestHostHasNoSquareBracesHttp1() { + @Test + fun hostnameRequestHostHasNoSquareBracesHttp1() { configureClientAndServerProxies(http2 = false) server.enqueue( - MockResponse() - .setBody("response body") + MockResponse(body = "response body") ) val port = server.port val url = server.url("/").newBuilder() @@ -3600,11 +3814,11 @@ open class CallTest { assertThat(get.requestUrl).isEqualTo(url) } - @Test fun hostnameRequestHostHasNoSquareBracesHttp2() { + @Test + fun hostnameRequestHostHasNoSquareBracesHttp2() { configureClientAndServerProxies(http2 = true) server.enqueue( - MockResponse() - .setBody("response body") + MockResponse(body = "response body") ) val port = server.port val url = server.url("/").newBuilder() @@ -3632,10 +3846,7 @@ open class CallTest { http2 -> listOf(Protocol.HTTP_2, Protocol.HTTP_1_1) else -> listOf(Protocol.HTTP_1_1) } - server.enqueue( - MockResponse() - .inTunnel() - ) + server.enqueue(MockResponse(inTunnel = true)) client = client.newBuilder() .sslSocketFactory( handshakeCertificates.sslSocketFactory(), handshakeCertificates.trustManager @@ -3665,10 +3876,10 @@ open class CallTest { } } - @Test fun emptyResponseBody() { + @Test + fun emptyResponseBody() { server.enqueue( - MockResponse() - .addHeader("abc", "def") + MockResponse(headers = headersOf("abc", "def")) ) executeSynchronously("/") .assertCode(200) @@ -3676,10 +3887,10 @@ open class CallTest { .assertBody("") } - @Test fun leakedResponseBodyLogsStackTrace() { + @Test + fun leakedResponseBodyLogsStackTrace() { server.enqueue( - MockResponse() - .setBody("This gets leaked.") + MockResponse(body = "This gets leaked.") ) client = clientTestRule.newClientBuilder() .connectionPool(ConnectionPool(0, 10, TimeUnit.MILLISECONDS)) @@ -3694,11 +3905,9 @@ open class CallTest { } @Tag("Slowish") - @Test fun asyncLeakedResponseBodyLogsStackTrace() { - server.enqueue( - MockResponse() - .setBody("This gets leaked.") - ) + @Test + fun asyncLeakedResponseBodyLogsStackTrace() { + server.enqueue(MockResponse(body = "This gets leaked.")) client = clientTestRule.newClientBuilder() .connectionPool(ConnectionPool(0, 10, TimeUnit.MILLISECONDS)) .build() @@ -3725,11 +3934,9 @@ open class CallTest { ) } - @Test fun failedAuthenticatorReleasesConnection() { - server.enqueue( - MockResponse() - .setResponseCode(401) - ) + @Test + fun failedAuthenticatorReleasesConnection() { + server.enqueue(MockResponse(code = 401)) client = client.newBuilder() .authenticator { _: Route?, _: Response -> throw IOException("IOException!") } .build() @@ -3739,10 +3946,10 @@ open class CallTest { assertThat(client.connectionPool.idleConnectionCount()).isEqualTo(1) } - @Test fun failedProxyAuthenticatorReleasesConnection() { + @Test + fun failedProxyAuthenticatorReleasesConnection() { server.enqueue( - MockResponse() - .setResponseCode(407) + MockResponse(code = 407) ) client = client.newBuilder() .proxyAuthenticator { _: Route?, _: Response -> @@ -3755,7 +3962,8 @@ open class CallTest { assertThat(client.connectionPool.idleConnectionCount()).isEqualTo(1) } - @Test fun httpsWithIpAddress() { + @Test + fun httpsWithIpAddress() { val localIpAddress = InetAddress.getLoopbackAddress().hostAddress // Create a certificate with an IP address in the subject alt name. @@ -3792,7 +4000,8 @@ open class CallTest { assertThat(recordedRequest.getHeader("Host")).isEqualTo("$localIpAddress:${server.port}") } - @Test fun postWithFileNotFound() { + @Test + fun postWithFileNotFound() { val called = AtomicInteger(0) val body: RequestBody = object : RequestBody() { override fun contentType(): MediaType = "application/octet-stream".toMediaType() @@ -3814,14 +4023,15 @@ open class CallTest { assertThat(called.get()).isEqualTo(1L) } - @Test fun clientReadsHeadersDataTrailersHttp1ChunkedTransferEncoding() { - val mockResponse = MockResponse() + @Test + fun clientReadsHeadersDataTrailersHttp1ChunkedTransferEncoding() { + server.enqueue(MockResponse.Builder() .clearHeaders() .addHeader("h1", "v1") .addHeader("h2", "v2") - .setChunkedBody("HelloBonjour", 1024) - .setTrailers(headersOf("trailers", "boom")) - server.enqueue(mockResponse) + .chunkedBody("HelloBonjour", 1024) + .trailers(headersOf("trailers", "boom")) + .build()) val call = client.newCall(Request(server.url("/"))) val response = call.execute() val source = response.body.source() @@ -3835,15 +4045,16 @@ open class CallTest { ).isEqualTo(headersOf("trailers", "boom")) } - @Test fun clientReadsHeadersDataTrailersHttp2() { + @Test + fun clientReadsHeadersDataTrailersHttp2() { platform.assumeHttp2Support() - val mockResponse = MockResponse() + server.enqueue(MockResponse.Builder() .clearHeaders() .addHeader("h1", "v1") .addHeader("h2", "v2") - .setBody("HelloBonjour") - .setTrailers(headersOf("trailers", "boom")) - server.enqueue(mockResponse) + .body("HelloBonjour") + .trailers(headersOf("trailers", "boom")) + .build()) enableProtocol(Protocol.HTTP_2) val call = client.newCall(Request(server.url("/"))) call.execute().use { response -> @@ -3857,7 +4068,8 @@ open class CallTest { } } - @Test fun connectionIsImmediatelyUnhealthy() { + @Test + fun connectionIsImmediatelyUnhealthy() { val listener: EventListener = object : EventListener() { override fun connectionAcquired(call: Call, connection: Connection) { connection.socket().closeQuietly() @@ -3871,7 +4083,8 @@ open class CallTest { .assertFailure("Socket closed", "Socket is closed") } - @Test fun requestBodyThrowsUnrelatedToNetwork() { + @Test + fun requestBodyThrowsUnrelatedToNetwork() { server.enqueue(MockResponse()) val request = Request( url = server.url("/"), @@ -3890,7 +4103,8 @@ open class CallTest { assertThat(server.takeRequest().failure).isNotNull } - @Test fun requestBodyThrowsUnrelatedToNetwork_HTTP2() { + @Test + fun requestBodyThrowsUnrelatedToNetwork_HTTP2() { enableProtocol(Protocol.HTTP_2) requestBodyThrowsUnrelatedToNetwork() } @@ -3900,10 +4114,11 @@ open class CallTest { * connection that returns to the connection pool with the underlying socket closed. This relies * on an implementation detail so it might not be a valid test case in the future. */ - @Test fun cancelAfterResponseBodyEnd() { + @Test + fun cancelAfterResponseBodyEnd() { enableTls() - server.enqueue(MockResponse().setBody("abc")) - server.enqueue(MockResponse().setBody("def")) + server.enqueue(MockResponse(body = "abc")) + server.enqueue(MockResponse(body = "def")) client = client.newBuilder() .protocols(listOf(Protocol.HTTP_1_1)) .build() @@ -3921,10 +4136,10 @@ open class CallTest { } /** https://github.com/square/okhttp/issues/4583 */ - @Test fun lateCancelCallsOnFailure() { + @Test + fun lateCancelCallsOnFailure() { server.enqueue( - MockResponse() - .setBody("abc") + MockResponse(body = "abc") ) val closed = AtomicBoolean() client = client.newBuilder() @@ -3946,18 +4161,21 @@ open class CallTest { assertThat(closed.get()).isTrue } - @Test fun priorResponseBodyNotReadable() { + @Test + fun priorResponseBodyNotReadable() { server.enqueue( - MockResponse() - .setResponseCode(301) - .addHeader("Location: /b") - .addHeader("Content-Type: text/plain; charset=UTF-8") - .addHeader("Test", "Redirect from /a to /b") - .setBody("/a has moved!") + MockResponse( + code = 301, + headers = headersOf( + "Location", "/b", + "Content-Type", "text/plain; charset=UTF-8", + "Test", "Redirect from /a to /b", + ), + body = "/a has moved!", + ) ) server.enqueue( - MockResponse() - .setBody("this is the redirect target") + MockResponse(body = "this is the redirect target") ) val call = client.newCall(Request(server.url("/"))) diff --git a/okhttp/src/jvmTest/java/okhttp3/ConnectionCoalescingTest.java b/okhttp/src/jvmTest/java/okhttp3/ConnectionCoalescingTest.java index 4925f784d..ecc78c624 100644 --- a/okhttp/src/jvmTest/java/okhttp3/ConnectionCoalescingTest.java +++ b/okhttp/src/jvmTest/java/okhttp3/ConnectionCoalescingTest.java @@ -276,11 +276,13 @@ public final class ConnectionCoalescingTest { } @Test public void skipsOnRedirectWhenDnsDontMatch() throws Exception { - server.enqueue(new MockResponse() - .setResponseCode(301) - .addHeader("Location", url.newBuilder().host("differentdns.com").build())); - server.enqueue(new MockResponse() - .setBody("unexpected call")); + server.enqueue(new MockResponse.Builder() + .code(301) + .addHeader("Location", url.newBuilder().host("differentdns.com").build()) + .build()); + server.enqueue(new MockResponse.Builder() + .body("unexpected call") + .build()); try { Response response = execute(url); @@ -307,9 +309,10 @@ public final class ConnectionCoalescingTest { } @Test public void skipsOnRedirectWhenNotSubjectAltName() throws Exception { - server.enqueue(new MockResponse() - .setResponseCode(301) - .addHeader("Location", url.newBuilder().host("nonsan.com").build())); + server.enqueue(new MockResponse.Builder() + .code(301) + .addHeader("Location", url.newBuilder().host("nonsan.com").build()) + .build()); server.enqueue(new MockResponse()); try { @@ -365,9 +368,10 @@ public final class ConnectionCoalescingTest { .build(); client = client.newBuilder().certificatePinner(pinner).build(); - server.enqueue(new MockResponse() - .setResponseCode(301) - .addHeader("Location", url.newBuilder().host("san.com").build())); + server.enqueue(new MockResponse.Builder() + .code(301) + .addHeader("Location", url.newBuilder().host("san.com").build()) + .build()); server.enqueue(new MockResponse()); try { @@ -401,9 +405,10 @@ public final class ConnectionCoalescingTest { HostnameVerifier verifier = (name, session) -> true; client = client.newBuilder().hostnameVerifier(verifier).build(); - server.enqueue(new MockResponse() - .setResponseCode(301) - .addHeader("Location", url.newBuilder().host("san.com").build())); + server.enqueue(new MockResponse.Builder() + .code(301) + .addHeader("Location", url.newBuilder().host("san.com").build()) + .build()); server.enqueue(new MockResponse()); assert200Http2Response(execute(url), "san.com"); @@ -475,13 +480,16 @@ public final class ConnectionCoalescingTest { } @Test public void misdirectedRequestResponseCode() throws Exception { - server.enqueue(new MockResponse() - .setBody("seed connection")); - server.enqueue(new MockResponse() - .setResponseCode(421) - .setBody("misdirected!")); - server.enqueue(new MockResponse() - .setBody("after misdirect")); + server.enqueue(new MockResponse.Builder() + .body("seed connection") + .build()); + server.enqueue(new MockResponse.Builder() + .code(421) + .body("misdirected!") + .build()); + server.enqueue(new MockResponse.Builder() + .body("after misdirect") + .build()); // Seed the connection pool. assert200Http2Response(execute(url), server.getHostName()); diff --git a/okhttp/src/jvmTest/java/okhttp3/ConnectionReuseTest.kt b/okhttp/src/jvmTest/java/okhttp3/ConnectionReuseTest.kt index 59689ec87..9e51d3a00 100644 --- a/okhttp/src/jvmTest/java/okhttp3/ConnectionReuseTest.kt +++ b/okhttp/src/jvmTest/java/okhttp3/ConnectionReuseTest.kt @@ -20,6 +20,7 @@ import javax.net.ssl.SSLException import mockwebserver3.MockResponse import mockwebserver3.MockWebServer import mockwebserver3.SocketPolicy +import okhttp3.Headers.Companion.headersOf import okhttp3.MediaType.Companion.toMediaType import okhttp3.RequestBody.Companion.toRequestBody import okhttp3.ResponseBody.Companion.toResponseBody @@ -48,39 +49,44 @@ class ConnectionReuseTest { private val handshakeCertificates: HandshakeCertificates = localhost() private var client: OkHttpClient = clientTestRule.newClient() - @BeforeEach fun setUp(server: MockWebServer) { + @BeforeEach + fun setUp(server: MockWebServer) { this.server = server } - @Test fun connectionsAreReused() { - server.enqueue(MockResponse().setBody("a")) - server.enqueue(MockResponse().setBody("b")) + @Test + fun connectionsAreReused() { + server.enqueue(MockResponse(body = "a")) + server.enqueue(MockResponse(body = "b")) val request = Request(server.url("/")) assertConnectionReused(request, request) } - @Test fun connectionsAreReusedForPosts() { - server.enqueue(MockResponse().setBody("a")) - server.enqueue(MockResponse().setBody("b")) + @Test + fun connectionsAreReusedForPosts() { + server.enqueue(MockResponse(body = "a")) + server.enqueue(MockResponse(body = "b")) val request = Request( url = server.url("/"), - body ="request body".toRequestBody("text/plain".toMediaType()), + body = "request body".toRequestBody("text/plain".toMediaType()), ) assertConnectionReused(request, request) } - @Test fun connectionsAreReusedWithHttp2() { + @Test + fun connectionsAreReusedWithHttp2() { platform.assumeNotBouncyCastle() enableHttp2() - server.enqueue(MockResponse().setBody("a")) - server.enqueue(MockResponse().setBody("b")) + server.enqueue(MockResponse(body = "a")) + server.enqueue(MockResponse(body = "b")) val request = Request(server.url("/")) assertConnectionReused(request, request) } - @Test fun connectionsAreNotReusedWithRequestConnectionClose() { - server.enqueue(MockResponse().setBody("a")) - server.enqueue(MockResponse().setBody("b")) + @Test + fun connectionsAreNotReusedWithRequestConnectionClose() { + server.enqueue(MockResponse(body = "a")) + server.enqueue(MockResponse(body = "b")) val requestA = Request.Builder() .url(server.url("/")) .header("Connection", "close") @@ -89,51 +95,58 @@ class ConnectionReuseTest { assertConnectionNotReused(requestA, requestB) } - @Test fun connectionsAreNotReusedWithResponseConnectionClose() { + @Test + fun connectionsAreNotReusedWithResponseConnectionClose() { server.enqueue( - MockResponse() - .addHeader("Connection", "close") - .setBody("a") + MockResponse( + headers = headersOf("Connection", "close"), + body = "a", + ) ) - server.enqueue(MockResponse().setBody("b")) + server.enqueue(MockResponse(body = "b")) val requestA = Request(server.url("/")) val requestB = Request(server.url("/")) assertConnectionNotReused(requestA, requestB) } - @Test fun connectionsAreNotReusedWithUnknownLengthResponseBody() { + @Test + fun connectionsAreNotReusedWithUnknownLengthResponseBody() { server.enqueue( - MockResponse() - .setBody("a") - .setSocketPolicy(SocketPolicy.DISCONNECT_AT_END) + MockResponse.Builder() + .body("a") .clearHeaders() + .socketPolicy(SocketPolicy.DISCONNECT_AT_END) + .build() ) - server.enqueue(MockResponse().setBody("b")) + server.enqueue(MockResponse(body = "b")) val request = Request(server.url("/")) assertConnectionNotReused(request, request) } - @Test fun connectionsAreNotReusedIfPoolIsSizeZero() { + @Test + fun connectionsAreNotReusedIfPoolIsSizeZero() { client = client.newBuilder() .connectionPool(ConnectionPool(0, 5, TimeUnit.SECONDS)) .build() - server.enqueue(MockResponse().setBody("a")) - server.enqueue(MockResponse().setBody("b")) + server.enqueue(MockResponse(body = "a")) + server.enqueue(MockResponse(body = "b")) val request = Request(server.url("/")) assertConnectionNotReused(request, request) } - @Test fun connectionsReusedWithRedirectEvenIfPoolIsSizeZero() { + @Test + fun connectionsReusedWithRedirectEvenIfPoolIsSizeZero() { client = client.newBuilder() .connectionPool(ConnectionPool(0, 5, TimeUnit.SECONDS)) .build() server.enqueue( - MockResponse() - .setResponseCode(301) - .addHeader("Location: /b") - .setBody("a") + MockResponse( + code = 301, + headers = headersOf("Location", "/b"), + body = "a" + ) ) - server.enqueue(MockResponse().setBody("b")) + server.enqueue(MockResponse(body = "b")) val request = Request(server.url("/")) val response = client.newCall(request).execute() assertThat(response.body.string()).isEqualTo("b") @@ -141,18 +154,19 @@ class ConnectionReuseTest { assertThat(server.takeRequest().sequenceNumber).isEqualTo(1) } - @Test fun connectionsNotReusedWithRedirectIfDiscardingResponseIsSlow() { + @Test + fun connectionsNotReusedWithRedirectIfDiscardingResponseIsSlow() { client = client.newBuilder() .connectionPool(ConnectionPool(0, 5, TimeUnit.SECONDS)) .build() server.enqueue( - MockResponse() - .setResponseCode(301) + MockResponse.Builder() + .code(301) .addHeader("Location: /b") - .setBodyDelay(1, TimeUnit.SECONDS) - .setBody("a") - ) - server.enqueue(MockResponse().setBody("b")) + .bodyDelay(1, TimeUnit.SECONDS) + .body("a") + .build()) + server.enqueue(MockResponse(body = "b")) val request = Request(server.url("/")) val response = client.newCall(request).execute() assertThat(response.body.string()).isEqualTo("b") @@ -160,10 +174,11 @@ class ConnectionReuseTest { assertThat(server.takeRequest().sequenceNumber).isEqualTo(0) } - @Test fun silentRetryWhenIdempotentRequestFailsOnReusedConnection() { - server.enqueue(MockResponse().setBody("a")) - server.enqueue(MockResponse().setSocketPolicy(SocketPolicy.DISCONNECT_AFTER_REQUEST)) - server.enqueue(MockResponse().setBody("b")) + @Test + fun silentRetryWhenIdempotentRequestFailsOnReusedConnection() { + server.enqueue(MockResponse(body = "a")) + server.enqueue(MockResponse(socketPolicy = SocketPolicy.DISCONNECT_AFTER_REQUEST)) + server.enqueue(MockResponse(body = "b")) val request = Request(server.url("/")) val responseA = client.newCall(request).execute() assertThat(responseA.body.string()).isEqualTo("a") @@ -174,11 +189,12 @@ class ConnectionReuseTest { assertThat(server.takeRequest().sequenceNumber).isEqualTo(0) } - @Test fun http2ConnectionsAreSharedBeforeResponseIsConsumed() { + @Test + fun http2ConnectionsAreSharedBeforeResponseIsConsumed() { platform.assumeNotBouncyCastle() enableHttp2() - server.enqueue(MockResponse().setBody("a")) - server.enqueue(MockResponse().setBody("b")) + server.enqueue(MockResponse(body = "a")) + server.enqueue(MockResponse(body = "b")) val request = Request(server.url("/")) val response1 = client.newCall(request).execute() val response2 = client.newCall(request).execute() @@ -188,9 +204,10 @@ class ConnectionReuseTest { assertThat(server.takeRequest().sequenceNumber).isEqualTo(1) } - @Test fun connectionsAreEvicted() { - server.enqueue(MockResponse().setBody("a")) - server.enqueue(MockResponse().setBody("b")) + @Test + fun connectionsAreEvicted() { + server.enqueue(MockResponse(body = "a")) + server.enqueue(MockResponse(body = "b")) client = client.newBuilder() .connectionPool(ConnectionPool(5, 250, TimeUnit.MILLISECONDS)) .build() @@ -206,7 +223,8 @@ class ConnectionReuseTest { assertThat(server.takeRequest().sequenceNumber).isEqualTo(0) } - @Test fun connectionsAreNotReusedIfSslSocketFactoryChanges() { + @Test + fun connectionsAreNotReusedIfSslSocketFactoryChanges() { platform.assumeNotBouncyCastle() enableHttps() server.enqueue(MockResponse()) @@ -231,7 +249,8 @@ class ConnectionReuseTest { } } - @Test fun connectionsAreNotReusedIfHostnameVerifierChanges() { + @Test + fun connectionsAreNotReusedIfHostnameVerifierChanges() { platform.assumeNotBouncyCastle() enableHttps() server.enqueue(MockResponse()) @@ -261,7 +280,8 @@ class ConnectionReuseTest { * * https://github.com/square/okhttp/issues/2409 */ - @Test fun connectionsAreNotReusedIfNetworkInterceptorInterferes() { + @Test + fun connectionsAreNotReusedIfNetworkInterceptorInterferes() { val responsesNotClosed: MutableList = ArrayList() client = client.newBuilder() @@ -280,14 +300,14 @@ class ConnectionReuseTest { }) .build() server.enqueue( - MockResponse() - .setResponseCode(301) - .addHeader("Location: /b") - .setBody("/a has moved!") + MockResponse( + code = 301, + headers = headersOf("Location", "/b"), + body = "/a has moved!", + ) ) server.enqueue( - MockResponse() - .setBody("/b is here") + MockResponse(body = "/b is here") ) val request = Request(server.url("/")) val call = client.newCall(request) diff --git a/okhttp/src/jvmTest/java/okhttp3/CookiesTest.java b/okhttp/src/jvmTest/java/okhttp3/CookiesTest.java index 610446ef2..29dcbd134 100644 --- a/okhttp/src/jvmTest/java/okhttp3/CookiesTest.java +++ b/okhttp/src/jvmTest/java/okhttp3/CookiesTest.java @@ -62,11 +62,13 @@ public class CookiesTest { .build(); HttpUrl urlWithIpAddress = urlWithIpAddress(server, "/path/foo"); - server.enqueue(new MockResponse().addHeader("Set-Cookie: a=android; " - + "expires=Fri, 31-Dec-9999 23:59:59 GMT; " - + "path=/path; " - + "domain=" + urlWithIpAddress.host() + "; " - + "secure")); + server.enqueue(new MockResponse.Builder() + .addHeader("Set-Cookie: a=android; " + + "expires=Fri, 31-Dec-9999 23:59:59 GMT; " + + "path=/path; " + + "domain=" + urlWithIpAddress.host() + "; " + + "secure") + .build()); get(urlWithIpAddress); List cookies = cookieManager.getCookieStore().getCookies(); @@ -90,13 +92,15 @@ public class CookiesTest { .build(); HttpUrl urlWithIpAddress = urlWithIpAddress(server, "/path/foo"); - server.enqueue(new MockResponse().addHeader("Set-Cookie: a=android; " - + "Comment=this cookie is delicious; " - + "Domain=" + urlWithIpAddress.host() + "; " - + "Max-Age=60; " - + "Path=/path; " - + "Secure; " - + "Version=1")); + server.enqueue(new MockResponse.Builder() + .addHeader("Set-Cookie: a=android; " + + "Comment=this cookie is delicious; " + + "Domain=" + urlWithIpAddress.host() + "; " + + "Max-Age=60; " + + "Path=/path; " + + "Secure; " + + "Version=1") + .build()); get(urlWithIpAddress); List cookies = cookieManager.getCookieStore().getCookies(); @@ -119,16 +123,18 @@ public class CookiesTest { .build(); HttpUrl urlWithIpAddress = urlWithIpAddress(server, "/path/foo"); - server.enqueue(new MockResponse().addHeader("Set-Cookie: a=\"android\"; " - + "Comment=\"this cookie is delicious\"; " - + "CommentURL=\"http://google.com/\"; " - + "Discard; " - + "Domain=" + urlWithIpAddress.host() + "; " - + "Max-Age=60; " - + "Path=\"/path\"; " - + "Port=\"80,443," + server.getPort() + "\"; " - + "Secure; " - + "Version=\"1\"")); + server.enqueue(new MockResponse.Builder() + .addHeader("Set-Cookie: a=\"android\"; " + + "Comment=\"this cookie is delicious\"; " + + "CommentURL=\"http://google.com/\"; " + + "Discard; " + + "Domain=" + urlWithIpAddress.host() + "; " + + "Max-Age=60; " + + "Path=\"/path\"; " + + "Port=\"80,443," + server.getPort() + "\"; " + + "Secure; " + + "Version=\"1\"") + .build()); get(urlWithIpAddress); List cookies = cookieManager.getCookieStore().getCookies(); @@ -191,9 +197,10 @@ public class CookiesTest { } @Test public void receiveAndSendMultipleCookies() throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Set-Cookie", "a=android") - .addHeader("Set-Cookie", "b=banana")); + .addHeader("Set-Cookie", "b=banana") + .build()); server.enqueue(new MockResponse()); CookieManager cookieManager = new CookieManager(null, ACCEPT_ORIGINAL_SERVER); @@ -212,14 +219,15 @@ public class CookiesTest { @Test public void testRedirectsDoNotIncludeTooManyCookies() throws Exception { MockWebServer redirectTarget = new MockWebServer(); - redirectTarget.enqueue(new MockResponse().setBody("A")); + redirectTarget.enqueue(new MockResponse.Builder().body("A").build()); redirectTarget.start(); HttpUrl redirectTargetUrl = urlWithIpAddress(redirectTarget, "/"); MockWebServer redirectSource = new MockWebServer(); - redirectSource.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) - .addHeader("Location: " + redirectTargetUrl)); + redirectSource.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_MOVED_TEMP) + .addHeader("Location: " + redirectTargetUrl) + .build()); redirectSource.start(); HttpUrl redirectSourceUrl = urlWithIpAddress(redirectSource, "/"); diff --git a/okhttp/src/jvmTest/java/okhttp3/DuplexTest.java b/okhttp/src/jvmTest/java/okhttp3/DuplexTest.java index 5e6b41e3c..322d5e684 100644 --- a/okhttp/src/jvmTest/java/okhttp3/DuplexTest.java +++ b/okhttp/src/jvmTest/java/okhttp3/DuplexTest.java @@ -43,7 +43,6 @@ import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Timeout; import org.junit.jupiter.api.extension.RegisterExtension; - import static java.util.Arrays.asList; import static okhttp3.tls.internal.TlsUtil.localhost; import static org.assertj.core.api.Assertions.assertThat; @@ -91,7 +90,7 @@ public final class DuplexTest { @Test public void trueDuplexClientWritesFirst() throws Exception { enableProtocol(Protocol.HTTP_2); MockDuplexResponseBody mockDuplexResponseBody = enqueueResponseWithBody( - new MockResponse() + new MockResponse.Builder() .clearHeaders(), new MockDuplexResponseBody() .receiveRequest("request A\n") @@ -134,7 +133,7 @@ public final class DuplexTest { @Test public void trueDuplexServerWritesFirst() throws Exception { enableProtocol(Protocol.HTTP_2); MockDuplexResponseBody mockDuplexResponseBody = enqueueResponseWithBody( - new MockResponse() + new MockResponse.Builder() .clearHeaders(), new MockDuplexResponseBody() .sendResponse("response A\n") @@ -177,11 +176,11 @@ public final class DuplexTest { @Test public void clientReadsHeadersDataTrailers() throws Exception { enableProtocol(Protocol.HTTP_2); MockDuplexResponseBody mockDuplexResponseBody = enqueueResponseWithBody( - new MockResponse() + new MockResponse.Builder() .clearHeaders() .addHeader("h1", "v1") .addHeader("h2", "v2") - .setTrailers(Headers.of("trailers", "boom")), + .trailers(Headers.of("trailers", "boom")), new MockDuplexResponseBody() .sendResponse("ok") .exhaustResponse()); @@ -207,7 +206,7 @@ public final class DuplexTest { enableProtocol(Protocol.HTTP_2); MockDuplexResponseBody mockDuplexResponseBody = enqueueResponseWithBody( - new MockResponse() + new MockResponse.Builder() .clearHeaders() .addHeader("h1", "v1") .addHeader("h2", "v2"), @@ -236,7 +235,7 @@ public final class DuplexTest { @Test public void requestBodyEndsAfterResponseBody() throws Exception { enableProtocol(Protocol.HTTP_2); MockDuplexResponseBody mockDuplexResponseBody = enqueueResponseWithBody( - new MockResponse() + new MockResponse.Builder() .clearHeaders(), new MockDuplexResponseBody() .exhaustResponse() @@ -271,7 +270,7 @@ public final class DuplexTest { enableProtocol(Protocol.HTTP_2); MockDuplexResponseBody mockDuplexResponseBody = enqueueResponseWithBody( - new MockResponse() + new MockResponse.Builder() .clearHeaders() .add100Continue(), new MockDuplexResponseBody() @@ -327,16 +326,17 @@ public final class DuplexTest { .build(); MockDuplexResponseBody mockDuplexResponseBody = enqueueResponseWithBody( - new MockResponse() + new MockResponse.Builder() .clearHeaders() - .setResponseCode(HttpURLConnection.HTTP_MOVED_PERM) + .code(HttpURLConnection.HTTP_MOVED_PERM) .addHeader("Location: /b"), new MockDuplexResponseBody() .sendResponse("/a has moved!\n", duplexResponseSent) .requestIOException() .exhaustResponse()); - server.enqueue(new MockResponse() - .setBody("this is /b")); + server.enqueue(new MockResponse.Builder() + .body("this is /b") + .build()); Call call = client.newCall(new Request.Builder() .url(server.url("/")) @@ -381,15 +381,15 @@ public final class DuplexTest { .build(); MockDuplexResponseBody mockResponseBody1 = enqueueResponseWithBody( - new MockResponse() + new MockResponse.Builder() .clearHeaders() - .setResponseCode(HttpURLConnection.HTTP_UNAUTHORIZED), + .code(HttpURLConnection.HTTP_UNAUTHORIZED), new MockDuplexResponseBody() .sendResponse("please authenticate!\n") .requestIOException() .exhaustResponse()); MockDuplexResponseBody mockResponseBody2 = enqueueResponseWithBody( - new MockResponse() + new MockResponse.Builder() .clearHeaders(), new MockDuplexResponseBody() .sendResponse("response body\n") @@ -431,8 +431,9 @@ public final class DuplexTest { @Test public void fullCallTimeoutAppliesToSetup() throws Exception { enableProtocol(Protocol.HTTP_2); - server.enqueue(new MockResponse() - .setHeadersDelay(500, TimeUnit.MILLISECONDS)); + server.enqueue(new MockResponse.Builder() + .headersDelay(500, TimeUnit.MILLISECONDS) + .build()); Request request = new Request.Builder() .url(server.url("/")) @@ -454,7 +455,7 @@ public final class DuplexTest { enableProtocol(Protocol.HTTP_2); MockDuplexResponseBody mockDuplexResponseBody = enqueueResponseWithBody( - new MockResponse() + new MockResponse.Builder() .clearHeaders(), new MockDuplexResponseBody() .sendResponse("response A\n") @@ -490,7 +491,7 @@ public final class DuplexTest { @Test public void duplexWithRewriteInterceptors() throws Exception { enableProtocol(Protocol.HTTP_2); MockDuplexResponseBody mockDuplexResponseBody = enqueueResponseWithBody( - new MockResponse() + new MockResponse.Builder() .clearHeaders(), new MockDuplexResponseBody() .receiveRequest("REQUEST A\n") @@ -541,7 +542,7 @@ public final class DuplexTest { enableProtocol(Protocol.HTTP_2); MockDuplexResponseBody mockDuplexResponseBody = enqueueResponseWithBody( - new MockResponse() + new MockResponse.Builder() .clearHeaders(), new MockDuplexResponseBody() .sendResponse("success!") @@ -588,8 +589,9 @@ public final class DuplexTest { @Test public void headersReadTimeoutDoesNotStartUntilLastRequestBodyByteFire() throws Exception { enableProtocol(Protocol.HTTP_2); - server.enqueue(new MockResponse() - .setHeadersDelay(1500, TimeUnit.MILLISECONDS)); + server.enqueue(new MockResponse.Builder() + .headersDelay(1500, TimeUnit.MILLISECONDS) + .build()); Request request = new Request.Builder() .url(server.url("/")) @@ -613,9 +615,10 @@ public final class DuplexTest { @Test public void bodyReadTimeoutDoesNotStartUntilLastRequestBodyByteFire() throws Exception { enableProtocol(Protocol.HTTP_2); - server.enqueue(new MockResponse() - .setBodyDelay(1500, TimeUnit.MILLISECONDS) - .setBody("this should never be received")); + server.enqueue(new MockResponse.Builder() + .bodyDelay(1500, TimeUnit.MILLISECONDS) + .body("this should never be received") + .build()); Request request = new Request.Builder() .url(server.url("/")) @@ -643,8 +646,9 @@ public final class DuplexTest { @Test public void headersReadTimeoutDoesNotStartUntilLastRequestBodyByteNoFire() throws Exception { enableProtocol(Protocol.HTTP_2); - server.enqueue(new MockResponse() - .setHeadersDelay(500, TimeUnit.MILLISECONDS)); + server.enqueue(new MockResponse.Builder() + .headersDelay(500, TimeUnit.MILLISECONDS) + .build()); Request request = new Request.Builder() .url(server.url("/")) @@ -667,9 +671,10 @@ public final class DuplexTest { @Test public void bodyReadTimeoutDoesNotStartUntilLastRequestBodyByteNoFire() throws Exception { enableProtocol(Protocol.HTTP_2); - server.enqueue(new MockResponse() - .setBodyDelay(500, TimeUnit.MILLISECONDS) - .setBody("success")); + server.enqueue(new MockResponse.Builder() + .bodyDelay(500, TimeUnit.MILLISECONDS) + .body("success") + .build()); Request request = new Request.Builder() .url(server.url("/")) @@ -686,9 +691,9 @@ public final class DuplexTest { } private MockDuplexResponseBody enqueueResponseWithBody( - MockResponse response, MockDuplexResponseBody body) { - MwsDuplexAccess.instance.setBody(response, body); - server.enqueue(response); + MockResponse.Builder builder, MockDuplexResponseBody body) { + MwsDuplexAccess.instance.setBody(builder, body); + server.enqueue(builder.build()); return body; } diff --git a/okhttp/src/jvmTest/java/okhttp3/EventListenerTest.java b/okhttp/src/jvmTest/java/okhttp3/EventListenerTest.java index 3c7657934..c251a7d9a 100644 --- a/okhttp/src/jvmTest/java/okhttp3/EventListenerTest.java +++ b/okhttp/src/jvmTest/java/okhttp3/EventListenerTest.java @@ -120,8 +120,9 @@ public final class EventListenerTest { } @Test public void successfulCallEventSequence() throws IOException { - server.enqueue(new MockResponse() - .setBody("abc")); + server.enqueue(new MockResponse.Builder() + .body("abc") + .build()); Call call = client.newCall(new Request.Builder() .url(server.url("/")) @@ -139,8 +140,9 @@ public final class EventListenerTest { } @Test public void successfulCallEventSequenceForIpAddress() throws IOException { - server.enqueue(new MockResponse() - .setBody("abc")); + server.enqueue(new MockResponse.Builder() + .body("abc") + .build()); String ipAddress = InetAddress.getLoopbackAddress().getHostAddress(); @@ -160,8 +162,9 @@ public final class EventListenerTest { } @Test public void successfulCallEventSequenceForEnqueue() throws Exception { - server.enqueue(new MockResponse() - .setBody("abc")); + server.enqueue(new MockResponse.Builder() + .body("abc") + .build()); Call call = client.newCall(new Request.Builder() .url(server.url("/")) @@ -191,8 +194,9 @@ public final class EventListenerTest { } @Test public void failedCallEventSequence() { - server.enqueue(new MockResponse() - .setHeadersDelay(2, TimeUnit.SECONDS)); + server.enqueue(new MockResponse.Builder() + .headersDelay(2, TimeUnit.SECONDS) + .build()); client = client.newBuilder() .readTimeout(Duration.ofMillis(250)) @@ -215,9 +219,11 @@ public final class EventListenerTest { } @Test public void failedDribbledCallEventSequence() throws IOException { - server.enqueue(new MockResponse().setBody("0123456789") + server.enqueue(new MockResponse.Builder() + .body("0123456789") .throttleBody(2, 100, TimeUnit.MILLISECONDS) - .setSocketPolicy(SocketPolicy.DISCONNECT_DURING_RESPONSE_BODY)); + .socketPolicy(SocketPolicy.DISCONNECT_DURING_RESPONSE_BODY) + .build()); client = client.newBuilder() .protocols(Collections.singletonList(Protocol.HTTP_1_1)) @@ -262,8 +268,9 @@ public final class EventListenerTest { } @Test public void cancelAsyncCall() throws IOException { - server.enqueue(new MockResponse() - .setBody("abc")); + server.enqueue(new MockResponse.Builder() + .body("abc") + .build()); Call call = client.newCall(new Request.Builder() .url(server.url("/")) @@ -282,8 +289,9 @@ public final class EventListenerTest { } @Test public void multipleCancelsEmitsOnlyOneEvent() throws IOException { - server.enqueue(new MockResponse() - .setBody("abc")); + server.enqueue(new MockResponse.Builder() + .body("abc") + .build()); Call call = client.newCall(new Request.Builder() .url(server.url("/")) @@ -409,8 +417,9 @@ public final class EventListenerTest { @Test public void successfulEmptyHttpsCallEventSequence() throws IOException { enableTlsWithTunnel(); server.setProtocols(asList(Protocol.HTTP_1_1)); - server.enqueue(new MockResponse() - .setBody("abc")); + server.enqueue(new MockResponse.Builder() + .body("abc") + .build()); assertSuccessfulEventOrder(anyResponse); @@ -421,8 +430,10 @@ public final class EventListenerTest { @Test public void successfulChunkedHttpsCallEventSequence() throws IOException { enableTlsWithTunnel(); server.setProtocols(asList(Protocol.HTTP_1_1)); - server.enqueue( - new MockResponse().setBodyDelay(100, TimeUnit.MILLISECONDS).setChunkedBody("Hello!", 2)); + server.enqueue(new MockResponse.Builder() + .bodyDelay(100, TimeUnit.MILLISECONDS) + .chunkedBody("Hello!", 2) + .build()); assertSuccessfulEventOrder(anyResponse); @@ -433,8 +444,10 @@ public final class EventListenerTest { @Test public void successfulChunkedH2CallEventSequence() throws IOException { enableTlsWithTunnel(); server.setProtocols(asList(Protocol.HTTP_2, Protocol.HTTP_1_1)); - server.enqueue( - new MockResponse().setBodyDelay(100, TimeUnit.MILLISECONDS).setChunkedBody("Hello!", 2)); + server.enqueue(new MockResponse.Builder() + .bodyDelay(100, TimeUnit.MILLISECONDS) + .chunkedBody("Hello!", 2) + .build()); assertSuccessfulEventOrder(matchesProtocol(Protocol.HTTP_2)); @@ -489,9 +502,10 @@ public final class EventListenerTest { } @Test public void multipleDnsLookupsForSingleCall() throws IOException { - server.enqueue(new MockResponse() - .setResponseCode(301) - .setHeader("Location", "http://www.fakeurl:" + server.getPort())); + server.enqueue(new MockResponse.Builder() + .code(301) + .setHeader("Location", "http://www.fakeurl:" + server.getPort()) + .build()); server.enqueue(new MockResponse()); FakeDns dns = new FakeDns(); @@ -583,8 +597,9 @@ public final class EventListenerTest { @Test public void failedConnect() throws UnknownHostException { enableTlsWithTunnel(); - server.enqueue(new MockResponse() - .setSocketPolicy(SocketPolicy.FAIL_HANDSHAKE)); + server.enqueue(new MockResponse.Builder() + .socketPolicy(SocketPolicy.FAIL_HANDSHAKE) + .build()); Call call = client.newCall(new Request.Builder() .url(server.url("/")) @@ -612,8 +627,9 @@ public final class EventListenerTest { @Test public void multipleConnectsForSingleCall() throws IOException { enableTlsWithTunnel(); - server.enqueue(new MockResponse() - .setSocketPolicy(SocketPolicy.FAIL_HANDSHAKE)); + server.enqueue(new MockResponse.Builder() + .socketPolicy(SocketPolicy.FAIL_HANDSHAKE) + .build()); server.enqueue(new MockResponse()); client = client.newBuilder() @@ -695,13 +711,15 @@ public final class EventListenerTest { @Test public void authenticatingTunnelProxyConnect() throws IOException { enableTlsWithTunnel(); - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .inTunnel() - .setResponseCode(407) + .code(407) .addHeader("Proxy-Authenticate: Basic realm=\"localhost\"") - .addHeader("Connection: close")); - server.enqueue(new MockResponse() - .inTunnel()); + .addHeader("Connection: close") + .build()); + server.enqueue(new MockResponse.Builder() + .inTunnel() + .build()); server.enqueue(new MockResponse()); client = client.newBuilder() @@ -746,8 +764,9 @@ public final class EventListenerTest { @Test public void failedSecureConnect() { enableTlsWithTunnel(); - server.enqueue(new MockResponse() - .setSocketPolicy(SocketPolicy.FAIL_HANDSHAKE)); + server.enqueue(new MockResponse.Builder() + .socketPolicy(SocketPolicy.FAIL_HANDSHAKE) + .build()); Call call = client.newCall(new Request.Builder() .url(server.url("/")) @@ -768,8 +787,9 @@ public final class EventListenerTest { @Test public void secureConnectWithTunnel() throws IOException { enableTlsWithTunnel(); - server.enqueue(new MockResponse() - .inTunnel()); + server.enqueue(new MockResponse.Builder() + .inTunnel() + .build()); server.enqueue(new MockResponse()); client = client.newBuilder() @@ -793,8 +813,9 @@ public final class EventListenerTest { @Test public void multipleSecureConnectsForSingleCall() throws IOException { enableTlsWithTunnel(); - server.enqueue(new MockResponse() - .setSocketPolicy(SocketPolicy.FAIL_HANDSHAKE)); + server.enqueue(new MockResponse.Builder() + .socketPolicy(SocketPolicy.FAIL_HANDSHAKE) + .build()); server.enqueue(new MockResponse()); client = client.newBuilder() @@ -862,11 +883,13 @@ public final class EventListenerTest { } @Test public void noConnectionFoundOnFollowUp() throws IOException { - server.enqueue(new MockResponse() - .setResponseCode(301) - .addHeader("Location", "/foo")); - server.enqueue(new MockResponse() - .setBody("ABC")); + server.enqueue(new MockResponse.Builder() + .code(301) + .addHeader("Location", "/foo") + .build()); + server.enqueue(new MockResponse.Builder() + .body("ABC") + .build()); Call call = client.newCall(new Request.Builder() .url(server.url("/")) @@ -908,12 +931,14 @@ public final class EventListenerTest { } @Test public void multipleConnectionsFoundForSingleCall() throws IOException { - server.enqueue(new MockResponse() - .setResponseCode(301) + server.enqueue(new MockResponse.Builder() + .code(301) .addHeader("Location", "/foo") - .addHeader("Connection", "Close")); - server.enqueue(new MockResponse() - .setBody("ABC")); + .addHeader("Connection", "Close") + .build()); + server.enqueue(new MockResponse.Builder() + .body("ABC") + .build()); Call call = client.newCall(new Request.Builder() .url(server.url("/")) @@ -946,9 +971,10 @@ public final class EventListenerTest { private void responseBodyFail(Protocol expectedProtocol) throws IOException { // Use a 2 MiB body so the disconnect won't happen until the client has read some data. int responseBodySize = 2 * 1024 * 1024; // 2 MiB - server.enqueue(new MockResponse() - .setBody(new Buffer().write(new byte[responseBodySize])) - .setSocketPolicy(SocketPolicy.DISCONNECT_DURING_RESPONSE_BODY)); + server.enqueue(new MockResponse.Builder() + .body(new Buffer().write(new byte[responseBodySize])) + .socketPolicy(SocketPolicy.DISCONNECT_DURING_RESPONSE_BODY) + .build()); Call call = client.newCall(new Request.Builder() .url(server.url("/")) @@ -970,10 +996,11 @@ public final class EventListenerTest { } @Test public void emptyResponseBody() throws IOException { - server.enqueue(new MockResponse() - .setBody("") - .setBodyDelay(1, TimeUnit.SECONDS) - .setSocketPolicy(SocketPolicy.DISCONNECT_DURING_RESPONSE_BODY)); + server.enqueue(new MockResponse.Builder() + .body("") + .bodyDelay(1, TimeUnit.SECONDS) + .socketPolicy(SocketPolicy.DISCONNECT_DURING_RESPONSE_BODY) + .build()); Call call = client.newCall(new Request.Builder() .url(server.url("/")) @@ -989,9 +1016,10 @@ public final class EventListenerTest { } @Test public void emptyResponseBodyConnectionClose() throws IOException { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Connection", "close") - .setBody("")); + .body("") + .build()); Call call = client.newCall(new Request.Builder() .url(server.url("/")) @@ -1007,10 +1035,11 @@ public final class EventListenerTest { } @Test public void responseBodyClosedClosedWithoutReadingAllData() throws IOException { - server.enqueue(new MockResponse() - .setBody("abc") - .setBodyDelay(1, TimeUnit.SECONDS) - .setSocketPolicy(SocketPolicy.DISCONNECT_DURING_RESPONSE_BODY)); + server.enqueue(new MockResponse.Builder() + .body("abc") + .bodyDelay(1, TimeUnit.SECONDS) + .socketPolicy(SocketPolicy.DISCONNECT_DURING_RESPONSE_BODY) + .build()); Call call = client.newCall(new Request.Builder() .url(server.url("/")) @@ -1046,8 +1075,9 @@ public final class EventListenerTest { } private void requestBodyFail(@Nullable Protocol expectedProtocol) { - server.enqueue(new MockResponse() - .setSocketPolicy(SocketPolicy.DISCONNECT_DURING_REQUEST_BODY)); + server.enqueue(new MockResponse.Builder() + .socketPolicy(SocketPolicy.DISCONNECT_DURING_REQUEST_BODY) + .build()); NonCompletingRequestBody request = new NonCompletingRequestBody(); Call call = client.newCall(new Request.Builder() @@ -1127,8 +1157,9 @@ public final class EventListenerTest { } }; - server.enqueue(new MockResponse() - .setSocketPolicy(SocketPolicy.DISCONNECT_DURING_REQUEST_BODY)); + server.enqueue(new MockResponse.Builder() + .socketPolicy(SocketPolicy.DISCONNECT_DURING_REQUEST_BODY) + .build()); Call call = client.newCall(new Request.Builder() .url(server.url("/")) @@ -1188,7 +1219,9 @@ public final class EventListenerTest { } @Test public void successfulCallEventSequenceWithListener() throws IOException { - server.enqueue(new MockResponse().setBody("abc")); + server.enqueue(new MockResponse.Builder() + .body("abc") + .build()); client = client.newBuilder() .addNetworkInterceptor(new HttpLoggingInterceptor() @@ -1211,9 +1244,10 @@ public final class EventListenerTest { private void requestBodySuccess(RequestBody body, Matcher requestBodyBytes, Matcher responseHeaderLength) throws IOException { - server.enqueue(new MockResponse() - .setResponseCode(200) - .setBody("World!")); + server.enqueue(new MockResponse.Builder() + .code(200) + .body("World!") + .build()); Call call = client.newCall(new Request.Builder() .url(server.url("/")) @@ -1307,11 +1341,12 @@ public final class EventListenerTest { .build()); // Create a response with artificial delays. - server.enqueue(new MockResponse() - .setHeadersDelay(responseHeadersStartDelay, TimeUnit.MILLISECONDS) - .setBodyDelay(responseBodyStartDelay, TimeUnit.MILLISECONDS) + server.enqueue(new MockResponse.Builder() + .headersDelay(responseHeadersStartDelay, TimeUnit.MILLISECONDS) + .bodyDelay(responseBodyStartDelay, TimeUnit.MILLISECONDS) .throttleBody(5, responseBodyEndDelay, TimeUnit.MILLISECONDS) - .setBody("fghijk")); + .body("fghijk") + .build()); // Make the call. try (Response response = call.execute()) { @@ -1343,9 +1378,10 @@ public final class EventListenerTest { } @Test public void redirectUsingSameConnectionEventSequence() throws IOException { - server.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) - .addHeader("Location: /foo")); + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_MOVED_TEMP) + .addHeader("Location: /foo") + .build()); server.enqueue(new MockResponse()); Call call = client.newCall(new Request.Builder().url(server.url("/")).build()); @@ -1364,9 +1400,10 @@ public final class EventListenerTest { public void redirectUsingNewConnectionEventSequence() throws IOException { MockWebServer otherServer = new MockWebServer(); server.enqueue( - new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) - .addHeader("Location: " + otherServer.url("/foo"))); + new MockResponse.Builder() + .code(HttpURLConnection.HTTP_MOVED_TEMP) + .addHeader("Location: " + otherServer.url("/foo")) + .build()); otherServer.enqueue(new MockResponse()); Call call = client.newCall(new Request.Builder().url(server.url("/")).build()); @@ -1384,8 +1421,8 @@ public final class EventListenerTest { } @Test public void applicationInterceptorProceedsMultipleTimes() throws Exception { - server.enqueue(new MockResponse().setBody("a")); - server.enqueue(new MockResponse().setBody("b")); + server.enqueue(new MockResponse.Builder().body("a").build()); + server.enqueue(new MockResponse.Builder().body("b").build()); client = client.newBuilder() .addInterceptor(chain -> { @@ -1432,8 +1469,9 @@ public final class EventListenerTest { /** Response headers start, then the entire request body, then response headers end. */ @Test public void expectContinueStartsResponseHeadersEarly() throws Exception { - server.enqueue(new MockResponse() - .add100Continue()); + server.enqueue(new MockResponse.Builder() + .add100Continue() + .build()); Request request = new Request.Builder() .url(server.url("/")) @@ -1453,9 +1491,10 @@ public final class EventListenerTest { @Test public void timeToFirstByteGapBetweenResponseHeaderStartAndEnd() throws IOException { long responseHeadersStartDelay = 250L; - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .add100Continue() - .setHeadersDelay(responseHeadersStartDelay, TimeUnit.MILLISECONDS)); + .headersDelay(responseHeadersStartDelay, TimeUnit.MILLISECONDS) + .build()); Request request = new Request.Builder() .url(server.url("/")) @@ -1477,8 +1516,9 @@ public final class EventListenerTest { @Test public void cacheMiss() throws IOException { enableCache(); - server.enqueue(new MockResponse() - .setBody("abc")); + server.enqueue(new MockResponse.Builder() + .body("abc") + .build()); Call call = client.newCall(new Request.Builder() .url(server.url("/")) @@ -1498,11 +1538,13 @@ public final class EventListenerTest { @Test public void conditionalCache() throws IOException { enableCache(); - server.enqueue(new MockResponse() - .addHeader("ETag: v1") - .setBody("abc")); - server.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED)); + server.enqueue(new MockResponse.Builder() + .addHeader("ETag", "v1") + .body("abc") + .build()); + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_NOT_MODIFIED) + .build()); Call call = client.newCall(new Request.Builder() .url(server.url("/")) @@ -1530,13 +1572,15 @@ public final class EventListenerTest { @Test public void conditionalCacheMiss() throws IOException { enableCache(); - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("ETag: v1") - .setBody("abc")); - server.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_OK) + .body("abc") + .build()); + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_OK) .addHeader("ETag: v2") - .setBody("abd")); + .body("abd") + .build()); Call call = client.newCall(new Request.Builder() .url(server.url("/")) @@ -1578,7 +1622,10 @@ public final class EventListenerTest { @Test public void cacheHit() throws IOException { enableCache(); - server.enqueue(new MockResponse().setBody("abc").addHeader("cache-control: public, max-age=300")); + server.enqueue(new MockResponse.Builder() + .body("abc") + .addHeader("cache-control: public, max-age=300") + .build()); Call call = client.newCall(new Request.Builder() .url(server.url("/")) diff --git a/okhttp/src/jvmTest/java/okhttp3/FastFallbackTest.kt b/okhttp/src/jvmTest/java/okhttp3/FastFallbackTest.kt index c6008c7fe..e455eb458 100644 --- a/okhttp/src/jvmTest/java/okhttp3/FastFallbackTest.kt +++ b/okhttp/src/jvmTest/java/okhttp3/FastFallbackTest.kt @@ -114,12 +114,10 @@ class FastFallbackTest { localhostIpv6, ) serverIpv4.enqueue( - MockResponse() - .setBody("unexpected call to IPv4") + MockResponse(body = "unexpected call to IPv4") ) serverIpv6.enqueue( - MockResponse() - .setBody("hello from IPv6") + MockResponse(body = "hello from IPv6") ) val call = client.newCall(Request(url)) @@ -139,12 +137,10 @@ class FastFallbackTest { localhostIpv4, ) serverIpv4.enqueue( - MockResponse() - .setBody("unexpected call to IPv4") + MockResponse(body = "unexpected call to IPv4") ) serverIpv6.enqueue( - MockResponse() - .setBody("hello from IPv6") + MockResponse(body = "hello from IPv6") ) val call = client.newCall(Request(url)) @@ -160,8 +156,7 @@ class FastFallbackTest { fun reachesIpv4WhenIpv6IsDown() { serverIpv6.shutdown() serverIpv4.enqueue( - MockResponse() - .setBody("hello from IPv4") + MockResponse(body = "hello from IPv4") ) val call = client.newCall(Request(url)) @@ -178,8 +173,7 @@ class FastFallbackTest { fun reachesIpv6WhenIpv4IsDown() { serverIpv4.shutdown() serverIpv6.enqueue( - MockResponse() - .setBody("hello from IPv6") + MockResponse(body = "hello from IPv6") ) val call = client.newCall(Request(url)) @@ -216,8 +210,7 @@ class FastFallbackTest { ) serverIpv6.shutdown() serverIpv4.enqueue( - MockResponse() - .setBody("hello from IPv4") + MockResponse(body = "hello from IPv4") ) val call = client.newCall(Request(url)) @@ -237,8 +230,7 @@ class FastFallbackTest { ) serverIpv4.shutdown() serverIpv6.enqueue( - MockResponse() - .setBody("hello from IPv6") + MockResponse(body = "hello from IPv6") ) client = client.newBuilder() @@ -300,17 +292,16 @@ class FastFallbackTest { // Set up a same-connection retry. serverIpv4.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.RESET_STREAM_AT_START) - .setHttp2ErrorCode(ErrorCode.REFUSED_STREAM.httpCode) + MockResponse( + socketPolicy = SocketPolicy.RESET_STREAM_AT_START, + http2ErrorCode = ErrorCode.REFUSED_STREAM.httpCode, + ) ) serverIpv4.enqueue( - MockResponse() - .setBody("this was the 2nd request on IPv4") + MockResponse(body = "this was the 2nd request on IPv4") ) serverIpv6.enqueue( - MockResponse() - .setBody("unexpected call to IPv6") + MockResponse(body = "unexpected call to IPv6") ) // Confirm the retry succeeds on the same connection. diff --git a/okhttp/src/jvmTest/java/okhttp3/InterceptorTest.java b/okhttp/src/jvmTest/java/okhttp3/InterceptorTest.java index cc4f60ddc..c8e2acbb1 100644 --- a/okhttp/src/jvmTest/java/okhttp3/InterceptorTest.java +++ b/okhttp/src/jvmTest/java/okhttp3/InterceptorTest.java @@ -86,7 +86,9 @@ public final class InterceptorTest { } @Test public void networkInterceptorsCannotShortCircuitResponses() throws Exception { - server.enqueue(new MockResponse().setResponseCode(500)); + server.enqueue(new MockResponse.Builder() + .code(500) + .build()); Interceptor interceptor = chain -> new Response.Builder() .request(chain.request()) @@ -138,7 +140,9 @@ public final class InterceptorTest { } @Test public void networkInterceptorsCannotChangeServerAddress() throws Exception { - server.enqueue(new MockResponse().setResponseCode(500)); + server.enqueue(new MockResponse.Builder() + .code(500) + .build()); Interceptor interceptor = chain -> { Address address = chain.connection().route().address(); @@ -184,9 +188,10 @@ public final class InterceptorTest { } @Test public void networkInterceptorsObserveNetworkHeaders() throws Exception { - server.enqueue(new MockResponse() - .setBody(gzip("abcabcabc")) - .addHeader("Content-Encoding: gzip")); + server.enqueue(new MockResponse.Builder() + .body(gzip("abcabcabc")) + .addHeader("Content-Encoding: gzip") + .build()); Interceptor interceptor = chain -> { // The network request has everything: User-Agent, Host, Accept-Encoding. @@ -292,9 +297,10 @@ public final class InterceptorTest { } private void rewriteResponseFromServer(boolean network) throws Exception { - server.enqueue(new MockResponse() + server.enqueue(new MockResponse.Builder() .addHeader("Original-Header: foo") - .setBody("abc")); + .body("abc") + .build()); addInterceptor(network, chain -> { Response originalResponse = chain.proceed(chain.request()); @@ -385,8 +391,8 @@ public final class InterceptorTest { } @Test public void applicationInterceptorsCanMakeMultipleRequestsToServer() throws Exception { - server.enqueue(new MockResponse().setBody("a")); - server.enqueue(new MockResponse().setBody("b")); + server.enqueue(new MockResponse.Builder().body("a").build()); + server.enqueue(new MockResponse.Builder().body("b").build()); client = client.newBuilder() .addInterceptor(chain -> { @@ -406,8 +412,8 @@ public final class InterceptorTest { /** Make sure interceptors can interact with the OkHttp client. */ @Test public void interceptorMakesAnUnrelatedRequest() throws Exception { - server.enqueue(new MockResponse().setBody("a")); // Fetched by interceptor. - server.enqueue(new MockResponse().setBody("b")); // Fetched directly. + server.enqueue(new MockResponse.Builder().body("a").build()); // Fetched by interceptor. + server.enqueue(new MockResponse.Builder().body("b").build()); // Fetched directly. client = client.newBuilder() .addInterceptor(chain -> { @@ -432,8 +438,8 @@ public final class InterceptorTest { /** Make sure interceptors can interact with the OkHttp client asynchronously. */ @Test public void interceptorMakesAnUnrelatedAsyncRequest() throws Exception { - server.enqueue(new MockResponse().setBody("a")); // Fetched by interceptor. - server.enqueue(new MockResponse().setBody("b")); // Fetched directly. + server.enqueue(new MockResponse.Builder().body("a").build()); // Fetched by interceptor. + server.enqueue(new MockResponse.Builder().body("b").build()); // Fetched directly. client = client.newBuilder() .addInterceptor(chain -> { @@ -612,9 +618,10 @@ public final class InterceptorTest { } @Test public void networkInterceptorReturnsConnectionOnEmptyBody() throws Exception { - server.enqueue(new MockResponse() - .setSocketPolicy(SocketPolicy.DISCONNECT_AT_END) - .addHeader("Connection", "Close")); + server.enqueue(new MockResponse.Builder() + .socketPolicy(SocketPolicy.DISCONNECT_AT_END) + .addHeader("Connection", "Close") + .build()); Interceptor interceptor = chain -> { Response response = chain.proceed(chain.request()); @@ -700,9 +707,10 @@ public final class InterceptorTest { .addInterceptor(interceptor2) .build(); - server.enqueue(new MockResponse() - .setBody("abc") - .throttleBody(1, 1, TimeUnit.SECONDS)); + server.enqueue(new MockResponse.Builder() + .body("abc") + .throttleBody(1, 1, TimeUnit.SECONDS) + .build()); Request request1 = new Request.Builder() .url(server.url("/")) @@ -780,9 +788,10 @@ public final class InterceptorTest { .addInterceptor(interceptor2) .build(); - server.enqueue(new MockResponse() - .setBody("abc") - .throttleBody(1, 1, TimeUnit.SECONDS)); + server.enqueue(new MockResponse.Builder() + .body("abc") + .throttleBody(1, 1, TimeUnit.SECONDS) + .build()); byte[] data = new byte[2 * 1024 * 1024]; // 2 MiB. Request request1 = new Request.Builder() diff --git a/okhttp/src/jvmTest/java/okhttp3/JSSETest.kt b/okhttp/src/jvmTest/java/okhttp3/JSSETest.kt index 8c6a6c5da..381cd3015 100644 --- a/okhttp/src/jvmTest/java/okhttp3/JSSETest.kt +++ b/okhttp/src/jvmTest/java/okhttp3/JSSETest.kt @@ -62,7 +62,7 @@ class JSSETest { enableTls() - server.enqueue(MockResponse().setBody("abc")) + server.enqueue(MockResponse(body = "abc")) val request = Request(server.url("/")) diff --git a/okhttp/src/jvmTest/java/okhttp3/KotlinSourceModernTest.kt b/okhttp/src/jvmTest/java/okhttp3/KotlinSourceModernTest.kt index 88b6b54e0..6e020d10a 100644 --- a/okhttp/src/jvmTest/java/okhttp3/KotlinSourceModernTest.kt +++ b/okhttp/src/jvmTest/java/okhttp3/KotlinSourceModernTest.kt @@ -46,12 +46,6 @@ import javax.net.ssl.SSLSocket import javax.net.ssl.SSLSocketFactory import javax.net.ssl.X509KeyManager import javax.net.ssl.X509TrustManager -import mockwebserver3.MockResponse -import mockwebserver3.MockWebServer -import mockwebserver3.PushPromise -import mockwebserver3.QueueDispatcher -import mockwebserver3.RecordedRequest -import mockwebserver3.SocketPolicy import okhttp3.Handshake.Companion.handshake import okhttp3.Headers.Companion.headersOf import okhttp3.Headers.Companion.toHeaders @@ -68,6 +62,12 @@ import okhttp3.internal.proxy.NullProxySelector import okhttp3.internal.tls.OkHostnameVerifier import okhttp3.logging.HttpLoggingInterceptor import okhttp3.logging.LoggingEventListener +import okhttp3.mockwebserver.MockResponse +import okhttp3.mockwebserver.MockWebServer +import okhttp3.mockwebserver.PushPromise +import okhttp3.mockwebserver.QueueDispatcher +import okhttp3.mockwebserver.RecordedRequest +import okhttp3.mockwebserver.SocketPolicy import okhttp3.tls.HandshakeCertificates import okhttp3.tls.HeldCertificate import okhttp3.tls.internal.TlsUtil.localhost @@ -337,7 +337,7 @@ class KotlinSourceModernTest { @Test fun dispatcherFromMockWebServer() { - val dispatcher = object : mockwebserver3.Dispatcher() { + val dispatcher = object : okhttp3.mockwebserver.Dispatcher() { override fun dispatch(request: RecordedRequest): MockResponse = TODO() override fun peek(): MockResponse = TODO() override fun shutdown() = TODO() @@ -737,7 +737,7 @@ class KotlinSourceModernTest { mockWebServer.protocolNegotiationEnabled = false mockWebServer.protocols = listOf() val protocols: List = mockWebServer.protocols - mockWebServer.useHttps(SSLSocketFactory.getDefault() as SSLSocketFactory) + mockWebServer.useHttps(SSLSocketFactory.getDefault() as SSLSocketFactory, false) mockWebServer.noClientAuth() mockWebServer.requestClientAuth() mockWebServer.requireClientAuth() @@ -749,7 +749,7 @@ class KotlinSourceModernTest { mockWebServer.start(0) mockWebServer.start(InetAddress.getLocalHost(), 0) mockWebServer.shutdown() - var dispatcher: mockwebserver3.Dispatcher = mockWebServer.dispatcher + var dispatcher: okhttp3.mockwebserver.Dispatcher = mockWebServer.dispatcher dispatcher = mockWebServer.dispatcher mockWebServer.dispatcher = QueueDispatcher() mockWebServer.dispatcher = QueueDispatcher() @@ -909,15 +909,7 @@ class KotlinSourceModernTest { @Test fun queueDispatcher() { - var queueDispatcher: QueueDispatcher = object : QueueDispatcher() { - override fun dispatch(request: RecordedRequest): MockResponse = TODO() - override fun peek(): MockResponse = TODO() - override fun enqueueResponse(response: MockResponse) = TODO() - override fun shutdown() = TODO() - override fun setFailFast(failFast: Boolean) = TODO() - override fun setFailFast(failFastResponse: MockResponse?) = TODO() - } - queueDispatcher = QueueDispatcher() + val queueDispatcher = QueueDispatcher() var mockResponse: MockResponse = queueDispatcher.dispatch( RecordedRequest("", headersOf(), listOf(), 0L, Buffer(), 0, Socket())) mockResponse = queueDispatcher.peek() diff --git a/okhttp/src/jvmTest/java/okhttp3/OkHttpClientTest.kt b/okhttp/src/jvmTest/java/okhttp3/OkHttpClientTest.kt index cfa314f24..58c608687 100644 --- a/okhttp/src/jvmTest/java/okhttp3/OkHttpClientTest.kt +++ b/okhttp/src/jvmTest/java/okhttp3/OkHttpClientTest.kt @@ -217,7 +217,7 @@ class OkHttpClientTest { } @Test fun nullDefaultProxySelector() { - server!!.enqueue(MockResponse().setBody("abc")) + server!!.enqueue(MockResponse(body = "abc")) ProxySelector.setDefault(null) val client = clientTestRule.newClient() val request = Request(server!!.url("/")) diff --git a/okhttp/src/jvmTest/java/okhttp3/OpenJSSETest.kt b/okhttp/src/jvmTest/java/okhttp3/OpenJSSETest.kt index be477d0d0..b9f76812c 100644 --- a/okhttp/src/jvmTest/java/okhttp3/OpenJSSETest.kt +++ b/okhttp/src/jvmTest/java/okhttp3/OpenJSSETest.kt @@ -52,7 +52,7 @@ class OpenJSSETest { fun testTlsv13Works() { enableTls() - server.enqueue(MockResponse().setBody("abc")) + server.enqueue(MockResponse(body = "abc")) val request = Request(server.url("/")) diff --git a/okhttp/src/jvmTest/java/okhttp3/RouteFailureTest.kt b/okhttp/src/jvmTest/java/okhttp3/RouteFailureTest.kt index 217895437..61f880e61 100644 --- a/okhttp/src/jvmTest/java/okhttp3/RouteFailureTest.kt +++ b/okhttp/src/jvmTest/java/okhttp3/RouteFailureTest.kt @@ -52,10 +52,11 @@ class RouteFailureTest { val ipv4 = InetAddress.getByName("203.0.113.1") val ipv6 = InetAddress.getByName("2001:db8:ffff:ffff:ffff:ffff:ffff:1") - val refusedStream = MockResponse() - .setHttp2ErrorCode(ErrorCode.REFUSED_STREAM.httpCode) - .setSocketPolicy(SocketPolicy.RESET_STREAM_AT_START) - val bodyResponse = MockResponse().setBody("body") + val refusedStream = MockResponse( + socketPolicy = SocketPolicy.RESET_STREAM_AT_START, + http2ErrorCode = ErrorCode.REFUSED_STREAM.httpCode, + ) + val bodyResponse = MockResponse(body = "body") @BeforeEach fun setUp( diff --git a/okhttp/src/jvmTest/java/okhttp3/ServerTruncatesRequestTest.kt b/okhttp/src/jvmTest/java/okhttp3/ServerTruncatesRequestTest.kt index 76a39072d..4a38f604d 100644 --- a/okhttp/src/jvmTest/java/okhttp3/ServerTruncatesRequestTest.kt +++ b/okhttp/src/jvmTest/java/okhttp3/ServerTruncatesRequestTest.kt @@ -32,22 +32,26 @@ import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Tag import org.junit.jupiter.api.Test import org.junit.jupiter.api.Timeout -import org.junit.jupiter.api.extension.RegisterExtension import org.junit.jupiter.api.assertThrows +import org.junit.jupiter.api.extension.RegisterExtension import org.junit.jupiter.api.fail @Timeout(30) @Tag("Slowish") class ServerTruncatesRequestTest { - @RegisterExtension @JvmField val platform = PlatformRule() - @RegisterExtension @JvmField var clientTestRule = OkHttpClientTestRule() + @RegisterExtension + @JvmField + val platform = PlatformRule() + @RegisterExtension + @JvmField + var clientTestRule = OkHttpClientTestRule() private val listener = RecordingEventListener() private val handshakeCertificates = localhost() private var client = clientTestRule.newClientBuilder() - .eventListenerFactory(clientTestRule.wrap(listener)) - .build() + .eventListenerFactory(clientTestRule.wrap(listener)) + .build() private lateinit var server: MockWebServer @@ -59,20 +63,25 @@ class ServerTruncatesRequestTest { platform.assumeNotBouncyCastle() } - @Test fun serverTruncatesRequestOnLongPostHttp1() { + @Test + fun serverTruncatesRequestOnLongPostHttp1() { serverTruncatesRequestOnLongPost(https = false) } - @Test fun serverTruncatesRequestOnLongPostHttp2() { + @Test + fun serverTruncatesRequestOnLongPostHttp2() { enableProtocol(Protocol.HTTP_2) serverTruncatesRequestOnLongPost(https = true) } private fun serverTruncatesRequestOnLongPost(https: Boolean) { - server.enqueue(MockResponse() - .setSocketPolicy(SocketPolicy.DO_NOT_READ_REQUEST_BODY) - .setBody("abc") - .apply { this.http2ErrorCode = ErrorCode.NO_ERROR.httpCode }) + server.enqueue( + MockResponse( + body = "abc", + socketPolicy = SocketPolicy.DO_NOT_READ_REQUEST_BODY, + http2ErrorCode = ErrorCode.NO_ERROR.httpCode, + ) + ) val call = client.newCall( Request( @@ -120,13 +129,17 @@ class ServerTruncatesRequestTest { * If the server returns a full response, it doesn't really matter if the HTTP/2 stream is reset. * Attempts to write the request body fails fast. */ - @Test fun serverTruncatesRequestHttp2OnDuplexRequest() { + @Test + fun serverTruncatesRequestHttp2OnDuplexRequest() { enableProtocol(Protocol.HTTP_2) - server.enqueue(MockResponse() - .setSocketPolicy(SocketPolicy.DO_NOT_READ_REQUEST_BODY) - .setBody("abc") - .apply { this.http2ErrorCode = ErrorCode.NO_ERROR.httpCode }) + server.enqueue( + MockResponse( + body = "abc", + socketPolicy = SocketPolicy.DO_NOT_READ_REQUEST_BODY, + http2ErrorCode = ErrorCode.NO_ERROR.httpCode, + ) + ) val requestBody = AsyncRequestBody() @@ -156,31 +169,31 @@ class ServerTruncatesRequestTest { makeSimpleCall() } - @Test fun serverTruncatesRequestButTrailersCanStillBeReadHttp1() { + @Test + fun serverTruncatesRequestButTrailersCanStillBeReadHttp1() { serverTruncatesRequestButTrailersCanStillBeRead(http2 = false) } - @Test fun serverTruncatesRequestButTrailersCanStillBeReadHttp2() { + @Test + fun serverTruncatesRequestButTrailersCanStillBeReadHttp2() { enableProtocol(Protocol.HTTP_2) serverTruncatesRequestButTrailersCanStillBeRead(http2 = true) } private fun serverTruncatesRequestButTrailersCanStillBeRead(http2: Boolean) { - val mockResponse = MockResponse() - .setSocketPolicy(SocketPolicy.DO_NOT_READ_REQUEST_BODY) - .apply { - this.trailers = headersOf("caboose", "xyz") - this.http2ErrorCode = ErrorCode.NO_ERROR.httpCode - } + val mockResponse = MockResponse.Builder() + .socketPolicy(SocketPolicy.DO_NOT_READ_REQUEST_BODY) + .trailers(headersOf("caboose", "xyz")) + .http2ErrorCode(ErrorCode.NO_ERROR.httpCode) // Trailers always work for HTTP/2, but only for chunked bodies in HTTP/1. if (http2) { - mockResponse.setBody("abc") + mockResponse.body("abc") } else { - mockResponse.setChunkedBody("abc", 1) + mockResponse.chunkedBody("abc", 1) } - server.enqueue(mockResponse) + server.enqueue(mockResponse.build()) val call = client.newCall( Request( @@ -196,11 +209,12 @@ class ServerTruncatesRequestTest { } @Disabled("Follow up with fix in https://github.com/square/okhttp/issues/6853") - @Test fun serverDisconnectsBeforeSecondRequestHttp1() { + @Test + fun serverDisconnectsBeforeSecondRequestHttp1() { enableProtocol(Protocol.HTTP_1_1) - server.enqueue(MockResponse().setResponseCode(200).setBody("Req1")) - server.enqueue(MockResponse().setResponseCode(200).setBody("Req2")) + server.enqueue(MockResponse(code = 200, body = "Req1")) + server.enqueue(MockResponse(code = 200, body = "Req2")) val eventListener = object : EventListener() { var socket: SSLSocket? = null @@ -235,8 +249,9 @@ class ServerTruncatesRequestTest { } } - @Test fun noAttemptToReadResponseIfLoadingRequestBodyIsSourceOfFailure() { - server.enqueue(MockResponse().setBody("abc")) + @Test + fun noAttemptToReadResponseIfLoadingRequestBodyIsSourceOfFailure() { + server.enqueue(MockResponse(body = "abc")) val requestBody = object : RequestBody() { override fun contentType(): MediaType? = null @@ -271,7 +286,7 @@ class ServerTruncatesRequestTest { } private fun makeSimpleCall() { - server.enqueue(MockResponse().setBody("healthy")) + server.enqueue(MockResponse(body = "healthy")) val callB = client.newCall(Request(server.url("/"))) callB.execute().use { response -> assertThat(response.body.string()).isEqualTo("healthy") @@ -281,19 +296,19 @@ class ServerTruncatesRequestTest { private fun enableProtocol(protocol: Protocol) { enableTls() client = client.newBuilder() - .protocols(listOf(protocol, Protocol.HTTP_1_1)) - .build() + .protocols(listOf(protocol, Protocol.HTTP_1_1)) + .build() server.protocols = client.protocols } private fun enableTls() { client = client.newBuilder() - .sslSocketFactory( - handshakeCertificates.sslSocketFactory(), - handshakeCertificates.trustManager - ) - .hostnameVerifier(RecordingHostnameVerifier()) - .build() + .sslSocketFactory( + handshakeCertificates.sslSocketFactory(), + handshakeCertificates.trustManager + ) + .hostnameVerifier(RecordingHostnameVerifier()) + .build() server.useHttps(handshakeCertificates.sslSocketFactory()) } diff --git a/okhttp/src/jvmTest/java/okhttp3/SessionReuseTest.kt b/okhttp/src/jvmTest/java/okhttp3/SessionReuseTest.kt index 986f77559..fdeca595d 100644 --- a/okhttp/src/jvmTest/java/okhttp3/SessionReuseTest.kt +++ b/okhttp/src/jvmTest/java/okhttp3/SessionReuseTest.kt @@ -99,8 +99,8 @@ class SessionReuseTest { .sslSocketFactory(sslSocketFactory, handshakeCertificates.trustManager) .build() - server.enqueue(MockResponse().setBody("abc1")) - server.enqueue(MockResponse().setBody("abc2")) + server.enqueue(MockResponse(body = "abc1")) + server.enqueue(MockResponse(body = "abc2")) val request = Request(server.url("/")) diff --git a/okhttp/src/jvmTest/java/okhttp3/SocketChannelTest.kt b/okhttp/src/jvmTest/java/okhttp3/SocketChannelTest.kt index ecdff2983..b80ce5adc 100644 --- a/okhttp/src/jvmTest/java/okhttp3/SocketChannelTest.kt +++ b/okhttp/src/jvmTest/java/okhttp3/SocketChannelTest.kt @@ -151,7 +151,7 @@ class SocketChannelTest { } .build() - server.enqueue(MockResponse().setBody("abc")) + server.enqueue(MockResponse(body = "abc")) @Suppress("HttpUrlsUsage") val url = if (socketMode is TlsInstance) diff --git a/okhttp/src/jvmTest/java/okhttp3/SocksProxyTest.java b/okhttp/src/jvmTest/java/okhttp3/SocksProxyTest.java index 03ba1c764..ff99fb55d 100644 --- a/okhttp/src/jvmTest/java/okhttp3/SocksProxyTest.java +++ b/okhttp/src/jvmTest/java/okhttp3/SocksProxyTest.java @@ -49,8 +49,8 @@ public final class SocksProxyTest { } @Test public void proxy() throws Exception { - server.enqueue(new MockResponse().setBody("abc")); - server.enqueue(new MockResponse().setBody("def")); + server.enqueue(new MockResponse.Builder().body("abc").build()); + server.enqueue(new MockResponse.Builder().body("def").build()); OkHttpClient client = clientTestRule.newClientBuilder() .proxy(socksProxy.proxy()) @@ -69,7 +69,7 @@ public final class SocksProxyTest { } @Test public void proxySelector() throws Exception { - server.enqueue(new MockResponse().setBody("abc")); + server.enqueue(new MockResponse.Builder().body("abc").build()); ProxySelector proxySelector = new ProxySelector() { @Override public List select(URI uri) { @@ -94,7 +94,7 @@ public final class SocksProxyTest { @Test public void checkRemoteDNSResolve() throws Exception { // This testcase will fail if the target is resolved locally instead of through the proxy. - server.enqueue(new MockResponse().setBody("abc")); + server.enqueue(new MockResponse.Builder().body("abc").build()); OkHttpClient client = clientTestRule.newClientBuilder() .proxy(socksProxy.proxy()) diff --git a/okhttp/src/jvmTest/java/okhttp3/URLConnectionTest.kt b/okhttp/src/jvmTest/java/okhttp3/URLConnectionTest.kt index cbbb2c1ae..5695d139b 100644 --- a/okhttp/src/jvmTest/java/okhttp3/URLConnectionTest.kt +++ b/okhttp/src/jvmTest/java/okhttp3/URLConnectionTest.kt @@ -56,6 +56,7 @@ import mockwebserver3.MockWebServer import mockwebserver3.SocketPolicy import mockwebserver3.junit5.internal.MockWebServerInstance import okhttp3.Credentials.basic +import okhttp3.Headers.Companion.headersOf import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.MediaType.Companion.toMediaType @@ -67,6 +68,7 @@ import okhttp3.internal.addHeaderLenient import okhttp3.internal.http.HTTP_PERM_REDIRECT import okhttp3.internal.http.HTTP_TEMP_REDIRECT import okhttp3.internal.platform.Platform.Companion.get +import okhttp3.internal.toHexString import okhttp3.internal.userAgent import okhttp3.testing.Flaky import okhttp3.testing.PlatformRule @@ -161,12 +163,13 @@ class URLConnectionTest { @Test fun responseHeaders() { server.enqueue( - MockResponse() - .setStatus("HTTP/1.0 200 Fantastic") + MockResponse.Builder() + .status("HTTP/1.0 200 Fantastic") .addHeader("A: c") .addHeader("B: d") .addHeader("A: e") - .setChunkedBody("ABCDE\nFGHIJ\nKLMNO\nPQR", 8) + .chunkedBody("ABCDE\nFGHIJ\nKLMNO\nPQR", 8) + .build() ) val request = newRequest("/") val response = getResponse(request) @@ -186,7 +189,9 @@ class URLConnectionTest { @Test fun serverSendsInvalidStatusLine() { - server.enqueue(MockResponse().setStatus("HTP/1.1 200 OK")) + server.enqueue(MockResponse.Builder() + .status("HTP/1.1 200 OK") + .build()) val request = newRequest("/") try { getResponse(request) @@ -197,7 +202,9 @@ class URLConnectionTest { @Test fun serverSendsInvalidCodeTooLarge() { - server.enqueue(MockResponse().setStatus("HTTP/1.1 2147483648 OK")) + server.enqueue(MockResponse.Builder() + .status("HTTP/1.1 2147483648 OK") + .build()) val request = newRequest("/") try { getResponse(request) @@ -208,7 +215,9 @@ class URLConnectionTest { @Test fun serverSendsInvalidCodeNotANumber() { - server.enqueue(MockResponse().setStatus("HTTP/1.1 00a OK")) + server.enqueue(MockResponse.Builder() + .status("HTTP/1.1 00a OK") + .build()) val request = newRequest("/") try { getResponse(request) @@ -219,7 +228,9 @@ class URLConnectionTest { @Test fun serverSendsUnnecessaryWhitespace() { - server.enqueue(MockResponse().setStatus(" HTTP/1.1 2147483648 OK")) + server.enqueue(MockResponse.Builder() + .status(" HTTP/1.1 2147483648 OK") + .build()) val request = newRequest("/") try { getResponse(request) @@ -250,10 +261,7 @@ class URLConnectionTest { } private fun testRequestBodySurvivesRetries(transferKind: TransferKind) { - server.enqueue( - MockResponse() - .setBody("abc") - ) + server.enqueue(MockResponse(body = "abc")) // Use a misconfigured proxy to guarantee that the request is retried. client = client.newBuilder() @@ -278,8 +286,9 @@ class URLConnectionTest { // http://code.google.com/p/android/issues/detail?id=2939 @Test fun bug2939() { - val response = MockResponse() - .setChunkedBody("ABCDE\nFGHIJ\nKLMNO\nPQR", 8) + val response = MockResponse.Builder() + .chunkedBody("ABCDE\nFGHIJ\nKLMNO\nPQR", 8) + .build() server.enqueue(response) server.enqueue(response) val request = newRequest("/") @@ -293,8 +302,9 @@ class URLConnectionTest { @Test fun connectionsArePooled() { - val response = MockResponse() - .setBody("ABCDEFGHIJKLMNOPQR") + val response = MockResponse( + body = "ABCDEFGHIJKLMNOPQR", + ) server.enqueue(response) server.enqueue(response) server.enqueue(response) @@ -308,8 +318,9 @@ class URLConnectionTest { @Test fun chunkedConnectionsArePooled() { - val response = MockResponse() - .setChunkedBody("ABCDEFGHIJKLMNOPQR", 5) + val response = MockResponse.Builder() + .chunkedBody("ABCDEFGHIJKLMNOPQR", 5) + .build() server.enqueue(response) server.enqueue(response) server.enqueue(response) @@ -355,12 +366,12 @@ class URLConnectionTest { private fun testServerClosesOutput(socketPolicy: SocketPolicy) { server.enqueue( - MockResponse() - .setBody("This connection won't pool properly") - .setSocketPolicy(socketPolicy) + MockResponse( + body = "This connection won't pool properly", + socketPolicy = socketPolicy, + ) ) - val responseAfter = MockResponse() - .setBody("This comes after a busted connection") + val responseAfter = MockResponse(body = "This comes after a busted connection") server.enqueue(responseAfter) server.enqueue(responseAfter) // Enqueue 2x because the broken connection may be reused. val response1 = getResponse(newRequest("/a")) @@ -471,10 +482,7 @@ class URLConnectionTest { @Test fun connectViaHttps() { server.useHttps(handshakeCertificates.sslSocketFactory()) - server.enqueue( - MockResponse() - .setBody("this response comes via HTTPS") - ) + server.enqueue(MockResponse(body = "this response comes via HTTPS")) client = client.newBuilder() .sslSocketFactory( handshakeCertificates.sslSocketFactory(), handshakeCertificates.trustManager @@ -499,14 +507,8 @@ class URLConnectionTest { private fun connectViaHttpsReusingConnections(rebuildClient: Boolean) { server.useHttps(handshakeCertificates.sslSocketFactory()) - server.enqueue( - MockResponse() - .setBody("this response comes via HTTPS") - ) - server.enqueue( - MockResponse() - .setBody("another response via HTTPS") - ) + server.enqueue(MockResponse(body = "this response comes via HTTPS")) + server.enqueue(MockResponse(body = "another response via HTTPS")) // The pool will only reuse sockets if the SSL socket factories are the same. val clientSocketFactory = handshakeCertificates.sslSocketFactory() @@ -540,14 +542,8 @@ class URLConnectionTest { @Test fun connectViaHttpsReusingConnectionsDifferentFactories() { server.useHttps(handshakeCertificates.sslSocketFactory()) - server.enqueue( - MockResponse() - .setBody("this response comes via HTTPS") - ) - server.enqueue( - MockResponse() - .setBody("another response via HTTPS") - ) + server.enqueue(MockResponse(body = "this response comes via HTTPS")) + server.enqueue(MockResponse(body = "another response via HTTPS")) // install a custom SSL socket factory so the server can be authorized client = client.newBuilder() @@ -583,14 +579,8 @@ class URLConnectionTest { @Test fun connectViaHttpsWithSSLFallback() { server.useHttps(handshakeCertificates.sslSocketFactory()) - server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.FAIL_HANDSHAKE) - ) - server.enqueue( - MockResponse() - .setBody("this response comes via SSL") - ) + server.enqueue(MockResponse(socketPolicy = SocketPolicy.FAIL_HANDSHAKE)) + server.enqueue(MockResponse(body = "this response comes via SSL")) client = client.newBuilder() .hostnameVerifier( RecordingHostnameVerifier() @@ -612,14 +602,8 @@ class URLConnectionTest { @Test fun connectViaHttpsWithSSLFallbackFailuresRecorded() { server.useHttps(handshakeCertificates.sslSocketFactory()) - server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.FAIL_HANDSHAKE) - ) - server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.FAIL_HANDSHAKE) - ) + server.enqueue(MockResponse(socketPolicy = SocketPolicy.FAIL_HANDSHAKE)) + server.enqueue(MockResponse(socketPolicy = SocketPolicy.FAIL_HANDSHAKE)) client = client.newBuilder() .connectionSpecs(Arrays.asList(ConnectionSpec.MODERN_TLS, ConnectionSpec.COMPATIBLE_TLS)) .hostnameVerifier(RecordingHostnameVerifier()) @@ -648,14 +632,12 @@ class URLConnectionTest { fun sslFallbackNotUsedWhenRecycledConnectionFails() { server.useHttps(handshakeCertificates.sslSocketFactory()) server.enqueue( - MockResponse() - .setBody("abc") - .setSocketPolicy(SocketPolicy.DISCONNECT_AT_END) - ) - server.enqueue( - MockResponse() - .setBody("def") + MockResponse( + body = "abc", + socketPolicy = SocketPolicy.DISCONNECT_AT_END, + ) ) + server.enqueue(MockResponse(body = "def")) client = client.newBuilder() .hostnameVerifier(RecordingHostnameVerifier()) .sslSocketFactory( @@ -718,9 +700,9 @@ class URLConnectionTest { } private fun testConnectViaProxy(proxyConfig: ProxyConfig) { - val mockResponse = MockResponse() - .setBody("this response comes via a proxy") - server.enqueue(mockResponse) + server.enqueue( + MockResponse(body = "this response comes via a proxy") + ) val url = "http://android.com/foo".toHttpUrl() val response = proxyConfig.connect(server, client, url).execute() assertContent("this response comes via a proxy", response) @@ -734,10 +716,11 @@ class URLConnectionTest { @Test fun contentDisagreesWithContentLengthHeaderBodyTooLong() { server.enqueue( - MockResponse() - .setBody("abc\r\nYOU SHOULD NOT SEE THIS") + MockResponse.Builder() + .body("abc\r\nYOU SHOULD NOT SEE THIS") .clearHeaders() .addHeader("Content-Length: 3") + .build() ) assertContent("abc", getResponse(newRequest("/"))) } @@ -745,11 +728,11 @@ class URLConnectionTest { @Test fun contentDisagreesWithContentLengthHeaderBodyTooShort() { server.enqueue( - MockResponse() - .setBody("abc") + MockResponse.Builder() + .body("abc") .setHeader("Content-Length", "5") - .setSocketPolicy(SocketPolicy.DISCONNECT_AT_END) - ) + .socketPolicy(SocketPolicy.DISCONNECT_AT_END) + .build()) try { val response = getResponse(newRequest("/")) response.body.source().readUtf8(5) @@ -791,10 +774,7 @@ class URLConnectionTest { .hostnameVerifier(RecordingHostnameVerifier()) .build() } - server.enqueue( - MockResponse() - .setStatus("HTTP/1.1 200 OK") - ) + server.enqueue(MockResponse()) client = client.newBuilder() .socketFactory(uselessSocketFactory) .build() @@ -822,29 +802,29 @@ class URLConnectionTest { @Test fun contentDisagreesWithChunkedHeaderBodyTooLong() { - val mockResponse = MockResponse() - .setChunkedBody("abc", 3) - val buffer = mockResponse.getBody() - buffer!!.writeUtf8("\r\nYOU SHOULD NOT SEE THIS") - mockResponse.setBody(buffer) - mockResponse.clearHeaders() - mockResponse.addHeader("Transfer-encoding: chunked") - server.enqueue(mockResponse) + val builder = MockResponse.Builder() + .chunkedBody("abc", 3) + val buffer = builder.build().body!! + buffer.writeUtf8("\r\nYOU SHOULD NOT SEE THIS") + builder.body(buffer) + builder.clearHeaders() + builder.addHeader("Transfer-encoding: chunked") + server.enqueue(builder.build()) assertContent("abc", getResponse(newRequest("/"))) } @Test fun contentDisagreesWithChunkedHeaderBodyTooShort() { - val mockResponse = MockResponse() - .setChunkedBody("abcdefg", 5) + val builder = MockResponse.Builder() + .chunkedBody("abcdefg", 5) val truncatedBody = Buffer() - val fullBody = mockResponse.getBody() - truncatedBody.write(fullBody!!, 4) - mockResponse.setBody(truncatedBody) - mockResponse.clearHeaders() - mockResponse.addHeader("Transfer-encoding: chunked") - mockResponse.setSocketPolicy(SocketPolicy.DISCONNECT_AT_END) - server.enqueue(mockResponse) + val fullBody = builder.build().body!! + truncatedBody.write(fullBody, 4) + builder.body(truncatedBody) + builder.clearHeaders() + builder.addHeader("Transfer-encoding: chunked") + builder.socketPolicy(SocketPolicy.DISCONNECT_AT_END) + server.enqueue(builder.build()) try { val response = getResponse(newRequest("/")) response.body.source().readUtf8(7) @@ -867,8 +847,7 @@ class URLConnectionTest { private fun testConnectViaDirectProxyToHttps(proxyConfig: ProxyConfig) { server.useHttps(handshakeCertificates.sslSocketFactory()) server.enqueue( - MockResponse() - .setBody("this response comes via HTTPS") + MockResponse(body = "this response comes via HTTPS") ) val url = server.url("/foo") client = client.newBuilder() @@ -909,14 +888,8 @@ class URLConnectionTest { private fun testConnectViaHttpProxyToHttps(proxyConfig: ProxyConfig) { val hostnameVerifier = RecordingHostnameVerifier() server.useHttps(handshakeCertificates.sslSocketFactory()) - server.enqueue( - MockResponse() - .inTunnel() - ) - server.enqueue( - MockResponse() - .setBody("this response comes via a secure proxy") - ) + server.enqueue(MockResponse(inTunnel = true)) + server.enqueue(MockResponse(body = "this response comes via a secure proxy")) val url = "https://android.com/foo".toHttpUrl() client = client.newBuilder() .sslSocketFactory( @@ -946,14 +919,12 @@ class URLConnectionTest { server.useHttps(handshakeCertificates.sslSocketFactory()) // The inclusion of a body in the response to a CONNECT is key to reproducing b/6754912. server.enqueue( - MockResponse() - .inTunnel() - .setBody("bogus proxy connect response content") - ) - server.enqueue( - MockResponse() - .setBody("response") + MockResponse( + body = "bogus proxy connect response content", + inTunnel = true, + ) ) + server.enqueue(MockResponse(body = "response")) // Configure a single IP address for the host and a single configuration, so we only need one // failure to fail permanently. @@ -990,14 +961,8 @@ class URLConnectionTest { fun proxyConnectIncludesProxyHeadersOnly() { val hostnameVerifier = RecordingHostnameVerifier() server.useHttps(handshakeCertificates.sslSocketFactory()) - server.enqueue( - MockResponse() - .inTunnel() - ) - server.enqueue( - MockResponse() - .setBody("encrypted response from the origin server") - ) + server.enqueue(MockResponse(inTunnel = true)) + server.enqueue(MockResponse(body = "encrypted response from the origin server")) client = client.newBuilder() .proxy(server.toProxyAddress()) .sslSocketFactory( @@ -1030,19 +995,14 @@ class URLConnectionTest { java.net.Authenticator.setDefault(RecordingAuthenticator()) server.useHttps(handshakeCertificates.sslSocketFactory()) server.enqueue( - MockResponse() - .inTunnel() - .setResponseCode(407) - .addHeader("Proxy-Authenticate: Basic realm=\"localhost\"") - ) - server.enqueue( - MockResponse() - .inTunnel() - ) - server.enqueue( - MockResponse() - .setBody("A") + MockResponse( + code = 407, + headers = headersOf("Proxy-Authenticate", "Basic realm=\"localhost\""), + inTunnel = true, + ) ) + server.enqueue(MockResponse(inTunnel = true)) + server.enqueue(MockResponse(body = "A")) client = client.newBuilder() .proxyAuthenticator(Authenticator.JAVA_NET_AUTHENTICATOR) .proxy(server.toProxyAddress()) @@ -1074,14 +1034,8 @@ class URLConnectionTest { @Test fun proxyWithConnectionClose() { server.useHttps(handshakeCertificates.sslSocketFactory()) - server.enqueue( - MockResponse() - .inTunnel() - ) - server.enqueue( - MockResponse() - .setBody("this response comes via a proxy") - ) + server.enqueue(MockResponse(inTunnel = true)) + server.enqueue(MockResponse(body = "this response comes via a proxy")) client = client.newBuilder() .proxy(server.toProxyAddress()) .sslSocketFactory( @@ -1103,18 +1057,9 @@ class URLConnectionTest { val socketFactory = handshakeCertificates.sslSocketFactory() val hostnameVerifier = RecordingHostnameVerifier() server.useHttps(socketFactory) - server.enqueue( - MockResponse() - .inTunnel() - ) - server.enqueue( - MockResponse() - .setBody("response 1") - ) - server.enqueue( - MockResponse() - .setBody("response 2") - ) + server.enqueue(MockResponse(inTunnel = true)) + server.enqueue(MockResponse(body = "response 1")) + server.enqueue(MockResponse(body = "response 2")) client = client.newBuilder() .proxy(server.toProxyAddress()) .sslSocketFactory(socketFactory, handshakeCertificates.trustManager) @@ -1127,12 +1072,10 @@ class URLConnectionTest { @Test fun proxySelectorHttpWithConnectionReuse() { server.enqueue( - MockResponse() - .setBody("response 1") + MockResponse(body = "response 1") ) server.enqueue( - MockResponse() - .setResponseCode(407) + MockResponse(code = 407) ) client = client.newBuilder() .proxySelector(object : ProxySelector() { @@ -1148,9 +1091,10 @@ class URLConnectionTest { @Test fun disconnectedConnection() { server.enqueue( - MockResponse() + MockResponse.Builder() .throttleBody(2, 100, TimeUnit.MILLISECONDS) - .setBody("ABCD") + .body("ABCD") + .build() ) val call = client.newCall(newRequest("/")) val response = call.execute() @@ -1196,8 +1140,7 @@ class URLConnectionTest { @Test fun disconnectBeforeConnect() { server.enqueue( - MockResponse() - .setBody("A") + MockResponse(body = "A") ) val call = client.newCall(newRequest("/")) call.cancel() @@ -1247,10 +1190,10 @@ class URLConnectionTest { } private fun testMarkAndReset(transferKind: TransferKind) { - val response = MockResponse() - transferKind.setBody(response, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", 1024) - server.enqueue(response) - server.enqueue(response) + val builder = MockResponse.Builder() + transferKind.setBody(builder, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", 1024) + server.enqueue(builder.build()) + server.enqueue(builder.build()) val inputStream = getResponse(newRequest("/")).body.byteStream() assertThat(inputStream.markSupported()) .overridingErrorMessage("This implementation claims to support mark().") @@ -1275,10 +1218,11 @@ class URLConnectionTest { */ @Test fun unauthorizedResponseHandling() { - val mockResponse = MockResponse() - .addHeader("WWW-Authenticate: challenge") - .setResponseCode(HttpURLConnection.HTTP_UNAUTHORIZED) - .setBody("Unauthorized") + val mockResponse = MockResponse( + code = HttpURLConnection.HTTP_UNAUTHORIZED, + headers = headersOf("WWW-Authenticate", "challenge"), + body = "Unauthorized", + ) server.enqueue(mockResponse) server.enqueue(mockResponse) server.enqueue(mockResponse) @@ -1293,10 +1237,11 @@ class URLConnectionTest { @Test fun nonHexChunkSize() { server.enqueue( - MockResponse() - .setBody("5\r\nABCDE\r\nG\r\nFGHIJKLMNOPQRSTU\r\n0\r\n\r\n") + MockResponse.Builder() + .body("5\r\nABCDE\r\nG\r\nFGHIJKLMNOPQRSTU\r\n0\r\n\r\n") .clearHeaders() .addHeader("Transfer-encoding: chunked") + .build() ) try { getResponse(newRequest("/")).use { response -> @@ -1310,10 +1255,11 @@ class URLConnectionTest { @Test fun malformedChunkSize() { server.enqueue( - MockResponse() - .setBody("5:x\r\nABCDE\r\n0\r\n\r\n") + MockResponse.Builder() + .body("5:x\r\nABCDE\r\n0\r\n\r\n") .clearHeaders() .addHeader("Transfer-encoding: chunked") + .build() ) try { getResponse(newRequest("/")).use { response -> @@ -1327,10 +1273,11 @@ class URLConnectionTest { @Test fun extensionAfterChunkSize() { server.enqueue( - MockResponse() - .setBody("5;x\r\nABCDE\r\n0\r\n\r\n") + MockResponse.Builder() + .body("5;x\r\nABCDE\r\n0\r\n\r\n") .clearHeaders() .addHeader("Transfer-encoding: chunked") + .build() ) getResponse(newRequest("/")).use { response -> assertContent("ABCDE", response) } } @@ -1338,11 +1285,12 @@ class URLConnectionTest { @Test fun missingChunkBody() { server.enqueue( - MockResponse() - .setBody("5") + MockResponse.Builder() + .body("5") .clearHeaders() .addHeader("Transfer-encoding: chunked") - .setSocketPolicy(SocketPolicy.DISCONNECT_AT_END) + .socketPolicy(SocketPolicy.DISCONNECT_AT_END) + .build() ) try { getResponse(newRequest("/")).use { response -> @@ -1360,9 +1308,10 @@ class URLConnectionTest { @Test fun gzipEncodingEnabledByDefault() { server.enqueue( - MockResponse() - .setBody(gzip("ABCABCABC")) + MockResponse.Builder() + .body(gzip("ABCABCABC")) .addHeader("Content-Encoding: gzip") + .build() ) val response = getResponse(newRequest("/")) assertThat(readAscii(response.body.byteStream(), Int.MAX_VALUE)).isEqualTo( @@ -1378,9 +1327,10 @@ class URLConnectionTest { fun clientConfiguredGzipContentEncoding() { val bodyBytes = gzip("ABCDEFGHIJKLMNOPQRSTUVWXYZ") server.enqueue( - MockResponse() - .setBody(bodyBytes) + MockResponse.Builder() + .body(bodyBytes) .addHeader("Content-Encoding: gzip") + .build() ) val response = getResponse( Request.Builder() @@ -1418,9 +1368,10 @@ class URLConnectionTest { @Test fun clientConfiguredCustomContentEncoding() { server.enqueue( - MockResponse() - .setBody("ABCDE") - .addHeader("Content-Encoding: custom") + MockResponse( + headers = headersOf("Content-Encoding", "custom"), + body = "ABCDE", + ) ) val response = getResponse( Request.Builder() @@ -1451,13 +1402,13 @@ class URLConnectionTest { .hostnameVerifier(hostnameVerifier) .build() } - val responseOne = MockResponse() + val responseOne = MockResponse.Builder() .addHeader("Content-Encoding: gzip") transferKind.setBody(responseOne, gzip("one (gzipped)"), 5) - server.enqueue(responseOne) - val responseTwo = MockResponse() + server.enqueue(responseOne.build()) + val responseTwo = MockResponse.Builder() transferKind.setBody(responseTwo, "two (identity)", 5) - server.enqueue(responseTwo) + server.enqueue(responseTwo.build()) val response1 = getResponse( Request.Builder() .header("Accept-Encoding", "gzip") @@ -1479,14 +1430,16 @@ class URLConnectionTest { @Test fun transparentGzipWorksAfterExceptionRecovery() { server.enqueue( - MockResponse() - .setBody("a") - .setSocketPolicy(SocketPolicy.SHUTDOWN_INPUT_AT_END) + MockResponse( + body = "a", + socketPolicy = SocketPolicy.SHUTDOWN_INPUT_AT_END, + ) ) server.enqueue( - MockResponse() + MockResponse.Builder() .addHeader("Content-Encoding: gzip") - .setBody(gzip("b")) + .body(gzip("b")) + .build() ) // Seed the pool with a bad connection. @@ -1506,10 +1459,11 @@ class URLConnectionTest { fun endOfStreamResponseIsNotPooled() { client.connectionPool.evictAll() server.enqueue( - MockResponse() - .setBody("{}") + MockResponse.Builder() + .body("{}") .clearHeaders() - .setSocketPolicy(SocketPolicy.DISCONNECT_AT_END) + .socketPolicy(SocketPolicy.DISCONNECT_AT_END) + .build() ) val response = getResponse(newRequest("/")) assertContent("{}", response) @@ -1527,12 +1481,12 @@ class URLConnectionTest { } private fun testEarlyDisconnectDoesntHarmPooling(transferKind: TransferKind) { - val mockResponse1 = MockResponse() + val mockResponse1 = MockResponse.Builder() transferKind.setBody(mockResponse1, "ABCDEFGHIJK", 1024) - server.enqueue(mockResponse1) - val mockResponse2 = MockResponse() + server.enqueue(mockResponse1.build()) + val mockResponse2 = MockResponse.Builder() transferKind.setBody(mockResponse2, "LMNOPQRSTUV", 1024) - server.enqueue(mockResponse2) + server.enqueue(mockResponse2.build()) val call1 = client.newCall(newRequest("/")) val response1 = call1.execute() val in1 = response1.body.byteStream() @@ -1554,13 +1508,12 @@ class URLConnectionTest { fun streamDiscardingIsTimely() { // This response takes at least a full second to serve: 10,000 bytes served 100 bytes at a time. server.enqueue( - MockResponse() - .setBody(Buffer().write(ByteArray(10000))) + MockResponse.Builder() + .body(Buffer().write(ByteArray(10000))) .throttleBody(100, 10, TimeUnit.MILLISECONDS) - ) + .build()) server.enqueue( - MockResponse() - .setBody("A") + MockResponse(body = "A") ) val startNanos = System.nanoTime() val connection1 = getResponse(newRequest("/")) @@ -1610,14 +1563,14 @@ class URLConnectionTest { private fun testAuthenticateWithStreamingPost(streamingMode: TransferKind) { server.enqueue( - MockResponse() - .setResponseCode(401) - .addHeader("WWW-Authenticate: Basic realm=\"protected area\"") - .setBody("Please authenticate.") + MockResponse( + code = 401, + headers = headersOf("WWW-Authenticate", "Basic realm=\"protected area\""), + body = "Please authenticate.", + ) ) server.enqueue( - MockResponse() - .setBody("Authenticated!") + MockResponse(body = "Authenticated!") ) java.net.Authenticator.setDefault(RecordingAuthenticator()) client = client.newBuilder() @@ -1664,8 +1617,7 @@ class URLConnectionTest { private fun postBodyRetransmittedAfterAuthorizationFail(body: String) { server.enqueue( - MockResponse() - .setResponseCode(401) + MockResponse(code = 401) ) server.enqueue(MockResponse()) val credential = basic("jesse", "secret") @@ -1754,11 +1706,11 @@ class URLConnectionTest { val authenticator = RecordingAuthenticator(null) java.net.Authenticator.setDefault(authenticator) server.enqueue( - MockResponse() - .setResponseCode(responseCode) + MockResponse.Builder() + .code(responseCode) .addHeader(authHeader) - .setBody("Please authenticate.") - ) + .body("Please authenticate.") + .build()) val response: Response if (proxy) { client = client.newBuilder() @@ -1861,8 +1813,8 @@ class URLConnectionTest { @Test fun shoutcast() { server.enqueue( - MockResponse() - .setStatus("ICY 200 OK") + MockResponse.Builder() + .status("ICY 200 OK") .addHeader("Accept-Ranges: none") .addHeader("Content-Type: audio/mpeg") .addHeader("icy-br:128") @@ -1878,8 +1830,8 @@ class URLConnectionTest { .addHeader("Pragma: no-cache") .addHeader("Expires: Mon, 26 Jul 1997 05:00:00 GMT") .addHeader("icy-metaint:16000") - .setBody("mp3 data") - ) + .body("mp3 data") + .build()) val response = getResponse(newRequest("/")) assertThat(response.code).isEqualTo(200) assertThat(response.message).isEqualTo("OK") @@ -1889,13 +1841,13 @@ class URLConnectionTest { @Test fun ntripr1() { server.enqueue( - MockResponse() - .setStatus("SOURCETABLE 200 OK") + MockResponse.Builder() + .status("SOURCETABLE 200 OK") .addHeader("Server: NTRIP Caster 1.5.5/1.0") .addHeader("Date: 23/Jan/2004:08:54:59 UTC") .addHeader("Content-Type: text/plain") - .setBody("STR;FFMJ2;Frankfurt;RTCM 2.1;1(1),3(19),16(59);0;GPS;GREF;DEU;50.12;8.68;0;1;GPSNet V2.10;none;N;N;560;Demo\nENDSOURCETABLE") - ) + .body("STR;FFMJ2;Frankfurt;RTCM 2.1;1(1),3(19),16(59);0;GPS;GREF;DEU;50.12;8.68;0;1;GPSNet V2.10;none;N;N;560;Demo\nENDSOURCETABLE") + .build()) val response = getResponse(newRequest("/")) assertThat(response.code).isEqualTo(200) assertThat(response.message).isEqualTo("OK") @@ -1919,8 +1871,7 @@ class URLConnectionTest { private fun testSecureStreamingPost(streamingMode: TransferKind) { server.useHttps(handshakeCertificates.sslSocketFactory()) server.enqueue( - MockResponse() - .setBody("Success!") + MockResponse(body = "Success!") ) client = client.newBuilder() .sslSocketFactory( @@ -1949,18 +1900,18 @@ class URLConnectionTest { @Test fun authenticateWithPost() { - val pleaseAuthenticate = MockResponse() - .setResponseCode(401) - .addHeader("WWW-Authenticate: Basic realm=\"protected area\"") - .setBody("Please authenticate.") + val pleaseAuthenticate = MockResponse( + code = 401, + headers = headersOf("WWW-Authenticate", "Basic realm=\"protected area\""), + body = "Please authenticate.", + ) // Fail auth three times... server.enqueue(pleaseAuthenticate) server.enqueue(pleaseAuthenticate) server.enqueue(pleaseAuthenticate) // ...then succeed the fourth time. server.enqueue( - MockResponse() - .setBody("Successful auth!") + MockResponse(body = "Successful auth!") ) java.net.Authenticator.setDefault(RecordingAuthenticator()) client = client.newBuilder() @@ -1993,18 +1944,18 @@ class URLConnectionTest { @Test fun authenticateWithGet() { - val pleaseAuthenticate = MockResponse() - .setResponseCode(401) - .addHeader("WWW-Authenticate: Basic realm=\"protected area\"") - .setBody("Please authenticate.") + val pleaseAuthenticate = MockResponse( + code = 401, + headers = headersOf("WWW-Authenticate", "Basic realm=\"protected area\""), + body = "Please authenticate.", + ) // Fail auth three times... server.enqueue(pleaseAuthenticate) server.enqueue(pleaseAuthenticate) server.enqueue(pleaseAuthenticate) // ...then succeed the fourth time. server.enqueue( - MockResponse() - .setBody("Successful auth!") + MockResponse(body = "Successful auth!") ) java.net.Authenticator.setDefault(RecordingAuthenticator()) client = client.newBuilder() @@ -2030,20 +1981,25 @@ class URLConnectionTest { @Test fun authenticateWithCharset() { server.enqueue( - MockResponse() - .setResponseCode(401) - .addHeader("WWW-Authenticate: Basic realm=\"protected area\", charset=\"UTF-8\"") - .setBody("Please authenticate with UTF-8.") + MockResponse( + code = 401, + headers = headersOf( + "WWW-Authenticate", "Basic realm=\"protected area\", charset=\"UTF-8\"" + ), + body = "Please authenticate with UTF-8.", + ) ) server.enqueue( - MockResponse() - .setResponseCode(401) - .addHeader("WWW-Authenticate: Basic realm=\"protected area\"") - .setBody("Please authenticate with ISO-8859-1.") + MockResponse( + code = 401, + headers = headersOf( + "WWW-Authenticate", "Basic realm=\"protected area\"" + ), + body = "Please authenticate with ISO-8859-1.", + ) ) server.enqueue( - MockResponse() - .setBody("Successful auth!") + MockResponse(body = "Successful auth!") ) java.net.Authenticator.setDefault( RecordingAuthenticator( @@ -2076,18 +2032,20 @@ class URLConnectionTest { /** https://code.google.com/p/android/issues/detail?id=74026 */ @Test fun authenticateWithGetAndTransparentGzip() { - val pleaseAuthenticate = MockResponse() - .setResponseCode(401) - .addHeader("WWW-Authenticate: Basic realm=\"protected area\"") - .setBody("Please authenticate.") + val pleaseAuthenticate = MockResponse( + code = 401, + headers = headersOf("WWW-Authenticate", "Basic realm=\"protected area\""), + body = "Please authenticate.", + ) // Fail auth three times... server.enqueue(pleaseAuthenticate) server.enqueue(pleaseAuthenticate) server.enqueue(pleaseAuthenticate) // ...then succeed the fourth time. - val successfulResponse = MockResponse() + val successfulResponse = MockResponse.Builder() .addHeader("Content-Encoding", "gzip") - .setBody(gzip("Successful auth!")) + .body(gzip("Successful auth!")) + .build() server.enqueue(successfulResponse) java.net.Authenticator.setDefault(RecordingAuthenticator()) client = client.newBuilder() @@ -2115,14 +2073,14 @@ class URLConnectionTest { @Test fun authenticateRealmUppercase() { server.enqueue( - MockResponse() - .setResponseCode(401) - .addHeader("wWw-aUtHeNtIcAtE: bAsIc rEaLm=\"pRoTeCtEd aReA\"") - .setBody("Please authenticate.") + MockResponse( + code = 401, + headers = headersOf("wWw-aUtHeNtIcAtE", "bAsIc rEaLm=\"pRoTeCtEd aReA\""), + body = "Please authenticate." + ) ) server.enqueue( - MockResponse() - .setBody("Successful auth!") + MockResponse(body = "Successful auth!") ) java.net.Authenticator.setDefault(RecordingAuthenticator()) client = client.newBuilder() @@ -2149,15 +2107,12 @@ class URLConnectionTest { } private fun testRedirected(transferKind: TransferKind, reuse: Boolean) { - val mockResponse = MockResponse() - .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) + val mockResponse = MockResponse.Builder() + .code(HttpURLConnection.HTTP_MOVED_TEMP) .addHeader("Location: /foo") transferKind.setBody(mockResponse, "This page has moved!", 10) - server.enqueue(mockResponse) - server.enqueue( - MockResponse() - .setBody("This is the new location!") - ) + server.enqueue(mockResponse.build()) + server.enqueue(MockResponse(body = "This is the new location!")) val response = getResponse(newRequest("/")) assertThat(readAscii(response.body.byteStream(), Int.MAX_VALUE)).isEqualTo( "This is the new location!" @@ -2177,14 +2132,14 @@ class URLConnectionTest { fun redirectedOnHttps() { server.useHttps(handshakeCertificates.sslSocketFactory()) server.enqueue( - MockResponse() - .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) - .addHeader("Location: /foo") - .setBody("This page has moved!") + MockResponse( + code = HttpURLConnection.HTTP_MOVED_TEMP, + headers = headersOf("Location", "/foo"), + body = "This page has moved!", + ) ) server.enqueue( - MockResponse() - .setBody("This is the new location!") + MockResponse(body = "This is the new location!") ) client = client.newBuilder() .sslSocketFactory( @@ -2209,10 +2164,11 @@ class URLConnectionTest { fun notRedirectedFromHttpsToHttp() { server.useHttps(handshakeCertificates.sslSocketFactory()) server.enqueue( - MockResponse() - .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) - .addHeader("Location: http://anyhost/foo") - .setBody("This page has moved!") + MockResponse( + code = HttpURLConnection.HTTP_MOVED_TEMP, + headers = headersOf("Location", "http://anyhost/foo"), + body = "This page has moved!", + ) ) client = client.newBuilder() .followSslRedirects(false) @@ -2229,10 +2185,11 @@ class URLConnectionTest { @Test fun notRedirectedFromHttpToHttps() { server.enqueue( - MockResponse() - .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) - .addHeader("Location: https://anyhost/foo") - .setBody("This page has moved!") + MockResponse( + code = HttpURLConnection.HTTP_MOVED_TEMP, + headers = headersOf("Location", "https://anyhost/foo"), + body = "This page has moved!", + ) ) client = client.newBuilder() .followSslRedirects(false) @@ -2245,15 +2202,15 @@ class URLConnectionTest { @Test fun redirectedFromHttpsToHttpFollowingProtocolRedirects() { server2.enqueue( - MockResponse() - .setBody("This is insecure HTTP!") + MockResponse(body = "This is insecure HTTP!") ) server.useHttps(handshakeCertificates.sslSocketFactory()) server.enqueue( - MockResponse() - .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) - .addHeader("Location: " + server2.url("/").toUrl()) - .setBody("This page has moved!") + MockResponse( + code = HttpURLConnection.HTTP_MOVED_TEMP, + headers = headersOf("Location", server2.url("/").toString()), + body = "This page has moved!", + ) ) client = client.newBuilder() .sslSocketFactory( @@ -2271,14 +2228,14 @@ class URLConnectionTest { fun redirectedFromHttpToHttpsFollowingProtocolRedirects() { server2.useHttps(handshakeCertificates.sslSocketFactory()) server2.enqueue( - MockResponse() - .setBody("This is secure HTTPS!") + MockResponse(body = "This is secure HTTPS!") ) server.enqueue( - MockResponse() - .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) - .addHeader("Location: " + server2.url("/").toUrl()) - .setBody("This page has moved!") + MockResponse( + code = HttpURLConnection.HTTP_MOVED_TEMP, + headers = headersOf("Location", server2.url("/").toString()), + body = "This page has moved!", + ) ) client = client.newBuilder() .sslSocketFactory( @@ -2314,22 +2271,20 @@ class URLConnectionTest { .build() } server2.enqueue( - MockResponse() - .setBody("This is the 2nd server!") + MockResponse(body = "This is the 2nd server!") ) server2.enqueue( - MockResponse() - .setBody("This is the 2nd server, again!") + MockResponse(body = "This is the 2nd server, again!") ) server.enqueue( - MockResponse() - .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) - .addHeader("Location: " + server2.url("/").toUrl()) - .setBody("This page has moved!") + MockResponse( + code = HttpURLConnection.HTTP_MOVED_TEMP, + headers = headersOf("Location", server2.url("/").toString()), + body = "This page has moved!", + ) ) server.enqueue( - MockResponse() - .setBody("This is the first server again!") + MockResponse(body = "This is the first server again!") ) val response = getResponse(newRequest("/")) assertContent("This is the 2nd server!", response) @@ -2369,14 +2324,14 @@ class URLConnectionTest { }) .build() server2.enqueue( - MockResponse() - .setBody("This is the 2nd server!") + MockResponse(body = "This is the 2nd server!") ) server.enqueue( - MockResponse() - .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) - .addHeader("Location: " + server2.url("/b")) - .setBody("This page has moved!") + MockResponse( + code = HttpURLConnection.HTTP_MOVED_TEMP, + headers = headersOf("Location", server2.url("/b").toString()), + body = "This page has moved!", + ) ) assertContent("This is the 2nd server!", getResponse(newRequest("/a"))) assertThat(proxySelectionRequests).isEqualTo( @@ -2390,17 +2345,16 @@ class URLConnectionTest { @Test fun redirectWithAuthentication() { server2.enqueue( - MockResponse() - .setBody("Page 2") + MockResponse(body = "Page 2") ) server.enqueue( - MockResponse() - .setResponseCode(401) + MockResponse(code = 401) ) server.enqueue( - MockResponse() - .setResponseCode(302) - .addHeader("Location: " + server2.url("/b")) + MockResponse( + code = 302, + headers = headersOf("Location", server2.url("/b").toString()) + ) ) client = client.newBuilder() .authenticator(RecordingOkAuthenticator(basic("jesse", "secret"), null)) @@ -2444,14 +2398,14 @@ class URLConnectionTest { private fun testResponseRedirectedWithPost(redirectCode: Int, transferKind: TransferKind) { server.enqueue( - MockResponse() - .setResponseCode(redirectCode) - .addHeader("Location: /page2") - .setBody("This page has moved!") + MockResponse( + code = redirectCode, + headers = headersOf("Location", "/page2"), + body = "This page has moved!", + ) ) server.enqueue( - MockResponse() - .setBody("Page 2") + MockResponse(body = "Page 2") ) val response = getResponse( Request( @@ -2471,13 +2425,13 @@ class URLConnectionTest { @Test fun redirectedPostStripsRequestBodyHeaders() { server.enqueue( - MockResponse() - .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) - .addHeader("Location: /page2") + MockResponse( + code = HttpURLConnection.HTTP_MOVED_TEMP, + headers = headersOf("Location", "/page2"), + ) ) server.enqueue( - MockResponse() - .setBody("Page 2") + MockResponse(body = "Page 2") ) val response = getResponse( Request.Builder() @@ -2500,14 +2454,14 @@ class URLConnectionTest { @Test fun response305UseProxy() { server.enqueue( - MockResponse() - .setResponseCode(HttpURLConnection.HTTP_USE_PROXY) - .addHeader("Location: " + server.url("/").toUrl()) - .setBody("This page has moved!") + MockResponse( + code = HttpURLConnection.HTTP_USE_PROXY, + headers = headersOf("Location", server.url("/").toString()), + body = "This page has moved!", + ) ) server.enqueue( - MockResponse() - .setBody("Proxy Response") + MockResponse(body = "Proxy Response") ) val response = getResponse(newRequest("/foo")) // Fails on the RI, which gets "Proxy Response". @@ -2594,10 +2548,11 @@ class URLConnectionTest { client = client.newBuilder() .addNetworkInterceptor(LegacyRedirectInterceptor()) .build() - val response1 = MockResponse() - .setResponseCode(HTTP_TEMP_REDIRECT) - .setBody("This page has moved!") - .addHeader("Location: /page2") + val response1 = MockResponse( + code = HTTP_TEMP_REDIRECT, + headers = headersOf("Location", "/page2"), + body = "This page has moved!", + ) server.enqueue(response1) val request = Request( url = server.url("/page1"), @@ -2617,10 +2572,11 @@ class URLConnectionTest { client = client.newBuilder() .addNetworkInterceptor(LegacyRedirectInterceptor()) .build() - val response1 = MockResponse() - .setResponseCode(HTTP_PERM_REDIRECT) - .setBody("This page has moved!") - .addHeader("Location: /page2") + val response1 = MockResponse( + code = HTTP_PERM_REDIRECT, + body = "This page has moved!", + headers = headersOf("Location", "/page2"), + ) server.enqueue(response1) val request = Request( url = server.url("/page1"), @@ -2636,19 +2592,16 @@ class URLConnectionTest { } private fun testRedirect(temporary: Boolean, method: String) { - val response1 = MockResponse() - .setResponseCode( + val response1 = MockResponse.Builder() + .code( if (temporary) HTTP_TEMP_REDIRECT else HTTP_PERM_REDIRECT ) .addHeader("Location: /page2") if (method != "HEAD") { - response1.setBody("This page has moved!") + response1.body("This page has moved!") } - server.enqueue(response1) - server.enqueue( - MockResponse() - .setBody("Page 2") - ) + server.enqueue(response1.build()) + server.enqueue(MockResponse(body = "Page 2")) val requestBuilder = Request.Builder() .url(server.url("/page1")) if (method == "POST") { @@ -2677,15 +2630,15 @@ class URLConnectionTest { fun follow20Redirects() { for (i in 0..19) { server.enqueue( - MockResponse() - .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) - .addHeader("Location: /" + (i + 1)) - .setBody("Redirecting to /" + (i + 1)) + MockResponse( + code = HttpURLConnection.HTTP_MOVED_TEMP, + headers = headersOf("Location", "/" + (i + 1)), + body = "Redirecting to /" + (i + 1), + ) ) } server.enqueue( - MockResponse() - .setBody("Success!") + MockResponse(body = "Success!") ) val response = getResponse(newRequest("/0")) assertContent("Success!", response) @@ -2697,10 +2650,11 @@ class URLConnectionTest { fun doesNotFollow21Redirects() { for (i in 0..20) { server.enqueue( - MockResponse() - .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) - .addHeader("Location: /" + (i + 1)) - .setBody("Redirecting to /" + (i + 1)) + MockResponse( + code = HttpURLConnection.HTTP_MOVED_TEMP, + headers = headersOf("Location", "/" + (i + 1)), + body = "Redirecting to /" + (i + 1), + ) ) } try { @@ -2724,18 +2678,9 @@ class URLConnectionTest { .sslSocketFactory(sslContext.socketFactory, trustManager) .build() server.useHttps(handshakeCertificates.sslSocketFactory()) - server.enqueue( - MockResponse() - .setBody("ABC") - ) - server.enqueue( - MockResponse() - .setBody("DEF") - ) - server.enqueue( - MockResponse() - .setBody("GHI") - ) + server.enqueue(MockResponse(body = "ABC")) + server.enqueue(MockResponse(body = "DEF")) + server.enqueue(MockResponse(body = "GHI")) assertContent("ABC", getResponse(newRequest("/"))) assertContent("DEF", getResponse(newRequest("/"))) assertContent("GHI", getResponse(newRequest("/"))) @@ -2756,15 +2701,15 @@ class URLConnectionTest { private fun enqueueClientRequestTimeoutResponses() { server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.DISCONNECT_AT_END) - .setResponseCode(HttpURLConnection.HTTP_CLIENT_TIMEOUT) - .setHeader("Connection", "Close") - .setBody("You took too long!") + MockResponse( + code = HttpURLConnection.HTTP_CLIENT_TIMEOUT, + headers = headersOf("Connection", "Close"), + body = "You took too long!", + socketPolicy = SocketPolicy.DISCONNECT_AT_END, + ) ) server.enqueue( - MockResponse() - .setBody("Body") + MockResponse(body = "Body") ) } @@ -2807,14 +2752,13 @@ class URLConnectionTest { // connection after a response has been sent. This causes the client to // try to read more bytes than are sent, which results in a timeout. server.enqueue( - MockResponse() - .setBody("ABC") + MockResponse.Builder() + .body("ABC") .clearHeaders() .addHeader("Content-Length: 4") - ) + .build()) server.enqueue( - MockResponse() - .setBody("unused") + MockResponse(body = "unused") ) // to keep the server alive val response = getResponse(newRequest("/")) val source = response.body.source() @@ -2855,8 +2799,9 @@ class URLConnectionTest { .build() server.start() server.enqueue( - MockResponse() + MockResponse.Builder() .throttleBody(1, 1, TimeUnit.SECONDS) + .build() ) // Prevent the server from reading! val request = Request( url = server.url("/"), @@ -2916,10 +2861,7 @@ class URLConnectionTest { @Test fun connectionCloseInResponse() { - server.enqueue( - MockResponse() - .addHeader("Connection: close") - ) + server.enqueue(MockResponse(headers = headersOf("Connection", "close"))) server.enqueue(MockResponse()) val a = getResponse(newRequest("/")) assertThat(a.code).isEqualTo(200) @@ -2936,15 +2878,15 @@ class URLConnectionTest { @Test fun connectionCloseWithRedirect() { server.enqueue( - MockResponse() - .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) - .addHeader("Location: /foo") - .addHeader("Connection: close") - ) - server.enqueue( - MockResponse() - .setBody("This is the new location!") + MockResponse( + code = HttpURLConnection.HTTP_MOVED_TEMP, + headers = headersOf( + "Location", "/foo", + "Connection", "close", + ), + ) ) + server.enqueue(MockResponse(body = "This is the new location!")) val response = getResponse(newRequest("/")) assertThat(readAscii(response.body.byteStream(), Int.MAX_VALUE)).isEqualTo( "This is the new location!" @@ -2964,15 +2906,13 @@ class URLConnectionTest { @Test fun sameConnectionRedirectAndReuse() { server.enqueue( - MockResponse() - .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) - .setSocketPolicy(SocketPolicy.SHUTDOWN_INPUT_AT_END) - .addHeader("Location: /foo") - ) - server.enqueue( - MockResponse() - .setBody("This is the new page!") + MockResponse( + code = HttpURLConnection.HTTP_MOVED_TEMP, + headers = headersOf("Location", "/foo"), + socketPolicy = SocketPolicy.SHUTDOWN_INPUT_AT_END, + ) ) + server.enqueue(MockResponse(body = "This is the new page!")) assertContent("This is the new page!", getResponse(newRequest("/"))) assertThat(server.takeRequest().sequenceNumber).isEqualTo(0) assertThat(server.takeRequest().sequenceNumber).isEqualTo(0) @@ -2981,9 +2921,10 @@ class URLConnectionTest { @Test fun responseCodeDisagreesWithHeaders() { server.enqueue( - MockResponse() - .setResponseCode(HttpURLConnection.HTTP_NO_CONTENT) - .setBody("This body is not allowed!") + MockResponse( + code = HttpURLConnection.HTTP_NO_CONTENT, + body = "This body is not allowed!", + ) ) try { getResponse(newRequest("/")) @@ -2996,13 +2937,13 @@ class URLConnectionTest { @Test fun singleByteReadIsSigned() { server.enqueue( - MockResponse() - .setBody( + MockResponse.Builder() + .body( Buffer() .writeByte(-2) .writeByte(-1) ) - ) + .build()) val response = getResponse(newRequest("/")) val inputStream = response.body.byteStream() assertThat(inputStream.read()).isEqualTo(254) @@ -3032,8 +2973,7 @@ class URLConnectionTest { */ private fun testFlushAfterStreamTransmitted(transferKind: TransferKind) { server.enqueue( - MockResponse() - .setBody("abc") + MockResponse(body = "abc") ) val sinkReference = AtomicReference() val response = getResponse( @@ -3064,10 +3004,7 @@ class URLConnectionTest { @Test fun getHeadersThrows() { - server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.DISCONNECT_AT_START) - ) + server.enqueue(MockResponse(socketPolicy = SocketPolicy.DISCONNECT_AT_START)) try { getResponse(newRequest("/")) fail() @@ -3099,10 +3036,7 @@ class URLConnectionTest { // The request should work once and then fail. @Test fun getKeepAlive() { - server.enqueue( - MockResponse() - .setBody("ABC") - ) + server.enqueue(MockResponse(body = "ABC")) // The request should work once and then fail. val connection1 = getResponse(newRequest("/")) @@ -3121,11 +3055,12 @@ class URLConnectionTest { @Test fun readAfterLastByte() { server.enqueue( - MockResponse() - .setBody("ABC") + MockResponse.Builder() + .body("ABC") .clearHeaders() .addHeader("Connection: close") - .setSocketPolicy(SocketPolicy.DISCONNECT_AT_END) + .socketPolicy(SocketPolicy.DISCONNECT_AT_END) + .build() ) val response = getResponse(newRequest("/")) val `in` = response.body.byteStream() @@ -3150,8 +3085,7 @@ class URLConnectionTest { @Test fun clientSendsContentLength() { server.enqueue( - MockResponse() - .setBody("A") + MockResponse(body = "A") ) val response = getResponse( Request( @@ -3168,8 +3102,7 @@ class URLConnectionTest { @Test fun getContentLengthConnects() { server.enqueue( - MockResponse() - .setBody("ABC") + MockResponse(body = "ABC") ) val response = getResponse(newRequest("/")) assertThat(response.body.contentLength()).isEqualTo(3L) @@ -3179,9 +3112,10 @@ class URLConnectionTest { @Test fun getContentTypeConnects() { server.enqueue( - MockResponse() - .addHeader("Content-Type: text/plain") - .setBody("ABC") + MockResponse( + headers = headersOf("Content-Type", "text/plain"), + body = "ABC", + ) ) val response = getResponse(newRequest("/")) assertThat(response.body.contentType()).isEqualTo( @@ -3193,9 +3127,10 @@ class URLConnectionTest { @Test fun getContentEncodingConnects() { server.enqueue( - MockResponse() - .addHeader("Content-Encoding: identity") - .setBody("ABC") + MockResponse( + headers = headersOf("Content-Encoding", "identity"), + body = "ABC", + ) ) val response = getResponse(newRequest("/")) assertThat(response.header("Content-Encoding")).isEqualTo("identity") @@ -3205,8 +3140,7 @@ class URLConnectionTest { @Test fun urlContainsQueryButNoPath() { server.enqueue( - MockResponse() - .setBody("A") + MockResponse(body = "A") ) val url = server.url("?query") val response = getResponse(Request(url)) @@ -3245,9 +3179,9 @@ class URLConnectionTest { private fun testInputStreamAvailable(transferKind: TransferKind) { val body = "ABCDEFGH" - val mockResponse = MockResponse() - transferKind.setBody(mockResponse, body, 4) - server.enqueue(mockResponse) + val builder = MockResponse.Builder() + transferKind.setBody(builder, body, 4) + server.enqueue(builder.build()) val response = getResponse(newRequest("/")) val inputStream = response.body.byteStream() for (i in 0 until body.length) { @@ -3290,18 +3224,13 @@ class URLConnectionTest { private fun reusedConnectionFailsWithPost(transferKind: TransferKind, requestSize: Int) { server.enqueue( - MockResponse() - .setBody("A") - .setSocketPolicy(SocketPolicy.DISCONNECT_AT_END) - ) - server.enqueue( - MockResponse() - .setBody("B") - ) - server.enqueue( - MockResponse() - .setBody("C") + MockResponse( + body = "A", + socketPolicy = SocketPolicy.DISCONNECT_AT_END, + ) ) + server.enqueue(MockResponse(body = "B")) + server.enqueue(MockResponse(body = "C")) assertContent("A", getResponse(newRequest("/a"))) // Give the server time to disconnect. @@ -3336,18 +3265,9 @@ class URLConnectionTest { @Test fun postBodyRetransmittedOnFailureRecovery() { - server.enqueue( - MockResponse() - .setBody("abc") - ) - server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.DISCONNECT_AFTER_REQUEST) - ) - server.enqueue( - MockResponse() - .setBody("def") - ) + server.enqueue(MockResponse(body = "abc")) + server.enqueue(MockResponse(socketPolicy = SocketPolicy.DISCONNECT_AFTER_REQUEST)) + server.enqueue(MockResponse(body = "def")) // Seed the connection pool so we have something that can fail. assertContent("abc", getResponse(newRequest("/"))) @@ -3371,8 +3291,7 @@ class URLConnectionTest { @Test fun fullyBufferedPostIsTooShort() { server.enqueue( - MockResponse() - .setBody("A") + MockResponse(body = "A") ) val requestBody: RequestBody = object : RequestBody() { override fun contentType(): MediaType? = null @@ -3398,8 +3317,7 @@ class URLConnectionTest { @Test fun fullyBufferedPostIsTooLong() { server.enqueue( - MockResponse() - .setBody("A") + MockResponse(body = "A") ) val requestBody: RequestBody = object : RequestBody() { override fun contentType(): MediaType? = null @@ -3445,8 +3363,7 @@ class URLConnectionTest { @Test fun emptyRequestHeaderValueIsAllowed() { server.enqueue( - MockResponse() - .setBody("body") + MockResponse(body = "body") ) val response = getResponse( Request.Builder() @@ -3461,9 +3378,10 @@ class URLConnectionTest { @Test fun emptyResponseHeaderValueIsAllowed() { server.enqueue( - MockResponse() - .addHeader("A:") - .setBody("body") + MockResponse( + headers = headersOf("A", ""), + body = "body", + ) ) val response = getResponse(newRequest("/")) assertContent("body", response) @@ -3487,9 +3405,10 @@ class URLConnectionTest { val headers = Headers.Builder() addHeaderLenient(headers, ":A") server.enqueue( - MockResponse() - .setHeaders(headers.build()) - .setBody("body") + MockResponse( + headers = headers.build(), + body = "body", + ) ) val response = getResponse(newRequest("/")) assertThat(response.code).isEqualTo(200) @@ -3539,10 +3458,7 @@ class URLConnectionTest { addHeaderLenient(headersBuilder, ": ef") addHeaderLenient(headersBuilder, "\ud83c\udf69: \u2615\ufe0f") val headers = headersBuilder.build() - server.enqueue( - MockResponse() - .setHeaders(headers) - ) + server.enqueue(MockResponse(headers = headers)) val response = getResponse(newRequest("/")) assertThat(response.code).isEqualTo(200) assertThat(response.header("a\tb")).isEqualTo("c\u007fd") @@ -3571,14 +3487,14 @@ class URLConnectionTest { @Test fun customBasicAuthenticator() { server.enqueue( - MockResponse() - .setResponseCode(401) - .addHeader("WWW-Authenticate: Basic realm=\"protected area\"") - .setBody("Please authenticate.") + MockResponse( + code = 401, + headers = headersOf("WWW-Authenticate", "Basic realm=\"protected area\""), + body = "Please authenticate.", + ) ) server.enqueue( - MockResponse() - .setBody("A") + MockResponse(body = "A") ) val credential = basic("jesse", "peanutbutter") val authenticator = RecordingOkAuthenticator(credential, null) @@ -3597,14 +3513,14 @@ class URLConnectionTest { @Test fun customTokenAuthenticator() { server.enqueue( - MockResponse() - .setResponseCode(401) - .addHeader("WWW-Authenticate: Bearer realm=\"oauthed\"") - .setBody("Please authenticate.") + MockResponse( + code = 401, + headers = headersOf("WWW-Authenticate", "Bearer realm=\"oauthed\""), + body = "Please authenticate.", + ) ) server.enqueue( - MockResponse() - .setBody("A") + MockResponse(body = "A") ) val authenticator = RecordingOkAuthenticator("oauthed abc123", "Bearer") client = client.newBuilder() @@ -3623,18 +3539,19 @@ class URLConnectionTest { @Test fun authenticateCallsTrackedAsRedirects() { server.enqueue( - MockResponse() - .setResponseCode(302) - .addHeader("Location: /b") + MockResponse( + code = 302, + headers = headersOf("Location", "/b"), + ) ) server.enqueue( - MockResponse() - .setResponseCode(401) - .addHeader("WWW-Authenticate: Basic realm=\"protected area\"") + MockResponse( + code = 401, + headers = headersOf("WWW-Authenticate", "Basic realm=\"protected area\""), + ) ) server.enqueue( - MockResponse() - .setBody("c") + MockResponse(body = "c") ) val authenticator = RecordingOkAuthenticator( basic("jesse", "peanutbutter"), "Basic" @@ -3653,13 +3570,11 @@ class URLConnectionTest { fun attemptAuthorization20Times() { for (i in 0..19) { server.enqueue( - MockResponse() - .setResponseCode(401) + MockResponse(code = 401) ) } server.enqueue( - MockResponse() - .setBody("Success!") + MockResponse(body = "Success!") ) val credential = basic("jesse", "peanutbutter") client = client.newBuilder() @@ -3673,8 +3588,7 @@ class URLConnectionTest { fun doesNotAttemptAuthorization21Times() { for (i in 0..20) { server.enqueue( - MockResponse() - .setResponseCode(401) + MockResponse(code = 401) ) } val credential = basic("jesse", "peanutbutter") @@ -3698,8 +3612,7 @@ class URLConnectionTest { private fun setsNegotiatedProtocolHeader(protocol: Protocol) { enableProtocol(protocol) server.enqueue( - MockResponse() - .setBody("A") + MockResponse(body = "A") ) client = client.newBuilder() .protocols(Arrays.asList(protocol, Protocol.HTTP_1_1)) @@ -3712,8 +3625,9 @@ class URLConnectionTest { @Test fun http10SelectedProtocol() { server.enqueue( - MockResponse() - .setStatus("HTTP/1.0 200 OK") + MockResponse.Builder() + .status("HTTP/1.0 200 OK") + .build() ) val response = getResponse(newRequest("/")) assertThat(response.protocol).isEqualTo(Protocol.HTTP_1_0) @@ -3722,8 +3636,9 @@ class URLConnectionTest { @Test fun http11SelectedProtocol() { server.enqueue( - MockResponse() - .setStatus("HTTP/1.1 200 OK") + MockResponse.Builder() + .status("HTTP/1.1 200 OK") + .build() ) val response = getResponse(newRequest("/")) assertThat(response.protocol).isEqualTo(Protocol.HTTP_1_1) @@ -3771,8 +3686,7 @@ class URLConnectionTest { @Test fun setProtocols() { server.enqueue( - MockResponse() - .setBody("A") + MockResponse(body = "A") ) client = client.newBuilder() .protocols(Arrays.asList(Protocol.HTTP_1_1)) @@ -3835,14 +3749,8 @@ class URLConnectionTest { @Test fun testNoSslFallback() { server.useHttps(handshakeCertificates.sslSocketFactory()) - server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.FAIL_HANDSHAKE) - ) - server.enqueue( - MockResponse() - .setBody("Response that would have needed fallbacks") - ) + server.enqueue(MockResponse(socketPolicy = SocketPolicy.FAIL_HANDSHAKE)) + server.enqueue(MockResponse(body = "Response that would have needed fallbacks")) client = client.newBuilder() .sslSocketFactory( handshakeCertificates.sslSocketFactory(), handshakeCertificates.trustManager @@ -3871,14 +3779,13 @@ class URLConnectionTest { @Test fun noTransparentGzipFor304NotModified() { server.enqueue( - MockResponse() + MockResponse.Builder() .clearHeaders() - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED) + .code(HttpURLConnection.HTTP_NOT_MODIFIED) .addHeader("Content-Encoding: gzip") - ) + .build()) server.enqueue( - MockResponse() - .setBody("b") + MockResponse(body = "b") ) val response1 = getResponse(newRequest("/")) assertThat(response1.code).isEqualTo(HttpURLConnection.HTTP_NOT_MODIFIED.toLong()) @@ -3899,15 +3806,14 @@ class URLConnectionTest { @Test fun gzipWithRedirectAndConnectionReuse() { server.enqueue( - MockResponse() - .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) + MockResponse.Builder() + .code(HttpURLConnection.HTTP_MOVED_TEMP) .addHeader("Location: /foo") .addHeader("Content-Encoding: gzip") - .setBody(gzip("Moved! Moved! Moved!")) - ) + .body(gzip("Moved! Moved! Moved!")) + .build()) server.enqueue( - MockResponse() - .setBody("This is the new page!") + MockResponse(body = "This is the new page!") ) val response = getResponse(newRequest("/")) assertContent("This is the new page!", response) @@ -3939,8 +3845,7 @@ class URLConnectionTest { @Test fun userAgentDefaultsToOkHttpVersion() { server.enqueue( - MockResponse() - .setBody("abc") + MockResponse(body = "abc") ) assertContent("abc", getResponse(newRequest("/"))) val request = server.takeRequest() @@ -3978,9 +3883,10 @@ class URLConnectionTest { fun urlRedirectToHostWithNul() { val redirectUrl = "http://host\u0000/" server.enqueue( - MockResponse() - .setResponseCode(302) + MockResponse.Builder() + .code(302) .addHeaderLenient("Location", redirectUrl) + .build() ) val response = getResponse(newRequest("/")) assertThat(response.code).isEqualTo(302) @@ -4028,13 +3934,13 @@ class URLConnectionTest { platform.assumeHttp2Support() enableProtocol(Protocol.HTTP_2) server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.DISCONNECT_AT_END) - .setBody("abc") + MockResponse( + body = "abc", + socketPolicy = SocketPolicy.DISCONNECT_AT_END, + ) ) server.enqueue( - MockResponse() - .setBody("def") + MockResponse(body = "def") ) // Send a separate request which will trigger a GOAWAY frame on the healthy connection. @@ -4062,10 +3968,11 @@ class URLConnectionTest { @Test fun authenticateNoConnection() { server.enqueue( - MockResponse() - .addHeader("Connection: close") - .setResponseCode(401) - .setSocketPolicy(SocketPolicy.DISCONNECT_AT_END) + MockResponse( + code = 401, + headers = headersOf("Connection", "close"), + socketPolicy = SocketPolicy.DISCONNECT_AT_END, + ) ) java.net.Authenticator.setDefault(RecordingAuthenticator(null)) client = client.newBuilder() @@ -4104,8 +4011,8 @@ class URLConnectionTest { internal enum class TransferKind { CHUNKED { - override fun setBody(response: MockResponse, content: Buffer?, chunkSize: Int) { - response.setChunkedBody(content!!, chunkSize) + override fun setBody(response: MockResponse.Builder, content: Buffer?, chunkSize: Int) { + response.chunkedBody(content!!, chunkSize) } override fun newRequestBody(body: String): RequestBody { @@ -4122,8 +4029,8 @@ class URLConnectionTest { }, FIXED_LENGTH { - override fun setBody(response: MockResponse, content: Buffer?, chunkSize: Int) { - response.setBody(content!!) + override fun setBody(response: MockResponse.Builder, content: Buffer?, chunkSize: Int) { + response.body(content!!) } override fun newRequestBody(body: String): RequestBody { @@ -4140,9 +4047,9 @@ class URLConnectionTest { }, END_OF_STREAM { - override fun setBody(response: MockResponse, content: Buffer?, chunkSize: Int) { - response.setBody(content!!) - response.setSocketPolicy(SocketPolicy.DISCONNECT_AT_END) + override fun setBody(response: MockResponse.Builder, content: Buffer?, chunkSize: Int) { + response.body(content!!) + response.socketPolicy(SocketPolicy.DISCONNECT_AT_END) response.removeHeader("Content-Length") } @@ -4152,14 +4059,14 @@ class URLConnectionTest { }; abstract fun setBody( - response: MockResponse, + response: MockResponse.Builder, content: Buffer?, chunkSize: Int ) abstract fun newRequestBody(body: String): RequestBody fun setBody( - response: MockResponse, + response: MockResponse.Builder, content: String?, chunkSize: Int ) { diff --git a/okhttp/src/jvmTest/java/okhttp3/WholeOperationTimeoutTest.java b/okhttp/src/jvmTest/java/okhttp3/WholeOperationTimeoutTest.java index 69a813e4d..4c07133b0 100644 --- a/okhttp/src/jvmTest/java/okhttp3/WholeOperationTimeoutTest.java +++ b/okhttp/src/jvmTest/java/okhttp3/WholeOperationTimeoutTest.java @@ -122,8 +122,9 @@ public final class WholeOperationTimeoutTest { } @Test public void timeoutProcessing() throws Exception { - server.enqueue(new MockResponse() - .setHeadersDelay(500, TimeUnit.MILLISECONDS)); + server.enqueue(new MockResponse.Builder() + .headersDelay(500, TimeUnit.MILLISECONDS) + .build()); Request request = new Request.Builder() .url(server.url("/")) @@ -141,8 +142,9 @@ public final class WholeOperationTimeoutTest { } @Test public void timeoutProcessingWithEnqueue() throws Exception { - server.enqueue(new MockResponse() - .setHeadersDelay(500, TimeUnit.MILLISECONDS)); + server.enqueue(new MockResponse.Builder() + .headersDelay(500, TimeUnit.MILLISECONDS) + .build()); Request request = new Request.Builder() .url(server.url("/")) @@ -171,8 +173,9 @@ public final class WholeOperationTimeoutTest { } @Test public void timeoutReadingResponse() throws Exception { - server.enqueue(new MockResponse() - .setBody(BIG_ENOUGH_BODY)); + server.enqueue(new MockResponse.Builder() + .body(BIG_ENOUGH_BODY) + .build()); Request request = new Request.Builder() .url(server.url("/")) @@ -192,8 +195,9 @@ public final class WholeOperationTimeoutTest { } @Test public void timeoutReadingResponseWithEnqueue() throws Exception { - server.enqueue(new MockResponse() - .setBody(BIG_ENOUGH_BODY)); + server.enqueue(new MockResponse.Builder() + .body(BIG_ENOUGH_BODY) + .build()); Request request = new Request.Builder() .url(server.url("/")) @@ -232,26 +236,31 @@ public final class WholeOperationTimeoutTest { } @Test public void singleTimeoutForAllFollowUpRequests() throws Exception { - server.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_MOVED_TEMP) .setHeader("Location", "/b") - .setHeadersDelay(100, TimeUnit.MILLISECONDS)); - server.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) + .headersDelay(100, TimeUnit.MILLISECONDS) + .build()); + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_MOVED_TEMP) .setHeader("Location", "/c") - .setHeadersDelay(100, TimeUnit.MILLISECONDS)); - server.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) + .headersDelay(100, TimeUnit.MILLISECONDS) + .build()); + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_MOVED_TEMP) .setHeader("Location", "/d") - .setHeadersDelay(100, TimeUnit.MILLISECONDS)); - server.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) + .headersDelay(100, TimeUnit.MILLISECONDS) + .build()); + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_MOVED_TEMP) .setHeader("Location", "/e") - .setHeadersDelay(100, TimeUnit.MILLISECONDS)); - server.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) + .headersDelay(100, TimeUnit.MILLISECONDS) + .build()); + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_MOVED_TEMP) .setHeader("Location", "/f") - .setHeadersDelay(100, TimeUnit.MILLISECONDS)); + .headersDelay(100, TimeUnit.MILLISECONDS) + .build()); server.enqueue(new MockResponse()); Request request = new Request.Builder() @@ -273,12 +282,14 @@ public final class WholeOperationTimeoutTest { public void timeoutFollowingRedirectOnNewConnection() throws Exception { MockWebServer otherServer = new MockWebServer(); - server.enqueue( - new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) - .setHeader("Location", otherServer.url("/"))); + server.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_MOVED_TEMP) + .setHeader("Location", otherServer.url("/")) + .build()); - otherServer.enqueue(new MockResponse().setHeadersDelay(500, TimeUnit.MILLISECONDS)); + otherServer.enqueue(new MockResponse.Builder() + .headersDelay(500, TimeUnit.MILLISECONDS) + .build()); Request request = new Request.Builder().url(server.url("/")).build(); @@ -297,9 +308,10 @@ public final class WholeOperationTimeoutTest { @Test public void noTimeout() throws Exception { // Flaky https://github.com/square/okhttp/issues/5304 - server.enqueue(new MockResponse() - .setHeadersDelay(250, TimeUnit.MILLISECONDS) - .setBody(BIG_ENOUGH_BODY)); + server.enqueue(new MockResponse.Builder() + .headersDelay(250, TimeUnit.MILLISECONDS) + .body(BIG_ENOUGH_BODY) + .build()); Request request = new Request.Builder() .url(server.url("/")) diff --git a/okhttp/src/jvmTest/java/okhttp3/internal/http/CancelTest.kt b/okhttp/src/jvmTest/java/okhttp3/internal/http/CancelTest.kt index 64424e7fb..0b6fe4221 100644 --- a/okhttp/src/jvmTest/java/okhttp3/internal/http/CancelTest.kt +++ b/okhttp/src/jvmTest/java/okhttp3/internal/http/CancelTest.kt @@ -180,13 +180,14 @@ class CancelTest { setUp(mode) val responseBodySize = 8 * 1024 * 1024 // 8 MiB. server.enqueue( - MockResponse() - .setBody( + MockResponse.Builder() + .body( Buffer() .write(ByteArray(responseBodySize)) ) - .throttleBody(64 * 1024, 125, MILLISECONDS) - ) // 500 Kbps + .throttleBody(64 * 1024, 125, MILLISECONDS) // 500 Kbps + .build() + ) val call = client.newCall(Request(server.url("/"))) val response = call.execute() cancelLater(call, 500) @@ -209,17 +210,15 @@ class CancelTest { setUp(mode) val responseBodySize = 8 * 1024 * 1024 // 8 MiB. server.enqueue( - MockResponse() - .setBody( + MockResponse.Builder() + .body( Buffer() .write(ByteArray(responseBodySize)) ) - .throttleBody(64 * 1024, 125, MILLISECONDS) - ) // 500 Kbps - server.enqueue(MockResponse().apply { - setResponseCode(200) - setBody(".") - }) + .throttleBody(64 * 1024, 125, MILLISECONDS) // 500 Kbps + .build() + ) + server.enqueue(MockResponse(body = ".")) val call = client.newCall(Request.Builder().url(server.url("/")).build()) val response = call.execute() diff --git a/okhttp/src/jvmTest/java/okhttp3/internal/http2/HttpOverHttp2Test.kt b/okhttp/src/jvmTest/java/okhttp3/internal/http2/HttpOverHttp2Test.kt index 77ea66306..ea8c1f730 100644 --- a/okhttp/src/jvmTest/java/okhttp3/internal/http2/HttpOverHttp2Test.kt +++ b/okhttp/src/jvmTest/java/okhttp3/internal/http2/HttpOverHttp2Test.kt @@ -156,11 +156,7 @@ class HttpOverHttp2Test { @ArgumentsSource(ProtocolParamProvider::class) fun get(protocol: Protocol, mockWebServer: MockWebServer) { setUp(protocol, mockWebServer) - server.enqueue( - MockResponse() - .setBody("ABCDE") - .setStatus("HTTP/1.1 200 Sweet") - ) + server.enqueue(MockResponse(body = "ABCDE")) val call = client.newCall(Request(server.url("/foo"))) val response = call.execute() assertThat(response.body.string()).isEqualTo("ABCDE") @@ -176,9 +172,10 @@ class HttpOverHttp2Test { @ParameterizedTest @ArgumentsSource(ProtocolParamProvider::class) fun get204Response(protocol: Protocol, mockWebServer: MockWebServer) { setUp(protocol, mockWebServer) - val responseWithoutBody = MockResponse() - responseWithoutBody.status = "HTTP/1.1 204" - responseWithoutBody.removeHeader("Content-Length") + val responseWithoutBody = MockResponse.Builder() + .status("HTTP/1.1 204") + .removeHeader("Content-Length") + .build() server.enqueue(responseWithoutBody) val call = client.newCall(Request(server.url("/foo"))) val response = call.execute() @@ -197,8 +194,10 @@ class HttpOverHttp2Test { @ParameterizedTest @ArgumentsSource(ProtocolParamProvider::class) fun head(protocol: Protocol, mockWebServer: MockWebServer) { setUp(protocol, mockWebServer) - val mockResponse = MockResponse().setHeader("Content-Length", 5) - mockResponse.status = "HTTP/1.1 200" + val mockResponse = MockResponse.Builder() + .setHeader("Content-Length", 5) + .status("HTTP/1.1 200") + .build() server.enqueue(mockResponse) val call = client.newCall( Request.Builder() @@ -232,7 +231,7 @@ class HttpOverHttp2Test { fun noDefaultContentLengthOnStreamingPost(protocol: Protocol, mockWebServer: MockWebServer) { setUp(protocol, mockWebServer) val postBytes = "FGHIJ".toByteArray() - server.enqueue(MockResponse().setBody("ABCDE")) + server.enqueue(MockResponse(body = "ABCDE")) val call = client.newCall( Request( url = server.url("/foo"), @@ -257,7 +256,7 @@ class HttpOverHttp2Test { fun userSuppliedContentLengthHeader(protocol: Protocol, mockWebServer: MockWebServer) { setUp(protocol, mockWebServer) val postBytes = "FGHIJ".toByteArray() - server.enqueue(MockResponse().setBody("ABCDE")) + server.enqueue(MockResponse(body = "ABCDE")) val call = client.newCall( Request( url = server.url("/foo"), @@ -288,7 +287,7 @@ class HttpOverHttp2Test { ) { setUp(protocol, mockWebServer) val postBytes = "FGHIJ".toByteArray() - server.enqueue(MockResponse().setBody("ABCDE")) + server.enqueue(MockResponse(body = "ABCDE")) val call = client.newCall( Request( url = server.url("/foo"), @@ -317,8 +316,8 @@ class HttpOverHttp2Test { @ParameterizedTest @ArgumentsSource(ProtocolParamProvider::class) fun connectionReuse(protocol: Protocol, mockWebServer: MockWebServer) { setUp(protocol, mockWebServer) - server.enqueue(MockResponse().setBody("ABCDEF")) - server.enqueue(MockResponse().setBody("GHIJKL")) + server.enqueue(MockResponse(body = "ABCDEF")) + server.enqueue(MockResponse(body = "GHIJKL")) val call1 = client.newCall(Request(server.url("/r1"))) val call2 = client.newCall(Request(server.url("/r1"))) val response1 = call1.execute() @@ -337,12 +336,12 @@ class HttpOverHttp2Test { fun connectionWindowUpdateAfterCanceling(protocol: Protocol, mockWebServer: MockWebServer) { setUp(protocol, mockWebServer) server.enqueue( - MockResponse() - .setBody(Buffer().write(ByteArray(Http2Connection.OKHTTP_CLIENT_WINDOW_SIZE + 1))) + MockResponse.Builder() + .body(Buffer().write(ByteArray(Http2Connection.OKHTTP_CLIENT_WINDOW_SIZE + 1))) + .build() ) server.enqueue( - MockResponse() - .setBody("abc") + MockResponse(body = "abc") ) val call1 = client.newCall(Request(server.url("/"))) val response1 = call1.execute() @@ -375,17 +374,16 @@ class HttpOverHttp2Test { fun connectionWindowUpdateOnClose(protocol: Protocol, mockWebServer: MockWebServer) { setUp(protocol, mockWebServer) server.enqueue( - MockResponse() - .setBody(Buffer().write(ByteArray(Http2Connection.OKHTTP_CLIENT_WINDOW_SIZE + 1))) + MockResponse.Builder() + .body(Buffer().write(ByteArray(Http2Connection.OKHTTP_CLIENT_WINDOW_SIZE + 1))) + .build() ) server.enqueue( - MockResponse() - .setBody("abc") + MockResponse(body = "abc") ) // Enqueue an additional response that show if we burnt a good prior response. server.enqueue( - MockResponse() - .setBody("XXX") + MockResponse(body = "XXX") ) val call1 = client.newCall(Request(server.url("/"))) val response1 = call1.execute() @@ -406,12 +404,12 @@ class HttpOverHttp2Test { ) { setUp(protocol, mockWebServer) server.enqueue( - MockResponse() - .setBody(Buffer().write(ByteArray(Http2Connection.OKHTTP_CLIENT_WINDOW_SIZE))) + MockResponse.Builder() + .body(Buffer().write(ByteArray(Http2Connection.OKHTTP_CLIENT_WINDOW_SIZE))) + .build() ) server.enqueue( - MockResponse() - .setBody("abc") + MockResponse(body = "abc") ) val call1 = client.newCall(Request(server.url("/"))) val response1 = call1.execute() @@ -439,8 +437,8 @@ class HttpOverHttp2Test { @Disabled fun synchronousRequest(protocol: Protocol, mockWebServer: MockWebServer) { setUp(protocol, mockWebServer) - server.enqueue(MockResponse().setBody("A")) - server.enqueue(MockResponse().setBody("A")) + server.enqueue(MockResponse(body = "A")) + server.enqueue(MockResponse(body = "A")) val executor = Executors.newCachedThreadPool() val countDownLatch = CountDownLatch(2) executor.execute(AsyncRequest("/r1", countDownLatch)) @@ -454,9 +452,10 @@ class HttpOverHttp2Test { fun gzippedResponseBody(protocol: Protocol, mockWebServer: MockWebServer) { setUp(protocol, mockWebServer) server.enqueue( - MockResponse() + MockResponse.Builder() .addHeader("Content-Encoding: gzip") - .setBody(gzip("ABCABCABC")) + .body(gzip("ABCABCABC")) + .build() ) val call = client.newCall(Request(server.url("/r1"))) val response = call.execute() @@ -467,14 +466,14 @@ class HttpOverHttp2Test { fun authenticate(protocol: Protocol, mockWebServer: MockWebServer) { setUp(protocol, mockWebServer) server.enqueue( - MockResponse() - .setResponseCode(HttpURLConnection.HTTP_UNAUTHORIZED) - .addHeader("www-authenticate: Basic realm=\"protected area\"") - .setBody("Please authenticate.") + MockResponse( + code = HttpURLConnection.HTTP_UNAUTHORIZED, + headers = headersOf("www-authenticate", "Basic realm=\"protected area\""), + body = "Please authenticate.", + ) ) server.enqueue( - MockResponse() - .setBody("Successful auth!") + MockResponse(body = "Successful auth!") ) val credential = basic("username", "password") client = client.newBuilder() @@ -494,11 +493,13 @@ class HttpOverHttp2Test { fun redirect(protocol: Protocol, mockWebServer: MockWebServer) { setUp(protocol, mockWebServer) server.enqueue( - MockResponse().setResponseCode(HttpURLConnection.HTTP_MOVED_TEMP) - .addHeader("Location: /foo") - .setBody("This page has moved!") + MockResponse( + code = HttpURLConnection.HTTP_MOVED_TEMP, + headers = headersOf("Location", "/foo"), + body = "This page has moved!", + ) ) - server.enqueue(MockResponse().setBody("This is the new location!")) + server.enqueue(MockResponse(body = "This is the new location!")) val call = client.newCall(Request(server.url("/"))) val response = call.execute() assertThat(response.body.string()).isEqualTo("This is the new location!") @@ -511,7 +512,7 @@ class HttpOverHttp2Test { @ParameterizedTest @ArgumentsSource(ProtocolParamProvider::class) fun readAfterLastByte(protocol: Protocol, mockWebServer: MockWebServer) { setUp(protocol, mockWebServer) - server.enqueue(MockResponse().setBody("ABC")) + server.enqueue(MockResponse(body = "ABC")) val call = client.newCall(Request(server.url("/"))) val response = call.execute() val inputStream = response.body.byteStream() @@ -526,8 +527,8 @@ class HttpOverHttp2Test { @ParameterizedTest @ArgumentsSource(ProtocolParamProvider::class) fun readResponseHeaderTimeout(protocol: Protocol, mockWebServer: MockWebServer) { setUp(protocol, mockWebServer) - server.enqueue(MockResponse().setSocketPolicy(SocketPolicy.NO_RESPONSE)) - server.enqueue(MockResponse().setBody("A")) + server.enqueue(MockResponse(socketPolicy = SocketPolicy.NO_RESPONSE)) + server.enqueue(MockResponse(body = "A")) client = client.newBuilder() .readTimeout(Duration.ofSeconds(1)) .build() @@ -562,8 +563,10 @@ class HttpOverHttp2Test { val body = CharArray(4096) // 4KiB to read. Arrays.fill(body, 'y') server.enqueue( - MockResponse().setBody(String(body)) + MockResponse.Builder() + .body(String(body)) .throttleBody(1024, 1, TimeUnit.SECONDS) // Slow connection 1KiB/second. + .build() ) client = client.newBuilder() .readTimeout(Duration.ofSeconds(2)) @@ -584,13 +587,13 @@ class HttpOverHttp2Test { setUp(protocol, mockWebServer) val body = repeat('y', 2048) server.enqueue( - MockResponse() - .setBody(body) + MockResponse.Builder() + .body(body) .throttleBody(1024, 1, TimeUnit.SECONDS) + .build() ) // Slow connection 1KiB/second. server.enqueue( - MockResponse() - .setBody(body) + MockResponse(body = body) ) client = client.newBuilder() .readTimeout(Duration.ofMillis(500)) // Half a second to read something. @@ -620,9 +623,10 @@ class HttpOverHttp2Test { fun connectionTimeout(protocol: Protocol, mockWebServer: MockWebServer) { setUp(protocol, mockWebServer) server.enqueue( - MockResponse() - .setBody("A") - .setBodyDelay(1, TimeUnit.SECONDS) + MockResponse.Builder() + .body("A") + .bodyDelay(1, TimeUnit.SECONDS) + .build() ) val client1 = client.newBuilder() .readTimeout(Duration.ofSeconds(2)) @@ -662,9 +666,10 @@ class HttpOverHttp2Test { .cache(cache) .build() server.enqueue( - MockResponse() - .addHeader("cache-control: max-age=60") - .setBody("A") + MockResponse( + headers = headersOf("cache-control", "max-age=60"), + body = "A", + ) ) val call1 = client.newCall(Request(server.url("/"))) val response1 = call1.execute() @@ -690,13 +695,13 @@ class HttpOverHttp2Test { .cache(cache) .build() server.enqueue( - MockResponse() - .addHeader("ETag: v1") - .setBody("A") + MockResponse( + headers = headersOf("ETag", "v1"), + body = "A", + ) ) server.enqueue( - MockResponse() - .setResponseCode(HttpURLConnection.HTTP_NOT_MODIFIED) + MockResponse(code = HttpURLConnection.HTTP_NOT_MODIFIED) ) val call1 = client.newCall(Request(server.url("/"))) val response1 = call1.execute() @@ -719,14 +724,16 @@ class HttpOverHttp2Test { .cache(cache) .build() server.enqueue( - MockResponse() - .addHeader("cache-control: max-age=60") - .setBody("ABCD") + MockResponse( + headers = headersOf("cache-control", "max-age=60"), + body = "ABCD", + ) ) server.enqueue( - MockResponse() - .addHeader("cache-control: max-age=60") - .setBody("EFGH") + MockResponse( + headers = headersOf("cache-control", "max-age=60"), + body = "EFGH", + ) ) val call1 = client.newCall(Request(server.url("/"))) val response1 = call1.execute() @@ -767,8 +774,7 @@ class HttpOverHttp2Test { .cookieJar(cookieJar) .build() server.enqueue( - MockResponse() - .addHeader("set-cookie: a=b") + MockResponse(headers = headersOf("set-cookie", "a=b")) ) val call = client.newCall(Request(server.url("/"))) val response = call.execute() @@ -779,14 +785,8 @@ class HttpOverHttp2Test { @ParameterizedTest @ArgumentsSource(ProtocolParamProvider::class) fun cancelWithStreamNotCompleted(protocol: Protocol, mockWebServer: MockWebServer) { setUp(protocol, mockWebServer) - server.enqueue( - MockResponse() - .setBody("abc") - ) - server.enqueue( - MockResponse() - .setBody("def") - ) + server.enqueue(MockResponse(body = "abc")) + server.enqueue(MockResponse(body = "def")) // Disconnect before the stream is created. A connection is still established! val call1 = client.newCall(Request(server.url("/"))) @@ -810,14 +810,12 @@ class HttpOverHttp2Test { ) { setUp(protocol, mockWebServer) server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.RESET_STREAM_AT_START) - .setHttp2ErrorCode(ErrorCode.REFUSED_STREAM.httpCode) - ) - server.enqueue( - MockResponse() - .setBody("abc") + MockResponse( + socketPolicy = SocketPolicy.RESET_STREAM_AT_START, + http2ErrorCode = ErrorCode.REFUSED_STREAM.httpCode, + ) ) + server.enqueue(MockResponse(body = "abc")) val call = client.newCall(Request(server.url("/"))) try { call.execute() @@ -836,14 +834,12 @@ class HttpOverHttp2Test { .dns(DoubleInetAddressDns()) // Two routes! .build() server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.RESET_STREAM_AT_START) - .setHttp2ErrorCode(ErrorCode.REFUSED_STREAM.httpCode) - ) - server.enqueue( - MockResponse() - .setBody("abc") + MockResponse( + socketPolicy = SocketPolicy.RESET_STREAM_AT_START, + http2ErrorCode = ErrorCode.REFUSED_STREAM.httpCode, + ) ) + server.enqueue(MockResponse(body = "abc")) val request = Request(server.url("/")) val response = client.newCall(request).execute() @@ -865,19 +861,22 @@ class HttpOverHttp2Test { .dns(DoubleInetAddressDns()) // Two routes! .build() server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.RESET_STREAM_AT_START) - .setHttp2ErrorCode(ErrorCode.REFUSED_STREAM.httpCode) + MockResponse( + socketPolicy = SocketPolicy.RESET_STREAM_AT_START, + http2ErrorCode = ErrorCode.REFUSED_STREAM.httpCode, + ) ) server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.RESET_STREAM_AT_START) - .setHttp2ErrorCode(ErrorCode.REFUSED_STREAM.httpCode) + MockResponse( + socketPolicy = SocketPolicy.RESET_STREAM_AT_START, + http2ErrorCode = ErrorCode.REFUSED_STREAM.httpCode, + ) ) server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.RESET_STREAM_AT_START) - .setHttp2ErrorCode(ErrorCode.REFUSED_STREAM.httpCode) + MockResponse( + socketPolicy = SocketPolicy.RESET_STREAM_AT_START, + http2ErrorCode = ErrorCode.REFUSED_STREAM.httpCode, + ) ) val request = Request(server.url("/")) @@ -898,14 +897,12 @@ class HttpOverHttp2Test { ) { setUp(protocol, mockWebServer) server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.RESET_STREAM_AT_START) - .setHttp2ErrorCode(ErrorCode.REFUSED_STREAM.httpCode) - ) - server.enqueue( - MockResponse() - .setBody("abc") + MockResponse( + socketPolicy = SocketPolicy.RESET_STREAM_AT_START, + http2ErrorCode = ErrorCode.REFUSED_STREAM.httpCode, + ) ) + server.enqueue(MockResponse(body = "abc")) val request = Request(server.url("/")) // First call fails because it only has one route. @@ -929,23 +926,19 @@ class HttpOverHttp2Test { ) { setUp(protocol, mockWebServer) server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.RESET_STREAM_AT_START) - .setHttp2ErrorCode(ErrorCode.REFUSED_STREAM.httpCode) + MockResponse( + socketPolicy = SocketPolicy.RESET_STREAM_AT_START, + http2ErrorCode = ErrorCode.REFUSED_STREAM.httpCode, + ) ) server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.RESET_STREAM_AT_START) - .setHttp2ErrorCode(ErrorCode.REFUSED_STREAM.httpCode) - ) - server.enqueue( - MockResponse() - .setBody("abc") - ) - server.enqueue( - MockResponse() - .setBody("def") + MockResponse( + socketPolicy = SocketPolicy.RESET_STREAM_AT_START, + http2ErrorCode = ErrorCode.REFUSED_STREAM.httpCode, + ) ) + server.enqueue(MockResponse(body = "abc")) + server.enqueue(MockResponse(body = "def")) val request = Request(server.url("/")) // First call makes a new connection and fails because it is the only route. @@ -979,18 +972,19 @@ class HttpOverHttp2Test { fun noRecoveryFromTwoRefusedStreams(protocol: Protocol, mockWebServer: MockWebServer) { setUp(protocol, mockWebServer) server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.RESET_STREAM_AT_START) - .setHttp2ErrorCode(ErrorCode.REFUSED_STREAM.httpCode) + MockResponse( + socketPolicy = SocketPolicy.RESET_STREAM_AT_START, + http2ErrorCode = ErrorCode.REFUSED_STREAM.httpCode, + ) ) server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.RESET_STREAM_AT_START) - .setHttp2ErrorCode(ErrorCode.REFUSED_STREAM.httpCode) + MockResponse( + socketPolicy = SocketPolicy.RESET_STREAM_AT_START, + http2ErrorCode = ErrorCode.REFUSED_STREAM.httpCode, + ) ) server.enqueue( - MockResponse() - .setBody("abc") + MockResponse(body = "abc") ) val call = client.newCall(Request(server.url("/"))) try { @@ -1019,14 +1013,12 @@ class HttpOverHttp2Test { private fun recoverFromOneHttp2ErrorRequiresNewConnection(errorCode: ErrorCode?) { server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.RESET_STREAM_AT_START) - .setHttp2ErrorCode(errorCode!!.httpCode) - ) - server.enqueue( - MockResponse() - .setBody("abc") + MockResponse( + socketPolicy = SocketPolicy.RESET_STREAM_AT_START, + http2ErrorCode = errorCode!!.httpCode, + ) ) + server.enqueue(MockResponse(body = "abc")) client = client.newBuilder() .dns(DoubleInetAddressDns()) .build() @@ -1046,19 +1038,18 @@ class HttpOverHttp2Test { ) { setUp(protocol, mockWebServer) server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.RESET_STREAM_AT_START) - .setHttp2ErrorCode(ErrorCode.REFUSED_STREAM.httpCode) + MockResponse( + socketPolicy = SocketPolicy.RESET_STREAM_AT_START, + http2ErrorCode = ErrorCode.REFUSED_STREAM.httpCode, + ) ) server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.RESET_STREAM_AT_START) - .setHttp2ErrorCode(ErrorCode.REFUSED_STREAM.httpCode) - ) - server.enqueue( - MockResponse() - .setBody("abc") + MockResponse( + socketPolicy = SocketPolicy.RESET_STREAM_AT_START, + http2ErrorCode = ErrorCode.REFUSED_STREAM.httpCode, + ) ) + server.enqueue(MockResponse(body = "abc")) client = client.newBuilder() .dns(DoubleInetAddressDns()) .build() @@ -1087,13 +1078,13 @@ class HttpOverHttp2Test { ) val dispatcher = RespondAfterCancelDispatcher(responseDequeuedLatches, requestCanceledLatches) dispatcher.enqueueResponse( - MockResponse() - .setBodyDelay(10, TimeUnit.SECONDS) - .setBody("abc") + MockResponse.Builder() + .bodyDelay(10, TimeUnit.SECONDS) + .body("abc") + .build() ) dispatcher.enqueueResponse( - MockResponse() - .setBody("def") + MockResponse(body = "def") ) server.dispatcher = dispatcher client = client.newBuilder() @@ -1123,18 +1114,19 @@ class HttpOverHttp2Test { ) val dispatcher = RespondAfterCancelDispatcher(responseDequeuedLatches, requestCanceledLatches) dispatcher.enqueueResponse( - MockResponse() - .setBodyDelay(10, TimeUnit.SECONDS) - .setBody("abc") + MockResponse.Builder() + .bodyDelay(10, TimeUnit.SECONDS) + .body("abc") + .build() ) dispatcher.enqueueResponse( - MockResponse() - .setBodyDelay(10, TimeUnit.SECONDS) - .setBody("def") + MockResponse.Builder() + .bodyDelay(10, TimeUnit.SECONDS) + .body("def") + .build() ) dispatcher.enqueueResponse( - MockResponse() - .setBody("ghi") + MockResponse(body = "ghi") ) server.dispatcher = dispatcher client = client.newBuilder() @@ -1222,14 +1214,12 @@ class HttpOverHttp2Test { private fun noRecoveryFromErrorWithRetryDisabled(errorCode: ErrorCode?) { server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.RESET_STREAM_AT_START) - .setHttp2ErrorCode(errorCode!!.httpCode) - ) - server.enqueue( - MockResponse() - .setBody("abc") + MockResponse( + socketPolicy = SocketPolicy.RESET_STREAM_AT_START, + http2ErrorCode = errorCode!!.httpCode, + ) ) + server.enqueue(MockResponse(body = "abc")) client = client.newBuilder() .retryOnConnectionFailure(false) .build() @@ -1247,28 +1237,21 @@ class HttpOverHttp2Test { protocol: Protocol, mockWebServer: MockWebServer ) { setUp(protocol, mockWebServer) + server.enqueue(MockResponse(code = 401)) server.enqueue( - MockResponse() - .setResponseCode(401) + MockResponse( + socketPolicy = SocketPolicy.RESET_STREAM_AT_START, + http2ErrorCode = ErrorCode.INTERNAL_ERROR.httpCode, + ) ) + server.enqueue(MockResponse(body = "DEF")) server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.RESET_STREAM_AT_START) - .setHttp2ErrorCode(ErrorCode.INTERNAL_ERROR.httpCode) - ) - server.enqueue( - MockResponse() - .setBody("DEF") - ) - server.enqueue( - MockResponse() - .setResponseCode(301) - .addHeader("Location", "/foo") - ) - server.enqueue( - MockResponse() - .setBody("ABC") + MockResponse( + code = 301, + headers = headersOf("Location", "/foo") + ) ) + server.enqueue(MockResponse(body = "ABC")) val latch = CountDownLatch(1) val responses: BlockingQueue = SynchronousQueue() val authenticator = okhttp3.Authenticator { route: Route?, response: Response? -> @@ -1321,9 +1304,10 @@ class HttpOverHttp2Test { fun nonAsciiResponseHeader(protocol: Protocol, mockWebServer: MockWebServer) { setUp(protocol, mockWebServer) server.enqueue( - MockResponse() + MockResponse.Builder() .addHeaderLenient("Alpha", "α") .addHeaderLenient("β", "Beta") + .build() ) val call = client.newCall(Request(server.url("/"))) val response = call.execute() @@ -1337,13 +1321,13 @@ class HttpOverHttp2Test { setUp(protocol, mockWebServer) val pushPromise = PushPromise( "GET", "/foo/bar", headersOf("foo", "bar"), - MockResponse().setBody("bar").setStatus("HTTP/1.1 200 Sweet") + MockResponse(body = "bar") ) server.enqueue( - MockResponse() - .setBody("ABCDE") - .setStatus("HTTP/1.1 200 Sweet") - .withPush(pushPromise) + MockResponse.Builder() + .body("ABCDE") + .addPush(pushPromise) + .build() ) val call = client.newCall(Request(server.url("/foo"))) val response = call.execute() @@ -1366,13 +1350,13 @@ class HttpOverHttp2Test { setUp(protocol, mockWebServer) val pushPromise = PushPromise( "HEAD", "/foo/bar", headersOf("foo", "bar"), - MockResponse().setStatus("HTTP/1.1 204 Sweet") + MockResponse(code = 204) ) server.enqueue( - MockResponse() - .setBody("ABCDE") - .setStatus("HTTP/1.1 200 Sweet") - .withPush(pushPromise) + MockResponse.Builder() + .body("ABCDE") + .addPush(pushPromise) + .build() ) val call = client.newCall(Request(server.url("/foo"))) val response = call.execute() @@ -1395,10 +1379,7 @@ class HttpOverHttp2Test { @ParameterizedTest @ArgumentsSource(ProtocolParamProvider::class) fun noDataFramesSentWithNullRequestBody(protocol: Protocol, mockWebServer: MockWebServer) { setUp(protocol, mockWebServer) - server.enqueue( - MockResponse() - .setBody("ABC") - ) + server.enqueue(MockResponse(body = "ABC")) val call = client.newCall( Request.Builder() .url(server.url("/")) @@ -1417,10 +1398,7 @@ class HttpOverHttp2Test { @ParameterizedTest @ArgumentsSource(ProtocolParamProvider::class) fun emptyDataFrameSentWithEmptyBody(protocol: Protocol, mockWebServer: MockWebServer) { setUp(protocol, mockWebServer) - server.enqueue( - MockResponse() - .setBody("ABC") - ) + server.enqueue(MockResponse(body = "ABC")) val call = client.newCall( Request.Builder() .url(server.url("/")) @@ -1453,9 +1431,10 @@ class HttpOverHttp2Test { // Delay the response to give 1 ping enough time to be sent and replied to. server.enqueue( - MockResponse() - .setBodyDelay(750, TimeUnit.MILLISECONDS) - .setBody("ABC") + MockResponse.Builder() + .bodyDelay(750, TimeUnit.MILLISECONDS) + .body("ABC") + .build() ) val call = client.newCall(Request(server.url("/"))) val response = call.execute() @@ -1491,10 +1470,7 @@ class HttpOverHttp2Test { .build() // Set up the server to ignore the socket. It won't respond to pings! - server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.STALL_SOCKET_AT_START) - ) + server.enqueue(MockResponse(socketPolicy = SocketPolicy.STALL_SOCKET_AT_START)) // Make a call. It'll fail as soon as our pings detect a problem. val call = client.newCall(Request(server.url("/"))) @@ -1528,15 +1504,11 @@ class HttpOverHttp2Test { .build() // Stalling the socket will cause TWO requests to time out! - server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.STALL_SOCKET_AT_START) - ) + server.enqueue(MockResponse(socketPolicy = SocketPolicy.STALL_SOCKET_AT_START)) // The 3rd request should be sent to a fresh connection. server.enqueue( - MockResponse() - .setBody("fresh connection") + MockResponse(body = "fresh connection") ) // The first call times out. @@ -1573,18 +1545,13 @@ class HttpOverHttp2Test { .readTimeout(Duration.ofMillis(500)) .build() server.enqueue( - MockResponse() - .setBodyDelay(1000, TimeUnit.MILLISECONDS) - .setBody("a") - ) - server.enqueue( - MockResponse() - .setBody("b") - ) - server.enqueue( - MockResponse() - .setBody("c") + MockResponse.Builder() + .bodyDelay(1000, TimeUnit.MILLISECONDS) + .body("a") + .build() ) + server.enqueue(MockResponse(body = "b")) + server.enqueue(MockResponse(body = "c")) // The first call times out. val call1 = client.newCall(Request(server.url("/"))) @@ -1649,21 +1616,20 @@ class HttpOverHttp2Test { settings[Settings.MAX_CONCURRENT_STREAMS] = 2 // Read & write a full request to confirm settings are accepted. - server.enqueue(MockResponse().withSettings(settings)) + server.enqueue(MockResponse.Builder() + .settings(settings) + .build()) val call = client.newCall(Request(server.url("/"))) val response = call.execute() assertThat(response.body.string()).isEqualTo("") server.enqueue( - MockResponse() - .setBody("ABC") + MockResponse(body = "ABC") ) server.enqueue( - MockResponse() - .setBody("DEF") + MockResponse(body = "DEF") ) server.enqueue( - MockResponse() - .setBody("GHI") + MockResponse(body = "GHI") ) val call1 = client.newCall(Request(server.url("/"))) val response1 = call1.execute() @@ -1688,18 +1654,15 @@ class HttpOverHttp2Test { fun connectionNotReusedAfterShutdown(protocol: Protocol, mockWebServer: MockWebServer) { setUp(protocol, mockWebServer) server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.DISCONNECT_AT_END) - .setBody("ABC") - ) - server.enqueue( - MockResponse() - .setBody("DEF") + MockResponse( + body = "ABC", + socketPolicy = SocketPolicy.DISCONNECT_AT_END, + ) ) + server.enqueue(MockResponse(body = "DEF")) // Enqueue an additional response that show if we burnt a good prior response. server.enqueue( - MockResponse() - .setBody("XXX") + MockResponse(body = "XXX") ) val connections: MutableList = ArrayList() val localClient = client.newBuilder().eventListener(object : EventListener() { @@ -1741,14 +1704,12 @@ class HttpOverHttp2Test { fun connectionShutdownAfterHealthCheck(protocol: Protocol, mockWebServer: MockWebServer) { setUp(protocol, mockWebServer) server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.DISCONNECT_AT_END) - .setBody("ABC") - ) - server.enqueue( - MockResponse() - .setBody("DEF") + MockResponse( + body = "ABC", + socketPolicy = SocketPolicy.DISCONNECT_AT_END, + ) ) + server.enqueue(MockResponse(body = "DEF")) val client2 = client.newBuilder() .addNetworkInterceptor(object : Interceptor { var executedCall = false @@ -1783,14 +1744,16 @@ class HttpOverHttp2Test { fun responseHeadersAfterGoaway(protocol: Protocol, mockWebServer: MockWebServer) { setUp(protocol, mockWebServer) server.enqueue( - MockResponse() - .setHeadersDelay(1, TimeUnit.SECONDS) - .setBody("ABC") + MockResponse.Builder() + .headersDelay(1, TimeUnit.SECONDS) + .body("ABC") + .build() ) server.enqueue( - MockResponse() - .setSocketPolicy(SocketPolicy.DISCONNECT_AT_END) - .setBody("DEF") + MockResponse( + body = "DEF", + socketPolicy = SocketPolicy.DISCONNECT_AT_END, + ) ) val latch = CountDownLatch(2) val errors = ArrayList() @@ -1840,22 +1803,10 @@ class HttpOverHttp2Test { assumeTrue(protocol === Protocol.HTTP_2) server.useHttps(handshakeCertificates.sslSocketFactory()) val queueDispatcher = QueueDispatcher() - queueDispatcher.enqueueResponse( - MockResponse() - .inTunnel() - ) - queueDispatcher.enqueueResponse( - MockResponse() - .inTunnel() - ) - queueDispatcher.enqueueResponse( - MockResponse() - .setBody("call2 response") - ) - queueDispatcher.enqueueResponse( - MockResponse() - .setBody("call1 response") - ) + queueDispatcher.enqueueResponse(MockResponse(inTunnel = true)) + queueDispatcher.enqueueResponse(MockResponse(inTunnel = true)) + queueDispatcher.enqueueResponse(MockResponse(body = "call2 response")) + queueDispatcher.enqueueResponse(MockResponse(body = "call1 response")) // We use a re-entrant dispatcher to initiate one HTTPS connection while the other is in flight. server.dispatcher = object : Dispatcher() { @@ -2028,15 +1979,8 @@ class HttpOverHttp2Test { @ArgumentsSource(ProtocolParamProvider::class) fun http2WithProxy(protocol: Protocol, mockWebServer: MockWebServer) { setUp(protocol, mockWebServer) - server.enqueue( - MockResponse() - .inTunnel() - ) - server.enqueue( - MockResponse() - .setBody("ABCDE") - .setStatus("HTTP/1.1 200 Sweet") - ) + server.enqueue(MockResponse(inTunnel = true)) + server.enqueue(MockResponse(body = "ABCDE")) val client = client.newBuilder() .proxy(server.toProxyAddress()) .build() @@ -2070,19 +2014,14 @@ class HttpOverHttp2Test { fun proxyAuthenticateOnConnect(protocol: Protocol, mockWebServer: MockWebServer) { setUp(protocol, mockWebServer) server.enqueue( - MockResponse() - .inTunnel() - .setResponseCode(407) - .addHeader("Proxy-Authenticate: Basic realm=\"localhost\"") - ) - server.enqueue( - MockResponse() - .inTunnel() - ) - server.enqueue( - MockResponse() - .setBody("response body") + MockResponse( + code = 407, + headers = headersOf("Proxy-Authenticate", "Basic realm=\"localhost\""), + inTunnel = true, + ) ) + server.enqueue(MockResponse(inTunnel = true)) + server.enqueue(MockResponse(body = "response body")) val client = client.newBuilder() .proxy(server.toProxyAddress()) .proxyAuthenticator(RecordingOkAuthenticator("password", "Basic")) diff --git a/okhttp/src/jvmTest/java/okhttp3/internal/tls/CertificatePinnerChainValidationTest.java b/okhttp/src/jvmTest/java/okhttp3/internal/tls/CertificatePinnerChainValidationTest.java index 217d3af54..fc91f7a4b 100644 --- a/okhttp/src/jvmTest/java/okhttp3/internal/tls/CertificatePinnerChainValidationTest.java +++ b/okhttp/src/jvmTest/java/okhttp3/internal/tls/CertificatePinnerChainValidationTest.java @@ -101,8 +101,9 @@ public final class CertificatePinnerChainValidationTest { server.useHttps(serverHandshakeCertificates.sslSocketFactory()); // The request should complete successfully. - server.enqueue(new MockResponse() - .setBody("abc")); + server.enqueue(new MockResponse.Builder() + .body("abc") + .build()); Call call1 = client.newCall(new Request.Builder() .url(server.url("/")) .build()); @@ -149,9 +150,10 @@ public final class CertificatePinnerChainValidationTest { server.useHttps(serverHandshakeCertificates.sslSocketFactory()); // The request should complete successfully. - server.enqueue(new MockResponse() - .setBody("abc") - .setSocketPolicy(SocketPolicy.DISCONNECT_AT_END)); + server.enqueue(new MockResponse.Builder() + .body("abc") + .socketPolicy(SocketPolicy.DISCONNECT_AT_END) + .build()); Call call1 = client.newCall(new Request.Builder() .url(server.url("/")) .build()); @@ -163,9 +165,10 @@ public final class CertificatePinnerChainValidationTest { client.connectionPool().evictAll(); // Confirm that a second request also succeeds. This should detect caching problems. - server.enqueue(new MockResponse() - .setBody("def") - .setSocketPolicy(SocketPolicy.DISCONNECT_AT_END)); + server.enqueue(new MockResponse.Builder() + .body("def") + .socketPolicy(SocketPolicy.DISCONNECT_AT_END) + .build()); Call call2 = client.newCall(new Request.Builder() .url(server.url("/")) .build()); @@ -233,9 +236,10 @@ public final class CertificatePinnerChainValidationTest { compromisedIntermediateCa.certificate(), goodCertificate.certificate()); server.useHttps(socketFactory); - server.enqueue(new MockResponse() - .setBody("abc") - .addHeader("Content-Type: text/plain")); + server.enqueue(new MockResponse.Builder() + .body("abc") + .addHeader("Content-Type: text/plain") + .build()); // Make a request from client to server. It should succeed certificate checks (unfortunately the // rogue CA is trusted) but it should fail certificate pinning. @@ -312,9 +316,10 @@ public final class CertificatePinnerChainValidationTest { SSLSocketFactory socketFactory = newServerSocketFactory(rogueCertificate, goodIntermediateCa.certificate(), compromisedIntermediateCa.certificate()); server.useHttps(socketFactory); - server.enqueue(new MockResponse() - .setBody("abc") - .addHeader("Content-Type: text/plain")); + server.enqueue(new MockResponse.Builder() + .body("abc") + .addHeader("Content-Type: text/plain") + .build()); // Make a request from client to server. It should succeed certificate checks (unfortunately the // rogue CA is trusted) but it should fail certificate pinning. @@ -595,8 +600,9 @@ public final class CertificatePinnerChainValidationTest { server.useHttps(serverHandshakeCertificates.sslSocketFactory()); // The request should complete successfully. - server.enqueue(new MockResponse() - .setBody("abc")); + server.enqueue(new MockResponse.Builder() + .body("abc") + .build()); Call call1 = client.newCall(new Request.Builder() .url(server.url("/")) .build()); diff --git a/okhttp/src/jvmTest/java/okhttp3/internal/tls/ClientAuthTest.java b/okhttp/src/jvmTest/java/okhttp3/internal/tls/ClientAuthTest.java index f731f93f7..8d939283a 100644 --- a/okhttp/src/jvmTest/java/okhttp3/internal/tls/ClientAuthTest.java +++ b/okhttp/src/jvmTest/java/okhttp3/internal/tls/ClientAuthTest.java @@ -130,7 +130,9 @@ public final class ClientAuthTest { server.useHttps(socketFactory); server.requestClientAuth(); - server.enqueue(new MockResponse().setBody("abc")); + server.enqueue(new MockResponse.Builder() + .body("abc") + .build()); Call call = client.newCall(new Request.Builder().url(server.url("/")).build()); Response response = call.execute(); @@ -148,7 +150,9 @@ public final class ClientAuthTest { server.useHttps(socketFactory); server.requireClientAuth(); - server.enqueue(new MockResponse().setBody("abc")); + server.enqueue(new MockResponse.Builder() + .body("abc") + .build()); Call call = client.newCall(new Request.Builder().url(server.url("/")).build()); Response response = call.execute(); @@ -166,7 +170,9 @@ public final class ClientAuthTest { server.useHttps(socketFactory); server.noClientAuth(); - server.enqueue(new MockResponse().setBody("abc")); + server.enqueue(new MockResponse.Builder() + .body("abc") + .build()); Call call = client.newCall(new Request.Builder().url(server.url("/")).build()); Response response = call.execute(); @@ -183,7 +189,9 @@ public final class ClientAuthTest { server.useHttps(socketFactory); server.requestClientAuth(); - server.enqueue(new MockResponse().setBody("abc")); + server.enqueue(new MockResponse.Builder() + .body("abc") + .build()); Call call = client.newCall(new Request.Builder().url(server.url("/")).build()); Response response = call.execute(); @@ -282,7 +290,9 @@ public final class ClientAuthTest { } @Test public void invalidClientAuthEvents() throws Throwable { - server.enqueue(new MockResponse().setBody("abc")); + server.enqueue(new MockResponse.Builder() + .body("abc") + .build()); clientCert = new HeldCertificate.Builder() .signedBy(clientIntermediateCa) diff --git a/okhttp/src/jvmTest/java/okhttp3/internal/ws/WebSocketHttpTest.java b/okhttp/src/jvmTest/java/okhttp3/internal/ws/WebSocketHttpTest.java index 381a2ea33..507fc66ff 100644 --- a/okhttp/src/jvmTest/java/okhttp3/internal/ws/WebSocketHttpTest.java +++ b/okhttp/src/jvmTest/java/okhttp3/internal/ws/WebSocketHttpTest.java @@ -106,7 +106,9 @@ public final class WebSocketHttpTest { } @Test public void textMessage() { - webServer.enqueue(new MockResponse().withWebSocketUpgrade(serverListener)); + webServer.enqueue(new MockResponse.Builder() + .webSocketUpgrade(serverListener) + .build()); WebSocket webSocket = newWebSocket(); clientListener.assertOpen(); @@ -119,7 +121,9 @@ public final class WebSocketHttpTest { } @Test public void binaryMessage() { - webServer.enqueue(new MockResponse().withWebSocketUpgrade(serverListener)); + webServer.enqueue(new MockResponse.Builder() + .webSocketUpgrade(serverListener) + .build()); WebSocket webSocket = newWebSocket(); clientListener.assertOpen(); @@ -132,7 +136,9 @@ public final class WebSocketHttpTest { } @Test public void nullStringThrows() { - webServer.enqueue(new MockResponse().withWebSocketUpgrade(serverListener)); + webServer.enqueue(new MockResponse.Builder() + .webSocketUpgrade(serverListener) + .build()); WebSocket webSocket = newWebSocket(); clientListener.assertOpen(); @@ -149,7 +155,9 @@ public final class WebSocketHttpTest { @Test public void nullByteStringThrows() { TestUtil.assumeNotWindows(); - webServer.enqueue(new MockResponse().withWebSocketUpgrade(serverListener)); + webServer.enqueue(new MockResponse.Builder() + .webSocketUpgrade(serverListener) + .build()); WebSocket webSocket = newWebSocket(); clientListener.assertOpen(); @@ -164,7 +172,9 @@ public final class WebSocketHttpTest { } @Test public void serverMessage() { - webServer.enqueue(new MockResponse().withWebSocketUpgrade(serverListener)); + webServer.enqueue(new MockResponse.Builder() + .webSocketUpgrade(serverListener) + .build()); WebSocket webSocket = newWebSocket(); clientListener.assertOpen(); @@ -177,7 +187,9 @@ public final class WebSocketHttpTest { } @Test public void throwingOnOpenFailsImmediately() { - webServer.enqueue(new MockResponse().withWebSocketUpgrade(serverListener)); + webServer.enqueue(new MockResponse.Builder() + .webSocketUpgrade(serverListener) + .build()); final RuntimeException e = new RuntimeException(); clientListener.setNextEventDelegate(new WebSocketListener() { @@ -195,7 +207,10 @@ public final class WebSocketHttpTest { @Disabled("AsyncCall currently lets runtime exceptions propagate.") @Test public void throwingOnFailLogs() throws Exception { - webServer.enqueue(new MockResponse().setResponseCode(200).setBody("Body")); + webServer.enqueue(new MockResponse.Builder() + .code(200) + .body("Body") + .build()); final RuntimeException e = new RuntimeException("boom"); clientListener.setNextEventDelegate(new WebSocketListener() { @@ -210,7 +225,9 @@ public final class WebSocketHttpTest { } @Test public void throwingOnMessageClosesImmediatelyAndFails() { - webServer.enqueue(new MockResponse().withWebSocketUpgrade(serverListener)); + webServer.enqueue(new MockResponse.Builder() + .webSocketUpgrade(serverListener) + .build()); newWebSocket(); clientListener.assertOpen(); @@ -230,7 +247,9 @@ public final class WebSocketHttpTest { } @Test public void throwingOnClosingClosesImmediatelyAndFails() { - webServer.enqueue(new MockResponse().withWebSocketUpgrade(serverListener)); + webServer.enqueue(new MockResponse.Builder() + .webSocketUpgrade(serverListener) + .build()); newWebSocket(); clientListener.assertOpen(); @@ -250,7 +269,9 @@ public final class WebSocketHttpTest { } @Test public void unplannedCloseHandledByCloseWithoutFailure() { - webServer.enqueue(new MockResponse().withWebSocketUpgrade(serverListener)); + webServer.enqueue(new MockResponse.Builder() + .webSocketUpgrade(serverListener) + .build()); newWebSocket(); clientListener.assertOpen(); @@ -270,7 +291,9 @@ public final class WebSocketHttpTest { } @Test public void unplannedCloseHandledWithoutFailure() { - webServer.enqueue(new MockResponse().withWebSocketUpgrade(serverListener)); + webServer.enqueue(new MockResponse.Builder() + .webSocketUpgrade(serverListener) + .build()); newWebSocket(); WebSocket webSocket = clientListener.assertOpen(); @@ -280,7 +303,10 @@ public final class WebSocketHttpTest { } @Test public void non101RetainsBody() throws IOException { - webServer.enqueue(new MockResponse().setResponseCode(200).setBody("Body")); + webServer.enqueue(new MockResponse.Builder() + .code(200) + .body("Body") + .build()); newWebSocket(); clientListener.assertFailure(200, "Body", ProtocolException.class, @@ -288,7 +314,9 @@ public final class WebSocketHttpTest { } @Test public void notFound() throws IOException { - webServer.enqueue(new MockResponse().setStatus("HTTP/1.1 404 Not Found")); + webServer.enqueue(new MockResponse.Builder() + .status("HTTP/1.1 404 Not Found") + .build()); newWebSocket(); clientListener.assertFailure(404, null, ProtocolException.class, @@ -296,8 +324,12 @@ public final class WebSocketHttpTest { } @Test public void clientTimeoutClosesBody() { - webServer.enqueue(new MockResponse().setResponseCode(408)); - webServer.enqueue(new MockResponse().withWebSocketUpgrade(serverListener)); + webServer.enqueue(new MockResponse.Builder() + .code(408) + .build()); + webServer.enqueue(new MockResponse.Builder() + .webSocketUpgrade(serverListener) + .build()); WebSocket webSocket = newWebSocket(); clientListener.assertOpen(); @@ -313,10 +345,11 @@ public final class WebSocketHttpTest { } @Test public void missingConnectionHeader() throws IOException { - webServer.enqueue(new MockResponse() - .setResponseCode(101) + webServer.enqueue(new MockResponse.Builder() + .code(101) .setHeader("Upgrade", "websocket") - .setHeader("Sec-WebSocket-Accept", "ujmZX4KXZqjwy6vi1aQFH5p4Ygk=")); + .setHeader("Sec-WebSocket-Accept", "ujmZX4KXZqjwy6vi1aQFH5p4Ygk=") + .build()); newWebSocket(); clientListener.assertFailure(101, null, ProtocolException.class, @@ -324,11 +357,12 @@ public final class WebSocketHttpTest { } @Test public void wrongConnectionHeader() throws IOException { - webServer.enqueue(new MockResponse() - .setResponseCode(101) + webServer.enqueue(new MockResponse.Builder() + .code(101) .setHeader("Upgrade", "websocket") .setHeader("Connection", "Downgrade") - .setHeader("Sec-WebSocket-Accept", "ujmZX4KXZqjwy6vi1aQFH5p4Ygk=")); + .setHeader("Sec-WebSocket-Accept", "ujmZX4KXZqjwy6vi1aQFH5p4Ygk=") + .build()); newWebSocket(); clientListener.assertFailure(101, null, ProtocolException.class, @@ -336,10 +370,11 @@ public final class WebSocketHttpTest { } @Test public void missingUpgradeHeader() throws IOException { - webServer.enqueue(new MockResponse() - .setResponseCode(101) + webServer.enqueue(new MockResponse.Builder() + .code(101) .setHeader("Connection", "Upgrade") - .setHeader("Sec-WebSocket-Accept", "ujmZX4KXZqjwy6vi1aQFH5p4Ygk=")); + .setHeader("Sec-WebSocket-Accept", "ujmZX4KXZqjwy6vi1aQFH5p4Ygk=") + .build()); newWebSocket(); clientListener.assertFailure(101, null, ProtocolException.class, @@ -347,11 +382,12 @@ public final class WebSocketHttpTest { } @Test public void wrongUpgradeHeader() throws IOException { - webServer.enqueue(new MockResponse() - .setResponseCode(101) + webServer.enqueue(new MockResponse.Builder() + .code(101) .setHeader("Connection", "Upgrade") .setHeader("Upgrade", "Pepsi") - .setHeader("Sec-WebSocket-Accept", "ujmZX4KXZqjwy6vi1aQFH5p4Ygk=")); + .setHeader("Sec-WebSocket-Accept", "ujmZX4KXZqjwy6vi1aQFH5p4Ygk=") + .build()); newWebSocket(); clientListener.assertFailure(101, null, ProtocolException.class, @@ -359,10 +395,11 @@ public final class WebSocketHttpTest { } @Test public void missingMagicHeader() throws IOException { - webServer.enqueue(new MockResponse() - .setResponseCode(101) + webServer.enqueue(new MockResponse.Builder() + .code(101) .setHeader("Connection", "Upgrade") - .setHeader("Upgrade", "websocket")); + .setHeader("Upgrade", "websocket") + .build()); newWebSocket(); clientListener.assertFailure(101, null, ProtocolException.class, @@ -370,11 +407,12 @@ public final class WebSocketHttpTest { } @Test public void wrongMagicHeader() throws IOException { - webServer.enqueue(new MockResponse() - .setResponseCode(101) + webServer.enqueue(new MockResponse.Builder() + .code(101) .setHeader("Connection", "Upgrade") .setHeader("Upgrade", "websocket") - .setHeader("Sec-WebSocket-Accept", "magic")); + .setHeader("Sec-WebSocket-Accept", "magic") + .build()); newWebSocket(); clientListener.assertFailure(101, null, ProtocolException.class, @@ -406,7 +444,9 @@ public final class WebSocketHttpTest { }) .build(); - webServer.enqueue(new MockResponse().withWebSocketUpgrade(serverListener)); + webServer.enqueue(new MockResponse.Builder() + .webSocketUpgrade(serverListener) + .build()); WebSocket webSocket = newWebSocket(); clientListener.assertOpen(); @@ -422,7 +462,9 @@ public final class WebSocketHttpTest { }) .build(); - webServer.enqueue(new MockResponse().withWebSocketUpgrade(serverListener)); + webServer.enqueue(new MockResponse.Builder() + .webSocketUpgrade(serverListener) + .build()); WebSocket webSocket = newWebSocket(); clientListener.assertOpen(); @@ -432,7 +474,9 @@ public final class WebSocketHttpTest { } @Test public void overflowOutgoingQueue() { - webServer.enqueue(new MockResponse().withWebSocketUpgrade(serverListener)); + webServer.enqueue(new MockResponse.Builder() + .webSocketUpgrade(serverListener) + .build()); WebSocket webSocket = newWebSocket(); clientListener.assertOpen(); @@ -466,7 +510,9 @@ public final class WebSocketHttpTest { } @Test public void closeReasonMaximumLength() { - webServer.enqueue(new MockResponse().withWebSocketUpgrade(serverListener)); + webServer.enqueue(new MockResponse.Builder() + .webSocketUpgrade(serverListener) + .build()); String clientReason = repeat('C', 123); String serverReason = repeat('S', 123); @@ -486,7 +532,9 @@ public final class WebSocketHttpTest { } @Test public void closeReasonTooLong() { - webServer.enqueue(new MockResponse().withWebSocketUpgrade(serverListener)); + webServer.enqueue(new MockResponse.Builder() + .webSocketUpgrade(serverListener) + .build()); WebSocket webSocket = newWebSocket(); WebSocket server = serverListener.assertOpen(); @@ -543,8 +591,9 @@ public final class WebSocketHttpTest { } @Test public void readTimeoutAppliesToHttpRequest() { - webServer.enqueue(new MockResponse() - .setSocketPolicy(SocketPolicy.NO_RESPONSE)); + webServer.enqueue(new MockResponse.Builder() + .socketPolicy(SocketPolicy.NO_RESPONSE) + .build()); WebSocket webSocket = newWebSocket(); @@ -561,9 +610,10 @@ public final class WebSocketHttpTest { webServer.setDispatcher(new Dispatcher() { @Override public MockResponse dispatch(RecordedRequest request) { return upgradeResponse(request) - .setBody(new Buffer().write(ByteString.decodeHex("81"))) // Truncated frame. + .body(new Buffer().write(ByteString.decodeHex("81"))) // Truncated frame. .removeHeader("Content-Length") - .setSocketPolicy(SocketPolicy.KEEP_OPEN); + .socketPolicy(SocketPolicy.KEEP_OPEN) + .build(); } }); @@ -575,7 +625,9 @@ public final class WebSocketHttpTest { } @Test public void readTimeoutDoesNotApplyAcrossFrames() throws Exception { - webServer.enqueue(new MockResponse().withWebSocketUpgrade(serverListener)); + webServer.enqueue(new MockResponse.Builder() + .webSocketUpgrade(serverListener) + .build()); WebSocket webSocket = newWebSocket(); clientListener.assertOpen(); @@ -595,7 +647,9 @@ public final class WebSocketHttpTest { .pingInterval(Duration.ofMillis(500)) .build(); - webServer.enqueue(new MockResponse().withWebSocketUpgrade(serverListener)); + webServer.enqueue(new MockResponse.Builder() + .webSocketUpgrade(serverListener) + .build()); RealWebSocket webSocket = newWebSocket(); clientListener.assertOpen(); @@ -623,7 +677,9 @@ public final class WebSocketHttpTest { } @Test public void clientDoesNotPingServerByDefault() throws Exception { - webServer.enqueue(new MockResponse().withWebSocketUpgrade(serverListener)); + webServer.enqueue(new MockResponse.Builder() + .webSocketUpgrade(serverListener) + .build()); RealWebSocket webSocket = newWebSocket(); clientListener.assertOpen(); @@ -656,15 +712,17 @@ public final class WebSocketHttpTest { // Stall in onOpen to prevent pongs from being sent. final CountDownLatch latch = new CountDownLatch(1); - webServer.enqueue(new MockResponse().withWebSocketUpgrade(new WebSocketListener() { - @Override public void onOpen(WebSocket webSocket, Response response) { - try { - latch.await(); // The server can't respond to pings! - } catch (InterruptedException e) { - throw new AssertionError(e); + webServer.enqueue(new MockResponse.Builder() + .webSocketUpgrade(new WebSocketListener() { + @Override public void onOpen(WebSocket webSocket, Response response) { + try { + latch.await(); // The server can't respond to pings! + } catch (InterruptedException e) { + throw new AssertionError(e); + } } - } - })); + }) + .build()); long openAtNanos = System.nanoTime(); newWebSocket(); @@ -680,7 +738,9 @@ public final class WebSocketHttpTest { /** https://github.com/square/okhttp/issues/2788 */ @Test public void clientCancelsIfCloseIsNotAcknowledged() { - webServer.enqueue(new MockResponse().withWebSocketUpgrade(serverListener)); + webServer.enqueue(new MockResponse.Builder() + .webSocketUpgrade(serverListener) + .build()); RealWebSocket webSocket = newWebSocket(); clientListener.assertOpen(); @@ -709,7 +769,9 @@ public final class WebSocketHttpTest { .eventListenerFactory(clientTestRule.wrap(listener)) .build(); - webServer.enqueue(new MockResponse().withWebSocketUpgrade(serverListener)); + webServer.enqueue(new MockResponse.Builder() + .webSocketUpgrade(serverListener) + .build()); WebSocket webSocket = newWebSocket(); clientListener.assertOpen(); @@ -730,8 +792,9 @@ public final class WebSocketHttpTest { } @Test public void callTimeoutAppliesToSetup() throws Exception { - webServer.enqueue(new MockResponse() - .setHeadersDelay(500, TimeUnit.MILLISECONDS)); + webServer.enqueue(new MockResponse.Builder() + .headersDelay(500, TimeUnit.MILLISECONDS) + .build()); client = client.newBuilder() .readTimeout(Duration.ZERO) @@ -748,8 +811,9 @@ public final class WebSocketHttpTest { .callTimeout(Duration.ofMillis(100)) .build(); - webServer.enqueue(new MockResponse() - .withWebSocketUpgrade(serverListener)); + webServer.enqueue(new MockResponse.Builder() + .webSocketUpgrade(serverListener) + .build()); WebSocket webSocket = newWebSocket(); clientListener.assertOpen(); @@ -774,9 +838,10 @@ public final class WebSocketHttpTest { .protocols(asList(Protocol.HTTP_1_1)) .build(); - webServer.enqueue(new MockResponse() - .setResponseCode(HttpURLConnection.HTTP_NOT_FOUND) - .setBody("not found!")); + webServer.enqueue(new MockResponse.Builder() + .code(HttpURLConnection.HTTP_NOT_FOUND) + .body("not found!") + .build()); webServer.enqueue(new MockResponse()); newWebSocket(); @@ -835,9 +900,10 @@ public final class WebSocketHttpTest { } private void successfulExtensions(String extensionsHeader) throws Exception { - webServer.enqueue(new MockResponse() + webServer.enqueue(new MockResponse.Builder() .addHeader("Sec-WebSocket-Extensions", extensionsHeader) - .withWebSocketUpgrade(serverListener)); + .webSocketUpgrade(serverListener) + .build()); WebSocket client = newWebSocket(); clientListener.assertOpen(); @@ -881,9 +947,10 @@ public final class WebSocketHttpTest { } private void extensionNegotiationFailure(String extensionsHeader) throws Exception { - webServer.enqueue(new MockResponse() + webServer.enqueue(new MockResponse.Builder() .addHeader("Sec-WebSocket-Extensions", extensionsHeader) - .withWebSocketUpgrade(serverListener)); + .webSocketUpgrade(serverListener) + .build()); newWebSocket(); clientListener.assertOpen(); @@ -899,17 +966,19 @@ public final class WebSocketHttpTest { serverListener.assertExhausted(); } - private MockResponse upgradeResponse(RecordedRequest request) { + private MockResponse.Builder upgradeResponse(RecordedRequest request) { String key = request.getHeader("Sec-WebSocket-Key"); - return new MockResponse() - .setStatus("HTTP/1.1 101 Switching Protocols") + return new MockResponse.Builder() + .status("HTTP/1.1 101 Switching Protocols") .setHeader("Connection", "Upgrade") .setHeader("Upgrade", "websocket") .setHeader("Sec-WebSocket-Accept", WebSocketProtocol.INSTANCE.acceptHeader(key)); } private void websocketScheme(String scheme) { - webServer.enqueue(new MockResponse().withWebSocketUpgrade(serverListener)); + webServer.enqueue(new MockResponse.Builder() + .webSocketUpgrade(serverListener) + .build()); Request request = new Request.Builder() .url(scheme + "://" + webServer.getHostName() + ":" + webServer.getPort() + "/") diff --git a/samples/compare/src/test/kotlin/okhttp3/compare/ApacheHttpClientTest.kt b/samples/compare/src/test/kotlin/okhttp3/compare/ApacheHttpClientTest.kt index 266838524..cde2e23a3 100644 --- a/samples/compare/src/test/kotlin/okhttp3/compare/ApacheHttpClientTest.kt +++ b/samples/compare/src/test/kotlin/okhttp3/compare/ApacheHttpClientTest.kt @@ -39,8 +39,9 @@ class ApacheHttpClientTest { } @Test fun get(server: MockWebServer) { - server.enqueue(MockResponse() - .setBody("hello, Apache HttpClient 5.x")) + server.enqueue(MockResponse.Builder() + .body("hello, Apache HttpClient 5.x") + .build()) val request = HttpGet(server.url("/").toUri()) request.addHeader("Accept", "text/plain") diff --git a/samples/compare/src/test/kotlin/okhttp3/compare/JavaHttpClientTest.kt b/samples/compare/src/test/kotlin/okhttp3/compare/JavaHttpClientTest.kt index a1bd895d3..7f701c31a 100644 --- a/samples/compare/src/test/kotlin/okhttp3/compare/JavaHttpClientTest.kt +++ b/samples/compare/src/test/kotlin/okhttp3/compare/JavaHttpClientTest.kt @@ -44,8 +44,9 @@ class JavaHttpClientTest { .followRedirects(NORMAL) .build() - server.enqueue(MockResponse() - .setBody("hello, Java HTTP Client")) + server.enqueue(MockResponse.Builder() + .body("hello, Java HTTP Client") + .build()) val request = HttpRequest.newBuilder(server.url("/").toUri()) .header("Accept", "text/plain") diff --git a/samples/compare/src/test/kotlin/okhttp3/compare/JettyHttpClientTest.kt b/samples/compare/src/test/kotlin/okhttp3/compare/JettyHttpClientTest.kt index 1e063310a..3835c045b 100644 --- a/samples/compare/src/test/kotlin/okhttp3/compare/JettyHttpClientTest.kt +++ b/samples/compare/src/test/kotlin/okhttp3/compare/JettyHttpClientTest.kt @@ -42,8 +42,7 @@ class JettyHttpClientTest { } @Test fun get(server: MockWebServer) { - server.enqueue(MockResponse() - .setBody("hello, Jetty HTTP Client")) + server.enqueue(MockResponse(body = "hello, Jetty HTTP Client")) val request = client.newRequest(server.url("/").toUri()) .header("Accept", "text/plain") diff --git a/samples/compare/src/test/kotlin/okhttp3/compare/OkHttpClientTest.kt b/samples/compare/src/test/kotlin/okhttp3/compare/OkHttpClientTest.kt index 0f1d61b83..da65e91ce 100644 --- a/samples/compare/src/test/kotlin/okhttp3/compare/OkHttpClientTest.kt +++ b/samples/compare/src/test/kotlin/okhttp3/compare/OkHttpClientTest.kt @@ -35,8 +35,7 @@ class OkHttpClientTest { @Test fun get(server: MockWebServer) { platform.assumeNotBouncyCastle() - server.enqueue(MockResponse() - .setBody("hello, OkHttp")) + server.enqueue(MockResponse(body = "hello, OkHttp")) val client = OkHttpClient()