Glide遇到重定向url产生的bug

issues地址 bumptech/glide#4652

问题描述:

正常情况www.prohub.com/a.png -> a图
glide缓存www.prohub.com/a.png <==> a图

重定向情况www.prohub.com/a.png -> www.fbiwarning.com/403.png -> 403
glide缓存www.prohub.com/a.png <==> 403
假设www.prohub.com/a.png恢复了正常不会重定向了由于glide缓存glide直接加载了403图导致bug产生

源码分析:网络加载图片 -> disk cache过程

1SourceGenerator#startNext轮询执行所有LoadData)
	-> SourceGenerator#startNextLoad执行单个LoadData)
	-> LoadData#fetcher#loadData执行具体任务以网络加载图片为例)
	   -> DataCallback#onLoadFailed下载失败)
		 -> DataCallback#onDataReady下载完成)
		   -> 缓存数据到 dataToCache 属性
2当下一次执行 SourceGenerator#startNext 的时候如果 dataToCache 属性不为空执行 SourceGenerator#cacheData
 2.1生成缓存目标的key它也是缓存图片的文件名 文件名是key + .o创建DataCacheKey(loadData.sourceKey, helper.getSignature())
    loadData.sourceKey执行下载任务时候的GlideUrl
    helper.getSignature开发者配置的签名这里忽略它2.2key是根据url来生成的
    url -> SHA-256 -> sha256BytesToHex
 2.3执行齿盘缓存DiskLruCachehelper.getDiskCache().put(originalKey, writer); -> DiskLruCacheWrapper#put ...
 2.4缓存路径在 /data/data/pkg/cache/image_manager_disk_cache

解决方法:

直接去Glide源码改改它喵的比较粗暴入侵性强),我们需要另辟蹊径

方法1感知重定向将重定向后的url更新给Glide让Glide用重定向后的url进行缓存该方法适合app内 大量 网络资源链接都存在重定向的情况方法2感知重定向如果发生重定向将本次加载视为失败并且将重定向url抛出使用新url再次进行加载该方法适合app内 少量 网络资源链接都存在重定向的情况不管是那种方法都需要用到Glide4提供的自定义组件将网络组件替换成Okhttp通过Okhttp我们好感知是否产生了重定向

FixGlideRetargetUrlBug代码对两种方法都进行了实现,给大家一个参考