/* * Tool for replaying http requests from a file of base64 encoded, line-delimited Go http raw requests. Credits to https://gist.github.com/kasey/c9e663eae5baebbf8fbe548c2b1d961b. */ package main import ( "bufio" "bytes" "encoding/base64" "flag" "io" "net/http" "net/url" "os" "path" log "github.com/sirupsen/logrus" ) var ( filePath = flag.String("file", "", "file of line-delimited, base64-encoded Go http requests") endpoint = flag.String("endpoint", "http://localhost:14268/api/traces", "host:port endpoint to make HTTP requests to") ) func main() { flag.Parse() if *filePath == "" { log.Fatal("Must provide --file") } f, err := os.Open(path.Clean(*filePath)) if err != nil { log.Fatal(err) } defer func() { if err := f.Close(); err != nil { log.WithError(err).Error("Could not close stdout file") } }() lr := bufio.NewReader(f) for { line, err := lr.ReadBytes([]byte("\n")[0]) if err == io.EOF { os.Exit(0) } if err != nil { log.Fatal(err) } line = line[0 : len(line)-1] decoded := make([]byte, base64.StdEncoding.DecodedLen(len(line))) _, err = base64.StdEncoding.Decode(decoded, line) if err != nil { log.Fatal(err) } dbuf := bytes.NewBuffer(decoded) req, err := http.ReadRequest(bufio.NewReader(dbuf)) if err != nil { log.Fatal(err) } parsed, err := url.Parse(*endpoint) if err != nil { log.Fatal(err) } req.URL = parsed req.RequestURI = "" log.Println(req) resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } respBuf := bytes.NewBuffer(nil) if err := resp.Write(respBuf); err != nil { log.Fatal(err) } log.Println(respBuf.String()) } }