当前位置: 首页>>代码示例>>Golang>>正文


Golang Context.Misc方法代码示例

本文整理汇总了Golang中github.com/Gaboose/go-multiaddr-net/match.Context.Misc方法的典型用法代码示例。如果您正苦于以下问题:Golang Context.Misc方法的具体用法?Golang Context.Misc怎么用?Golang Context.Misc使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在github.com/Gaboose/go-multiaddr-net/match.Context的用法示例。


在下文中一共展示了Context.Misc方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。

示例1: Apply

func (_ IP) Apply(m ma.Multiaddr, side int, ctx match.Context) error {
	p := m.Protocols()[0]
	name := p.Name
	s, _ := m.ValueForProtocol(p.Code)

	mctx := ctx.Misc()
	ip := net.ParseIP(s)
	if ip == nil {
		return fmt.Errorf("incorrect ip %s", m)
	}

	switch name {
	case "ip4":
		if ip = ip.To4(); ip == nil {
			return fmt.Errorf("incorrect ip4 %s", m)
		}
	case "ip6":
		if ip = ip.To16(); ip == nil {
			return fmt.Errorf("incorrent ip6 %s", m)
		}
	}

	mctx.IPs = append(mctx.IPs, ip)
	return nil
}
开发者ID:Gaboose,项目名称:go-multiaddr-net,代码行数:25,代码来源:ip.go

示例2: Apply

func (w WS) Apply(m ma.Multiaddr, side int, ctx match.Context) error {
	var path string
	// ws client matches /http/ws too, so /ws might not be the first protocol
	for _, p := range m.Protocols() {
		if p.Name == "ws" {
			pth, err := m.ValueForProtocol(p.Code)
			if err != nil {
				return err
			}
			path = pth
			break
		}
	}
	sctx := ctx.Special()
	mctx := ctx.Misc()

	switch side {

	case match.S_Client:
		// resolve url
		var url string
		if mctx.Host != "" {
			// this will make mctx.Host appear in http request headers,
			// cloud servers often require that
			url = fmt.Sprintf("ws://%s/%s", mctx.Host, path)
		} else {
			switch t := sctx.NetConn.(type) {
			case *net.TCPConn:
				url = fmt.Sprintf("ws://%s/%s", t.RemoteAddr().String(), path)
			default:
				url = fmt.Sprintf("ws://foo.bar/%s", path)
			}
		}

		wcon, err := w.Select(sctx.NetConn, url)
		if err != nil {
			return err
		}
		sctx.NetConn = wcon
		return nil

	case match.S_Server:
		if mctx.HTTPMux == nil {
			// help the user out if /http is missing before /ws
			HTTP{}.Apply(m, match.S_Server, ctx)
		}
		ln, err := w.Handle(mctx.HTTPMux, "/"+path)
		if err != nil {
			return err
		}
		sctx.NetListener = ln
		sctx.CloseFn = ConcatClose(ln.Close, sctx.CloseFn)
		return nil

	}

	return fmt.Errorf("incorrect side constant")
}
开发者ID:Gaboose,项目名称:go-multiaddr-net,代码行数:58,代码来源:ws.go

示例3: Apply

func (p HTTP) Apply(m ma.Multiaddr, side int, ctx match.Context) error {
	mctx := ctx.Misc()
	sctx := ctx.Special()

	mctx.HTTPMux = p.Server(sctx.NetListener)

	ctx.Reuse(&httpreuser{ctx.Special().PreAddr})
	return nil
}
开发者ID:Gaboose,项目名称:go-multiaddr-net,代码行数:9,代码来源:http.go

示例4: Apply

func (t TCP) Apply(m ma.Multiaddr, side int, ctx match.Context) error {
	p := m.Protocols()[0]
	portstr, _ := m.ValueForProtocol(p.Code)

	port, err := strconv.Atoi(portstr)
	if err != nil {
		return err
	}

	mctx := ctx.Misc()
	sctx := ctx.Special()

	if len(mctx.IPs) == 0 {
		return fmt.Errorf("no ips in context")
	}

	switch side {

	case match.S_Client:
		var con net.Conn
		var err error
		if len(mctx.IPs) == 1 {
			con, err = t.Dial(mctx.IPs[0], port)
		} else {
			con, err = t.DialMany(mctx.IPs, port)
		}
		if err != nil {
			return err
		}

		sctx.NetConn = con
		sctx.CloseFn = con.Close
		return nil

	case match.S_Server:
		netln, err := t.Listen(mctx.IPs[0], port)
		if err != nil {
			return err
		}
		sctx.NetListener = netln
		sctx.CloseFn = netln.Close
		return nil

	}

	return fmt.Errorf("incorrect side constant")
}
开发者ID:Gaboose,项目名称:go-multiaddr-net,代码行数:47,代码来源:tcp.go

示例5: Apply

func (_ DNS) Apply(m ma.Multiaddr, side int, ctx match.Context) error {
	p := m.Protocols()[0]
	host, _ := m.ValueForProtocol(p.Code)

	ips, err := net.LookupIP(host)
	if err != nil {
		return err
	}

	if len(ips) == 0 {
		return fmt.Errorf("failed to resolve domain")
	}

	mctx := ctx.Misc()
	mctx.Host = host
	mctx.IPs = ips

	return nil
}
开发者ID:Gaboose,项目名称:go-multiaddr-net,代码行数:19,代码来源:dns.go

示例6: CopyTo

func (ctx context) CopyTo(target match.Context) {
	// shallow copy
	*target.Misc() = ctx.misc
	*target.Special() = ctx.special

	trg := target.Map()

	for k, val := range ctx.Map() {
		// If we want to allow pointers to structs in the map, we have to copy
		// one level deeper, i.e. instead of copying the pointer, reflect and
		// copy what it points to.
		rval := reflect.ValueOf(val)
		if rval.Kind() == reflect.Ptr {

			rv := reflect.New(rval.Type().Elem())
			rv.Elem().Set(rval.Elem())
			trg[k] = rv.Interface()

		} else {
			trg[k] = val
		}
	}
}
开发者ID:Gaboose,项目名称:go-multiaddr-net,代码行数:23,代码来源:context.go


注:本文中的github.com/Gaboose/go-multiaddr-net/match.Context.Misc方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。