ruby-http-session 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.editorconfig +9 -0
- data/.overcommit.yml +36 -0
- data/.rspec +3 -0
- data/.rubocop.yml +11 -0
- data/.tool-versions +1 -0
- data/.yardopts +3 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/Gemfile +34 -0
- data/Gemfile.lock +180 -0
- data/LICENSE.txt +21 -0
- data/README.md +207 -0
- data/Rakefile +10 -0
- data/http-session.gemspec +37 -0
- data/lib/http/session/cache/cache_control.rb +196 -0
- data/lib/http/session/cache/entry.rb +71 -0
- data/lib/http/session/cache/status.rb +20 -0
- data/lib/http/session/cache.rb +95 -0
- data/lib/http/session/client/perform.rb +143 -0
- data/lib/http/session/client.rb +157 -0
- data/lib/http/session/configurable.rb +143 -0
- data/lib/http/session/features/auto_inflate.rb +60 -0
- data/lib/http/session/options/cache_option.rb +83 -0
- data/lib/http/session/options/cookies_option.rb +22 -0
- data/lib/http/session/options.rb +80 -0
- data/lib/http/session/request.rb +31 -0
- data/lib/http/session/requestable.rb +87 -0
- data/lib/http/session/response/string_body.rb +20 -0
- data/lib/http/session/response.rb +176 -0
- data/lib/http/session/version.rb +5 -0
- data/lib/http/session.rb +97 -0
- data/lib/http-session/webmock.rb +30 -0
- data/lib/http-session.rb +14 -0
- metadata +100 -0
data/lib/http/session.rb
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
require "http"
|
2
|
+
require "monitor"
|
3
|
+
|
4
|
+
require_relative "session/cache/cache_control"
|
5
|
+
require_relative "session/cache/entry"
|
6
|
+
require_relative "session/cache/status"
|
7
|
+
require_relative "session/cache"
|
8
|
+
require_relative "session/client/perform"
|
9
|
+
require_relative "session/client"
|
10
|
+
require_relative "session/configurable"
|
11
|
+
require_relative "session/features/auto_inflate"
|
12
|
+
require_relative "session/options/cache_option"
|
13
|
+
require_relative "session/options/cookies_option"
|
14
|
+
require_relative "session/options"
|
15
|
+
require_relative "session/request"
|
16
|
+
require_relative "session/requestable"
|
17
|
+
require_relative "session/response/string_body"
|
18
|
+
require_relative "session/response"
|
19
|
+
require_relative "session/version"
|
20
|
+
|
21
|
+
# Use session to manage cookies and cache across requests.
|
22
|
+
class HTTP::Session
|
23
|
+
include MonitorMixin
|
24
|
+
include HTTP::Session::Configurable
|
25
|
+
include HTTP::Session::Requestable
|
26
|
+
|
27
|
+
# @!attribute [r] default_options
|
28
|
+
# @return [Options]
|
29
|
+
attr_reader :default_options
|
30
|
+
|
31
|
+
# @!attribute [r] cache
|
32
|
+
# @return [Cache]
|
33
|
+
attr_reader :cache
|
34
|
+
|
35
|
+
# @!attribute [r] jar
|
36
|
+
# @return [HTTP::CookieJar]
|
37
|
+
attr_reader :jar
|
38
|
+
|
39
|
+
# @param [Hash] default_options
|
40
|
+
# @option default_options [Boolean, Hash] :cookies session cookies option
|
41
|
+
# @option default_options [Boolean, Hash] :cache session cache option
|
42
|
+
# @option default_options [Hash] :http http client options
|
43
|
+
def initialize(default_options = {})
|
44
|
+
super()
|
45
|
+
|
46
|
+
@default_options = HTTP::Session::Options.new(default_options)
|
47
|
+
@cache = HTTP::Session::Cache.new(@default_options.cache)
|
48
|
+
@jar = HTTP::CookieJar.new
|
49
|
+
end
|
50
|
+
|
51
|
+
# @param verb
|
52
|
+
# @param uri
|
53
|
+
# @param [Hash] opts
|
54
|
+
# @return [Response]
|
55
|
+
def request(verb, uri, opts = {})
|
56
|
+
c = HTTP::Session::Client.new(@default_options.http, self)
|
57
|
+
c.request(verb, uri, opts).tap do |res|
|
58
|
+
handle_http_response(res)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# @!visibility private
|
63
|
+
def make_http_request_data
|
64
|
+
synchronize do
|
65
|
+
{
|
66
|
+
cookies: extract_cookie_from_jar
|
67
|
+
}
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
def handle_http_response(res)
|
74
|
+
synchronize do
|
75
|
+
extract_cookie_to_jar(res)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def extract_cookie_from_jar
|
80
|
+
return unless @default_options.cookies.enabled?
|
81
|
+
|
82
|
+
return if @jar.empty?
|
83
|
+
@jar.cookies.each_with_object({}) { |c, h| h[c.name] = c.value }
|
84
|
+
end
|
85
|
+
|
86
|
+
def extract_cookie_to_jar(res)
|
87
|
+
return unless @default_options.cookies.enabled?
|
88
|
+
|
89
|
+
all = ([] << res.history << res).flatten
|
90
|
+
all.each do |r|
|
91
|
+
req = r.request
|
92
|
+
r.headers.get(HTTP::Headers::SET_COOKIE).each do |header|
|
93
|
+
@jar.parse(header, req.uri)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require "webmock"
|
2
|
+
|
3
|
+
class HTTP::Session
|
4
|
+
class WebMockPerform < HTTP::WebMockPerform
|
5
|
+
def replay
|
6
|
+
webmock_response = response_for_request request_signature
|
7
|
+
return unless webmock_response
|
8
|
+
|
9
|
+
raise_timeout_error if webmock_response.should_timeout
|
10
|
+
webmock_response.raise_error_if_any
|
11
|
+
|
12
|
+
invoke_callbacks(webmock_response, real_request: false)
|
13
|
+
response = HTTP::Response.from_webmock @request, webmock_response, request_signature
|
14
|
+
HTTP::Session::Response.new(response)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Client
|
19
|
+
alias_method :__perform__, :httprb_perform
|
20
|
+
|
21
|
+
def httprb_perform(request, options)
|
22
|
+
return __perform__(request, options) unless webmock_enabled?
|
23
|
+
HTTP::Session::WebMockPerform.new(request, options) { __perform__(request, options) }.exec
|
24
|
+
end
|
25
|
+
|
26
|
+
def webmock_enabled?
|
27
|
+
WebMock::HttpLibAdapters::HttpRbAdapter.enabled?
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/http-session.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require_relative "http/session"
|
2
|
+
|
3
|
+
module HTTP
|
4
|
+
class << self
|
5
|
+
# @param [Hash] default_options
|
6
|
+
# @option default_options [Boolean, Hash] :cookies session cookies option
|
7
|
+
# @option default_options [Boolean, Hash] :cache session cache option
|
8
|
+
# @option default_options [Hash] :http http client options
|
9
|
+
# @return [Session] a new instance of Session.
|
10
|
+
def session(default_options = {})
|
11
|
+
HTTP::Session.new(default_options)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
metadata
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ruby-http-session
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- John Doe
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-10-07 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: http
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '5.1'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 5.1.1
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '5.1'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 5.1.1
|
33
|
+
description: HTTP::Session - a session abstraction for http.rb in order to support
|
34
|
+
cookies and caching.
|
35
|
+
email:
|
36
|
+
- johndoe@example.com
|
37
|
+
executables: []
|
38
|
+
extensions: []
|
39
|
+
extra_rdoc_files: []
|
40
|
+
files:
|
41
|
+
- ".editorconfig"
|
42
|
+
- ".overcommit.yml"
|
43
|
+
- ".rspec"
|
44
|
+
- ".rubocop.yml"
|
45
|
+
- ".tool-versions"
|
46
|
+
- ".yardopts"
|
47
|
+
- CODE_OF_CONDUCT.md
|
48
|
+
- Gemfile
|
49
|
+
- Gemfile.lock
|
50
|
+
- LICENSE.txt
|
51
|
+
- README.md
|
52
|
+
- Rakefile
|
53
|
+
- http-session.gemspec
|
54
|
+
- lib/http-session.rb
|
55
|
+
- lib/http-session/webmock.rb
|
56
|
+
- lib/http/session.rb
|
57
|
+
- lib/http/session/cache.rb
|
58
|
+
- lib/http/session/cache/cache_control.rb
|
59
|
+
- lib/http/session/cache/entry.rb
|
60
|
+
- lib/http/session/cache/status.rb
|
61
|
+
- lib/http/session/client.rb
|
62
|
+
- lib/http/session/client/perform.rb
|
63
|
+
- lib/http/session/configurable.rb
|
64
|
+
- lib/http/session/features/auto_inflate.rb
|
65
|
+
- lib/http/session/options.rb
|
66
|
+
- lib/http/session/options/cache_option.rb
|
67
|
+
- lib/http/session/options/cookies_option.rb
|
68
|
+
- lib/http/session/request.rb
|
69
|
+
- lib/http/session/requestable.rb
|
70
|
+
- lib/http/session/response.rb
|
71
|
+
- lib/http/session/response/string_body.rb
|
72
|
+
- lib/http/session/version.rb
|
73
|
+
homepage: https://github.com/souk4711/http-session
|
74
|
+
licenses:
|
75
|
+
- MIT
|
76
|
+
metadata:
|
77
|
+
homepage_uri: https://github.com/souk4711/http-session
|
78
|
+
source_code_uri: https://github.com/souk4711/http-session
|
79
|
+
changelog_uri: https://github.com/souk4711/http-session
|
80
|
+
post_install_message:
|
81
|
+
rdoc_options: []
|
82
|
+
require_paths:
|
83
|
+
- lib
|
84
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: 2.6.0
|
89
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
requirements: []
|
95
|
+
rubygems_version: 3.3.7
|
96
|
+
signing_key:
|
97
|
+
specification_version: 4
|
98
|
+
summary: HTTP::Session - a session abstraction for http.rb in order to support cookies
|
99
|
+
and caching.
|
100
|
+
test_files: []
|