Using the default Erlang installation what is the minimum code needed to produce a "Hello world" producing web server?
- How is this different fromstackoverflow.com/questions/2084639/… ?Zed– Zed2010-02-07 16:58:06 +00:00CommentedFeb 7, 2010 at 16:58
- 1@Zed, Zubair is asking for a minimal "hello world" server--it has a single "page" because it is minimal. The question you linked to asks how to make a functional Web app (one-page, but responds to a variety of requests in different ways). I assume the latter will be ajax-y.jyoungdev– jyoungdev2012-12-06 13:53:24 +00:00CommentedDec 6, 2012 at 13:53
6 Answers6
Taking "produce" literally, here is a pretty small one. It doesn't even read the request (but does fork on every request, so it's not as minimal possible).
-module(hello).-export([start/1]).start(Port) -> spawn(fun () -> {ok, Sock} = gen_tcp:listen(Port, [{active, false}]), loop(Sock) end).loop(Sock) -> {ok, Conn} = gen_tcp:accept(Sock), Handler = spawn(fun () -> handle(Conn) end), gen_tcp:controlling_process(Conn, Handler), loop(Sock).handle(Conn) -> gen_tcp:send(Conn, response("Hello World")), gen_tcp:close(Conn).response(Str) -> B = iolist_to_binary(Str), iolist_to_binary( io_lib:fwrite( "HTTP/1.0 200 OK\nContent-Type: text/html\nContent-Length: ~p\n\n~s", [size(B), B])).6 Comments
{packet, http} forOptions ofgen_tcp:listen for decoding HTTP headers.apr_socket_recv: Connection reset by peer (104). it works fine when accessing in a browser, or using curl. Do you have any idea why this is?gen_tcp:close(Conn).iolist_to_binary/1 inresponse/1 is unnecessary.For a web server using only the built in libraries check outinets http_server.When in need of some more power but still with simplicity you should check out themochiweb library. You can google for loads of example code.
1 Comment
Another way, similar to thegen_tcp example above but with less code and already offered as a suggestion, is using theinets library.
%%%%%% A simple "Hello, world" server in the Erlang.%%%-module(hello_erlang).-export([ main/1, run_server/0, start/0]).main(_) -> start(), receive stop -> ok end.run_server() -> ok = inets:start(), {ok, _} = inets:start(httpd, [ {port, 0}, {server_name, "hello_erlang"}, {server_root, "/tmp"}, {document_root, "/tmp"}, {bind_address, "localhost"} ]).start() -> run_server().Keep in mind, this exposes your/tmp directory.
To run, simply:
$ escript ./hello_erlang.erlComments
Do you actually want to write a web server in Erlang, or do you want an Erlang web server so that you can create dynamic web content using Erlang?
If the latter, tryYAWS. If the former, have a look at theYAWS source code for inspiration
1 Comment
For a very easy to use webserver for building restful apps or such check out the gen_webserver behaviour:http://github.com/martinjlogan/gen_web_server.
Comments
Just one fix for Felix's answer and it addresses the issues Martin is seeing. Before closing a socket, all data being sent from the client should be received (using for exampledo_recv fromgen_tcp description).
Otherwise there's a race condition for the browser/proxy sending the HTTP request being quick enough to send the http request before the socket is closed.
Comments
Explore related questions
See similar questions with these tags.

