Module: Async::HTTP::Cache::Body
- Defined in:
- lib/async/http/cache/body.rb
Overview
Provides utilities for wrapping HTTP response bodies with caching capabilities.
Constant Summary collapse
- TRAILER =
"trailer"- ETAG =
"etag"
Class Method Summary collapse
-
.wrap(response, &block) ⇒ Object
Wrap a response body with caching functionality, including ETag generation and completion handling.
Class Method Details
.wrap(response, &block) ⇒ Object
Wrap a response body with caching functionality, including ETag generation and completion handling.
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
# File 'lib/async/http/cache/body.rb', line 27 def self.wrap(response, &block) if body = response.body if body.empty? # A body that is empty? at the outset, is immutable. This generally only applies to HEAD requests. yield response, body else # Insert a rewindable body so that we can cache the response body: rewindable = ::Protocol::HTTP::Body::Rewindable.wrap(response) unless response.headers.include?(ETAG) # Add the etag header to the trailers: response.headers.add(TRAILER, ETAG) # Compute a digest and add it to the response headers: ::Protocol::HTTP::Body::Digestable.wrap(response) do |wrapper| response.headers.add(ETAG, wrapper.etag) end end # Wrap the response with the callback: ::Protocol::HTTP::Body::Completable.wrap(response) do |error| if error Console::Event::Failure.for(error).emit(self) else yield response, rewindable.buffered end end end else yield response, nil end return response end |