Search in sources :

Example 1 with Info

use of aQute.bnd.http.URLCache.Info in project bnd by bndtools.

the class HttpClient method doCached0.

TaggedData doCached0(final HttpRequest<?> request) throws Exception, IOException {
    logger.debug("cached {}", request.url);
    URL url = request.url;
    try (Info info = cache.get(request.useCacheFile, request.url.toURI())) {
        if ("file".equalsIgnoreCase(url.getProtocol())) {
            File sourceFile = new File(url.toURI());
            if (!sourceFile.isFile())
                return new TaggedData(url.toURI(), 404, null);
            if (info.file.isFile() && info.file.lastModified() == sourceFile.lastModified() && info.file.length() == sourceFile.length()) {
                return new TaggedData(url.toURI(), 304, info.file);
            }
            info.update(IO.stream(sourceFile), null, sourceFile.lastModified());
            return new TaggedData(url.toURI(), 200, info.file);
        }
        request.useCacheFile = info.file;
        if (info.isPresent()) {
            if (!isOffline() && (request.maxStale < 0 || info.jsonFile.lastModified() + request.maxStale < System.currentTimeMillis())) {
                if (info.dto.etag != null)
                    request.ifNoneMatch(info.getETag());
                else {
                    long time = info.file.lastModified();
                    if (time > 0)
                        request.ifModifiedSince(time + 1);
                }
                TaggedData in = send0(request);
                if (in.getState() == State.UPDATED) {
                    //
                    // update the cache from the input stream
                    //
                    info.update(in.getInputStream(), in.getTag(), in.getModified());
                } else if (in.getState() == State.UNMODIFIED)
                    info.jsonFile.setLastModified(System.currentTimeMillis());
                return in;
            } else {
                return new TaggedData(request.url.toURI(), HttpURLConnection.HTTP_NOT_MODIFIED, info.file);
            }
        } else {
            //
            // No entry in the cache, but we are cached
            //
            request.ifMatch = null;
            request.ifNoneMatch = null;
            request.ifModifiedSince = -1;
            if (isOffline()) {
                return new TaggedData(url.toURI(), 404, request.useCacheFile);
            }
            TaggedData in = send0(request);
            if (in.isOk()) {
                info.update(in.getInputStream(), in.getTag(), in.getModified());
            }
            return in;
        }
    }
}
Also used : TaggedData(aQute.bnd.service.url.TaggedData) Info(aQute.bnd.http.URLCache.Info) File(java.io.File) URL(java.net.URL)

Example 2 with Info

use of aQute.bnd.http.URLCache.Info in project bnd by bndtools.

the class HttpClient method doConnect.

private TaggedData doConnect(Object put, Type ref, final URLConnection con, final HttpURLConnection hcon, HttpRequest<?> request, ProgressPlugin.Task task) throws IOException, Exception {
    if (put != null) {
        task.worked(1);
        doOutput(put, con, request);
    } else
        logger.debug("{} {}", request.verb, request.url);
    if (request.timeout > 0) {
        con.setConnectTimeout((int) request.timeout * 10);
        con.setReadTimeout((int) (5000 > request.timeout ? request.timeout : 5000));
    } else {
        con.setConnectTimeout(120000);
        con.setReadTimeout(60000);
    }
    try {
        if (hcon == null) {
            // not http
            try {
                con.connect();
                InputStream in = con.getInputStream();
                return new TaggedData(con, in, request.useCacheFile);
            } catch (FileNotFoundException e) {
                task.done("file not found", e);
                return new TaggedData(con.getURL().toURI(), 404, request.useCacheFile);
            }
        }
        int code = hcon.getResponseCode();
        if (code == -1)
            System.out.println("WTF?");
        if (code == HttpURLConnection.HTTP_MOVED_TEMP || code == HttpURLConnection.HTTP_MOVED_PERM || code == HttpURLConnection.HTTP_SEE_OTHER) {
            if (request.redirects-- > 0) {
                String location = hcon.getHeaderField("Location");
                request.url = new URL(location);
                task.done("redirected", null);
                return send0(request);
            }
        }
        if (isUpdateInfo(con, request, code)) {
            File file = (File) request.upload;
            String etag = con.getHeaderField("ETag");
            try (Info info = cache.get(file, con.getURL().toURI())) {
                info.update(etag);
            }
        }
        if ((code / 100) != 2) {
            task.done("finished", null);
            return new TaggedData(con, null, request.useCacheFile);
        }
        // Do not enclose in resource try! InputStream is potentially
        // used
        // later
        InputStream xin = con.getInputStream();
        InputStream in = handleContentEncoding(hcon, xin);
        in = createProgressWrappedStream(in, con.toString(), con.getContentLength(), task, request.timeout);
        return new TaggedData(con, in, request.useCacheFile);
    } catch (SocketTimeoutException ste) {
        task.done(ste.toString(), null);
        return new TaggedData(request.url.toURI(), HttpURLConnection.HTTP_GATEWAY_TIMEOUT, request.useCacheFile);
    }
}
Also used : SocketTimeoutException(java.net.SocketTimeoutException) GZIPInputStream(java.util.zip.GZIPInputStream) InflaterInputStream(java.util.zip.InflaterInputStream) InputStream(java.io.InputStream) FileNotFoundException(java.io.FileNotFoundException) TaggedData(aQute.bnd.service.url.TaggedData) Info(aQute.bnd.http.URLCache.Info) File(java.io.File) URL(java.net.URL)

Aggregations

Info (aQute.bnd.http.URLCache.Info)2 TaggedData (aQute.bnd.service.url.TaggedData)2 File (java.io.File)2 URL (java.net.URL)2 FileNotFoundException (java.io.FileNotFoundException)1 InputStream (java.io.InputStream)1 SocketTimeoutException (java.net.SocketTimeoutException)1 GZIPInputStream (java.util.zip.GZIPInputStream)1 InflaterInputStream (java.util.zip.InflaterInputStream)1