package main
import (
"crypto"
"fmt"
"net"
"net/http"
"os"
"strconv"
"time"
"github.com/chipaca/progress"
_ "golang.org/x/crypto/sha3"
)
func die(msg interface{}) {
fmt.Fprintln(os.Stderr, msg)
os.Exit(1)
}
func main() {
if len(os.Args) != 3 {
die("usage: schmurl <URL> <SHA3-384>")
}
tr := &http.Transport{
Proxy: http.ProxyFromEnvironment,
Dial: (&net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 10 * time.Millisecond,
}).Dial,
TLSHandshakeTimeout: 10 * time.Second,
ExpectContinueTimeout: 1 * time.Second,
}
client := &http.Client{Transport: tr}
rsp, err := client.Get(os.Args[1])
if err != nil {
die(err)
}
toRead, err := strconv.ParseInt(rsp.Header.Get("content-length"), 10, 64)
if err != nil {
die(err)
}
bar := progress.Bar{
ToRead: toRead,
}
h := crypto.SHA3_384.New()
if _, err := bar.Copy(h, rsp.Body); err != nil {
die(err)
}
sha := fmt.Sprintf("%x", h.Sum(nil))
fmt.Println("\ngot sha:", sha)
if os.Args[2] != sha {
die("bad SHA")
}
fmt.Println("OK")
}