// Start starts or restarts the stream. // // In recieving mode, the transport will wait to recieve a stream header // from the initiating entity, then sends its own header and the stream // features. This transport will add the starttls feature under certain // conditions. func (t *TCP) Start(props stream.Properties) (stream.Properties, error) { if t.mode == stream.Initiating { if props.Header == (stream.Header{}) { return props, stream.ErrHeaderNotSet } b := props.Header.WriteBytes() _, err := t.Write(b) return props, err } // We're in recieving mode if props.Domain == "" { return props, stream.ErrDomainNotSet } var el element.Element var h stream.Header var err error el, err = t.Next() if err != nil { return props, err } h, err = stream.NewHeader(el) if err != nil { return props, err } h.ID = genStreamID() if h.To != props.Domain { h.To, h.From = h.From, props.Domain b := h.WriteBytes() t.Write(b) err = t.WriteElement(element.StreamError.HostUnknown) props.Status = stream.Closed return props, err } h.From, h.To = props.Domain, h.From if props.To != "" { h.To = props.To } props.Header = h b := props.Header.WriteBytes() _, err = t.Write(b) if err != nil { return props, err } ftrs := element.StreamFeatures for _, f := range props.Features { ftrs = ftrs.AddChild(f) } // Stream features if t.conf != nil && !t.secure { tlsFeature := element.StartTLS if t.tlsRequired { tlsFeature = tlsFeature.AddChild(element.Required) } // Overwrite any other features ftrs.Child = []element.Token{tlsFeature} } err = t.WriteElement(ftrs) return props, err }