Skip to content

Instantly share code, notes, and snippets.

@ayamomiji
Created April 17, 2012 14:06
Show Gist options
  • Save ayamomiji/2406178 to your computer and use it in GitHub Desktop.
Save ayamomiji/2406178 to your computer and use it in GitHub Desktop.
rest-core/app/net-http.rb
require 'rest-core/middleware'
require 'net/http'
class RestCore::NetHttp
include RestCore::Middleware
def call env
uri = URI.parse(request_uri(env))
payload = ::RestClient::Payload.generate(env[REQUEST_PAYLOAD])
client = Net::HTTP.new(uri.host, uri.port)
request = create_request(env[REQUEST_METHOD], uri.request_uri)
payload.headers.merge(env[REQUEST_HEADERS]).each do |k, v|
request.add_field(k, v)
end
request.body_stream = payload
response = client.request(request)
result = env.merge(RESPONSE_BODY => response.body,
RESPONSE_STATUS => response.code,
RESPONSE_HEADERS => normalize_headers(response.to_hash))
result[ASYNC].call(result) if result[ASYNC]
result
end
def create_request method, path
cls = case method
when :get then Net::HTTP::Get
when :post then Net::HTTP::Post
when :patch then Net::HTTP::Patch
when :put then Net::HTTP::Put
when :delete then Net::HTTP::Delete
when :head then Net::HTTP::Head
when :options then Net::HTTP::Options
end
path = '/' if path.empty?
cls.new(path)
end
def normalize_headers raw_headers
raw_headers.inject({}){ |r, (k, v)|
r[k.to_s.upcase.tr('-', '_')] = if v.kind_of?(Array) && v.size == 1
v.first
else
v
end
r
}
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment