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
package ingressproxy
import (
"context"
"errors"
"net"
"net/http"
commonv1 "github.com/johnandersen777/socialweb-computer-kcp/api/common/v1alpha1"
"github.com/johnandersen777/socialweb-computer-kcp/internal/bus"
"github.com/johnandersen777/socialweb-computer-kcp/internal/component"
"github.com/johnandersen777/socialweb-computer-kcp/internal/contract/ingress"
"github.com/johnandersen777/socialweb-computer-kcp/internal/exposure"
)
type busTarget struct {
bus *bus.Bus
key component.Key
handler string
caller commonv1.ObjectRef
}
var _ ingress.Target = busTarget{}
func (t busTarget) ServeHTTP(w http.ResponseWriter, r *http.Request) {
handler, ok := t.bus.HandlerNamed(t.key, t.handler)
if !ok {
http.Error(w, "the target handler is not registered", http.StatusServiceUnavailable)
return
}
handler.ServeHTTP(w, r)
}
func (t busTarget) DialStream(ctx context.Context) (net.Conn, error) {
return t.bus.DialStream(bus.WithCaller(ctx, t.caller), t.key, t.handler)
}
type registrar struct {
impl ingress.Registrar
bus *bus.Bus
}
var _ exposure.IngressRegistrar = registrar{}
func (r registrar) Register(ctx context.Context, spec exposure.IngressSpec) (exposure.IngressRegistration, error) {
var target ingress.Target
if r.bus != nil {
target = busTarget{bus: r.bus, key: spec.Target, handler: spec.Handler, caller: spec.Caller()}
}
registration, err := r.impl.Register(ctx, ingress.Spec{
Workspace: spec.Workspace,
Exposure: spec.Exposure,
Protocol: string(spec.Protocol),
Path: spec.Path,
}, target)
if err != nil {
if errors.Is(err, ingress.ErrStableHostMismatch) {
return nil, stableHostError{err: err}
}
return nil, err
}
return registration, nil
}
type stableHostError struct {
err error
}
func (e stableHostError) Error() string {
return e.err.Error()
}
func (e stableHostError) Unwrap() []error {
return []error{e.err, exposure.ErrStableHostMismatch}
}