Skip to content

Commit 36596a3

Browse files
committed
- fix issue #6106, Telnet.process_rawq default handling of WILL/WONT/DO/DONT
1 parent f346ac0 commit 36596a3

4 files changed

Lines changed: 51 additions & 1 deletion

File tree

Lib/telnetlib.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -459,7 +459,7 @@ def process_rawq(self):
459459
# unless we did a WILL/DO before.
460460
self.msg('IAC %d not recognized' % ord(c))
461461
elif len(self.iacseq) == 2:
462-
cmd = self.iacseq[1]
462+
cmd = self.iacseq[1:2]
463463
self.iacseq = b''
464464
opt = c
465465
if cmd in (DO, DONT):

Lib/test/test_telnetlib.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import telnetlib
44
import time
55
import queue
6+
import sys
7+
import io
68

79
from unittest import TestCase
810
from test import support
@@ -304,6 +306,20 @@ def do_nego(self, sock, cmd, opt):
304306
self.sb_seen += sb_data
305307

306308
tl = telnetlib
309+
310+
class TelnetDebuglevel(tl.Telnet):
311+
''' Telnet-alike that captures messages written to stdout when
312+
debuglevel > 0
313+
'''
314+
_messages = ''
315+
def msg(self, msg, *args):
316+
orig_stdout = sys.stdout
317+
sys.stdout = fake_stdout = io.StringIO()
318+
tl.Telnet.msg(self, msg, *args)
319+
self._messages += fake_stdout.getvalue()
320+
sys.stdout = orig_stdout
321+
return
322+
307323
class OptionTests(TestCase):
308324
setUp = _read_setUp
309325
tearDown = _read_tearDown
@@ -363,6 +379,36 @@ def test_SB_commands(self):
363379
self.assertEqual(b'', telnet.read_sb_data())
364380
nego.sb_getter = None # break the nego => telnet cycle
365381

382+
def _test_debuglevel(self, data, expected_msg):
383+
""" helper for testing debuglevel messages """
384+
self.setUp()
385+
self.dataq.put(data)
386+
telnet = TelnetDebuglevel(HOST, self.port)
387+
telnet.set_debuglevel(1)
388+
self.dataq.join()
389+
txt = telnet.read_all()
390+
self.assertTrue(expected_msg in telnet._messages,
391+
msg=(telnet._messages, expected_msg))
392+
self.tearDown()
393+
394+
def test_debuglevel(self):
395+
# test all the various places that self.msg(...) is called
396+
given_a_expect_b = [
397+
# Telnet.fill_rawq
398+
(b'a', ": recv b''\n"),
399+
# Telnet.process_rawq
400+
(tl.IAC + bytes([88]), ": IAC 88 not recognized\n"),
401+
(tl.IAC + tl.DO + bytes([1]), ": IAC DO 1\n"),
402+
(tl.IAC + tl.DONT + bytes([1]), ": IAC DONT 1\n"),
403+
(tl.IAC + tl.WILL + bytes([1]), ": IAC WILL 1\n"),
404+
(tl.IAC + tl.WONT + bytes([1]), ": IAC WONT 1\n"),
405+
# Telnet.write
406+
# XXX, untested
407+
]
408+
for a, b in given_a_expect_b:
409+
self._test_debuglevel([a, EOF_sigil], b)
410+
return
411+
366412
def test_main(verbose=None):
367413
support.run_unittest(GeneralTests, ReadTests, OptionTests)
368414

Misc/ACKS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -709,6 +709,7 @@ Michael Stone
709709
Ken Stox
710710
Dan Stromberg
711711
Daniel Stutzbach
712+
Pal Subbiah
712713
Nathan Sullivan
713714
Mark Summerfield
714715
Hisao Suzuki

Misc/NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ C-API
6060
Library
6161
-------
6262

63+
- Issue #6106: telnetlib.Telnet.process_rawq doesn't handle default WILL/WONT
64+
DO/DONT correctly.
65+
6366
- Issue #1424152: Fix for http.client, urllib.request to support SSL while
6467
working through proxy. Original patch by Christopher Li, changes made by
6568
Senthil Kumaran

0 commit comments

Comments
 (0)