Fix handling of compressed data

This commit is contained in:
Julian Kornberger 2016-03-19 15:07:44 +01:00
parent 9c09d80da9
commit 96d8be417c
3 changed files with 62 additions and 3 deletions

View File

@ -4,6 +4,7 @@ import (
"bytes"
"compress/flate"
"encoding/json"
"io/ioutil"
"log"
"net"
"reflect"
@ -117,11 +118,27 @@ func (coll *Collector) parse(response *Response) (err error) {
reader := flate.NewReader(bytes.NewReader(response.Raw))
defer reader.Close()
decoder := json.NewDecoder(reader)
if err = decoder.Decode(data); err == nil {
coll.onReceive(response.Address, data)
decompressed, err := ioutil.ReadAll(reader)
if err != nil {
return
}
// Remove useless wrapper element that only exists in compressed data.
// Who introduced this !?
if bytes.HasPrefix(decompressed, []byte(`{"neighbours":`)) ||
bytes.HasPrefix(decompressed, []byte(`{"statistics":`)) {
decompressed = decompressed[14 : len(decompressed)-1]
} else if bytes.HasPrefix(decompressed, []byte(`{"nodeinfo":`)) {
decompressed = decompressed[12 : len(decompressed)-1]
}
err = json.Unmarshal(decompressed, data)
if err != nil {
return
}
coll.onReceive(response.Address, data)
return
}

42
respond/collector_test.go Normal file
View File

@ -0,0 +1,42 @@
package respond
import (
"io/ioutil"
"net"
"reflect"
"testing"
"github.com/FreifunkBremen/respond-collector/data"
"github.com/stretchr/testify/assert"
)
func TestParse(t *testing.T) {
assert := assert.New(t)
var decompressed *data.NodeInfo
// callback function
onReceive := func(addr net.UDPAddr, msg interface{}) {
switch msg := msg.(type) {
case *data.NodeInfo:
decompressed = msg
default:
t.Error("unexpected message:", msg)
}
}
collector := &Collector{
msgType: reflect.TypeOf(data.NodeInfo{}),
onReceive: onReceive,
}
// read testdata
compressed, err := ioutil.ReadFile("testdata/nodeinfo.flated")
assert.Nil(err)
collector.parse(&Response{
Raw: compressed,
})
assert.NotNil(decompressed)
assert.Equal("f81a67a5e9c1", decompressed.NodeId)
}

BIN
respond/testdata/nodeinfo.flated vendored Normal file

Binary file not shown.