Как установить размер чанка для HttpRequest / HttpEntity, созданного из ByteString - PullRequest
0 голосов
/ 16 января 2019

Если я хочу загрузить файл в akka-http, я могу использовать такой метод, где я могу контролировать размер чанка:

  private def createUploadRequest(streamName: String, uri: Uri, path: Path): Future[(HttpRequest, Path)] = {
    val bodyPart = FormData.BodyPart.fromPath("data", ContentTypes.`application/octet-stream`, path, chunkSize)
    val body     = FormData(bodyPart) 
    Marshal(body).to[RequestEntity].map { entity => 
      HttpRequest(method = HttpMethods.POST, uri = uri, entity = entity) -> path
    }
  }

Однако, если у меня есть только ByteString с содержимым и я хочу загрузить его, я не могу контролировать размер чанка:

  private def makeHttpRequest(streamName: String, serverInfo: ServerInfo, bs: ByteString): HttpRequest = {
    HttpRequest(
      HttpMethods.POST,
      s"http://${serverInfo.host}:${serverInfo.port}$distRoute/$streamName",
      entity = HttpEntity(ContentTypes.`application/octet-stream`, bs)
    )
  }

Есть ли способ также контролировать размер чанка при создании HttpEntity из ByteString?

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Просто небольшая поправка к опубликованному решению, чтобы оно скомпилировалось:

    type ChunkSize = Int

    val chunkedFromByteString : ChunkSize => ByteString => HttpEntity =
      chunkSize => byteString =>
        Chunked(
          ContentTypes.`application/octet-stream`,
          Source
            .fromIterator(() => byteString sliding chunkSize)
            .map(ChunkStreamPart.apply)
        )
0 голосов
/ 18 января 2019

Создайте объект Chunked вместо использования метода HttpEntity.apply:

import akka.http.scaladsl.model.HttpEntity.Chunked
import akka.http.scaladsl.model.HttpEntity.ChunkStreamPart

type ChunkSize = Int

val chunkedEntityFromByteString : ChunkSize => ByteString => Entity = 
  chunkSize => byteString =>
    Chunked(
      ContentTypes.`application/octet-stream`,
      Source
        .fromIterator(() => byteString sliding chunkSize)
        .map(ChunkStreamPart.apply)
    )
...