summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxengineering <me@xengineering.eu>2023-06-28 10:22:18 +0200
committerxengineering <me@xengineering.eu>2023-06-28 10:22:18 +0200
commitfdddefe08fa8c2a7aeab2b5a865fcb3791ab6080 (patch)
tree6c79fe42b40cc9682f6abae9731a7e24762398b1
parent4d9633f05b70a15aeb0ff39a405d76bcc2d66464 (diff)
downloadlimox-fdddefe08fa8c2a7aeab2b5a865fcb3791ab6080.tar
limox-fdddefe08fa8c2a7aeab2b5a865fcb3791ab6080.tar.zst
limox-fdddefe08fa8c2a7aeab2b5a865fcb3791ab6080.zip
xmpp: Implement syncStreams()
This should ensure that the incoming and outgoing XML streams are in sync.
-rw-r--r--xmpp/stream_pair.go30
1 files changed, 30 insertions, 0 deletions
diff --git a/xmpp/stream_pair.go b/xmpp/stream_pair.go
index 6224a77..e02cca6 100644
--- a/xmpp/stream_pair.go
+++ b/xmpp/stream_pair.go
@@ -42,6 +42,36 @@ func openStream(s *session) {
if err != nil {
log.Println("Could not encode stream start!")
}
+
+ syncStreams(s)
+}
+
+// syncStreams drops XML tokens from the receiving stream until an
+// xml.StartElement with the local name `stream` is received. If this function
+// is called after opening a new stream in the sending direction it is ensured
+// that both streams directions work on the same stream level and are in sync.
+// Tokens received which are not a stream StartElement are not handled but
+// logged since this should not happen.
+func syncStreams(s *session) {
+ for {
+ select {
+ case data := <-s.in:
+ switch data.(type) {
+ case SessionShouldDisconnect:
+ return
+ default:
+ log.Printf("Unhandled data '%d' during stream sync!\n", data)
+ }
+ case t := <-s.rx:
+ switch token := t.(type) {
+ case xml.StartElement:
+ if token.Name.Local == "stream" {
+ return
+ }
+ }
+ log.Printf("Unhandled XML token '%v' during stream sync!\n", t)
+ }
+ }
}
func closeStream(s *session) {