func (h *httpTransport) Listen(addr string, opts ...ListenOption) (Listener, error) { var options ListenOptions for _, o := range opts { o(&options) } var l net.Listener var err error // TODO: support use of listen options if h.opts.Secure || h.opts.TLSConfig != nil { config := h.opts.TLSConfig if config == nil { cert, err := mls.Certificate(addr) if err != nil { return nil, err } config = &tls.Config{Certificates: []tls.Certificate{cert}} } l, err = tls.Listen("tcp", addr, config) } else { l, err = net.Listen("tcp", addr) } if err != nil { return nil, err } return &httpTransportListener{ listener: l, }, nil }
func (h *httpTransport) Listen(addr string, opts ...ListenOption) (Listener, error) { var options ListenOptions for _, o := range opts { o(&options) } var l net.Listener var err error // TODO: support use of listen options if h.opts.Secure || h.opts.TLSConfig != nil { config := h.opts.TLSConfig fn := func(addr string) (net.Listener, error) { if config == nil { hosts := []string{addr} // check if its a valid host:port if host, _, err := net.SplitHostPort(addr); err == nil { if len(host) == 0 { hosts = getIPAddrs() } else { hosts = []string{host} } } // generate a certificate cert, err := mls.Certificate(hosts...) if err != nil { return nil, err } config = &tls.Config{Certificates: []tls.Certificate{cert}} } return tls.Listen("tcp", addr, config) } l, err = listen(addr, fn) } else { fn := func(addr string) (net.Listener, error) { return net.Listen("tcp", addr) } l, err = listen(addr, fn) } if err != nil { return nil, err } return &httpTransportListener{ ht: h, listener: l, }, nil }
func getTLSConfig(addr string) (*tls.Config, error) { hosts := []string{addr} // check if its a valid host:port if host, _, err := net.SplitHostPort(addr); err == nil { if len(host) == 0 { hosts = getIPAddrs() } else { hosts = []string{host} } } // generate a certificate cert, err := mls.Certificate(hosts...) if err != nil { return nil, err } return &tls.Config{Certificates: []tls.Certificate{cert}}, nil }
func (h *httpBroker) start() error { h.Lock() defer h.Unlock() if h.running { return nil } var l net.Listener var err error if h.opts.Secure || h.opts.TLSConfig != nil { config := h.opts.TLSConfig if config == nil { cert, err := mls.Certificate(h.address) if err != nil { return err } config = &tls.Config{Certificates: []tls.Certificate{cert}} } l, err = tls.Listen("tcp", h.address, config) } else { l, err = net.Listen("tcp", h.address) } if err != nil { return err } log.Printf("Broker Listening on %s", l.Addr().String()) h.address = l.Addr().String() go http.Serve(l, h.mux) go h.run(l) h.running = true return nil }
func (h *httpBroker) start() error { h.Lock() defer h.Unlock() if h.running { return nil } var l net.Listener var err error if h.opts.Secure || h.opts.TLSConfig != nil { config := h.opts.TLSConfig if config == nil { cert, err := mls.Certificate(h.address) if err != nil { return err } config = &tls.Config{Certificates: []tls.Certificate{cert}} } l, err = tls.Listen("tcp", h.address, config) } else { l, err = net.Listen("tcp", h.address) } if err != nil { return err } log.Infof("Broker Listening on %s", l.Addr().String()) h.address = l.Addr().String() go http.Serve(l, h) go func() { for { select { case ch := <-h.exit: ch <- l.Close() h.Lock() h.running = false h.Unlock() return case subscriber := <-h.unsubscribe: h.Lock() var subscribers []*httpSubscriber for _, sub := range h.subscribers[subscriber.topic] { if sub.id == subscriber.id { registry.Deregister(sub.svc) } subscribers = append(subscribers, sub) } h.subscribers[subscriber.topic] = subscribers h.Unlock() } } }() h.running = true return nil }