This commit is contained in:
DarkGopher 2025-06-03 10:57:10 +02:00
parent 1c3000e532
commit c255491b9c
4 changed files with 40 additions and 55 deletions

2
go.mod
View file

@ -1,3 +1,5 @@
module git.mtux.eu/darkgopher/session module git.mtux.eu/darkgopher/session
go 1.23.4 go 1.23.4
require golang.org/x/net v0.40.0

2
go.sum Normal file
View file

@ -0,0 +1,2 @@
golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=

View file

@ -132,13 +132,13 @@ func (manager *Manager) SessionStart(w http.ResponseWriter, r *http.Request) (se
func (manager *Manager) SessionDestroy(w http.ResponseWriter, r *http.Request) (err error) { func (manager *Manager) SessionDestroy(w http.ResponseWriter, r *http.Request) (err error) {
var cookie *http.Cookie var cookie *http.Cookie
if cookie, err = r.Cookie(manager.cookieName); err != nil || cookie.Value == "" { if cookie, err = r.Cookie(manager.cookieName); err != nil || cookie.Value == "" {
return return fmt.Errorf("Get cookie from request failed: %v", err)
} }
manager.provider.Destroy(cookie.Value) manager.provider.Destroy(cookie.Value)
rmcookie := http.Cookie{ rmcookie := http.Cookie{
Name: manager.cookieName, Path: "/", HttpOnly: true, Name: manager.cookieName, Path: "/", HttpOnly: true,
Expires: time.Now(), MaxAge: -1, Expires: time.Now(), MaxAge: -1, Secure: manager.secure,
} }
http.SetCookie(w, &rmcookie) http.SetCookie(w, &rmcookie)
return nil return nil

View file

@ -13,10 +13,12 @@ import (
"io" "io"
"net/http" "net/http"
"net/http/cookiejar" "net/http/cookiejar"
"net/http/httptest"
"testing" "testing"
"time" "time"
"git.mtux.eu/darkgopher/session" "git.mtux.eu/darkgopher/session"
"golang.org/x/net/publicsuffix"
//all impls imports here ... //all impls imports here ...
_ "git.mtux.eu/darkgopher/session/storage/memory" _ "git.mtux.eu/darkgopher/session/storage/memory"
@ -24,30 +26,28 @@ import (
const sid = "sid" const sid = "sid"
const lifet = 180 const lifet = 180
const testsrvaddr = ":8888"
var sm *session.Manager //current session impl. var sm *session.Manager //current session impl.
var tc *TestClient //current test client var testserver *httptest.Server //httptest server h2
var testclient *http.Client
type TestServer struct { type TestServer struct{}
addr string
}
func NewTestServer(addr string) (ts *TestServer) {
return &TestServer{addr}
}
func (ts *TestServer) Serve() { func (ts *TestServer) Serve() {
http.HandleFunc("/startsession", ts.startSession) //ck mux := http.NewServeMux()
http.HandleFunc("/destroysession", ts.destroySession) //ck mux.HandleFunc("/startsession", ts.startSession) //ck
http.HandleFunc("/setsessionvar", ts.setSessionVar) mux.HandleFunc("/destroysession", ts.destroySession) //ck
http.HandleFunc("/getsessionvar", ts.getSessionVar) mux.HandleFunc("/setsessionvar", ts.setSessionVar)
http.HandleFunc("/updatesessionvar", ts.updateSessionVar) mux.HandleFunc("/getsessionvar", ts.getSessionVar)
http.HandleFunc("/validateupdatedvalue", ts.validateUpdatedValue) mux.HandleFunc("/updatesessionvar", ts.updateSessionVar)
http.HandleFunc("/deletesessionvalue", ts.deleteSessionValue) mux.HandleFunc("/validateupdatedvalue", ts.validateUpdatedValue)
http.HandleFunc("/validatedeletedvalue", ts.validateDeletedValue) mux.HandleFunc("/deletesessionvalue", ts.deleteSessionValue)
http.HandleFunc("/sessionGC", ts.sessionGC) //ck mux.HandleFunc("/validatedeletedvalue", ts.validateDeletedValue)
http.ListenAndServe(ts.addr, nil) mux.HandleFunc("/sessionGC", ts.sessionGC) //ck
testserver = httptest.NewUnstartedServer(mux)
testserver.EnableHTTP2 = true
testserver.StartTLS()
testclient = testserver.Client()
} }
func (ts *TestServer) startSession(w http.ResponseWriter, r *http.Request) { func (ts *TestServer) startSession(w http.ResponseWriter, r *http.Request) {
@ -178,45 +178,23 @@ func (ts *TestServer) sessionGC(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "OK") io.WriteString(w, "OK")
} }
type TestClient struct { func MkRequest(method, path string) (body []byte, err error) {
cl *http.Client
ckstore *cookiejar.Jar
}
func NewTestClient() (tc *TestClient, err error) {
var ckstore *cookiejar.Jar
if ckstore, err = cookiejar.New(nil); err != nil {
return nil, err
}
httpclient := &http.Client{Jar: ckstore}
tc = &TestClient{httpclient, ckstore}
return
}
// Request send http request into test server and return ResponseResult or error
func (tc *TestClient) Request(meth, uri string) (resb []byte, err error) {
var req *http.Request var req *http.Request
if req, err = http.NewRequest(meth, uri, nil); err != nil { uri := fmt.Sprintf("%s%s", testserver.URL, path)
return nil, fmt.Errorf("Create request to: %s ailed err: %v", uri, err) if req, err = http.NewRequest(method, uri, nil); err != nil {
return nil, fmt.Errorf("Create request to: %s failed: %v", uri, err)
} }
var rs *http.Response var res *http.Response
if rs, err = tc.cl.Do(req); err != nil { if res, err = testclient.Do(req); err != nil {
return nil, fmt.Errorf("Request failed err: %v", err) return nil, fmt.Errorf("Request to: %s failed: %v", uri, err)
} }
return io.ReadAll(res.Body)
defer rs.Body.Close()
var body []byte
if body, err = io.ReadAll(rs.Body); err != nil {
return nil, err
}
return body, nil
} }
func t1(t *testing.T) { func t1(t *testing.T) {
var res []byte var res []byte
var err error var err error
if res, err = tc.Request("GET", "http://localhost:8080/startsession/"); err != nil { if res, err = MkRequest("GET", "/startsession"); err != nil {
t.Logf("err: %v", err)
t.Error(err) t.Error(err)
} }
if string(res) != "OK" { if string(res) != "OK" {
@ -233,11 +211,14 @@ func t7(t *testing.T) {}
// iterate all session storage impls. and run t1 - t7 // iterate all session storage impls. and run t1 - t7
func TestRunAll(t *testing.T) { func TestRunAll(t *testing.T) {
ts := NewTestServer("localhost:8080")
ts := &TestServer{}
ts.Serve() ts.Serve()
//all impls. subtests
for _, pn := range session.ProviderNames() { for _, pn := range session.ProviderNames() {
var err error var err error
tc, err = NewTestClient() jar, _ := cookiejar.New(&cookiejar.Options{PublicSuffixList: publicsuffix.List})
testclient.Jar = jar
if sm, err = session.NewManager(pn, sid, lifet, true); err != nil { if sm, err = session.NewManager(pn, sid, lifet, true); err != nil {
t.Errorf("Session provider %s failed initialize err: %v", pn, err) t.Errorf("Session provider %s failed initialize err: %v", pn, err)
} }