func (t *tcpTran) NewDialer(addr string, sock mangos.Socket) (mangos.PipeDialer, error) { var err error d := &dialer{sock: sock, opts: newOptions()} if addr, err = mangos.StripScheme(t, addr); err != nil { return nil, err } if d.addr, err = mangos.ResolveTCPAddr(addr); err != nil { return nil, err } return d, nil }
// NewAccepter implements the Transport NewAccepter method. func (t *tlsTran) NewListener(addr string, sock mangos.Socket) (mangos.PipeListener, error) { var err error l := &listener{sock: sock, opts: newOptions(t)} if addr, err = mangos.StripScheme(t, addr); err != nil { return nil, err } if l.addr, err = mangos.ResolveTCPAddr(addr); err != nil { return nil, err } return l, nil }
func (l *listener) Listen() error { var taddr *net.TCPAddr var err error var tcfg *tls.Config if l.iswss { v, ok := l.opts[mangos.OptionTLSConfig] if !ok || v == nil { return mangos.ErrTLSNoConfig } tcfg = v.(*tls.Config) if tcfg.Certificates == nil || len(tcfg.Certificates) == 0 { return mangos.ErrTLSNoCert } } // We listen separately, that way we can catch and deal with the // case of a port already in use. This also lets us configure // properties of the underlying TCP connection. if taddr, err = mangos.ResolveTCPAddr(l.url.Host); err != nil { return err } if tlist, err := net.ListenTCP("tcp", taddr); err != nil { return err } else if l.iswss { l.listener = tls.NewListener(tlist, tcfg) } else { l.listener = tlist } l.pending = nil l.running = true l.htsvr = &http.Server{Addr: l.url.Host, Handler: l.mux} go l.htsvr.Serve(l.listener) return nil }