class Async::HTTP::Body::Statistics
Invokes a callback once the body has finished reading.
def complete_statistics(error = nil)
def complete_statistics(error = nil) @end_time = Clock.now @callback.call(self, error) if @callback end
def first_chunk_duration
def first_chunk_duration if @first_chunk_time @first_chunk_time - @start_time end end
def format_duration(seconds)
def format_duration(seconds) if seconds < 1.0 seconds * 1000.0 return "#{(seconds * 1000.0).round(2)}ms" else return "#{seconds.round(1)}s" end end
def initialize(start_time, body, callback)
def initialize(start_time, body, callback) super(body) @bytesize = 0 @start_time = start_time @first_chunk_time = nil @end_time = nil @callback = callback end
def inspect
def inspect "#{super} | \#<#{self.class} #{self.to_s}>" end
def read
def read chunk = super @first_chunk_time ||= Clock.now if chunk @bytesize += chunk.bytesize else complete_statistics end return chunk end
def stop(error)
def stop(error) complete_statistics(error) super end
def to_s
def to_s parts = ["sent #{@bytesize} bytes"] if duration = self.total_duration parts << "took #{format_duration(duration)} in total" end if duration = self.first_chunk_duration parts << "took #{format_duration(duration)} until first chunk" end return parts.join('; ') end
def total_duration
def total_duration if @end_time @end_time - @start_time end end