Module: FakeWeb::Utility

Defined in:
lib/fake_web/utility.rb

Overview

:nodoc:

Class Method Summary collapse

Class Method Details

.decode_userinfo_from_header(header) ⇒ Object



4
5
6
# File 'lib/fake_web/utility.rb', line 4

def self.decode_userinfo_from_header(header)
  header.sub(/^Basic /, "").unpack("m").first
end

.encode_unsafe_chars_in_userinfo(userinfo) ⇒ Object



8
9
10
11
# File 'lib/fake_web/utility.rb', line 8

def self.encode_unsafe_chars_in_userinfo(userinfo)
  unsafe_in_userinfo = /[^#{URI::REGEXP::PATTERN::UNRESERVED};&=+$,]|^(#{URI::REGEXP::PATTERN::ESCAPED})/
  userinfo.split(":").map { |part| uri_escape(part, unsafe_in_userinfo) }.join(":")
end

.io_from_fake_response_object(obj) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/fake_web/utility.rb', line 49

def self.io_from_fake_response_object(obj)
  case obj
  when Socket, OpenSSL::SSL::SSLSocket, StringIO, IO
    obj  # usable as-is
  when String
    if !obj.include?("\0") && File.exist?(obj) && !File.directory?(obj)
      File.open(obj, "r")
    else
      StringIO.new(obj)
    end
  else
    raise ArgumentError, "Unable to create fake socket from #{obj}"
  end
end

.produce_side_effects_of_net_http_request(request, body) ⇒ Object



44
45
46
47
# File 'lib/fake_web/utility.rb', line 44

def self.produce_side_effects_of_net_http_request(request, body)
  request.set_body_internal(body)
  request.content_length = request.body.length unless request.body.nil?
end

.puts_warning_for_net_http_around_advice_libs_if_neededObject



64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/fake_web/utility.rb', line 64

def self.puts_warning_for_net_http_around_advice_libs_if_needed
  libs = {"Samuel" => defined?(Samuel)}
  warnings = libs.select { |_, loaded| loaded }.map do |name, _|
    <<-TEXT.gsub(/ {10}/, '')
      \e[1mWarning: FakeWeb was loaded after #{name}\e[0m
      * #{name}'s code is being ignored when a request is handled by FakeWeb,
        because both libraries work by patching Net::HTTP.
      * To fix this, just reorder your requires so that FakeWeb is before #{name}.
    TEXT
  end
  $stderr.puts "\n" + warnings.join("\n") + "\n" if warnings.any?
end

.puts_warning_for_net_http_replacement_libs_if_neededObject



82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/fake_web/utility.rb', line 82

def self.puts_warning_for_net_http_replacement_libs_if_needed
  libs = {"RightHttpConnection" => defined?(RightHttpConnection)}
  warnings = libs.select { |_, loaded| loaded }.
                reject { |name, _| @loaded_net_http_replacement_libs.include?(name) }.
                map do |name, _|
    <<-TEXT.gsub(/ {10}/, '')
      \e[1mWarning: #{name} was loaded after FakeWeb\e[0m
      * FakeWeb's code is being ignored, because #{name} replaces parts of
        Net::HTTP without deferring to other libraries. This will break Net::HTTP requests.
      * To fix this, just reorder your requires so that #{name} is before FakeWeb.
    TEXT
  end
  $stderr.puts "\n" + warnings.join("\n") + "\n" if warnings.any?
end

.record_loaded_net_http_replacement_libsObject



77
78
79
80
# File 'lib/fake_web/utility.rb', line 77

def self.record_loaded_net_http_replacement_libs
  libs = {"RightHttpConnection" => defined?(RightHttpConnection)}
  @loaded_net_http_replacement_libs = libs.map { |name, loaded| name if loaded }.compact
end

.request_uri_as_string(net_http, request) ⇒ Object

Returns a string with a normalized version of a Net::HTTP request’s URI.



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/fake_web/utility.rb', line 22

def self.request_uri_as_string(net_http, request)
  protocol = net_http.use_ssl? ? "https" : "http"

  path = request.path
  path = URI.parse(request.path).request_uri if request.path =~ /^http/

  if request["authorization"] =~ /^Basic /
    userinfo = FakeWeb::Utility.decode_userinfo_from_header(request["authorization"])
    userinfo = FakeWeb::Utility.encode_unsafe_chars_in_userinfo(userinfo) + "@"
  else
    userinfo = ""
  end

  "#{protocol}://#{userinfo}#{net_http.address}:#{net_http.port}#{path}"
end

.strip_default_port_from_uri(uri) ⇒ Object



13
14
15
16
17
18
19
# File 'lib/fake_web/utility.rb', line 13

def self.strip_default_port_from_uri(uri)
  case uri
  when %r{^http://}  then uri.sub(%r{:80(/|$)}, '\1')
  when %r{^https://} then uri.sub(%r{:443(/|$)}, '\1')
  else uri
  end
end

.uri_escape(*args) ⇒ Object

Wrapper that falls back to URI.escape for compatibility with 1.8



39
40
41
42
# File 'lib/fake_web/utility.rb', line 39

def self.uri_escape(*args)
  houdini = URI.const_defined?(:Parser) ? URI::Parser.new : URI
  houdini.escape(*args)
end