##// END OF EJS Templates
wireprotoserver: ensure that output stream gets flushed on exception...
Arseniy Alekseyev -
r52465:13c004b5 stable
parent child Browse files
Show More
@@ -527,24 +527,34 class sshserver:
527 def __init__(self, ui, repo, logfh=None, accesshidden=False):
527 def __init__(self, ui, repo, logfh=None, accesshidden=False):
528 self._ui = ui
528 self._ui = ui
529 self._repo = repo
529 self._repo = repo
530 self._fin, self._fout = ui.protectfinout()
531 self._accesshidden = accesshidden
530 self._accesshidden = accesshidden
532
531 self._logfh = logfh
533 # Log write I/O to stdout and stderr if configured.
534 if logfh:
535 self._fout = util.makeloggingfileobject(
536 logfh, self._fout, b'o', logdata=True
537 )
538 ui.ferr = util.makeloggingfileobject(
539 logfh, ui.ferr, b'e', logdata=True
540 )
541
532
542 def serve_forever(self):
533 def serve_forever(self):
543 self.serveuntil(threading.Event())
534 self.serveuntil(threading.Event())
544 self._ui.restorefinout(self._fin, self._fout)
545
535
546 def serveuntil(self, ev):
536 def serveuntil(self, ev):
547 """Serve until a threading.Event is set."""
537 """Serve until a threading.Event is set."""
548 _runsshserver(
538 with self._ui.protectedfinout() as (fin, fout):
549 self._ui, self._repo, self._fin, self._fout, ev, self._accesshidden
539 if self._logfh:
550 )
540 # Log write I/O to stdout and stderr if configured.
541 fout = util.makeloggingfileobject(
542 self._logfh,
543 fout,
544 b'o',
545 logdata=True,
546 )
547 self._ui.ferr = util.makeloggingfileobject(
548 self._logfh,
549 self._ui.ferr,
550 b'e',
551 logdata=True,
552 )
553 _runsshserver(
554 self._ui,
555 self._repo,
556 fin,
557 fout,
558 ev,
559 self._accesshidden,
560 )
@@ -30,7 +30,7 class bannerserver(wireprotoserver.sshse
30
30
31 def serve_forever(self):
31 def serve_forever(self):
32 for i in range(10):
32 for i in range(10):
33 self._fout.write(b'banner: line %d\n' % i)
33 self._ui.fout.write(b'banner: line %d\n' % i)
34
34
35 super(bannerserver, self).serve_forever()
35 super(bannerserver, self).serve_forever()
36
36
@@ -45,17 +45,16 class prehelloserver(wireprotoserver.ssh
45 """
45 """
46
46
47 def serve_forever(self):
47 def serve_forever(self):
48 l = self._fin.readline()
48 ui = self._ui
49 l = ui.fin.readline()
49 assert l == b'hello\n'
50 assert l == b'hello\n'
50 # Respond to unknown commands with an empty reply.
51 # Respond to unknown commands with an empty reply.
51 wireprotoserver._sshv1respondbytes(self._fout, b'')
52 wireprotoserver._sshv1respondbytes(ui.fout, b'')
52 l = self._fin.readline()
53 l = ui.fin.readline()
53 assert l == b'between\n'
54 assert l == b'between\n'
54 proto = wireprotoserver.sshv1protocolhandler(
55 proto = wireprotoserver.sshv1protocolhandler(ui, ui.fin, ui.fout)
55 self._ui, self._fin, self._fout
56 )
57 rsp = wireprotov1server.dispatch(self._repo, proto, b'between')
56 rsp = wireprotov1server.dispatch(self._repo, proto, b'between')
58 wireprotoserver._sshv1respondbytes(self._fout, rsp.data)
57 wireprotoserver._sshv1respondbytes(ui.fout, rsp.data)
59
58
60 super(prehelloserver, self).serve_forever()
59 super(prehelloserver, self).serve_forever()
61
60
@@ -25,9 +25,8 class SSHServerGetArgsTests(unittest.Tes
25
25
26 def assertparse(self, cmd, input, expected):
26 def assertparse(self, cmd, input, expected):
27 server = mockserver(input)
27 server = mockserver(input)
28 proto = wireprotoserver.sshv1protocolhandler(
28 ui = server._ui
29 server._ui, server._fin, server._fout
29 proto = wireprotoserver.sshv1protocolhandler(ui, ui.fin, ui.fout)
30 )
31 _func, spec = wireprotov1server.commands[cmd]
30 _func, spec = wireprotov1server.commands[cmd]
32 self.assertEqual(proto.getargs(spec), expected)
31 self.assertEqual(proto.getargs(spec), expected)
33
32
@@ -35,6 +34,9 class SSHServerGetArgsTests(unittest.Tes
35 def mockserver(inbytes):
34 def mockserver(inbytes):
36 ui = mockui(inbytes)
35 ui = mockui(inbytes)
37 repo = mockrepo(ui)
36 repo = mockrepo(ui)
37 # note: this test unfortunately doesn't really test anything about
38 # `sshserver` class anymore: the entirety of logic of that class lives
39 # in `serveuntil`, and that function is not even called by this test.
38 return wireprotoserver.sshserver(ui, repo)
40 return wireprotoserver.sshserver(ui, repo)
39
41
40
42
General Comments 0
You need to be logged in to leave comments. Login now