commit
						255d276add
					
				@ -0,0 +1,66 @@ | 
				
			||||
package io.legado.app.help.http.cronet | 
				
			||||
 | 
				
			||||
 | 
				
			||||
import android.os.Build | 
				
			||||
import androidx.annotation.RequiresApi | 
				
			||||
import okhttp3.Call | 
				
			||||
import okhttp3.Request | 
				
			||||
import okhttp3.Response | 
				
			||||
import org.chromium.net.CronetException | 
				
			||||
import org.chromium.net.UrlRequest | 
				
			||||
import org.chromium.net.UrlResponseInfo | 
				
			||||
import java.io.IOException | 
				
			||||
import java.nio.ByteBuffer | 
				
			||||
import java.util.concurrent.CompletableFuture | 
				
			||||
import java.util.concurrent.TimeUnit | 
				
			||||
 | 
				
			||||
@RequiresApi(api = Build.VERSION_CODES.N) | 
				
			||||
class NewCallBack(originalRequest: Request, mCall: Call) : AbsCallBack(originalRequest, mCall) { | 
				
			||||
    private val responseFuture = CompletableFuture<Response>() | 
				
			||||
 | 
				
			||||
 | 
				
			||||
    @Throws(IOException::class) | 
				
			||||
    override fun waitForDone(urlRequest: UrlRequest): Response { | 
				
			||||
        return responseFuture.get(mCall.timeout().timeoutNanos(), TimeUnit.NANOSECONDS) | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    override fun onRedirectReceived( | 
				
			||||
        request: UrlRequest, | 
				
			||||
        info: UrlResponseInfo, | 
				
			||||
        newLocationUrl: String | 
				
			||||
    ) { | 
				
			||||
        super.onRedirectReceived(request, info, newLocationUrl) | 
				
			||||
        if (mException != null) { | 
				
			||||
            responseFuture.completeExceptionally(mException) | 
				
			||||
        } | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
 | 
				
			||||
    override fun onReadCompleted( | 
				
			||||
        request: UrlRequest, | 
				
			||||
        info: UrlResponseInfo, | 
				
			||||
        byteBuffer: ByteBuffer | 
				
			||||
    ) { | 
				
			||||
        super.onReadCompleted(request, info, byteBuffer) | 
				
			||||
        if (mException != null) { | 
				
			||||
            responseFuture.completeExceptionally(mException) | 
				
			||||
        } | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    override fun onSucceeded(request: UrlRequest, info: UrlResponseInfo) { | 
				
			||||
        super.onSucceeded(request, info) | 
				
			||||
        responseFuture.complete(mResponse) | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    override fun onFailed(request: UrlRequest, info: UrlResponseInfo?, error: CronetException) { | 
				
			||||
        super.onFailed(request, info, error) | 
				
			||||
        responseFuture.completeExceptionally(mException) | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    override fun onCanceled(request: UrlRequest?, info: UrlResponseInfo?) { | 
				
			||||
        super.onCanceled(request, info) | 
				
			||||
        responseFuture.completeExceptionally(mException) | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -0,0 +1,66 @@ | 
				
			||||
package io.legado.app.help.http.cronet | 
				
			||||
 | 
				
			||||
import android.os.ConditionVariable | 
				
			||||
import okhttp3.Call | 
				
			||||
import okhttp3.Request | 
				
			||||
import okhttp3.Response | 
				
			||||
import org.chromium.net.CronetException | 
				
			||||
import org.chromium.net.UrlRequest | 
				
			||||
import org.chromium.net.UrlResponseInfo | 
				
			||||
import java.io.IOException | 
				
			||||
import java.nio.ByteBuffer | 
				
			||||
 | 
				
			||||
class OldCallback(originalRequest: Request, mCall: Call) : AbsCallBack(originalRequest, mCall) { | 
				
			||||
 | 
				
			||||
    private val mResponseCondition = ConditionVariable() | 
				
			||||
 | 
				
			||||
    @Throws(IOException::class) | 
				
			||||
    override fun waitForDone(urlRequest: UrlRequest): Response { | 
				
			||||
        //获取okhttp call的完整请求的超时时间 | 
				
			||||
        val timeOutMs: Long = mCall.timeout().timeoutNanos() / 1000000 | 
				
			||||
        if (timeOutMs > 0) { | 
				
			||||
            mResponseCondition.block(timeOutMs) | 
				
			||||
        } else { | 
				
			||||
            mResponseCondition.block() | 
				
			||||
        } | 
				
			||||
        //ConditionVariable 正常open或者超时open后,检查urlRequest是否完成 | 
				
			||||
        if (!urlRequest.isDone) { | 
				
			||||
            urlRequest.cancel() | 
				
			||||
            mException = IOException("Cronet timeout after wait " + timeOutMs + "ms") | 
				
			||||
        } | 
				
			||||
 | 
				
			||||
        if (mException != null) { | 
				
			||||
            throw mException as IOException | 
				
			||||
        } | 
				
			||||
        return this.mResponse | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
 | 
				
			||||
    override fun onReadCompleted( | 
				
			||||
        request: UrlRequest, | 
				
			||||
        info: UrlResponseInfo, | 
				
			||||
        byteBuffer: ByteBuffer | 
				
			||||
    ) { | 
				
			||||
        super.onReadCompleted(request, info, byteBuffer) | 
				
			||||
        if (mException != null) { | 
				
			||||
            mResponseCondition.open() | 
				
			||||
        } | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    override fun onSucceeded(request: UrlRequest, info: UrlResponseInfo) { | 
				
			||||
        super.onSucceeded(request, info) | 
				
			||||
        mResponseCondition.open() | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    override fun onFailed(request: UrlRequest, info: UrlResponseInfo?, error: CronetException) { | 
				
			||||
        super.onFailed(request, info, error) | 
				
			||||
        mResponseCondition.open() | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
 | 
				
			||||
    override fun onCanceled(request: UrlRequest?, info: UrlResponseInfo?) { | 
				
			||||
        super.onCanceled(request, info) | 
				
			||||
        mResponseCondition.open() | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
} | 
				
			||||
					Loading…
					
					
				
		Reference in new issue