class Statistics
Invokes a callback once the body has finished reading.
Definitions
def initialize(start_time, body, callback)
Initialize the statistics body wrapper.
Signature
-
parameter
start_timeFloat The start time for measuring durations.
-
parameter
bodyProtocol::HTTP::Body::Readable The body to wrap.
-
parameter
callbackProc A callback to invoke when the body is closed.
Implementation
def initialize(start_time, body, callback)
super(body)
@sent = 0
@start_time = start_time
@first_chunk_time = nil
@end_time = nil
@callback = callback
end
def total_duration
Signature
-
returns
Float | Nil The total duration from start to close, in seconds.
Implementation
def total_duration
if @end_time
@end_time - @start_time
end
end
def first_chunk_duration
Signature
-
returns
Float | Nil The duration from start until the first chunk was read, in seconds.
Implementation
def first_chunk_duration
if @first_chunk_time
@first_chunk_time - @start_time
end
end
def close(error = nil)
Close the body and record the end time.
Implementation
def close(error = nil)
complete_statistics(error)
super
end
def read
Read the next chunk from the body, tracking timing and bytes sent.
Signature
-
returns
String | Nil The next chunk of data.
Implementation
def read
chunk = super
@first_chunk_time ||= Clock.now
if chunk
@sent += chunk.bytesize
end
return chunk
end
def to_s
Signature
-
returns
String A human-readable summary of the statistics.
Implementation
def to_s
parts = ["sent #{@sent} 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 inspect
Signature
-
returns
String A detailed representation including the wrapped body.
Implementation
def inspect
"#{super} | \#<#{self.class} #{self.to_s}>"
end