package main import ( "errors" "net" "net/http" "net/http/httputil" "net/url" "strings" "time" ) type Proxy map[string]*url.URL func (p *Proxy) Decode(value string) error { proxy := make(Proxy) for _, mapping := range strings.Split(value, ";") { parts := strings.Split(mapping, ",") for i := range parts { parts[i] = strings.TrimSpace(parts[i]) } if parts[0] == "" || len(parts) != 2 { return errors.New("bad proxy map") } url, err := url.Parse(parts[1]) if err != nil { return err } proxy[parts[0]] = url } *p = proxy return nil } func proxyHandler(target *url.URL) *httputil.ReverseProxy { p := httputil.NewSingleHostReverseProxy(target) p.FlushInterval = 100 * time.Millisecond p.Transport = &http.Transport{ Proxy: http.ProxyFromEnvironment, Dial: (&net.Dialer{ Timeout: 10 * time.Second, }).Dial, } return p }