lib/spaceship/client.rb in spaceship-0.0.4 vs lib/spaceship/client.rb in spaceship-0.0.5
- old
+ new
@@ -1,6 +1,7 @@
require 'faraday' # HTTP Client
+require 'logger'
require 'faraday_middleware'
require 'spaceship/ui'
require 'spaceship/helper/plist_middleware'
require 'spaceship/helper/net_http_generic_request'
@@ -16,10 +17,14 @@
PROTOCOL_VERSION = "QH65B2"
attr_reader :client
attr_accessor :cookie
+ # The logger in which all requests are logged
+ # /tmp/spaceship.log by default
+ attr_accessor :logger
+
class InvalidUserCredentialsError < StandardError; end
class UnexpectedResponse < StandardError; end
# Authenticates with Apple's web services. This method has to be called once
# to generate a valid session. The session will automatically be used from then
@@ -63,10 +68,28 @@
if page =~ %r{<a href="https://idmsa.apple.com/IDMSWebAuth/login\?.*appIdKey=(\h+)}
return $1
end
end
+ # The logger in which all requests are logged
+ # /tmp/spaceship.log by default
+ def logger
+ unless @logger
+ if $verbose || ENV["VERBOSE"]
+ @logger = Logger.new(STDOUT)
+ else
+ # Log to file by default
+ @logger = Logger.new("/tmp/spaceship.log")
+ end
+ @logger.formatter = proc do |severity, datetime, progname, msg|
+ string = "[#{datetime.strftime('%H:%M:%S')}]: #{msg}\n"
+ end
+ end
+
+ @logger
+ end
+
# Automatic paging
def page_size
@page_size ||= 500
end
@@ -348,16 +371,36 @@
headers.merge!({'Cookie' => cookie})
headers.merge!(csrf_tokens)
end
headers.merge!({'User-Agent' => 'spaceship'})
+ # Before encoding the parameters, log them
+ log_request(method, url_or_path, params)
+
# form-encode the params only if there are params, and the block is not supplied.
# this is so that certain requests can be made using the block for more control
if method == :post && params && !block_given?
params, headers = encode_params(params, headers)
end
- send_request(method, url_or_path, params, headers, &block)
+ response = send_request(method, url_or_path, params, headers, &block)
+
+ log_response(method, url_or_path, response)
+
+ return response
+ end
+
+ def log_request(method, url, params)
+ params_to_log = Hash(params).dup # to also work with nil
+ params_to_log.delete(:accountPassword)
+ params_to_log = params_to_log.collect do |key, value|
+ "{#{key}: #{value}}"
+ end
+ logger.info("#{method.upcase}: #{url} #{params_to_log.join(', ')}")
+ end
+
+ def log_response(method, url, response)
+ logger.debug("#{method.upcase}: #{url}: #{response.body}")
end
# Actually sends the request to the remote server
# Automatically retries the request up to 3 times if something goes wrong
def send_request(method, url_or_path, params, headers, &block)