1
0
mirror of https://github.com/square/okhttp.git synced 2025-08-06 01:35:50 +03:00

Use idiomatic Kotlin in Request.kt (#5092)

- define @get:JvmName(...) for the following vals in constructor instead of passing builder: Builder.
  - url: HttpUrl
  - method: String
  - headers: Headers
  - body: RequestBody?

- add @Deprecated(...) to the following functions.
  - fun url(): HttpUrl
  - fun method(): String
  - fun headers(): Headers
  - fun body(): RequestBody?
  - fun cacheControl(): CacheControl

- clean up code where ()(Parentheses) is unnecessarily used.
This commit is contained in:
monkey-mas
2019-05-22 15:55:00 -04:00
committed by Jesse Wilson
parent b21ed68c08
commit fa9118949e
23 changed files with 127 additions and 92 deletions

View File

@@ -153,11 +153,11 @@ class HttpLoggingInterceptor @JvmOverloads constructor(
val logBody = level == Level.BODY val logBody = level == Level.BODY
val logHeaders = logBody || level == Level.HEADERS val logHeaders = logBody || level == Level.HEADERS
val requestBody = request.body() val requestBody = request.body
val connection = chain.connection() val connection = chain.connection()
var requestStartMessage = var requestStartMessage =
("--> ${request.method()} ${request.url()}${if (connection != null) " " + connection.protocol() else ""}") ("--> ${request.method} ${request.url}${if (connection != null) " " + connection.protocol() else ""}")
if (!logHeaders && requestBody != null) { if (!logHeaders && requestBody != null) {
requestStartMessage += " (${requestBody.contentLength()}-byte body)" requestStartMessage += " (${requestBody.contentLength()}-byte body)"
} }
@@ -175,7 +175,7 @@ class HttpLoggingInterceptor @JvmOverloads constructor(
} }
} }
val headers = request.headers() val headers = request.headers
var i = 0 var i = 0
val count = headers.size val count = headers.size
while (i < count) { while (i < count) {
@@ -189,11 +189,11 @@ class HttpLoggingInterceptor @JvmOverloads constructor(
} }
if (!logBody || requestBody == null) { if (!logBody || requestBody == null) {
logger.log("--> END ${request.method()}") logger.log("--> END ${request.method}")
} else if (bodyHasUnknownEncoding(request.headers())) { } else if (bodyHasUnknownEncoding(request.headers)) {
logger.log("--> END ${request.method()} (encoded body omitted)") logger.log("--> END ${request.method} (encoded body omitted)")
} else if (requestBody.isDuplex()) { } else if (requestBody.isDuplex()) {
logger.log("--> END ${request.method()} (duplex request body omitted)") logger.log("--> END ${request.method} (duplex request body omitted)")
} else { } else {
val buffer = Buffer() val buffer = Buffer()
requestBody.writeTo(buffer) requestBody.writeTo(buffer)
@@ -204,10 +204,10 @@ class HttpLoggingInterceptor @JvmOverloads constructor(
logger.log("") logger.log("")
if (buffer.isUtf8()) { if (buffer.isUtf8()) {
logger.log(buffer.readString(charset)) logger.log(buffer.readString(charset))
logger.log("--> END ${request.method()} (${requestBody.contentLength()}-byte body)") logger.log("--> END ${request.method} (${requestBody.contentLength()}-byte body)")
} else { } else {
logger.log( logger.log(
"--> END ${request.method()} (binary ${requestBody.contentLength()}-byte body omitted)") "--> END ${request.method} (binary ${requestBody.contentLength()}-byte body omitted)")
} }
} }
} }
@@ -227,7 +227,7 @@ class HttpLoggingInterceptor @JvmOverloads constructor(
val contentLength = responseBody.contentLength() val contentLength = responseBody.contentLength()
val bodySize = if (contentLength != -1L) "$contentLength-byte" else "unknown-length" val bodySize = if (contentLength != -1L) "$contentLength-byte" else "unknown-length"
logger.log( logger.log(
"<-- ${response.code()}${if (response.message().isEmpty()) "" else ' ' + response.message()} ${response.request().url()} (${tookMs}ms${if (!logHeaders) ", $bodySize body" else ""})") "<-- ${response.code()}${if (response.message().isEmpty()) "" else ' ' + response.message()} ${response.request().url} (${tookMs}ms${if (!logHeaders) ", $bodySize body" else ""})")
if (logHeaders) { if (logHeaders) {
val headers = response.headers() val headers = response.headers()

View File

@@ -30,7 +30,7 @@ class JavaNetAuthenticator : okhttp3.Authenticator {
override fun authenticate(route: Route?, response: Response): Request? { override fun authenticate(route: Route?, response: Response): Request? {
val challenges = response.challenges() val challenges = response.challenges()
val request = response.request() val request = response.request()
val url = request.url() val url = request.url
val proxyAuthorization = response.code() == 407 val proxyAuthorization = response.code() == 407
val proxy = route?.proxy() ?: Proxy.NO_PROXY val proxy = route?.proxy() ?: Proxy.NO_PROXY

View File

@@ -188,7 +188,7 @@ class Cache internal constructor(
} }
internal fun get(request: Request): Response? { internal fun get(request: Request): Response? {
val key = key(request.url()) val key = key(request.url)
val snapshot: DiskLruCache.Snapshot = try { val snapshot: DiskLruCache.Snapshot = try {
cache[key] ?: return null cache[key] ?: return null
} catch (e: IOException) { } catch (e: IOException) {
@@ -212,9 +212,9 @@ class Cache internal constructor(
} }
internal fun put(response: Response): CacheRequest? { internal fun put(response: Response): CacheRequest? {
val requestMethod = response.request().method() val requestMethod = response.request().method
if (HttpMethod.invalidatesCache(response.request().method())) { if (HttpMethod.invalidatesCache(response.request().method)) {
try { try {
remove(response.request()) remove(response.request())
} catch (ignored: IOException) { } catch (ignored: IOException) {
@@ -236,7 +236,7 @@ class Cache internal constructor(
val entry = Entry(response) val entry = Entry(response)
var editor: DiskLruCache.Editor? = null var editor: DiskLruCache.Editor? = null
try { try {
editor = cache.edit(key(response.request().url())) ?: return null editor = cache.edit(key(response.request().url)) ?: return null
entry.writeTo(editor) entry.writeTo(editor)
return RealCacheRequest(editor) return RealCacheRequest(editor)
} catch (e: IOException) { } catch (e: IOException) {
@@ -247,7 +247,7 @@ class Cache internal constructor(
@Throws(IOException::class) @Throws(IOException::class)
internal fun remove(request: Request) { internal fun remove(request: Request) {
cache.remove(key(request.url())) cache.remove(key(request.url))
} }
internal fun update(cached: Response, network: Response) { internal fun update(cached: Response, network: Response) {
@@ -559,9 +559,9 @@ class Cache internal constructor(
} }
internal constructor(response: Response) { internal constructor(response: Response) {
this.url = response.request().url().toString() this.url = response.request().url.toString()
this.varyHeaders = response.varyHeaders() this.varyHeaders = response.varyHeaders()
this.requestMethod = response.request().method() this.requestMethod = response.request().method
this.protocol = response.protocol() this.protocol = response.protocol()
this.code = response.code() this.code = response.code()
this.message = response.message() this.message = response.message()
@@ -646,8 +646,8 @@ class Cache internal constructor(
} }
fun matches(request: Request, response: Response): Boolean { fun matches(request: Request, response: Response): Boolean {
return url == request.url().toString() && return url == request.url.toString() &&
requestMethod == request.method() && requestMethod == request.method &&
varyMatches(response, varyHeaders, request) varyMatches(response, varyHeaders, request)
} }
@@ -781,7 +781,7 @@ class Cache internal constructor(
fun Response.varyHeaders(): Headers { fun Response.varyHeaders(): Headers {
// Use the request headers sent over the network, since that's what the response varies on. // Use the request headers sent over the network, since that's what the response varies on.
// Otherwise OkHttp-supplied headers like "Accept-Encoding: gzip" may be lost. // Otherwise OkHttp-supplied headers like "Accept-Encoding: gzip" may be lost.
val requestHeaders = networkResponse()!!.request().headers() val requestHeaders = networkResponse()!!.request().headers
val responseHeaders = headers() val responseHeaders = headers()
return varyHeaders(requestHeaders, responseHeaders) return varyHeaders(requestHeaders, responseHeaders)
} }

View File

@@ -101,7 +101,7 @@ internal class RealCall private constructor(
this.callsPerHost = other.callsPerHost this.callsPerHost = other.callsPerHost
} }
fun host(): String = originalRequest.url().host fun host(): String = originalRequest.url.host
fun request(): Request = originalRequest fun request(): Request = originalRequest
@@ -161,7 +161,7 @@ internal class RealCall private constructor(
" to " + redactedUrl()) " to " + redactedUrl())
} }
fun redactedUrl(): String = originalRequest.url().redact() fun redactedUrl(): String = originalRequest.url.redact()
@Throws(IOException::class) @Throws(IOException::class)
fun getResponseWithInterceptorChain(): Response { fun getResponseWithInterceptorChain(): Response {

View File

@@ -26,32 +26,22 @@ import java.net.URL
* immutable. * immutable.
*/ */
class Request internal constructor( class Request internal constructor(
internal val url: HttpUrl, @get:JvmName("url") val url: HttpUrl,
builder: Builder @get:JvmName("method") val method: String,
@get:JvmName("headers") val headers: Headers,
@get:JvmName("body") val body: RequestBody?,
internal val tags: Map<Class<*>, Any>
) { ) {
internal val method: String = builder.method
internal val headers: Headers = builder.headers.build()
internal val body: RequestBody? = builder.body
internal val tags: Map<Class<*>, Any> = builder.tags.toImmutableMap()
@Volatile private var lazyCacheControl: CacheControl? = null
private var cacheControl: CacheControl? = null // Lazily initialized
val isHttps: Boolean val isHttps: Boolean
get() = url.isHttps get() = url.isHttps
fun url(): HttpUrl = url
fun method(): String = method
fun headers(): Headers = headers
fun header(name: String): String? = headers[name] fun header(name: String): String? = headers[name]
fun headers(name: String): List<String> = headers.values(name) fun headers(name: String): List<String> = headers.values(name)
fun body(): RequestBody? = body
/** /**
* Returns the tag attached with `Object.class` as a key, or null if no tag is attached with * Returns the tag attached with `Object.class` as a key, or null if no tag is attached with
* that key. * that key.
@@ -74,12 +64,51 @@ class Request internal constructor(
* Returns the cache control directives for this response. This is never null, even if this * Returns the cache control directives for this response. This is never null, even if this
* response contains no `Cache-Control` header. * response contains no `Cache-Control` header.
*/ */
fun cacheControl(): CacheControl { @get:JvmName("cacheControl") val cacheControl: CacheControl
return cacheControl ?: CacheControl.parse(headers).also { get() {
this.cacheControl = it var result = lazyCacheControl
if (result == null) {
result = CacheControl.parse(headers)
lazyCacheControl = result
} }
return result
} }
@JvmName("-deprecated_url")
@Deprecated(
message = "moved to val",
replaceWith = ReplaceWith(expression = "url"),
level = DeprecationLevel.WARNING)
fun url(): HttpUrl = url
@JvmName("-deprecated_method")
@Deprecated(
message = "moved to val",
replaceWith = ReplaceWith(expression = "method"),
level = DeprecationLevel.WARNING)
fun method(): String = method
@JvmName("-deprecated_headers")
@Deprecated(
message = "moved to val",
replaceWith = ReplaceWith(expression = "headers"),
level = DeprecationLevel.WARNING)
fun headers(): Headers = headers
@JvmName("-deprecated_body")
@Deprecated(
message = "moved to val",
replaceWith = ReplaceWith(expression = "body"),
level = DeprecationLevel.WARNING)
fun body(): RequestBody? = body
@JvmName("-deprecated_cacheControl")
@Deprecated(
message = "moved to val",
replaceWith = ReplaceWith(expression = "cacheControl"),
level = DeprecationLevel.WARNING)
fun cacheControl(): CacheControl = cacheControl
override fun toString(): String = "Request{method=$method, url=$url, tags=$tags}" override fun toString(): String = "Request{method=$method, url=$url, tags=$tags}"
open class Builder { open class Builder {
@@ -233,9 +262,14 @@ class Request internal constructor(
} }
} }
open fun build(): Request = Request( open fun build(): Request {
return Request(
checkNotNull(url) { "url == null" }, checkNotNull(url) { "url == null" },
this method,
headers.build(),
body,
tags.toImmutableMap()
) )
} }
}
} }

View File

@@ -218,7 +218,7 @@ class Response internal constructor(
} }
override fun toString() = override fun toString() =
"Response{protocol=$protocol, code=$code, message=$message, url=${request.url()}}" "Response{protocol=$protocol, code=$code, message=$message, url=${request.url}}"
open class Builder { open class Builder {
internal var request: Request? = null internal var request: Request? = null

View File

@@ -122,7 +122,7 @@ class CacheInterceptor(internal val cache: InternalCache?) : Interceptor {
return cacheWritingResponse(cacheRequest, response) return cacheWritingResponse(cacheRequest, response)
} }
if (HttpMethod.invalidatesCache(networkRequest.method())) { if (HttpMethod.invalidatesCache(networkRequest.method)) {
try { try {
cache.remove(networkRequest) cache.remove(networkRequest)
} catch (ignored: IOException) { } catch (ignored: IOException) {

View File

@@ -131,7 +131,7 @@ class CacheStrategy internal constructor(
val candidate = computeCandidate() val candidate = computeCandidate()
// We're forbidden from using the network and the cache is insufficient. // We're forbidden from using the network and the cache is insufficient.
if (candidate.networkRequest != null && request.cacheControl().onlyIfCached) { if (candidate.networkRequest != null && request.cacheControl.onlyIfCached) {
return CacheStrategy(null, null) return CacheStrategy(null, null)
} }
@@ -157,7 +157,7 @@ class CacheStrategy internal constructor(
return CacheStrategy(request, null) return CacheStrategy(request, null)
} }
val requestCaching = request.cacheControl() val requestCaching = request.cacheControl
if (requestCaching.noCache || hasConditions(request)) { if (requestCaching.noCache || hasConditions(request)) {
return CacheStrategy(request, null) return CacheStrategy(request, null)
} }
@@ -216,7 +216,7 @@ class CacheStrategy internal constructor(
else -> return CacheStrategy(request, null) // No condition! Make a regular request. else -> return CacheStrategy(request, null) // No condition! Make a regular request.
} }
val conditionalRequestHeaders = request.headers().newBuilder() val conditionalRequestHeaders = request.headers.newBuilder()
addHeaderLenient(conditionalRequestHeaders, conditionName, conditionValue!!) addHeaderLenient(conditionalRequestHeaders, conditionName, conditionValue!!)
val conditionalRequest = request.newBuilder() val conditionalRequest = request.newBuilder()
@@ -242,7 +242,7 @@ class CacheStrategy internal constructor(
return if (delta > 0L) delta else 0L return if (delta > 0L) delta else 0L
} }
if (lastModified != null && cacheResponse.request().url().query == null) { if (lastModified != null && cacheResponse.request().url.query == null) {
// As recommended by the HTTP RFC and implemented in Firefox, the max age of a document // As recommended by the HTTP RFC and implemented in Firefox, the max age of a document
// should be defaulted to 10% of the document's age at the time it was served. Default // should be defaulted to 10% of the document's age at the time it was served. Default
// expiration dates aren't used for URIs containing a query. // expiration dates aren't used for URIs containing a query.
@@ -326,7 +326,7 @@ class CacheStrategy internal constructor(
} }
// A 'no-store' directive on request or response prevents the response from being cached. // A 'no-store' directive on request or response prevents the response from being cached.
return !response.cacheControl().noStore && !request.cacheControl().noStore return !response.cacheControl().noStore && !request.cacheControl.noStore
} }
} }
} }

View File

@@ -32,7 +32,7 @@ class ConnectInterceptor(val client: OkHttpClient) : Interceptor {
val transmitter = realChain.transmitter() val transmitter = realChain.transmitter()
// We need the network to satisfy this request. Possibly for validating a conditional GET. // We need the network to satisfy this request. Possibly for validating a conditional GET.
val doExtensiveHealthChecks = request.method() != "GET" val doExtensiveHealthChecks = request.method != "GET"
val exchange = transmitter.newExchange(chain, doExtensiveHealthChecks) val exchange = transmitter.newExchange(chain, doExtensiveHealthChecks)
return realChain.proceed(request, transmitter, exchange) return realChain.proceed(request, transmitter, exchange)

View File

@@ -67,7 +67,7 @@ class Exchange(
@Throws(IOException::class) @Throws(IOException::class)
fun createRequestBody(request: Request, duplex: Boolean): Sink { fun createRequestBody(request: Request, duplex: Boolean): Sink {
this.isDuplex = duplex this.isDuplex = duplex
val contentLength = request.body()!!.contentLength() val contentLength = request.body!!.contentLength()
eventListener.requestBodyStart(call) eventListener.requestBodyStart(call)
val rawRequestBody = codec.createRequestBody(request, contentLength) val rawRequestBody = codec.createRequestBody(request, contentLength)
return RequestBodySink(rawRequestBody, contentLength) return RequestBodySink(rawRequestBody, contentLength)

View File

@@ -229,7 +229,7 @@ class RealConnection(
eventListener: EventListener eventListener: EventListener
) { ) {
var tunnelRequest: Request = createTunnelRequest() var tunnelRequest: Request = createTunnelRequest()
val url = tunnelRequest.url() val url = tunnelRequest.url
for (i in 0 until MAX_TUNNEL_ATTEMPTS) { for (i in 0 until MAX_TUNNEL_ATTEMPTS) {
connectSocket(connectTimeout, readTimeout, call, eventListener) connectSocket(connectTimeout, readTimeout, call, eventListener)
tunnelRequest = createTunnel(readTimeout, writeTimeout, tunnelRequest, url) tunnelRequest = createTunnel(readTimeout, writeTimeout, tunnelRequest, url)
@@ -416,7 +416,7 @@ class RealConnection(
val tunnelCodec = Http1ExchangeCodec(null, null, source, sink) val tunnelCodec = Http1ExchangeCodec(null, null, source, sink)
source.timeout().timeout(readTimeout.toLong(), MILLISECONDS) source.timeout().timeout(readTimeout.toLong(), MILLISECONDS)
sink.timeout().timeout(writeTimeout.toLong(), MILLISECONDS) sink.timeout().timeout(writeTimeout.toLong(), MILLISECONDS)
tunnelCodec.writeRequest(nextRequest.headers(), requestLine) tunnelCodec.writeRequest(nextRequest.headers, requestLine)
tunnelCodec.finishRequest() tunnelCodec.finishRequest()
val response = tunnelCodec.readResponseHeaders(false)!! val response = tunnelCodec.readResponseHeaders(false)!!
.request(nextRequest) .request(nextRequest)

View File

@@ -118,7 +118,7 @@ class Transmitter(
*/ */
fun prepareToConnect(request: Request) { fun prepareToConnect(request: Request) {
if (this.request != null) { if (this.request != null) {
if (this.request!!.url().canReuseConnectionFor(request.url()) && exchangeFinder!!.hasRouteToTry()) { if (this.request!!.url.canReuseConnectionFor(request.url) && exchangeFinder!!.hasRouteToTry()) {
return // Already ready. return // Already ready.
} }
check(exchange == null) check(exchange == null)
@@ -131,7 +131,7 @@ class Transmitter(
this.request = request this.request = request
this.exchangeFinder = ExchangeFinder( this.exchangeFinder = ExchangeFinder(
this, connectionPool, createAddress(request.url()), call, eventListener) this, connectionPool, createAddress(request.url), call, eventListener)
} }
private fun createAddress(url: HttpUrl): Address { private fun createAddress(url: HttpUrl): Address {

View File

@@ -39,7 +39,7 @@ class BridgeInterceptor(private val cookieJar: CookieJar) : Interceptor {
val userRequest = chain.request() val userRequest = chain.request()
val requestBuilder = userRequest.newBuilder() val requestBuilder = userRequest.newBuilder()
val body = userRequest.body() val body = userRequest.body
if (body != null) { if (body != null) {
val contentType = body.contentType() val contentType = body.contentType()
if (contentType != null) { if (contentType != null) {
@@ -57,7 +57,7 @@ class BridgeInterceptor(private val cookieJar: CookieJar) : Interceptor {
} }
if (userRequest.header("Host") == null) { if (userRequest.header("Host") == null) {
requestBuilder.header("Host", userRequest.url().toHostHeader()) requestBuilder.header("Host", userRequest.url.toHostHeader())
} }
if (userRequest.header("Connection") == null) { if (userRequest.header("Connection") == null) {
@@ -72,7 +72,7 @@ class BridgeInterceptor(private val cookieJar: CookieJar) : Interceptor {
requestBuilder.header("Accept-Encoding", "gzip") requestBuilder.header("Accept-Encoding", "gzip")
} }
val cookies = cookieJar.loadForRequest(userRequest.url()) val cookies = cookieJar.loadForRequest(userRequest.url)
if (cookies.isNotEmpty()) { if (cookies.isNotEmpty()) {
requestBuilder.header("Cookie", cookieHeader(cookies)) requestBuilder.header("Cookie", cookieHeader(cookies))
} }
@@ -83,7 +83,7 @@ class BridgeInterceptor(private val cookieJar: CookieJar) : Interceptor {
val networkResponse = chain.proceed(requestBuilder.build()) val networkResponse = chain.proceed(requestBuilder.build())
cookieJar.receiveHeaders(userRequest.url(), networkResponse.headers()) cookieJar.receiveHeaders(userRequest.url, networkResponse.headers())
val responseBuilder = networkResponse.newBuilder() val responseBuilder = networkResponse.newBuilder()
.request(userRequest) .request(userRequest)

View File

@@ -30,14 +30,14 @@ class CallServerInterceptor(private val forWebSocket: Boolean) : Interceptor {
val realChain = chain as RealInterceptorChain val realChain = chain as RealInterceptorChain
val exchange = realChain.exchange() val exchange = realChain.exchange()
val request = realChain.request() val request = realChain.request()
val requestBody = request.body() val requestBody = request.body
val sentRequestMillis = System.currentTimeMillis() val sentRequestMillis = System.currentTimeMillis()
exchange.writeRequestHeaders(request) exchange.writeRequestHeaders(request)
var responseHeadersStarted = false var responseHeadersStarted = false
var responseBuilder: Response.Builder? = null var responseBuilder: Response.Builder? = null
if (HttpMethod.permitsRequestBody(request.method()) && requestBody != null) { if (HttpMethod.permitsRequestBody(request.method) && requestBody != null) {
// If there's a "Expect: 100-continue" header on the request, wait for a "HTTP/1.1 100 // If there's a "Expect: 100-continue" header on the request, wait for a "HTTP/1.1 100
// Continue" response before transmitting the request body. If we don't get that, return // Continue" response before transmitting the request body. If we don't get that, return
// what we did get (such as a 4xx response) without ever transmitting the request body. // what we did get (such as a 4xx response) without ever transmitting the request body.

View File

@@ -212,7 +212,7 @@ fun CookieJar.receiveHeaders(url: HttpUrl, headers: Headers) {
*/ */
fun Response.promisesBody(): Boolean { fun Response.promisesBody(): Boolean {
// HEAD requests never yield a body regardless of the response headers. // HEAD requests never yield a body regardless of the response headers.
if (request().method() == "HEAD") { if (request().method == "HEAD") {
return false return false
} }

View File

@@ -94,7 +94,7 @@ class RealInterceptorChain(
calls++ calls++
// If we already have a stream, confirm that the incoming request will use it. // If we already have a stream, confirm that the incoming request will use it.
check(this.exchange == null || this.exchange.connection()!!.supportsUrl(request.url())) { check(this.exchange == null || this.exchange.connection()!!.supportsUrl(request.url)) {
"network interceptor ${interceptors[index - 1]} must retain the same host and port" "network interceptor ${interceptors[index - 1]} must retain the same host and port"
} }

View File

@@ -29,13 +29,13 @@ object RequestLine {
*/ */
fun get(request: Request, proxyType: Proxy.Type): String { fun get(request: Request, proxyType: Proxy.Type): String {
val result = StringBuilder() val result = StringBuilder()
result.append(request.method()) result.append(request.method)
result.append(' ') result.append(' ')
if (includeAuthorityInRequestLine(request, proxyType)) { if (includeAuthorityInRequestLine(request, proxyType)) {
result.append(request.url()) result.append(request.url)
} else { } else {
result.append(requestPath(request.url())) result.append(requestPath(request.url))
} }
result.append(" HTTP/1.1") result.append(" HTTP/1.1")

View File

@@ -108,7 +108,7 @@ class RetryAndFollowUpInterceptor(private val client: OkHttpClient) : Intercepto
return response return response
} }
val followUpBody = followUp.body() val followUpBody = followUp.body
if (followUpBody != null && followUpBody.isOneShot()) { if (followUpBody != null && followUpBody.isOneShot()) {
return response return response
} }
@@ -155,7 +155,7 @@ class RetryAndFollowUpInterceptor(private val client: OkHttpClient) : Intercepto
} }
private fun requestIsOneShot(e: IOException, userRequest: Request): Boolean { private fun requestIsOneShot(e: IOException, userRequest: Request): Boolean {
val requestBody = userRequest.body() val requestBody = userRequest.body
return (requestBody != null && requestBody.isOneShot()) || return (requestBody != null && requestBody.isOneShot()) ||
e is FileNotFoundException e is FileNotFoundException
} }
@@ -200,7 +200,7 @@ class RetryAndFollowUpInterceptor(private val client: OkHttpClient) : Intercepto
private fun followUpRequest(userResponse: Response, route: Route?): Request? { private fun followUpRequest(userResponse: Response, route: Route?): Request? {
val responseCode = userResponse.code() val responseCode = userResponse.code()
val method = userResponse.request().method() val method = userResponse.request().method
when (responseCode) { when (responseCode) {
HTTP_PROXY_AUTH -> { HTTP_PROXY_AUTH -> {
val selectedProxy = route!!.proxy() val selectedProxy = route!!.proxy()
@@ -234,7 +234,7 @@ class RetryAndFollowUpInterceptor(private val client: OkHttpClient) : Intercepto
return null return null
} }
val requestBody = userResponse.request().body() val requestBody = userResponse.request().body
if (requestBody != null && requestBody.isOneShot()) { if (requestBody != null && requestBody.isOneShot()) {
return null return null
} }
@@ -275,10 +275,10 @@ class RetryAndFollowUpInterceptor(private val client: OkHttpClient) : Intercepto
val location = userResponse.header("Location") ?: return null val location = userResponse.header("Location") ?: return null
// Don't follow redirects to unsupported protocols. // Don't follow redirects to unsupported protocols.
val url = userResponse.request().url().resolve(location) ?: return null val url = userResponse.request().url.resolve(location) ?: return null
// If configured, don't follow redirects between SSL and non-SSL. // If configured, don't follow redirects between SSL and non-SSL.
val sameScheme = url.scheme == userResponse.request().url().scheme val sameScheme = url.scheme == userResponse.request().url.scheme
if (!sameScheme && !client.followSslRedirects()) return null if (!sameScheme && !client.followSslRedirects()) return null
// Most redirects don't include a request body. // Most redirects don't include a request body.
@@ -288,7 +288,7 @@ class RetryAndFollowUpInterceptor(private val client: OkHttpClient) : Intercepto
if (HttpMethod.redirectsToGet(method)) { if (HttpMethod.redirectsToGet(method)) {
requestBuilder.method("GET", null) requestBuilder.method("GET", null)
} else { } else {
val requestBody = if (maintainBody) userResponse.request().body() else null val requestBody = if (maintainBody) userResponse.request().body else null
requestBuilder.method(method, requestBody) requestBuilder.method(method, requestBody)
} }
if (!maintainBody) { if (!maintainBody) {
@@ -301,7 +301,7 @@ class RetryAndFollowUpInterceptor(private val client: OkHttpClient) : Intercepto
// When redirecting across hosts, drop all authentication headers. This // When redirecting across hosts, drop all authentication headers. This
// is potentially annoying to the application layer since they have no // is potentially annoying to the application layer since they have no
// way to retain them. // way to retain them.
if (!userResponse.request().url().canReuseConnectionFor(url)) { if (!userResponse.request().url.canReuseConnectionFor(url)) {
requestBuilder.removeHeader("Authorization") requestBuilder.removeHeader("Authorization")
} }

View File

@@ -93,7 +93,7 @@ class Http1ExchangeCodec(
override fun createRequestBody(request: Request, contentLength: Long): Sink { override fun createRequestBody(request: Request, contentLength: Long): Sink {
return when { return when {
request.body() != null && request.body()!!.isDuplex() -> throw ProtocolException( request.body != null && request.body!!.isDuplex() -> throw ProtocolException(
"Duplex connections are not supported for HTTP/1") "Duplex connections are not supported for HTTP/1")
request.isChunked() -> newChunkedSink() // Stream a request body of unknown length. request.isChunked() -> newChunkedSink() // Stream a request body of unknown length.
contentLength != -1L -> newKnownLengthSink() // Stream a request body of a known length. contentLength != -1L -> newKnownLengthSink() // Stream a request body of a known length.
@@ -120,7 +120,7 @@ class Http1ExchangeCodec(
override fun writeRequestHeaders(request: Request) { override fun writeRequestHeaders(request: Request) {
val requestLine = RequestLine.get( val requestLine = RequestLine.get(
request, realConnection!!.route().proxy().type()) request, realConnection!!.route().proxy().type())
writeRequest(request.headers(), requestLine) writeRequest(request.headers, requestLine)
} }
override fun reportedContentLength(response: Response): Long { override fun reportedContentLength(response: Response): Long {
@@ -134,7 +134,7 @@ class Http1ExchangeCodec(
override fun openResponseBodySource(response: Response): Source { override fun openResponseBodySource(response: Response): Source {
return when { return when {
!response.promisesBody() -> newFixedLengthSource(0) !response.promisesBody() -> newFixedLengthSource(0)
response.isChunked() -> newChunkedSource(response.request().url()) response.isChunked() -> newChunkedSource(response.request().url)
else -> { else -> {
val contentLength = response.headersContentLength() val contentLength = response.headersContentLength()
if (contentLength != -1L) { if (contentLength != -1L) {

View File

@@ -75,7 +75,7 @@ class Http2ExchangeCodec(
override fun writeRequestHeaders(request: Request) { override fun writeRequestHeaders(request: Request) {
if (stream != null) return if (stream != null) return
val hasRequestBody = request.body() != null val hasRequestBody = request.body != null
val requestHeaders = http2HeadersList(request) val requestHeaders = http2HeadersList(request)
stream = connection.newStream(requestHeaders, hasRequestBody) stream = connection.newStream(requestHeaders, hasRequestBody)
// We may have been asked to cancel while creating the new stream and sending the request // We may have been asked to cancel while creating the new stream and sending the request
@@ -158,15 +158,15 @@ class Http2ExchangeCodec(
UPGRADE) UPGRADE)
fun http2HeadersList(request: Request): List<Header> { fun http2HeadersList(request: Request): List<Header> {
val headers = request.headers() val headers = request.headers
val result = ArrayList<Header>(headers.size + 4) val result = ArrayList<Header>(headers.size + 4)
result.add(Header(TARGET_METHOD, request.method())) result.add(Header(TARGET_METHOD, request.method))
result.add(Header(TARGET_PATH, RequestLine.requestPath(request.url()))) result.add(Header(TARGET_PATH, RequestLine.requestPath(request.url)))
val host = request.header("Host") val host = request.header("Host")
if (host != null) { if (host != null) {
result.add(Header(TARGET_AUTHORITY, host)) // Optional. result.add(Header(TARGET_AUTHORITY, host)) // Optional.
} }
result.add(Header(TARGET_SCHEME, request.url().scheme)) result.add(Header(TARGET_SCHEME, request.url.scheme))
for (i in 0 until headers.size) { for (i in 0 until headers.size) {
// header names must be lowercase. // header names must be lowercase.

View File

@@ -124,8 +124,8 @@ class RealWebSocket(
private var awaitingPong = false private var awaitingPong = false
init { init {
require("GET" == originalRequest.method()) { require("GET" == originalRequest.method) {
"Request must be GET: ${originalRequest.method()}" "Request must be GET: ${originalRequest.method}"
} }
this.key = ByteArray(16).apply { random.nextBytes(this) }.toByteString().base64() this.key = ByteArray(16).apply { random.nextBytes(this) }.toByteString().base64()
@@ -175,7 +175,7 @@ class RealWebSocket(
// Process all web socket messages. // Process all web socket messages.
try { try {
val name = "OkHttp WebSocket ${request.url().redact()}" val name = "OkHttp WebSocket ${request.url.redact()}"
initReaderAndWriter(name, streams) initReaderAndWriter(name, streams)
listener.onOpen(this@RealWebSocket, response) listener.onOpen(this@RealWebSocket, response)
loopReader() loopReader()

View File

@@ -33,7 +33,7 @@ internal class RecordingExecutor(
} }
fun assertJobs(vararg expectedUrls: String) { fun assertJobs(vararg expectedUrls: String) {
val actualUrls = calls.map { it.request().url().toString() } val actualUrls = calls.map { it.request().url.toString() }
assertThat(actualUrls).containsExactly(*expectedUrls) assertThat(actualUrls).containsExactly(*expectedUrls)
} }
@@ -41,7 +41,7 @@ internal class RecordingExecutor(
val i = calls.iterator() val i = calls.iterator()
while (i.hasNext()) { while (i.hasNext()) {
val call = i.next() val call = i.next()
if (call.request().url().toString() == url) { if (call.request().url.toString() == url) {
i.remove() i.remove()
dispatcherTest.dispatcher.finished(call) dispatcherTest.dispatcher.finished(call)
return return

View File

@@ -158,6 +158,7 @@ public final class RequestTest {
.url("https://square.com") .url("https://square.com")
.build(); .build();
assertThat(request.headers("Cache-Control")).containsExactly("no-cache"); assertThat(request.headers("Cache-Control")).containsExactly("no-cache");
assertThat(request.cacheControl().noCache()).isTrue();
} }
@Test public void emptyCacheControlClearsAllCacheControlHeaders() { @Test public void emptyCacheControlClearsAllCacheControlHeaders() {