【问题标题】:Serving Static Files with a HTTP 500 Status以 HTTP 500 状态提供静态文件
【发布时间】:2015-06-18 17:53:51
【问题描述】:

有没有办法在 Go 中使用自定义状态代码通过 HTTP 提供静态文件(无需重写大量私有代码)?

据我所知:

  1. http.ServeFile 调用辅助函数http.serveFile
  2. 在确定文件/目录的修改时间和大小(以及是否存在)后,它会调用http.ServeContent
  3. 最后,http.serveContent 被调用,它设置了正确的标头(Content-Type、Content-Length)并设置了一个http.StatusOK 标头here

我想我已经知道了这个问题的答案,但如果有人有替代解决方案,它会很有用。

用例服务于 500.html、404.html 等。 al 文件。我通常会使用 nginx 来捕获 Go 通常的普通 http.Error 响应,并让 nginx 从磁盘上提供文件,但我所处的环境不能这样做。

【问题讨论】:

    标签: go


    【解决方案1】:

    包裹http.ResponseWriter:

    type MyResponseWriter struct {
        http.ResponseWriter
        code int
    }
    
    func (m MyResponseWriter) WriteHeader(int) {
        m.ResponseWriter.WriteHeader(m.code)
    }
    

    然后(对于 HTTP 500):

    http.ServeFile(MyResponseWriter{rw, 500}, rq, "file.name")
    

    其中rw 是“实际”http.ResponseWriterrq*http.Request 对象。

    【讨论】:

    • 不错,简单干净。 +1
    • 完美——我完全忘记了我可以将其作为临时措施(也是相当不错的选择)。非常感谢。
    • http.ResponseWriter 包装特有的一个警告是“可选” ResponseWriter 接口(@98​​7654329@、http.CloseNotifierhttp.Hijacker)的处理方式,这意味着如果你只是做简单的包装你'将失去原始作者的那些“可选”功能(rw 此处)。通常这不是问题,但需要注意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 2014-01-08
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    相关资源
    最近更新 更多