@@ -3,7 +3,7 @@ package main
33import (
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
6689func (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 {
237258func (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 )
0 commit comments