Skip to content

Commit

Permalink
Support for custom request encoding (e.g. POST or JSON).
Browse files Browse the repository at this point in the history
  • Loading branch information
zenhob committed Dec 31, 2009
1 parent 6488d27 commit cf2589a
Show file tree
Hide file tree
Showing 10 changed files with 93 additions and 26 deletions.
2 changes: 1 addition & 1 deletion faraday.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Gem::Specification.new do |s|

s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
s.authors = ["rick"]
s.date = %q{2009-12-22}
s.date = %q{2009-12-31}
s.description = %q{HTTP/REST API client library with pluggable components}
s.email = %q{technoweenie@gmail.com}
s.extra_rdoc_files = [
Expand Down
10 changes: 9 additions & 1 deletion lib/faraday.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,15 @@ def load
:Connection => 'connection',
:TestConnection => 'test_connection',
:Response => 'response',
:Error => 'error'
:Error => 'error',
:Loadable => 'loadable'

module Request
extend AutoloadHelper
autoload_all 'faraday/request',
:YajlRequest => 'yajl_request',
:PostRequest => 'post_request'
end

module Adapter
extend AutoloadHelper
Expand Down
17 changes: 2 additions & 15 deletions lib/faraday/adapter/net_http.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,11 @@ def _perform(method, uri, data, request_headers)
end

def _put(uri, data, request_headers)
_perform('PUT', uri, post_encode(data), request_headers)
_perform('PUT', uri, encode_params(data), request_headers)
end

def _post(uri, data, request_headers)
_perform('POST', uri, post_encode(data), request_headers)
_perform('POST', uri, encode_params(data), request_headers)
end

def _get(uri, request_headers)
Expand All @@ -35,19 +35,6 @@ def _delete(uri, request_headers)
_perform('DELETE', uri, uri.query, request_headers)
end

def post_encode data
create_post_params data
end

private
def create_post_params(params, base = "")
[].tap do |toreturn|
params.each_key do |key|
keystring = base == '' ? key : "#{base}[#{key}]"
toreturn << (params[key].kind_of?(Hash) ? create_post_params(params[key], keystring) : "#{keystring}=#{CGI.escape(params[key].to_s)}")
end
end.join('&')
end
end
end
end
4 changes: 2 additions & 2 deletions lib/faraday/adapter/typhoeus.rb
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,15 @@ def run_parallel_requests
end

def _post(uri, data, request_headers)
_perform(:post, uri, :headers => request_headers, :params => data)
_perform(:post, uri, :headers => request_headers, :body => encode_params(data))
end

def _get(uri, request_headers)
_perform(:get, uri, :headers => request_headers)
end

def _put(uri, data, request_headers)
_perform(:put, uri, :headers => request_headers, :params => data)
_perform(:put, uri, :headers => request_headers, :body => encode_params(data))
end

def _delete(uri, request_headers)
Expand Down
16 changes: 16 additions & 0 deletions lib/faraday/connection.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ def loaded?() !@load_error end

def initialize(url = nil)
@response_class = nil
@request_class = nil
self.url_prefix = url if url
end

Expand All @@ -28,6 +29,10 @@ def url_prefix=(url)
self.path_prefix = uri.path
end

def encode_params data
request_class.new(data).encode
end

# Override in a subclass, or include an adapter
#
# def _get(uri, headers)
Expand Down Expand Up @@ -59,6 +64,10 @@ def delete(uri, params = {}, headers = {})
_delete build_uri(uri, params), headers
end

def request_class
@request_class || Request::PostRequest
end

def response_class
@response_class || Response
end
Expand All @@ -70,6 +79,13 @@ def response_class=(v)
@response_class = v
end

def request_class=(v)
if v.respond_to?(:loaded?) && !v.loaded?
raise ArgumentError, "The request class: #{v.inspect} does not appear to be loaded."
end
@request_class = v
end

def in_parallel?
!!@parallel_manager
end
Expand Down
13 changes: 13 additions & 0 deletions lib/faraday/loadable.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
module Faraday
module Loadable
def self.extended mod
class << mod
attr_accessor :load_error
end
end

def self.loaded?
load_error.nil?
end
end
end
25 changes: 25 additions & 0 deletions lib/faraday/request/post_request.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
module Faraday
module Request
class PostRequest
extend Loadable

def initialize params
@params = params
end

def encode
create_post_params @params
end

private
def create_post_params(params, base = "")
[].tap do |toreturn|
params.each_key do |key|
keystring = base == '' ? key : "#{base}[#{key}]"
toreturn << (params[key].kind_of?(Hash) ? create_post_params(params[key], keystring) : "#{keystring}=#{CGI.escape(params[key].to_s)}")
end
end.join('&')
end
end
end
end
22 changes: 22 additions & 0 deletions lib/faraday/request/yajl_request.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
module Faraday
module Request
class YajlRequest
extend Loadable

begin
require 'yajl'

def initialize params
@params = params
end

# TODO streaming
def encode
Yajl::Encoder.encode @params
end
rescue LoadError => e
self.load_error = e
end
end
end
end
9 changes: 2 additions & 7 deletions lib/faraday/response.rb
Original file line number Diff line number Diff line change
@@ -1,11 +1,6 @@
module Faraday
class Response < Struct.new(:headers, :body)
class << self
attr_accessor :load_error
def loaded?
!load_error
end
end
extend Loadable

extend AutoloadHelper
autoload_all 'faraday/response',
Expand Down Expand Up @@ -40,4 +35,4 @@ def processed!
self.body = body.join if body.respond_to?(:join)
end
end
end
end
1 change: 1 addition & 0 deletions test/helper.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
require 'rubygems'
require 'context'
require 'ruby-debug'
if ENV['LEFTRIGHT']
require 'leftright'
end
Expand Down

0 comments on commit cf2589a

Please sign in to comment.