[Cowboy-Erlang]: ошибка при указании на localhost:8080 с использованием предоставленного примера ковбоя web_server

Я пробую пример ковбоя, предоставленный этим репозиторием 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 теперь работает без ошибок.


person Jazzbaron    schedule 26.11.2014    source источник


Ответы (1)


Ошибка говорит function clause, поэтому аргументы cowboy_req:ensure_response/2 должны быть неверными. И действительно, потому что первый аргумент {ok, Request} вместо Request. Вы должны отследить, какая функция вызвала next_request/3 с неверным аргументом, потому что она явно должна быть вызвана без ok.

Вероятно, где-то в конце вы найдете что-то вроде:

Req = some_function(...)

И вам нужно будет изменить его на:

{ok, Req} = some_function(...)

Удачи и удачной охоты за ошибками :D

ОБНОВЛЕНИЕ: я только что клонировал репозиторий, и он отлично работает для меня. Я получил список каталогов, так что это не ошибка в ковбое, а где-то в пользовательском коде.

person tkowal    schedule 26.11.2014
comment
Я в процессе поиска этой ошибки, хотя я новичок. Итак, вы говорите, что ошибка в самом примере web_server, или вам удалось заставить локальный хост на порту 8080 фактически отображать то, что находится в папке priv? - person Jazzbaron; 27.11.2014
comment
Я смог отобразить то, что находится в папке. Похоже, вы что-то изменили в примере. Попробуйте снова клонировать репозиторий и использовать Erlang 17. Возможно, это поможет. - person tkowal; 27.11.2014
comment
Хорошо, я могу подтвердить, что в моем случае ошибка была в Erlang OTP версии R16B02. Переход на последнюю версию Erlang (17.3), а также решение других проблем, возникших при настройке, с решением по следующей ссылке: sites.google.com/site/comptekkia/erlang/ Проблема(ы) решена. Пример web_server теперь работает, спасибо :) - person Jazzbaron; 27.11.2014