1
0
Fork 0
mirror of https://github.com/edgurgel/httparrot synced 2025-04-17 20:14:10 -04:00
httparrot/lib/httparrot/stream_bytes_handler.ex
2015-01-19 13:48:47 -06:00

43 lines
1.2 KiB
Elixir

defmodule HTTParrot.StreamBytesHandler do
@moduledoc """
Streams n bytes of data, with chunked transfer encoding.
"""
alias HTTParrot.GeneralRequestInfo
use HTTParrot.Cowboy, methods: ~w(GET)
def content_types_provided(req, state) do
{[{{"application", "octet-stream", []}, :get_bytes}], req, state}
end
def malformed_request(req, state) do
{n, req} = :cowboy_req.binding(:n, req)
{seed, req} = :cowboy_req.qs_val("seed", req, "1234")
{chunk_size, req} = :cowboy_req.qs_val("chunk_size", req, "1024")
try do
n = n |> String.to_integer
seed = seed |> String.to_integer
chunk_size = chunk_size |> String.to_integer
{false, req, {n, seed, chunk_size}}
rescue
ArgumentError -> {true, req, state}
end
end
def get_bytes(req, state) do
{n, seed, chunk_size} = state
:random.seed(seed, seed, seed)
{{:chunked, stream_response(n, chunk_size)}, req, nil}
end
defp stream_response(n, chunk_size) do
fn(send_func) ->
Stream.repeatedly(fn -> :random.uniform(255) end)
|> Stream.take(n)
|> Enum.chunk(chunk_size, chunk_size, [])
|> Enum.each fn chunk ->
send_func.(List.to_string(chunk))
end
end
end
end