- fix issue #6106, Telnet.process_rawq default handling of WILL/WONT/DO/DONT

This commit is contained in:
Jack Diederich 2009-07-26 22:23:04 +00:00
parent f346ac08e6
commit 36596a3c23
4 changed files with 51 additions and 1 deletions

View File

@ -459,7 +459,7 @@ class Telnet:
# unless we did a WILL/DO before. # unless we did a WILL/DO before.
self.msg('IAC %d not recognized' % ord(c)) self.msg('IAC %d not recognized' % ord(c))
elif len(self.iacseq) == 2: elif len(self.iacseq) == 2:
cmd = self.iacseq[1] cmd = self.iacseq[1:2]
self.iacseq = b'' self.iacseq = b''
opt = c opt = c
if cmd in (DO, DONT): if cmd in (DO, DONT):

View File

@ -3,6 +3,8 @@ import threading
import telnetlib import telnetlib
import time import time
import queue import queue
import sys
import io
from unittest import TestCase from unittest import TestCase
from test import support from test import support
@ -304,6 +306,20 @@ class nego_collector(object):
self.sb_seen += sb_data self.sb_seen += sb_data
tl = telnetlib tl = telnetlib
class TelnetDebuglevel(tl.Telnet):
''' Telnet-alike that captures messages written to stdout when
debuglevel > 0
'''
_messages = ''
def msg(self, msg, *args):
orig_stdout = sys.stdout
sys.stdout = fake_stdout = io.StringIO()
tl.Telnet.msg(self, msg, *args)
self._messages += fake_stdout.getvalue()
sys.stdout = orig_stdout
return
class OptionTests(TestCase): class OptionTests(TestCase):
setUp = _read_setUp setUp = _read_setUp
tearDown = _read_tearDown tearDown = _read_tearDown
@ -363,6 +379,36 @@ class OptionTests(TestCase):
self.assertEqual(b'', telnet.read_sb_data()) self.assertEqual(b'', telnet.read_sb_data())
nego.sb_getter = None # break the nego => telnet cycle nego.sb_getter = None # break the nego => telnet cycle
def _test_debuglevel(self, data, expected_msg):
""" helper for testing debuglevel messages """
self.setUp()
self.dataq.put(data)
telnet = TelnetDebuglevel(HOST, self.port)
telnet.set_debuglevel(1)
self.dataq.join()
txt = telnet.read_all()
self.assertTrue(expected_msg in telnet._messages,
msg=(telnet._messages, expected_msg))
self.tearDown()
def test_debuglevel(self):
# test all the various places that self.msg(...) is called
given_a_expect_b = [
# Telnet.fill_rawq
(b'a', ": recv b''\n"),
# Telnet.process_rawq
(tl.IAC + bytes([88]), ": IAC 88 not recognized\n"),
(tl.IAC + tl.DO + bytes([1]), ": IAC DO 1\n"),
(tl.IAC + tl.DONT + bytes([1]), ": IAC DONT 1\n"),
(tl.IAC + tl.WILL + bytes([1]), ": IAC WILL 1\n"),
(tl.IAC + tl.WONT + bytes([1]), ": IAC WONT 1\n"),
# Telnet.write
# XXX, untested
]
for a, b in given_a_expect_b:
self._test_debuglevel([a, EOF_sigil], b)
return
def test_main(verbose=None): def test_main(verbose=None):
support.run_unittest(GeneralTests, ReadTests, OptionTests) support.run_unittest(GeneralTests, ReadTests, OptionTests)

View File

@ -709,6 +709,7 @@ Michael Stone
Ken Stox Ken Stox
Dan Stromberg Dan Stromberg
Daniel Stutzbach Daniel Stutzbach
Pal Subbiah
Nathan Sullivan Nathan Sullivan
Mark Summerfield Mark Summerfield
Hisao Suzuki Hisao Suzuki

View File

@ -60,6 +60,9 @@ C-API
Library Library
------- -------
- Issue #6106: telnetlib.Telnet.process_rawq doesn't handle default WILL/WONT
DO/DONT correctly.
- Issue #1424152: Fix for http.client, urllib.request to support SSL while - Issue #1424152: Fix for http.client, urllib.request to support SSL while
working through proxy. Original patch by Christopher Li, changes made by working through proxy. Original patch by Christopher Li, changes made by
Senthil Kumaran Senthil Kumaran