假设我在Go中有一个中间件,我想Server
用自己的值覆盖任何现有的标头。
// Server attaches a Server header to the response.
func Server(h http.Handler, serverName string) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Server", serverName)
h.ServeHTTP(w, r)
})
}
然后我将其添加到这样的响应链中
http.Handle("/", authHandler)
http.ListenAndServe(":8000", Server(http.DefaultServeMux, "myapp"))
不幸的是,如果authHandler或由DefaultServeMux调用处理的任何事情w.Header().Add("Server", "foo")
(例如,httputil.ReverseProxy.ServeHTTP),我最终在响应中会有两个Server标头。
$ http localhost:5962/v1/hello_world
HTTP/1.1 200 OK
Content-Length: 11
Content-Type: text/plain
Date: Tue, 12 Jul 2016 04:54:04 GMT
Server: inner-middleware
Server: myapp
我真正想要的是这样的:
// Server attaches a Server header to the response.
func Server(h http.Handler, serverName string) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
h.ServeHTTP(w, r)
w.Header().Set("Server", serverName)
})
}
但是,ServeHTTP的语义不允许这样做:
ServeHTTP应该将回复标头和数据写入ResponseWriter,然后返回。返回信号表明请求已完成;在ServeHTTP调用完成之后或与之同时使用ResponseWriter或从Request.Body中读取是无效的。
我已经看到一些与此有关的丑陋骇客,例如httputil.ReverseProxy.ServeHTTP中的代码,该代码复制标头并重写响应代码,或者使用httptest.ResponseRecorder将整个正文读入字节缓冲区。
我也可以颠倒传统的中间件顺序,并以某种方式将Server中间件放在最后,或者使其成为最内部的中间件。
我缺少任何简单的方法吗?
您可以定义一个自定义类型,该类型将包装ResponseWriter并在写入所有标头之前插入Server标头,但要付出额外的间接层费用。这是一个例子:
type serverWriter struct {
w http.ResponseWriter
name string
wroteHeader bool
}
func (s serverWriter) WriteHeader(code int) {
if s.wroteHeader == false {
s.w.Header().Set("Server", s.name)
s.wroteHeader = true
}
s.w.WriteHeader(code)
}
func (s serverWriter) Write(b []byte) (int, error) {
return s.w.Write(b)
}
func (s serverWriter) Header() http.Header {
return s.w.Header()
}
// Server attaches a Server header to the response.
func Server(h http.Handler, serverName string) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
sw := serverWriter{
w: w,
name: serverName,
wroteHeader: false,
}
h.ServeHTTP(sw, r)
})
}
我在这里写了更多有关此的内容。https://kev.inburke.com/kevin/how-to-write-go-middleware/
问题内容: 我需要将CORS设置为在express服务的脚本上启用。如何为公共/资产在这些返回的响应中设置标题? 问题答案: npm上至少有一个中间件用于处理Express中的CORS:cors。[请参阅@mscdex答案] 这是从ExpressJS DOC 设置自定义响应头的方法 将标题字段设置为值 或传递一个对象以一次设置多个字段。 别名为
问题内容: 这段代码在main方法内部。当我运行此代码时,将启动firefox,但不会遵循google url,并且代理未设置为我在上面的代码中指定的代理。我怎样才能解决这个问题? 问题答案: 由于存在错误,您目前无法使用Proxy对象。您应该使用以下代码 该错误已在https://github.com/mozilla/geckodriver/issues/764上讨论,您将在下面的链接中看到Ma
问题内容: 这是我的代码: 但是,当我从浏览器向服务器发出请求时,出现此错误: 我也尝试过这种方法,在请求之后设置响应头: 没有骰子。我犯了同样的错误。有没有一种方法可以只在route函数中设置响应头?这样的事情将是理想的: 但我还是找不到这样做。请帮忙。 编辑 如果我使用POST请求卷曲URL,如下所示: 我得到这个回应: 有任何想法吗? 问题答案: 你可以很容易地做到这一点: 查看和 但是有些
问题内容: 我对python的urllib很陌生。我需要做的是为发送到服务器的请求设置自定义标头。具体来说,我需要设置Content- type和Authorizations标头。我已经研究了python文档,但是找不到。 问题答案: 使用urllib2添加HTTP标头: 从文档:
如果您想使用 Nginx 作为 Gitea 的反向代理服务,您可以参照以下 nginx.conf 配置中 server 的 http 部分: server { listen 80; server_name git.example.com; location / { proxy_pass http://localhost:3000; } } 使用
我们有一个使用node js(express js)构建的web应用程序,它位于nginx后面。 对于特定的API,我们希望将内容类型响应头设置为“text/plain”。控制器中有以下代码。 res.setHeader('Content-Type','text/plain');res.send(响应); 当服务器不在nginx后面时,这是有效的。但是当服务器在nginx后面时,响应头仍然是“应用