Skip to content

Commit 11e399d

Browse files
author
Miguel Medinilla
committed
Log raw SPOE input when debugging
1 parent 7074f65 commit 11e399d

File tree

2 files changed

+49
-22
lines changed

2 files changed

+49
-22
lines changed

cmd/decision-spoa/main.go

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"net/http"
88
"os"
99
"os/signal"
10+
"sort"
1011
"strings"
1112
"sync"
1213
"syscall"
@@ -229,7 +230,7 @@ func main() {
229230
s := &spoe.Server{
230231
Addr: *listen,
231232
Logger: log.Default(),
232-
Handler: func(args map[string]string) (map[string]interface{}, error) {
233+
Handler: func(args map[string]string, raw map[string]string) (map[string]interface{}, error) {
233234
start := time.Now()
234235

235236
state.RLock()
@@ -329,8 +330,8 @@ func main() {
329330
}
330331
}
331332
if cfgSnapshot.Debug {
332-
log.Printf("policy: fe=%s be=%s ip=%v xff_stripped=%d asn=%d c=%s method=%s host=%s path=%s query=%q sni=%s ja3=%s ua=%q vars=%v",
333-
frontend, normBE, ip, strippedHops, asn, country, strings.ToUpper(method), host, path, query, sni, ja3, ua, resp)
333+
log.Printf("policy: raw_input=%v fe=%s be=%s src=%s xff=%s ip=%v xff_stripped=%d asn=%d c=%s method=%s host=%s path=%s query=%q sni=%s ja3=%s ua=%q vars=%v",
334+
sortedRaw(raw), frontend, normBE, src, xff, ip, strippedHops, asn, country, strings.ToUpper(method), host, path, query, sni, ja3, ua, resp)
334335
}
335336
return resp, nil
336337
},
@@ -402,3 +403,16 @@ func normalizeValue(v interface{}) interface{} {
402403
return v
403404
}
404405
}
406+
407+
func sortedRaw(raw map[string]string) []string {
408+
out := make([]string, 0, len(raw))
409+
keys := make([]string, 0, len(raw))
410+
for k := range raw {
411+
keys = append(keys, k)
412+
}
413+
sort.Strings(keys)
414+
for _, k := range keys {
415+
out = append(out, fmt.Sprintf("%s=%s", k, raw[k]))
416+
}
417+
return out
418+
}

internal/spoe/server.go

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package spoe
22

33
import (
4+
"fmt"
45
"log"
56
"net"
67

@@ -15,10 +16,11 @@ import (
1516
type Server struct {
1617
Addr string
1718
Logger *log.Logger
18-
// Handler receives args extracted from SPOE messages and must return the vars to set.
19+
// Handler receives args extracted from SPOE messages, along with the raw key/value inputs (as strings),
20+
// and must return the vars to set.
1921
// Expected keys in resp:
2022
// - Arbitrary SPOE variables (e.g. "policy.use_varnish", "use_varnish", ...)
21-
Handler func(args map[string]string) (map[string]interface{}, error)
23+
Handler func(args map[string]string, raw map[string]string) (map[string]interface{}, error)
2224
}
2325

2426
func (s *Server) ListenAndServe() error {
@@ -31,9 +33,9 @@ func (s *Server) ListenAndServe() error {
3133
spLog := logger.NewDefaultLog()
3234

3335
h := func(req *request.Request) {
34-
args := collectArgs(req.Messages)
36+
args, raw := collectArgs(req.Messages)
3537

36-
resp, err := s.Handler(args)
38+
resp, err := s.Handler(args, raw)
3739
if err != nil {
3840
// best-effort: do not set any vars on error
3941
return
@@ -56,10 +58,10 @@ func (s *Server) ListenAndServe() error {
5658
return a.Serve(l)
5759
}
5860

59-
// collectArgs pulls only the keys we care about from the SPOE messages.
60-
// negasus v1.0.7's KV doesn't expose Keys(), so we fetch known keys via Get().
61-
func collectArgs(msgs *message.Messages) map[string]string {
61+
// collectArgs returns both the subset of keys used by the policy engine and a raw view of all inputs.
62+
func collectArgs(msgs *message.Messages) (map[string]string, map[string]string) {
6263
out := make(map[string]string)
64+
raw := make(map[string]string)
6365

6466
want := []string{
6567
"src",
@@ -81,23 +83,34 @@ func collectArgs(msgs *message.Messages) map[string]string {
8183
if err != nil || m == nil || m.KV == nil {
8284
continue
8385
}
86+
items := m.KV.Data()
87+
for _, item := range items {
88+
if _, already := raw[item.Name]; already {
89+
continue
90+
}
91+
raw[item.Name] = stringify(item.Value)
92+
}
8493
for _, k := range want {
8594
if _, already := out[k]; already {
8695
continue
8796
}
88-
if v, ok := m.KV.Get(k); ok {
89-
switch t := v.(type) {
90-
case string:
91-
out[k] = t
92-
case []byte:
93-
out[k] = string(t)
94-
case net.IP:
95-
out[k] = t.String()
96-
default:
97-
// ignore unrecognized types; we only expect strings/bytes/IP
98-
}
97+
if v, ok := raw[k]; ok {
98+
out[k] = v
9999
}
100100
}
101101
}
102-
return out
102+
return out, raw
103+
}
104+
105+
func stringify(v interface{}) string {
106+
switch t := v.(type) {
107+
case string:
108+
return t
109+
case []byte:
110+
return string(t)
111+
case net.IP:
112+
return t.String()
113+
default:
114+
return fmt.Sprint(v)
115+
}
103116
}

0 commit comments

Comments
 (0)