@@ -9,6 +9,7 @@ import okhttp3.MediaType.Companion.toMediaType
9
9
import okhttp3.MultipartBody
10
10
import okhttp3.OkHttp
11
11
import okhttp3.Request
12
+ import okhttp3.RequestBody
12
13
import okhttp3.RequestBody.Companion.asRequestBody
13
14
import okhttp3.RequestBody.Companion.toRequestBody
14
15
import uniffi.wp_api.InvalidSslErrorReason
@@ -33,7 +34,8 @@ const val USER_AGENT_HEADER_NAME = "User-Agent"
33
34
class WpRequestExecutor (
34
35
private val httpClient : WpHttpClient = WpHttpClient .DefaultHttpClient (),
35
36
private val dispatcher : CoroutineDispatcher = Dispatchers .IO ,
36
- private val fileResolver : FileResolver = DefaultFileResolver ()
37
+ private val fileResolver : FileResolver = DefaultFileResolver (),
38
+ private val uploadProgressListener : ((uploadedBytes: Long , totalBytes: Long ) -> Unit )? = null
37
39
) : RequestExecutor {
38
40
override suspend fun execute (request : WpNetworkRequest ): WpNetworkResponse =
39
41
withContext(dispatcher) {
@@ -93,10 +95,11 @@ class WpRequestExecutor(
93
95
if (file == null || ! file.canBeUploaded()) {
94
96
throw MediaUploadRequestExecutionException .MediaFileNotFound (mediaUploadRequest.filePath())
95
97
}
98
+ val progressRequestBody = getRequestBody(file, mediaUploadRequest, uploadProgressListener)
96
99
multipartBodyBuilder.addFormDataPart(
97
100
name = " file" ,
98
101
filename = file.name,
99
- body = file.asRequestBody(mediaUploadRequest.fileContentType().toMediaType())
102
+ body = progressRequestBody
100
103
)
101
104
requestBuilder.method(
102
105
method = mediaUploadRequest.method().toString(),
@@ -119,6 +122,26 @@ class WpRequestExecutor(
119
122
}
120
123
}
121
124
125
+ private fun getRequestBody (
126
+ file : File ,
127
+ mediaUploadRequest : MediaUploadRequest ,
128
+ uploadProgressListener : ((uploadedBytes: Long , totalBytes: Long ) -> Unit )?
129
+ ): RequestBody {
130
+ val fileRequestBody = file.asRequestBody(mediaUploadRequest.fileContentType().toMediaType())
131
+ return if (uploadProgressListener != null ) {
132
+ ProgressRequestBody (
133
+ delegate = fileRequestBody,
134
+ progressListener = object : ProgressRequestBody .ProgressListener {
135
+ override fun onProgress (bytesWritten : Long , contentLength : Long ) {
136
+ uploadProgressListener.invoke(bytesWritten, contentLength)
137
+ }
138
+ }
139
+ )
140
+ } else {
141
+ fileRequestBody
142
+ }
143
+ }
144
+
122
145
override suspend fun sleep (millis : ULong ) {
123
146
delay(millis.toLong())
124
147
}
0 commit comments