mirror of
https://gitea.invidious.io/iv-org/shard-kemal.git
synced 2024-08-15 00:53:36 +00:00
Implement basic in-memory session store
Sessions are stored in a non-persistent Hash. Only String values are allowed. A reaper fiber regularly removes any sessions which expire due to inactivity.
This commit is contained in:
parent
0c46bd65da
commit
94db0c8cb8
4 changed files with 160 additions and 0 deletions
57
spec/session_spec.cr
Normal file
57
spec/session_spec.cr
Normal file
|
@ -0,0 +1,57 @@
|
|||
require "./spec_helper"
|
||||
|
||||
describe "Session" do
|
||||
it "can establish a session" do
|
||||
sid = nil
|
||||
existing = nil
|
||||
get "/" do |env|
|
||||
sess = env.session
|
||||
existing = sess["token"]?
|
||||
sid = sess.id
|
||||
sess["token"] = "abc"
|
||||
"Hello"
|
||||
end
|
||||
|
||||
# make first request without any cookies/session
|
||||
request = HTTP::Request.new("GET", "/")
|
||||
response = call_request_on_app(request)
|
||||
# dup headers due to Crystal#2920
|
||||
headers = response.headers.dup
|
||||
|
||||
# verify we got a cookie and session ID
|
||||
cookie = response.headers["Set-Cookie"]?
|
||||
cookie.should_not be_nil
|
||||
response.cookies[Kemal::Sessions::NAME].value.should eq(sid)
|
||||
lastsid = sid
|
||||
existing.should be_nil
|
||||
|
||||
# make second request with cookies to get session
|
||||
request = HTTP::Request.new("GET", "/", headers)
|
||||
response = call_request_on_app(request)
|
||||
|
||||
# verify we got cookies and we could see values set
|
||||
# in the previous request
|
||||
cookie2 = response.headers["Set-Cookie"]?
|
||||
cookie2.should_not be_nil
|
||||
cookie2.should eq(cookie)
|
||||
response.cookies[Kemal::Sessions::NAME].value.should eq(lastsid)
|
||||
existing.should eq("abc")
|
||||
end
|
||||
|
||||
it "can prune old sessions" do
|
||||
s = Kemal::Sessions::STORE
|
||||
s.clear
|
||||
|
||||
Kemal::Sessions.prune!
|
||||
|
||||
id = "foo"
|
||||
s[id] = Kemal::Sessions::Session.new(id)
|
||||
s.size.should eq(1)
|
||||
Kemal::Sessions.prune!
|
||||
s.size.should eq(1)
|
||||
|
||||
s[id].last_access_at = (Time.now - 1.week).epoch_ms
|
||||
Kemal::Sessions.prune!
|
||||
s.size.should eq(0)
|
||||
end
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue