Не могу получить тело запроса в хуке onresponse

Я хочу регистрировать все запросы вместе с ответами на БД. Я использую для этого крючки. Но похоже, что я не могу получить тело запроса в хуке onresponse, это всегда ‹‹>>. В хуке onrequest я могу получить тело запроса.

Мои крючки определены как:

request_hook(Req) ->
   %% All is OK: ReqBody contains what I sent:
   {ok, ReqBody, Req2} = cowboy_req:body(Req),
   io:format("request_hook: body = ~p", [ReqBody]),
   Req2.

response_hook(_Status, _Headers, _Body, Req) ->
   %% ReqBody is always <<>> at this point. Why?
   {ok, ReqBody, Req2} = cowboy_req:body(Req),
   io:format("response_hook: body = ~p", [ReqBody]),
   Req2.

Это ошибка в ковбое или нормальное поведение?

Я использую последний ковбой, доступный на момент написания этого поста (коммит: aab63d605c595d8d0cd33646d13942d6cb372b60).


person Fred K    schedule 22.10.2013    source источник
comment
как насчет параметра _Body?   -  person akonsu    schedule 22.10.2013
comment
akonsu, _Body содержит тело ответа, а не запроса.   -  person Fred K    schedule 22.10.2013
comment
Я бы отправил это на адрес [email protected]. владелец довольно отзывчив в этом списке.   -  person akonsu    schedule 22.10.2013


Ответы (1)


В последней версии Cowboy (насколько мне известно из версии 0.8.2) для увеличения производительности используется следующий подход - cowboy_req:body(Req) возвращать структуру Body и NewReq без тела запроса. Другими словами, это нормальное поведение, и вы можете получить тело запроса только один раз. Cowboy не получает тело запроса, так как оно может быть огромным, тело помещается в сокет до тех пор, пока оно не станет необходимым (до cowboy_req:body/1 вызова). Также после извлечения тела оно становится недоступным в обработчике. Поэтому, если вы хотите реализовать ведение журнала и сделать тело доступным в обработчике, вы можете сохранить тело по запросу в общем месте и явно удалить его при ответе.

request_hook(Req) ->
        %% limit max body length for security reasons
        %% here we expects that body less than 80000 bytes
        {ok, Body, Req2} = cowboy_req:body(80000, Req),
        put(req_body, Body), %% put body to process dict 
        Req2.

response_hook(RespCode, RespHeaders, RespBody, Req) ->
        ReqBody = get(req_body),
        Req2.

%% Need to cleanup body record in proc dict
%% since cowboy uses one process per several
%% requests in keepalive mode
terminate(_Reason, _Req, _St) ->
        put(req_body, undefined),                
        ok.                                        
person sysoff    schedule 05.11.2013