これはCrystalで書かれていますので、他の人たちのやり方に関する情報源を見てみましょう。
context.response.output = Gzip::Writer.new(context.response.output, sync_close: true)
# ...
call_next(context)
は、どのように我々が書き込まれているの応答を変更することを利用することができます:
例としてCompressHandler
を取ると、基本的な考え方は、所望の制御が可能なものと応答のIOを交換することです?
ナイーブ(と遅い)の例では、単に元の出力のホールドを維持し、代わりにIO::Memory
を提供するために、次のようになります。
このハンドラが変わる任意のハンドラの前に来たときにのみ動作します。もちろん、
client = context.response.output
io = IO::Memory.new
context.response.output = io
call_next(context)
body = io.to_s
new_body = inject_html(body)
client.print new_body
非平文への応答(上記のようにCompressHandler
)。
スマートなソリューションは、元のIOをラップし、書き込まれたものを見て、正しいポイントに注入したいものを注入するカスタムIO実装を提供します。そのようなラッピングIOの例は、IO::Delimited
,IO::Sized
およびIO::MultieWriter
の中で見つけることができ、パターンは、不要な割り振りを防止するために実際には一般的です。
私はこれを試していませんが、 'env.response.write("
質問を更新するだけです。私はすでにHTMLレスポンス本体に書き込まれているhtmlコンテンツを変更したいと思います。 –