如何将 ServeMux 与 ServerConn 一起使用?
How to Use ServeMux with ServerConn?
我正在创建一个网络 API 并希望人们能够使用 ServeMux. Instead of using a Server instance, I need to use my own low level ServerConn 将请求路由到特定端点。这是因为我从同一端口接收传入的 HTTP 请求和纯文本数据。
然而,问题是如果我想使用我的 ServeMux 转发请求,我会使用它的 ServeHTTP 方法。为此,我需要提供一个 ResponseWriter,我不知道如何创建它的实例,因为它是一个接口,而不是一个结构。我应该创建自己的 ResponseWriter 结构吗? Golang标准库有没有给出一个?或者是否有其他替代解决方案?
如果可能的话,我会完全避免这样做。在同一个连接上混合协议必然会导致难以追踪的错误和意外行为。如果你真的想这样做,并且让所有的 http/1.1 机制都正常工作,那么就把尽可能多的事情留给 http 包吧。
由于 ResponseWriter 是一个接口,您可以实现自己的类型来满足它。查看 http 包中未导出的 response
类型以获得完整示例。有很多地方需要改进,将它与 ServerConn(记录为 "do no use")结合使用可能不是一个好主意。
在较低级别执行此操作的位置将在服务器 net.Listener
内的 Accept
中。由于您将不得不对每个请求的开头进行两次解析,因此您需要一个可以是 "rewound" 的 net.Conn
部分。
自己做一个 net.Listener 来检查新连接上流的开始,如果它看起来像一个 http 请求,return 一个 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
。
我正在创建一个网络 API 并希望人们能够使用 ServeMux. Instead of using a Server instance, I need to use my own low level ServerConn 将请求路由到特定端点。这是因为我从同一端口接收传入的 HTTP 请求和纯文本数据。
然而,问题是如果我想使用我的 ServeMux 转发请求,我会使用它的 ServeHTTP 方法。为此,我需要提供一个 ResponseWriter,我不知道如何创建它的实例,因为它是一个接口,而不是一个结构。我应该创建自己的 ResponseWriter 结构吗? Golang标准库有没有给出一个?或者是否有其他替代解决方案?
如果可能的话,我会完全避免这样做。在同一个连接上混合协议必然会导致难以追踪的错误和意外行为。如果你真的想这样做,并且让所有的 http/1.1 机制都正常工作,那么就把尽可能多的事情留给 http 包吧。
由于 ResponseWriter 是一个接口,您可以实现自己的类型来满足它。查看 http 包中未导出的 response
类型以获得完整示例。有很多地方需要改进,将它与 ServerConn(记录为 "do no use")结合使用可能不是一个好主意。
在较低级别执行此操作的位置将在服务器 net.Listener
内的 Accept
中。由于您将不得不对每个请求的开头进行两次解析,因此您需要一个可以是 "rewound" 的 net.Conn
部分。
自己做一个 net.Listener 来检查新连接上流的开始,如果它看起来像一个 http 请求,return 一个 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
。