// newStreamHandler is the remote-opened stream handler for inet.Network // TODO: this feels a bit wonky func (h *BasicHost) newStreamHandler(s inet.Stream) { before := time.Now() if h.NegotiateTimeout != 0 { if err := s.SetDeadline(time.Now().Add(h.NegotiateTimeout)); err != nil { log.Error("setting stream deadline: ", err) s.Close() return } } protoID, handle, err := h.Mux().Negotiate(s) took := time.Now().Sub(before) if err != nil { if err == io.EOF { logf := log.Debugf if took > time.Second*10 { logf = log.Warningf } logf("protocol EOF: %s (took %s)", s.Conn().RemotePeer(), took) } else { log.Warning("protocol mux failed: %s (took %s)", err, took) } s.Close() return } if h.NegotiateTimeout != 0 { if err := s.SetDeadline(time.Time{}); err != nil { log.Error("resetting stream deadline: ", err) s.Close() return } } s.SetProtocol(protocol.ID(protoID)) if h.bwc != nil { s = mstream.WrapStream(s, h.bwc) } log.Debugf("protocol negotiation took %s", took) go handle(protoID, s) }