Cowboy аварийно завершает работу при вызове обработки обратного вызова в потоке REST

У меня есть следующий обработчик REST в приложении Erlang, использующем Cowboy 2.0 (последний RC). Я читаю документы от корки до корки и не могу понять, что не так с моим кодом.

init(Req, State) ->
  {cowboy_rest, Req, State}.

content_types_provided(Req, State) ->
  error_logger:info_msg("Content negotiation~n"),
  {[
     {{<<"text">>, <<"html">>, '*'}, my_handler}
   ], Req, State}.

my_handler(Req, State) ->
  error_logger:info_msg("Got here~n"),      
  ...
  <handler logic>
  ...

А это логи. Как видите, я дошел до «согласования контента», но не дошел до обратного вызова my_handler.

=INFO REPORT==== 31-Aug-2017::13:29:02 ===
Content negotiation

=CRASH REPORT==== 31-Aug-2017::13:29:02 ===
  crasher:
    initial call: cowboy_stream_h:proc_lib_hack/3
    pid: <0.258.0>
    registered_name: []
    exception exit: {{case_clause,no_call},
                     [{cowboy_rest,set_resp_body,2,
                          [{file,
                               "/app/_build/default/lib/cowboy/src/cowboy_rest.erl"},
                           {line,1019}]},
                      {cowboy_rest,upgrade,4,
                          [{file,
                               "/app/_build/default/lib/cowboy/src/cowboy_rest.erl"},
                           {line,238}]},
                      {cowboy_stream_h,execute,3,
                          [{file,
                               "/app/_build/default/lib/cowboy/src/cowboy_stream_h.erl"},
                           {line,179}]},
                      {cowboy_stream_h,proc_lib_hack,3,
                          [{file,
                               "/app/_build/default/lib/cowboy/src/cowboy_stream_h.erl"},
                           {line,164}]},
                      {proc_lib,init_p_do_apply,3,
                          [{file,"proc_lib.erl"},{line,247}]}]}
      in function  cowboy_stream_h:proc_lib_hack/3 (/app/_build/default/lib/cowboy/src/cowboy_stream_h.erl, line 169)
    ancestors: [<0.257.0>,<0.234.0>,<0.233.0>,ranch_sup,<0.222.0>]
    message_queue_len: 0
    messages: []
    links: [<0.257.0>]
    dictionary: []
    trap_exit: false
    status: running
    heap_size: 987
    stack_size: 27
    reductions: 596
  neighbours:

=ERROR REPORT==== 31-Aug-2017::13:29:02 ===
Ranch listener my_http_listener, connection process <0.257.0>, stream 1 had its request process <0.258.0> exit with reason {case_clause,no_call} and stacktrace [{cowboy_rest,set_resp_body,2,[{file,"/app/_build/default/lib/cowboy/src/cowboy_rest.erl"},{line,1019}]},{cowboy_rest,upgrade,4,[{file,"/app/_build/default/lib/cowboy/src/cowboy_rest.erl"},{line,238}]},{cowboy_stream_h,execute,3,[{file,"/app/_build/default/lib/cowboy/src/cowboy_stream_h.erl"},{line,179}]},{cowboy_stream_h,proc_lib_hack,3,[{file,"/app/_build/default/lib/cowboy/src/cowboy_stream_h.erl"},{line,164}]},{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,247}]}]

Я не уверен, есть ли какая-либо проблема в ассоциации обратного вызова content_types_provided/2 с выбранной функцией обработчика. Я написал еще один обработчик REST, который очень похож и работает правильно.

Также в качестве второго вопроса: есть ли способ в content_types_provided/2 направлять каждый запрос одному и тому же обработчику, независимо от HTTP-заголовка Accept: <type/sub-type>, предоставленного в запросе?


person Sasha Fonseca    schedule 31.08.2017    source источник


Ответы (1)


Код модуля cowboy_rest здесь, я думаю, возможно, ошибка возникает из-за того, что функция content_types_provided/2 не экспортируется.

person juan.facorro    schedule 31.08.2017
comment
Здравствуйте @juan.facorro, на самом деле я решил это один, но я отмечу ваш вопрос, так как вы очень близки к ответу. Не экспортируется не функция content_types_provided/2, а функция my_handler/2. Исходя из Эликсира, я привык определять публичные и приватные забавы непосредственно по их определению. - person Sasha Fonseca; 31.08.2017