Skip to content

Tolerate structural whitespace in EEBUS JSON#100

Open
kirollosnct wants to merge 1 commit into
devfrom
fix/json-whitespace-tolerance
Open

Tolerate structural whitespace in EEBUS JSON#100
kirollosnct wants to merge 1 commit into
devfrom
fix/json-whitespace-tolerance

Conversation

@kirollosnct

Copy link
Copy Markdown
Member

JsonFromEEBUSJson unwraps the EEBUS array-of-single-key-objects encoding via exact byte-sequence replacements. Any RFC 8259 structural whitespace around JSON tokens defeated those matches, leaving the outer array intact so the downstream json.Unmarshal failed.

Normalise the input with json.Compact before the replacements. Compact is string-aware, so whitespace inside string values is preserved; invalid JSON falls back to the raw bytes so behaviour is no worse than before. The NUL trim moves ahead of Compact since a trailing 0x00 is invalid JSON.

Add whitespace-tolerance tests covering all four whitespace characters around structural tokens, whitespace inside string values, and a pretty-printed real datagram.

Fixes #97.

JsonFromEEBUSJson unwraps the EEBUS array-of-single-key-objects encoding
via exact byte-sequence replacements. Any RFC 8259 structural whitespace
around JSON tokens defeated those matches, leaving the outer array intact
so the downstream json.Unmarshal failed.

Normalise the input with json.Compact before the replacements. Compact is
string-aware, so whitespace inside string values is preserved; invalid
JSON falls back to the raw bytes so behaviour is no worse than before. The
NUL trim moves ahead of Compact since a trailing 0x00 is invalid JSON.

Add whitespace-tolerance tests covering all four whitespace characters
around structural tokens, whitespace inside string values, and a
pretty-printed real datagram.
@coveralls

Copy link
Copy Markdown

Coverage Status

coverage: 93.032% (+0.04%) from 92.993% — fix/json-whitespace-tolerance into dev

Comment thread ship/helper.go
Comment on lines +18 to +21
var compacted bytes.Buffer
if err := json.Compact(&compacted, data); err == nil {
data = compacted.Bytes()
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if err != nil (i.e. if the input is not valid JSON), should we just return data here without running the replacements first?
I guess it doesn't really matter since we'll throw an error when unmarshalling anyway but it might be nice to have a comment here describing what happens if/when Compact fails.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: TC_SHIP_MSG_003 — JsonFromEEBUSJson breaks on whitespace-formatted EEBUS JSON

3 participants