 00e5dc600b
			
		
	
	00e5dc600b
	
	
	
		
			
			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. Change-Id: I1cef74c995ac21f4310c5ced4c042ece59a1a8e8
		
			
				
	
	
		
			66 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // 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)
 | |
| 	}
 | |
| }
 |