Index: third_party/twisted_8_1/twisted/web/distrib.py |
diff --git a/third_party/twisted_8_1/twisted/web/distrib.py b/third_party/twisted_8_1/twisted/web/distrib.py |
deleted file mode 100644 |
index df2141be77bbae64a1cf1effd0a473e7422308a5..0000000000000000000000000000000000000000 |
--- a/third_party/twisted_8_1/twisted/web/distrib.py |
+++ /dev/null |
@@ -1,303 +0,0 @@ |
-# -*- test-case-name: twisted.web.test.test_web -*- |
- |
-# Copyright (c) 2001-2004 Twisted Matrix Laboratories. |
-# See LICENSE for details. |
- |
- |
-"""Distributed web servers. |
- |
-This is going to have to be refactored so that argument parsing is done |
-by each subprocess and not by the main web server (i.e. GET, POST etc.). |
-""" |
- |
-# System Imports |
-import types, os, copy, string, cStringIO |
-if (os.sys.platform != 'win32') and (os.name != 'java'): |
- import pwd |
- |
-# Twisted Imports |
-from twisted.spread import pb |
-from twisted.web import http |
-from twisted.python import log |
-from twisted.persisted import styles |
-from twisted.web.woven import page |
-from twisted.internet import address, reactor |
- |
-# Sibling Imports |
-import resource |
-import server |
-import error |
-import html |
-import static |
-from server import NOT_DONE_YET |
- |
-class _ReferenceableProducerWrapper(pb.Referenceable): |
- def __init__(self, producer): |
- self.producer = producer |
- |
- def remote_resumeProducing(self): |
- self.producer.resumeProducing() |
- |
- def remote_pauseProducing(self): |
- self.producer.pauseProducing() |
- |
- def remote_stopProducing(self): |
- self.producer.stopProducing() |
- |
- |
-class Request(pb.RemoteCopy, server.Request): |
- def setCopyableState(self, state): |
- for k in 'host', 'client': |
- tup = state[k] |
- addrdesc = {'INET': 'TCP', 'UNIX': 'UNIX'}[tup[0]] |
- addr = {'TCP': lambda: address.IPv4Address(addrdesc, |
- tup[1], tup[2], |
- _bwHack='INET'), |
- 'UNIX': lambda: address.UNIXAddress(tup[1])}[addrdesc]() |
- state[k] = addr |
- pb.RemoteCopy.setCopyableState(self, state) |
- # Emulate the local request interface -- |
- self.content = cStringIO.StringIO(self.content_data) |
- self.write = self.remote.remoteMethod('write') |
- self.finish = self.remote.remoteMethod('finish') |
- self.setHeader = self.remote.remoteMethod('setHeader') |
- self.addCookie = self.remote.remoteMethod('addCookie') |
- self.setETag = self.remote.remoteMethod('setETag') |
- self.setResponseCode = self.remote.remoteMethod('setResponseCode') |
- self.setLastModified = self.remote.remoteMethod('setLastModified') |
- |
- def registerProducer(self, producer, streaming): |
- self.remote.callRemote("registerProducer", |
- _ReferenceableProducerWrapper(producer), |
- streaming).addErrback(self.fail) |
- |
- def unregisterProducer(self): |
- self.remote.callRemote("unregisterProducer").addErrback(self.fail) |
- |
- def fail(self, failure): |
- log.err(failure) |
- |
- |
-pb.setCopierForClass(server.Request, Request) |
- |
-class Issue: |
- def __init__(self, request): |
- self.request = request |
- |
- def finished(self, result): |
- if result != NOT_DONE_YET: |
- assert isinstance(result, types.StringType),\ |
- "return value not a string" |
- self.request.write(result) |
- self.request.finish() |
- |
- def failed(self, failure): |
- #XXX: Argh. FIXME. |
- failure = str(failure) |
- self.request.write( |
- error.ErrorPage(http.INTERNAL_SERVER_ERROR, |
- "Server Connection Lost", |
- "Connection to distributed server lost:" + |
- html.PRE(failure)). |
- render(self.request)) |
- self.request.finish() |
- log.msg(failure) |
- |
- |
-class ResourceSubscription(resource.Resource): |
- isLeaf = 1 |
- waiting = 0 |
- def __init__(self, host, port): |
- resource.Resource.__init__(self) |
- self.host = host |
- self.port = port |
- self.pending = [] |
- self.publisher = None |
- |
- def __getstate__(self): |
- """Get persistent state for this ResourceSubscription. |
- """ |
- # When I unserialize, |
- state = copy.copy(self.__dict__) |
- # Publisher won't be connected... |
- state['publisher'] = None |
- # I won't be making a connection |
- state['waiting'] = 0 |
- # There will be no pending requests. |
- state['pending'] = [] |
- return state |
- |
- def connected(self, publisher): |
- """I've connected to a publisher; I'll now send all my requests. |
- """ |
- log.msg('connected to publisher') |
- publisher.broker.notifyOnDisconnect(self.booted) |
- self.publisher = publisher |
- self.waiting = 0 |
- for request in self.pending: |
- self.render(request) |
- self.pending = [] |
- |
- def notConnected(self, msg): |
- """I can't connect to a publisher; I'll now reply to all pending |
- requests. |
- """ |
- log.msg("could not connect to distributed web service: %s" % msg) |
- self.waiting = 0 |
- self.publisher = None |
- for request in self.pending: |
- request.write("Unable to connect to distributed server.") |
- request.finish() |
- self.pending = [] |
- |
- def booted(self): |
- self.notConnected("connection dropped") |
- |
- def render(self, request): |
- """Render this request, from my server. |
- |
- This will always be asynchronous, and therefore return NOT_DONE_YET. |
- It spins off a request to the pb client, and either adds it to the list |
- of pending issues or requests it immediately, depending on if the |
- client is already connected. |
- """ |
- if not self.publisher: |
- self.pending.append(request) |
- if not self.waiting: |
- self.waiting = 1 |
- bf = pb.PBClientFactory() |
- timeout = 10 |
- if self.host == "unix": |
- reactor.connectUNIX(self.port, bf, timeout) |
- else: |
- reactor.connectTCP(self.host, self.port, bf, timeout) |
- d = bf.getRootObject() |
- d.addCallbacks(self.connected, self.notConnected) |
- |
- else: |
- i = Issue(request) |
- self.publisher.callRemote('request', request).addCallbacks(i.finished, i.failed) |
- return NOT_DONE_YET |
- |
-class ResourcePublisher(pb.Root, styles.Versioned): |
- def __init__(self, site): |
- self.site = site |
- |
- persistenceVersion = 2 |
- |
- def upgradeToVersion2(self): |
- self.application.authorizer.removeIdentity("web") |
- del self.application.services[self.serviceName] |
- del self.serviceName |
- del self.application |
- del self.perspectiveName |
- |
- def getPerspectiveNamed(self, name): |
- return self |
- |
- def remote_request(self, request): |
- res = self.site.getResourceFor(request) |
- log.msg( request ) |
- return res.render(request) |
- |
-class UserDirectory(page.Page): |
- userDirName = 'public_html' |
- userSocketName = '.twistd-web-pb' |
- |
- template = """ |
-<html> |
- <head> |
- <title>twisted.web.distrib.UserDirectory</title> |
- <style> |
- |
- a |
- { |
- font-family: Lucida, Verdana, Helvetica, Arial, sans-serif; |
- color: #369; |
- text-decoration: none; |
- } |
- |
- th |
- { |
- font-family: Lucida, Verdana, Helvetica, Arial, sans-serif; |
- font-weight: bold; |
- text-decoration: none; |
- text-align: left; |
- } |
- |
- pre, code |
- { |
- font-family: "Courier New", Courier, monospace; |
- } |
- |
- p, body, td, ol, ul, menu, blockquote, div |
- { |
- font-family: Lucida, Verdana, Helvetica, Arial, sans-serif; |
- color: #000; |
- } |
- |
- </style> |
- <base view="Attributes" model="base" /> |
- </head> |
- |
- <body> |
- <h1>twisted.web.distrib.UserDirectory</h1> |
- |
- <ul view="List" model="directory"> |
- <li pattern="listItem"><a view="Link" /> </li> |
- </ul> |
-</body> |
-</html> |
- """ |
- |
- def wmfactory_base(self, request): |
- return {'href':request.prePathURL()} |
- |
- def wmfactory_directory(self, request): |
- m = [] |
- for user in pwd.getpwall(): |
- pw_name, pw_passwd, pw_uid, pw_gid, pw_gecos, pw_dir, pw_shell \ |
- = user |
- realname = string.split(pw_gecos,',')[0] |
- if not realname: |
- realname = pw_name |
- if os.path.exists(os.path.join(pw_dir, self.userDirName)): |
- m.append({ |
- 'href':'%s/'%pw_name, |
- 'text':'%s (file)'%realname |
- }) |
- twistdsock = os.path.join(pw_dir, self.userSocketName) |
- if os.path.exists(twistdsock): |
- linknm = '%s.twistd' % pw_name |
- m.append({ |
- 'href':'%s/'%linknm, |
- 'text':'%s (twistd)'%realname}) |
- return m |
- |
- def getChild(self, name, request): |
- if name == '': |
- return self |
- |
- td = '.twistd' |
- |
- if name[-len(td):] == td: |
- username = name[:-len(td)] |
- sub = 1 |
- else: |
- username = name |
- sub = 0 |
- try: |
- pw_name, pw_passwd, pw_uid, pw_gid, pw_gecos, pw_dir, pw_shell \ |
- = pwd.getpwnam(username) |
- except KeyError: |
- return error.NoResource() |
- if sub: |
- twistdsock = os.path.join(pw_dir, self.userSocketName) |
- rs = ResourceSubscription('unix',twistdsock) |
- self.putChild(name, rs) |
- return rs |
- else: |
- path = os.path.join(pw_dir, self.userDirName) |
- if not os.path.exists(path): |
- return error.NoResource() |
- return static.File(path) |