getCachedFromUrl method

Future<Cached> getCachedFromUrl({
  1. required String url,
  2. DateTime? expireAt,
  3. CallbackOnProcess? onProcess,
  4. Map<String, String>? headers,
})

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