2013-10-22 12 views
0

DB에 대한 응답과 함께 모든 요청을 기록하려고합니다. 나는 그것을 위해 후크를 사용하고있다. 하지만 'onresponse'후크에서 요청 본문을 가져올 수없는 것 같습니다. 항상 < < >>입니다. 'onrequest'후크에서 요청 본문을 얻을 수 있습니다.onresponse 후크에서 요청 본문을 가져올 수 없습니다.

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).

+0

'_Body' 매개 변수는 어떻게됩니까? – akonsu

+0

akonsu, _Body에 요청 본문이 포함되지 않았습니다. –

+0

나는 이것을 [email protected]에게 보낼 것이다. 소유자는이 목록에서 꽤 반응합니다. – akonsu

답변

1

최신 버전의 카우보이 (v0.8.2에서 알고 있듯이)는 성능 향상을 위해 다음 방법을 사용합니다 - cowboy_req:body(Req) 요청 본문없이 Body 및 NewReq 구조를 반환하십시오. 즉, 정상적인 동작이며 요청 본문은 한 번만 검색 할 수 있습니다. 카우보이는 요청 시체를받을 수 없으므로 요청시 몸집이 커질 수 있습니다 (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.           
관련 문제