Mercurial > cpython-lru_cache-weakref
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 |
| 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() |
