@@ -65,6 +65,7 @@ import org.modelix.model.persistent.HashUtil
65
65
import org.modelix.model.persistent.MapBasedStore
66
66
import org.modelix.model.server.api.v2.VersionDelta
67
67
import org.modelix.model.server.api.v2.VersionDeltaStream
68
+ import org.modelix.model.server.api.v2.VersionDeltaStreamV2
68
69
import org.modelix.model.server.api.v2.asStream
69
70
import org.modelix.modelql.client.ModelQLClient
70
71
import org.modelix.modelql.core.IMonoStep
@@ -491,32 +492,47 @@ private fun URLBuilder.appendPathSegmentsEncodingSlash(vararg components: String
491
492
fun VersionDelta.getAllObjects (): Map <String , String > = objectsMap + objects.associateBy { HashUtil .sha256(it) }
492
493
493
494
suspend fun HttpResponse.readVersionDelta (): VersionDeltaStream {
494
- return if (contentType()?.match(VersionDeltaStream .CONTENT_TYPE ) == true ) {
495
- val content = bodyAsChannel()
496
- val versionHash = checkNotNull(content.readUTF8Line()) { " No objects received" }
497
- val versionObject = content.readUTF8Line()
498
- return if (versionObject == null ) {
499
- VersionDeltaStream (versionHash, emptyFlow())
500
- } else {
501
- VersionDeltaStream (
502
- versionHash,
503
- flow {
504
- emit(versionHash to versionObject)
505
- while (true ) {
506
- val key = content.readUTF8Line() ? : break
507
- val value = checkNotNull(content.readUTF8Line()) { " Object missing for hash $key " }
508
- emit(key to value)
509
- }
510
- },
511
- )
512
- }
495
+ val parsedContentType = contentType()
496
+ return if (parsedContentType?.match(VersionDeltaStreamV2 .CONTENT_TYPE ) == true ) {
497
+ return readVersionDeltaStreamV2()
498
+ } else if (parsedContentType?.match(VersionDeltaStream .CONTENT_TYPE ) == true ) {
499
+ return readVersionDeltaStreamV1()
513
500
} else {
514
501
body<VersionDelta >().asStream()
515
502
}
516
503
}
517
504
505
+ private suspend fun HttpResponse.readVersionDeltaStreamV1 (): VersionDeltaStream {
506
+ val content = bodyAsChannel()
507
+ val versionHash = checkNotNull(content.readUTF8Line()) { " No objects received" }
508
+ val versionObject = content.readUTF8Line()
509
+ return if (versionObject == null ) {
510
+ VersionDeltaStream (versionHash, emptyFlow())
511
+ } else {
512
+ VersionDeltaStream (
513
+ versionHash,
514
+ flow {
515
+ emit(versionHash to versionObject)
516
+ while (true ) {
517
+ val key = content.readUTF8Line() ? : break
518
+ val value = checkNotNull(content.readUTF8Line()) { " Object missing for hash $key " }
519
+ emit(key to value)
520
+ }
521
+ },
522
+ )
523
+ }
524
+ }
525
+
526
+ private suspend fun HttpResponse.readVersionDeltaStreamV2 (): VersionDeltaStream {
527
+ val content = bodyAsChannel()
528
+ val decodeVersionDeltaStreamV2 = VersionDeltaStreamV2 .decodeVersionDeltaStreamV2(content)
529
+ return VersionDeltaStream (decodeVersionDeltaStreamV2.versionHash, decodeVersionDeltaStreamV2.hashesWithDeltaObject)
530
+ }
531
+
518
532
fun HttpRequestBuilder.useVersionStreamFormat () {
519
- headers.set(HttpHeaders .Accept , VersionDeltaStream .CONTENT_TYPE .toString())
533
+ headers[HttpHeaders .Accept ] = VersionDeltaStreamV2 .CONTENT_TYPE .toString()
534
+ // Add CONTENT_TYPE_VERSION_DELTA_V1 so that newer clients cant talk with older servers.
535
+ headers.append(HttpHeaders .Accept , VersionDeltaStream .CONTENT_TYPE .toString())
520
536
}
521
537
522
538
/* *
0 commit comments