Use zlib for compression when saving session cookie

This commit is contained in:
2025-06-22 09:03:17 +03:00
parent dec67e94cb
commit 708ca49a35
2 changed files with 35 additions and 18 deletions

View File

@@ -7,3 +7,7 @@ gem "xxhash"
gem "sequel" gem "sequel"
gem "json" gem "json"
gem "base64"
gem "zlib"

View File

@@ -1,49 +1,62 @@
require "base64" require "base64"
require "zlib"
require "json" require "json"
def set_session(request, response, key, val) def set_session(request, response, key, val, uid = nil)
session = request.cookies["session"] session = request.cookies["session"]
session = "e30=\n" if session.nil? session = session.nil? ? "{}" : Zlib::Inflate.inflate(Base64.decode64(session))
session = JSON.parse(Base64.decode64(session)) session = JSON.parse(session)
session[key] = val session[key] = val
session = Base64.encode64(JSON.generate(session)) compressed = Zlib::Deflate.deflate(JSON.generate(session))
encoded = Base64.encode64(compressed)
response.set_cookie("session", response.set_cookie("session",
value: session, value: encoded,
path: "/", path: "/",
expires: Time.now + 360 * 24 * 60 * 60) expires: Time.now + 360 * 24 * 60 * 60)
rescue JSON::ParserError begin
DB["UPDATE SignedInUsers SET last_used_at = CURRENT_TIMESTAMP WHERE code = ?", uid].update if uid
rescue Sequel::Error => e
File.write("log/main.log", "DB Error: #{e.message} when updating last_used_at for #{uid}\n", mode: "a")
end
rescue JSON::ParserError, Zlib::Error
response.delete_cookie("session") response.delete_cookie("session")
end end
def get_session(request, response, key) def get_session(request, response, key, uid = nil)
session = request.cookies["session"] session = request.cookies["session"]
session = "{}" if session.nil? session = session.nil? ? "{}" : Zlib::Inflate.inflate(Base64.decode64(session))
session = JSON.parse(Base64.decode64(session)) session = JSON.parse(session)
begin
DB["UPDATE SignedInUsers SET last_used_at = CURRENT_TIMESTAMP WHERE code = ?", uid].update if uid
rescue Sequel::Error => e
File.write("log/main.log", "DB Error: #{e.message} when updating last_used_at for #{uid}\n", mode: "a")
end
session[key] session[key]
rescue JSON::ParserError rescue JSON::ParserError, Zlib::Error
response.delete_cookie("session") response.delete_cookie("session")
"" ""
end end
def get_session_all(request, response) def get_session_all(request, response)
session = request.cookies["session"] session = request.cookies["session"]
session = "{}" if session.nil? session = session.nil? ? "{}" : Zlib::Inflate.inflate(Base64.decode64(session))
JSON.parse(Base64.decode64(session)) JSON.parse(session)
rescue JSON::ParserError rescue JSON::ParserError, Zlib::Error
response.delete_cookie("session") response.delete_cookie("session")
"" ""
end end
def rm_session(request, response, key) def rm_session(request, response, key)
session = request.cookies["session"] session = request.cookies["session"]
session = "{}" if session.nil? session = session.nil? ? "{}" : Zlib::Inflate.inflate(Base64.decode64(session))
session = JSON.parse(Base64.decode64(session)) session = JSON.parse(session)
session.delete(key) session.delete(key)
session = Base64.encode64(JSON.generate(session)) compressed = Zlib::Deflate.deflate(JSON.generate(session))
encoded = Base64.encode64(compressed)
response.set_cookie("session", response.set_cookie("session",
value: session, value: encoded,
path: "/", path: "/",
expires: Time.now + 360 * 24 * 60 * 60) expires: Time.now + 360 * 24 * 60 * 60)
rescue JSON::ParserError rescue JSON::ParserError, Zlib::Error
response.delete_cookie("session") response.delete_cookie("session")
end end