]> code.delx.au - pymsnt/blob - src/tlib/proxy.py
Reimporting (0.9.5)
[pymsnt] / src / tlib / proxy.py
1 # Copyright 2004 James Bunton <james@delx.cjb.net>
2 # Licensed for distribution under the GPL version 2, check COPYING for details
3
4 from twisted.internet.ssl import ClientContextFactory
5 from twisted.internet.protocol import Protocol, ClientFactory
6 from twisted.internet import reactor
7 import utils # FLAG
8 if(utils.checkTwisted()):
9 from twisted.web.http import HTTPClient
10 else:
11 from twisted.protocols.http import HTTPClient
12
13
14 class ProxyFactory(ClientFactory):
15 def __init__(self, server, serverport, otherfac):
16 self.server, self.serverport, self.otherfac = server, serverport, otherfac
17
18 def buildProtocol(self, addr):
19 p = ProxyProtocol()
20 p.server, p.serverport, p.otherfac = self.server, self.serverport, self.otherfac
21 return p
22
23 class ProxyProtocol(HTTPClient):
24 def connectionMade(self):
25 self.ctxFactory = ClientContextFactory()
26 self.sendCommand("CONNECT", self.server + ":" + str(self.serverport))
27 self.endHeaders()
28 debug.log("proxy_connect_ssl: Sent CONNECT")
29
30 def handleStatus(self, version, status, message):
31 if(status == "200"): # Excellent
32 # Must flip over into SSL now
33 debug.log("proxy_connect_ssl: Flipping into SSL mode")
34 self.transport.startTLS(self.ctxFactory)
35 p = self.otherfac.buildProtocol(self.transport.getPeer())
36 p.makeConnection(self.transport)
37 self.transport.protocol = p
38 p.connectionMade()
39 debug.log("proxy_connect_ssl: Flipped into SSL mode successfully. Handed over to real protocol.")
40 else:
41 # Must cancel factory
42 debug.log("proxy_connect_ssl: Error with proxy")
43 self.otherfac.clientConnectionFailed(self.transport.connector, "Proxy connection failed")
44
45 def handleHeader(self, key, val):
46 pass
47
48 def handleEndHeaders(self):
49 pass
50
51 def handleResponse(self, r):
52 pass
53
54 def proxy_connect_ssl(proxy, proxyport, server, serverport, factory):
55 debug.log("proxy_connect_ssl")
56 pfac = ProxyFactory(server, serverport, factory)
57 reactor.connectTCP(proxy, proxyport, pfac)
58
59