Class: BrowserMob::Proxy::Client

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

Constant Summary collapse

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



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

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



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

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

#closeObject



142
143
144
# File 'lib/browsermob/proxy/client.rb', line 142

def close
  @resource.delete
end

#harObject



56
57
58
# File 'lib/browsermob/proxy/client.rb', line 56

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

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



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

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

#limit(opts) ⇒ Object



124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/browsermob/proxy/client.rb', line 124

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)


36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/browsermob/proxy/client.rb', line 36

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]


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

#new_page(ref) ⇒ Object



52
53
54
# File 'lib/browsermob/proxy/client.rb', line 52

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



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

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

#selenium_proxy(*protocols) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/browsermob/proxy/client.rb', line 60

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

#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



84
85
86
87
# File 'lib/browsermob/proxy/client.rb', line 84

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