def call method, opts = {}
args = { :api_key => KEY,
:call_id => Time.now.to_f,
:format => 'JSON',
:v => '1.0',
:session_key => params[:session_key] || SESSION,
:method => method }.merge(opts).map{ |k,v|
"#{k}=" + case v
when Hash
v.to_json
when Array
v.join(',')
else
v.to_s
end
}.sort
data = Array["sig=#{Digest::MD5.hexdigest(args.join+SECRET)}", *args].join('&')
begin
ret = post(data)
rescue Errno::ECONNRESET, Errno::EPIPE
@server = connect
retry
end while ret.empty? and @server = connect
ret = case
when ret == 'true'; true
when ret == 'false'; false
when ret[0..0] == '"'; ret[1..-2]
else
begin
JSON::parse(ret)
rescue JSON::ParserError
puts "Error parsing #{ret.inspect}"
raise
end
end
unless method == 'fql.query'
ret = ret.first if ret.is_a? Array and ret.size == 1 and ret.first.is_a? Hash
end
raise Facebook::Error, ret['error_msg'] if ret.is_a? Hash and ret['error_code']
ret
ensure
unless @keepalive
@server.close
@server = nil
end
end