annotate Mac/Tools/IDE/Wsocket.py @ 25838:8540887bcec6 2.2

Backport of 2.183: Fix memory leak in add_subclass() found by NealN with valgrind.
author Guido van Rossum <guido@python.org>
date Fri, 18 Oct 2002 13:42:21 +0000
parents 7b88c12b8701
children 71a294bd7950
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10048
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
1 """Async sockets, build on top of Sam Rushing's excellent async library"""
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
2
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
3 import asyncore
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
4 import socket
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
5 from socket import AF_INET, SOCK_STREAM
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
6 import string
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
7 import cStringIO
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
8 import mimetools
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
9 import httplib
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
10
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
11
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
12 __version__ = "0.9"
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
13 __author__ = "jvr"
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
14
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
15 BUFSIZE = 512
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
16
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
17 VERBOSE = 1
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
18
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
19 class Server(asyncore.dispatcher):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
20
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
21 """Generic asynchronous server class"""
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
22
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
23 def __init__(self, port, handler_class, backlog=1, host=""):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
24 """arguments:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
25 - port: the port to listen to
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
26 - handler_class: class to handle requests
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
27 - backlog: backlog queue size (optional) (don't fully understand, see socket docs)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
28 - host: host name (optional: can be empty to use default host name)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
29 """
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
30 if VERBOSE:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
31 print "Starting", self.__class__.__name__
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
32 self.handler_class = handler_class
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
33 asyncore.dispatcher.__init__(self)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
34 self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
35 self.bind((host, port))
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
36 self.listen(backlog)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
37
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
38 def handle_accept(self):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
39 conn, addr = self.accept()
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
40 if VERBOSE:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
41 print 'Incoming Connection from %s:%d' % addr
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
42 self.handler_class(conn)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
43
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
44
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
45 class ProxyServer(Server):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
46
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
47 """Generic proxy server class"""
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
48
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
49 def __init__(self, port, handler_class, proxyaddr=None, closepartners=0):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
50 """arguments:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
51 - port: the port to listen to
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
52 - handler_class: proxy class to handle requests
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
53 - proxyaddr: a tuple containing the address and
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
54 port of a remote host to connect to (optional)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
55 - closepartners: boolean, specifies whether we should close
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
56 all proxy connections or not (optional). http seems to *not*
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
57 want this, but telnet does...
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
58 """
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
59 Server.__init__(self, port, handler_class, 1, "")
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
60 self.proxyaddr = proxyaddr
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
61 self.closepartners = closepartners
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
62
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
63 def handle_accept(self):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
64 conn, addr = self.accept()
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
65 if VERBOSE:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
66 print 'Incoming Connection from %s:%d' % addr
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
67 self.handler_class(conn, self.proxyaddr, closepartner=self.closepartners)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
68
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
69
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
70 class Connection(asyncore.dispatcher):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
71
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
72 """Generic connection class"""
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
73
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
74 def __init__(self, sock_or_address=None, readfunc=None, terminator=None):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
75 """arguments:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
76 - sock_or_address: either a socket, or a tuple containing the name
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
77 and port number of a remote host
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
78 - readfunc: callback function (optional). Will be called whenever
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
79 there is some data available, or when an appropraite terminator
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
80 is found.
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
81 - terminator: string which specifies when a read is complete (optional)"""
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
82 self._out_buffer = ""
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
83 self._in_buffer = ""
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
84 self.readfunc = readfunc
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
85 self.terminator = terminator
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
86 asyncore.dispatcher.__init__(self)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
87 if hasattr(sock_or_address, "fileno"):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
88 self.set_socket(sock_or_address)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
89 else:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
90 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
91 sock.setblocking(0)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
92 self.set_socket(sock)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
93 if sock_or_address:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
94 self.connect(sock_or_address)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
95
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
96 # public methods
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
97 def send(self, data):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
98 self._out_buffer = self._out_buffer + data
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
99
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
100 def recv(self, bytes=-1):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
101 if bytes == -1:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
102 bytes = len(self._in_buffer)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
103 data = self._in_buffer[:bytes]
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
104 self._in_buffer = self._in_buffer[bytes:]
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
105 return data
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
106
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
107 def set_terminator(self, terminator):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
108 self.terminator = terminator
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
109
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
110 # override this if you want to control the incoming data stream
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
111 def handle_incoming_data(self, data):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
112 if self.readfunc:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
113 if self.terminator:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
114 self._in_buffer = self._in_buffer + data
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
115 pos = string.find(self._in_buffer, self.terminator)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
116 if pos < 0:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
117 return
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
118 data = self._in_buffer[:pos]
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
119 self._in_buffer = self._in_buffer[pos + len(self.terminator):]
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
120 self.readfunc(data)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
121 else:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
122 self.readfunc(self._in_buffer + data)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
123 self._in_buffer = ""
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
124 else:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
125 self._in_buffer = self._in_buffer + data
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
126
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
127 # internal muck
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
128 def handle_read(self):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
129 data = asyncore.dispatcher.recv(self, BUFSIZE)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
130 if data:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
131 if VERBOSE > 2:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
132 print "incoming ->", "%x" % id(self), `data`
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
133 self.handle_incoming_data(data)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
134
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
135 def handle_write(self):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
136 if self._out_buffer:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
137 sent = self.socket.send(self._out_buffer[:BUFSIZE])
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
138 if VERBOSE > 2:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
139 print "outgoing ->", "%x" % id(self), `self._out_buffer[:sent]`
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
140 self._out_buffer = self._out_buffer[sent:]
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
141
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
142 def close(self):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
143 if self.readfunc and self._in_buffer:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
144 self.readfunc(self._in_buffer)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
145 self._in_buffer = ""
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
146 #elif VERBOSE > 1 and self._in_buffer:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
147 # print "--- there is unread data:", `self._in_buffer`
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
148 asyncore.dispatcher.close(self)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
149
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
150 def handle_close(self):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
151 self.close()
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
152
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
153 def handle_connect(self):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
154 pass
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
155
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
156
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
157 class ConnectionUI:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
158
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
159 """Glue to let a connection tell things to the UI in a standardized way.
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
160
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
161 The protocoll defines four functions, which the connection will call:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
162
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
163 def settotal(int total): gets called when the connection knows the data size
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
164 def setcurrent(int current): gets called when some new data has arrived
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
165 def done(): gets called when the transaction is complete
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
166 def error(type, value, tb): gets called wheneven an error occured
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
167 """
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
168
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
169 def __init__(self, settotal_func, setcurrent_func, done_func, error_func):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
170 self.settotal = settotal_func
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
171 self.setcurrent = setcurrent_func
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
172 self.done = done_func
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
173 self.error = error_func
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
174
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
175
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
176 class HTTPError(socket.error): pass
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
177
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
178
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
179 class HTTPClient(Connection, httplib.HTTP):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
180
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
181 """Asynchronous HTTP connection"""
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
182
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
183 def __init__(self, (host, port), datahandler, ui=None):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
184 Connection.__init__(self, (host, port))
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
185 self.datahandler = datahandler
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
186 self.ui = ui
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
187 self.buf = ""
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
188 self.doneheaders = 0
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
189 self.done = 0
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
190 self.headers = None
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
191 self.length = None
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
192 self.pos = 0
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
193
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
194 def getreply(self):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
195 raise TypeError, "getreply() is not supported in async HTTP connection"
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
196
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
197 def handle_incoming_data(self, data):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
198 assert not self.done
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
199 if not self.doneheaders:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
200 self.buf = self.buf + data
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
201 pos = string.find(self.buf, "\r\n\r\n")
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
202 if pos >= 0:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
203 self.handle_reply(self.buf[:pos+4])
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
204 length = self.headers.getheader("Content-Length")
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
205 if length is not None:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
206 self.length = int(length)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
207 if self.ui is not None:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
208 self.ui.settotal(self.length)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
209 else:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
210 self.length = -1
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
211 self.doneheaders = 1
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
212 self.handle_data(self.buf[pos+4:])
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
213 self.buf = ""
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
214 else:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
215 self.handle_data(data)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
216
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
217 def handle_reply(self, data):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
218 f = cStringIO.StringIO(data)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
219 ver, code, msg = string.split(f.readline(), None, 2)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
220 code = int(code)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
221 msg = string.strip(msg)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
222 if code <> 200:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
223 # Hm, this is what *I* need, but probably not correct...
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
224 raise HTTPError, (code, msg)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
225 self.headers = mimetools.Message(f)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
226
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
227 def handle_data(self, data):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
228 self.pos = self.pos + len(data)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
229 if self.ui is not None:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
230 self.ui.setcurrent(self.pos)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
231 self.datahandler(data)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
232 if self.pos >= self.length:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
233 self.datahandler("")
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
234 self.done = 1
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
235 if self.ui is not None:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
236 self.ui.done()
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
237
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
238 def handle_error(self, type, value, tb):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
239 if self.ui is not None:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
240 self.ui.error(type, value, tb)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
241 else:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
242 Connection.handle_error(self, type, value, tb)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
243
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
244 def log(self, message):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
245 if VERBOSE:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
246 print 'LOG:', message
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
247
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
248
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
249 class PyMessage:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
250
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
251 def __init__(self):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
252 self._buf = ""
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
253 self._len = None
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
254 self._checksum = None
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
255
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
256 def feed(self, data):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
257 self._buf = self._buf + data
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
258 if self._len is None:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
259 if len(self._buf) >= 8:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
260 import struct
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
261 self._len, self._checksum = struct.unpack("ll", self._buf[:8])
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
262 self._buf = self._buf[8:]
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
263 if self._len is not None:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
264 if len(self._buf) >= self._len:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
265 import zlib
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
266 data = self._buf[:self._len]
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
267 leftover = self._buf[self._len:]
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
268 self._buf = None
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
269 assert self._checksum == zlib.adler32(data), "corrupt data"
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
270 self.data = data
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
271 return 1, leftover
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
272 else:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
273 return 0, None
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
274 else:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
275 return 0, None
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
276
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
277
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
278 class PyConnection(Connection):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
279
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
280 def __init__(self, sock_or_address):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
281 Connection.__init__(self, sock_or_address)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
282 self.currentmessage = PyMessage()
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
283
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
284 def handle_incoming_data(self, data):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
285 while data:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
286 done, data = self.currentmessage.feed(data)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
287 if done:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
288 import cPickle
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
289 self.handle_object(cPickle.loads(self.currentmessage.data))
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
290 self.currentmessage = PyMessage()
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
291
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
292 def handle_object(self, object):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
293 print 'unhandled object:', `object`
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
294
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
295 def send(self, object):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
296 import cPickle, zlib, struct
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
297 data = cPickle.dumps(object, 1)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
298 length = len(data)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
299 checksum = zlib.adler32(data)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
300 data = struct.pack("ll", length, checksum) + data
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
301 Connection.send(self, data)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
302
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
303
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
304 class Echo(Connection):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
305
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
306 """Simple echoing connection: it sends everything back it receives."""
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
307
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
308 def handle_incoming_data(self, data):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
309 self.send(data)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
310
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
311
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
312 class Proxy(Connection):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
313
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
314 """Generic proxy connection"""
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
315
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
316 def __init__(self, sock_or_address=None, proxyaddr=None, closepartner=0):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
317 """arguments:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
318 - sock_or_address is either a socket or a tuple containing the
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
319 name and port number of a remote host
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
320 - proxyaddr: a tuple containing a name and a port number of a
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
321 remote host (optional).
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
322 - closepartner: boolean, specifies whether we should close
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
323 the proxy connection (optional)"""
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
324
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
325 Connection.__init__(self, sock_or_address)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
326 self.other = None
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
327 self.proxyaddr = proxyaddr
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
328 self.closepartner = closepartner
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
329
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
330 def close(self):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
331 if self.other:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
332 other = self.other
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
333 self.other = None
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
334 other.other = None
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
335 if self.closepartner:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
336 other.close()
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
337 Connection.close(self)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
338
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
339 def handle_incoming_data(self, data):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
340 if not self.other:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
341 # pass data for possible automatic remote host detection
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
342 # (see HTTPProxy)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
343 data = self.connectproxy(data)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
344 self.other.send(data)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
345
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
346 def connectproxy(self, data):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
347 other = self.__class__(self.proxyaddr, closepartner=self.closepartner)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
348 self.other = other
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
349 other.other = self
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
350 return data
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
351
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
352
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
353 class HTTPProxy(Proxy):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
354
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
355 """Simple, useless, http proxy. It figures out itself where to connect to."""
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
356
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
357 def connectproxy(self, data):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
358 if VERBOSE:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
359 print "--- proxy request", `data`
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
360 addr, data = de_proxify(data)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
361 other = Proxy(addr)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
362 self.other = other
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
363 other.other = self
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
364 return data
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
365
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
366
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
367 # helper for HTTPProxy
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
368 def de_proxify(data):
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
369 import re
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
370 req_pattern = "GET http://([a-zA-Z0-9-_.]+)(:([0-9]+))?"
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
371 m = re.match(req_pattern, data)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
372 host, dummy, port = m.groups()
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
373 if not port:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
374 port = 80
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
375 else:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
376 port = int(port)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
377 # change "GET http://xx.xx.xx/yy" into "GET /yy"
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
378 data = re.sub(req_pattern, "GET ", data)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
379 return (host, port), data
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
380
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
381
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
382 # if we're running "under W", let's register the socket poller to the event loop
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
383 try:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
384 import W
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
385 except:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
386 pass
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
387 else:
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
388 W.getapplication().addidlefunc(asyncore.poll)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
389
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
390
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
391 ## testing muck
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
392 #testserver = Server(10000, Connection)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
393 #echoserver = Server(10007, Echo)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
394 #httpproxyserver = Server(8088, HTTPProxy, 5)
7b88c12b8701 ??? adding this file somehow failed -- jvr
Just van Rossum <just@lettererror.com>
parents:
diff changeset
395 #asyncore.close_all()