|
@@ -29,12 +29,15 @@ import com.drake.net.body.toNetRequestBody
|
|
|
import com.drake.net.body.toNetResponseBody
|
|
|
import com.drake.net.cache.CacheMode
|
|
|
import com.drake.net.cache.ForceCache
|
|
|
-import com.drake.net.exception.*
|
|
|
-import com.drake.net.request.downloadListeners
|
|
|
+import com.drake.net.exception.HttpFailureException
|
|
|
+import com.drake.net.exception.NetConnectException
|
|
|
+import com.drake.net.exception.NetException
|
|
|
+import com.drake.net.exception.NetSocketTimeoutException
|
|
|
+import com.drake.net.exception.NetUnknownHostException
|
|
|
+import com.drake.net.exception.NoCacheException
|
|
|
import com.drake.net.request.tagOf
|
|
|
-import com.drake.net.request.uploadListeners
|
|
|
+import com.drake.net.tag.NetTag
|
|
|
import okhttp3.CacheControl
|
|
|
-import okhttp3.Call
|
|
|
import okhttp3.Interceptor
|
|
|
import okhttp3.Response
|
|
|
import java.lang.ref.WeakReference
|
|
@@ -49,7 +52,7 @@ object NetOkHttpInterceptor : Interceptor {
|
|
|
|
|
|
override fun intercept(chain: Interceptor.Chain): Response {
|
|
|
var request = chain.request()
|
|
|
- val reqBody = request.body?.toNetRequestBody(request.uploadListeners())
|
|
|
+ val reqBody = request.body?.toNetRequestBody(request.tagOf<NetTag.UploadListeners>())
|
|
|
val cache = request.tagOf<ForceCache>() ?: NetConfig.forceCache
|
|
|
val cacheMode = request.tagOf<CacheMode>()
|
|
|
request = request.newBuilder().apply {
|
|
@@ -59,13 +62,14 @@ object NetOkHttpInterceptor : Interceptor {
|
|
|
}.method(request.method, reqBody).build()
|
|
|
|
|
|
try {
|
|
|
- attach(chain)
|
|
|
+ appendRunningCall(chain)
|
|
|
val response = if (cache != null) {
|
|
|
when (cacheMode) {
|
|
|
CacheMode.READ -> cache.get(request) ?: throw NoCacheException(request)
|
|
|
CacheMode.READ_THEN_REQUEST -> cache.get(request) ?: chain.proceed(request).run {
|
|
|
cache.put(this)
|
|
|
}
|
|
|
+
|
|
|
CacheMode.REQUEST_THEN_READ -> try {
|
|
|
chain.proceed(request).run {
|
|
|
cache.put(this)
|
|
@@ -73,16 +77,18 @@ object NetOkHttpInterceptor : Interceptor {
|
|
|
} catch (e: Exception) {
|
|
|
cache.get(request) ?: throw NoCacheException(request)
|
|
|
}
|
|
|
+
|
|
|
CacheMode.WRITE -> chain.proceed(request).run {
|
|
|
cache.put(this)
|
|
|
}
|
|
|
+
|
|
|
else -> chain.proceed(request)
|
|
|
}
|
|
|
} else {
|
|
|
chain.proceed(request)
|
|
|
}
|
|
|
- val respBody = response.body?.toNetResponseBody(request.downloadListeners()) {
|
|
|
- detach(chain.call())
|
|
|
+ val respBody = response.body?.toNetResponseBody(request.tagOf<NetTag.DownloadListeners>()) {
|
|
|
+ removeRunningCall(chain)
|
|
|
}
|
|
|
return response.newBuilder().body(respBody).build()
|
|
|
} catch (e: SocketTimeoutException) {
|
|
@@ -98,12 +104,19 @@ object NetOkHttpInterceptor : Interceptor {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private fun attach(chain: Interceptor.Chain) {
|
|
|
+ /**
|
|
|
+ * 将请求添加到请求队列
|
|
|
+ */
|
|
|
+ private fun appendRunningCall(chain: Interceptor.Chain) {
|
|
|
NetConfig.runningCalls.add(WeakReference(chain.call()))
|
|
|
}
|
|
|
|
|
|
- private fun detach(call: Call) {
|
|
|
+ /**
|
|
|
+ * 将请求从请求队列移除
|
|
|
+ */
|
|
|
+ private fun removeRunningCall(chain: Interceptor.Chain) {
|
|
|
val iterator = NetConfig.runningCalls.iterator()
|
|
|
+ val call = chain.call()
|
|
|
while (iterator.hasNext()) {
|
|
|
if (iterator.next().get() == call) {
|
|
|
iterator.remove()
|