2016-03-30 24 views
0

私のレール4のアプリケーションではhtmlhtmljsの両方のリクエストに対してhtmlと応答したいと思います。リクエストがhtmlタイプの場合、レンダリングは正常に動作しますが、リクエストがjsの場合、htmlファイルはレンダリングされません(コマンドラインではレンダリングされています)。シンクラックのリクエストと応答

要求を制限するシナリオがいくつかあり、スロットルコードがhtml POSTjs POST要求によってトリガーされるようになっています。

Rack::Attack.throttle(key, limit: from_config(key, :limit), period: from_config(key, :period)) do |req| 
    if req.path.ends_with?(from_config(key, :path).to_s) && from_config(key, :method) == req.env['REQUEST_METHOD'] 
    ### This is the snippet I try to change the req type with but not working 
    if req.media_type == 'application/javascript' 
     req.media_type = 'text/html' 
    end 
    ##### till here 
    req.ip 
    end 
end 

これは私がレンダリングしようとしているものです。ご覧のとおり、これはhtmlです。

Rack::Attack.throttled_response = lambda do |env| 
    [429, {}, [ActionView::Base.new.render(file: 'public/429.html', content_type: 'text/html')]] 
end 

どうすればよいですか?

UPDATE

これは私の最新バージョンであるが、要求CONTENT_TYPEチェックする方法を見つけ出すことはできません。

Rack::Attack.throttled_response = lambda do |env| 
    retry_after = (env['rack.attack.match_data'] || {})[10] 
    if env['rack.attack.content_type'] == 'text/html' 
    [429, {'Retry-After' => retry_after.to_s}, [ActionView::Base.new.render(file: 'public/429.html', content_type: 'text/html')]] 
    elsif env['rack.attack.content_type'] == 'application/javascript' 
    [429, {'Retry-After' => retry_after.to_s}, window.location.href = '/429.html'] 
    end 
end 

ドキュメント:https://github.com/kickstarter/rack-attack

+0

なぜあなたはそれをしたいですか?カスタムのMIMEタイプを作成したり、ヘッダーを使用して、既存のMIMEタイプの1つを混乱させるのではなく、XHR要求かどうかを確認する方が理にかなっています。 – max

+0

ほとんどのブラウザは、リクエストが 'accept:text/html'以外のものであれば、レスポンスをHTMLとして表示しません。 – max

+0

最大、あなたはそれを私に示すことができますか?私は、これが何らかのアクションの限界を超えた場合にのみ、これが起こるので、なぜこれが何かを混乱させる理由はわかりません。 –

答えて

1

私は@maxに同意します。原則として、JS専用のリクエストにHTMLで応答しないでください。

しかし、問題のこの部分に答えるために:代わりにこれをチェックしてみ

req.env['HTTP_ACCEPT'] 

説明

要求CONTENT_TYPEをチェックする方法を

  1. reqis an object that subclassesRack::Request
  2. Rack prependsHTTP_をクライアントのHTTPリクエストヘッダーに追加し、それらをenvハッシュに追加します。
  3. HTTP clients can indicate what MIME types they accept ヘッダーとは対照的に、Acceptヘッダーには、どのタイプのデータが送信されているかを示すことができます。
+0

monozok、あなたはhtmlの応答をしない場合、この問題をどのように解決しますか? sbyが10回ログインしようとすると(html投稿req)、彼はあまりにも多くのリクエストをしたというページにリダイレクトされます。しかし、スビーがポストスレッドにあまりにも多くのコメントを書いたときも同じことが起こります。問題は、通常は(reqの数の制限内で)jsスニペットで応答する必要があるため、jsリクエストだということです。だから、reqの制限内で、req制限以上のhtmlであれば、どうすればjsで応答できますか? –

+0

あなたの最新バージョンを再読み込みして、私はあなたがリダイレクトするようにブラウザに指示するJSに応答しているのを見ています。だから私はそれに問題はない。私の悪い! – monozok

関連する問題