diff options
| author | jwijenbergh <jeroenwijenbergh@protonmail.com> | 2024-02-06 16:42:47 +0100 |
|---|---|---|
| committer | Jeroen Wijenbergh <46386452+jwijenbergh@users.noreply.github.com> | 2024-02-19 14:15:07 +0100 |
| commit | 50ca13f2928e6598f9a41dd987e75f798bfe4536 (patch) | |
| tree | 75c9f06c36bf2661007aeb9f0e5a01a3554abf56 | |
| parent | a84050a5e93f5fb9f5bbb79ca21b37e8359cf289 (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.go | 2 | ||||
| -rw-r--r-- | types/cookie/cookie.go | 16 |
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) } |
