| OLD | NEW |
| 1 // Copyright 2015 The LUCI Authors. All rights reserved. | 1 // Copyright 2015 The LUCI Authors. All rights reserved. |
| 2 // Use of this source code is governed under the Apache License, Version 2.0 | 2 // Use of this source code is governed under the Apache License, Version 2.0 |
| 3 // that can be found in the LICENSE file. | 3 // that can be found in the LICENSE file. |
| 4 | 4 |
| 5 package caching | 5 package caching |
| 6 | 6 |
| 7 import ( | 7 import ( |
| 8 "bytes" | 8 "bytes" |
| 9 "compress/zlib" | 9 "compress/zlib" |
| 10 "crypto/sha256" | 10 "crypto/sha256" |
| 11 "encoding/binary" | 11 "encoding/binary" |
| 12 "encoding/json" | 12 "encoding/json" |
| 13 "strings" | 13 "strings" |
| 14 | 14 |
| 15 "github.com/luci/luci-go/common/errors" | 15 "github.com/luci/luci-go/common/errors" |
| 16 ) | 16 ) |
| 17 | 17 |
| 18 // Encode is a convenience method for generating a ZLIB-compressed JSON-encoded | 18 // Encode is a convenience method for generating a ZLIB-compressed JSON-encoded |
| 19 // object. | 19 // object. |
| 20 func Encode(v interface{}) ([]byte, error) { | 20 func Encode(v interface{}) ([]byte, error) { |
| 21 var buf bytes.Buffer | 21 var buf bytes.Buffer |
| 22 zw := zlib.NewWriter(&buf) | 22 zw := zlib.NewWriter(&buf) |
| 23 enc := json.NewEncoder(zw) | 23 enc := json.NewEncoder(zw) |
| 24 | 24 |
| 25 if err := enc.Encode(v); err != nil { | 25 if err := enc.Encode(v); err != nil { |
| 26 zw.Close() | 26 zw.Close() |
| 27 » » return nil, errors.Annotate(err).Reason("failed to JSON-encode")
.Err() | 27 » » return nil, errors.Annotate(err, "failed to JSON-encode").Err() |
| 28 } | 28 } |
| 29 if err := zw.Close(); err != nil { | 29 if err := zw.Close(); err != nil { |
| 30 » » return nil, errors.Annotate(err).Reason("failed to Close zlib Wr
iter").Err() | 30 » » return nil, errors.Annotate(err, "failed to Close zlib Writer").
Err() |
| 31 } | 31 } |
| 32 return buf.Bytes(), nil | 32 return buf.Bytes(), nil |
| 33 } | 33 } |
| 34 | 34 |
| 35 // Decode is a convenience method for decoding a ZLIB-compressed JSON-encoded | 35 // Decode is a convenience method for decoding a ZLIB-compressed JSON-encoded |
| 36 // object encoded by Encode. | 36 // object encoded by Encode. |
| 37 func Decode(d []byte, v interface{}) error { | 37 func Decode(d []byte, v interface{}) error { |
| 38 zr, err := zlib.NewReader(bytes.NewReader(d)) | 38 zr, err := zlib.NewReader(bytes.NewReader(d)) |
| 39 if err != nil { | 39 if err != nil { |
| 40 » » return errors.Annotate(err).Reason("failed to create zlib Reader
").Err() | 40 » » return errors.Annotate(err, "failed to create zlib Reader").Err(
) |
| 41 } | 41 } |
| 42 defer zr.Close() | 42 defer zr.Close() |
| 43 | 43 |
| 44 if err := json.NewDecoder(zr).Decode(v); err != nil { | 44 if err := json.NewDecoder(zr).Decode(v); err != nil { |
| 45 » » return errors.Annotate(err).Reason("failed to JSON-decode").Err(
) | 45 » » return errors.Annotate(err, "failed to JSON-decode").Err() |
| 46 } | 46 } |
| 47 return nil | 47 return nil |
| 48 } | 48 } |
| 49 | 49 |
| 50 // HashParams is a convenience method for hashing a series of strings into a | 50 // HashParams is a convenience method for hashing a series of strings into a |
| 51 // unique hash key for that series. | 51 // unique hash key for that series. |
| 52 // | 52 // |
| 53 // The output is fixed-size sha256.Size (32) bytes. | 53 // The output is fixed-size sha256.Size (32) bytes. |
| 54 func HashParams(params ...string) []byte { | 54 func HashParams(params ...string) []byte { |
| 55 size := 0 | 55 size := 0 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 76 _, _ = buf.Write(bytes.Replace([]byte(params[i]), []byte
{0x00}, []byte{0x00, 0x00}, -1)) | 76 _, _ = buf.Write(bytes.Replace([]byte(params[i]), []byte
{0x00}, []byte{0x00, 0x00}, -1)) |
| 77 } else { | 77 } else { |
| 78 _, _ = buf.WriteString(s) | 78 _, _ = buf.WriteString(s) |
| 79 } | 79 } |
| 80 buf.WriteByte(0x00) | 80 buf.WriteByte(0x00) |
| 81 } | 81 } |
| 82 | 82 |
| 83 hash := sha256.Sum256(buf.Bytes()) | 83 hash := sha256.Sum256(buf.Bytes()) |
| 84 return hash[:] | 84 return hash[:] |
| 85 } | 85 } |
| OLD | NEW |