Ver Fonte

don't crash the server when client sends a heartbeat

Mike há 3 anos atrás
pai
commit
65839de27c
1 ficheiros alterados com 40 adições e 19 exclusões
  1. 40 19
      oscar/protocol.go

+ 40 - 19
oscar/protocol.go

@@ -449,6 +449,14 @@ type XMessage struct {
 	snacOut   snacWriter
 }
 
+const (
+	FlapFrameSignon    uint8 = 0x01
+	FlapFrameData            = 0x02
+	FlapFrameError           = 0x03
+	FlapFrameSignoff         = 0x04
+	FlapFrameKeepAlive       = 0x05
+)
+
 func streamFromConn(rw io.ReadWriter, in chan IncomingMessage) {
 	for {
 		flap := &flapFrame{}
@@ -460,30 +468,43 @@ func streamFromConn(rw io.ReadWriter, in chan IncomingMessage) {
 			}
 		}
 
-		b := make([]byte, flap.payloadLength)
-		if _, err := rw.Read(b); err != nil {
-			if err != io.EOF {
-				panic("temporary panic: " + err.Error())
-			} else {
-				break
+		switch flap.frameType {
+		case FlapFrameSignon:
+			panic("shouldn't get FlapFrameSignon")
+		case FlapFrameData:
+			b := make([]byte, flap.payloadLength)
+			if _, err := rw.Read(b); err != nil {
+				if err != io.EOF {
+					panic("temporary panic: " + err.Error())
+				} else {
+					break
+				}
 			}
-		}
 
-		buf := bytes.NewBuffer(b)
+			buf := bytes.NewBuffer(b)
 
-		snac := &snacFrame{}
-		if err := snac.read(buf); err != nil {
-			if err != io.EOF {
-				panic("temporary panic: " + err.Error())
-			} else {
-				break
+			snac := &snacFrame{}
+			if err := snac.read(buf); err != nil {
+				if err != io.EOF {
+					panic("temporary panic: " + err.Error())
+				} else {
+					break
+				}
 			}
-		}
 
-		in <- IncomingMessage{
-			flap: flap,
-			snac: snac,
-			buf:  buf,
+			in <- IncomingMessage{
+				flap: flap,
+				snac: snac,
+				buf:  buf,
+			}
+		case FlapFrameError:
+			panic(fmt.Sprintf("got FlapFrameError: %v", flap))
+		case FlapFrameSignoff:
+			panic(fmt.Sprintf("got signoff: %v", flap))
+		case FlapFrameKeepAlive:
+			fmt.Println("keepalive heartbeat")
+		default:
+			panic(fmt.Sprintf("unknown frame type: %v", flap))
 		}
 	}
 }