douci1541 2017-01-26 19:55
浏览 73
已采纳

如何正确地为此添加校验和标头?

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. Any help would be appreciated. This is what I have so far:

package main

import (
    "flag"
    "fmt"
    "log"
    "net/http"
    "strconv"
)

const (
    crlf       = "
"
    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.
"
        w.Header().Set("Content-Length", strconv.Itoa(len(msg)))
        fmt.Fprintf(w, msg)
    })))

    log.Fatal(http.ListenAndServe(*listenAddr, nil))
}
  • 写回答

1条回答 默认 最新

  • duaiwu8385 2017-01-26 20:20
    关注

    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())
      })
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探