@@ -35,6 +35,7 @@ import java.security.SecureRandom
3535import java.security.cert.X509Certificate
3636import java.util.concurrent.atomic.AtomicInteger
3737import java.util.concurrent.atomic.AtomicLong
38+ import java.util.concurrent.atomic.AtomicReference
3839import javax.net.ssl.SSLContext
3940import javax.net.ssl.SSLSocketFactory
4041import javax.net.ssl.TrustManager
@@ -590,7 +591,7 @@ class Client @JvmOverloads constructor(
590591 responseType = Map ::class .java
591592 )
592593
593- if (index == 0 || uploadId == null ) {
594+ if (index == 0 ) {
594595 uploadId = chunkResult[" \$ id" ].toString()
595596 }
596597
@@ -624,6 +625,9 @@ class Client @JvmOverloads constructor(
624625 val nextChunk = AtomicInteger (0 )
625626 val completedChunks = AtomicInteger ((offset / CHUNK_SIZE ).toInt())
626627 val uploadedBytes = AtomicLong (offset.coerceAtMost(size))
628+ val completedResultRef = AtomicReference <Map <* , * >? > (null )
629+ val lastResultRef = AtomicReference (result)
630+ val progressLock = Any ()
627631
628632 coroutineScope {
629633 List (MAX_CONCURRENT_UPLOADS .coerceAtMost(chunks.size)) {
@@ -640,23 +644,27 @@ class Client @JvmOverloads constructor(
640644 val chunksUploaded = completedChunks.incrementAndGet()
641645 val sizeUploaded = uploadedBytes.addAndGet(end - start)
642646
647+ lastResultRef.set(chunkResult)
643648 if (isUploadComplete(chunkResult)) {
644- result = chunkResult
649+ completedResultRef.set( chunkResult)
645650 }
646651
647- onProgress?.invoke(
648- UploadProgress (
649- id = uploadId ? : chunkResult[" \$ id" ].toString(),
650- progress = sizeUploaded.coerceAtMost(size).toDouble() / size * 100 ,
651- sizeUploaded = sizeUploaded.coerceAtMost(size),
652- chunksTotal = chunkResult[" chunksTotal" ].toString().toInt(),
653- chunksUploaded = chunksUploaded,
652+ synchronized(progressLock) {
653+ onProgress?.invoke(
654+ UploadProgress (
655+ id = uploadId ? : chunkResult[" \$ id" ].toString(),
656+ progress = sizeUploaded.coerceAtMost(size).toDouble() / size * 100 ,
657+ sizeUploaded = sizeUploaded.coerceAtMost(size),
658+ chunksTotal = chunkResult[" chunksTotal" ].toString().toInt(),
659+ chunksUploaded = chunksUploaded,
660+ )
654661 )
655- )
662+ }
656663 }
657664 }
658665 }.awaitAll()
659666 }
667+ result = completedResultRef.get() ? : lastResultRef.get()
660668 }
661669
662670 return converter(result as Map <String , Any >)
0 commit comments