Async::HTTPSourceAsyncHTTPBodyStatistics

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_time Float

The start time for measuring durations.

parameter body Protocol::HTTP::Body::Readable

The body to wrap.

parameter callback Proc

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