getCachedFromUrl method
getCachedFromUrl returns data use cache or get from url,
data expire at expireAt, onProcess is 0.0 ~ 1.0
Implementation
Future<Cached> getCachedFromUrl({required String url, DateTime? expireAt, CallbackOnProcess? onProcess, Map<String, String>? headers})async{
var id = md5.convert(utf8.encode(url)).toString();
id = "url_$id";
final info = await _getInfo(id);
var request = http.Request('GET', Uri.parse(url));
if(headers!=null){
request.headers.addAll(headers);
}
var response = await request.send();
if (response.statusCode == 200) {
final etag = response.headers[HttpHeaders.etagHeader];
if(info != null){
var useCache = true;
if(etag != null){
if(info.etag != etag){
useCache=false;
}
}
if(useCache){
final cached =await _getCachedFromInfo(info);
if(cached!= null){
return cached;
}
}
}
final length = response.contentLength??0;
String? ext;
final contentType = response.headers[HttpHeaders.contentTypeHeader];
if(contentType!= null){
final l = contentType.split("/");
if(l.length==2){
ext = l[1];
}
}
final cache = await _getCachedFromReader(Reader(response.stream, length), ext, onProcess);
await _setCache(id, ext, cache.data, expireAt, etag);
return cache;
} else {
if(info != null){
final cache = await _getCachedFromInfo(info);
if(cache != null){
return cache;
}
}
throw Exception("Http error: ${response.statusCode}");
}
}