summaryrefslogtreecommitdiff
path: root/lib/cgi/session.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/cgi/session.rb')
-rw-r--r--lib/cgi/session.rb49
1 files changed, 24 insertions, 25 deletions
diff --git a/lib/cgi/session.rb b/lib/cgi/session.rb
index 7115cae7d2..cd6ce95f4d 100644
--- a/lib/cgi/session.rb
+++ b/lib/cgi/session.rb
@@ -364,16 +364,11 @@ class CGI
unless check_id(id)
raise ArgumentError, "session_id `%s' is invalid" % id
end
- path = dir+"/"+prefix+id
- path.untaint
- unless File::exist? path
+ @path = dir+"/"+prefix+id
+ @path.untaint
+ unless File::exist? @path
@hash = {}
end
- begin
- @f = open(path, "r+")
- rescue Errno::ENOENT
- @f = open(path, "w+")
- end
end
# Restore session state from the session's FileStore file.
@@ -382,13 +377,17 @@ class CGI
def restore
unless @hash
@hash = {}
- @f.flock File::LOCK_EX
- @f.rewind
- for line in @f
- line.chomp!
- k, v = line.split('=',2)
- @hash[CGI::unescape(k)] = CGI::unescape(v)
- end
+ begin
+ f = File.open(@path, 'r')
+ f.flock File::LOCK_SH
+ for line in f
+ line.chomp!
+ k, v = line.split('=',2)
+ @hash[CGI::unescape(k)] = CGI::unescape(v)
+ end
+ ensure
+ f.close unless f.nil?
+ end
end
@hash
end
@@ -396,25 +395,25 @@ class CGI
# Save session state to the session's FileStore file.
def update
return unless @hash
- @f.rewind
- for k,v in @hash
- @f.printf "%s=%s\n", CGI::escape(k), CGI::escape(String(v))
- end
- @f.truncate @f.tell
+ begin
+ f = File.open(@path, 'w')
+ f.flock File::LOCK_EX
+ for k,v in @hash
+ f.printf "%s=%s\n", CGI::escape(k), CGI::escape(String(v))
+ end
+ ensure
+ f.close unless f.nil?
+ end
end
# Update and close the session's FileStore file.
def close
- return if @f.closed?
update
- @f.close
end
# Close and delete the session's FileStore file.
def delete
- path = @f.path
- @f.close
- File::unlink path
+ File::unlink @path
end
end