96 lines
2.5 KiB
Go
96 lines
2.5 KiB
Go
package policy
|
|
|
|
import (
|
|
"net"
|
|
"net/http"
|
|
|
|
"git.maze.io/maze/styx/internal/netutil"
|
|
"git.maze.io/maze/styx/logger"
|
|
proxy "git.maze.io/maze/styx/proxy"
|
|
)
|
|
|
|
func NewRequestHandler(p *Policy) proxy.RequestHandler {
|
|
log := logger.StandardLog.Value("policy", p.name)
|
|
return proxy.RequestHandlerFunc(func(ctx proxy.Context) (*http.Request, *http.Response) {
|
|
input := NewInputFromRequest(ctx, ctx.Request())
|
|
input.logValues(log).Trace("Running request handler")
|
|
result, err := p.Query(input)
|
|
if err != nil {
|
|
log.Err(err).Error("Error evaulating policy")
|
|
return nil, nil
|
|
}
|
|
r, err := result.Response(ctx)
|
|
if err != nil {
|
|
log.Err(err).Error("Error generating response")
|
|
return nil, nil
|
|
}
|
|
return nil, r
|
|
})
|
|
}
|
|
|
|
func NewDialHandler(p *Policy) proxy.DialHandler {
|
|
log := logger.StandardLog.Value("policy", p.name)
|
|
return proxy.DialHandlerFunc(func(ctx proxy.Context, req *http.Request) (net.Conn, error) {
|
|
input := NewInputFromRequest(ctx, req)
|
|
input.logValues(log).Trace("Running dial handler")
|
|
result, err := p.Query(input)
|
|
if err != nil {
|
|
log.Err(err).Error("Error evaulating policy")
|
|
return nil, nil
|
|
}
|
|
r, err := result.Response(ctx)
|
|
if err != nil {
|
|
log.Err(err).Error("Error generating response")
|
|
return nil, nil
|
|
}
|
|
if r == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
c := netutil.NewLoopback()
|
|
|
|
go func(c net.Conn) {
|
|
s := &http.Server{
|
|
Handler: http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
|
|
r.Write(w)
|
|
}),
|
|
}
|
|
_ = s.Serve(&netutil.AcceptOnce{Conn: c})
|
|
}(c.Server)
|
|
|
|
return c.Client, nil
|
|
})
|
|
}
|
|
|
|
func NewForwardHandler(p *Policy) proxy.ForwardHandler {
|
|
log := logger.StandardLog.Value("policy", p.name)
|
|
return proxy.ForwardHandlerFunc(func(ctx proxy.Context, req *http.Request) (*http.Response, error) {
|
|
input := NewInputFromRequest(ctx, req)
|
|
input.logValues(log).Trace("Running forward handler")
|
|
result, err := p.Query(input)
|
|
if err != nil {
|
|
log.Err(err).Error("Error evaulating policy")
|
|
return nil, nil
|
|
}
|
|
return result.Response(ctx)
|
|
})
|
|
}
|
|
|
|
func NewResponseHandler(p *Policy) proxy.ResponseHandler {
|
|
log := logger.StandardLog.Value("policy", p.name)
|
|
return proxy.ResponseHandlerFunc(func(ctx proxy.Context) *http.Response {
|
|
input := NewInputFromResponse(ctx, ctx.Response())
|
|
result, err := p.Query(input)
|
|
if err != nil {
|
|
log.Err(err).Error("Error evaulating policy")
|
|
return nil
|
|
}
|
|
r, err := result.Response(ctx)
|
|
if err != nil {
|
|
log.Err(err).Error("Error generating response")
|
|
return nil
|
|
}
|
|
return r
|
|
})
|
|
}
|