简体   繁体   中英

How do I properly add a checksum header to this?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM