From: "Daniel P. Berrange" <berrange@redhat.com>
To: Luiz Capitulino <lcapitulino@redhat.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] Hack qmp.py to support reading a JSON multi-line response
Date: Mon, 20 Aug 2012 19:25:02 +0100 [thread overview]
Message-ID: <20120820182502.GB4801@redhat.com> (raw)
In-Reply-To: <20120820150311.5363c46e@doriath.home>
On Mon, Aug 20, 2012 at 03:03:11PM -0300, Luiz Capitulino wrote:
> On Mon, 20 Aug 2012 15:01:37 +0100
> "Daniel P. Berrange" <berrange@redhat.com> wrote:
>
> > From: "Daniel P. Berrange" <berrange@redhat.com>
> >
> > The qmp-shell code assumes the JSON response is only on a single
> > line. If the QEMU monitor is configured in "pretty print" mode
> > the JSON response can be multi-line. The basic Python JSON APIs
> > do not appear to support a streaming mode, so the simple hack
> > here is to try parsing a line, and if it fails, then read another
> > line, append it, and try parsing again. Keep reading lines until
> > we can successfully parse
> >
> > Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
> > ---
> > QMP/qmp.py | 16 ++++++++++++----
> > 1 file changed, 12 insertions(+), 4 deletions(-)
> >
> > diff --git a/QMP/qmp.py b/QMP/qmp.py
> > index 36ecc1d..464a01a 100644
> > --- a/QMP/qmp.py
> > +++ b/QMP/qmp.py
> > @@ -61,10 +61,18 @@ class QEMUMonitorProtocol:
> >
> > def __json_read(self, only_event=False):
> > while True:
> > - data = self.__sockfile.readline()
> > - if not data:
> > - return
> > - resp = json.loads(data)
> > + data = ""
> > + while True:
> > + moredata = self.__sockfile.readline()
> > + if not moredata:
> > + return
> > + data = data + moredata
> > + try:
> > + resp = json.loads(data)
> > + break
> > + except ValueError:
> > + pass
> > +
>
> I'm reluctant about this, because it makes it impossible to detect bad
> json from qemu (not that qmp-shell handles this gracefully today).
Yeah, it is slightly unpleasant.
> At the same time I can't think of anything simpler than your hack. What
> about calling json.loads() when closing } matches the number of opening ones?
> QMP responses are always dictionaries.
How about making multi-line processing an optional feature, by adding
a '-m' flag to qmp-shell. That way we still get error checking by
default
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
next prev parent reply other threads:[~2012-08-20 18:25 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-20 14:01 [Qemu-devel] [PATCH] Hack qmp.py to support reading a JSON multi-line response Daniel P. Berrange
2012-08-20 18:03 ` Luiz Capitulino
2012-08-20 18:25 ` Daniel P. Berrange [this message]
2012-08-20 18:28 ` Luiz Capitulino
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=20120820182502.GB4801@redhat.com \
--to=berrange@redhat.com \
--cc=lcapitulino@redhat.com \
--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.