stream.go
changeset 114 a058e33c1666
parent 113 bee6cc131798
child 116 5c6d6d51d3ba
equal deleted inserted replaced
113:bee6cc131798 114:a058e33c1666
    85 		go tee(r, pw, "S: ")
    85 		go tee(r, pw, "S: ")
    86 		r = pr
    86 		r = pr
    87 	}
    87 	}
    88 	defer close(ch)
    88 	defer close(ch)
    89 
    89 
    90 	p := xml.NewDecoder(r)
    90 	// This trick loads our namespaces into the parser.
    91 	p.Context.Map[""] = NsClient
    91 	nsstr := fmt.Sprintf(`<a xmlns="%s" xmlns:stream="%s">`,
    92 	p.Context.Map["stream"] = NsStream
    92 		NsClient, NsStream)
       
    93 	nsrdr := strings.NewReader(nsstr)
       
    94 	p := xml.NewDecoder(io.MultiReader(nsrdr, r))
       
    95 	p.Token()
       
    96 
    93 Loop:
    97 Loop:
    94 	for {
    98 	for {
    95 		// Sniff the next token on the stream.
    99 		// Sniff the next token on the stream.
    96 		t, err := p.Token()
   100 		t, err := p.Token()
    97 		if t == nil {
   101 		if t == nil {
   204 			c.Close()
   208 			c.Close()
   205 		}
   209 		}
   206 	}(w)
   210 	}(w)
   207 
   211 
   208 	enc := xml.NewEncoder(w)
   212 	enc := xml.NewEncoder(w)
   209 	enc.Context.Map[NsClient] = ""
       
   210 	enc.Context.Map[NsStream] = "stream"
       
   211 
   213 
   212 	for obj := range ch {
   214 	for obj := range ch {
   213 		if st, ok := obj.(*stream); ok {
   215 		if st, ok := obj.(*stream); ok {
   214 			_, err := w.Write([]byte(st.String()))
   216 			_, err := w.Write([]byte(st.String()))
   215 			if err != nil {
   217 			if err != nil {