zeroexcuses

zeroexcuses

GoLang has a http server built into it’s stdlib.
Elixir has Phoenix/Cowboy.

Suppose I am looking for a dumb simple http server where:

  1. I need it to serve static files
  2. if I need to do any routing, I’ll parse the http URL myself

What is recommended?

I am looking for a minimal http server where it has the basics and I can understand all the features fully.

Showing Posts 1 to 9

dorgan

dorgan

The most barebones may be this HTTP server — OTP 29.0.2 (inets 9.7.1)

As for recommended, considering you’re using Elixir, I’d say Plug v1.20.2 — Documentation with GitHub - elixir-plug/plug_cowboy: Plug adapter for the Cowboy web server · GitHub, but that escapes your requirements I’m afraid.

Depends on how much time you want to spend on it and how deep into the rabbit hole you want to go I guess. Unless you want to know how exactly does cowboy work, plug is super simple.

cmkarlsson

cmkarlsson

What do you consider basics?

zeroexcuses

zeroexcuses OP

Just these:

Cochonours

Cochonours

Just an idea, but if you don’t need to do any special processing, wouldn’t using nginx or caddy be more than enough for you?

zeroexcuses

zeroexcuses OP

I am looking for small, programmable components. Nginx/Caddy are harder to program compared to builtin Elixir/Erlang libs.

axelson

axelson

Scenic Core Team

You might want to check out bandit as an alternative to Cowboy. It should be simpler to understand although it is much less battle tested.

cmkarlsson

cmkarlsson

I like elli (GitHub - elli-lib/elli: Simple, robust and performant Erlang web server · GitHub) which I’ve used in erlang many times. It is OK to use from elixir as well. In my opinion it is very easy to understand. The implementation is very readable (if you read erlang).

It just does the basics though and you must be prepared to add some middleware or write your own if you need more functionality.

To get started (well, you should read the README.md from their github and follow any links. One of the best things as well is to look in the source for the example callback. I find it is the best place to look to see what is possible):

in mix.exs add {:elli, "~> 3.3.0"} to dependencies.

Write a simple call back module to handle your requests:

defmodule YourApp.ElliHandler do
  @behaviour :elli_handler
  @staticpath "/some/good/path"
  @impl :elli_handler
  @doc """
  The handle/2 function is one of the callbacks.
  It takes the request and returns a response.
  
  It can serve static files via sendfile by just
  returning {:ok, [], {:file, filename}}
  """
  def handle(req, _args) do
    # Split up the method and path and delegate to other functions
    # which uses pattern matching to match on the path. The path
    # is a list of parts of the url split by "/"
    handle(:elli_request.method(req), :elli_request.path(req), req)
  end

  @doc """
  If the paths is /static/<filename>. Serve the file if it exists
  TODO: fix content-type
  """
  defp handle(:'GET', ["static", filename], _req) do
    path = File.join(@staticpath, filename)
    if File.exists(path) do
      {:ok, [], {:file, path}}
    else
      {404, [], "Not Found"}
    end
  end
  defp handle(:'GET', ["dynamic", "user", id], _req) do
    {:ok, [{"Content-Type", "plain/text"}], "User is #{id}"}
  end
  defp handle(_, _, _req) do
    {404, [], "Not Found"}
  end

  @impl :elli_handler
  @doc """
  Will be called during many events of the request cycle. Can be used to hook in to many things
  or not be used at all.
  """
  def handle_event(_event, _data, _args) do
    :ok
  end
end

And hook it up in your supervision tree:

  @impl true
  def start(_type, _args) do
    children = [
      %{
        id: :elli,
        start: {:elli, :start_link, [ [ callback: YourApp.ElliHandler, port: 3000  ]]}
      }
    ]
    opts = [strategy: :one_for_one, name: YourApp.Supervisor]
    Supervisor.start_link(children, opts)
  end
stefanchrobot

stefanchrobot

Single file Phoenix server: phoenix.exs · GitHub.

— All posts loaded —

Where Next? Top

Trending in Discussions Top

juhalehtonen
There has been a thread to discuss the Stack Overflow Developer Survey on this forum every year since 2018, so here’s yet another one for...
New
axelson
Hi there! :wave: @frigidcode and I (but mostly him) have been running an Elixir Book club, we’re almost done with Designing Elixir Syste...
New
budgie
I love Elixir. It’s one of 2 programming languages I’ve ever fallen in love with. But I don’t use it anymore. Serverless was the promis...
New
alexslade
Fly’s CEO posted this recently - Turn And Face The Strange · The Fly Blog It says that Fly is going all-in on sprites, which is a worry ...
New
jam
This was an interesting post by Jose. Curious to hear what others think. Evolving programming languages in the AI era - Dashbit Blog Gen...
New
sntran
In my third year of college, around 2010, I found Erlang. A few years later, I found Elixir. I liked the ideas at once: many small proces...
New
Ganna
Hi everyone, I have 8 years of production experience with Erlang/OTP and I’m just starting to get to know Elixir. What would you learn f...
New

Other Trending Topics Top

mudasobwa
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
KristerV
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
webofbits
With AI doing more of the implementation work, I’ve been wondering how much coding I should deliberately keep doing myself. My main conc...
#ai
New
ausimian
Emily is an Elixir library that runs Nx computations on Apple’s MLX. Install it as the default Nx backend and Nx, defn, Axon, Nx.Serving,...
New
OndrejValenta
(I just needed to vent somewhere and LinkedIn is full of hope, or hype, I’m not sure which exactly) AI dream has many faces, but general...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews