2010-04-30 20:31:24 +02:00
require 'cgi'
2010-01-25 22:04:59 +01:00
module RestClient
2010-03-29 19:38:23 +02:00
module AbstractResponse
2010-01-25 22:04:59 +01:00
2010-02-10 21:31:59 +01:00
attr_reader :net_http_res , :args
2010-01-25 22:04:59 +01:00
# HTTP status code
def code
@code || = @net_http_res . code . to_i
end
# A hash of the headers, beautified with symbols and underscores.
# e.g. "Content-type" will become :content_type.
def headers
2010-03-29 19:38:23 +02:00
@headers || = AbstractResponse . beautify_headers ( @net_http_res . to_hash )
2010-01-25 22:04:59 +01:00
end
# The raw headers.
def raw_headers
@raw_headers || = @net_http_res . to_hash
end
# Hash of cookies extracted from response headers
def cookies
2010-04-30 20:31:24 +02:00
@cookies || = ( self . headers [ :set_cookie ] || { } ) . inject ( { } ) do | out , cookie_content |
2010-07-04 20:36:16 +02:00
out . merge parse_cookie ( cookie_content )
2010-01-25 22:04:59 +01:00
end
end
# Return the default behavior corresponding to the response code:
2010-05-25 18:55:57 +02:00
# the response itself for code in 200..206, redirection for 301, 302 and 307 in get and head cases, redirection for 303 and an exception in other cases
2010-12-10 15:11:57 -08:00
def return! request = nil , result = nil , & block
2010-05-25 18:49:09 +02:00
if ( 200 .. 207 ) . include? code
2010-01-25 22:04:59 +01:00
self
2010-05-25 18:55:57 +02:00
elsif [ 301 , 302 , 307 ] . include? code
2010-02-10 21:31:59 +01:00
unless [ :get , :head ] . include? args [ :method ]
2010-07-02 23:21:32 +02:00
raise Exceptions :: EXCEPTIONS_MAP [ code ] . new ( self , code )
2010-02-10 21:31:59 +01:00
else
2010-07-04 20:36:16 +02:00
follow_redirection ( request , result , & block )
2010-02-10 21:31:59 +01:00
end
2010-02-10 21:48:46 +01:00
elsif code == 303
args [ :method ] = :get
args . delete :payload
2010-07-04 20:36:16 +02:00
follow_redirection ( request , result , & block )
2010-01-25 22:04:59 +01:00
elsif Exceptions :: EXCEPTIONS_MAP [ code ]
2010-07-02 23:21:32 +02:00
raise Exceptions :: EXCEPTIONS_MAP [ code ] . new ( self , code )
2010-01-25 22:04:59 +01:00
else
2010-12-10 15:11:57 -08:00
raise RequestFailed . new ( self , code )
2010-01-25 22:04:59 +01:00
end
end
2010-03-19 20:30:26 +01:00
def to_i
code
end
2010-04-23 19:40:49 +02:00
def description
2010-02-10 21:31:59 +01:00
" #{ code } #{ STATUSES [ code ] } | #{ ( headers [ :content_type ] || '' ) . gsub ( / ;.*$ / , '' ) } #{ size } bytes \n "
2010-01-26 19:41:53 +01:00
end
2010-02-10 21:31:59 +01:00
# Follow a redirection
2010-07-04 20:36:16 +02:00
def follow_redirection request = nil , result = nil , & block
2010-02-10 21:31:59 +01:00
url = headers [ :location ]
if url !~ / ^http /
url = URI . parse ( args [ :url ] ) . merge ( url ) . to_s
end
2010-02-10 21:48:46 +01:00
args [ :url ] = url
2010-05-25 18:43:18 +02:00
if request
2010-12-18 18:15:04 +01:00
if request . max_redirects == 0
raise MaxRedirectsReached
end
2010-05-25 18:43:18 +02:00
args [ :password ] = request . password
args [ :user ] = request . user
args [ :headers ] = request . headers
2010-12-16 12:41:12 -05:00
args [ :max_redirects ] = request . max_redirects - 1
2010-07-04 20:36:16 +02:00
# pass any cookie set in the result
if result && result [ 'set-cookie' ]
args [ :headers ] [ :cookies ] = ( args [ :headers ] [ :cookies ] || { } ) . merge ( parse_cookie ( result [ 'set-cookie' ] ) )
end
2010-05-25 18:43:18 +02:00
end
Request . execute args , & block
2010-02-10 21:31:59 +01:00
end
2010-01-26 19:41:53 +01:00
2010-01-25 22:04:59 +01:00
def AbstractResponse . beautify_headers ( headers )
headers . inject ( { } ) do | out , ( key , value ) |
2010-05-18 20:00:09 +02:00
out [ key . gsub ( / - / , '_' ) . downcase . to_sym ] = %w{ set-cookie } . include? ( key . downcase ) ? value : value . first
2010-01-25 22:04:59 +01:00
out
end
end
2010-07-04 20:36:16 +02:00
private
# Parse a cookie value and return its content in an Hash
def parse_cookie cookie_content
out = { }
CGI :: Cookie :: parse ( cookie_content ) . each do | key , cookie |
unless [ 'expires' , 'path' ] . include? key
out [ CGI :: escape ( key ) ] = cookie . value [ 0 ] ? ( CGI :: escape ( cookie . value [ 0 ] ) || '' ) : ''
end
end
out
end
2010-01-25 22:04:59 +01:00
end
2010-07-04 20:36:16 +02:00
2010-01-25 22:04:59 +01:00
end