は、だから私は、リクエストボディの内部で何を知っている必要がありMyHandlerというを持っています。元のコンテキストを変更せずに本文をコピーするにはどうすればよいですか?読むリクエストボディにそれを削除せずに
1
A
答えて
6
コアの問題は、Crystalがストリーミング要求本体をサポートしていることです。つまり、要求をストリームするとIOはEOFで、2番目のハンドラはデータを読み取ることができません。
これを解決する簡単な方法は、body_string = context.request.body.try(&.gets_to_end)
を使用してコンテンツ全体を取得し、次に返された文字列にcontext.request.body = body_string
を使用してリクエスト本文を設定することです。これにより、ボディ全体がメモリにバッファされ、メモリに格納されたバッファにボディが設定されます。このアプローチの欠点は、攻撃者が無制限のサイズのリクエストボディを送信し、サーバー上のすべてのメモリを食べてDOS攻撃を引き起こすことです。別の欠点は、バイナリデータを扱う場合、文字列を#to_slice
を使ってスライスに変換して処理する必要があることです。
DOS攻撃の問題を解決する1つの方法 - あなたは心の中で最大のボディサイズを持っている場合は、 - 体が大きすぎる場合には、要求を失敗することです:
if body = context.request.body
body_io = IO::Memory.new
bytes_read = IO.copy(body, body_io, limit: 1_048_576) # 1GiB limit
body_io.rewind
if bytes_read == 1_048_576
# Fail request
end
# use body_io
body_io.rewind # Reset body_io to start
context.request.body = body_io
end
あなたは無限の大きさを受け入れるために必要がある場合本体にバッファリングしない場合は、既存の本体IO
をラップし、IO#read(Bytes)
の中で必要な変換を実行するカスタムIO
実装を作成する必要があります。このメソッドは非常に複雑で、以前のメソッドはほぼすべての状況をカバーしていますので、このオプションのコードサンプルは提供しません。
関連する問題
- 1. リクエストボディをAngular2で読む
- 2. リクエストボディNode.jsサーバーを読む
- 3. 削除は、データベースにそれを削除せずに協会からオブジェクトを削除
- 4. Talendの内容を削除せずにActive MQから読み込む方法
- 5. エンティティフレームワークを使用してベーステーブルから削除せずにテーブルを削除せずにテーブルを削除する
- 6. DialogFragmentをFragmentManagerから削除せずにそれを却下する方法
- 7. Streamオブジェクトを消費せずに読む
- 8. リモートcsvファイルをダウンロードせずに読む
- 9. 読むラインとそれに
- 10. Hibernate - オブジェクトを削除せずにオブジェクト参照を削除する
- 11. キーを削除せずにdicの値を削除
- 12. JS - コンテンツを削除せずにタグを削除する
- 13. Cassandra:テーブル構造を削除せずにデータを削除する
- 14. コミットを削除せずにgitを削除ブランチ
- 15. リモートブランチを削除せずにローカル "リモートブランチ"を削除しますか?
- 16. データを削除せずにHive外部テーブルを削除する
- 17. 投稿ヘッダーを削除せずにページヘッダーを削除する
- 18. 削除せずにpickleファイルに追加
- 19. コピー&元のファイルを削除せずに
- 20. nhibernate:削除せずにコレクションからオブジェクトを削除する
- 21. ポッドを削除せずにサービスから削除する方法
- 22. Javaでファイルを読むときにコンテンツが削除される
- 23. テキストファイルを読むときに句読点を削除する[python]
- 24. iPhoneの古いコンテンツを削除せずにファイルにデータを書き込む
- 25. 古い値を削除せずにプロパティファイルに書き込む方法
- 26. UILocalNotifications:それらを削除/スケジュール解除せずに非アクティブにする方法はありますか?
- 27. ブックマークを削除せずにExcelからWord文書を取り込む
- 28. ファイルの内容を削除せずにjavaでテキストファイルを書き込む方法
- 29. Woocommerce製品アドオンを削除せずに[カートに追加]ボタンを削除
- 30. ユーザーを削除せずにGraphileon InteractorでNeo4j Graphを削除するには?
未定義のメソッド '#reset'は'#rewind'を意味しますか? 'IO.copy'の直後に別の' body_io.rewind'を追加して動作させる必要がありました。ありがとう! P.S:将来のユーザーのためにあなたの答えを更新してください;) –
@VladFaustそのタイプミスをキャッチしてくれてありがとう! – RX14