From: Markus Armbruster <armbru@redhat.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: "Peter Maydell" <peter.maydell@linaro.org>,
"Daniel P. Berrangé" <berrange@redhat.com>,
libvir-list@redhat.com, "Markus Armbruster" <armbru@redhat.com>,
qemu-devel@nongnu.org, "John Snow" <jsnow@redhat.com>
Subject: Re: A brief look at deprecating our JSON extensions over RFC 8259
Date: Tue, 23 Feb 2021 10:06:30 +0100 [thread overview]
Message-ID: <87y2fff90p.fsf@dusky.pond.sub.org> (raw)
In-Reply-To: <c5d13648-445d-92b9-6bff-95bd2b99d52e@redhat.com> (Paolo Bonzini's message of "Mon, 22 Feb 2021 18:47:30 +0100")
Paolo Bonzini <pbonzini@redhat.com> writes:
> On 22/02/21 16:24, Daniel P. Berrangé wrote:
>> This problem isn't unique to QEMU. Any app using JSON from the
>> shell will have the tedium of quote escaping. JSON is incredibly
>> widespread and no other apps felt it neccessary to introduce single
>> quoting support, because the benefit doesn't outweigh the interop
>> problem it introduces.
>
> The quotes were introduced for C code (and especially qtest), not for
> the shell. We have something like
>
> response = qmp("{ 'execute': 'qom-get', 'arguments': { 'path': %s, "
> "'property': 'temperature' } }", id);
>
> These are sent to QEMU as double-quoted strings (the single-quoted
> JSON is parsed to get interpolation and printed back; commit
> 563890c7c7, "libqtest: escape strings in QMP commands, fix leak",
> 2014-07-01). However, doing the interpolation requires a parser that
> recognizes the single-quoted strings.
Doing interpolation requires a parser that recognizes %-sequences.
Single quote support isn't *required*, but quite desirable to let us
avoid leaning toothpick syndrome (LTS).
Example: compare the above to
response = qmp("{ \"execute\": \"qom-get\", \"arguments\": { \"path\": %s, "
"\"property\": \"temperature\" } }", id);
We kept the interpolation extension out of the external interfaces, but
not the single quotes.
> Markus, did you rebuild the qtests after disabling single-quoted
> strings? "make check-qtest-x86_64" would have rebuilt them, but I'm
> confused by the results.
I ran "make check" and looked at the failures:
* check-qjson.c
- escaped_string() covers \'. Naturally, this fails.
- escaped_string() and utf8_string() try every string twice, first in
double quotes, then in single quotes. Naturally, the latter fails.
- string_with_quotes() tests unquoted single quote in double-quoted
string, and unquoted double quote in single-quoted string.
Naturally, the latter fails.
- large_dict() and simple_whitespace() use single quotes to avoid LTS.
This is the test my "The unit test testing the JSON parser is of
course excused" referred to.
* test-qobject-input-visitor.c
* qtest/qmp-test.c
More LTS avoidance.
This is "The remaining qtest and the unit test could perhaps be
dismissed as atypical use of QEMU from C."
* tests/qemu-iotests/
Unlike the tests above, these use *external* interfaces.
In shell, we need to use double quotes to get parameter expansion. We
then use single quotes to avoid LTS.
The Python code has less excuse, I think.
Still confused?
next prev parent reply other threads:[~2021-02-23 9:08 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-02-22 14:57 A brief look at deprecating our JSON extensions over RFC 8259 Markus Armbruster
2021-02-22 15:10 ` Peter Krempa
2021-02-22 15:24 ` Daniel P. Berrangé
2021-02-22 15:43 ` Liviu Ionescu
2021-02-22 17:47 ` Paolo Bonzini
2021-02-22 17:54 ` Daniel P. Berrangé
2021-02-22 18:06 ` Paolo Bonzini
2021-02-23 9:31 ` Markus Armbruster
2021-02-23 9:37 ` Markus Armbruster
2021-02-23 11:03 ` Peter Maydell
2021-02-23 12:43 ` Markus Armbruster
2021-02-23 9:06 ` Markus Armbruster [this message]
2021-02-23 10:59 ` Paolo Bonzini
2021-02-23 12:34 ` Markus Armbruster
2021-02-22 17:42 ` Paolo Bonzini
2021-02-22 18:01 ` Daniel P. Berrangé
2021-02-22 18:22 ` Peter Krempa
2021-02-22 18:25 ` Peter Krempa
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87y2fff90p.fsf@dusky.pond.sub.org \
--to=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=jsnow@redhat.com \
--cc=libvir-list@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.