mirror of
https://github.com/hashicorp/packer.git
synced 2026-02-26 19:41:06 -05:00
* Drop the iso_checksum_type & iso_checksum_url fields
In favor of simply using iso_checksum that will know what to do.
* fix after master merge
* Update builder_test.go
* Update builder_test.go
* Update builder_test.go
* Update builder_test.go
* Update builder_test.go
* remove checksum lowercasing tests
* Update builder_test.go
* Update builder_test.go
* better docs
* Update builder_test.go
* even better docs
* Update config.go
* Update builder_test.go
* Update step_create_vmx_test.go
* make generate
* better docs
* fix imports
* up tests
* Update _ISOConfig-required.html.md
* Update builder_test.go
* don't use sha1.Sum("none") as a caching path
* Update builder_test.go
* better docs
* Update iso_config_test.go
remove ISOChecksumType/ISOChecksumURL references
* Update step_download_test.go
* add iso_checksum_url and iso_checksum_type fixers + tests
* add concrete examples of checksum values
* add examples of checksumming from local file
* update go-getter dep
* up deps
* use new go-getter version
* up ESX5Driver.VerifyChecksum: use go-getter's checksumming
* ISOConfig.Prepare: get checksum there in case we need it as a string in ESX5Driver.VerifyChecksum
* Update iso_config.go
* get go-getter from v2 branch
* Update driver_esx5.go
add more comments
* Update driver_esx5.go
* show better error message when the checksum is invalid
* Update builder_test.go
put in a valid checksum to fix tests, checksum is md5("packer")
* Update builder_test.go
test invalid and valid checksum
* more test updating
* fix default md5 string to be a valid md5
* TestChecksumFileNameMixedCaseBug: use 'file:' prefix for file checksumming
* Update iso_config_test.go
* Update iso_config_test.go
* Update builder_test.go
* Update builder_test.go
* Update builder_test.go
* Update CHANGELOG.md
* Update CHANGELOG.md
* Update go.mod
* Update go.mod
* Update CHANGELOG.md
144 lines
3.4 KiB
Go
144 lines
3.4 KiB
Go
package eventstream
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/base64"
|
|
"encoding/json"
|
|
"fmt"
|
|
"strconv"
|
|
)
|
|
|
|
type decodedMessage struct {
|
|
rawMessage
|
|
Headers decodedHeaders `json:"headers"`
|
|
}
|
|
type jsonMessage struct {
|
|
Length json.Number `json:"total_length"`
|
|
HeadersLen json.Number `json:"headers_length"`
|
|
PreludeCRC json.Number `json:"prelude_crc"`
|
|
Headers decodedHeaders `json:"headers"`
|
|
Payload []byte `json:"payload"`
|
|
CRC json.Number `json:"message_crc"`
|
|
}
|
|
|
|
func (d *decodedMessage) UnmarshalJSON(b []byte) (err error) {
|
|
var jsonMsg jsonMessage
|
|
if err = json.Unmarshal(b, &jsonMsg); err != nil {
|
|
return err
|
|
}
|
|
|
|
d.Length, err = numAsUint32(jsonMsg.Length)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
d.HeadersLen, err = numAsUint32(jsonMsg.HeadersLen)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
d.PreludeCRC, err = numAsUint32(jsonMsg.PreludeCRC)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
d.Headers = jsonMsg.Headers
|
|
d.Payload = jsonMsg.Payload
|
|
d.CRC, err = numAsUint32(jsonMsg.CRC)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (d *decodedMessage) MarshalJSON() ([]byte, error) {
|
|
jsonMsg := jsonMessage{
|
|
Length: json.Number(strconv.Itoa(int(d.Length))),
|
|
HeadersLen: json.Number(strconv.Itoa(int(d.HeadersLen))),
|
|
PreludeCRC: json.Number(strconv.Itoa(int(d.PreludeCRC))),
|
|
Headers: d.Headers,
|
|
Payload: d.Payload,
|
|
CRC: json.Number(strconv.Itoa(int(d.CRC))),
|
|
}
|
|
|
|
return json.Marshal(jsonMsg)
|
|
}
|
|
|
|
func numAsUint32(n json.Number) (uint32, error) {
|
|
v, err := n.Int64()
|
|
if err != nil {
|
|
return 0, fmt.Errorf("failed to get int64 json number, %v", err)
|
|
}
|
|
|
|
return uint32(v), nil
|
|
}
|
|
|
|
func (d decodedMessage) Message() Message {
|
|
return Message{
|
|
Headers: Headers(d.Headers),
|
|
Payload: d.Payload,
|
|
}
|
|
}
|
|
|
|
type decodedHeaders Headers
|
|
|
|
func (hs *decodedHeaders) UnmarshalJSON(b []byte) error {
|
|
var jsonHeaders []struct {
|
|
Name string `json:"name"`
|
|
Type valueType `json:"type"`
|
|
Value interface{} `json:"value"`
|
|
}
|
|
|
|
decoder := json.NewDecoder(bytes.NewReader(b))
|
|
decoder.UseNumber()
|
|
if err := decoder.Decode(&jsonHeaders); err != nil {
|
|
return err
|
|
}
|
|
|
|
var headers Headers
|
|
for _, h := range jsonHeaders {
|
|
value, err := valueFromType(h.Type, h.Value)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
headers.Set(h.Name, value)
|
|
}
|
|
*hs = decodedHeaders(headers)
|
|
|
|
return nil
|
|
}
|
|
|
|
func valueFromType(typ valueType, val interface{}) (Value, error) {
|
|
switch typ {
|
|
case trueValueType:
|
|
return BoolValue(true), nil
|
|
case falseValueType:
|
|
return BoolValue(false), nil
|
|
case int8ValueType:
|
|
v, err := val.(json.Number).Int64()
|
|
return Int8Value(int8(v)), err
|
|
case int16ValueType:
|
|
v, err := val.(json.Number).Int64()
|
|
return Int16Value(int16(v)), err
|
|
case int32ValueType:
|
|
v, err := val.(json.Number).Int64()
|
|
return Int32Value(int32(v)), err
|
|
case int64ValueType:
|
|
v, err := val.(json.Number).Int64()
|
|
return Int64Value(v), err
|
|
case bytesValueType:
|
|
v, err := base64.StdEncoding.DecodeString(val.(string))
|
|
return BytesValue(v), err
|
|
case stringValueType:
|
|
v, err := base64.StdEncoding.DecodeString(val.(string))
|
|
return StringValue(string(v)), err
|
|
case timestampValueType:
|
|
v, err := val.(json.Number).Int64()
|
|
return TimestampValue(timeFromEpochMilli(v)), err
|
|
case uuidValueType:
|
|
v, err := base64.StdEncoding.DecodeString(val.(string))
|
|
var tv UUIDValue
|
|
copy(tv[:], v)
|
|
return tv, err
|
|
default:
|
|
panic(fmt.Sprintf("unknown type, %s, %T", typ.String(), val))
|
|
}
|
|
}
|