providers/session: "Ensafen" values when they enter/exit the session
This commit is contained in:
parent
b9d55ad0b6
commit
4f0364bb49
@ -1,4 +1,4 @@
|
||||
package os
|
||||
package session
|
||||
|
||||
import "time"
|
||||
import "net/http"
|
||||
@ -160,18 +160,20 @@ func (this *Session) ID () uuid.UUID {
|
||||
return this.id
|
||||
}
|
||||
|
||||
func (this *Session) Get (name string) any {
|
||||
func (this *Session) Get (name string) (any, error) {
|
||||
data, done := this.data.RBorrow()
|
||||
defer done()
|
||||
return data[name]
|
||||
return ensafenValue(data[name])
|
||||
}
|
||||
|
||||
func (this *Session) Set (name string, value any) string {
|
||||
func (this *Session) Set (name string, value any) (string, error) {
|
||||
value, err := ensafenValue(value)
|
||||
if err != nil { return "", err }
|
||||
data, done := this.data.Borrow()
|
||||
defer done()
|
||||
data[name] = value
|
||||
this.addSelf()
|
||||
return ""
|
||||
return "", nil
|
||||
}
|
||||
|
||||
func (this *Session) Del (name string) string {
|
||||
@ -224,3 +226,30 @@ func (this *Session) setExpiration (expires time.Time) string {
|
||||
func (this *Session) Expired () bool {
|
||||
return this.Expiration().Before(time.Now())
|
||||
}
|
||||
|
||||
func ensafenValue (value any) (any, error) {
|
||||
switch value := value.(type) {
|
||||
case
|
||||
int, int8, int16, int32, int64,
|
||||
uint, uint8, uint16, uint32, uint64,
|
||||
bool, float32, float64, string, nil:
|
||||
return value, nil
|
||||
case []any:
|
||||
list := make([]any, len(value))
|
||||
for index, item := range value {
|
||||
item, err := ensafenValue(item)
|
||||
if err != nil { return nil, err }
|
||||
list[index] = item
|
||||
}
|
||||
return list, nil
|
||||
case map[string] any:
|
||||
dict := make(map[string] any, len(value))
|
||||
for key, item := range value {
|
||||
item, err := ensafenValue(item)
|
||||
if err != nil { return nil, err }
|
||||
dict[key] = item
|
||||
}
|
||||
return dict, nil
|
||||
}
|
||||
return nil, step.ErrTypeMismatch
|
||||
}
|
||||
|
62
providers/session/session_test.go
Normal file
62
providers/session/session_test.go
Normal file
@ -0,0 +1,62 @@
|
||||
package session
|
||||
|
||||
import "io"
|
||||
import "reflect"
|
||||
import "testing"
|
||||
import "git.tebibyte.media/sashakoshka/step"
|
||||
|
||||
func TestEnsafenValue (test *testing.T) {
|
||||
items := []any {
|
||||
"hello",
|
||||
123,
|
||||
934.3298,
|
||||
'o',
|
||||
[]any {
|
||||
"asljdkasd",
|
||||
"90iur3e",
|
||||
},
|
||||
map[string] any {
|
||||
"asdkiasd": 34,
|
||||
"jdjjdfj": '-',
|
||||
},
|
||||
nil,
|
||||
}
|
||||
for index, item := range items {
|
||||
safe, err := ensafenValue(item)
|
||||
if err != nil { test.Fatal(index, err) }
|
||||
test.Logf("%d: %v --> %v", index, item, safe)
|
||||
if !reflect.DeepEqual(item, safe) {
|
||||
test.Fatal("not equal")
|
||||
}
|
||||
switch item := item.(type) {
|
||||
case []any, map[string] any:
|
||||
if reflect.ValueOf(item).Pointer() == reflect.ValueOf(safe).Pointer() {
|
||||
test.Fatal("memory wasn't duplicated")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestEnsafenValueErrTypeMismatch (test *testing.T) {
|
||||
items := []any {
|
||||
[]any {
|
||||
"asljdkasd",
|
||||
&struct { } { },
|
||||
"90iur3e",
|
||||
},
|
||||
io.EOF,
|
||||
[]string {
|
||||
"hello",
|
||||
},
|
||||
map[string] any {
|
||||
"asdkiasd": 34,
|
||||
"jdjjdfj": struct { } { },
|
||||
},
|
||||
}
|
||||
for index, item := range items {
|
||||
safe, err := ensafenValue(item)
|
||||
if err != step.ErrTypeMismatch {
|
||||
test.Fatalf("%d: no error, produced %v", index, safe)
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user