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;
}
}
}
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);
}
}
Aggregations