Skip to content

Commit

Permalink
first implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
ebertech committed May 19, 2012
1 parent f623d01 commit eb4b6ac
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 12 deletions.
16 changes: 14 additions & 2 deletions README.md
@@ -1,6 +1,6 @@
# SignedActiveresource

TODO: Write a gem description
A simple gem that lets you hook into an ActiveResource's request to sign the request before it goes out.

## Installation

Expand All @@ -18,7 +18,19 @@ Or install it yourself as:

## Usage

TODO: Write usage instructions here
Instead of subclassing `ActiveResource::Base`, subclass `SignedActiveResource::Base` and set the `request_signer` class attribute.

class Person < SignedActiveResource::Base
self.request_signer = signer # an object that responds to sign_request!(http_request)
end

The use case that motivated it is using OAuth, so in that case your request_signer is an instance of
`OAuth::AccessToken` which will take care of signing things for you.

## Before you hate

`ActiveResource` already has a dependency on `ActiveSupport` so don't hate on me, I didn't introduce the dependency. The only time I use it is to
inflect some strings. No, I'm not doing a `require 'active_support/all'`!

## Contributing

Expand Down
48 changes: 44 additions & 4 deletions lib/signed_activeresource.rb
@@ -1,5 +1,45 @@
require "signed_activeresource/version"
require 'active_support/core_ext/string/inflections'
require 'active_resource'

module SignedActiveresource
# Your code goes here...
end
module SignedActiveResource
class Base < ActiveResource::Base
cattr_accessor :request_signer

def self.connection(refresh = false)
@connection = Connection.new(site, format) if @connection.nil? || refresh
@connection.request_signer = request_signer
@connection.timeout = timeout if timeout
return @connection
end
end

class Connection < ActiveResource::Connection
attr_accessor :request_signer

def logger
@logger ||= Logger.new(STDOUT)
end

private
# Makes request to remote service.
def request(method, path, *arguments)
logger.info "#{method.to_s.upcase} #{site.scheme}://#{site.host}:#{site.port}#{path}" if logger
result = nil
ms = Benchmark.ms {
data = arguments.shift
request = "Net::HTTP::#{method.to_s.titleize}".constantize.new(path, arguments.first)
res = nil

request_signer.sign!(request) if request_signer

result = http.request request, data
}
logger.info "--> %d %s (%d %.0fms)" % [result.code, result.message, result.body ? result.body.length : 0, ms] if logger
handle_response(result)
rescue Timeout::Error => e
raise TimeoutError.new(e.message)
rescue OpenSSL::SSL::SSLError => e
raise SSLError.new(e.message)
end
end
end
4 changes: 2 additions & 2 deletions lib/signed_activeresource/version.rb
@@ -1,3 +1,3 @@
module SignedActiveresource
VERSION = "0.0.1"
module SignedActiveResource
VERSION = "1.0.0"
end
10 changes: 6 additions & 4 deletions signed_activeresource.gemspec
Expand Up @@ -4,14 +4,16 @@ require File.expand_path('../lib/signed_activeresource/version', __FILE__)
Gem::Specification.new do |gem|
gem.authors = ["Andrew Eberbach"]
gem.email = ["andrew@ebertech.ca"]
gem.description = %q{TODO: Write a gem description}
gem.summary = %q{TODO: Write a gem summary}
gem.homepage = ""
gem.description = %q{A simple gem that lets you hook into an ActiveResource's request to sign the request}
gem.summary = %q{Let's users attached an object to "sign" requests as they go out. Useful for plugging in authentication mechanisms.}
gem.homepage = "https://github.com/ebertech/signed_activeresource"

gem.files = `git ls-files`.split($\)
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
gem.name = "signed_activeresource"
gem.require_paths = ["lib"]
gem.version = SignedActiveresource::VERSION
gem.version = SignedActiveResource::VERSION

gem.add_runtime_dependency "activeresource"
end

0 comments on commit eb4b6ac

Please sign in to comment.