ruby-http-session 1.0.1 → 2.1.0

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.
data/lib/http/session.rb CHANGED
@@ -1,51 +1,61 @@
1
+ require "forwardable"
1
2
  require "http"
2
3
  require "monitor"
4
+ require "set"
3
5
 
6
+ require_relative "session/exceptions"
7
+ require_relative "session/options/optionable"
8
+ require_relative "session/options/cache_option"
9
+ require_relative "session/options/cookies_option"
10
+ require_relative "session/options/persistent_option"
11
+ require_relative "session/options"
4
12
  require_relative "session/cache/cache_control"
5
13
  require_relative "session/cache/entry"
6
14
  require_relative "session/cache/status"
7
15
  require_relative "session/cache"
16
+ require_relative "session/cookies"
17
+ require_relative "session/connection_pool"
18
+ require_relative "session/pool_manager"
19
+ require_relative "session/request"
20
+ require_relative "session/response/string_body"
21
+ require_relative "session/response"
22
+ require_relative "session/features/auto_inflate"
23
+ require_relative "session/features"
24
+ require_relative "session/context/follow_context"
25
+ require_relative "session/context"
8
26
  require_relative "session/client/perform"
9
27
  require_relative "session/client"
28
+ require_relative "session/redirector"
10
29
  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
30
  require_relative "session/requestable"
17
- require_relative "session/response/string_body"
18
- require_relative "session/response"
19
31
  require_relative "session/version"
20
32
 
21
33
  # Use session to manage cookies and cache across requests.
22
34
  class HTTP::Session
23
- include MonitorMixin
24
35
  include HTTP::Session::Configurable
25
36
  include HTTP::Session::Requestable
26
37
 
27
- # @!attribute [r] default_options
28
- # @return [Options]
38
+ # @!visibility private
29
39
  attr_reader :default_options
30
40
 
31
- # @!attribute [r] cache
32
- # @return [Cache]
33
- attr_reader :cache
41
+ # @!visibility private
42
+ attr_reader :cookies_mgr
34
43
 
35
- # @!attribute [r] jar
36
- # @return [HTTP::CookieJar]
37
- attr_reader :jar
44
+ # @!visibility private
45
+ attr_reader :cache_mgr
38
46
 
39
47
  # @param [Hash] default_options
40
48
  # @option default_options [Boolean, Hash] :cookies session cookies option
41
49
  # @option default_options [Boolean, Hash] :cache session cache option
50
+ # @option default_options [Boolean, Hash] :persistent session persistent option
42
51
  # @option default_options [Hash] :http http client options
43
52
  def initialize(default_options = {})
44
53
  super()
45
54
 
46
55
  @default_options = HTTP::Session::Options.new(default_options)
47
- @cache = HTTP::Session::Cache.new(@default_options.cache)
48
- @jar = HTTP::CookieJar.new
56
+ @cookies_mgr = HTTP::Session::Cookies.new(@default_options.cookies)
57
+ @cache_mgr = HTTP::Session::Cache.new(@default_options.cache)
58
+ @pool_mgr = HTTP::Session::PoolManager.new(@default_options.persistent, self)
49
59
  end
50
60
 
51
61
  # @param verb
@@ -53,45 +63,32 @@ class HTTP::Session
53
63
  # @param [Hash] opts
54
64
  # @return [Response]
55
65
  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)
66
+ http_opts = @default_options.http.merge(opts)
67
+ opts[:follow] = false
68
+
69
+ res = perform(verb, uri, opts)
70
+ return res unless http_opts.follow
71
+
72
+ redirector = HTTP::Session::Redirector.new(http_opts.follow)
73
+ redirector.perform(res) do |new_verb, new_uri, follow_ctx|
74
+ new_opts = follow_ctx.same_origin? ? opts : {}
75
+ ctx = HTTP::Session::Context.new(follow: follow_ctx)
76
+ perform(new_verb, new_uri, new_opts, ctx)
59
77
  end
60
78
  end
61
79
 
62
80
  # @!visibility private
63
- def make_http_request_data
64
- synchronize do
65
- {
66
- cookies: extract_cookie_from_jar
67
- }
81
+ def freeze
82
+ super.tap do
83
+ default_options.freeze
68
84
  end
69
85
  end
70
86
 
71
87
  private
72
88
 
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
89
+ def perform(verb, uri, opts, ctx = nil)
90
+ @pool_mgr.with(uri) do |c|
91
+ c.request(verb, uri, opts, ctx)
95
92
  end
96
93
  end
97
94
  end
data/lib/http-session.rb CHANGED
@@ -5,6 +5,7 @@ module HTTP
5
5
  # @param [Hash] default_options
6
6
  # @option default_options [Boolean, Hash] :cookies session cookies option
7
7
  # @option default_options [Boolean, Hash] :cache session cache option
8
+ # @option default_options [Boolean, Hash] :persistent session persistent option
8
9
  # @option default_options [Hash] :http http client options
9
10
  # @return [Session] a new instance of Session.
10
11
  def session(default_options = {})
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-http-session
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Doe
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-10-07 00:00:00.000000000 Z
11
+ date: 2023-10-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: http
@@ -31,7 +31,7 @@ dependencies:
31
31
  - !ruby/object:Gem::Version
32
32
  version: 5.1.1
33
33
  description: HTTP::Session - a session abstraction for http.rb in order to support
34
- cookies and caching.
34
+ Cookies and Caching.
35
35
  email:
36
36
  - johndoe@example.com
37
37
  executables: []
@@ -61,10 +61,20 @@ files:
61
61
  - lib/http/session/client.rb
62
62
  - lib/http/session/client/perform.rb
63
63
  - lib/http/session/configurable.rb
64
+ - lib/http/session/connection_pool.rb
65
+ - lib/http/session/context.rb
66
+ - lib/http/session/context/follow_context.rb
67
+ - lib/http/session/cookies.rb
68
+ - lib/http/session/exceptions.rb
69
+ - lib/http/session/features.rb
64
70
  - lib/http/session/features/auto_inflate.rb
65
71
  - lib/http/session/options.rb
66
72
  - lib/http/session/options/cache_option.rb
67
73
  - lib/http/session/options/cookies_option.rb
74
+ - lib/http/session/options/optionable.rb
75
+ - lib/http/session/options/persistent_option.rb
76
+ - lib/http/session/pool_manager.rb
77
+ - lib/http/session/redirector.rb
68
78
  - lib/http/session/request.rb
69
79
  - lib/http/session/requestable.rb
70
80
  - lib/http/session/response.rb
@@ -95,6 +105,6 @@ requirements: []
95
105
  rubygems_version: 3.3.7
96
106
  signing_key:
97
107
  specification_version: 4
98
- summary: HTTP::Session - a session abstraction for http.rb in order to support cookies
99
- and caching.
108
+ summary: HTTP::Session - a session abstraction for http.rb in order to support Cookies
109
+ and Caching.
100
110
  test_files: []