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.
@@ -0,0 +1,5 @@
1
+ module HTTP
2
+ class Session
3
+ VERSION = "1.0.1"
4
+ end
5
+ end
@@ -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
@@ -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: []