added some monkey patches to improve the http connection speed. (by keeping the http connection open)
This commit is contained in:
parent
fda5be213a
commit
a5f17cb13f
1 changed files with 61 additions and 0 deletions
|
@ -23,6 +23,24 @@ class Time
|
|||
# end
|
||||
end
|
||||
|
||||
# Monkey patch for faster net/http io
|
||||
if RUBY_VERSION.to_f < 1.9
|
||||
class Net::BufferedIO #:nodoc:
|
||||
alias :old_rbuf_fill :rbuf_fill
|
||||
def rbuf_fill
|
||||
begin
|
||||
@rbuf << @io.read_nonblock(65536)
|
||||
rescue Errno::EWOULDBLOCK
|
||||
if IO.select([@io], nil, nil, @read_timeout)
|
||||
@rbuf << @io.read_nonblock(65536)
|
||||
else
|
||||
raise Timeout::TimeoutError
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
module RestClient
|
||||
def self.copy(url, headers={})
|
||||
Request.execute(:method => :copy,
|
||||
|
@ -35,4 +53,47 @@ module RestClient
|
|||
:url => url,
|
||||
:headers => headers)
|
||||
end
|
||||
|
||||
class Request
|
||||
def transmit(uri, req, payload)
|
||||
setup_credentials(req)
|
||||
|
||||
Thread.current[:host] ||= uri.host
|
||||
Thread.current[:port] ||= uri.port
|
||||
|
||||
net = net_http_class.new(uri.host, uri.port)
|
||||
|
||||
if Thread.current[:connection].nil? || Thread.current[:host] != uri.host
|
||||
Thread.current[:connection].finish if (Thread.current[:connection] && Thread.current[:connection].started?)
|
||||
net.use_ssl = uri.is_a?(URI::HTTPS)
|
||||
net.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
||||
Thread.current[:connection] = net
|
||||
Thread.current[:connection].start
|
||||
end
|
||||
|
||||
display_log request_log
|
||||
http = Thread.current[:connection]
|
||||
|
||||
http.read_timeout = @timeout if @timeout
|
||||
begin
|
||||
res = http.request(req, payload)
|
||||
rescue
|
||||
# p "Net::HTTP connection failed, reconnecting"
|
||||
Thread.current[:connection].finish
|
||||
http = Thread.current[:connection] = net
|
||||
Thread.current[:connection].start
|
||||
res = http.request(req, payload)
|
||||
display_log response_log(res)
|
||||
process_result res
|
||||
else
|
||||
display_log response_log(res)
|
||||
process_result res
|
||||
end
|
||||
|
||||
rescue EOFError
|
||||
raise RestClient::ServerBrokeConnection
|
||||
rescue Timeout::Error
|
||||
raise RestClient::RequestTimeout
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue