package ipp import ( "bufio" "encoding/binary" log "github.com/sirupsen/logrus" ) // Currently the collection data is just consumed and dropped from the bytestream func consumeCollection(byteStream *bufio.Reader) { // RFC8010 Section 3.1.6 var length uint16 binary.Read(byteStream, binary.BigEndian, &length) collectionName := make([]byte, length) if length > 0 { binary.Read(byteStream, binary.BigEndian, collectionName) } log.Info("collection name " + string(collectionName)) err := binary.Read(byteStream, binary.BigEndian, &length) //Always zero ?? if err != nil { log.Fatal("error ", err.Error()) } if length != 0 { log.Fatal("Should be zero") } // Member attributes done: for { var t tag binary.Read(byteStream, binary.BigEndian, &t) log.Debug("Collection tag ", t) switch t { case endCollectionValueTag: binary.Read(byteStream, binary.BigEndian, &length) if length != 0 { log.Fatal("Should be zero") } binary.Read(byteStream, binary.BigEndian, &length) if length != 0 { log.Fatal("Should be zero") } case memberAttrNameValueTag: // RFC8010 Section 3.7.1 binary.Read(byteStream, binary.BigEndian, &length) //Always zero ?? if length != 0 { log.Fatal("Should be zero") } binary.Read(byteStream, binary.BigEndian, &length) // Value length memberName := make([]byte, length) binary.Read(byteStream, binary.BigEndian, memberName) log.Debugf("Member name: %v", string(memberName)) var memberValueTag tag binary.Read(byteStream, binary.BigEndian, &memberValueTag) log.Debug("Member value tag: ", memberValueTag) binary.Read(byteStream, binary.BigEndian, &length) //Always zero ?? if length != 0 { log.Fatal("Should be zero") } var memberValueLength uint16 binary.Read(byteStream, binary.BigEndian, &memberValueLength) memberValue := make([]byte, memberValueLength) binary.Read(byteStream, binary.BigEndian, memberValue) log.Debugf("Member Value: % x", memberValue) default: // Next tag is one that can not be handled in the collection // Put it back in the byte stream and return to main loop byteStream.UnreadByte() break done } } log.Debug("Collection done") }