@@ -11,13 +11,22 @@ module ActiveResource
1111 # This class is used by ActiveResource::Base to interface with REST
1212 # services.
1313 class Connection
14- HTTP_FORMAT_HEADER_NAMES = { get : "Accept" ,
14+ HTTP_FORMAT_HEADER_NAMES = {
15+ get : "Accept" ,
1516 put : "Content-Type" ,
1617 post : "Content-Type" ,
1718 patch : "Content-Type" ,
1819 delete : "Accept" ,
1920 head : "Accept"
2021 }
22+ HTTP_METHODS = {
23+ get : Net ::HTTP ::Get ,
24+ put : Net ::HTTP ::Put ,
25+ post : Net ::HTTP ::Post ,
26+ patch : Net ::HTTP ::Patch ,
27+ delete : Net ::HTTP ::Delete ,
28+ head : Net ::HTTP ::Head
29+ } . freeze # :nodoc:
2130
2231 attr_reader :site , :user , :password , :bearer_token , :auth_type , :timeout , :open_timeout , :read_timeout , :proxy , :ssl_options
2332 attr_accessor :format , :logger
@@ -80,50 +89,52 @@ def auth_type=(auth_type)
8089 # Executes a GET request.
8190 # Used to get (find) resources.
8291 def get ( path , headers = { } )
83- with_auth { request ( :get , path , build_request_headers ( headers , :get , self . site . merge ( path ) ) ) }
92+ with_auth { request ( :get , path , headers ) }
8493 end
8594
8695 # Executes a DELETE request (see HTTP protocol documentation if unfamiliar).
8796 # Used to delete resources.
8897 def delete ( path , headers = { } )
89- with_auth { request ( :delete , path , build_request_headers ( headers , :delete , self . site . merge ( path ) ) ) }
98+ with_auth { request ( :delete , path , headers ) }
9099 end
91100
92101 # Executes a PATCH request (see HTTP protocol documentation if unfamiliar).
93102 # Used to update resources.
94103 def patch ( path , body = "" , headers = { } )
95- with_auth { request ( :patch , path , body . to_s , build_request_headers ( headers , :patch , self . site . merge ( path ) ) ) }
104+ with_auth { request ( :patch , path , body . to_s , headers ) }
96105 end
97106
98107 # Executes a PUT request (see HTTP protocol documentation if unfamiliar).
99108 # Used to update resources.
100109 def put ( path , body = "" , headers = { } )
101- with_auth { request ( :put , path , body . to_s , build_request_headers ( headers , :put , self . site . merge ( path ) ) ) }
110+ with_auth { request ( :put , path , body . to_s , headers ) }
102111 end
103112
104113 # Executes a POST request.
105114 # Used to create new resources.
106115 def post ( path , body = "" , headers = { } )
107- with_auth { request ( :post , path , body . to_s , build_request_headers ( headers , :post , self . site . merge ( path ) ) ) }
116+ with_auth { request ( :post , path , body . to_s , headers ) }
108117 end
109118
110119 # Executes a HEAD request.
111120 # Used to obtain meta-information about resources, such as whether they exist and their size (via response headers).
112121 def head ( path , headers = { } )
113- with_auth { request ( :head , path , build_request_headers ( headers , :head , self . site . merge ( path ) ) ) }
122+ with_auth { request ( :head , path , headers ) }
114123 end
115124
116125 private
117126 # Makes a request to the remote service.
118127 def request ( method , path , *arguments )
119128 body , headers = arguments
120129 headers , body = body , nil if headers . nil?
130+ request = build_request ( method , path , headers )
131+ request . body = body
121132 result = ActiveSupport ::Notifications . instrument ( "request.active_resource" ) do |payload |
122133 payload [ :method ] = method
123- payload [ :request_uri ] = " #{ site . scheme } :// #{ site . host } : #{ site . port } #{ path } "
124- payload [ :headers ] = headers
134+ payload [ :request_uri ] = request . uri . to_s
135+ payload [ :headers ] = request . each_capitalized . to_h
125136 payload [ :body ] = body
126- payload [ :result ] = http . send ( method , path , * arguments )
137+ payload [ :result ] = http . request ( request )
127138 end
128139 handle_response ( result )
129140 rescue Timeout ::Error => e
@@ -218,6 +229,15 @@ def default_header
218229 @default_header ||= { }
219230 end
220231
232+ def build_request ( http_method , path , headers )
233+ HTTP_METHODS [ http_method ] . new ( site . merge ( path ) ) . tap do |request |
234+ headers = build_request_headers ( headers , http_method , request . uri )
235+
236+ request . each_name { |name | request . delete ( name ) }
237+ headers . each_pair { |name , value | request [ name ] = value }
238+ end
239+ end
240+
221241 # Builds headers for request to remote service.
222242 def build_request_headers ( headers , http_method , uri )
223243 authorization_header ( http_method , uri ) . update ( default_header ) . update ( http_format_header ( http_method ) ) . update ( headers . to_hash )
0 commit comments