Class: Curl::WebMockCurlEasy

Inherits:
Easy
  • Object
show all
Defined in:
lib/webmock/http_lib_adapters/curb_adapter.rb

Instance Method Summary collapse

Instance Method Details

#basic_auth_headersObject



140
141
142
143
144
145
146
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 140

def basic_auth_headers
  if self.username
    {'Authorization' => WebMock::Util::Headers.basic_auth_header(self.username, self.password)}
  else
    {}
  end
end

#body_strObject Also known as: body



306
307
308
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 306

def body_str
  @body_str ||= super
end

#build_curb_response(webmock_response) ⇒ Object

Raises:

  • (Curl::Err::TimeoutError)


148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 148

def build_curb_response(webmock_response)
  raise Curl::Err::TimeoutError if webmock_response.should_timeout
  webmock_response.raise_error_if_any

  @body_str = webmock_response.body
  @response_code = webmock_response.status[0]

  @header_str = "HTTP/1.1 #{webmock_response.status[0]} #{webmock_response.status[1]}\r\n".dup

  @on_debug.call(@header_str, 1) if defined?( @on_debug )

  if webmock_response.headers
    @header_str << webmock_response.headers.map do |k,v|
      header = "#{k}: #{v.is_a?(Array) ? v.join(", ") : v}"
      @on_debug.call(header + "\r\n", 1) if defined?( @on_debug )
      header
    end.join("\r\n")
    @on_debug.call("\r\n", 1) if defined?( @on_debug )

    location = webmock_response.headers['Location']
    if self.follow_location? && location
      @last_effective_url = location
      webmock_follow_location(location)
    end

    @content_type = webmock_response.headers["Content-Type"]
    @transfer_encoding = webmock_response.headers["Transfer-Encoding"]
  end

  @last_effective_url ||= self.url
end

#build_request_signatureObject



81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 81

def build_request_signature
  method = @webmock_method.to_s.downcase.to_sym

  uri = WebMock::Util::URI.heuristic_parse(self.url)
  uri.path = uri.normalized_path.gsub("[^:]//","/")

  headers = headers_as_hash(self.headers).merge(basic_auth_headers)

  request_body = case method
  when :post, :patch
    self.post_body || @post_body
  when :put
    @put_data
  else
    nil
  end

  if defined?( @on_debug )
    @on_debug.call("Trying 127.0.0.1...\r\n", 0)
    @on_debug.call('Connected to ' + uri.hostname + "\r\n", 0)
    @debug_method = method.upcase
    @debug_path = uri.path
    @debug_host = uri.hostname
    http_request = ["#{@debug_method} #{@debug_path} HTTP/1.1"]
    http_request << "Host: #{uri.hostname}"
    headers.each do |name, value|
      http_request << "#{name}: #{value}"
    end
    @on_debug.call(http_request.join("\r\n") + "\r\n\r\n", 2)
    if request_body
      @on_debug.call(request_body + "\r\n", 4)
      @on_debug.call(
        "upload completely sent off: #{request_body.bytesize}"\
        " out of #{request_body.bytesize} bytes\r\n", 0
      )
    end
  end

  request_signature = WebMock::RequestSignature.new(
    method,
    uri.to_s,
    body: request_body,
    headers: headers
  )
  request_signature
end

#build_webmock_responseObject



219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 219

def build_webmock_response
  status, headers =
   WebMock::HttpLibAdapters::CurbAdapter.parse_header_string(self.header_str)

  if defined?( @on_debug )
    http_response = ["HTTP/1.0 #{@debug_method} #{@debug_path}"]
    headers.each do |name, value|
      http_response << "#{name}: #{value}"
    end
    http_response << self.body_str
    @on_debug.call(http_response.join("\r\n") + "\r\n", 3)
    @on_debug.call("Connection #0 to host #{@debug_host} left intact\r\n", 0)
  end

  webmock_response = WebMock::Response.new
  webmock_response.status = [self.response_code, status]
  webmock_response.body = self.body_str
  webmock_response.headers = headers
  webmock_response
end

#chunked_response?Boolean

Returns:

  • (Boolean)


215
216
217
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 215

def chunked_response?
  defined?( @transfer_encoding ) && @transfer_encoding == 'chunked' && self.body_str.respond_to?(:each)
end

#content_typeObject



324
325
326
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 324

def content_type
  @content_type ||= super
end

#curb_or_webmockObject



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 57

def curb_or_webmock
  request_signature = build_request_signature
  WebMock::RequestRegistry.instance.requested_signatures.put(request_signature)

  if webmock_response = WebMock::StubRegistry.instance.response_for_request(request_signature)
    build_curb_response(webmock_response)
    WebMock::CallbackRegistry.invoke_callbacks(
      {lib: :curb}, request_signature, webmock_response)
    invoke_curb_callbacks
    true
  elsif WebMock.net_connect_allowed?(request_signature.uri)
    res = yield
    if WebMock::CallbackRegistry.any_callbacks?
      webmock_response = build_webmock_response
      WebMock::CallbackRegistry.invoke_callbacks(
        {lib: :curb, real_request: true}, request_signature,
          webmock_response)
    end
    res
  else
    raise WebMock::NetConnectNotAllowedError.new(request_signature)
  end
end

#delete=(value) ⇒ Object



288
289
290
291
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 288

def delete= value
  @webmock_method = :delete if value
  super
end

#head=(value) ⇒ Object



293
294
295
296
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 293

def head= value
  @webmock_method = :head if value
  super
end

#header_strObject Also known as: head



315
316
317
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 315

def header_str
  @header_str ||= super
end

#headers_as_hash(headers) ⇒ Object



128
129
130
131
132
133
134
135
136
137
138
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 128

def headers_as_hash(headers)
  if headers.is_a?(Array)
    headers.inject({}) {|hash, header|
      name, value = header.split(":", 2).map(&:strip)
      hash[name] = value
      hash
    }
  else
    headers
  end
end

#http(method) ⇒ Object

Mocks of Curl::Easy methods below here.



244
245
246
247
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 244

def http(method)
  @webmock_method = method
  super
end

#http_post(*data) ⇒ Object Also known as: post



263
264
265
266
267
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 263

def http_post *data
  @webmock_method = :post
  @post_body = data.join('&') if data && !data.empty?
  super
end

#http_put(data = nil) ⇒ Object Also known as: put



256
257
258
259
260
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 256

def http_put data = nil
  @webmock_method = :put
  @put_data = data if data
  super
end

#invoke_curb_callbacksObject



191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 191

def invoke_curb_callbacks
  @on_progress.call(0.0,1.0,0.0,1.0) if defined?( @on_progress )
  self.header_str.lines.each { |header_line| @on_header.call header_line } if defined?( @on_header )
  if defined?( @on_body )
    if chunked_response?
      self.body_str.each do |chunk|
        @on_body.call(chunk)
      end
    else
      @on_body.call(self.body_str)
    end
  end
  @on_complete.call(self) if defined?( @on_complete )

  case response_code
  when 200..299
    @on_success.call(self) if defined?( @on_success )
  when 400..499
    @on_missing.call(self, self.response_code) if defined?( @on_missing )
  when 500..599
    @on_failure.call(self, self.response_code) if defined?( @on_failure )
  end
end

#last_effective_urlObject



320
321
322
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 320

def last_effective_url
  @last_effective_url ||= super
end

#performObject



270
271
272
273
274
275
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 270

def perform
  @webmock_method ||= :get
  curb_or_webmock { super }
ensure
  reset_webmock_method
end

#post_body=(data) ⇒ Object



283
284
285
286
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 283

def post_body= data
  @webmock_method = :post
  super
end

#put_data=(data) ⇒ Object



277
278
279
280
281
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 277

def put_data= data
  @webmock_method = :put
  @put_data = data
  super
end

#resetObject



341
342
343
344
345
346
347
348
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 341

def reset
  instance_variable_set(:@body_str, nil)
  instance_variable_set(:@content_type, nil)
  instance_variable_set(:@header_str, nil)
  instance_variable_set(:@last_effective_url, nil)
  instance_variable_set(:@response_code, nil)
  super
end

#reset_webmock_methodObject



337
338
339
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 337

def reset_webmock_method
  @webmock_method = :get
end

#response_codeObject



311
312
313
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 311

def response_code
  @response_code ||= super
end

#verbose=(verbose) ⇒ Object



298
299
300
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 298

def verbose=(verbose)
  @verbose = verbose
end

#verbose?Boolean

Returns:

  • (Boolean)


302
303
304
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 302

def verbose?
  @verbose ||= false
end

#webmock_follow_location(location) ⇒ Object



180
181
182
183
184
185
186
187
188
189
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 180

def webmock_follow_location(location)
  first_url = self.url
  self.url = location

  curb_or_webmock do
    send( :http, {'method' => @webmock_method} )
  end

  self.url = first_url
end