http_session 0.2.1 → 0.3.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.
Files changed (4) hide show
  1. data/VERSION +1 -1
  2. data/http_session.gemspec +2 -2
  3. data/lib/http_session.rb +14 -8
  4. metadata +16 -16
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.1
1
+ 0.3.0
data/http_session.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{http_session}
8
- s.version = "0.2.1"
8
+ s.version = "0.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = [%q{David Burry}]
12
- s.date = %q{2011-09-07}
12
+ s.date = %q{2011-11-06}
13
13
  s.description = %q{A useful yet still extremely light-weight web client built on top of Ruby Net::HTTP. Keeps certain information internally in a session for each host/port used. Great for simple web page scraping or web service API usage.}
14
14
  s.email = %q{dburry@falcon}
15
15
  s.extra_rdoc_files = [
data/lib/http_session.rb CHANGED
@@ -114,8 +114,12 @@ class HttpSession
114
114
  # Session initialization and basic handling
115
115
  #
116
116
 
117
- # place to store references to all currently-known session instances, for singleton method usage
118
- @@sessions = {}
117
+ # Simplest thread-safe pooling mechanism is to make a separate session store for every thread.
118
+ # Each thread makes its own connection(s), the way you'd expect that way.
119
+ # Just don't try to share http_session instances between separate threads, and it will work fine.
120
+ def self.session_store
121
+ Thread.current['http_session_sessions'] ||= {}
122
+ end
119
123
 
120
124
  # storage for open session handle, for instance method usage
121
125
  attr_accessor :handle
@@ -144,18 +148,19 @@ class HttpSession
144
148
 
145
149
  # check if a session exists yet ot not
146
150
  def self.exists?(host, use_ssl=false, port=nil)
147
- @@sessions.has_key?(key(host, use_ssl, port))
151
+ session_store.has_key?(key(host, use_ssl, port))
148
152
  end
149
153
 
150
154
  # get the session for the given host and port, nil if there isn't one yet
151
155
  def self.get(host, use_ssl=false, port=nil)
152
- @@sessions[key(host, use_ssl, port)]
156
+ session_store[key(host, use_ssl, port)]
153
157
  end
154
158
 
155
159
  # get the session for the given host and port, creating a new one if it doesn't exist
156
160
  def self.use(host, use_ssl=false, port=nil)
157
- key = key(host, use_ssl, port)
158
- @@sessions.has_key?(key) ? @@sessions[key] : (@@sessions[key] = new(host, use_ssl, port_or_default(port, use_ssl)))
161
+ exists?(host, use_ssl, port) ?
162
+ get(host, use_ssl, port) :
163
+ (session_store[key(host, use_ssl, port)] = new(host, use_ssl, port_or_default(port, use_ssl)))
159
164
  end
160
165
 
161
166
  # done with this session, close and reset it
@@ -167,8 +172,9 @@ class HttpSession
167
172
 
168
173
  # delete session from session storage (you should probably call close on it too, and set all references to nil so it gets garbage collected)
169
174
  def delete
170
- key = self.class.key(handle.address, handle.use_ssl?, handle.port)
171
- @@sessions.delete(key) if @@sessions.has_key?(key)
175
+ if self.class.exists?(handle.address, handle.use_ssl?, handle.port)
176
+ self.class.session_store.delete(self.class.key(handle.address, handle.use_ssl?, handle.port))
177
+ end
172
178
  end
173
179
 
174
180
  # return the given port, or defaults for ssl setting if it's nil
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: http_session
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-09-07 00:00:00.000000000Z
12
+ date: 2011-11-06 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
16
- requirement: &70215141077800 !ruby/object:Gem::Requirement
16
+ requirement: &70196754286760 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - =
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.8.7
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70215141077800
24
+ version_requirements: *70196754286760
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: shoulda
27
- requirement: &70215141075260 !ruby/object:Gem::Requirement
27
+ requirement: &70196754285420 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70215141075260
35
+ version_requirements: *70196754285420
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: bundler
38
- requirement: &70215141072300 !ruby/object:Gem::Requirement
38
+ requirement: &70196754284000 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 1.0.0
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70215141072300
46
+ version_requirements: *70196754284000
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: jeweler
49
- requirement: &70215141070340 !ruby/object:Gem::Requirement
49
+ requirement: &70196754282040 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 1.6.2
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70215141070340
57
+ version_requirements: *70196754282040
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rcov
60
- requirement: &70215141069020 !ruby/object:Gem::Requirement
60
+ requirement: &70196754280780 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70215141069020
68
+ version_requirements: *70196754280780
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: simplecov
71
- requirement: &70215141067160 !ruby/object:Gem::Requirement
71
+ requirement: &70196754279500 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 0.4.0
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70215141067160
79
+ version_requirements: *70196754279500
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: rdoc
82
- requirement: &70215141053640 !ruby/object:Gem::Requirement
82
+ requirement: &70196754278100 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,7 +87,7 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70215141053640
90
+ version_requirements: *70196754278100
91
91
  description: A useful yet still extremely light-weight web client built on top of
92
92
  Ruby Net::HTTP. Keeps certain information internally in a session for each host/port
93
93
  used. Great for simple web page scraping or web service API usage.