summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1997-12-24 22:24:19 (GMT)
committerGuido van Rossum <guido@python.org>1997-12-24 22:24:19 (GMT)
commitccb5ec62e10e8dce424f3f03159536bdc9c10d90 (patch)
tree17ec85504666ac9f0264d4129a36609acc1d2621 /Lib
parent00f9fea288baed5a37e3866b492185b5045d30d4 (diff)
downloadcpython-ccb5ec62e10e8dce424f3f03159536bdc9c10d90.zip
cpython-ccb5ec62e10e8dce424f3f03159536bdc9c10d90.tar.gz
cpython-ccb5ec62e10e8dce424f3f03159536bdc9c10d90.tar.bz2
Added expect() method which takes a list of regular expressions and an
optional timeout. Also moved some imports around.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/telnetlib.py54
1 files changed, 52 insertions, 2 deletions
diff --git a/Lib/telnetlib.py b/Lib/telnetlib.py
index 0f20fb4..1a1c75e 100644
--- a/Lib/telnetlib.py
+++ b/Lib/telnetlib.py
@@ -30,11 +30,14 @@ Bugs:
To do:
- option negotiation
+- timeout should be intrinsic to the connection object instead of an
+ option on one of the read calls only
"""
# Imported modules
+import sys
import socket
import select
import string
@@ -371,7 +374,6 @@ class Telnet:
def interact(self):
"""Interaction function, emulates a very dumb telnet client."""
- import sys, select
while 1:
rfd, wfd, xfd = select.select([self, sys.stdin], [], [])
if sys.stdin in rfd:
@@ -388,6 +390,55 @@ class Telnet:
sys.stdout.flush()
self.close()
+ def expect(self, list, timeout=None):
+ """Read until one from a list of a regular expressions matches.
+
+ The first argument is a list of regular expressions, either
+ compiled (re.RegexObject instances) or uncompiled (strings).
+ The optional second argument is a timeout, in seconds; default
+ is no timeout.
+
+ Return a tuple of three items: the index in the list of the
+ first regular expression that matches; the match object
+ returned; and the text read up till and including the match.
+
+ If EOF is read and no text was read, raise EOFError.
+ Otherwise, when nothing matches, return (-1, None, text) where
+ text is the text received so far (may be the empty string if a
+ timeout happened).
+
+ If a regular expression ends with a greedy match (e.g. '.*')
+ or if more than one expression can match the same input, the
+ results are undeterministic, and may depend on the I/O timing.
+
+ """
+ re = None
+ list = list[:]
+ indices = range(len(list))
+ for i in indices:
+ if not hasattr(list[i], "search"):
+ if not re: import re
+ list[i] = re.compile(list[i])
+ while 1:
+ self.process_rawq()
+ for i in indices:
+ m = list[i].search(self.cookedq)
+ if m:
+ e = m.end()
+ text = self.cookedq[:e]
+ self.cookedq = self.cookedq[e:]
+ return (i, m, text)
+ if self.eof:
+ break
+ if timeout is not None:
+ r, w, x = select.select([self.fileno()], [], [], timeout)
+ if not r:
+ break
+ self.fill_rawq()
+ text = self.read_very_lazy()
+ if not text and self.eof:
+ raise EOFError
+ return (-1, None, text)
def test():
@@ -398,7 +449,6 @@ def test():
Default host is localhost; default port is 23.
"""
- import sys
debuglevel = 0
while sys.argv[1:] and sys.argv[1] == '-d':
debuglevel = debuglevel+1