pull/2731/head
parent
3c4e7cb79e
commit
2bd68eb1a3
@ -0,0 +1,75 @@ |
||||
package io.legado.app.lib.cronet |
||||
|
||||
import androidx.annotation.Keep |
||||
import okhttp3.RequestBody |
||||
import okio.BufferedSource |
||||
import okio.Pipe |
||||
import okio.buffer |
||||
import org.chromium.net.UploadDataProvider |
||||
import org.chromium.net.UploadDataSink |
||||
import java.io.IOException |
||||
import java.nio.ByteBuffer |
||||
import java.util.concurrent.ExecutorService |
||||
|
||||
/** |
||||
* 用于上传大型文件 |
||||
* |
||||
* @property body |
||||
* @property executorService |
||||
*/ |
||||
@Keep |
||||
class LargeBodyUploadProvider( |
||||
private val body: RequestBody, |
||||
private val executorService: ExecutorService |
||||
) : UploadDataProvider(), AutoCloseable { |
||||
private val pipe = Pipe(BUFFER_SIZE.toLong()) |
||||
private var source: BufferedSource = pipe.source.buffer() |
||||
|
||||
@Volatile |
||||
private var filled: Boolean = false |
||||
override fun getLength(): Long { |
||||
return body.contentLength() |
||||
} |
||||
|
||||
override fun read(uploadDataSink: UploadDataSink, byteBuffer: ByteBuffer) { |
||||
if (!filled) { |
||||
fillBuffer() |
||||
} |
||||
check(byteBuffer.hasRemaining()) { "Cronet passed a buffer with no bytes remaining" } |
||||
var read: Int |
||||
var bytesRead = 0 |
||||
while (bytesRead <= 0) { |
||||
read = source.read(byteBuffer) |
||||
bytesRead += read |
||||
} |
||||
uploadDataSink.onReadSucceeded(false) |
||||
} |
||||
|
||||
@Synchronized |
||||
private fun fillBuffer() { |
||||
executorService.submit { |
||||
try { |
||||
val writeSink = pipe.sink.buffer() |
||||
filled = true |
||||
body.writeTo(writeSink) |
||||
writeSink.flush() |
||||
} catch (e: IOException) { |
||||
e.printStackTrace() |
||||
} |
||||
|
||||
} |
||||
|
||||
} |
||||
|
||||
override fun rewind(p0: UploadDataSink?) { |
||||
check(body.isOneShot()) { "Okhttp RequestBody is OneShot" } |
||||
filled = false |
||||
fillBuffer() |
||||
} |
||||
|
||||
override fun close() { |
||||
pipe.cancel() |
||||
source.close() |
||||
super.close() |
||||
} |
||||
} |
Loading…
Reference in new issue