// actually read incoming messages off the wire // send Message object into ibound channel func incoming(c *client) { defer c.workers.Done() var err error var cp packets.ControlPacket DEBUG.Println(NET, "incoming started") for { if cp, err = packets.ReadPacket(c.conn); err != nil { break } DEBUG.Println(NET, "Received Message") c.ibound <- cp } // We received an error on read. // If disconnect is in progress, swallow error and return select { case <-c.stop: DEBUG.Println(NET, "incoming stopped") return // Not trying to disconnect, send the error to the errors channel default: ERROR.Println(NET, "incoming stopped with error", err) signalError(c.errors, err) return } }
// Get will retrieve a message from the store, the one associated with // the provided key value. func (store *FileStore) Get(key string) packets.ControlPacket { store.RLock() defer store.RUnlock() if !store.opened { ERROR.Println(STR, "Trying to use file store, but not open") return nil } filepath := fullpath(store.directory, key) if !exists(filepath) { return nil } mfile, oerr := os.Open(filepath) chkerr(oerr) msg, rerr := packets.ReadPacket(mfile) chkerr(mfile.Close()) // Message was unreadable, return nil if rerr != nil { newpath := corruptpath(store.directory, key) WARN.Println(STR, "corrupted file detected:", rerr.Error(), "archived at:", newpath) os.Rename(filepath, newpath) return nil } return msg }
func Test_DecodeMessage_pingresp(t *testing.T) { bs := bytes.NewBuffer([]byte{ 0xD0, 0x00, }) presp, _ := packets.ReadPacket(bs) if presp.(*packets.PingrespPacket).MessageType != packets.Pingresp { t.Errorf("DecodeMessage ping response wrong msg type: %v", presp.(*packets.PingrespPacket).MessageType) } if presp.(*packets.PingrespPacket).RemainingLength != 0 { t.Errorf("DecodeMessage ping response wrong rem len: %d", presp.(*packets.PingrespPacket).RemainingLength) } }
// This function is only used for receiving a connack // when the connection is first started. // This prevents receiving incoming data while resume // is in progress if clean session is false. func (c *client) connect() byte { DEBUG.Println(NET, "connect started") ca, err := packets.ReadPacket(c.conn) if err != nil { ERROR.Println(NET, "connect got error", err) return packets.ErrNetworkError } if ca == nil { ERROR.Println(NET, "received nil packet") return packets.ErrNetworkError } msg, ok := ca.(*packets.ConnackPacket) if !ok { ERROR.Println(NET, "received msg that was not CONNACK") return packets.ErrNetworkError } DEBUG.Println(NET, "received connack") return msg.ReturnCode }