sshpeer: make pipe polling code more explicit
"hasbuffer" is a property on our special bufferedinputpipe class.
When reading this code, I thought it might have had something
special to do properties on built-in types. But "hasbuffer" doesn't
appear in the CPython code base for either 2.7 or 3.7, so the
answer is no.
Let's make the code more explicit about the fact that it deals with
our special bufferedinputpipe type.
Differential Revision: https://phab.mercurial-scm.org/D2382
tests: store protocol payload in files
Upcoming changes to version 2 of the SSH protocol will introduce
binary components to the protocol. It will be easier to eliminate
trailing newlines and use binary in the tests if the protocol
payload is being generated by Python.
So use inline Python to write payloads to files and pipe those files
to server processes instead of shell strings/variables.
Differential Revision: https://phab.mercurial-scm.org/D2381
sshpeer: return framed file object when needed
Currently, wireproto.wirepeer has a default implementation of
_submitbatch() and sshv1peer has a very similar implementation.
The main difference is that sshv1peer is aware of the total amount
of bytes it can read whereas the default implementation reads the
stream until no more data is returned. The default implementation
works for HTTP, since there is a known end to HTTP responses (either
Content-Length or 0 sized chunk).
This commit teaches sshv1peer to use our just-introduced "cappedreader"
class for wrapping a file object to limit the number of bytes that
can be read. We do this by introducing an argument to specify whether
the response is framed. If set, we returned a cappedreader instance
instead of the raw pipe.
_call() always has framed responses. So we set this argument
unconditionally and then .read() the entirety of the result.
Strictly speaking, we don't need to use cappedreader in this case
and can inline frame decoding/read logic. But I like when things
are consistent. The overhead should be negligible.
_callstream() and _callcompressable() are special: whether framing
is used depends on the specific command. So, we define a set
of commands that have framed response. It currently only
contains "batch."
As a result of this change, the one-off implementation of
_submitbatch() in sshv1peer can be removed since it is now
safe to .read() the response's file object until end of stream.
cappedreader takes care of not overrunning the frame.
Differential Revision: https://phab.mercurial-scm.org/D2380
sshpeer: move logic for sending a request into a new function
The **args being used to pass arbitrary command arguments is limiting
because it makes it harder to control behavior of the function.
We factor most of _callstream() into a new function that doesn't
use **args.
Differential Revision: https://phab.mercurial-scm.org/D2379
graphlog: document what "_" and "*" mean
Documenting "*" should've been a part of
9b3f95d9783d, but I somehow didn't
notice that the symbols are explained in the command's help text.