Я пробую пример ковбоя, предоставленный этим репозиторием github:
https://github.com/ninenines/cowboy/tree/master/examples/web_server
Я успешно собираю выпуск с помощью erlang.mk и запускаю следующую команду, которая открывает оболочку Erlang в моем терминале Linux:
$ ./_rel/web_server_example/bin/web_server_example console
Но когда я затем открываю http://localhost:8080
в своем веб-браузере, я получаю следующий отчет об ошибке:
=ОТЧЕТ О ОБ ОШИБКЕ==== 26 ноября 2014 г.::14:33:48 === Ошибка в процессе ‹0.166.0> на узле '[email protected]' со значением выхода: {function_clause,[{cowboy_req, sure_response,[{ok,{http_req,#Port‹0.454>,ranch_tcp,keepalive,‹0.166.0>,‹‹3 байта>>, 'HTTP/1.1',{{127,0,0,1},57150 },‹‹9 байт>>,не определено,8080,‹‹1 байт>>,не определено,‹‹0 байт>>,не определено,не определено,[{‹‹4 байта>>,‹‹14 байт>>}, {‹‹10 байт>>,‹‹10 байт>>},{‹‹13 байт>>,‹‹9 байт>>}, {‹‹6 байт>>,‹‹74 байт>>},{‹ ‹10 байт>>,‹‹104 байта>>},{‹‹15 байт>>,‹‹19 байт>>},{‹‹15 байт>>,‹‹35 байт>>}],[{‹ ‹10 байт>>,[‹‹10 байт>>]}],не определено,[],ожидание,‹‹0 байт>>, не определено...
=ОТЧЕТ О ОБ ОШИБКЕ==== 26-Nov-2014::14:33:48 === Прослушиватель Ranch http начал процесс соединения с cowboy_protocol:start_link/4 в ‹0.166.0> выход с причиной: {function_clause,[{ cowboy_req,ensure_response,[{ok,{http_req,#Port‹0.454>,ranch_tcp,keepalive,‹0.166.0>,‹‹"GET">>,'HTTP/1.1',{{127,0,0,1 },57150},‹‹"localhost">>,не определено,8080,‹‹"/">>,не определено,‹‹>>,не определено,не определено,[{‹‹"host">>,‹‹"localhost :8080">>},{‹‹"соединение">>,‹‹"поддержка активности">>},{‹‹"управление кешем">>,‹‹"max-age=0">>} ,{‹‹"принять">>,‹‹"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8">> },{‹‹"агент пользователя">>,‹‹"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, например Gecko) Chrome/39.0.2171.65 Safari/537.36">>},{‹‹ "accept-encoding">>,‹‹"gzip, deflate, sdch">>},{‹‹"accept-language">>,‹‹"sv-SE,sv;q=0.8,en-US;q =0.6,en;q=0.4">>}],[{‹‹"соединение">>,[‹‹"поддержка активности">>]}],не определено,[],ожидание,‹‹>>, undefined,false,done,[],‹‹>>,undefined}},204],[{file,"src/cowboy_req.erl"},{line,100 9}]},{cowboy_protocol,next_request,3,[{file,"src/cowboy_protocol.erl"},{line,454}]}]}
Это "src/cowboy_protocol.erl" в строке 454:
-spec next_request(cowboy_req:req(), #state{}, any()) -> ok.
next_request(Req, State=#state{req_keepalive=Keepalive, timeout=Timeout},
HandlerRes) ->
cowboy_req:ensure_response(Req, 204),
%% If we are going to close the connection,
%% we do not want to attempt to skip the body.
case cowboy_req:get(connection, Req) of
close ->
terminate(State);
_ ->
%% Skip the body if it is reasonably sized. Close otherwise.
Buffer = case cowboy_req:body(Req) of
{ok, _, Req2} -> cowboy_req:get(buffer, Req2);
_ -> close
end,
%% Flush the resp_sent message before moving on.
if HandlerRes =:= ok, Buffer =/= close ->
receive {cowboy_req, resp_sent} -> ok after 0 -> ok end,
?MODULE:parse_request(Buffer,
State#state{req_keepalive=Keepalive + 1,
until=until(Timeout)}, 0);
true ->
terminate(State)
end
end.
И файл webb_server_app.erl:
%% Feel free to use, reuse and abuse the code in this file.
%% @private
-module(web_server_app).
-behaviour(application).
%% API.
-export([start/2]).
-export([stop/1]).
%% API.
start(_Type, _Args) ->
Dispatch = cowboy_router:compile([
{'_', [
{"/[...]", cowboy_static, {priv_dir, web_server, "", [
{mimetypes, cow_mimetypes, all},
{dir_handler, directory_handler}
]}}
]}
]),
{ok, _} = cowboy:start_http(http, 100, [{port, 8080}], [
{env, [{dispatch, Dispatch}]},
{middlewares, [cowboy_router, directory_lister, cowboy_handler]}
]),
web_server_sup:start_link().
stop(_State) ->
ok.
У кого-нибудь есть какие-либо предложения относительно того, что именно вызывает эту проблему, и как ее решить? Спасибо.
РЕДАКТИРОВАТЬ:
Я могу подтвердить, что в моем случае ошибка была в Erlang OTP версии R16B02. Переход на последнюю версию Erlang (17.3), а также устранение зависимостей отсутствующих файлов, возникших на этапе настройки (с решениями по следующей ссылке):
https://sites.google.com/site/comptekkia/erlang/how-to-install-erlang-on-ubuntu-10-10
Проблема(ы) решена. Пример web_server теперь работает без ошибок.