bytes := data.Bytes() f.reqBuffer = append(f.reqBuffer, bytes...) var fr *frame f.reqBuffer, fr = readFrame(f.reqBuffer) if fr == nil { // already cache into Golang side data.Reset() return api.Continue } gofunc() { bytes := fr.GetData() ok := checkData(bytes) if !ok { bytes = []byte("Unauthorized") } else { bytes = []byte("Authorized") } fr.SetData(bytes) data.Set(fr.Bytes()) f.callback.DecoderFilterCallbacks().Continue(api.Continue) }() return api.Running
再看看 checkData 的实现,因为 Envoy Go 支持全功能的 Golang,我们可以直接使用 Golang 的网络库来发请求:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
// Just a demo to request a remote server funccheckData(data []byte)bool { req, err := http.NewRequest("POST", "https://httpbin.org/post", bytes.NewBuffer(data)) if err != nil { api.LogDebugf("new request error: %v", err) returnfalse }