summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Pevzner <pzz@apevzner.com>2020-01-19 22:59:41 +0300
committerAlexander Pevzner <pzz@apevzner.com>2020-01-19 22:59:41 +0300
commit72ac6293ed2cc3960bfee62844a88780bfbfdb46 (patch)
tree9545df96d27045d966553756c0585d695a6ae9ec
parenta99aeaade80c0b8f2bcad393896da3a3820210e5 (diff)
Strict checking of value tags in message encoder
-rw-r--r--encoder.go20
-rw-r--r--goipp_test.go2
2 files changed, 16 insertions, 6 deletions
diff --git a/encoder.go b/encoder.go
index 36ff6fc..a099f8d 100644
--- a/encoder.go
+++ b/encoder.go
@@ -48,7 +48,7 @@ func (me *messageEncoder) encode(m *Message) error {
if attr.Name == "" {
err = errors.New("Attribute without name")
} else {
- err = me.encodeAttr(attr)
+ err = me.encodeAttr(attr, true)
}
}
}
@@ -66,7 +66,7 @@ func (me *messageEncoder) encode(m *Message) error {
}
// Encode attribute
-func (me *messageEncoder) encodeAttr(attr Attribute) error {
+func (me *messageEncoder) encodeAttr(attr Attribute, check_tag bool) error {
// Wire format
// 1 byte: Tag
// 2 bytes: len(Name)
@@ -82,7 +82,15 @@ func (me *messageEncoder) encodeAttr(attr Attribute) error {
name := attr.Name
for _, val := range attr.Values {
- err := me.encodeTag(val.T)
+ tag := val.T
+
+ if check_tag {
+ if tag.IsDelimiter() || tag == TagMemberName || tag == TagEndCollection {
+ return fmt.Errorf("Tag %s cannot be used with value", tag)
+ }
+ }
+
+ err := me.encodeTag(tag)
if err != nil {
return err
}
@@ -187,9 +195,9 @@ func (me *messageEncoder) encodeCollection(tag Tag, collection Collection) error
attrName := MakeAttribute("", TagMemberName, String(attr.Name))
- err := me.encodeAttr(attrName)
+ err := me.encodeAttr(attrName, false)
if err == nil {
- err = me.encodeAttr(Attribute{Name: "", Values: attr.Values})
+ err = me.encodeAttr(Attribute{Name: "", Values: attr.Values}, true)
}
if err != nil {
@@ -197,7 +205,7 @@ func (me *messageEncoder) encodeCollection(tag Tag, collection Collection) error
}
}
- return me.encodeAttr(MakeAttribute("", TagEndCollection, Void{}))
+ return me.encodeAttr(MakeAttribute("", TagEndCollection, Void{}), false)
}
// Write a piece of raw data to output stream
diff --git a/goipp_test.go b/goipp_test.go
index 5f216f1..b731ca0 100644
--- a/goipp_test.go
+++ b/goipp_test.go
@@ -180,6 +180,8 @@ func testDecode(t *testing.T, data []byte, mustFail bool) {
}
buf, err := m.EncodeBytes()
+ assertNoError(t, err)
+
if !bytes.Equal(buf, data) {
t.Errorf("Message is not the same after decoding and encoding")
}