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.
-
#trust_env ⇒ Object
Returns the value of attribute trust_env.
-
#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, http2: nil) ⇒ Object
- #get(url, **kw) ⇒ Object
- #get!(url, **kw) ⇒ Object
- #head(url, **kw) ⇒ Object
- #head!(url, **kw) ⇒ Object
- #hooks ⇒ Object
- #http2! ⇒ Object
-
#initialize(http2: false) ⇒ Session
constructor
A new instance of Session.
- #mount(prefix, adapter) ⇒ Object
- #options(url, **kw) ⇒ 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, http2: nil) ⇒ Object
Constructor Details
#initialize(http2: false) ⇒ Session
Returns a new instance of Session.
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# File 'lib/requests/sessions.rb', line 10 def initialize(http2: false) @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 = [] @trust_env = true @hooks = { response: [] } @adapters = { 'https://' => http2 ? Http2Adapter.new : HTTPAdapter.new, 'http://' => HTTPAdapter.new } @default_adapters = @adapters.values.dup @http2_adapter = http2 ? @adapters['https://'] : nil 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 |
#trust_env ⇒ Object
Returns the value of attribute trust_env.
8 9 10 |
# File 'lib/requests/sessions.rb', line 8 def trust_env @trust_env 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
59 60 61 62 |
# File 'lib/requests/sessions.rb', line 59 def close @adapters.values.uniq.each { |a| a.close_pool if a.respond_to?(:close_pool) } true end |
#delete(url, **kw) ⇒ Object
46 |
# File 'lib/requests/sessions.rb', line 46 def delete(url, **kw); request('DELETE', url, **kw); end |
#delete!(url, **kw) ⇒ Object
56 |
# File 'lib/requests/sessions.rb', line 56 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, http2: nil) ⇒ Object
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'lib/requests/sessions.rb', line 63 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, http2: 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 = pick_adapter(full_url, http2) 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, effective_proxies(full_url, 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
42 |
# File 'lib/requests/sessions.rb', line 42 def get(url, **kw); request('GET', url, **kw); end |
#get!(url, **kw) ⇒ Object
52 |
# File 'lib/requests/sessions.rb', line 52 def get!(url, **kw); get(url, **kw).raise_for_status; end |
#head(url, **kw) ⇒ Object
48 49 50 51 |
# File 'lib/requests/sessions.rb', line 48 def head(url, **kw) kw[:allow_redirects] = kw.fetch(:allow_redirects, false) request('HEAD', url, **kw) end |
#head!(url, **kw) ⇒ Object
57 |
# File 'lib/requests/sessions.rb', line 57 def head!(url, **kw); head(url, **kw).raise_for_status; end |
#hooks ⇒ Object
29 30 31 |
# File 'lib/requests/sessions.rb', line 29 def hooks @hooks end |
#http2! ⇒ Object
36 37 38 39 40 41 |
# File 'lib/requests/sessions.rb', line 36 def http2! @http2_adapter ||= Http2Adapter.new @adapters['https://'] = @http2_adapter @default_adapters = @adapters.values.dup self end |
#mount(prefix, adapter) ⇒ Object
32 33 34 35 |
# File 'lib/requests/sessions.rb', line 32 def mount(prefix, adapter) @adapters[prefix] = adapter self end |
#options(url, **kw) ⇒ Object
47 |
# File 'lib/requests/sessions.rb', line 47 def (url, **kw); request('OPTIONS', url, **kw); end |
#options!(url, **kw) ⇒ Object
58 |
# File 'lib/requests/sessions.rb', line 58 def (url, **kw); (url, **kw).raise_for_status; end |
#patch(url, **kw) ⇒ Object
45 |
# File 'lib/requests/sessions.rb', line 45 def patch(url, **kw); request('PATCH', url, **kw); end |
#patch!(url, **kw) ⇒ Object
55 |
# File 'lib/requests/sessions.rb', line 55 def patch!(url, **kw); patch(url, **kw).raise_for_status; end |
#post(url, **kw) ⇒ Object
43 |
# File 'lib/requests/sessions.rb', line 43 def post(url, **kw); request('POST', url, **kw); end |
#post!(url, **kw) ⇒ Object
53 |
# File 'lib/requests/sessions.rb', line 53 def post!(url, **kw); post(url, **kw).raise_for_status; end |
#put(url, **kw) ⇒ Object
44 |
# File 'lib/requests/sessions.rb', line 44 def put(url, **kw); request('PUT', url, **kw); end |
#put!(url, **kw) ⇒ Object
54 |
# File 'lib/requests/sessions.rb', line 54 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, http2: nil) ⇒ Object
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 135 136 137 138 139 140 141 142 143 144 145 |
# File 'lib/requests/sessions.rb', line 89 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, http2: 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 = pick_adapter(cur_url, http2) 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) eff_proxies = effective_proxies(cur_url, proxies) t0 = Time.now net_resp = adapter.send_once(cur_method, cur_url, hdrs, body, timeout || @timeout, eff_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, eff_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 |