Skip to content

Instantly share code, notes, and snippets.

@ilyaglow
Created April 27, 2018 16:06
Show Gist options
  • Save ilyaglow/51b744c33727d5a87441d37b701a4060 to your computer and use it in GitHub Desktop.
Save ilyaglow/51b744c33727d5a87441d37b701a4060 to your computer and use it in GitHub Desktop.
package main
import (
"compress/gzip"
"flag"
"io"
"log"
"net/http"
"os"
)
func main() {
url := flag.String("url", "", "gz file URL")
saveName := flag.String("save", "", "location to save original file")
flag.Parse()
if *url == "" {
log.Fatal("URL is not set")
}
resp, err := http.Get(*url)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
var writePipes []*io.PipeWriter
gr, gw := io.Pipe()
writePipes = append(writePipes, gw)
var saveFile io.Writer
if *saveName != "" {
saveFile, err = os.Create(*saveName)
if err != nil {
log.Fatal(err)
}
defer saveFile.Close()
sr, sw := io.Pipe()
writePipes = append(writePipes, sw)
go func() {
if _, err := io.Copy(saveFile, sr); err != nil {
log.Fatal(err)
}
}()
}
wr := make([]io.Writer, len(writePipes))
for i := range writePipes {
wr[i] = writePipes[i]
}
mw := io.MultiWriter(wr...)
go func() {
if _, err := io.Copy(mw, resp.Body); err != nil {
log.Fatal(err)
}
for i := range writePipes {
writePipes[i].Close()
}
}()
g, err := gzip.NewReader(gr)
if err != nil {
log.Fatal(err)
}
defer g.Close()
if _, err := io.Copy(os.Stdout, g); err != nil {
log.Fatal(err)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment