Skip to main content
Version: 2.x

Streaming Examples

Streaming Request​

zio-http-example/src/main/scala/example/RequestStreaming.scala
package example

import zio._

import zio.http._

object RequestStreaming extends ZIOAppDefault {

// Create HTTP route which echos back the request body
val app = Routes(Method.POST / "echo" -> handler { (req: Request) =>
// Returns a stream of bytes from the request
// The stream supports back-pressure
val stream = req.body.asStream

// Creating HttpData from the stream
// This works for file of any size
val data = Body.fromStreamChunked(stream)

Response(body = data)
})

// Run it like any simple app
val run: UIO[ExitCode] =
Server.serve(app).provide(Server.default).exitCode
}

Streaming Response​

zio-http-example/src/main/scala/example/StreamingResponse.scala
package example

import zio.{http, _}

import zio.stream.ZStream

import zio.http._

/**
* Example to encode content using a ZStream
*/
object StreamingResponse extends ZIOAppDefault {
// Starting the server (for more advanced startup configuration checkout `HelloWorldAdvanced`)
def run = Server.serve(routes).provide(Server.default)

// Create a message as a Chunk[Byte]
def message = Chunk.fromArray("Hello world !\r\n".getBytes(Charsets.Http))

def routes: Routes[Any, Response] = Routes(
// Simple (non-stream) based route
Method.GET / "health" -> handler(Response.ok),

// ZStream powered response
Method.GET / "stream" ->
handler(
http.Response(
status = Status.Ok,
body = Body.fromStream(ZStream.fromChunk(message), message.length.toLong), // Encoding content using a ZStream
),
),
)
}

Streaming File​

zio-http-example/src/main/scala/example/FileStreaming.scala
package example

import java.io.File
import java.nio.file.Paths

import zio._

import zio.stream.ZStream

import zio.http._

object FileStreaming extends ZIOAppDefault {

// Create HTTP route
val app = Routes(
Method.GET / "health" -> Handler.ok,

// Read the file as ZStream
// Uses the blocking version of ZStream.fromFile
Method.GET / "blocking" -> Handler.fromStreamChunked(ZStream.fromPath(Paths.get("README.md"))),

// Uses netty's capability to write file content to the Channel
// Content-type response headers are automatically identified and added
// Adds content-length header and does not use Chunked transfer encoding
Method.GET / "video" -> Handler.fromFile(new File("src/main/resources/TestVideoFile.mp4")),
Method.GET / "text" -> Handler.fromFile(new File("src/main/resources/TestFile.txt")),
).sandbox

// Run it like any simple app
val run =
Server.serve(app).provide(Server.default)
}