mirror of
https://github.com/fog/fog.git
synced 2022-11-09 13:51:43 -05:00
first pass at mocking setup
This commit is contained in:
parent
ec9bded06a
commit
9af158aa9c
8 changed files with 336 additions and 285 deletions
12
lib/fog.rb
12
lib/fog.rb
|
@ -1 +1,13 @@
|
||||||
require "#{File.dirname(__FILE__)}/fog/aws"
|
require "#{File.dirname(__FILE__)}/fog/aws"
|
||||||
|
|
||||||
|
module Fog
|
||||||
|
|
||||||
|
def self.mocking=(new_mocking)
|
||||||
|
@mocking = new_mocking
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.mocking?
|
||||||
|
!!@mocking
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
|
@ -1,3 +1,10 @@
|
||||||
|
require 'rubygems'
|
||||||
|
require 'base64'
|
||||||
|
require 'cgi'
|
||||||
|
require 'digest/md5'
|
||||||
|
require 'hmac-sha1'
|
||||||
|
require 'mime/types'
|
||||||
|
|
||||||
current_directory = File.dirname(__FILE__)
|
current_directory = File.dirname(__FILE__)
|
||||||
require "#{current_directory}/aws/ec2"
|
require "#{current_directory}/aws/ec2"
|
||||||
require "#{current_directory}/aws/simpledb"
|
require "#{current_directory}/aws/simpledb"
|
||||||
|
|
|
@ -1,78 +1,3 @@
|
||||||
require 'rubygems'
|
|
||||||
require 'base64'
|
|
||||||
require 'cgi'
|
|
||||||
require 'hmac-sha2'
|
|
||||||
|
|
||||||
current_directory = File.dirname(__FILE__)
|
|
||||||
require "#{current_directory}/../connection"
|
|
||||||
require "#{current_directory}/../parser"
|
|
||||||
require "#{current_directory}/../response"
|
|
||||||
|
|
||||||
parsers_directory = "#{current_directory}/parsers/ec2"
|
|
||||||
require "#{parsers_directory}/allocate_address"
|
|
||||||
require "#{parsers_directory}/attach_volume"
|
|
||||||
require "#{parsers_directory}/basic"
|
|
||||||
require "#{parsers_directory}/create_key_pair"
|
|
||||||
require "#{parsers_directory}/create_snapshot"
|
|
||||||
require "#{parsers_directory}/create_volume"
|
|
||||||
require "#{parsers_directory}/describe_addresses"
|
|
||||||
require "#{parsers_directory}/describe_availability_zones"
|
|
||||||
require "#{parsers_directory}/describe_images"
|
|
||||||
require "#{parsers_directory}/describe_instances"
|
|
||||||
require "#{parsers_directory}/describe_key_pairs"
|
|
||||||
require "#{parsers_directory}/describe_regions"
|
|
||||||
require "#{parsers_directory}/describe_security_groups"
|
|
||||||
require "#{parsers_directory}/describe_snapshots"
|
|
||||||
require "#{parsers_directory}/describe_volumes"
|
|
||||||
require "#{parsers_directory}/detach_volume"
|
|
||||||
require "#{parsers_directory}/get_console_output"
|
|
||||||
require "#{parsers_directory}/run_instances"
|
|
||||||
require "#{parsers_directory}/terminate_instances"
|
|
||||||
|
|
||||||
requests_directory = "#{current_directory}/requests/ec2"
|
|
||||||
require "#{requests_directory}/allocate_address"
|
|
||||||
require "#{requests_directory}/associate_address"
|
|
||||||
require "#{requests_directory}/attach_volume"
|
|
||||||
require "#{requests_directory}/authorize_security_group_ingress"
|
|
||||||
# TODO: require "#{requests_directory}/bundle_instance"
|
|
||||||
# TODO: require "#{requests_directory}/cancel_bundle_task"
|
|
||||||
# TODO: require "#{requests_directory}/confirm_product_instance"
|
|
||||||
require "#{requests_directory}/create_key_pair"
|
|
||||||
require "#{requests_directory}/create_security_group"
|
|
||||||
require "#{requests_directory}/create_snapshot"
|
|
||||||
require "#{requests_directory}/create_volume"
|
|
||||||
require "#{requests_directory}/delete_key_pair"
|
|
||||||
require "#{requests_directory}/delete_security_group"
|
|
||||||
require "#{requests_directory}/delete_snapshot"
|
|
||||||
require "#{requests_directory}/delete_volume"
|
|
||||||
# TODO: require "#{requests_directory}/deregister_image"
|
|
||||||
require "#{requests_directory}/describe_addresses"
|
|
||||||
require "#{requests_directory}/describe_availability_zones"
|
|
||||||
# TODO: require "#{requests_directory}/describe_bundle_tasks"
|
|
||||||
# TODO: require "#{requests_directory}/describe_image_attribute"
|
|
||||||
require "#{requests_directory}/describe_images"
|
|
||||||
require "#{requests_directory}/describe_instances"
|
|
||||||
require "#{requests_directory}/describe_key_pairs"
|
|
||||||
require "#{requests_directory}/describe_regions"
|
|
||||||
# TODO: require "#{requests_directory}/describe_reserved_instances"
|
|
||||||
# TODO: require "#{requests_directory}/describe_reserved_instances_offerings"
|
|
||||||
require "#{requests_directory}/describe_security_groups"
|
|
||||||
require "#{requests_directory}/describe_snapshots"
|
|
||||||
require "#{requests_directory}/describe_volumes"
|
|
||||||
require "#{requests_directory}/detach_volume"
|
|
||||||
require "#{requests_directory}/disassociate_address"
|
|
||||||
require "#{requests_directory}/get_console_output"
|
|
||||||
# TODO: require "#{requests_directory}/modify_image_attribute"
|
|
||||||
# TODO: require "#{requests_directory}/monitor_instances"
|
|
||||||
# TODO: require "#{requests_directory}/purchase_reserved_instances_offering"
|
|
||||||
require "#{requests_directory}/reboot_instances"
|
|
||||||
# TODO: require "#{requests_directory}/register_image"
|
|
||||||
require "#{requests_directory}/release_address"
|
|
||||||
require "#{requests_directory}/revoke_security_group_ingress"
|
|
||||||
require "#{requests_directory}/run_instances"
|
|
||||||
require "#{requests_directory}/terminate_instances"
|
|
||||||
# TODO: require "#{requests_directory}/unmonitor_instances"
|
|
||||||
|
|
||||||
module Fog
|
module Fog
|
||||||
module AWS
|
module AWS
|
||||||
class EC2
|
class EC2
|
||||||
|
@ -95,6 +20,78 @@ module Fog
|
||||||
# ==== Returns
|
# ==== Returns
|
||||||
# * EC2 object with connection to aws.
|
# * EC2 object with connection to aws.
|
||||||
def initialize(options={})
|
def initialize(options={})
|
||||||
|
Fog.mocking = options[:mocking] || false
|
||||||
|
|
||||||
|
current_directory = File.dirname(__FILE__)
|
||||||
|
require "#{current_directory}/../connection"
|
||||||
|
require "#{current_directory}/../parser"
|
||||||
|
require "#{current_directory}/../response"
|
||||||
|
|
||||||
|
parsers_directory = "#{current_directory}/parsers/ec2"
|
||||||
|
require "#{parsers_directory}/allocate_address"
|
||||||
|
require "#{parsers_directory}/attach_volume"
|
||||||
|
require "#{parsers_directory}/basic"
|
||||||
|
require "#{parsers_directory}/create_key_pair"
|
||||||
|
require "#{parsers_directory}/create_snapshot"
|
||||||
|
require "#{parsers_directory}/create_volume"
|
||||||
|
require "#{parsers_directory}/describe_addresses"
|
||||||
|
require "#{parsers_directory}/describe_availability_zones"
|
||||||
|
require "#{parsers_directory}/describe_images"
|
||||||
|
require "#{parsers_directory}/describe_instances"
|
||||||
|
require "#{parsers_directory}/describe_key_pairs"
|
||||||
|
require "#{parsers_directory}/describe_regions"
|
||||||
|
require "#{parsers_directory}/describe_security_groups"
|
||||||
|
require "#{parsers_directory}/describe_snapshots"
|
||||||
|
require "#{parsers_directory}/describe_volumes"
|
||||||
|
require "#{parsers_directory}/detach_volume"
|
||||||
|
require "#{parsers_directory}/get_console_output"
|
||||||
|
require "#{parsers_directory}/run_instances"
|
||||||
|
require "#{parsers_directory}/terminate_instances"
|
||||||
|
|
||||||
|
requests_directory = "#{current_directory}/requests/ec2"
|
||||||
|
require "#{requests_directory}/allocate_address"
|
||||||
|
require "#{requests_directory}/associate_address"
|
||||||
|
require "#{requests_directory}/attach_volume"
|
||||||
|
require "#{requests_directory}/authorize_security_group_ingress"
|
||||||
|
# TODO: require "#{requests_directory}/bundle_instance"
|
||||||
|
# TODO: require "#{requests_directory}/cancel_bundle_task"
|
||||||
|
# TODO: require "#{requests_directory}/confirm_product_instance"
|
||||||
|
require "#{requests_directory}/create_key_pair"
|
||||||
|
require "#{requests_directory}/create_security_group"
|
||||||
|
require "#{requests_directory}/create_snapshot"
|
||||||
|
require "#{requests_directory}/create_volume"
|
||||||
|
require "#{requests_directory}/delete_key_pair"
|
||||||
|
require "#{requests_directory}/delete_security_group"
|
||||||
|
require "#{requests_directory}/delete_snapshot"
|
||||||
|
require "#{requests_directory}/delete_volume"
|
||||||
|
# TODO: require "#{requests_directory}/deregister_image"
|
||||||
|
require "#{requests_directory}/describe_addresses"
|
||||||
|
require "#{requests_directory}/describe_availability_zones"
|
||||||
|
# TODO: require "#{requests_directory}/describe_bundle_tasks"
|
||||||
|
# TODO: require "#{requests_directory}/describe_image_attribute"
|
||||||
|
require "#{requests_directory}/describe_images"
|
||||||
|
require "#{requests_directory}/describe_instances"
|
||||||
|
require "#{requests_directory}/describe_key_pairs"
|
||||||
|
require "#{requests_directory}/describe_regions"
|
||||||
|
# TODO: require "#{requests_directory}/describe_reserved_instances"
|
||||||
|
# TODO: require "#{requests_directory}/describe_reserved_instances_offerings"
|
||||||
|
require "#{requests_directory}/describe_security_groups"
|
||||||
|
require "#{requests_directory}/describe_snapshots"
|
||||||
|
require "#{requests_directory}/describe_volumes"
|
||||||
|
require "#{requests_directory}/detach_volume"
|
||||||
|
require "#{requests_directory}/disassociate_address"
|
||||||
|
require "#{requests_directory}/get_console_output"
|
||||||
|
# TODO: require "#{requests_directory}/modify_image_attribute"
|
||||||
|
# TODO: require "#{requests_directory}/monitor_instances"
|
||||||
|
# TODO: require "#{requests_directory}/purchase_reserved_instances_offering"
|
||||||
|
require "#{requests_directory}/reboot_instances"
|
||||||
|
# TODO: require "#{requests_directory}/register_image"
|
||||||
|
require "#{requests_directory}/release_address"
|
||||||
|
require "#{requests_directory}/revoke_security_group_ingress"
|
||||||
|
require "#{requests_directory}/run_instances"
|
||||||
|
require "#{requests_directory}/terminate_instances"
|
||||||
|
# TODO: require "#{requests_directory}/unmonitor_instances"
|
||||||
|
|
||||||
@aws_access_key_id = options[:aws_access_key_id]
|
@aws_access_key_id = options[:aws_access_key_id]
|
||||||
@aws_secret_access_key = options[:aws_secret_access_key]
|
@aws_secret_access_key = options[:aws_secret_access_key]
|
||||||
@hmac = HMAC::SHA256.new(@aws_secret_access_key)
|
@hmac = HMAC::SHA256.new(@aws_secret_access_key)
|
||||||
|
|
|
@ -1,29 +1,53 @@
|
||||||
module Fog
|
unless Fog.mocking?
|
||||||
module AWS
|
|
||||||
class S3
|
module Fog
|
||||||
|
module AWS
|
||||||
|
class S3
|
||||||
|
|
||||||
|
# List information about S3 buckets for authorized user
|
||||||
|
#
|
||||||
|
# ==== Returns
|
||||||
|
# * response<~Fog::AWS::Response>:
|
||||||
|
# * body<~Hash>:
|
||||||
|
# * 'Buckets'<~Hash>:
|
||||||
|
# * 'Name'<~String> - Name of bucket
|
||||||
|
# * 'CreationTime'<~Time> - Timestamp of bucket creation
|
||||||
|
# * 'Owner'<~Hash>:
|
||||||
|
# * 'DisplayName'<~String> - Display name of bucket owner
|
||||||
|
# * 'ID'<~String> - Id of bucket owner
|
||||||
|
def get_service
|
||||||
|
request({
|
||||||
|
:expects => 200,
|
||||||
|
:headers => {},
|
||||||
|
:host => @host,
|
||||||
|
:method => 'GET',
|
||||||
|
:parser => Fog::Parsers::AWS::S3::GetService.new,
|
||||||
|
:url => @host
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
# List information about S3 buckets for authorized user
|
|
||||||
#
|
|
||||||
# ==== Returns
|
|
||||||
# * response<~Fog::AWS::Response>:
|
|
||||||
# * body<~Hash>:
|
|
||||||
# * 'Buckets'<~Hash>:
|
|
||||||
# * 'Name'<~String> - Name of bucket
|
|
||||||
# * 'CreationTime'<~Time> - Timestamp of bucket creation
|
|
||||||
# * 'Owner'<~Hash>:
|
|
||||||
# * 'DisplayName'<~String> - Display name of bucket owner
|
|
||||||
# * 'ID'<~String> - Id of bucket owner
|
|
||||||
def get_service
|
|
||||||
request({
|
|
||||||
:expects => 200,
|
|
||||||
:headers => {},
|
|
||||||
:host => @host,
|
|
||||||
:method => 'GET',
|
|
||||||
:parser => Fog::Parsers::AWS::S3::GetService.new,
|
|
||||||
:url => @host
|
|
||||||
})
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
module Fog
|
||||||
|
module AWS
|
||||||
|
class S3
|
||||||
|
|
||||||
|
def get_service
|
||||||
|
response = Fog::Response.new
|
||||||
|
response.headers['Status'] = 200
|
||||||
|
response.body = {
|
||||||
|
'Buckets' => [ { 'CreationDate' => Time.now - rand(3600), 'Name' => 'foggetservice' } ],
|
||||||
|
'Owner' => { 'DisplayName' => 'owner', 'ID' => 'some_id'}
|
||||||
|
}
|
||||||
|
response
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,36 +1,3 @@
|
||||||
require 'rubygems'
|
|
||||||
require 'base64'
|
|
||||||
require 'cgi'
|
|
||||||
require 'digest/md5'
|
|
||||||
require 'hmac-sha1'
|
|
||||||
require 'mime/types'
|
|
||||||
|
|
||||||
current_directory = File.dirname(__FILE__)
|
|
||||||
require "#{current_directory}/../connection"
|
|
||||||
require "#{current_directory}/../parser"
|
|
||||||
require "#{current_directory}/../response"
|
|
||||||
|
|
||||||
parsers_directory = "#{current_directory}/parsers/s3"
|
|
||||||
require "#{parsers_directory}/copy_object"
|
|
||||||
require "#{parsers_directory}/get_bucket"
|
|
||||||
require "#{parsers_directory}/get_bucket_location"
|
|
||||||
require "#{parsers_directory}/get_request_payment"
|
|
||||||
require "#{parsers_directory}/get_service"
|
|
||||||
|
|
||||||
requests_directory = "#{current_directory}/requests/s3"
|
|
||||||
require "#{requests_directory}/copy_object"
|
|
||||||
require "#{requests_directory}/delete_bucket"
|
|
||||||
require "#{requests_directory}/delete_object"
|
|
||||||
require "#{requests_directory}/get_bucket"
|
|
||||||
require "#{requests_directory}/get_bucket_location"
|
|
||||||
require "#{requests_directory}/get_object"
|
|
||||||
require "#{requests_directory}/get_request_payment"
|
|
||||||
require "#{requests_directory}/get_service"
|
|
||||||
require "#{requests_directory}/head_object"
|
|
||||||
require "#{requests_directory}/put_bucket"
|
|
||||||
require "#{requests_directory}/put_object"
|
|
||||||
require "#{requests_directory}/put_request_payment"
|
|
||||||
|
|
||||||
module Fog
|
module Fog
|
||||||
module AWS
|
module AWS
|
||||||
class S3
|
class S3
|
||||||
|
@ -53,6 +20,34 @@ module Fog
|
||||||
# ==== Returns
|
# ==== Returns
|
||||||
# * S3 object with connection to aws.
|
# * S3 object with connection to aws.
|
||||||
def initialize(options={})
|
def initialize(options={})
|
||||||
|
Fog.mocking = options[:mocking] || false
|
||||||
|
|
||||||
|
current_directory = File.dirname(__FILE__)
|
||||||
|
require "#{current_directory}/../connection"
|
||||||
|
require "#{current_directory}/../parser"
|
||||||
|
require "#{current_directory}/../response"
|
||||||
|
|
||||||
|
parsers_directory = "#{current_directory}/parsers/s3"
|
||||||
|
require "#{parsers_directory}/copy_object"
|
||||||
|
require "#{parsers_directory}/get_bucket"
|
||||||
|
require "#{parsers_directory}/get_bucket_location"
|
||||||
|
require "#{parsers_directory}/get_request_payment"
|
||||||
|
require "#{parsers_directory}/get_service"
|
||||||
|
|
||||||
|
requests_directory = "#{current_directory}/requests/s3"
|
||||||
|
require "#{requests_directory}/copy_object"
|
||||||
|
require "#{requests_directory}/delete_bucket"
|
||||||
|
require "#{requests_directory}/delete_object"
|
||||||
|
require "#{requests_directory}/get_bucket"
|
||||||
|
require "#{requests_directory}/get_bucket_location"
|
||||||
|
require "#{requests_directory}/get_object"
|
||||||
|
require "#{requests_directory}/get_request_payment"
|
||||||
|
require "#{requests_directory}/get_service"
|
||||||
|
require "#{requests_directory}/head_object"
|
||||||
|
require "#{requests_directory}/put_bucket"
|
||||||
|
require "#{requests_directory}/put_object"
|
||||||
|
require "#{requests_directory}/put_request_payment"
|
||||||
|
|
||||||
@aws_access_key_id = options[:aws_access_key_id]
|
@aws_access_key_id = options[:aws_access_key_id]
|
||||||
@aws_secret_access_key = options[:aws_secret_access_key]
|
@aws_secret_access_key = options[:aws_secret_access_key]
|
||||||
@hmac = HMAC::SHA1.new(@aws_secret_access_key)
|
@hmac = HMAC::SHA1.new(@aws_secret_access_key)
|
||||||
|
|
|
@ -1,31 +1,3 @@
|
||||||
require 'rubygems'
|
|
||||||
require 'base64'
|
|
||||||
require 'cgi'
|
|
||||||
require 'hmac-sha2'
|
|
||||||
|
|
||||||
current_directory = File.dirname(__FILE__)
|
|
||||||
require "#{current_directory}/../connection"
|
|
||||||
require "#{current_directory}/../parser"
|
|
||||||
require "#{current_directory}/../response"
|
|
||||||
|
|
||||||
parsers_directory = "#{current_directory}/parsers/simpledb"
|
|
||||||
require "#{parsers_directory}/basic"
|
|
||||||
require "#{parsers_directory}/domain_metadata"
|
|
||||||
require "#{parsers_directory}/get_attributes"
|
|
||||||
require "#{parsers_directory}/list_domains"
|
|
||||||
require "#{parsers_directory}/select"
|
|
||||||
|
|
||||||
requests_directory = "#{current_directory}/requests/simpledb"
|
|
||||||
require "#{requests_directory}/batch_put_attributes"
|
|
||||||
require "#{requests_directory}/create_domain"
|
|
||||||
require "#{requests_directory}/delete_attributes"
|
|
||||||
require "#{requests_directory}/delete_domain"
|
|
||||||
require "#{requests_directory}/domain_metadata"
|
|
||||||
require "#{requests_directory}/get_attributes"
|
|
||||||
require "#{requests_directory}/list_domains"
|
|
||||||
require "#{requests_directory}/put_attributes"
|
|
||||||
require "#{requests_directory}/select"
|
|
||||||
|
|
||||||
module Fog
|
module Fog
|
||||||
module AWS
|
module AWS
|
||||||
class SimpleDB
|
class SimpleDB
|
||||||
|
@ -48,6 +20,31 @@ module Fog
|
||||||
# ==== Returns
|
# ==== Returns
|
||||||
# * SimpleDB object with connection to aws.
|
# * SimpleDB object with connection to aws.
|
||||||
def initialize(options={})
|
def initialize(options={})
|
||||||
|
Fog.mocking = options[:mocking] || false
|
||||||
|
|
||||||
|
current_directory = File.dirname(__FILE__)
|
||||||
|
require "#{current_directory}/../connection"
|
||||||
|
require "#{current_directory}/../parser"
|
||||||
|
require "#{current_directory}/../response"
|
||||||
|
|
||||||
|
parsers_directory = "#{current_directory}/parsers/simpledb"
|
||||||
|
require "#{parsers_directory}/basic"
|
||||||
|
require "#{parsers_directory}/domain_metadata"
|
||||||
|
require "#{parsers_directory}/get_attributes"
|
||||||
|
require "#{parsers_directory}/list_domains"
|
||||||
|
require "#{parsers_directory}/select"
|
||||||
|
|
||||||
|
requests_directory = "#{current_directory}/requests/simpledb"
|
||||||
|
require "#{requests_directory}/batch_put_attributes"
|
||||||
|
require "#{requests_directory}/create_domain"
|
||||||
|
require "#{requests_directory}/delete_attributes"
|
||||||
|
require "#{requests_directory}/delete_domain"
|
||||||
|
require "#{requests_directory}/domain_metadata"
|
||||||
|
require "#{requests_directory}/get_attributes"
|
||||||
|
require "#{requests_directory}/list_domains"
|
||||||
|
require "#{requests_directory}/put_attributes"
|
||||||
|
require "#{requests_directory}/select"
|
||||||
|
|
||||||
@aws_access_key_id = options[:aws_access_key_id]
|
@aws_access_key_id = options[:aws_access_key_id]
|
||||||
@aws_secret_access_key = options[:aws_secret_access_key]
|
@aws_secret_access_key = options[:aws_secret_access_key]
|
||||||
@hmac = HMAC::SHA256.new(@aws_secret_access_key)
|
@hmac = HMAC::SHA256.new(@aws_secret_access_key)
|
||||||
|
|
|
@ -5,145 +5,163 @@ require 'uri'
|
||||||
|
|
||||||
require "#{File.dirname(__FILE__)}/response"
|
require "#{File.dirname(__FILE__)}/response"
|
||||||
|
|
||||||
module Fog
|
unless Fog.mocking?
|
||||||
class Connection
|
|
||||||
|
|
||||||
def initialize(url)
|
module Fog
|
||||||
@uri = URI.parse(url)
|
class Connection
|
||||||
@connection = TCPSocket.open(@uri.host, @uri.port)
|
|
||||||
if @uri.scheme == 'https'
|
|
||||||
@ssl_context = OpenSSL::SSL::SSLContext.new
|
|
||||||
@ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
|
||||||
@connection = OpenSSL::SSL::SSLSocket.new(@connection, @ssl_context)
|
|
||||||
@connection.sync_close = true
|
|
||||||
@connection.connect
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Messages for nicer exceptions, from rfc2616
|
def initialize(url)
|
||||||
def error_message(expected, actual)
|
@uri = URI.parse(url)
|
||||||
@messages ||= {
|
@connection = TCPSocket.open(@uri.host, @uri.port)
|
||||||
100 => 'Continue',
|
if @uri.scheme == 'https'
|
||||||
101 => 'Switching Protocols',
|
@ssl_context = OpenSSL::SSL::SSLContext.new
|
||||||
200 => 'OK',
|
@ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
||||||
201 =>'Created',
|
@connection = OpenSSL::SSL::SSLSocket.new(@connection, @ssl_context)
|
||||||
202 => 'Accepted',
|
@connection.sync_close = true
|
||||||
203 => 'Non-Authoritative Information',
|
@connection.connect
|
||||||
204 => 'No Content',
|
|
||||||
205 => 'Reset Content',
|
|
||||||
206 => 'Partial Content',
|
|
||||||
300 => 'Multiple Choices',
|
|
||||||
301 => 'Moved Permanently',
|
|
||||||
302 => 'Found',
|
|
||||||
303 => 'See Other',
|
|
||||||
304 => 'Not Modified',
|
|
||||||
305 => 'Use Proxy',
|
|
||||||
307 => 'Temporary Redirect',
|
|
||||||
400 => 'Bad Request',
|
|
||||||
401 => 'Unauthorized',
|
|
||||||
402 => 'Payment Required',
|
|
||||||
403 => 'Forbidden',
|
|
||||||
404 => 'Not Found',
|
|
||||||
405 => 'Method Not Allowed',
|
|
||||||
406 => 'Not Acceptable',
|
|
||||||
407 => 'Proxy Authentication Required',
|
|
||||||
408 => 'Request Timeout',
|
|
||||||
409 => 'Conflict',
|
|
||||||
410 => 'Gone',
|
|
||||||
411 => 'Length Required',
|
|
||||||
412 => 'Precondition Failed',
|
|
||||||
413 => 'Request Entity Too Large',
|
|
||||||
414 => 'Request-URI Too Long',
|
|
||||||
415 => 'Unsupported Media Type',
|
|
||||||
416 => 'Requested Range Not Satisfiable',
|
|
||||||
417 => 'Expectation Failed',
|
|
||||||
500 => 'Internal Server Error',
|
|
||||||
501 => 'Not Implemented',
|
|
||||||
502 => 'Bad Gateway',
|
|
||||||
503 => 'Service Unavailable',
|
|
||||||
504 => 'Gateway Timeout'
|
|
||||||
}
|
|
||||||
"Expected(#{expected} #{@messages[expected]}) <=> Got(#{actual} #{@messages[actual]})"
|
|
||||||
end
|
|
||||||
|
|
||||||
def request(params)
|
|
||||||
params[:path] ||= ''
|
|
||||||
unless params[:path][0] == '/'
|
|
||||||
params[:path] = '/' + params[:path].to_s
|
|
||||||
end
|
|
||||||
if params[:query] && !params[:query].empty?
|
|
||||||
params[:path] << "?#{params[:query]}"
|
|
||||||
end
|
|
||||||
request = "#{params[:method]} #{params[:path]} HTTP/1.1\r\n"
|
|
||||||
params[:headers] ||= {}
|
|
||||||
params[:headers]['Host'] = params[:host]
|
|
||||||
if params[:body]
|
|
||||||
params[:headers]['Content-Length'] = params[:body].length
|
|
||||||
end
|
|
||||||
for key, value in params[:headers]
|
|
||||||
request << "#{key}: #{value}\r\n"
|
|
||||||
end
|
|
||||||
request << "\r\n#{params[:body]}"
|
|
||||||
@connection.write(request)
|
|
||||||
|
|
||||||
response = Fog::Response.new
|
|
||||||
response.request = params
|
|
||||||
response.status = @connection.readline[9..11].to_i
|
|
||||||
while true
|
|
||||||
data = @connection.readline.chomp!
|
|
||||||
if data == ""
|
|
||||||
break
|
|
||||||
end
|
end
|
||||||
header = data.split(': ')
|
|
||||||
response.headers[capitalize(header[0])] = header[1]
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if params[:parser]
|
# Messages for nicer exceptions, from rfc2616
|
||||||
body = Nokogiri::XML::SAX::PushParser.new(params[:parser])
|
def error_message(expected, actual)
|
||||||
else
|
@messages ||= {
|
||||||
body = ''
|
100 => 'Continue',
|
||||||
|
101 => 'Switching Protocols',
|
||||||
|
200 => 'OK',
|
||||||
|
201 =>'Created',
|
||||||
|
202 => 'Accepted',
|
||||||
|
203 => 'Non-Authoritative Information',
|
||||||
|
204 => 'No Content',
|
||||||
|
205 => 'Reset Content',
|
||||||
|
206 => 'Partial Content',
|
||||||
|
300 => 'Multiple Choices',
|
||||||
|
301 => 'Moved Permanently',
|
||||||
|
302 => 'Found',
|
||||||
|
303 => 'See Other',
|
||||||
|
304 => 'Not Modified',
|
||||||
|
305 => 'Use Proxy',
|
||||||
|
307 => 'Temporary Redirect',
|
||||||
|
400 => 'Bad Request',
|
||||||
|
401 => 'Unauthorized',
|
||||||
|
402 => 'Payment Required',
|
||||||
|
403 => 'Forbidden',
|
||||||
|
404 => 'Not Found',
|
||||||
|
405 => 'Method Not Allowed',
|
||||||
|
406 => 'Not Acceptable',
|
||||||
|
407 => 'Proxy Authentication Required',
|
||||||
|
408 => 'Request Timeout',
|
||||||
|
409 => 'Conflict',
|
||||||
|
410 => 'Gone',
|
||||||
|
411 => 'Length Required',
|
||||||
|
412 => 'Precondition Failed',
|
||||||
|
413 => 'Request Entity Too Large',
|
||||||
|
414 => 'Request-URI Too Long',
|
||||||
|
415 => 'Unsupported Media Type',
|
||||||
|
416 => 'Requested Range Not Satisfiable',
|
||||||
|
417 => 'Expectation Failed',
|
||||||
|
500 => 'Internal Server Error',
|
||||||
|
501 => 'Not Implemented',
|
||||||
|
502 => 'Bad Gateway',
|
||||||
|
503 => 'Service Unavailable',
|
||||||
|
504 => 'Gateway Timeout'
|
||||||
|
}
|
||||||
|
"Expected(#{expected} #{@messages[expected]}) <=> Got(#{actual} #{@messages[actual]})"
|
||||||
end
|
end
|
||||||
|
|
||||||
unless params[:method] == 'HEAD'
|
def request(params)
|
||||||
if response.headers['Content-Length']
|
params[:path] ||= ''
|
||||||
body << @connection.read(response.headers['Content-Length'].to_i)
|
unless params[:path][0] == '/'
|
||||||
elsif response.headers['Transfer-Encoding'] == 'chunked'
|
params[:path] = '/' + params[:path].to_s
|
||||||
while true
|
end
|
||||||
# 2 == "/r/n".length
|
if params[:query] && !params[:query].empty?
|
||||||
chunk_size = @connection.readline.chomp!.to_i(16) + 2
|
params[:path] << "?#{params[:query]}"
|
||||||
chunk = @connection.read(chunk_size)
|
end
|
||||||
body << chunk[0...-2]
|
request = "#{params[:method]} #{params[:path]} HTTP/1.1\r\n"
|
||||||
if chunk_size == 2
|
params[:headers] ||= {}
|
||||||
break
|
params[:headers]['Host'] = params[:host]
|
||||||
|
if params[:body]
|
||||||
|
params[:headers]['Content-Length'] = params[:body].length
|
||||||
|
end
|
||||||
|
for key, value in params[:headers]
|
||||||
|
request << "#{key}: #{value}\r\n"
|
||||||
|
end
|
||||||
|
request << "\r\n#{params[:body]}"
|
||||||
|
@connection.write(request)
|
||||||
|
|
||||||
|
response = Fog::Response.new
|
||||||
|
response.request = params
|
||||||
|
response.status = @connection.readline[9..11].to_i
|
||||||
|
while true
|
||||||
|
data = @connection.readline.chomp!
|
||||||
|
if data == ""
|
||||||
|
break
|
||||||
|
end
|
||||||
|
header = data.split(': ')
|
||||||
|
response.headers[capitalize(header[0])] = header[1]
|
||||||
|
end
|
||||||
|
|
||||||
|
if params[:parser]
|
||||||
|
body = Nokogiri::XML::SAX::PushParser.new(params[:parser])
|
||||||
|
else
|
||||||
|
body = ''
|
||||||
|
end
|
||||||
|
|
||||||
|
unless params[:method] == 'HEAD'
|
||||||
|
if response.headers['Content-Length']
|
||||||
|
body << @connection.read(response.headers['Content-Length'].to_i)
|
||||||
|
elsif response.headers['Transfer-Encoding'] == 'chunked'
|
||||||
|
while true
|
||||||
|
# 2 == "/r/n".length
|
||||||
|
chunk_size = @connection.readline.chomp!.to_i(16) + 2
|
||||||
|
chunk = @connection.read(chunk_size)
|
||||||
|
body << chunk[0...-2]
|
||||||
|
if chunk_size == 2
|
||||||
|
break
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if params[:parser]
|
||||||
|
body.finish
|
||||||
|
response.body = params[:parser].response
|
||||||
|
else
|
||||||
|
response.body = body
|
||||||
|
end
|
||||||
|
|
||||||
|
if params[:expects] && params[:expects] != response.status
|
||||||
|
raise(error_message(params[:expects], response.status))
|
||||||
|
else
|
||||||
|
response
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if params[:parser]
|
private
|
||||||
body.finish
|
|
||||||
response.body = params[:parser].response
|
def capitalize(header)
|
||||||
else
|
words = header.split('-')
|
||||||
response.body = body
|
header = ''
|
||||||
|
for word in words
|
||||||
|
header << word[0..0].upcase << word[1..-1] << '-'
|
||||||
|
end
|
||||||
|
header.chop!
|
||||||
end
|
end
|
||||||
|
|
||||||
if params[:expects] && params[:expects] != response.status
|
|
||||||
raise(error_message(params[:expects], response.status))
|
|
||||||
else
|
|
||||||
response
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def capitalize(header)
|
|
||||||
words = header.split('-')
|
|
||||||
header = ''
|
|
||||||
for word in words
|
|
||||||
header << word[0..0].upcase << word[1..-1] << '-'
|
|
||||||
end
|
|
||||||
header.chop!
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
module Fog
|
||||||
|
class Connection
|
||||||
|
|
||||||
|
def initialize(url)
|
||||||
|
end
|
||||||
|
|
||||||
|
def request(params)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -2,6 +2,7 @@ require 'spec'
|
||||||
|
|
||||||
current_directory = File.dirname(__FILE__)
|
current_directory = File.dirname(__FILE__)
|
||||||
require "#{current_directory}/../lib/fog"
|
require "#{current_directory}/../lib/fog"
|
||||||
|
Fog.mocking = true
|
||||||
|
|
||||||
Spec::Runner.configure do |config|
|
Spec::Runner.configure do |config|
|
||||||
end
|
end
|
||||||
|
|
Loading…
Add table
Reference in a new issue