From dca59d0eda15f6b08a3ccb596f56cbdc69f32fba Mon Sep 17 00:00:00 2001 From: Matthew Holt Date: Thu, 29 Jan 2015 17:17:59 -0700 Subject: [PATCH] Stubbed out really basic proxy middleware --- middleware/middleware.go | 1 + middleware/proxy.go | 50 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 middleware/proxy.go diff --git a/middleware/middleware.go b/middleware/middleware.go index f4411f862..848786a58 100644 --- a/middleware/middleware.go +++ b/middleware/middleware.go @@ -17,6 +17,7 @@ func init() { register("rewrite", Rewrite) register("redir", Redirect) register("ext", Extensionless) + register("proxy", Proxy) register("fastcgi", FastCGI) } diff --git a/middleware/proxy.go b/middleware/proxy.go new file mode 100644 index 000000000..5a99f8f0a --- /dev/null +++ b/middleware/proxy.go @@ -0,0 +1,50 @@ +package middleware + +import ( + "log" + "net/http" + "strings" +) + +// Proxy is middleware that proxies requests. +func Proxy(p parser) Middleware { + var rules []proxyRule + + for p.Next() { + rule := proxyRule{} + + if !p.Args(&rule.from, &rule.to) { + return p.ArgErr() + } + + rules = append(rules, rule) + } + + return func(next http.HandlerFunc) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + for _, rule := range rules { + if Path(r.URL.Path).Matches(rule.from) { + client := &http.Client{} + + r.RequestURI = "" + r.URL.Scheme = strings.ToLower(r.URL.Scheme) + + resp, err := client.Do(r) + if err != nil { + log.Fatal(err) + } + resp.Write(w) + + } else { + next(w, r) + } + } + } + } +} + +type proxyRule struct { + from string + to string +}