diff -r 78961db80bae -r a456133ed0ac stream.go --- a/stream.go Thu Dec 29 09:48:36 2011 -0700 +++ b/stream.go Thu Dec 29 11:02:21 2011 -0700 @@ -195,6 +195,9 @@ default: send = true } + if !send { + continue + } st, ok := x.(Stanza) if !ok { log.Printf("Unhandled non-stanza: %v", @@ -213,14 +216,29 @@ } } -// BUG(cjyar) Disable this loop until resource binding is -// complete. Otherwise the app might inject something weird into our -// negotiation stream. -func writeStream(srvOut chan<- interface{}, cliIn <-chan Stanza) { +// This loop is paused until resource binding is complete. Otherwise +// the app might inject something inappropriate into our negotiations +// with the server. The control channel controls this loop's +// activity. +func writeStream(srvOut chan<- interface{}, cliIn <-chan Stanza, + control <-chan int) { defer tryClose(srvOut, cliIn) - for x := range cliIn { - srvOut <- x + var input <-chan Stanza + for { + select { + case status := <- control: + switch status { + case 0: + input = nil + case 1: + input = cliIn + case -1: + break + } + case x := <- input: + srvOut <- x + } } } @@ -513,7 +531,8 @@ } cl.Jid = *jid log.Printf("Bound resource: %s", cl.Jid.String()) - return true + cl.bindDone() + return false } cl.HandleStanza(msg.Id, f) cl.xmlOut <- msg