首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将ServeMux与ServerConn结合使用?

如何将ServeMux与ServerConn结合使用?
EN

Stack Overflow用户
提问于 2015-04-30 01:38:44
回答 1查看 115关注 0票数 1

我创建了一个网络API,希望人们能够使用ServeMux将请求路由到特定的端点。我不需要使用服务器实例,而是需要使用自己的低级别ServerConn。这是因为我从同一个端口接收传入的HTTP请求和纯文本数据。

但是,问题是,如果我想使用我的ServeMux转发请求,我将使用它的ServeHTTP方法。为此,我需要提供一个ResponseWriter,我不知道如何创建一个实例,因为它是一个接口,而不是一个结构。我应该创建自己的ResponseWriter结构吗?有戈朗标准图书馆提供的吗?还是有其他的解决方案呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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重放您在第一次读取时读取的第一个区块。类似于:

代码语言:javascript
复制
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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29957596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档