Exemple #1
0
func (pkt *RtmpConnectAppPacket) Decode(buffer *bytes.Buffer, logger core.Logger) (err error) {
	if err = pkt.rtmpCommonCallPacket.Decode(buffer, logger); err != nil {
		return
	}

	// some client donot send id=1.0, so we only warn user if not match.
	if pkt.TransactionId != 1.0 {
		logger.Warn("connect should be 1.0, actual is %v", pkt.TransactionId)
	}

	if err = pkt.CommandObject.Decode(buffer); err != nil {
		logger.Error("amf0 decode connect command_object failed.")
		return
	}

	if buffer.Len() > 0 {
		// see: https://github.com/winlinvip/simple-rtmp-server/issues/186
		// the args maybe any amf0, for instance, a string. we should drop if not object.
		var any Amf0Any
		if any, err = DecodeAmf0Any(buffer); err != nil {
			logger.Error("amf0 decode connect args failed")
			return
		}

		// drop when not an AMF0 object.
		if any.(*Amf0Object) == nil {
			logger.Warn("drop the args, see: '4.1.1. connect'")
		} else {
			pkt.Arguments = any.(*Amf0Object)
		}
	}

	logger.Info("amf0 decode connect packet success")

	return
}