equal
deleted
inserted
replaced
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 { |