Index: third_party/twisted_8_1/twisted/web/proxy.py |
diff --git a/third_party/twisted_8_1/twisted/web/proxy.py b/third_party/twisted_8_1/twisted/web/proxy.py |
deleted file mode 100644 |
index 98e5c41b9fd3170a6db7cc6f9808e6a0e5625ece..0000000000000000000000000000000000000000 |
--- a/third_party/twisted_8_1/twisted/web/proxy.py |
+++ /dev/null |
@@ -1,283 +0,0 @@ |
-# -*- test-case-name: twisted.web.test.test_proxy -*- |
-# Copyright (c) 2001-2007 Twisted Matrix Laboratories. |
-# See LICENSE for details. |
- |
-""" |
-Simplistic HTTP proxy support. |
- |
-This comes in two main variants - the Proxy and the ReverseProxy. |
- |
-When a Proxy is in use, a browser trying to connect to a server (say, |
-www.yahoo.com) will be intercepted by the Proxy, and the proxy will covertly |
-connect to the server, and return the result. |
- |
-When a ReverseProxy is in use, the client connects directly to the ReverseProxy |
-(say, www.yahoo.com) which farms off the request to one of a pool of servers, |
-and returns the result. |
- |
-Normally, a Proxy is used on the client end of an Internet connection, while a |
-ReverseProxy is used on the server end. |
-""" |
- |
-import urlparse |
-from urllib import quote as urlquote |
- |
-from twisted.internet import reactor |
-from twisted.internet.protocol import ClientFactory |
-from twisted.web.resource import Resource |
-from twisted.web.server import NOT_DONE_YET |
-from twisted.web.http import HTTPClient, Request, HTTPChannel |
- |
- |
- |
-class ProxyClient(HTTPClient): |
- """ |
- Used by ProxyClientFactory to implement a simple web proxy. |
- """ |
- |
- def __init__(self, command, rest, version, headers, data, father): |
- self.father = father |
- self.command = command |
- self.rest = rest |
- if "proxy-connection" in headers: |
- del headers["proxy-connection"] |
- headers["connection"] = "close" |
- self.headers = headers |
- self.data = data |
- |
- |
- def connectionMade(self): |
- self.sendCommand(self.command, self.rest) |
- for header, value in self.headers.items(): |
- self.sendHeader(header, value) |
- self.endHeaders() |
- self.transport.write(self.data) |
- |
- |
- def handleStatus(self, version, code, message): |
- if message: |
- # Add a whitespace to message, this allows empty messages |
- # transparently |
- message = " %s" % (message,) |
- self.father.transport.write("%s %s%s\r\n" % (version, code, message)) |
- |
- |
- def handleHeader(self, key, value): |
- self.father.transport.write("%s: %s\r\n" % (key, value)) |
- |
- |
- def handleEndHeaders(self): |
- self.father.transport.write("\r\n") |
- |
- |
- def handleResponsePart(self, buffer): |
- self.father.transport.write(buffer) |
- |
- |
- def handleResponseEnd(self): |
- self.transport.loseConnection() |
- self.father.channel.transport.loseConnection() |
- |
- |
- |
-class ProxyClientFactory(ClientFactory): |
- """ |
- Used by ProxyRequest to implement a simple web proxy. |
- """ |
- |
- protocol = ProxyClient |
- |
- |
- def __init__(self, command, rest, version, headers, data, father): |
- self.father = father |
- self.command = command |
- self.rest = rest |
- self.headers = headers |
- self.data = data |
- self.version = version |
- |
- |
- def buildProtocol(self, addr): |
- return self.protocol(self.command, self.rest, self.version, |
- self.headers, self.data, self.father) |
- |
- |
- def clientConnectionFailed(self, connector, reason): |
- self.father.transport.write("HTTP/1.0 501 Gateway error\r\n") |
- self.father.transport.write("Content-Type: text/html\r\n") |
- self.father.transport.write("\r\n") |
- self.father.transport.write('''<H1>Could not connect</H1>''') |
- self.father.transport.loseConnection() |
- |
- |
- |
-class ProxyRequest(Request): |
- """ |
- Used by Proxy to implement a simple web proxy. |
- |
- @ivar reactor: the reactor used to create connections. |
- @type reactor: object providing L{twisted.internet.interfaces.IReactorTCP} |
- """ |
- |
- protocols = {'http': ProxyClientFactory} |
- ports = {'http': 80} |
- |
- def __init__(self, channel, queued, reactor=reactor): |
- Request.__init__(self, channel, queued) |
- self.reactor = reactor |
- |
- |
- def process(self): |
- parsed = urlparse.urlparse(self.uri) |
- protocol = parsed[0] |
- host = parsed[1] |
- port = self.ports[protocol] |
- if ':' in host: |
- host, port = host.split(':') |
- port = int(port) |
- rest = urlparse.urlunparse(('', '') + parsed[2:]) |
- if not rest: |
- rest = rest + '/' |
- class_ = self.protocols[protocol] |
- headers = self.getAllHeaders().copy() |
- if 'host' not in headers: |
- headers['host'] = host |
- self.content.seek(0, 0) |
- s = self.content.read() |
- clientFactory = class_(self.method, rest, self.clientproto, headers, |
- s, self) |
- self.reactor.connectTCP(host, port, clientFactory) |
- |
- |
- |
-class Proxy(HTTPChannel): |
- """ |
- This class implements a simple web proxy. |
- |
- Since it inherits from L{twisted.protocols.http.HTTPChannel}, to use it you |
- should do something like this:: |
- |
- from twisted.web import http |
- f = http.HTTPFactory() |
- f.protocol = Proxy |
- |
- Make the HTTPFactory a listener on a port as per usual, and you have |
- a fully-functioning web proxy! |
- """ |
- |
- requestFactory = ProxyRequest |
- |
- |
- |
-class ReverseProxyRequest(Request): |
- """ |
- Used by ReverseProxy to implement a simple reverse proxy. |
- |
- @ivar proxyClientFactoryClass: a proxy client factory class, used to create |
- new connections. |
- @type proxyClientFactoryClass: L{ClientFactory} |
- |
- @ivar reactor: the reactor used to create connections. |
- @type reactor: object providing L{twisted.internet.interfaces.IReactorTCP} |
- """ |
- |
- proxyClientFactoryClass = ProxyClientFactory |
- |
- def __init__(self, channel, queued, reactor=reactor): |
- Request.__init__(self, channel, queued) |
- self.reactor = reactor |
- |
- |
- def process(self): |
- self.received_headers['host'] = self.factory.host |
- clientFactory = self.proxyClientFactoryClass( |
- self.method, self.uri, self.clientproto, self.getAllHeaders(), |
- self.content.read(), self) |
- self.reactor.connectTCP(self.factory.host, self.factory.port, |
- clientFactory) |
- |
- |
- |
-class ReverseProxy(HTTPChannel): |
- """ |
- Implements a simple reverse proxy. |
- |
- For details of usage, see the file examples/proxy.py. |
- """ |
- |
- requestFactory = ReverseProxyRequest |
- |
- |
- |
-class ReverseProxyResource(Resource): |
- """ |
- Resource that renders the results gotten from another server |
- |
- Put this resource in the tree to cause everything below it to be relayed |
- to a different server. |
- |
- @ivar proxyClientFactoryClass: a proxy client factory class, used to create |
- new connections. |
- @type proxyClientFactoryClass: L{ClientFactory} |
- |
- @ivar reactor: the reactor used to create connections. |
- @type reactor: object providing L{twisted.internet.interfaces.IReactorTCP} |
- """ |
- |
- proxyClientFactoryClass = ProxyClientFactory |
- |
- |
- def __init__(self, host, port, path, reactor=reactor): |
- """ |
- @param host: the host of the web server to proxy. |
- @type host: C{str} |
- |
- @param port: the port of the web server to proxy. |
- @type port: C{port} |
- |
- @param path: the base path to fetch data from. Note that you shouldn't |
- put any trailing slashes in it, it will be added automatically in |
- request. For example, if you put B{/foo}, a request on B{/bar} will |
- be proxied to B{/foo/bar}. Any required encoding of special |
- characters (such as " " or "/") should have been done already. |
- |
- @type path: C{str} |
- """ |
- Resource.__init__(self) |
- self.host = host |
- self.port = port |
- self.path = path |
- self.reactor = reactor |
- |
- |
- def getChild(self, path, request): |
- """ |
- Create and return a proxy resource with the same proxy configuration |
- as this one, except that its path also contains the segment given by |
- C{path} at the end. |
- """ |
- return ReverseProxyResource( |
- self.host, self.port, self.path + '/' + urlquote(path, safe="")) |
- |
- |
- def render(self, request): |
- """ |
- Render a request by forwarding it to the proxied server. |
- """ |
- # RFC 2616 tells us that we can omit the port if it's the default port, |
- # but we have to provide it otherwise |
- if self.port == 80: |
- request.received_headers['host'] = self.host |
- else: |
- request.received_headers['host'] = "%s:%d" % (self.host, self.port) |
- request.content.seek(0, 0) |
- qs = urlparse.urlparse(request.uri)[4] |
- if qs: |
- rest = self.path + '?' + qs |
- else: |
- rest = self.path |
- clientFactory = self.proxyClientFactoryClass( |
- request.method, rest, request.clientproto, |
- request.getAllHeaders(), request.content.read(), request) |
- self.reactor.connectTCP(self.host, self.port, clientFactory) |
- return NOT_DONE_YET |