--- tcpwatch.py.orig	2004-06-17 00:03:46 UTC
+++ tcpwatch.py
@@ -71,8 +71,8 @@ Revision information:
 $Id: tcpwatch.py,v 1.9 2004/06/17 00:03:46 shane Exp $
 """
 
-from __future__ import nested_scopes
 
+
 VERSION = '1.3'
 COPYRIGHT = (
     'TCPWatch %s Copyright 2001 Shane Hathaway, Zope Corporation'
@@ -346,7 +346,7 @@ class BasicObserver:
         if not show_cr:
             data = data.replace('\r', '')
         lines = data.split('\n')
-        lines = map(escape, lines)
+        lines = list(map(escape, lines))
         s = ('\n%s' % arrow).join(lines)
         self.write(s)
 
@@ -472,13 +472,13 @@ def setupTk(titlepart, config_info, colorized=1):
     """Starts the Tk application and returns an observer factory.
     """
 
-    import Tkinter
-    from ScrolledText import ScrolledText
-    from Queue import Queue, Empty
+    import tkinter
+    from tkinter.scrolledtext import ScrolledText
+    from queue import Queue, Empty
     try:
-        from cStringIO import StringIO
+        from io import StringIO
     except ImportError:
-        from StringIO import StringIO
+        from io import StringIO
 
     startup_text = COPYRIGHT + ("""
 
@@ -489,11 +489,11 @@ the list on the left to see the data transferred.
 """ % config_info)
 
 
-    class TkTCPWatch (Tkinter.Frame):
+    class TkTCPWatch (tkinter.Frame):
         '''The tcpwatch top-level window.
         '''
         def __init__(self, master):
-            Tkinter.Frame.__init__(self, master)
+            tkinter.Frame.__init__(self, master)
             self.createWidgets()
             # connections maps ids to TkConnectionObservers.
             self.connections = {}
@@ -502,15 +502,15 @@ the list on the left to see the data transferred.
             self.processQueue()
 
         def createWidgets(self):
-            listframe = Tkinter.Frame(self)
-            listframe.pack(side=Tkinter.LEFT, fill=Tkinter.BOTH, expand=1)
-            scrollbar = Tkinter.Scrollbar(listframe, orient=Tkinter.VERTICAL)
-            self.connectlist = Tkinter.Listbox(
+            listframe = tkinter.Frame(self)
+            listframe.pack(side=tkinter.LEFT, fill=tkinter.BOTH, expand=1)
+            scrollbar = tkinter.Scrollbar(listframe, orient=tkinter.VERTICAL)
+            self.connectlist = tkinter.Listbox(
                 listframe, yscrollcommand=scrollbar.set, exportselection=0)
             scrollbar.config(command=self.connectlist.yview)
-            scrollbar.pack(side=Tkinter.RIGHT, fill=Tkinter.Y)
+            scrollbar.pack(side=tkinter.RIGHT, fill=tkinter.Y)
             self.connectlist.pack(
-                side=Tkinter.LEFT, fill=Tkinter.BOTH, expand=1)
+                side=tkinter.LEFT, fill=tkinter.BOTH, expand=1)
             self.connectlist.bind('<Button-1>', self.mouseListSelect)
             self.textbox = ScrolledText(self, background="#ffffff")
             self.textbox.tag_config("message", foreground="#000000")
@@ -520,32 +520,32 @@ the list on the left to see the data transferred.
             self.textbox.tag_config("server", foreground="#770000")
             self.textbox.tag_config(
                 "serveresc", foreground="#770000", background="#dddddd")
-            self.textbox.insert(Tkinter.END, startup_text, "message")
-            self.textbox.pack(side='right', fill=Tkinter.BOTH, expand=1)
-            self.pack(fill=Tkinter.BOTH, expand=1)
+            self.textbox.insert(tkinter.END, startup_text, "message")
+            self.textbox.pack(side='right', fill=tkinter.BOTH, expand=1)
+            self.pack(fill=tkinter.BOTH, expand=1)
 
         def addConnection(self, id, conn):
             self.connections[id] = conn
             connectlist = self.connectlist
-            connectlist.insert(Tkinter.END, id)
+            connectlist.insert(tkinter.END, id)
 
         def updateConnection(self, id, output):
             if id == self.showingid:
                 textbox = self.textbox
                 for data, style in output:
-                    textbox.insert(Tkinter.END, data, style)
+                    textbox.insert(tkinter.END, data, style)
 
         def mouseListSelect(self, event=None):
             connectlist = self.connectlist
             idx = connectlist.nearest(event.y)
             sel = connectlist.get(idx)
             connections = self.connections
-            if connections.has_key(sel):
+            if sel in connections:
                 self.showingid = ''
                 output = connections[sel].getOutput()
-                self.textbox.delete(1.0, Tkinter.END)
+                self.textbox.delete(1.0, tkinter.END)
                 for data, style in output:
-                    self.textbox.insert(Tkinter.END, data, style)
+                    self.textbox.insert(tkinter.END, data, style)
                 self.showingid = sel
 
         def processQueue(self):
@@ -630,7 +630,7 @@ the list on the left to see the data transferred.
             # Escape the input data.
             was_escaped = 0
             start_idx = 0
-            for idx in xrange(len(data)):
+            for idx in range(len(data)):
                 c = data[idx]
                 escaped = (c < ' ' and c != '\n') or c >= '\x80'
                 if was_escaped != escaped:
@@ -661,7 +661,7 @@ the list on the left to see the data transferred.
 
 
     def createApp(titlepart):
-        master = Tkinter.Tk()
+        master = tkinter.Tk()
         app = TkTCPWatch(master)
         try:
             wm_title = app.master.wm_title
@@ -1165,7 +1165,7 @@ class HTTPProxyToClientConnection (ForwardingEndpoint)
         """
         first_line = request.first_line.strip()
         if not ' ' in first_line:
-            raise ValueError, ('Malformed request: %s' % first_line)
+            raise ValueError('Malformed request: %s' % first_line)
         command, url = first_line.split(' ', 1)
         pos = url.rfind(' HTTP/')
         if pos >= 0:
@@ -1187,7 +1187,7 @@ class HTTPProxyToClientConnection (ForwardingEndpoint)
             host = request.headers.get('HOST')
             path = url
         if not host:
-            raise ValueError, ('Request type not supported: %s' % url)
+            raise ValueError('Request type not supported: %s' % url)
 
         if ':' in host:
             host, port = host.split(':')
@@ -1324,7 +1324,7 @@ def main(args):
                                         'no-record-responses',
                                         'no-record-errors',
                                        ])
-    except getopt.GetoptError, msg:
+    except getopt.GetoptError as msg:
         usageError(msg)
 
     fwd_params = []
@@ -1404,15 +1404,11 @@ def main(args):
     config_info_lines = []
     title_lst = []
     if fwd_params:
-        config_info_lines.extend(map(
-            lambda args: 'Forwarding %s:%d -> %s:%d' % args, fwd_params))
-        title_lst.extend(map(
-            lambda args: '%s:%d -> %s:%d' % args, fwd_params))
+        config_info_lines.extend(['Forwarding %s:%d -> %s:%d' % args for args in fwd_params])
+        title_lst.extend(['%s:%d -> %s:%d' % args for args in fwd_params])
     if proxy_params:
-        config_info_lines.extend(map(
-            lambda args: 'HTTP proxy listening on %s:%d' % args, proxy_params))
-        title_lst.extend(map(
-            lambda args: '%s:%d -> proxy' % args, proxy_params))
+        config_info_lines.extend(['HTTP proxy listening on %s:%d' % args for args in proxy_params])
+        title_lst.extend(['%s:%d -> proxy' % args for args in proxy_params])
     if split_http:
         config_info_lines.append('HTTP connection splitting enabled.')
     if record_directory:
@@ -1469,8 +1465,8 @@ def main(args):
         # Run the main loop.
         try:
             if mainloop is not None:
-                import thread
-                thread.start_new_thread(asyncore.loop, (), {'timeout': 1.0})
+                import _thread
+                _thread.start_new_thread(asyncore.loop, (), {'timeout': 1.0})
                 mainloop()
             else:
                 asyncore.loop(timeout=1.0)
