package main import ( "bytes" "crypto/tls" "encoding/json" "flag" "fmt" "io" "io/ioutil" "log" "net/http" "net/url" "os" "os/exec" "path" "strings" "gopkg.in/yaml.v2" ) var flags struct { addr string proxyURL string proxyClientCert string proxyClientKey string proxyMinikube bool } func init() { flag.StringVar(&flags.addr, "addr", "localhost:8080", "Address to listen on") flag.StringVar(&flags.proxyURL, "proxy-url", "", "Proxy requests to this URL") flag.StringVar(&flags.proxyClientCert, "proxy-client-cert", "", "Client certificate to use when connecting to proxy") flag.StringVar(&flags.proxyClientKey, "proxy-client-key", "", "Client key to use when connecting to proxy") flag.BoolVar(&flags.proxyMinikube, "proxy-minikube", false, "Shortcut for -proxy-url https://$(minikube ip):8443 -proxy-client-cert ~/.minikube/client.crt -proxy-client-key ~/.minikube/client.key") } var responses Responses func main() { flag.Parse() if flags.proxyMinikube { err := proxyMinikube() if err != nil { log.Fatalf("Error: Setting up Minikube proxy: %s", err) } } var responsesPath string if flag.NArg() == 1 { responsesPath = flag.Arg(0) } requestLog := Log(make([]LogEntry, 0)) http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { responses.Load(responsesPath) var resp *http.Response if flags.proxyURL != "" { resp = respondWithProxy(flags.proxyURL, w, req) } else { resp = respondWithStub(responses, w, req) } userAgent := req.Header.Get("User-Agent") log.Printf("%s %s - %d (%s, %q)", req.Method, req.URL, resp.StatusCode, req.RemoteAddr, userAgent) requestLog.Log(req, resp) }) http.HandleFunc("/_log", func(w http.ResponseWriter, req *http.Request) { if strings.Contains(req.Header.Get("Accept"), "application/yaml") { rs := make([]Response, len(requestLog)) for i, log := range requestLog { rs[i] = log.AsResponse() } err := renderYAML(w, rs) if err != nil { log.Printf("Error: Render log: %s", err) } return } for i := len(requestLog) - 1; i >= 0; i-- { w.Write([]byte("------------------------------------------------------\n")) requestLog[i].Request().Write(w) w.Write([]byte("\n")) requestLog[i].Response().Write(w) w.Write([]byte("\n")) } }) http.HandleFunc("/_help", func(w http.ResponseWriter, req *http.Request) { urls := []struct { URL string Summary string }{ {URL: "/_log", Summary: "View all received requests with responses"}, {URL: "/_help", Summary: "This help"}, } fmt.Fprint(w, `
%s - %s