当前位置: 首页 > 面试题库 >

如何在Go服务器中设置HTTP预告片?

杜正奇
2023-03-14
问题内容

我想通过在写出响应主体时对其进行哈希处理来计算响应的实体标签。到我计算实体标签时,将实体标签添加到响应标头为时已晚。我想将实体标签添加到预告片中。我看到net
/ http包支持编写预告片,但我不知道如何使用它们。

预告片代码位于https://golang.org/src/pkg/net/http/transfer.go中。如何在应用程序中设置预告片?


问题答案:

使用bytes.Buffer,然后将其包装为散列,例如:

type HashedBuffer struct {
    h hash.Hash
    b bytes.Buffer
}

func NewHashedBuffer(h hash.Hash) *HashedBuffer {
    return &HashedBuffer{h: h}
}

func (h *HashedBuffer) Write(p []byte) (n int, err error) {
    n, err = h.b.Write(p)
    h.h.Write(p)
    return
}

func (h *HashedBuffer) Output(w http.ResponseWriter) {
    w.Header().Set("ETag", hex.EncodeToString(h.h.Sum(nil)))
    h.b.WriteTo(w)
}

//handler
func Handler(w http.ResponseWriter, r *http.Request) {
    hb := NewHashedBuffer(sha256.New())
    hb.Write([]byte("stuff"))
    hb.Output(w)
}

截至目前,您无法设置预告片标头,这是一个未解决的问题。

有一种解决方法,劫持连接(来自上述问题):

// TODO: There's no way yet for the server to set trailers
// without hijacking, so do that for now, just to test the client.
// Later, in Go 1.4, it should be be implicit that any mutations
// to w.Header() after the initial write are the trailers to be
// sent, if and only if they were previously declared with
// w.Header().Set("Trailer", ..keys..)
w.(Flusher).Flush()
conn, buf, _ := w.(Hijacker).Hijack()
t := Header{}
t.Set("Server-Trailer-A", "valuea")
t.Set("Server-Trailer-C", "valuec") // skipping B
buf.WriteString("0\r\n")            // eof
t.Write(buf)
buf.WriteString("\r\n") // end of trailers
buf.Flush()
conn.Close()


 类似资料:
  • 问题内容: 我实际上正在对ExpressJS服务器进行一些负载测试,并且我注意到服务器发送的响应包括一个“ Connection:Keep- Alive”标头。据我了解,该连接将保持打开状态,直到服务器或客户端发送“ Connection:Close”标头为止。 在某些实现中,“ Connection:Keep-Alive”标头带有“ Keep-Alive”标头,用于设置连接超时和通过该连接发送的

  • 我使用PHP-S127.0.0.1:4242命令在本地主机上为php文件启动development server。但我想,我不应该在生产中使用这个东西。目前我正在尝试在VPS上设置我的网站,我不知道如何在端口4242上永远使用ssh启动php服务器。我知道,这可能是很愚蠢的问题,这是我第一次与真正的主持工作 如有任何帮助,我将不胜感激:)

  • 通过设置本地计算机、开发服务器、中间服务器或生产服务器作为测试服务器,测试动态网页或内容。 如果您计划使用服务器端语言(如 PHP)开发动态页,请设置一个测试服务器以便在您进行操作时生成并显示动态内容。 测试服务器可以是本地计算机、开发服务器、中间服务器或生产服务器。 要详细了解测试服务器的用途,请参阅 David Powers 的文章 Setting up a local testing ser

  • 问题内容: 所以我用Go编写了这个RESTful后端,它将通过跨站点HTTP请求来调用,即从另一个站点(实际上,只是另一个端口,但是同源策略启动了,所以我们来了)提供的内容中调用。 在这种情况下,在某些情况下,用户代理将发送预检OPTIONS请求,以检查实际请求是否可以安全发送。 我的问题是如何在Go上下文中最好地处理和充分响应这些预检请求。我构想的方法感觉不太优雅,我想知道是否还有其他我没有想到

  • 我正在使用一个AmazonUbuntuEC2实例,它只有一个命令行界面。我想为该服务器设置UI,以便使用远程桌面工具进行访问。有没有办法将GUI应用于EC2实例?

  • 问题内容: 我有自己的域名,使用Go编写了Web服务。我正在使用内置的Go Web服务器,前面没有Nginx或Apache。 我想开始通过HTTPS服务,我意识到让我们加密即将成为实现此目的的途径。 任何人都可以共享配置在Linux服务器上运行的Go应用程序的整个设置过程吗? 问题答案: 这是使用我发现的Go and Let’s Encrypt证书对HTTPS服务器进行的最小自动设置: 有关aut