summaryrefslogtreecommitdiff
path: root/lib/cgi/session.rb
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-12-15 06:35:55 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-12-15 06:35:55 +0000
commit2edbb9d0f802bab53153979c59125dd0afaafccf (patch)
tree76c471687bb6af4c8c0528187471346008838622 /lib/cgi/session.rb
parent772396882f02ec3738242a4e83a34e4fc32597bb (diff)
* lib/set.rb (Set#==): [ruby-dev:25206]
* ext/openssl/ossl_digest.c (ossl_digest_initialize): [ruby-dev:25198] * utf8.c (utf8_is_mbc_ambiguous): [ruby-talk:123561] * utf8.c (utf8_mbc_to_normalize): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7563 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/cgi/session.rb')
-rw-r--r--lib/cgi/session.rb43
1 files changed, 27 insertions, 16 deletions
diff --git a/lib/cgi/session.rb b/lib/cgi/session.rb
index 1bddaf3260..8384ed9beb 100644
--- a/lib/cgi/session.rb
+++ b/lib/cgi/session.rb
@@ -155,6 +155,9 @@ class CGI
#
class Session
+ #:nodoc:
+ class NoSession < RuntimeError; end
+
# The id of this session.
attr_reader :session_id, :new_session
@@ -243,35 +246,43 @@ class CGI
def initialize(request, option={})
@new_session = false
session_key = option['session_key'] || '_session_id'
- id = option['session_id']
- unless id
+ session_id = option['session_id']
+ unless session_id
if option['new_session']
- id = create_new_id
+ session_id = create_new_id
end
end
- unless id
+ unless session_id
if request.key?(session_key)
- id = request[session_key]
- id = id.read if id.respond_to?(:read)
+ session_id = request[session_key]
+ session_id = session_id.read if session_id.respond_to?(:read)
end
- unless id
- id, = request.cookies[session_key]
+ unless session_id
+ session_id, = request.cookies[session_key]
end
- unless id
+ unless session_id
if option.key?('new_session') and not option['new_session']
raise ArgumentError, "session_key `%s' should be supplied"%session_key
end
- id = create_new_id
+ session_id = create_new_id
end
end
- @session_id = id
+ @session_id = session_id
dbman = option['database_manager'] || FileStore
- @dbman = dbman::new(self, option)
+ begin
+ @dbman = dbman::new(self, option)
+ rescue NoSession
+ if option.key?('new_session') and not option['new_session']
+ raise ArgumentError, "invalid session_id `%s'"%session_id
+ end
+ session_id = @session_id = create_new_id
+ retry
+ end
request.instance_eval do
- @output_hidden = {session_key => id}
+ @output_hidden = {session_key => session_id}
@output_cookies = [
Cookie::new("name" => session_key,
- "value" => id,
+ "value" => session_id,
"expires" => option['session_expires'],
"domain" => option['session_domain'],
"secure" => option['session_secure'],
@@ -371,7 +382,7 @@ class CGI
@path = dir+"/"+prefix+md5+suffix
unless File::exist? @path
unless session.new_session
- raise RuntimeError, "uninitialized session"
+ raise CGI::Session::NoSession, "uninitialized session"
end
@hash = {}
end
@@ -441,7 +452,7 @@ class CGI
@session_id = session.session_id
unless GLOBAL_HASH_TABLE.key?(@session_id)
unless session.new_session
- raise RuntimeError, "uninitialized session"
+ raise CGI::Session::NoSession, "uninitialized session"
end
GLOBAL_HASH_TABLE[@session_id] = {}
end