Class: BrowserMob::Proxy::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/browsermob/proxy/client.rb

Constant Summary collapse

TIMEOUTS =
{
  request: :requestTimeout,
  read: :readTimeout,
  connection: :connectionTimeout,
  dns_cache: :dnsCacheTimeout
}
LIMITS =
{
  :upstream_kbps   => 'upstreamKbps',
  :downstream_kbps => 'downstreamKbps',
  :latency         => 'latency'
}

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(resource, host, port) ⇒ Client

Returns a new instance of Client.



22
23
24
25
26
# File 'lib/browsermob/proxy/client.rb', line 22

def initialize(resource, host, port)
  @resource = resource
  @host = host
  @port = port
end

Instance Attribute Details

#hostObject (readonly)

Returns the value of attribute host.



5
6
7
# File 'lib/browsermob/proxy/client.rb', line 5

def host
  @host
end

#portObject (readonly)

Returns the value of attribute port.



5
6
7
# File 'lib/browsermob/proxy/client.rb', line 5

def port
  @port
end

Class Method Details

.from(server_url) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/browsermob/proxy/client.rb', line 7

def self.from(server_url)
  # ActiveSupport may define Object#load, so we can't use MultiJson.respond_to? here.
  sm = MultiJson.singleton_methods.map { |e| e.to_sym }
  decode_method = sm.include?(:load) ? :load : :decode

  port = MultiJson.send(decode_method,
    RestClient.post(URI.join(server_url, "proxy").to_s, '')
  ).fetch('port')

  uri = URI.parse(File.join(server_url, "proxy", port.to_s))
  resource = RestClient::Resource.new(uri.to_s)

  Client.new resource, uri.host, port
end

Instance Method Details

#basic_authentication(domain, username, password) ⇒ Object



122
123
124
125
# File 'lib/browsermob/proxy/client.rb', line 122

def basic_authentication(domain, username, password)
  data = { username: username, password: password }
  @resource["auth/basic/#{domain}"].post data.to_json, :content_type => "application/json"
end

#blacklist(regexp, status_code) ⇒ Object



99
100
101
102
# File 'lib/browsermob/proxy/client.rb', line 99

def blacklist(regexp, status_code)
  regex = Regexp === regexp ? regexp.source : regexp.to_s
  @resource['blacklist'].put :regex => regex, :status => status_code
end

#clear_blacklistObject



104
105
106
# File 'lib/browsermob/proxy/client.rb', line 104

def clear_blacklist
  @resource['blacklist'].delete
end

#clear_rewritesObject



113
114
115
# File 'lib/browsermob/proxy/client.rb', line 113

def clear_rewrites
  @resource['rewrite'].delete
end

#clear_whitelistObject



95
96
97
# File 'lib/browsermob/proxy/client.rb', line 95

def clear_whitelist
  @resource['whitelist'].delete
end

#closeObject



198
199
200
# File 'lib/browsermob/proxy/client.rb', line 198

def close
  @resource.delete
end

#harObject



62
63
64
# File 'lib/browsermob/proxy/client.rb', line 62

def har
  HAR::Archive.from_string @resource["har"].get
end

#header(hash) ⇒ Object Also known as: headers



117
118
119
# File 'lib/browsermob/proxy/client.rb', line 117

def header(hash)
  @resource['headers'].post hash.to_json, :content_type => "application/json"
end

#limit(opts) ⇒ Object



180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
# File 'lib/browsermob/proxy/client.rb', line 180

def limit(opts)
  params = {}

  opts.each do |key, value|
    unless LIMITS.member?(key)
      raise ArgumentError, "invalid: #{key.inspect} (valid options: #{LIMITS.keys.inspect})"
    end

    params[LIMITS[key]] = Integer(value)
  end

  if params.empty?
    raise ArgumentError, "must specify one of #{LIMITS.keys.inspect}"
  end

  @resource['limit'].put params
end

#new_har(ref = nil, opts = {}) ⇒ Object

Examples:

client.new_har("page-name")
client.new_har("page-name", :capture_headers => true)
client.new_har(:capture_headers => true)
client.new_har(:capture_content => true)
client.new_har(:capture_binary_content => true)


37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/browsermob/proxy/client.rb', line 37

def new_har(ref = nil, opts = {})
  if opts.empty? && ref.kind_of?(Hash)
    opts = ref
    ref = nil
  end

  params = {}

  params[:initialPageRef] = ref if ref
  params[:captureHeaders] = true if opts[:capture_headers]
  params[:captureContent] = true if opts[:capture_content]

  if opts[:capture_binary_content]
    params[:captureContent] = true
    params[:captureBinaryContent] = true
  end

  previous = @resource["har"].put params
  HAR::Archive.from_string(previous) unless previous.empty?
end

#new_page(ref) ⇒ Object



58
59
60
# File 'lib/browsermob/proxy/client.rb', line 58

def new_page(ref)
  @resource['har/pageRef'].put :pageRef => ref
end

#remap_dns_hosts(hash) ⇒ Object

Override normal DNS lookups (remap the given hosts with the associated IP address).

Each invocation of the method will add given hosts to existing BrowserMob’s DNS cache instead of overriding it.

Examples:

remap_dns_hosts('example.com' => '1.2.3.4')

Parameters:

  • hash (Hash)

    a hash with domains as keys and IPs as values



170
171
172
# File 'lib/browsermob/proxy/client.rb', line 170

def remap_dns_hosts(hash)
  @resource['hosts'].post hash.to_json, :content_type => 'application/json'
end

#rewrite(match_regex, replace) ⇒ Object



108
109
110
111
# File 'lib/browsermob/proxy/client.rb', line 108

def rewrite(match_regex, replace)
  regex = Regexp === match_regex ? match_regex.source : match_regex.to_s
  @resource['rewrite'].put :matchRegex => regex, :replace => replace
end

#selenium_proxy(*protocols) ⇒ Object



66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/browsermob/proxy/client.rb', line 66

def selenium_proxy(*protocols)
  require 'selenium-webdriver' unless defined?(Selenium)

  protocols += [:http] if protocols.empty?
  unless (protocols - [:http, :ssl, :ftp]).empty?
    raise "Invalid protocol specified.  Must be one of: :http, :ssl, or :ftp."
  end

  proxy_mapping = {}
  protocols.each { |proto| proxy_mapping[proto] = "#{@host}:#{@port}" }
  Selenium::WebDriver::Proxy.new(proxy_mapping)
end

#timeouts(timeouts = {}) ⇒ Object

Specify timeouts that will be used by a proxy (see README of browsermob-proxy itself for more info about what they mean)

Parameters:

  • timeouts (Hash) (defaults to: {})

    options that specify desired timeouts (in seconds)

Options Hash (timeouts):

  • :request (Numeric)

    request timeout

  • :read (Numeric)

    read timeout

  • :connection (Numeric)

    connection timeout

  • :dns_cache (Numeric)

    dns cache timeout



145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/browsermob/proxy/client.rb', line 145

def timeouts(timeouts = {})
  params = {}

  timeouts.each do |key, value|
    unless TIMEOUTS.member?(key)
      raise ArgumentError, "invalid key: #{key.inspect}, should belong to: #{TIMEOUTS.keys.inspect}"
    end

    params[TIMEOUTS[key]] = (value * 1000).to_i
  end

  @resource['timeout'].put params
end

#whitelist(regexp, status_code) ⇒ Object

Set a list of URL regexes to whitelist

Note that passed regexp/string should match string as a whole (i.e. if /example.com/ is whitelisted “www.example.com” won’t be allowed though if /.+example.com“ is whitelisted ”www.example.com“ will be allowed)

Parameters:

  • regexp (Regexp, String, Array<String, Regexp>)

    a regexp, string or an array of regexps/strings that urls should match to

  • status_code (Integer)

    the HTTP status code to return for URLs that do not match the whitelist



90
91
92
93
# File 'lib/browsermob/proxy/client.rb', line 90

def whitelist(regexp, status_code)
  regex = Array(regexp).map { |rx| Regexp === rx ? rx.source : rx.to_s }.join(',')
  @resource['whitelist'].put :regex => regex, :status => status_code
end