lib/fastly/client.rb in fastly-1.1.3 vs lib/fastly/client.rb in fastly-1.1.4
- old
+ new
@@ -4,170 +4,185 @@
require 'cgi'
require 'pp'
require 'uri'
class Fastly
- # The UserAgent to communicate with the API
- class Client #:nodoc: all
- begin
- require 'curb-fu'
- CURB_FU=true
- rescue LoadError
- CURB_FU=false
- end
+ # The UserAgent to communicate with the API
+ class Client #:nodoc: all
+ begin
+ require 'curb-fu'
+ CURB_FU=true
+ rescue LoadError
+ CURB_FU=false
+ end
- attr_accessor :http, :api_key, :user, :password, :cookie, :customer
+ attr_accessor :http, :api_key, :user, :password, :cookie, :customer
- def initialize(opts)
- [:api_key, :user, :password].each do |key|
- self.send("#{key}=", opts[key]) if opts.has_key?(key)
- end
- base = opts[:base_url] || "https://api.fastly.com"
- customer = opts[:customer]
- uri = URI.parse(base)
- scheme = uri.scheme
- host = uri.host
- curb = opts.has_key?(:use_curb) ? !!opts[:use_curb] && CURB_FU : CURB_FU
- port = opts.has_key?(:base_port) ? opts[:base_port] : (scheme == "https") ? 443 : 80
- self.http = curb ? Fastly::Client::Curl.new(host, port) : Net::HTTP.new(host, port)
- self.http.use_ssl = (scheme == "https")
- return self unless fully_authed?
+ def initialize(opts)
+ [:api_key, :user, :password].each do |key|
+ self.send("#{key}=", opts[key]) if opts.has_key?(key)
+ end
+ base = opts[:base_url] || "https://api.fastly.com"
+ uri = URI.parse(base)
+ scheme = uri.scheme
+ host = uri.host
+ curb = opts.has_key?(:use_curb) ? !!opts[:use_curb] && CURB_FU : CURB_FU
+ port = opts.has_key?(:base_port) ? opts[:base_port] : (scheme == "https") ? 443 : 80
+ self.http = curb ? Fastly::Client::Curl.new(host, port) : Net::HTTP.new(host, port)
+ self.http.use_ssl = (scheme == "https")
+ return self unless fully_authed?
- # If we're fully authed (i.e username and password ) then we need to log in
- resp = self.http.post('/login', make_params(:user => user, :password => password))
- raise Fastly::Unauthorized unless resp.success?
- self.cookie = resp['set-cookie']
- content = JSON.parse(resp.body)
- #return self, content['user'], content['content']
- self
- end
+ # If we're fully authed (i.e username and password ) then we need to log in
+ resp = self.http.post('/login', make_params(:user => user, :password => password))
+ raise Fastly::Unauthorized unless resp.success?
+ self.cookie = resp['set-cookie']
+ end
+ def require_key!
+ raise Fastly::AuthRequired.new("This request requires an API key") if api_key.nil?
- def authed?
- !api_key.nil? || fully_authed?
- end
+ @require_key = true
+ end
- # Some methods require full username and password rather than just auth token
- def fully_authed?
- !(user.nil? || password.nil?)
- end
+ def require_key?
+ !!@require_key
+ end
- def set_customer(id)
+ def authed?
+ !api_key.nil? || fully_authed?
+ end
- end
+ # Some methods require full username and password rather than just auth token
+ def fully_authed?
+ !(user.nil? || password.nil?)
+ end
- def get(path, params={})
- path += "?"+make_params(params) unless params.empty?
- resp = self.http.get(path, headers)
- return nil if 404 == resp.status
- raise Fastly::Error, resp.message unless resp.success?
- JSON.parse(resp.body)
- end
+ def set_customer(id)
- def get_stats(path, params={})
- content = get(path, params)
- raise Fastly::Error, content["message"] unless content["status"] == 'success'
- content["data"]
- end
+ end
- def post(path, params={})
- post_and_put(:post, path, params)
- end
+ def get(path, params={})
+ path += "?"+make_params(params) unless params.empty?
+ resp = self.http.get(path, headers)
+ return nil if 404 == resp.status
+ raise Fastly::Error, resp.message unless resp.success?
+ JSON.parse(resp.body)
+ end
- def put(path, params={})
- post_and_put(:put, path, params)
- end
+ def get_stats(path, params={})
+ content = get(path, params)
+ raise Fastly::Error, content["message"] unless content["status"] == 'success'
+ content["data"]
+ end
- def delete(path)
- resp = self.http.delete(path, headers)
- return resp.success?
- end
+ def post(path, params={})
+ post_and_put(:post, path, params)
+ end
- private
+ def put(path, params={})
+ post_and_put(:put, path, params)
+ end
- def post_and_put(method, path, params={})
- query = make_params(params)
- resp = self.http.send(method, path, query, headers.merge( 'Content-Type' => "application/x-www-form-urlencoded"))
- raise Fastly::Error, resp.message unless resp.success?
- JSON.parse(resp.body)
- end
+ def delete(path)
+ resp = self.http.delete(path, headers)
+ return resp.success?
+ end
- def headers
- headers = fully_authed? ? { 'Cookie' => cookie } : { 'X-Fastly-Key' => api_key }
- headers.merge( 'Fastly-Explicit-Customer' => customer ) if customer
- headers.merge( 'Content-Accept' => 'application/json')
- end
+ private
- def make_params(params)
- params.map { |key,val|
- next if val.nil?
- unless val.is_a?(Hash)
- "#{CGI.escape(key.to_s)}=#{CGI.escape(val.to_s)}"
+ def post_and_put(method, path, params={})
+ query = make_params(params)
+ resp = self.http.send(method, path, query, headers.merge( 'Content-Type' => "application/x-www-form-urlencoded"))
+ raise Fastly::Error, resp.message unless resp.success?
+ JSON.parse(resp.body)
+ end
+
+ def headers
+ headers = if require_key?
+ api_key_header
else
- val.map { |sub_key, sub_val|
- new_key = "#{key}[#{sub_key}]"
- "#{CGI.escape(new_key)}=#{CGI.escape(sub_val.to_s)}"
- }
+ fully_authed? ? { 'Cookie' => cookie } : api_key_header
end
- }.flatten.delete_if { |v| v.nil? }.join("&")
+ headers.merge!('Fastly-Explicit-Customer' => customer) if customer
+ headers.merge!('Content-Accept' => 'application/json')
+ ensure
+ @require_key = nil
+ end
+
+ def api_key_header
+ { 'X-Fastly-Key' => api_key }
+ end
+
+ def make_params(params)
+ params.map { |key,val|
+ next if val.nil?
+ unless val.is_a?(Hash)
+ "#{CGI.escape(key.to_s)}=#{CGI.escape(val.to_s)}"
+ else
+ val.map { |sub_key, sub_val|
+ new_key = "#{key}[#{sub_key}]"
+ "#{CGI.escape(new_key)}=#{CGI.escape(sub_val.to_s)}"
+ }
end
+ }.flatten.delete_if { |v| v.nil? }.join("&")
+ end
- # :nodoc: all
- class Curl
- attr_accessor :host, :port, :protocol
+ # :nodoc: all
+ class Curl
+ attr_accessor :host, :port, :protocol
- def initialize(host, port=443)
- self.host = host
- self.port = port
- self.protocol = 'https'
- end
+ def initialize(host, port=443)
+ self.host = host
+ self.port = port
+ self.protocol = 'https'
+ end
- def get(path, headers={})
- CurbFu.get({ :host => host, :port => port, :path => path, :headers => headers, :protocol => protocol })
- end
+ def get(path, headers={})
+ CurbFu.get({ :host => host, :port => port, :path => path, :headers => headers, :protocol => protocol })
+ end
- def post(path, params, headers={})
- CurbFu.post({ :host => host, :port => port, :path => path, :headers => headers, :protocol => protocol }, params)
- end
+ def post(path, params, headers={})
+ CurbFu.post({ :host => host, :port => port, :path => path, :headers => headers, :protocol => protocol }, params)
+ end
- def put(path, params, headers={})
- CurbFu.put({ :host => host, :port => port, :path => path, :headers => headers, :params => params, :protocol => protocol }, params)
- end
+ def put(path, params, headers={})
+ CurbFu.put({ :host => host, :port => port, :path => path, :headers => headers, :params => params, :protocol => protocol }, params)
+ end
- def delete(path, headers={})
- CurbFu.delete({ :host => host, :port => port, :path => path, :headers => headers, :protocol => protocol })
- end
+ def delete(path, headers={})
+ CurbFu.delete({ :host => host, :port => port, :path => path, :headers => headers, :protocol => protocol })
+ end
- def use_ssl=(ssl)
- self.protocol = ssl ? 'https' : 'http'
- end
- end
+ def use_ssl=(ssl)
+ self.protocol = ssl ? 'https' : 'http'
+ end
end
+ end
end
# :nodoc: all
class Net::HTTPResponse
- def success?
- return Net::HTTPSuccess === self
- end
+ def success?
+ return Net::HTTPSuccess === self
+ end
- def status
- return self.code.to_i
- end
+ def status
+ return self.code.to_i
+ end
end
# :nodoc: all
class CurbFu::Response::Base
- def get_fields(key)
- if ( match = @headers.find{|k,v| k.downcase == key.downcase} )
- [match.last].flatten
- else
- []
- end
+ def get_fields(key)
+ if ( match = @headers.find{|k,v| k.downcase == key.downcase} )
+ [match.last].flatten
+ else
+ []
end
+ end
- def [](key)
- get_fields(key).last
- end
+ def [](key)
+ get_fields(key).last
+ end
end