Search in sources :

Example 1 with OkResponseCache

use of com.squareup.okhttp.OkResponseCache in project robovm by robovm.

the class HttpEngine method initResponseSource.

/**
   * Initialize the source for this response. It may be corrected later if the
   * request headers forbids network use.
   */
private void initResponseSource() throws IOException {
    responseSource = ResponseSource.NETWORK;
    if (!policy.getUseCaches())
        return;
    OkResponseCache responseCache = client.getOkResponseCache();
    if (responseCache == null)
        return;
    CacheResponse candidate = responseCache.get(uri, method, requestHeaders.getHeaders().toMultimap(false));
    if (candidate == null)
        return;
    Map<String, List<String>> responseHeadersMap = candidate.getHeaders();
    cachedResponseBody = candidate.getBody();
    if (!acceptCacheResponseType(candidate) || responseHeadersMap == null || cachedResponseBody == null) {
        Util.closeQuietly(cachedResponseBody);
        return;
    }
    RawHeaders rawResponseHeaders = RawHeaders.fromMultimap(responseHeadersMap, true);
    cachedResponseHeaders = new ResponseHeaders(uri, rawResponseHeaders);
    long now = System.currentTimeMillis();
    this.responseSource = cachedResponseHeaders.chooseResponseSource(now, requestHeaders);
    if (responseSource == ResponseSource.CACHE) {
        this.cacheResponse = candidate;
        setResponse(cachedResponseHeaders, cachedResponseBody);
    } else if (responseSource == ResponseSource.CONDITIONAL_CACHE) {
        this.cacheResponse = candidate;
    } else if (responseSource == ResponseSource.NETWORK) {
        Util.closeQuietly(cachedResponseBody);
    } else {
        throw new AssertionError();
    }
}
Also used : CacheResponse(java.net.CacheResponse) OkResponseCache(com.squareup.okhttp.OkResponseCache) List(java.util.List)

Example 2 with OkResponseCache

use of com.squareup.okhttp.OkResponseCache in project robovm by robovm.

the class HttpEngine method readResponse.

/**
   * Flushes the remaining request header and body, parses the HTTP response
   * headers and starts reading the HTTP response body if it exists.
   */
public final void readResponse() throws IOException {
    if (hasResponse()) {
        responseHeaders.setResponseSource(responseSource);
        return;
    }
    if (responseSource == null) {
        throw new IllegalStateException("readResponse() without sendRequest()");
    }
    if (!responseSource.requiresConnection()) {
        return;
    }
    if (sentRequestMillis == -1) {
        if (requestBodyOut instanceof RetryableOutputStream) {
            int contentLength = ((RetryableOutputStream) requestBodyOut).contentLength();
            requestHeaders.setContentLength(contentLength);
        }
        transport.writeRequestHeaders();
    }
    if (requestBodyOut != null) {
        requestBodyOut.close();
        if (requestBodyOut instanceof RetryableOutputStream) {
            transport.writeRequestBody((RetryableOutputStream) requestBodyOut);
        }
    }
    transport.flushRequest();
    responseHeaders = transport.readResponseHeaders();
    responseHeaders.setLocalTimestamps(sentRequestMillis, System.currentTimeMillis());
    responseHeaders.setResponseSource(responseSource);
    if (responseSource == ResponseSource.CONDITIONAL_CACHE) {
        if (cachedResponseHeaders.validate(responseHeaders)) {
            release(false);
            ResponseHeaders combinedHeaders = cachedResponseHeaders.combine(responseHeaders);
            setResponse(combinedHeaders, cachedResponseBody);
            OkResponseCache responseCache = client.getOkResponseCache();
            responseCache.trackConditionalCacheHit();
            responseCache.update(cacheResponse, policy.getHttpConnectionToCache());
            return;
        } else {
            Util.closeQuietly(cachedResponseBody);
        }
    }
    if (hasResponseBody()) {
        // reentrant. this calls into user code which may call back into this!
        maybeCache();
    }
    initContentStream(transport.getTransferStream(cacheRequest));
}
Also used : OkResponseCache(com.squareup.okhttp.OkResponseCache)

Example 3 with OkResponseCache

use of com.squareup.okhttp.OkResponseCache in project robovm by robovm.

the class HttpEngine method maybeCache.

private void maybeCache() throws IOException {
    // Are we caching at all?
    if (!policy.getUseCaches())
        return;
    OkResponseCache responseCache = client.getOkResponseCache();
    if (responseCache == null)
        return;
    HttpURLConnection connectionToCache = policy.getHttpConnectionToCache();
    // Should we cache this response for this request?
    if (!responseHeaders.isCacheable(requestHeaders)) {
        responseCache.maybeRemove(connectionToCache.getRequestMethod(), uri);
        return;
    }
    // Offer this request to the cache.
    cacheRequest = responseCache.put(uri, connectionToCache);
}
Also used : OkResponseCache(com.squareup.okhttp.OkResponseCache) HttpURLConnection(java.net.HttpURLConnection)

Example 4 with OkResponseCache

use of com.squareup.okhttp.OkResponseCache in project robovm by robovm.

the class HttpEngine method sendRequest.

/**
   * Figures out what the response source will be, and opens a socket to that
   * source if necessary. Prepares the request headers and gets ready to start
   * writing the request body if it exists.
   */
public final void sendRequest() throws IOException {
    if (responseSource != null) {
        return;
    }
    prepareRawRequestHeaders();
    initResponseSource();
    OkResponseCache responseCache = client.getOkResponseCache();
    if (responseCache != null) {
        responseCache.trackResponse(responseSource);
    }
    // by http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4.
    if (requestHeaders.isOnlyIfCached() && responseSource.requiresConnection()) {
        if (responseSource == ResponseSource.CONDITIONAL_CACHE) {
            Util.closeQuietly(cachedResponseBody);
        }
        this.responseSource = ResponseSource.CACHE;
        this.cacheResponse = GATEWAY_TIMEOUT_RESPONSE;
        RawHeaders rawResponseHeaders = RawHeaders.fromMultimap(cacheResponse.getHeaders(), true);
        setResponse(new ResponseHeaders(uri, rawResponseHeaders), cacheResponse.getBody());
    }
    if (responseSource.requiresConnection()) {
        sendSocketRequest();
    } else if (connection != null) {
        client.getConnectionPool().recycle(connection);
        connection = null;
    }
}
Also used : OkResponseCache(com.squareup.okhttp.OkResponseCache)

Aggregations

OkResponseCache (com.squareup.okhttp.OkResponseCache)4 CacheResponse (java.net.CacheResponse)1 HttpURLConnection (java.net.HttpURLConnection)1 List (java.util.List)1