0

db への応答とともにすべての要求をログに記録したいと考えています。そのためにフックを使用しています。しかし、「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)。

4

1 に答える 1

1

Cowboyの最新バージョン(v0.8.2から知っているように)は、パフォーマンスを向上させるために次のアプローチを使用します-cowboy_req:body(Req)リクエストボディなしでボディとNewReq構造を返します。つまり、これは通常の動作であり、リクエスト ボディを 1 回しか取得できません。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.                                        
于 2013-11-05T04:43:42.530 に答える