1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- package com.drake.net.body
- import com.drake.net.interfaces.ProgressListener
- import okhttp3.MultipartBody
- import okhttp3.RequestBody
- import okhttp3.ResponseBody
- import okhttp3.ResponseBody.Companion.asResponseBody
- import okio.Buffer
- import java.util.concurrent.ConcurrentLinkedQueue
- fun RequestBody.toNetRequestBody(listeners: ConcurrentLinkedQueue<ProgressListener>? = null) = run {
- NetRequestBody(this, listeners)
- }
- fun ResponseBody.toNetResponseBody(
- listeners: ConcurrentLinkedQueue<ProgressListener>? = null,
- complete: (() -> Unit)? = null
- ) = run { NetResponseBody(this, listeners, complete) }
- @JvmName("peekString")
- fun RequestBody?.peekString(byteCount: Long = 1024 * 1024, discard: Boolean = false): String? {
- return when (this) {
- null -> return null
- is NetRequestBody -> peekString(byteCount, discard)
- else -> {
- val buffer = Buffer()
- writeTo(buffer)
- if (discard && buffer.size > byteCount) return ""
- val byteCountFinal = if (byteCount < 0) buffer.size else minOf(buffer.size, byteCount)
- buffer.readUtf8(byteCountFinal)
- }
- }
- }
- fun ResponseBody.peekString(byteCount: Long = 1024 * 1024 * 4, discard: Boolean = false): String {
- return when (this) {
- is NetResponseBody -> peekString(byteCount, discard)
- else -> {
- val peeked = source().peek()
- val buffer = Buffer()
- peeked.request(byteCount)
- val byteCountFinal =
- if (byteCount < 0) peeked.buffer.size else minOf(byteCount, peeked.buffer.size)
- buffer.write(peeked, byteCountFinal)
- if (discard && buffer.size > byteCount) return ""
- buffer.asResponseBody(contentType(), byteCountFinal).string()
- }
- }
- }
- fun MultipartBody.Part.isFile(): Boolean {
- val contentDisposition = headers?.get("Content-Disposition") ?: return false
- return ";\\s${"filename"}=\"(.+?)\"".toRegex().find(contentDisposition)?.groupValues?.getOrNull(1) != null
- }
- fun MultipartBody.Part.name(): String? {
- val contentDisposition = headers?.get("Content-Disposition") ?: return null
- return ";\\s${"name"}=\"(.+?)\"".toRegex().find(contentDisposition)?.groupValues?.getOrNull(1) ?: ""
- }
- fun MultipartBody.Part.value(): String? {
- val contentDisposition = headers?.get("Content-Disposition") ?: return null
- return ";\\s${"filename"}=\"(.+?)\"".toRegex().find(contentDisposition)?.groupValues?.getOrNull(1)
- ?: body.peekString()
- }
|