Skip to content

Commit

Permalink
Rework NetHttp adapter to take better advantage of Module
Browse files Browse the repository at this point in the history
  • Loading branch information
mwunsch committed Sep 17, 2012
1 parent 06e3878 commit 2290b5b
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 46 deletions.
85 changes: 43 additions & 42 deletions lib/weary/adapters/net_http.rb
Expand Up @@ -4,59 +4,60 @@
module Weary
module Adapter
class NetHttp
include Weary::Adapter

def self.call(env)
connect(Rack::Request.new(env)).finish
end
class << self
include Weary::Adapter

def self.connect(request)
connection = socket(request)
response = connection.request prepare(request)
Rack::Response.new response.body || "", response.code, normalize_response(response.to_hash)
end
def connect(request)
connection = socket(request)
response = connection.request prepare(request)
Rack::Response.new response.body || "", response.code, normalize_response(response.to_hash)
end

def self.prepare(request)
req_class = request_class(request.request_method)
net_http_req = req_class.new(request.fullpath, normalize_request_headers(request.env))
if net_http_req.request_body_permitted? # What's the best way of passing the body?
net_http_req.body = request.body.read
request.body.rewind
def prepare(request)
req_class = request_class(request.request_method)
net_http_req = req_class.new(request.fullpath, normalize_request_headers(request.env))
if net_http_req.request_body_permitted? # What's the best way of passing the body?
net_http_req.body = request.body.read
request.body.rewind
end
net_http_req.content_type = request.content_type if request.content_type
net_http_req.content_length = request.content_length if request.content_length
net_http_req
end
net_http_req.content_type = request.content_type if request.content_type
net_http_req.content_length = request.content_length if request.content_length
net_http_req
end

def self.normalize_request_headers(env)
req_headers = env.reject {|k,v| !k.start_with? "HTTP_" }
normalized = req_headers.map do |k, v|
new_key = k.sub("HTTP_",'').split('_').map(&:capitalize).join('-')
[new_key, v] unless UNWANTED_REQUEST_HEADERS.include? new_key
def normalize_request_headers(env)
req_headers = env.reject {|k,v| !k.start_with? "HTTP_" }
normalized = req_headers.map do |k, v|
new_key = k.sub("HTTP_",'').split('_').map(&:capitalize).join('-')
[new_key, v] unless UNWANTED_REQUEST_HEADERS.include? new_key
end
Hash[normalized]
end
Hash[normalized]
end

def self.normalize_response(headers)
headers.reject {|k,v| k.downcase == 'status' }
end
def normalize_response(headers)
headers.reject {|k,v| k.downcase == 'status' }
end

def self.socket(request)
host = request.env['HTTP_HOST'] || request.env['SERVER_NAME']
port = request.env['SERVER_PORT'].to_s
connection = Net::HTTP.new host, port
connection.use_ssl = request.scheme == 'https'
connection.verify_mode = OpenSSL::SSL::VERIFY_NONE if connection.use_ssl?
connection
end
def socket(request)
host = request.env['HTTP_HOST'] || request.env['SERVER_NAME']
port = request.env['SERVER_PORT'].to_s
connection = Net::HTTP.new host, port
connection.use_ssl = request.scheme == 'https'
connection.verify_mode = OpenSSL::SSL::VERIFY_NONE if connection.use_ssl?
connection
end

def self.request_class(method)
capitalized = method.capitalize
Net::HTTP.const_get capitalized
def request_class(method)
capitalized = method.capitalize
Net::HTTP.const_get capitalized
end
end

def call(env)
self.class.call(env)
include Weary::Adapter

def connect(rack_request)
self.class.connect(rack_request)
end

private
Expand Down
17 changes: 13 additions & 4 deletions spec/weary/adapters/nethttp_spec.rb
Expand Up @@ -24,11 +24,20 @@
end
end

describe "#connect" do
it "calls the class method `.connect`" do
described_class.stub(:connect) { [200, {'Content-Type' => 'text/plain'}, [""]] }
described_class.should_receive(:connect)
described_class.new.connect(Rack::Request.new(@request.env))
end
end

describe "#call" do
it "calls the class method `.call`" do
described_class.stub(:call) { [200, {'Content-Type' => 'text/plain'}, [""]] }
described_class.should_receive(:call)
described_class.new.call(@request.env)
it "uses the overriden `#connect` method" do
instance = described_class.new
instance.stub(:connect) { Rack::Response.new [""], 501, {"Content-Type" => "text/plain"} }
instance.should_receive(:connect)
instance.call(@request.env)
end
end

Expand Down

0 comments on commit 2290b5b

Please sign in to comment.