diff -r c7f2edd25f4a -r ac0639692317 xmpp.go --- a/xmpp.go Sun Jan 08 12:20:21 2012 -0700 +++ b/xmpp.go Sun Jan 08 12:43:50 2012 -0700 @@ -189,7 +189,7 @@ return cl, nil } -func (cl *Client) startTransport() (io.Reader, io.Writer) { +func (cl *Client) startTransport() (io.Reader, io.WriteCloser) { inr, inw := io.Pipe() outr, outw := io.Pipe() go cl.readTransport(inw) @@ -204,7 +204,7 @@ return ch } -func startXmlWriter(w io.Writer) chan<- interface{} { +func startXmlWriter(w io.WriteCloser) chan<- interface{} { ch := make(chan interface{}) go writeXml(w, ch) return ch @@ -223,19 +223,23 @@ } func (cl *Client) startFilter(srvIn <-chan Stanza) <-chan Stanza { - cliOut := make(chan Stanza) + cliIn := make(chan Stanza) filterOut := make(chan (<-chan Stanza)) filterIn := make(chan (<-chan Stanza)) nullFilter := make(chan Stanza) go filterBottom(srvIn, nullFilter) - go filterTop(filterOut, filterIn, nullFilter, cliOut) + go filterTop(filterOut, filterIn, nullFilter, cliIn) cl.filterOut = filterOut cl.filterIn = filterIn - return cliOut + return cliIn } func tee(r io.Reader, w io.Writer, prefix string) { - defer tryClose(r, w) + defer func(w io.Writer) { + if c, ok := w.(io.Closer) ; ok { + c.Close() + } + }(w) buf := bytes.NewBuffer([]uint8(prefix)) for { @@ -260,31 +264,6 @@ } } -func tryClose(xs ...interface{}) { - f1 := func(ch chan<- interface{}) { - defer func() { - recover() - }() - close(ch) - } - f2 := func(ch <-chan interface{}) { - defer func() { - recover() - }() - close(ch) - } - - for _, x := range xs { - if c, ok := x.(io.Closer) ; ok { - c.Close() - } else if ch, ok := x.(chan<- interface{}) ; ok { - f1(ch) - } else if ch, ok := x.(<-chan interface{}) ; ok { - f2(ch) - } - } -} - // bindDone is called when we've finished resource binding (and all // the negotiations that precede it). Now we can start accepting // traffic from the app.