diff --git a/patches/0001-Expose-Encoder.Canonical-and-MarshalCanonical.patch b/patches/0001-Expose-Encoder.Canonical-and-MarshalCanonical-Handle.patch similarity index 98% rename from patches/0001-Expose-Encoder.Canonical-and-MarshalCanonical.patch rename to patches/0001-Expose-Encoder.Canonical-and-MarshalCanonical-Handle.patch index ef5c725..7ca93ea 100644 --- a/patches/0001-Expose-Encoder.Canonical-and-MarshalCanonical.patch +++ b/patches/0001-Expose-Encoder.Canonical-and-MarshalCanonical-Handle.patch @@ -1,7 +1,7 @@ -From 731ff3aa5d2bdd992972cc006ac4ba9d223eee1f Mon Sep 17 00:00:00 2001 -From: Tibor Vass +From ee929ab88d09e61a93cd041730adfedb1aa2c510 Mon Sep 17 00:00:00 2001 +From: Tibor Vass Date: Fri, 7 Aug 2015 12:49:35 -0700 -Subject: [PATCH 1/2] Expose Encoder.Canonical() and MarshalCanonical() Handles +Subject: [PATCH 1/3] Expose Encoder.Canonical() and MarshalCanonical() Handles lexicographic order in struct fields, rejects floating numbers and handles strings as defined in http://wiki.laptop.org/go/Canonical_JSON except for unicode normalization. IOW, only escaping allowed is " and \. diff --git a/patches/0002-add-test-for-canonical-float-error.patch b/patches/0002-add-test-for-canonical-float-error.patch index a4412a8..13cc6c1 100644 --- a/patches/0002-add-test-for-canonical-float-error.patch +++ b/patches/0002-add-test-for-canonical-float-error.patch @@ -1,7 +1,7 @@ -From 775457d4430a6972f090ae6c1c8bba6ded34a9c4 Mon Sep 17 00:00:00 2001 +From d818992b918abae8c6a61a870cf21280d3fd7a98 Mon Sep 17 00:00:00 2001 From: Jessica Frazelle Date: Fri, 7 Aug 2015 12:51:13 -0700 -Subject: [PATCH 2/2] add test for canonical float error +Subject: [PATCH 2/3] add test for canonical float error Signed-off-by: Jessica Frazelle --- diff --git a/patches/0003-Encode-non-fatal-floats-as-integers-in-canonical-mod.patch b/patches/0003-Encode-non-fatal-floats-as-integers-in-canonical-mod.patch new file mode 100644 index 0000000..7a3269b --- /dev/null +++ b/patches/0003-Encode-non-fatal-floats-as-integers-in-canonical-mod.patch @@ -0,0 +1,55 @@ +From d62108ab70036d21c6f30804f9b5e77602066f1d Mon Sep 17 00:00:00 2001 +From: Tonis Tiigi +Date: Thu, 27 Aug 2015 10:08:51 -0700 +Subject: [PATCH 3/3] Encode non-fatal floats as integers in canonical mode + +Signed-off-by: Tonis Tiigi +--- + canonical/json/encode.go | 8 +++++++- + canonical/json/encode_test.go | 14 ++++++++++++++ + 2 files changed, 21 insertions(+), 1 deletion(-) + +diff --git a/canonical/json/encode.go b/canonical/json/encode.go +index aaa79c2..655f1a6 100644 +--- a/canonical/json/encode.go ++++ b/canonical/json/encode.go +@@ -526,7 +526,13 @@ func (bits floatEncoder) encode(e *encodeState, v reflect.Value, quoted bool) { + if math.IsInf(f, 0) || math.IsNaN(f) || (e.canonical && math.Floor(f) != f) { + e.error(&UnsupportedValueError{v, strconv.FormatFloat(f, 'g', -1, int(bits))}) + } +- b := strconv.AppendFloat(e.scratch[:0], f, 'g', -1, int(bits)) ++ ++ var b []byte ++ if e.canonical { ++ b = strconv.AppendInt(e.scratch[:0], int64(f), 10) ++ } else { ++ b = strconv.AppendFloat(e.scratch[:0], f, 'g', -1, int(bits)) ++ } + if quoted { + e.WriteByte('"') + } +diff --git a/canonical/json/encode_test.go b/canonical/json/encode_test.go +index cd41aff..2e42b4e 100644 +--- a/canonical/json/encode_test.go ++++ b/canonical/json/encode_test.go +@@ -589,3 +589,17 @@ func TestCanonicalFloatError(t *testing.T) { + t.Errorf("want float error, got nil") + } + } ++ ++func TestCanonicalFloatAsInt(t *testing.T) { ++ in := struct{ A float64 }{1234567} ++ ++ b, err := MarshalCanonical(in) ++ if err != nil { ++ t.Fatalf("Marshal(%q): %v", in, err) ++ } ++ out := string(b) ++ expected := `{"A":1234567}` ++ if out != expected { ++ t.Errorf("Marshal(%q) = %#q, want %#q", in, out, expected) ++ } ++} +-- +2.5.0 +