@@ -7,6 +7,8 @@ module Typesense
77 class ApiCall
88 API_KEY_HEADER_NAME = 'X-TYPESENSE-API-KEY'
99
10+ attr_reader :logger
11+
1012 def initialize ( configuration )
1113 @configuration = configuration
1214
@@ -24,45 +26,40 @@ def initialize(configuration)
2426 @current_node_index = -1
2527 end
2628
27- def post ( endpoint , parameters = { } )
28- headers , query , body = split_post_put_parameters ( parameters )
29-
29+ def post ( endpoint , body_parameters = { } , query_parameters = { } )
3030 perform_request :post ,
3131 endpoint ,
32- headers ,
33- params : query ,
34- body : body
32+ query_parameters : query_parameters ,
33+ body_parameters : body_parameters
3534 end
3635
37- def put ( endpoint , parameters = { } )
38- headers , query , body = split_post_put_parameters ( parameters )
36+ def patch ( endpoint , body_parameters = { } , query_parameters = { } )
37+ perform_request :patch ,
38+ endpoint ,
39+ query_parameters : query_parameters ,
40+ body_parameters : body_parameters
41+ end
3942
43+ def put ( endpoint , body_parameters = { } , query_parameters = { } )
4044 perform_request :put ,
4145 endpoint ,
42- headers ,
43- params : query ,
44- body : body
46+ query_parameters : query_parameters ,
47+ body_parameters : body_parameters
4548 end
4649
47- def get ( endpoint , parameters = { } )
48- headers , query = extract_headers_and_query_from ( parameters )
49-
50+ def get ( endpoint , query_parameters = { } )
5051 perform_request :get ,
5152 endpoint ,
52- headers ,
53- params : query
53+ query_parameters : query_parameters
5454 end
5555
56- def delete ( endpoint , parameters = { } )
57- headers , query = extract_headers_and_query_from ( parameters )
58-
56+ def delete ( endpoint , query_parameters = { } )
5957 perform_request :delete ,
6058 endpoint ,
61- headers ,
62- params : query
59+ query_parameters : query_parameters
6360 end
6461
65- def perform_request ( method , endpoint , headers = { } , options = { } )
62+ def perform_request ( method , endpoint , query_parameters : nil , body_parameters : nil , additional_headers : { } )
6663 @configuration . validate!
6764 last_exception = nil
6865 @logger . debug "Performing #{ method . to_s . upcase } request: #{ endpoint } "
@@ -72,15 +69,23 @@ def perform_request(method, endpoint, headers = {}, options = {})
7269 @logger . debug "Attempting #{ method . to_s . upcase } request Try ##{ num_tries } to Node #{ node [ :index ] } "
7370
7471 begin
75- response = Typhoeus ::Request . new ( uri_for ( endpoint , node ) ,
76- {
77- method : method ,
78- headers : default_headers . merge ( headers ) ,
79- timeout : @connection_timeout_seconds
80- } . merge ( options ) ) . run
72+ request_options = {
73+ method : method ,
74+ timeout : @connection_timeout_seconds ,
75+ headers : default_headers . merge ( additional_headers )
76+ }
77+ request_options . merge! ( params : query_parameters ) unless query_parameters . nil?
78+
79+ unless body_parameters . nil?
80+ body = body_parameters
81+ body = Oj . dump ( body_parameters ) if request_options [ :headers ] [ 'Content-Type' ] == 'application/json'
82+ request_options . merge! ( body : body )
83+ end
84+
85+ response = Typhoeus ::Request . new ( uri_for ( endpoint , node ) , request_options ) . run
8186 set_node_healthcheck ( node , is_healthy : true ) if response . code >= 1 && response . code <= 499
8287
83- @logger . debug "Request to Node #{ node [ :index ] } was successfully made (at the network layer). Response Code was #{ response . code } ."
88+ @logger . debug "Request #{ method } : #{ uri_for ( endpoint , node ) } to Node #{ node [ :index ] } was successfully made (at the network layer). Response Code was #{ response . code } ."
8489
8590 parsed_response = if response . headers && ( response . headers [ 'content-type' ] || '' ) . include? ( 'application/json' )
8691 Oj . load ( response . body )
@@ -101,7 +106,7 @@ def perform_request(method, endpoint, headers = {}, options = {})
101106 # other languages that might not support the same construct.
102107 set_node_healthcheck ( node , is_healthy : false )
103108 last_exception = e
104- @logger . warn "Request to Node #{ node [ :index ] } failed due to \" #{ e . class } : #{ e . message } \" "
109+ @logger . warn "Request #{ method } : #{ uri_for ( endpoint , node ) } to Node #{ node [ :index ] } failed due to \" #{ e . class } : #{ e . message } \" "
105110 @logger . warn "Sleeping for #{ @retry_interval_seconds } s and then retrying request..."
106111 sleep @retry_interval_seconds
107112 end
@@ -112,43 +117,6 @@ def perform_request(method, endpoint, headers = {}, options = {})
112117
113118 private
114119
115- def split_post_put_parameters ( parameters )
116- if json_request? ( parameters )
117- headers = { 'Content-Type' => 'application/json' }
118- query = parameters [ :query ]
119- body = Oj . dump ( sanitize_parameters ( parameters ) )
120- else
121- headers = { }
122- query = parameters [ :query ]
123- body = parameters [ :body ]
124- end
125- [ headers , query , body ]
126- end
127-
128- def extract_headers_and_query_from ( parameters )
129- if json_request? ( parameters )
130- headers = { 'Content-Type' => 'application/json' }
131- query = sanitize_parameters ( parameters )
132- else
133- headers = { }
134- query = parameters [ :query ]
135- end
136- [ headers , query ]
137- end
138-
139- def json_request? ( parameters )
140- parameters [ :as_json ] . nil? ? true : parameters [ :as_json ]
141- end
142-
143- def sanitize_parameters ( parameters )
144- sanitized_parameters = parameters . dup
145- sanitized_parameters . delete ( :as_json )
146- sanitized_parameters . delete ( :body )
147- sanitized_parameters . delete ( :query )
148-
149- sanitized_parameters
150- end
151-
152120 def uri_for ( endpoint , node )
153121 "#{ node [ :protocol ] } ://#{ node [ :host ] } :#{ node [ :port ] } #{ endpoint } "
154122 end
@@ -231,6 +199,7 @@ def custom_exception_klass_for(response)
231199
232200 def default_headers
233201 {
202+ 'Content-Type' => 'application/json' ,
234203 API_KEY_HEADER_NAME . to_s => @api_key ,
235204 'User-Agent' => 'Typesense Ruby Client'
236205 }
0 commit comments