lib/http_spew.rb in http_spew-0.1.0 vs lib/http_spew.rb in http_spew-0.2.0
- old
+ new
@@ -9,89 +9,19 @@
autoload :InputSpray, "http_spew/input_spray"
class Error < RuntimeError; end
class TimeoutError < Error; end
class ConnectionReset < Error; end
+ class RequestError < Error; end
+ class UnexpectedResponse < RequestError; end
+ class ChecksumError < HTTP_Spew::Error; end
+ class LengthError < HTTP_Spew::Error; end
+ class NoWritersError < HTTP_Spew::Error; end
+ class EOF < EOFError; end
- def self.error_all(requests, error) # :nodoc:
- requests.each { |req| req.error ||= error }
- end
+ require "http_spew/version"
+ require "http_spew/headers"
+ require "http_spew/request"
+ require "http_spew/class_methods"
- def self.done_early(ready, failed, requests) # :nodoc:
- ready.concat(failed)
- pending = requests - ready
- unless pending.empty?
- error = ConnectionReset.new("prematurely terminated")
- ready.concat(error_all(pending, error))
- end
- ready.uniq!
- ready
- end
-
- # Returns an array of requests that are complete, including those
- # that have errored out. Incomplete requests remain in +requests+
- # If +need+ is fullfilled, it closes all incomplete requests and
- # returns all requests.
- def self.wait_nonblock!(need, requests)
- ready, failed = [], []
- requests.delete_if do |req|
- begin
- case req.resume
- when Symbol # :wait_writable, :wait_readable
- false
- else
- (ready << req).size == need and
- return done_early(ready, failed, requests)
- true
- end
- rescue => e
- req.error = e
- failed << req
- end
- end
- ready.concat(failed).empty? ? nil : ready
- end
-
- # Returns an array of requests that are complete, including those
- # that have errored out.
- # If +need+ is fullfilled, it closes all incomplete requests.
- def self.wait(need, requests, timeout)
- ready, failed = [], []
- pollset = {}
- begin
- requests.each do |req|
- begin
- case rv = req.resume
- when Symbol # :wait_writable, :wait_readable
- pollset[req] = rv
- else
- (ready << req).size == need and
- return done_early(ready, failed, requests)
- pollset.delete(req)
- end
- rescue => e
- req.error = e
- failed << req
- pollset.delete(req)
- end
- end
- break if pollset.empty?
-
- t0 = Time.now
- busy = pollset.keys
- rv = Kgio.poll(pollset, timeout.to_i) or break
- timeout -= (Time.now - t0) * 1000
- rescue Errno::EINTR
- timeout -= (Time.now - t0) * 1000
- retry
- end while timeout > 0.0 && requests = rv.keys.concat(busy).uniq!
-
- ready.concat(failed)
- unless requests.empty?
- ready.concat(error_all(requests, TimeoutError.new("request timed out")))
- ready.uniq!
- end
- ready
- end
+ extend HTTP_Spew::ClassMethods
end
-require "http_spew/headers"
-require "http_spew/request"