summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjwijenbergh <jeroenwijenbergh@protonmail.com>2024-02-06 16:42:47 +0100
committerJeroen Wijenbergh <46386452+jwijenbergh@users.noreply.github.com>2024-02-19 14:15:07 +0100
commit50ca13f2928e6598f9a41dd987e75f798bfe4536 (patch)
tree75c9f06c36bf2661007aeb9f0e5a01a3554abf56
parenta84050a5e93f5fb9f5bbb79ca21b37e8359cf289 (diff)
Cookie + Exports: Store and return the cookie from the underlying context
This has the ability so that we can easily get the same cookie back in the client package by creating the one from the context
-rw-r--r--exports/exports.go2
-rw-r--r--types/cookie/cookie.go16
2 files changed, 14 insertions, 4 deletions
diff --git a/exports/exports.go b/exports/exports.go
index 9c0088e..5c36446 100644
--- a/exports/exports.go
+++ b/exports/exports.go
@@ -1047,7 +1047,7 @@ func SetTokenHandler(getter C.TokenGetter, setter C.TokenSetter) *C.char {
//export CookieNew
func CookieNew() C.uintptr_t {
c := cookie.NewWithContext(context.Background())
- return C.uintptr_t(cgo.NewHandle(&c))
+ return C.uintptr_t(cgo.NewHandle(c))
}
// CookieReply replies to a state transition using the cookie
diff --git a/types/cookie/cookie.go b/types/cookie/cookie.go
index 55fe938..1582a9c 100644
--- a/types/cookie/cookie.go
+++ b/types/cookie/cookie.go
@@ -19,11 +19,21 @@ type Cookie struct {
H cgo.Handle
}
+type contextt int8
+
+const CONTEXTK contextt = 0
+
// NewWithContext creates a new cookie with a context
// It stores the cancel and channel inside of the struct
-func NewWithContext(ctx context.Context) Cookie {
+func NewWithContext(ctx context.Context) *Cookie {
+ // if the context already has a handle, return that cookie
+ if h, ok := ctx.Value(CONTEXTK).(cgo.Handle); ok {
+ if ck, ok := h.Value().(*Cookie); ok {
+ return ck
+ }
+ }
ctx, cancel := context.WithCancel(ctx)
- return Cookie{
+ return &Cookie{
c: make(chan string),
ctx: ctx,
ctxCancel: cancel,
@@ -77,5 +87,5 @@ func (c *Cookie) Send(data string) error {
// Context gets the underlying context of the cookie
func (c *Cookie) Context() context.Context {
- return c.ctx
+ return context.WithValue(c.ctx, CONTEXTK, c.H)
}