11package spoe
22
33import (
4+ "fmt"
45 "log"
56 "net"
67
@@ -15,10 +16,11 @@ import (
1516type 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
2426func (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