Skip to content

Commit 4c91e47

Browse files
committed
Prevent empty sessions from being stored (lazy session creation)
1 parent f924c3d commit 4c91e47

File tree

3 files changed

+25
-8
lines changed

3 files changed

+25
-8
lines changed

spec/base_spec.cr

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,8 @@ describe "Session" do
252252
Kemal::Session.destroy_all
253253
Kemal::Session.all.size.should eq(0)
254254
3.times do
255-
Kemal::Session.new(create_context(Random::Secure.hex))
255+
session = Kemal::Session.new(create_context(Random::Secure.hex))
256+
session.int("test", 1) # Write data so session is persisted
256257
end
257258
Kemal::Session.all.size.should eq(3)
258259
end
@@ -262,7 +263,8 @@ describe "Session" do
262263
it "should iterate through all sessions" do
263264
Kemal::Session.destroy_all
264265
5.times do
265-
Kemal::Session.new(create_context(Random::Secure.hex))
266+
session = Kemal::Session.new(create_context(Random::Secure.hex))
267+
session.int("test", 1) # Write data so session is persisted
266268
end
267269
count = 0
268270
Kemal::Session.each do |session|

spec/file_spec.cr

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,7 @@ describe "Session::FileEngine" do
251251
describe ".destroy" do
252252
it "should remove session from filesystem" do
253253
session = Kemal::Session.new(create_context(SESSION_ID))
254+
session.int("test", 1) # Write data so session is persisted
254255
File.file?(SESSION_DIR + SESSION_ID + ".json").should be_true
255256
session.destroy
256257
File.file?(SESSION_DIR + SESSION_ID + ".json").should be_false
@@ -260,6 +261,7 @@ describe "Session::FileEngine" do
260261
describe "#destroy" do
261262
it "should remove session from filesystem" do
262263
session = Kemal::Session.new(create_context(SESSION_ID))
264+
session.int("test", 1) # Write data so session is persisted
263265
File.file?(SESSION_DIR + SESSION_ID + ".json").should be_true
264266
Kemal::Session.destroy(SESSION_ID)
265267
File.file?(SESSION_DIR + SESSION_ID + ".json").should be_false
@@ -272,7 +274,10 @@ describe "Session::FileEngine" do
272274

273275
describe "#run_gc" do
274276
it "should remove all sessions that are older than gc config" do
275-
2.times { Kemal::Session.new(create_context(Random::Secure.hex)) }
277+
2.times do
278+
session = Kemal::Session.new(create_context(Random::Secure.hex))
279+
session.int("test", 1) # Write data so session is persisted
280+
end
276281
Kemal::Session.all.size.should eq(2)
277282

278283
# should remove nothing, as the gc > now
@@ -288,7 +293,10 @@ describe "Session::FileEngine" do
288293

289294
describe "#destroy_all" do
290295
it "should remove all sessions in filesystem" do
291-
5.times { Kemal::Session.new(create_context(Random::Secure.hex)) }
296+
5.times do
297+
session = Kemal::Session.new(create_context(Random::Secure.hex))
298+
session.int("test", 1) # Write data so session is persisted
299+
end
292300
Kemal::Session.all.size.should eq(5)
293301

294302
Kemal::Session.destroy_all
@@ -346,7 +354,10 @@ describe "Session::FileEngine" do
346354
end
347355

348356
it "should return an array of Sessions" do
349-
3.times { Kemal::Session.new(create_context(Random::Secure.hex)) }
357+
3.times do
358+
session = Kemal::Session.new(create_context(Random::Secure.hex))
359+
session.int("test", 1) # Write data so session is persisted
360+
end
350361
arr = Kemal::Session.all
351362
arr.is_a?(Array).should be_true
352363
arr.size.should eq(3)
@@ -355,7 +366,10 @@ describe "Session::FileEngine" do
355366

356367
describe "#each" do
357368
it "should iterate over all sessions" do
358-
5.times { Kemal::Session.new(create_context(Random::Secure.hex)) }
369+
5.times do
370+
session = Kemal::Session.new(create_context(Random::Secure.hex))
371+
session.int("test", 1) # Write data so session is persisted
372+
end
359373
count = 0
360374
Kemal::Session.each do |session|
361375
count = count + 1

src/kemal-session/base.cr

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ module Kemal
2424

2525
if id.nil? || !valid
2626
id = Random::Secure.hex
27-
Kemal::Session.config.engine.create_session(id)
27+
# Session will be created lazily when data is written
28+
# This prevents empty sessions from being stored (e.g., from bots/crawlers)
2829
end
2930

3031
ctx.response.cookies << Session.create_cookie(id)
@@ -52,7 +53,7 @@ module Kemal
5253
destroy
5354
if context = @context
5455
@id = Random::Secure.hex
55-
Kemal::Session.config.engine.create_session(@id)
56+
# Session will be created lazily when data is written
5657
context.response.cookies << self.class.create_cookie(@id)
5758
end
5859
end

0 commit comments

Comments
 (0)