module Async::HTTP::Cache::Body

Constants

ETAG
TRAILER

Public Class Methods

wrap(response) { |response, body| ... } click to toggle source
# File lib/async/http/cache/body.rb, line 34
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)
                                # 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
                                
                                # Ensure the etag is listed as a trailer:
                                response.headers.add(TRAILER, ETAG)
                        end
                        
                        # Wrap the response with the callback:
                        ::Protocol::HTTP::Body::Completable.wrap(response) do |error|
                                if error
                                        Console.logger.error(self) {error}
                                else
                                        yield response, rewindable.buffered
                                end
                        end
                end
        else
                yield response, nil
        end
        
        return response
end