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



106
107
108
109
110
111
112
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 106

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



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

def body_str
  @body_str ||= super
end

#build_curb_response(webmock_response) ⇒ Object

Raises:

  • (Curl::Err::TimeoutError)


114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 114

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"
  if webmock_response.headers
    @header_str << webmock_response.headers.map do |k,v|
      "#{k}: #{v.is_a?(Array) ? v.join(", ") : v}"
    end.join("\r\n")

    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



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 82

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("[^:]//","/")

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

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

#build_webmock_responseObject



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

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

  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)


175
176
177
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 175

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

#content_typeObject



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

def content_type
  @content_type ||= super
end

#curb_or_webmockObject



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

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



236
237
238
239
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 236

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

#head=(value) ⇒ Object



241
242
243
244
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 241

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

#header_strObject Also known as: head



255
256
257
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 255

def header_str
  @header_str ||= super
end

#http(method) ⇒ Object

Mocks of Curl::Easy methods below here.



194
195
196
197
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 194

def http(method)
  @webmock_method = method
  super
end

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



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

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



206
207
208
209
210
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 206

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

#invoke_curb_callbacksObject



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

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



260
261
262
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 260

def last_effective_url
  @last_effective_url ||= super
end

#performObject



220
221
222
223
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 220

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

#post_body=(data) ⇒ Object



231
232
233
234
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 231

def post_body= data
  @webmock_method = :post
  super
end

#put_data=(data) ⇒ Object



225
226
227
228
229
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 225

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

#response_codeObject



251
252
253
# File 'lib/webmock/http_lib_adapters/curb_adapter.rb', line 251

def response_code
  @response_code ||= super
end

#webmock_follow_location(location) ⇒ Object



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

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

  curb_or_webmock do
    send( "http_#{@webmock_method}_without_webmock" )
  end

  self.url = first_url
end