Skip to content

Commit 1c6e074

Browse files
author
Karolis Rusenas
committed
Merge pull request #56 from SpectoLabs/develop
Develop
2 parents feb7bd2 + e27ac2d commit 1c6e074

File tree

4 files changed

+72
-27
lines changed

4 files changed

+72
-27
lines changed

admin.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -152,12 +152,11 @@ func (d *DBClient) ImportRecordsHandler(w http.ResponseWriter, req *http.Request
152152
payloads := requests.Data
153153
if len(payloads) > 0 {
154154
for _, pl := range payloads {
155-
bts, err := json.Marshal(pl)
156-
155+
bts, err := pl.encode()
157156
if err != nil {
158157
log.WithFields(log.Fields{
159158
"error": err.Error(),
160-
}).Error("Failed to marshal json")
159+
}).Error("Failed to encode payload")
161160
} else {
162161
// recalculating request hash and storing it in database
163162
r := request{details: pl.Request}

cache.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package main
22

33
import (
4-
"encoding/json"
54
"fmt"
65

76
log "github.com/Sirupsen/logrus"
@@ -66,16 +65,14 @@ func (c *Cache) GetAllRequests() (payloads []Payload, err error) {
6665
c := b.Cursor()
6766

6867
for k, v := c.First(); k != nil; k, v = c.Next() {
69-
var pl Payload
70-
err = json.Unmarshal(v, &pl)
71-
68+
pl, err := decodePayload(v)
7269
if err != nil {
7370
log.WithFields(log.Fields{
7471
"error": err.Error(),
7572
"json": v,
76-
}).Warning("Failed to deserialize json")
73+
}).Warning("Failed to deserialize bytes to payload.")
7774
} else {
78-
payloads = append(payloads, pl)
75+
payloads = append(payloads, *pl)
7976
}
8077
}
8178
return nil

models.go

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package main
33
import (
44
"bytes"
55
"crypto/md5"
6-
"encoding/json"
6+
"encoding/gob"
77
"fmt"
88
"io"
99
"net/http"
@@ -62,6 +62,29 @@ type Payload struct {
6262
ID string `json:"id"`
6363
}
6464

65+
// encode method encodes all exported Payload fields to bytes
66+
func (p *Payload) encode() ([]byte, error) {
67+
buf := new(bytes.Buffer)
68+
enc := gob.NewEncoder(buf)
69+
err := enc.Encode(p)
70+
if err != nil {
71+
return nil, err
72+
}
73+
return buf.Bytes(), nil
74+
}
75+
76+
// decodePayload decodes supplied bytes into Payload structure
77+
func decodePayload(data []byte) (*Payload, error) {
78+
var p *Payload
79+
buf := bytes.NewBuffer(data)
80+
dec := gob.NewDecoder(buf)
81+
err := dec.Decode(&p)
82+
if err != nil {
83+
return nil, err
84+
}
85+
return p, nil
86+
}
87+
6588
// recordRequest saves request for later playback
6689
func (d *DBClient) captureRequest(req *http.Request) (*http.Response, error) {
6790

@@ -212,18 +235,16 @@ func (d *DBClient) save(req *http.Request, resp *http.Response, respBody []byte,
212235
Request: requestObj,
213236
ID: key,
214237
}
215-
// converting it to json bytes
216-
bts, err := json.Marshal(payload)
217238

239+
bts, err := payload.encode()
218240
if err != nil {
219241
log.WithFields(log.Fields{
220242
"error": err.Error(),
221-
}).Error("Failed to marshal json")
243+
}).Error("Failed to serialize payload")
222244
} else {
223245
d.cache.Set([]byte(key), bts)
224246
}
225247
}
226-
227248
}
228249

229250
// getRequestFingerprint returns request hash
@@ -237,19 +258,20 @@ func getRequestFingerprint(req *http.Request) string {
237258
func (d *DBClient) getResponse(req *http.Request) *http.Response {
238259

239260
key := getRequestFingerprint(req)
240-
var payload Payload
261+
// var payload Payload
241262

242263
payloadBts, err := d.cache.Get([]byte(key))
243264

244265
if err == nil {
245266
// getting cache response
246-
err = json.Unmarshal(payloadBts, &payload)
267+
payload, err := decodePayload(payloadBts)
247268
if err != nil {
248-
log.Error(err)
249-
// what now?
269+
log.WithFields(log.Fields{
270+
"error": err.Error(),
271+
}).Error("Failed to decode payload")
250272
}
251273

252-
c := NewConstructor(req, payload)
274+
c := NewConstructor(req, *payload)
253275

254276
if d.cfg.middleware != "" {
255277
_ = c.ApplyMiddleware(d.cfg.middleware)

models_test.go

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package main
22

33
import (
44
"bytes"
5-
"encoding/json"
65
"fmt"
76
"io/ioutil"
87
"net/http"
@@ -58,16 +57,10 @@ func TestRequestBodyCaptured(t *testing.T) {
5857
fp := getRequestFingerprint(req)
5958

6059
payloadBts, err := dbClient.cache.Get([]byte(fp))
61-
62-
var payload Payload
63-
6460
expect(t, err, nil)
6561

66-
// getting cache response
67-
err = json.Unmarshal(payloadBts, &payload)
68-
62+
payload, err := decodePayload(payloadBts)
6963
expect(t, err, nil)
70-
7164
expect(t, payload.Request.Body, "fizz=buzz")
7265

7366
}
@@ -98,3 +91,37 @@ func TestDeleteAllRecords(t *testing.T) {
9891
err := dbClient.cache.DeleteBucket(dbClient.cache.requestsBucket)
9992
expect(t, err, nil)
10093
}
94+
95+
func TestPayloadEncodeDecode(t *testing.T) {
96+
resp := response{
97+
Status: 200,
98+
Body: "body here",
99+
}
100+
101+
payload := Payload{Response: resp}
102+
103+
bts, err := payload.encode()
104+
expect(t, err, nil)
105+
106+
pl, err := decodePayload(bts)
107+
expect(t, err, nil)
108+
expect(t, pl.Response.Body, resp.Body)
109+
expect(t, pl.Response.Status, resp.Status)
110+
111+
}
112+
113+
func TestPayloadEncodeEmpty(t *testing.T) {
114+
payload := Payload{}
115+
116+
bts, err := payload.encode()
117+
expect(t, err, nil)
118+
119+
_, err = decodePayload(bts)
120+
expect(t, err, nil)
121+
}
122+
123+
func TestDecodeRandomBytes(t *testing.T) {
124+
bts := []byte("some random stuff here")
125+
_, err := decodePayload(bts)
126+
refute(t, err, nil)
127+
}

0 commit comments

Comments
 (0)