Skip to content

Instantly share code, notes, and snippets.

@dikaeinstein
Last active July 5, 2019 10:48
Show Gist options
  • Select an option

  • Save dikaeinstein/179e0f7388f02723aad45cab006ed6b9 to your computer and use it in GitHub Desktop.

Select an option

Save dikaeinstein/179e0f7388f02723aad45cab006ed6b9 to your computer and use it in GitHub Desktop.
A basic reverse proxy with CORS
package main
import (
"flag"
"fmt"
"log"
"net/http"
"net/http/httputil"
"net/url"
)
type ReverseProxyHandler struct {
target *url.URL
proxy *httputil.ReverseProxy
}
func (rph ReverseProxyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
w.Header().Set("Access-Control-Allow-Headers", "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
r.URL.Host = rph.target.Host
r.URL.Scheme = rph.target.Scheme
r.Header.Set("X-Forwarded-Host", r.Header.Get("Host"))
r.Host = rph.target.Host
rph.proxy.ServeHTTP(w, r)
}
func main() {
const PORT = 8080
u := flag.String("host", "", "backend URL host to proxy request to")
flag.Parse()
target, _ := url.Parse(*u)
reverseProxyHandler := ReverseProxyHandler{target: target, proxy: httputil.NewSingleHostReverseProxy(target)}
http.Handle("/", reverseProxyHandler)
log.Printf("Proxy server listening on port: %d", PORT)
log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", PORT), nil))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment