Slide 40
Slide 40 text
def process_result(res)
if res.code =~ /\A2\d{2}\z/
decode res['content-encoding'], res.body if res.body
elsif %w(301 302 303).include? res.code
url = res.header['Location']
!
if url !~ /^http/
uri = URI.parse(@url)
uri.path = "/#{url}".squeeze('/')
url = uri.to_s
end
!
raise Redirect, url
elsif res.code == "304"
raise NotModified, res
elsif res.code == "401"
raise Unauthorized, res
elsif res.code == "404"
raise ResourceNotFound, res
else
raise RequestFailed, res
end
end
def transmit(uri, req, payload)
setup_credentials(req)
!
net = net_http_class.new(uri.host, uri.port)
net.use_ssl = uri.is_a?(URI::HTTPS)
net.verify_mode = OpenSSL::SSL::VERIFY_NONE
net.read_timeout = @timeout if @timeout
net.open_timeout = @open_timeout if @open_timeout
!
display_log request_log
!
net.start do |http|
res = http.request(req, payload)
display_log response_log(res)
string = process_result(res)
!
if string or @method == :head
Response.new(string, res)
else
nil
end
end
rescue EOFError
raise RestClient::ServerBrokeConnection
rescue Timeout::Error
raise RestClient::RequestTimeout
end
def decode(content_encoding, body)
if content_encoding == 'gzip' and not body.empty?
Zlib::GzipReader.new(StringIO.new(body)).read
elsif content_encoding == 'deflate'
Zlib::Inflate.new.inflate(body)
else
body
end
end