gaggle

gaggle

Super simple Cowboy example throwing :badmap error

Hey all,

Maybe my tired eyes are just tiredly overlooking a tired tiny detail, but for all the staring and experimenting I’ve done I can’t seem to get past this :sweat_smile:

I start iex and start my cowboy module:

$ iex -S mix
Erlang/OTP 26 [erts-14.2.2] [source] [64-bit] [smp:12:12] [ds:12:12:10] [async-threads:1] [dtrace]

Interactive Elixir (1.16.1) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> Cowboy.start
Cowboy server started on port 8080
:ok

Then I curl in another terminal:

$ curl http://localhost:8080

And the server throws this:

21:58:22.288 [error] Ranch listener :my_http_listener, connection process #PID<0.247.0>, stream 1 had its request process #PID<0.248.0> exit with reason {:badmap, [{"content-type", "text/html"}]} and stacktrace [{:cowboy_req, :reply, 4, [file: ~c"/cowboy_example/deps/cowboy/src/cowboy_req.erl", line: 837]}, {HelloHandler, :init, 2, [file: ~c"lib/application.ex", line: 19]}, {:cowboy_handler, :execute, 2, [file: ~c"/cowboy_example/deps/cowboy/src/cowboy_handler.erl", line: 37]}, {:cowboy_stream_h, :execute, 3, [file: ~c"/cowboy_example/deps/cowboy/src/cowboy_stream_h.erl", line: 306]}, {:cowboy_stream_h, :request_process, 3, [file: ~c"/cowboy_example/deps/cowboy/src/cowboy_stream_h.erl", line: 295]}, {:proc_lib, :init_p_do_apply, 3, [file: ~c"proc_lib.erl", line: 241]}]

Headers are “:badmap”?

Here’s the sourcecode:

defmodule Cowboy do
  def start() do
    dispatch = :cowboy_router.compile([ {:_, [ {"/", HelloHandler, []} ]} ])

    {:ok, _} = :cowboy.start_clear(
        :my_http_listener,
        [{:port, 8080}],
        %{env: %{dispatch: dispatch}}
      )

    IO.puts("Cowboy server started on port 8080")
  end
end

defmodule HelloHandler do
  def init(req, _opts) do
    {:ok, resp} = :cowboy_req.reply( 200, [{"content-type", "text/html"}], "<h1>Hello World!</h1>", req )
    {:ok, resp, :nostate}
  end
end

I must be doing something wrong but I’m pretty new to navigating Erlang docs and translating it into Elixir… can you spot it, or help me spot it?

(And mix.exs is configured with {:cowboy, "~> 2.11"} in deps, and extra_applications: [:logger, :cowboy] in application FWIW)

Marked As Solved

gaggle

gaggle

Ah… ah yes!, moving to a map for headers solves that error. I tried that early but apparently got stuck on another error after without realizing, and never went back to try that. Thanks for suggesting it.

nine nines docs show this:

init(Req0=#{method := <<"GET">>}, State) ->
    Req = cowboy_req:reply(200, #{
        <<"content-type">> => <<"text/plain">>
    }, <<"Hello world!">>, Req0),
    {ok, Req, State};

In hindsight I just had to search to confirm #{} syntax in Erlang means a map in Elixir, d’oh. And I misunderstood what comes back from cowboy_req.reply, now that I can navigate Erlang code a tiny bit I can see it’s init that returns an ok-tuple, not .reply itself.

Anyway, everything works now, thanks for the assist @Sanjibukai!

Updated code

defmodule CowboyExample.Application do
use Application

def start(_type, args) do
dispatch = :cowboy_router.compile([{:
, [{“/”, CowboyExample.HelloHandler, }]}])

{:ok, _} =
  :cowboy.start_clear(
    :my_http_listener,
    [{:port, 8080}],
    %{env: %{dispatch: dispatch}}
  )

IO.puts("Cowboy server started on port 8080")

Supervisor.start_link([], strategy: :one_for_one, name: CowboyExample.Supervisor)

end
end

defmodule CowboyExample.HelloHandler do
def init(req, _opts) do
req = :cowboy_req.reply(200, %{“content-type” => “text/html”}, “

Hello World!

”, req)
{:ok, req, :nostate}
end
end

Also Liked

Sanjibukai

Sanjibukai

If I look here, it seems the second argument to cowboy_req.reply should be a map (not a tuple) Nine Nines: The Req object

Maybe, try using a map %{"content-type" => "text/html"}

Although I don’t have much experience with bare cowboy…

Also, I don’t remember if we need to use single quotes for string or not (for the Erlang side)…

Good luck…

Edit: According to the above link, the maps fields is expected to be “binaries” and according to here Erlang/Elixir Syntax: A Crash Course - The Elixir programming language using double quotes on the Elixir side is enough…

Where Next?

Popular in Questions Top

Fl4m3Ph03n1x
Background Let’s assume I have a typical GenServer that receives messages as requests, does some operation in a DB and returns responses....
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID&lt;0.412.0&gt; terminating ** (Postgrex.Error) FATAL...
New
sergio_101
I am VERY much an elixir newbie. I have taken one elixir course and one phoenix course on Udemy. During that course, I saw the instructor...
New
_russellb
I want to try my hand at web scraping. What tools/libraries do I need to use. I’m hoping to turn this into something professional so don’...
New
dokuzbir
Hello, I am trying to convert my lists to string without losing brackets.For start i have 3 map. They look like these buyer = %{ id: ...
New
mcarvalho
What is the difference between System.get_env and Application.get_env? For example, what are best practices to use one versus another.
New
stefanluptak
Hello everybody, usually, I use a 29" ultra-wide monitor for VSCode which can easily accomodate explorer (files panel) + file with code ...
New
johnnyicon
Hi all, I've just started learning Elixir and Phoenix Framework, so please pardon my n00bness at this stage. I'm trying to use Postg...
New
Codball
Mix format works fine if run from the cmd. I’ve followed this to facilitate the implementation into VSC which involves downloading an ext...
New
wernerlaude
In AR this is so simple @articles = current_user.articles How to do in Ecto? def index(conn, _params) do current_user = conn.assig...
New

Other popular topics Top

lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New
JDanielMartinez
Hi! May someone helps me, please! I have two apps into an umbrella project: the first one is Database, which manages queries, and the se...
New
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New
Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New
chrismccord
Phoenix 1.4.0 released Phoenix 1.4 is out! This release ships with exciting new features, most notably with HTTP2 support, improved deve...
688 30048 115
New
sergio_101
I am VERY much an elixir newbie. I have taken one elixir course and one phoenix course on Udemy. During that course, I saw the instructor...
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
stefanluptak
Hello everybody, usually, I use a 29" ultra-wide monitor for VSCode which can easily accomodate explorer (files panel) + file with code ...
New
baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
Fl4m3Ph03n1x
About me? ( if you have nothing better to do than reading about some random guy in the internet :stuck_out_tongue: ) Hello all, this is ...
New

We're in Beta

About us Mission Statement