-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcontext.go
111 lines (90 loc) · 2.26 KB
/
context.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*
Copyright 2019 Dmitry Kolesnikov, All Rights Reserved
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package gouldian
import (
"context"
"io"
"net/http"
"github.com/fogfish/gouldian/v2/internal/optics"
)
/*
Context of HTTP request. The context accumulates matched terms of HTTP and
passes it to destination function.
*/
type Context struct {
context.Context
Request *http.Request
values []string
params Query
payload []byte
JWT Token
morphism optics.Morphisms
}
/*
NewContext create a new context for HTTP request
*/
func NewContext(ctx context.Context) *Context {
return &Context{
Context: ctx,
values: make([]string, 0, 20),
morphism: make(optics.Morphisms, 0, 20),
}
}
/*
Free the context
*/
func (ctx *Context) free() {
ctx.values = ctx.values[:0]
ctx.morphism = ctx.morphism[:0]
}
/*
Free the context
*/
func (ctx *Context) Free() {
ctx.JWT = nil
ctx.params = nil
ctx.payload = nil
ctx.Request = nil
ctx.values = ctx.values[:0]
ctx.morphism = ctx.morphism[:0]
}
// Put injects value to the context
func (ctx *Context) Put(lens optics.Lens, str string) error {
val, err := lens.FromString(str)
if err != nil {
return ErrNoMatch
}
ctx.morphism = append(ctx.morphism, optics.Morphism{Lens: lens, Value: val})
return nil
}
// Get decodes context into structure
func FromContext[S any](ctx *Context, val *S) error {
if err := optics.Morph(ctx.morphism, val); err != nil {
return err
}
return nil
}
func (ctx *Context) cacheBody() error {
if ctx.Request.Body != nil {
buf, err := io.ReadAll(ctx.Request.Body)
if err != nil {
return err
}
// This is copied from runtime. It relies on the string
// header being a prefix of the slice header!
// ctx.payload = *(*string)(unsafe.Pointer(&buf))
ctx.payload = buf
return nil
}
return nil
}