ruby-http-session 1.0.1 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: []