/
hnd_internal.go
75 lines (66 loc) · 1.44 KB
/
hnd_internal.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
package vhttp
import (
"fmt"
"net/http"
"time"
"get.pme.sh/pmesh/variant"
"gopkg.in/yaml.v3"
)
type InternalHandler struct {
Inner Subhandler
}
func (i InternalHandler) String() string {
if i.Inner.Handler != nil {
return fmt.Sprintf("Internal(%s)", i.Inner.Handler)
} else {
return "Internal"
}
}
func (i *InternalHandler) UnmarshalText(text []byte) error {
if string(text) != "internal" {
return variant.RejectMatch(i)
}
return nil
}
func (i *InternalHandler) UnmarshalInline(text string) error {
return i.UnmarshalText([]byte(text))
}
func (i *InternalHandler) UnmarshalYAML(node *yaml.Node) (err error) {
if node.Kind != yaml.ScalarNode {
var tmp struct {
Inner *Subhandler `yaml:"inner"`
}
if err = node.Decode(&tmp); err != nil {
return
}
if tmp.Inner != nil {
i.Inner = *tmp.Inner
} else {
i.Inner = Subhandler{}
}
return
} else {
var text string
if err = node.Decode(&text); err != nil {
return
}
return i.UnmarshalInline(text)
}
}
func (i InternalHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) Result {
if r.Header.Get("P-Internal") != "1" {
Error(w, r, http.StatusForbidden)
return Done
}
// Remove write deadline.
rc := http.NewResponseController(w)
rc.SetWriteDeadline(time.Time{})
// Serve the request.
if i.Inner.Handler != nil {
return i.Inner.ServeHTTP(w, r)
}
return Continue
}
func init() {
Registry.Define("internal", func() any { return &InternalHandler{} })
}