|
@@ -22,21 +22,23 @@ import com.drake.net.body.peekString
|
|
|
import com.drake.net.body.value
|
|
|
import com.drake.net.convert.NetConverter
|
|
|
import com.drake.net.interfaces.ProgressListener
|
|
|
-import com.drake.net.tag.NetLabel
|
|
|
-import okhttp3.*
|
|
|
+import com.drake.net.tag.NetTag
|
|
|
+import okhttp3.FormBody
|
|
|
+import okhttp3.MultipartBody
|
|
|
+import okhttp3.OkHttpUtils
|
|
|
+import okhttp3.Request
|
|
|
import java.net.URLDecoder
|
|
|
import java.util.concurrent.ConcurrentLinkedQueue
|
|
|
import kotlin.reflect.KType
|
|
|
|
|
|
-//<editor-fold desc="请求属性">
|
|
|
-
|
|
|
+//<editor-fold desc="ID">
|
|
|
/**
|
|
|
* 请求的Id
|
|
|
*/
|
|
|
var Request.id: Any?
|
|
|
- get() = label<NetLabel.RequestId>()
|
|
|
+ get() = tagOf<NetTag.RequestId>()
|
|
|
set(value) {
|
|
|
- setLabel(NetLabel.RequestId(value))
|
|
|
+ tagOf(NetTag.RequestId(value))
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -45,205 +47,131 @@ var Request.id: Any?
|
|
|
* 在设计理念上分组可以重复. Id不行
|
|
|
*/
|
|
|
var Request.group: Any?
|
|
|
- get() = label<NetLabel.RequestGroup>()
|
|
|
+ get() = tagOf<NetTag.RequestGroup>()
|
|
|
set(value) {
|
|
|
- setLabel(NetLabel.RequestGroup(value))
|
|
|
+ tagOf(NetTag.RequestGroup(value))
|
|
|
}
|
|
|
+//</editor-fold>
|
|
|
|
|
|
/**
|
|
|
* 是否输出网络请求日志
|
|
|
* 该属性和[NetConfig.logEnabled]有所区别
|
|
|
* @see [com.drake.net.interceptor.LogRecordInterceptor]
|
|
|
*/
|
|
|
-var Request.logRecord: Boolean?
|
|
|
- get() = label<NetLabel.LogRecord>()?.enabled
|
|
|
+var Request.logRecord: Boolean
|
|
|
+ get() = tagOf<NetTag.LogRecord>()?.enabled ?: true
|
|
|
set(value) {
|
|
|
- setLabel(value?.let { NetLabel.LogRecord(it) })
|
|
|
+ tagOf(NetTag.LogRecord(value))
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* KType属于Kotlin特有的Type, 某些kotlin独占框架可能会使用到. 例如 kotlin.serialization
|
|
|
*/
|
|
|
var Request.kType: KType?
|
|
|
- get() = label<NetLabel.RequestKType>()?.value
|
|
|
+ get() = tagOf<NetTag.RequestKType>()?.value
|
|
|
set(value) {
|
|
|
- setLabel(NetLabel.RequestKType(value))
|
|
|
+ tagOf(NetTag.RequestKType(value))
|
|
|
}
|
|
|
|
|
|
-//</editor-fold>
|
|
|
-
|
|
|
-//<editor-fold desc="Request.Builder">
|
|
|
-
|
|
|
-/**
|
|
|
- * 设置请求Id
|
|
|
- */
|
|
|
-fun Request.Builder.setId(id: Any?) = apply {
|
|
|
- setLabel(NetLabel.RequestId(id))
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * 设置请求分组
|
|
|
- */
|
|
|
-fun Request.Builder.setGroup(group: Any?) = apply {
|
|
|
- setLabel(NetLabel.RequestGroup(group))
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * 设置是否记录日志
|
|
|
- */
|
|
|
-fun Request.Builder.setLogRecord(enabled: Boolean) = apply {
|
|
|
- setLabel(NetLabel.LogRecord(enabled))
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * 设置KType
|
|
|
- */
|
|
|
-fun Request.Builder.setKType(type: KType) = apply {
|
|
|
- setLabel(NetLabel.RequestKType(type))
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * 全部的请求头
|
|
|
- */
|
|
|
-fun Request.Builder.headers(): Headers.Builder {
|
|
|
- return OkHttpUtils.headers(this)
|
|
|
-}
|
|
|
-//</editor-fold>
|
|
|
-
|
|
|
-//<editor-fold desc="标签">
|
|
|
|
|
|
+//<editor-fold desc="Extra">
|
|
|
/**
|
|
|
* 返回键值对的标签
|
|
|
* 键值对标签即OkHttp中的实际tag(在Net中叫label)中的一个Map集合
|
|
|
*/
|
|
|
-fun Request.tag(name: String): Any? {
|
|
|
- return label<NetLabel.Tags>()?.get(name)
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * 设置键值对的标签
|
|
|
- */
|
|
|
-fun Request.setTag(name: String, value: Any?) {
|
|
|
- val tags = tags()
|
|
|
- if (value == null) {
|
|
|
- tags.remove(name)
|
|
|
- } else {
|
|
|
- tags[name] = value
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * 设置键值对的tag
|
|
|
- */
|
|
|
-fun Request.Builder.setTag(name: String, value: Any?) = apply {
|
|
|
- val tags = tags()
|
|
|
- if (value == null) {
|
|
|
- tags.remove(name)
|
|
|
- } else {
|
|
|
- tags[name] = value
|
|
|
- }
|
|
|
+fun Request.extra(name: String): Any? {
|
|
|
+ return tagOf<NetTag.Extras>()?.get(name)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 全部键值对标签
|
|
|
*/
|
|
|
-fun Request.tags(): HashMap<String, Any?> {
|
|
|
- var tags = label<NetLabel.Tags>()
|
|
|
- if (tags == null) {
|
|
|
- tags = NetLabel.Tags()
|
|
|
- setLabel(tags)
|
|
|
- }
|
|
|
- return tags
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * 全部键值对标签
|
|
|
- */
|
|
|
-fun Request.Builder.tags(): HashMap<String, Any?> {
|
|
|
- var tags = label<NetLabel.Tags>()
|
|
|
- if (tags == null) {
|
|
|
- tags = NetLabel.Tags()
|
|
|
- setLabel(tags)
|
|
|
+fun Request.extras(): HashMap<String, Any?> {
|
|
|
+ val tags = tags()
|
|
|
+ return tags[NetTag.Extras::class.java] as NetTag.Extras? ?: kotlin.run {
|
|
|
+ val tag = NetTag.Extras()
|
|
|
+ tags[NetTag.Extras::class.java] = tag
|
|
|
+ tag
|
|
|
}
|
|
|
- return tags
|
|
|
}
|
|
|
+//</editor-fold>
|
|
|
|
|
|
+//<editor-fold desc="Tag">
|
|
|
/**
|
|
|
* 返回OkHttp的tag(通过Class区分的tag)
|
|
|
*/
|
|
|
-inline fun <reified T> Request.label(): T? {
|
|
|
+inline fun <reified T> Request.tagOf(): T? {
|
|
|
return tag(T::class.java)
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * 返回OkHttp的tag(通过Class区分的tag)
|
|
|
- */
|
|
|
-inline fun <reified T> Request.Builder.label(): T? {
|
|
|
- return labels()[T::class.java] as? T
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* 设置OkHttp的tag(通过Class区分的tag)
|
|
|
*/
|
|
|
-inline fun <reified T> Request.setLabel(value: T) = apply {
|
|
|
- val labels = labels()
|
|
|
- if (value == null) {
|
|
|
- labels.remove(T::class.java)
|
|
|
- } else {
|
|
|
- labels[T::class.java] = value
|
|
|
- }
|
|
|
+inline fun <reified T> Request.tagOf(value: T) = apply {
|
|
|
+ tags()[T::class.java] = value
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 设置OkHttp的tag(通过Class区分的tag)
|
|
|
+ * 标签集合
|
|
|
*/
|
|
|
-inline fun <reified T> Request.Builder.setLabel(value: T) = apply {
|
|
|
- tag(T::class.java, value)
|
|
|
+fun Request.tags(): MutableMap<Class<*>, Any?> {
|
|
|
+ return OkHttpUtils.tags(this)
|
|
|
}
|
|
|
|
|
|
+//</editor-fold>
|
|
|
+
|
|
|
+//<editor-fold desc="Progress">
|
|
|
/**
|
|
|
- * 标签集合
|
|
|
+ * 全部的上传监听器
|
|
|
*/
|
|
|
-fun Request.labels(): MutableMap<Class<*>, Any?> {
|
|
|
- return OkHttpUtils.tags(this)
|
|
|
+fun Request.uploadListeners(): ConcurrentLinkedQueue<ProgressListener> {
|
|
|
+ return tagOf<NetTag.UploadListeners>() ?: kotlin.run {
|
|
|
+ val tag = NetTag.UploadListeners()
|
|
|
+ tagOf(tag)
|
|
|
+ tag
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 标签集合
|
|
|
+ * 全部的下载监听器
|
|
|
*/
|
|
|
-fun Request.Builder.labels(): MutableMap<Class<*>, Any?> {
|
|
|
- return OkHttpUtils.tags(this)
|
|
|
+fun Request.downloadListeners(): ConcurrentLinkedQueue<ProgressListener> {
|
|
|
+ return tagOf<NetTag.DownloadListeners>() ?: kotlin.run {
|
|
|
+ val tag = NetTag.DownloadListeners()
|
|
|
+ tagOf(tag)
|
|
|
+ tag
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
//</editor-fold>
|
|
|
|
|
|
-//<editor-fold desc="下载">
|
|
|
+//<editor-fold desc="Download">
|
|
|
/**
|
|
|
* 当指定下载目录存在同名文件是覆盖还是进行重命名, 重命名规则是: $文件名_($序号).$后缀
|
|
|
*/
|
|
|
fun Request.downloadConflictRename(): Boolean {
|
|
|
- return label<NetLabel.DownloadFileConflictRename>()?.enabled == true
|
|
|
+ return tagOf<NetTag.DownloadFileConflictRename>()?.enabled == true
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 是否进行校验文件md5, 如果校验则匹配上既马上返回文件而不会进行下载
|
|
|
*/
|
|
|
fun Request.downloadMd5Verify(): Boolean {
|
|
|
- return label<NetLabel.DownloadFileMD5Verify>()?.enabled == true
|
|
|
+ return tagOf<NetTag.DownloadFileMD5Verify>()?.enabled == true
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 下载文件目录
|
|
|
*/
|
|
|
fun Request.downloadFileDir(): String {
|
|
|
- return label<NetLabel.DownloadFileDir>()?.dir ?: NetConfig.app.filesDir.absolutePath
|
|
|
+ return tagOf<NetTag.DownloadFileDir>()?.dir ?: NetConfig.app.filesDir.absolutePath
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 下载文件名
|
|
|
*/
|
|
|
fun Request.downloadFileName(): String? {
|
|
|
- return label<NetLabel.DownloadFileName>()?.name
|
|
|
+ return tagOf<NetTag.DownloadFileName>()?.name
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -251,7 +179,7 @@ fun Request.downloadFileName(): String? {
|
|
|
* 例如下载的文件名如果是中文, 服务器传输给你的会是被URL编码的字符串. 你使用URL解码后才是可读的中文名称
|
|
|
*/
|
|
|
fun Request.downloadFileNameDecode(): Boolean {
|
|
|
- return label<NetLabel.DownloadFileNameDecode>()?.enabled == true
|
|
|
+ return tagOf<NetTag.DownloadFileNameDecode>()?.enabled == true
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -261,71 +189,7 @@ fun Request.downloadFileNameDecode(): Boolean {
|
|
|
* 下载文件名: install.apk, 临时文件名: install.apk.net-download
|
|
|
*/
|
|
|
fun Request.downloadTempFile(): Boolean {
|
|
|
- return label<NetLabel.DownloadTempFile>()?.enabled == true
|
|
|
-}
|
|
|
-//</editor-fold>
|
|
|
-
|
|
|
-//<editor-fold desc="进度监听">
|
|
|
-/**
|
|
|
- * 全部的上传监听器
|
|
|
- */
|
|
|
-fun Request.uploadListeners(): ConcurrentLinkedQueue<ProgressListener> {
|
|
|
- var uploadListeners = label<NetLabel.UploadListeners>()
|
|
|
- if (uploadListeners == null) {
|
|
|
- uploadListeners = NetLabel.UploadListeners()
|
|
|
- setLabel(uploadListeners)
|
|
|
- }
|
|
|
- return uploadListeners
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * 全部的上传监听器
|
|
|
- */
|
|
|
-fun Request.Builder.uploadListeners(): ConcurrentLinkedQueue<ProgressListener> {
|
|
|
- var uploadListeners = label<NetLabel.UploadListeners>()
|
|
|
- if (uploadListeners == null) {
|
|
|
- uploadListeners = NetLabel.UploadListeners()
|
|
|
- setLabel(uploadListeners)
|
|
|
- }
|
|
|
- return uploadListeners
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * 全部的下载监听器
|
|
|
- */
|
|
|
-fun Request.downloadListeners(): ConcurrentLinkedQueue<ProgressListener> {
|
|
|
- var downloadListeners = label<NetLabel.DownloadListeners>()
|
|
|
- if (downloadListeners == null) {
|
|
|
- downloadListeners = NetLabel.DownloadListeners()
|
|
|
- setLabel(downloadListeners)
|
|
|
- }
|
|
|
- return downloadListeners
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * 全部的下载监听器
|
|
|
- */
|
|
|
-fun Request.Builder.downloadListeners(): ConcurrentLinkedQueue<ProgressListener> {
|
|
|
- var downloadListeners = label<NetLabel.DownloadListeners>()
|
|
|
- if (downloadListeners == null) {
|
|
|
- downloadListeners = NetLabel.DownloadListeners()
|
|
|
- setLabel(downloadListeners)
|
|
|
- }
|
|
|
- return downloadListeners
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * 添加上传监听器
|
|
|
- */
|
|
|
-fun Request.addUploadListener(progressListener: ProgressListener) {
|
|
|
- uploadListeners().add(progressListener)
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * 添加下载监听器
|
|
|
- */
|
|
|
-fun Request.addDownloadListener(progressListener: ProgressListener) {
|
|
|
- downloadListeners().add(progressListener)
|
|
|
+ return tagOf<NetTag.DownloadTempFile>()?.enabled == true
|
|
|
}
|
|
|
//</editor-fold>
|
|
|
|
|
@@ -333,14 +197,7 @@ fun Request.addDownloadListener(progressListener: ProgressListener) {
|
|
|
* 返回请求包含的转换器
|
|
|
*/
|
|
|
fun Request.converter(): NetConverter {
|
|
|
- return label<NetConverter>() ?: NetConfig.converter
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * 设置转换器
|
|
|
- */
|
|
|
-fun Request.Builder.setConverter(converter: NetConverter) = apply {
|
|
|
- setLabel(converter)
|
|
|
+ return tagOf<NetConverter>() ?: NetConfig.converter
|
|
|
}
|
|
|
|
|
|
/**
|