我创建了一个网络API,希望人们能够使用ServeMux将请求路由到特定的端点。我不需要使用服务器实例,而是需要使用自己的低级别ServerConn。这是因为我从同一个端口接收传入的HTTP请求和纯文本数据。
但是,问题是,如果我想使用我的ServeMux转发请求,我将使用它的ServeHTTP方法。为此,我需要提供一个ResponseWriter,我不知道如何创建一个实例,因为它是一个接口,而不是一个结构。我应该创建自己的ResponseWriter结构吗?有戈朗标准图书馆提供的吗?还是有其他的解决方案呢?
发布于 2015-04-30 13:52:44
如果可能的话,我会完全避免这样做。在同一连接上混合协议必然会导致难以跟踪的错误和意外行为。如果您真的想这样做,并且所有的http/1.1机制都能正常工作,那么请尽可能多地留给http包。
因为ResponseWriter是一个接口,所以您可以实现自己的类型来满足它。有关完整的示例,请查看http包中未导出的response类型。有很多事情要做,将它与ServerConn (被记录为“不使用”)结合使用可能不是一个好主意。
在较低级别上这样做的地方应该在服务器的Accept中的net.Listener中。由于您需要两次解析每个请求的开始,所以您需要一个可以部分“回绕”的net.Conn。
让自己成为一个检查新连接上流的开始的net.Listener,如果它看起来像一个http请求,则返回一个net.Conn,该net.Conn重放您在第一次读取时读取的第一个区块。类似于:
type replayConn struct {
net.Conn
buf []byte
pos int
}
func (c *replayConn) Read(b []byte) (int, error) {
if c.pos < len(c.buf) {
n := copy(b, c.buf[c.pos:])
c.pos += n
return n, nil
}
return c.Conn.Read(b)
}如果连接不是http,那么将连接发送到其他类型的处理程序,并继续阻塞Accept。
https://stackoverflow.com/questions/29957596
复制相似问题