| // ui-api-proxy is a reverse http proxy that allows the UI to be served from | 
 | // a different host than the API. This allows testing new UI features served | 
 | // from localhost but using live production data. | 
 | // | 
 | // Run the binary, download & install the Go tools available at | 
 | // http://golang.org/doc/install . To run, execute `go run ui-api-proxy.go`. | 
 | // For a description of the available flags, execute | 
 | // `go run ui-api-proxy.go --help`. | 
 | package main | 
 |  | 
 | import ( | 
 | 	"flag" | 
 | 	"fmt" | 
 | 	"log" | 
 | 	"net" | 
 | 	"net/http" | 
 | 	"net/http/httputil" | 
 | 	"net/url" | 
 | 	"strings" | 
 | 	"time" | 
 | ) | 
 |  | 
 | var ( | 
 | 	ui   = flag.String("ui", "http://localhost:8080", "host to which ui requests will be forwarded") | 
 | 	api  = flag.String("api", "https://gerrit-review.googlesource.com", "host to which api requests will be forwarded") | 
 | 	port = flag.Int("port", 0, "port on which to run this server") | 
 | ) | 
 |  | 
 | func main() { | 
 | 	flag.Parse() | 
 |  | 
 | 	uiURL, err := url.Parse(*ui) | 
 | 	if err != nil { | 
 | 		log.Fatalf("proxy: parsing ui addr %q failed: %v\n", *ui, err) | 
 | 	} | 
 | 	apiURL, err := url.Parse(*api) | 
 | 	if err != nil { | 
 | 		log.Fatalf("proxy: parsing api addr %q failed: %v\n", *api, err) | 
 | 	} | 
 |  | 
 | 	l, err := net.Listen("tcp", fmt.Sprintf("127.0.0.1:%v", *port)) | 
 | 	if err != nil { | 
 | 		log.Fatalln("proxy: listen failed: ", err) | 
 | 	} | 
 | 	defer l.Close() | 
 | 	fmt.Printf("OK\nListening on http://%v/\n", l.Addr()) | 
 |  | 
 | 	err = http.Serve(l, &httputil.ReverseProxy{ | 
 | 		FlushInterval: 500 * time.Millisecond, | 
 | 		Director: func(r *http.Request) { | 
 | 			if strings.HasPrefix(r.URL.Path, "/changes/") || strings.HasPrefix(r.URL.Path, "/projects/") { | 
 | 				r.URL.Scheme, r.URL.Host = apiURL.Scheme, apiURL.Host | 
 | 			} else { | 
 | 				r.URL.Scheme, r.URL.Host = uiURL.Scheme, uiURL.Host | 
 | 			} | 
 | 			if r.URL.Scheme == "" { | 
 | 				r.URL.Scheme = "http" | 
 | 			} | 
 | 			r.Host, r.URL.Opaque, r.URL.RawQuery = r.URL.Host, r.RequestURI, "" | 
 | 		}, | 
 | 	}) | 
 | 	if err != nil { | 
 | 		log.Fatalln("proxy: serve failed: ", err) | 
 | 	} | 
 | } |