Support for custom request encoding (e.g. POST or JSON).

This commit is contained in:
Zack Hobson 2009-12-31 14:38:58 -08:00
parent 6488d27880
commit cf2589a626
10 changed files with 93 additions and 26 deletions

View File

@ -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 = [

View File

@ -21,7 +21,15 @@ module Faraday
: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

View File

@ -20,11 +20,11 @@ module Faraday
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)
@ -35,19 +35,6 @@ module Faraday
_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

View File

@ -26,7 +26,7 @@ module Faraday
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)
@ -34,7 +34,7 @@ module Faraday
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)

View File

@ -17,6 +17,7 @@ module Faraday
def initialize(url = nil)
@response_class = nil
@request_class = nil
self.url_prefix = url if url
end
@ -28,6 +29,10 @@ module Faraday
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)
@ -59,6 +64,10 @@ module Faraday
_delete build_uri(uri, params), headers
end
def request_class
@request_class || Request::PostRequest
end
def response_class
@response_class || Response
end
@ -70,6 +79,13 @@ module Faraday
@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

13
lib/faraday/loadable.rb Normal file
View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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',
@ -40,4 +35,4 @@ module Faraday
self.body = body.join if body.respond_to?(:join)
end
end
end
end

View File

@ -1,5 +1,6 @@
require 'rubygems'
require 'context'
require 'ruby-debug'
if ENV['LEFTRIGHT']
require 'leftright'
end