fog--fog/lib/fog/aws.rb

78 lines
2.0 KiB
Ruby
Raw Normal View History

2009-05-19 06:06:49 +00:00
require File.dirname(__FILE__) + '/aws/simpledb'
require File.dirname(__FILE__) + '/aws/s3'
require 'rubygems'
require 'eventmachine'
require 'uri'
module Fog
module AWS
class Connection < EventMachine::Connection
include EventMachine::Deferrable
2009-06-07 08:11:13 +00:00
attr_accessor :body, :headers, :method, :parser, :url
attr_reader :response
def post_init
2009-06-07 08:11:13 +00:00
@body ||= nil
@data ||= nil
@headers ||= {}
2009-06-05 23:51:17 +00:00
@method ||= 'GET'
@parser ||= nil
@response ||= Fog::AWS::Response.new
end
def connection_completed
uri = URI.parse(@url)
2009-06-05 23:51:17 +00:00
start_tls if uri.scheme == 'https'
request
end
def request
uri = URI.parse(@url)
path = "#{uri.path}#{uri.query.nil? ? "" : "?#{uri.query}"}"
host = "#{uri.host}#{uri.port == 80 ? "" : ":#{uri.port}"}"
@headers.merge!({'Host' => host})
2009-06-07 08:11:13 +00:00
request = "#{method} #{path} HTTP/1.1\r\n"
request << "#{headers.collect {|k,v| "#{k}: #{v}\r\n"}.join('')}\r\n"
request << "#{@body}\r\n" if @body
2009-06-07 08:11:13 +00:00
send_data(request)
end
def receive_data(data)
p data
unless @data
if data =~ /\AHTTP\/1\.[01] ([\d]{3})/
@response.status = $1.to_i
else
@response.status = 0
end
2009-06-07 07:54:40 +00:00
@headers, @data = data.split("\r\n\r\n")
@headers.split("\r\n").each do |header|
if data = header.match(/(.*):\s(.*)/)
@response.headers[data[1]] = data[2]
end
end
if @parser && @data
Nokogiri::XML::SAX::Parser.new(@parser).parse(@data.split(/<\?xml.*\?>/)[1])
2009-06-07 07:54:40 +00:00
@response.body = @parser.response
elsif @data
2009-06-07 07:54:40 +00:00
@response.body = @data
end
set_deferred_status(:succeeded, self)
EventMachine.stop_event_loop
end
end
end
class Response
attr_accessor :status, :headers, :body
def initialize
@headers = {}
end
end
end
2009-06-07 07:54:40 +00:00
end