I'd like to know some kind of file checksum (like SHA-256 hash, or anything else) when I start downloading a file from HTTP server. It could be transferred as one of HTTP response headers.
I know http etag is something similar, I think, but this is Golang which I am new to learning and although I have looked through some documentation, I am still clueless. This is what I have so far:
package main
import (
"flag"
"fmt"
"log"
"net/http"
"strconv"
)
const (
crlf = "\r\n"
colonspace = ": "
)
func Checksum(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
func HandleFunc(pattern string, handler func(ResponseWriter, *Request))
})
}
// Do not change this function.
func main() {
var listenAddr = flag.String("http", ":8080", "address to listen on for HTTP")
flag.Parse()
http.Handle("/", Checksum(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("X-Foo", "bar")
w.Header().Set("Content-Type", "text/plain")
w.Header().Set("Date", "Sun, 08 May 2016 14:04:53 GMT")
msg := "Curiosity is insubordination in its purest form.\n"
w.Header().Set("Content-Length", strconv.Itoa(len(msg)))
fmt.Fprintf(w, msg)
})))
log.Fatal(http.ListenAndServe(*listenAddr, nil))
}
Write a wrapper around an http.ResponseWriter to capture the response body and status:
type rwWrapper struct {
http.ResponseWriter
buf bytes.Buffer
status int
}
func (w *rwWrapper) Write(p []byte) (int, error) {
return rw.buf.Write(p)
}
func (w *rwWrapper) WriteHeader(status int) {
rw.status = status
}
After the handler returns, checksum the body, set the header and then write the body to the underlying response writer:
func Checksum(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
ww := &rwWrapper{ResponseWriter: w, status:200}
h.ServeHttp(ww, r)
// compute checksum of ww.buf.Bytes() here
w.Header().Set("nameOfHeader", checksum)
w.WriteHeader(ww.status)
w.Write(ww.buf.Bytes())
})
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.