Fix handling of compressed data
This commit is contained in:
parent
9c09d80da9
commit
96d8be417c
|
@ -4,6 +4,7 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"compress/flate"
|
"compress/flate"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
@ -117,11 +118,27 @@ func (coll *Collector) parse(response *Response) (err error) {
|
||||||
reader := flate.NewReader(bytes.NewReader(response.Raw))
|
reader := flate.NewReader(bytes.NewReader(response.Raw))
|
||||||
defer reader.Close()
|
defer reader.Close()
|
||||||
|
|
||||||
decoder := json.NewDecoder(reader)
|
decompressed, err := ioutil.ReadAll(reader)
|
||||||
if err = decoder.Decode(data); err == nil {
|
if err != nil {
|
||||||
coll.onReceive(response.Address, data)
|
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
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
}
|
Binary file not shown.
Loading…
Reference in New Issue