如果已设置标头,如何使用自定义的HTTP处理程序/中间件?

格雷格:

我正在尝试链接HTTP处理程序以提供一些附加功能,例如:

package router

import (
    // snip
    "github.com/gorilla/mux"
    "github.com/gorilla/handlers"
    "net/http"
)

// snip

r := mux.NewRouter()
/* routing code */
var h http.Handler
h = r
if useGzip {
    h = handlers.CompressHandler(h)
}
if useLogFile {
    fn := pathToLog
    accessLog, err := os.OpenFile(fn, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666)
    if err != nil {
        panic(err)
    }
    h = handlers.CombinedLoggingHandler(accessLog, h)
}

// etc...

问题是,如果大猩猩/多路复用器路由器指向的控制器之一已经设置了任何HTTP标头(例如w.WriteHeader(404)w.Header().Set("Content-Type", "application/json")),这将无声地破坏任何试图设置或添加自己标头的“包装器”处理程序,例如压缩处理程序我看不到任何错误,除非我忘记在某个地方抓到一个错误,但是浏览器得到的响应无效。

除了将标头存放在某个地方然后由最终处理程序编写它们之外,是否有任何优雅的方式来处理此问题?似乎那意味着要重写处理程序的代码,如果可能的话,我希望避免这样做。

亚历克斯·吉特曼:

致电后w.WriteHeader(404),标头会挂在线上。因此,您无法再添加它。最好的方法是缓冲状态代码,并将其写入链的末尾。

例如,您可以提供您自己的包装程序http.ResponseWriter,以重新执行WriteHeader()以保存状态值。然后添加方法Commit()以实际编写它。调用Commit()最后一个处理程序。当然,您必须以某种方式确定哪个处理程序是最后一个。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

根据要求在Django中间件中添加自定义标头

自定义中间件从 HttpClient 响应注入标头

Django自定义中间件检查标头令牌。使用有效请求标头令牌的测试仍然失败

在 express 应用程序中使用 fs 使用中间件时设置标头的问题

在中间件中设置标头

Asp.Net Core Web应用程序:使用IExceptionFilter与自定义中间件进行全局异常处理

如何在Scotty中使用静态中间件设置标头?

LARAVEL-使用限速中间件时自定义响应头

如何使用中间件向响应添加标头?

自定义中间件异常处理程序响应内容未通过

如何使用phpmailer设置自定义标头

如何使用PJAX设置自定义xhr标头?

如何在Stradi中设置自定义中间件?

如何在Django中设置自定义中间件

在OAuthBearer中间件上使用自定义RoleClaimType

在 Laravel 的自定义中间件中使用会话

添加自定义中间件

如何使用自定义中间件向路由添加“异步”?

如何在自定义中间件中使用csurf?

如何使用laravel通过auth中间件开发自定义登录

如何在自定义中间件中使用redux-persist

在api模式下使用rails 5时如何创建自定义中间件?

如何解决 redux 错误 使用自定义中间件进行异步操作?

如何在Sails.js中使用自定义路由中间件?(ExpressJS)

从外部Go中间件控制HTTP标头

如何为Spring Boot应用程序设置自定义Http标头“服务器”

可能未处理的承诺拒绝:错误:操作必须是普通对象。使用自定义中间件进行异步操作

设置和检索自定义HTTP标头

Redux中间件问题-错误:操作必须是纯对象。使用自定义中间件进行异步操作