Class: Requests::Session
- Inherits:
-
Object
- Object
- Requests::Session
- Defined in:
- lib/requests/sessions.rb
Instance Attribute Summary collapse
-
#auth ⇒ Object
Returns the value of attribute auth.
-
#backoff_factor ⇒ Object
Returns the value of attribute backoff_factor.
-
#cert ⇒ Object
Returns the value of attribute cert.
-
#cookies ⇒ Object
Returns the value of attribute cookies.
-
#headers ⇒ Object
Returns the value of attribute headers.
-
#max_redirects ⇒ Object
Returns the value of attribute max_redirects.
-
#params ⇒ Object
Returns the value of attribute params.
-
#proxies ⇒ Object
Returns the value of attribute proxies.
-
#retries ⇒ Object
Returns the value of attribute retries.
-
#status_forcelist ⇒ Object
Returns the value of attribute status_forcelist.
-
#timeout ⇒ Object
Returns the value of attribute timeout.
-
#verify ⇒ Object
Returns the value of attribute verify.
Instance Method Summary collapse
- #close ⇒ Object
- #delete(url, **kw) ⇒ Object
- #delete!(url, **kw) ⇒ Object
- #download(url, to:, chunk_size: 65536, resume: false, progress: nil, headers: nil, params: nil, timeout: nil, proxies: nil, verify: nil, cert: nil, auth: nil) ⇒ Object
- #get(url, **kw) ⇒ Object
- #get!(url, **kw) ⇒ Object
- #head(url, **kw) ⇒ Object
- #hooks ⇒ Object
-
#initialize ⇒ Session
constructor
A new instance of Session.
- #mount(prefix, adapter) ⇒ Object
- #options(url, **kw) ⇒ Object
- #patch(url, **kw) ⇒ Object
- #patch!(url, **kw) ⇒ Object
- #post(url, **kw) ⇒ Object
- #post!(url, **kw) ⇒ Object
- #put(url, **kw) ⇒ Object
- #put!(url, **kw) ⇒ Object
- #request(method, url, params: nil, data: nil, json: nil, headers: nil, cookies: nil, files: nil, auth: nil, timeout: nil, allow_redirects: true, proxies: nil, verify: nil, stream: false, cert: nil, hooks: nil, retries: nil) ⇒ Object
Constructor Details
#initialize ⇒ Session
Returns a new instance of Session.
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# File 'lib/requests/sessions.rb', line 10 def initialize @headers = Requests::Utils.default_headers @cookies = Jar.new @auth = nil @params = nil @proxies = {} @verify = true @cert = nil @max_redirects = 30 @timeout = nil @retries = 0 @backoff_factor = 0 @status_forcelist = [] @hooks = { response: [] } @adapters = { 'https://' => HTTPAdapter.new, 'http://' => HTTPAdapter.new } @default_adapters = @adapters.values.dup end |
Instance Attribute Details
#auth ⇒ Object
Returns the value of attribute auth.
8 9 10 |
# File 'lib/requests/sessions.rb', line 8 def auth @auth end |
#backoff_factor ⇒ Object
Returns the value of attribute backoff_factor.
8 9 10 |
# File 'lib/requests/sessions.rb', line 8 def backoff_factor @backoff_factor end |
#cert ⇒ Object
Returns the value of attribute cert.
8 9 10 |
# File 'lib/requests/sessions.rb', line 8 def cert @cert end |
#cookies ⇒ Object
Returns the value of attribute cookies.
8 9 10 |
# File 'lib/requests/sessions.rb', line 8 def @cookies end |
#headers ⇒ Object
Returns the value of attribute headers.
8 9 10 |
# File 'lib/requests/sessions.rb', line 8 def headers @headers end |
#max_redirects ⇒ Object
Returns the value of attribute max_redirects.
8 9 10 |
# File 'lib/requests/sessions.rb', line 8 def max_redirects @max_redirects end |
#params ⇒ Object
Returns the value of attribute params.
8 9 10 |
# File 'lib/requests/sessions.rb', line 8 def params @params end |
#proxies ⇒ Object
Returns the value of attribute proxies.
8 9 10 |
# File 'lib/requests/sessions.rb', line 8 def proxies @proxies end |
#retries ⇒ Object
Returns the value of attribute retries.
8 9 10 |
# File 'lib/requests/sessions.rb', line 8 def retries @retries end |
#status_forcelist ⇒ Object
Returns the value of attribute status_forcelist.
8 9 10 |
# File 'lib/requests/sessions.rb', line 8 def status_forcelist @status_forcelist end |
#timeout ⇒ Object
Returns the value of attribute timeout.
8 9 10 |
# File 'lib/requests/sessions.rb', line 8 def timeout @timeout end |
#verify ⇒ Object
Returns the value of attribute verify.
8 9 10 |
# File 'lib/requests/sessions.rb', line 8 def verify @verify end |
Instance Method Details
#close ⇒ Object
49 50 51 52 |
# File 'lib/requests/sessions.rb', line 49 def close @adapters.values.uniq.each { |a| a.close_pool if a.respond_to?(:close_pool) } true end |
#delete(url, **kw) ⇒ Object
38 |
# File 'lib/requests/sessions.rb', line 38 def delete(url, **kw); request('DELETE', url, **kw); end |
#delete!(url, **kw) ⇒ Object
48 |
# File 'lib/requests/sessions.rb', line 48 def delete!(url, **kw); delete(url, **kw).raise_for_status; end |
#download(url, to:, chunk_size: 65536, resume: false, progress: nil, headers: nil, params: nil, timeout: nil, proxies: nil, verify: nil, cert: nil, auth: nil) ⇒ Object
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/requests/sessions.rb', line 53 def download(url, to:, chunk_size: 65536, resume: false, progress: nil, headers: nil, params: nil, timeout: nil, proxies: nil, verify: nil, cert: nil, auth: nil) validate_url!(url) full_url = build_url(url, merge_hash(@params, params)) hdrs = CIHash.new(@headers.to_h) hdrs.merge!(headers) mode = 'wb' if resume && File.exist?(to) && File.size(to) > 0 hdrs['Range'] = "bytes=#{File.size(to)}-" mode = 'ab' end adapter = adapter_for(full_url) adapter.max_retries = @retries adapter.backoff_factor = @backoff_factor use_auth = auth || @auth use_auth.call(hdrs) if use_auth.respond_to?(:call) && !use_auth.is_a?(DigestAuth) File.open(to, mode) do |f| net_resp = adapter.stream_to('GET', full_url, hdrs, nil, timeout || @timeout, proxies || @proxies, verify.nil? ? @verify : verify, cert || @cert, nil, f, chunk_size: chunk_size, progress: progress) unless [200, 206].include?(net_resp.code.to_i) raise Requests::HTTPError, "download failed: #{net_resp.code} for #{full_url}" end end to end |
#get(url, **kw) ⇒ Object
34 |
# File 'lib/requests/sessions.rb', line 34 def get(url, **kw); request('GET', url, **kw); end |
#get!(url, **kw) ⇒ Object
44 |
# File 'lib/requests/sessions.rb', line 44 def get!(url, **kw); get(url, **kw).raise_for_status; end |
#head(url, **kw) ⇒ Object
40 41 42 43 |
# File 'lib/requests/sessions.rb', line 40 def head(url, **kw) kw[:allow_redirects] = kw.fetch(:allow_redirects, false) request('HEAD', url, **kw) end |
#hooks ⇒ Object
27 28 29 |
# File 'lib/requests/sessions.rb', line 27 def hooks @hooks end |
#mount(prefix, adapter) ⇒ Object
30 31 32 33 |
# File 'lib/requests/sessions.rb', line 30 def mount(prefix, adapter) @adapters[prefix] = adapter self end |
#options(url, **kw) ⇒ Object
39 |
# File 'lib/requests/sessions.rb', line 39 def (url, **kw); request('OPTIONS', url, **kw); end |
#patch(url, **kw) ⇒ Object
37 |
# File 'lib/requests/sessions.rb', line 37 def patch(url, **kw); request('PATCH', url, **kw); end |
#patch!(url, **kw) ⇒ Object
47 |
# File 'lib/requests/sessions.rb', line 47 def patch!(url, **kw); patch(url, **kw).raise_for_status; end |
#post(url, **kw) ⇒ Object
35 |
# File 'lib/requests/sessions.rb', line 35 def post(url, **kw); request('POST', url, **kw); end |
#post!(url, **kw) ⇒ Object
45 |
# File 'lib/requests/sessions.rb', line 45 def post!(url, **kw); post(url, **kw).raise_for_status; end |
#put(url, **kw) ⇒ Object
36 |
# File 'lib/requests/sessions.rb', line 36 def put(url, **kw); request('PUT', url, **kw); end |
#put!(url, **kw) ⇒ Object
46 |
# File 'lib/requests/sessions.rb', line 46 def put!(url, **kw); put(url, **kw).raise_for_status; end |
#request(method, url, params: nil, data: nil, json: nil, headers: nil, cookies: nil, files: nil, auth: nil, timeout: nil, allow_redirects: true, proxies: nil, verify: nil, stream: false, cert: nil, hooks: nil, retries: nil) ⇒ Object
79 80 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 127 128 129 130 131 132 133 134 |
# File 'lib/requests/sessions.rb', line 79 def request(method, url, params: nil, data: nil, json: nil, headers: nil, cookies: nil, files: nil, auth: nil, timeout: nil, allow_redirects: true, proxies: nil, verify: nil, stream: false, cert: nil, hooks: nil, retries: nil) validate_url!(url) use_auth = auth || @auth merged_params = merge_hash(@params, params) original_url = build_url(url, merged_params) original_host = URI.parse(original_url).host cur_url = original_url cur_method = method.to_s.upcase hist = [] redirs = 0 body, content_type = build_body(data: data, json: json, files: files) loop do hdrs = CIHash.new(@headers.to_h) hdrs.merge!(headers) hdrs['Content-Type'] = content_type if content_type && !hdrs.key?('content-type') hdrs.delete('Authorization') if redirs > 0 && URI.parse(cur_url).host != original_host ck = @cookies.to_header(cur_url) ck = [ck, .map { |k, v| "#{k}=#{v}" }.join('; ')].reject { |x| x.nil? || x.empty? }.join('; ') if hdrs['Cookie'] = ck unless ck.empty? adapter = adapter_for(cur_url) adapter.max_retries = retries unless retries.nil? adapter.max_retries = @retries if @retries.to_i > 0 && retries.nil? && default_adapter?(adapter) adapter.backoff_factor = @backoff_factor if @backoff_factor.to_f > 0 && default_adapter?(adapter) adapter.status_forcelist = @status_forcelist if !@status_forcelist.empty? && adapter.respond_to?(:status_forcelist=) && default_adapter?(adapter) t0 = Time.now net_resp = adapter.send_once(cur_method, cur_url, hdrs, body, timeout || @timeout,proxies || @proxies, verify.nil? ? @verify : verify,cert || @cert, use_auth) elapsed = Time.now - t0 resp = to_response(adapter, net_resp, cur_url, elapsed, cur_method, hdrs, body) @cookies.update(net_resp, cur_url) resp. = @cookies if use_auth.is_a?(DigestAuth) && resp.status_code == 401 && redirs.zero? && hist.empty? use_auth.call(hdrs, meth: cur_method, url: cur_url, prev_resp: resp) t1 = Time.now net_resp = adapter.send_once(cur_method, cur_url, hdrs, body, timeout || @timeout,proxies || @proxies, verify.nil? ? @verify : verify,cert || @cert, nil) resp = to_response(adapter, net_resp, cur_url, Time.now - t1, cur_method, hdrs, body) @cookies.update(net_resp, cur_url) resp. = @cookies end hist << resp if allow_redirects && resp.redirect? && resp.headers['location'] redirs += 1 raise Requests::TooManyRedirects, "too many redirects: #{url}" if redirs > @max_redirects cur_url = URI.join(cur_url, resp.headers['location']).to_s if resp.status_code == 303 || ([301, 302].include?(resp.status_code) && cur_method == 'POST') cur_method = 'GET' body = nil end next end resp.history = hist[0..-2] run_hooks(resp, hooks) return resp end end |