[CalendarServer-changes] [5162] CalendarServer/trunk/twext/web2
source_changes at macosforge.org
source_changes at macosforge.org
Sat Feb 20 08:38:24 PST 2010
Revision: 5162
http://trac.macosforge.org/projects/calendarserver/changeset/5162
Author: wsanchez at apple.com
Date: 2010-02-20 08:38:20 -0800 (Sat, 20 Feb 2010)
Log Message:
-----------
Nix web2.compat
Modified Paths:
--------------
CalendarServer/trunk/twext/web2/http.py
CalendarServer/trunk/twext/web2/test/test_server.py
Removed Paths:
-------------
CalendarServer/trunk/twext/web2/compat.py
CalendarServer/trunk/twext/web2/test/test_compat.py
Deleted: CalendarServer/trunk/twext/web2/compat.py
===================================================================
--- CalendarServer/trunk/twext/web2/compat.py 2010-02-20 16:21:37 UTC (rev 5161)
+++ CalendarServer/trunk/twext/web2/compat.py 2010-02-20 16:38:20 UTC (rev 5162)
@@ -1,473 +0,0 @@
-
-##
-# Copyright (c) 2009 Twisted Matrix Laboratories.
-# Copyright (c) 2010 Apple Computer, Inc. All rights reserved.
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in all
-# copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-#
-##
-
-
-from __future__ import generators
-
-from urllib import quote, string
-
-import UserDict, math, time
-from cStringIO import StringIO
-
-from twext.web2 import http_headers, iweb, stream, responsecode
-from twisted.internet import defer, address
-from twisted.python import components
-from twisted.spread import pb
-
-from zope.interface import implements
-
-class HeaderAdapter(UserDict.DictMixin):
- def __init__(self, headers):
- self._headers = headers
-
- def __getitem__(self, name):
- raw = self._headers.getRawHeaders(name)
- if raw is None:
- raise KeyError(name)
- return ', '.join(raw)
-
- def __setitem__(self, name, value):
- self._headers.setRawHeaders([value])
-
- def __delitem__(self, name):
- if not self._headers.hasHeader(name):
- raise KeyError(name)
- self._headers.removeHeader(name)
-
- def iteritems(self):
- for k,v in self._headers.getAllRawHeaders():
- yield k, ', '.join(v)
-
- def keys(self):
- return [k for k, _ in self.iteritems()]
-
- def __iter__(self):
- for k, _ in self.iteritems():
- yield k
-
- def has_key(self, name):
- return self._headers.hasHeader(name)
-
-def makeOldRequestAdapter(original):
- # Cache the adapter. Replace this with a more better generalized
- # mechanism when one becomes available.
- if not hasattr(original, '_oldRequest'):
- original._oldRequest = OldRequestAdapter(original)
- return original._oldRequest
-
-def _addressToTuple(addr):
- if isinstance(addr, address.IPv4Address):
- return ('INET', addr.host, addr.port)
- elif isinstance(addr, address.UNIXAddress):
- return ('UNIX', addr.name)
- else:
- return tuple(addr)
-
-class OldRequestAdapter(pb.Copyable, components.Componentized, object):
- """Adapt old requests to new request
- """
- implements(iweb.IOldRequest)
-
- def _getFrom(where, name):
- def _get(self):
- return getattr(getattr(self, where), name)
- return property(_get)
-
- def _getsetFrom(where, name):
- def _get(self):
- return getattr(getattr(self, where), name)
- def _set(self, new):
- setattr(getattr(self, where), name, new)
- def _del(self):
- delattr(getattr(self, where), name)
- return property(_get, _set, _del)
-
- def _getsetHeaders(where):
- def _get(self):
- headers = getattr(self, where).headers
- return HeaderAdapter(headers)
-
- def _set(self, newheaders):
- headers = http_headers.Headers()
- for n,v in newheaders.items():
- headers.setRawHeaders(n, (v,))
- newheaders = headers
- getattr(self, where).headers = newheaders
-
- return property(_get, _set)
-
-
- code = _getsetFrom('response', 'code')
- code_message = ""
-
- method = _getsetFrom('request', 'method')
- uri = _getsetFrom('request', 'uri')
- def _getClientproto(self):
- return "HTTP/%d.%d" % self.request.clientproto
- clientproto = property(_getClientproto)
-
- received_headers = _getsetHeaders('request')
- headers = _getsetHeaders('response')
- path = _getsetFrom('request', 'path')
-
- # cookies = # Do I need this?
- # received_cookies = # Do I need this?
- content = StringIO() #### FIXME
- args = _getsetFrom('request', 'args')
- # stack = # WTF is stack?
- prepath = _getsetFrom('request', 'prepath')
- postpath = _getsetFrom('request', 'postpath')
-
- def _getClient(self):
- return "WTF"
- client = property(_getClient)
-
- def _getHost(self):
- return address.IPv4Address("TCP", self.request.host, self.request.port)
- host = property(_getHost)
-
- def __init__(self, request):
- from twext.web2 import http
- components.Componentized.__init__(self)
- self.request = request
- self.response = http.Response(stream=stream.ProducerStream())
- # This deferred will be fired by the first call to write on OldRequestAdapter
- # and will cause the headers to be output.
- self.deferredResponse = defer.Deferred()
-
- def getStateToCopyFor(self, issuer):
- # This is for distrib compatibility
- x = {}
-
- x['prepath'] = self.prepath
- x['postpath'] = self.postpath
- x['method'] = self.method
- x['uri'] = self.uri
-
- x['clientproto'] = self.clientproto
- self.content.seek(0, 0)
- x['content_data'] = self.content.read()
- x['remote'] = pb.ViewPoint(issuer, self)
-
- x['host'] = _addressToTuple(self.request.chanRequest.channel.transport.getHost())
- x['client'] = _addressToTuple(self.request.chanRequest.channel.transport.getPeer())
-
- return x
-
- def getTypeToCopy(self):
- # lie to PB so the ResourcePublisher doesn't have to know web2 exists
- # which is good because web2 doesn't exist.
- return 'twisted.web.server.Request'
-
- def registerProducer(self, producer, streaming):
- self.response.stream.registerProducer(producer, streaming)
-
- def unregisterProducer(self):
- self.response.stream.unregisterProducer()
-
- def finish(self):
- if self.deferredResponse is not None:
- d = self.deferredResponse
- self.deferredResponse = None
- d.callback(self.response)
- self.response.stream.finish()
-
- def write(self, data):
- if self.deferredResponse is not None:
- d = self.deferredResponse
- self.deferredResponse = None
- d.callback(self.response)
- self.response.stream.write(data)
-
- def getHeader(self, name):
- raw = self.request.headers.getRawHeaders(name)
- if raw is None:
- return None
- return ', '.join(raw)
-
- def setHeader(self, name, value):
- """Set an outgoing HTTP header.
- """
- self.response.headers.setRawHeaders(name, [value])
-
- def setResponseCode(self, code, message=None):
- # message ignored
- self.response.code = code
-
- def setLastModified(self, when):
- # Never returns CACHED -- can it and still be compliant?
- when = long(math.ceil(when))
- self.response.headers.setHeader('last-modified', when)
- return None
-
- def setETag(self, etag):
- self.response.headers.setRawHeaders('etag', [etag])
- return None
-
- def getAllHeaders(self):
- return dict(self.headers.iteritems())
-
- def getRequestHostname(self):
- return self.request.host
-
-
- def getCookie(self, key):
- for cookie in self.request.headers.getHeader('cookie', ()):
- if cookie.name == key:
- return cookie.value
-
- return None
-
- def addCookie(self, k, v, expires=None, domain=None, path=None, max_age=None, comment=None, secure=None):
- if expires is None and max_age is not None:
- expires=max_age-time.time()
- cookie = http_headers.Cookie(k,v, expires=expires, domain=domain, path=path, comment=comment, secure=secure)
- self.response.headers.setHeader('set-cookie', self.request.headers.getHeader('set-cookie', ())+(cookie,))
-
- def notifyFinish(self):
- ### FIXME
- return None
-# return self.request.notifyFinish()
-
- def getHost(self):
- return self.host
-
- def setHost(self, host, port, ssl=0):
- self.request.host = host
- self.request.port = port
- self.request.scheme = ssl and 'https' or 'http'
-
- def isSecure(self):
- return self.request.scheme == 'https'
-
- def getClientIP(self):
- if isinstance(self.request.chanRequest.getRemoteHost(), address.IPv4Address):
- return self.client.host
- else:
- return None
- return self.request.chanRequest.getRemoteHost()
- return "127.0.0.1"
-
- def getClient(self):
- return "127.0.0.1"
-
-### FIXME:
- def getUser(self):
- return ""
-
- def getPassword(self):
- return ""
-
-# Identical to original methods -- hopefully these don't have to change
- def sibLink(self, name):
- "Return the text that links to a sibling of the requested resource."
- if self.postpath:
- return (len(self.postpath)*"../") + name
- else:
- return name
-
- def childLink(self, name):
- "Return the text that links to a child of the requested resource."
- lpp = len(self.postpath)
- if lpp > 1:
- return ((lpp-1)*"../") + name
- elif lpp == 1:
- return name
- else: # lpp == 0
- if len(self.prepath) and self.prepath[-1]:
- return self.prepath[-1] + '/' + name
- else:
- return name
-
- def redirect(self, url):
- """Utility function that does a redirect.
-
- The request should have finish() called after this.
- """
- self.setResponseCode(responsecode.FOUND)
- self.setHeader("location", url)
-
- def prePathURL(self):
- port = self.getHost().port
- if self.isSecure():
- default = 443
- else:
- default = 80
- if port == default:
- hostport = ''
- else:
- hostport = ':%d' % port
- return quote('http%s://%s%s/%s' % (
- self.isSecure() and 's' or '',
- self.getRequestHostname(),
- hostport,
- string.join(self.prepath, '/')), "/:")
-
-# def URLPath(self):
-# from twisted.python import urlpath
-# return urlpath.URLPath.fromRequest(self)
-
-# But nevow wants it to look like this... :(
- def URLPath(self):
- from nevow import url
- return url.URL.fromContext(self)
-
- def rememberRootURL(self, url=None):
- """
- Remember the currently-processed part of the URL for later
- recalling.
- """
- if url is None:
- url = self.prePathURL()
- # remove one segment
- self.appRootURL = url[:url.rindex("/")]
- else:
- self.appRootURL = url
-
- def getRootURL(self):
- """
- Get a previously-remembered URL.
- """
- return self.appRootURL
-
-
- session = None
-
- def getSession(self, sessionInterface = None):
- # Session management
- if not self.session:
- # FIXME: make sitepath be something
- cookiename = string.join(['TWISTED_SESSION'] + self.sitepath, "_")
- sessionCookie = self.getCookie(cookiename)
- if sessionCookie:
- try:
- self.session = self.site.getSession(sessionCookie)
- except KeyError:
- pass
- # if it still hasn't been set, fix it up.
- if not self.session:
- self.session = self.site.makeSession()
- self.addCookie(cookiename, self.session.uid, path='/')
- self.session.touch()
- if sessionInterface:
- return self.session.getComponent(sessionInterface)
- return self.session
-
-
-class OldNevowResourceAdapter(object):
- implements(iweb.IResource)
-
- def __init__(self, original):
- # Can't use self.__original= because of __setattr__.
- self.__dict__['_OldNevowResourceAdapter__original']=original
-
- def __getattr__(self, name):
- return getattr(self.__original, name)
-
- def __setattr__(self, name, value):
- setattr(self.__original, name, value)
-
- def __delattr__(self, name):
- delattr(self.__original, name)
-
- def locateChild(self, ctx, segments):
- from twext.web2.server import parsePOSTData
- request = iweb.IRequest(ctx)
- if request.method == "POST":
- return parsePOSTData(request).addCallback(
- lambda x: self.__original.locateChild(ctx, segments))
- return self.__original.locateChild(ctx, segments)
-
- def renderHTTP(self, ctx):
- from twext.web2.server import parsePOSTData
- request = iweb.IRequest(ctx)
- if request.method == "POST":
- return parsePOSTData(request).addCallback(self.__reallyRender, ctx)
- return self.__reallyRender(None, ctx)
-
- def __reallyRender(self, ignored, ctx):
- # This deferred will be called when our resource is _finished_
- # writing, and will make sure we write the rest of our data
- # and finish the connection.
- defer.maybeDeferred(self.__original.renderHTTP, ctx).addCallback(self.__finish, ctx)
-
- # Sometimes the __original.renderHTTP will write() before we
- # even get this far, and we don't want to return
- # oldRequest.deferred if it's already been set to None.
- oldRequest = iweb.IOldRequest(ctx)
- if oldRequest.deferredResponse is None:
- return oldRequest.response
- return oldRequest.deferredResponse
-
- def __finish(self, data, ctx):
- oldRequest = iweb.IOldRequest(ctx)
- oldRequest.write(data)
- oldRequest.finish()
-
-
-class OldResourceAdapter(object):
- implements(iweb.IOldNevowResource)
-
- def __init__(self, original):
- self.original = original
-
- def __repr__(self):
- return "<%s @ 0x%x adapting %r>" % (self.__class__.__name__, id(self), self.original)
-
- def locateChild(self, req, segments):
- import server
- request = iweb.IOldRequest(req)
- if self.original.isLeaf:
- return self, server.StopTraversal
- name = segments[0]
- if name == '':
- res = self
- else:
- request.prepath.append(request.postpath.pop(0))
- res = self.original.getChildWithDefault(name, request)
- request.postpath.insert(0, request.prepath.pop())
-
- if isinstance(res, defer.Deferred):
- return res.addCallback(lambda res: (res, segments[1:]))
-
- return res, segments[1:]
-
- def _handle_NOT_DONE_YET(self, data, request):
- from twisted.web.server import NOT_DONE_YET
- if data == NOT_DONE_YET:
- # Return a deferred that will never fire, so the finish
- # callback doesn't happen. This is because, when returning
- # NOT_DONE_YET, the page is responsible for calling finish.
- return defer.Deferred()
- else:
- return data
-
- def renderHTTP(self, req):
- request = iweb.IOldRequest(req)
- result = defer.maybeDeferred(self.original.render, request).addCallback(
- self._handle_NOT_DONE_YET, request)
- return result
-
-__all__ = []
Modified: CalendarServer/trunk/twext/web2/http.py
===================================================================
--- CalendarServer/trunk/twext/web2/http.py 2010-02-20 16:21:37 UTC (rev 5161)
+++ CalendarServer/trunk/twext/web2/http.py 2010-02-20 16:38:20 UTC (rev 5162)
@@ -502,18 +502,7 @@
self.headers.setHeader("content-type", http_headers.MimeType("text", "xml"))
-from twext.web2 import compat
-components.registerAdapter(compat.makeOldRequestAdapter, iweb.IRequest, iweb.IOldRequest)
-components.registerAdapter(compat.OldNevowResourceAdapter, iweb.IOldNevowResource, iweb.IResource)
components.registerAdapter(Response, int, iweb.IResponse)
-try:
- # If twisted.web is installed, add an adapter for it
- from twisted.web import resource
-except:
- pass
-else:
- components.registerAdapter(compat.OldResourceAdapter, resource.IResource, iweb.IOldNevowResource)
-
__all__ = ['HTTPError', 'NotModifiedResponse', 'Request', 'Response', 'StatusResponse', 'RedirectResponse', 'checkIfRange', 'checkPreconditions', 'defaultPortForScheme', 'parseVersion', 'splitHostPort', "XMLResponse"]
Deleted: CalendarServer/trunk/twext/web2/test/test_compat.py
===================================================================
--- CalendarServer/trunk/twext/web2/test/test_compat.py 2010-02-20 16:21:37 UTC (rev 5161)
+++ CalendarServer/trunk/twext/web2/test/test_compat.py 2010-02-20 16:38:20 UTC (rev 5162)
@@ -1,58 +0,0 @@
-from twext.web2.test.test_server import BaseCase
-
-try:
- from twisted.web import resource
-
- class OldWebResource(resource.Resource):
- def __init__(self, message, *args, **kwargs):
- self.message = message
- resource.Resource.__init__(self, *args, **kwargs)
-
- isLeaf = True
-
- def render(self, req):
- return self.message
-
-except ImportError:
- resource = None
-
-class OldWebCompat(BaseCase):
- try:
- import twisted.web
- except ImportError:
- skip = "can't run w/o twisted.web"
- twisted.web
-
- def testOldWebResource(self):
- ow = OldWebResource('I am an OldWebResource')
-
- self.assertResponse((ow, "http://localhost/"),
- (200, {}, 'I am an OldWebResource'))
-
- def testOldWebResourceNotLeaf(self):
- ow = OldWebResource('I am not a leaf')
- ow.isLeaf = False
-
- self.assertResponse((ow, "http://localhost/"),
- (200, {}, 'I am not a leaf'))
-
- def testOldWebResourceWithChildren(self):
-
- ow = OldWebResource('I am an OldWebResource with a child')
-
- ow.isLeaf = False
-
- ow.putChild('child',
- OldWebResource('I am a child of an OldWebResource'))
-
- self.assertResponse((ow, "http://localhost/"),
- (200, {},
- 'I am an OldWebResource with a child'))
-
- self.assertResponse((ow, "http://localhost/child"),
- (200, {},
- 'I am a child of an OldWebResource'))
-
-
-if not resource:
- OldWebCompat.skip = "can't run w/o twisted.web"
Modified: CalendarServer/trunk/twext/web2/test/test_server.py
===================================================================
--- CalendarServer/trunk/twext/web2/test/test_server.py 2010-02-20 16:21:37 UTC (rev 5161)
+++ CalendarServer/trunk/twext/web2/test/test_server.py 2010-02-20 16:38:20 UTC (rev 5162)
@@ -9,7 +9,7 @@
from twisted.python import components
from twext.web2 import http, http_headers, iweb, server
-from twext.web2 import resource, stream, compat
+from twext.web2 import resource, stream
from twisted.trial import unittest
from twisted.internet import reactor, defer, address
@@ -113,29 +113,7 @@
self.failUnless(isinstance(iweb.IResource(notResource), ResourceAdapter))
- def test_oldResources(self):
- """
- Test that providers of L{IOldNevowResource} can be adapted to
- IResource automatically.
- """
- class OldResource(object):
- implements(iweb.IOldNevowResource)
- oldResource = OldResource()
- resource = iweb.IResource(oldResource)
- self.failUnless(isinstance(resource, compat.OldNevowResourceAdapter))
-
- def test_transitive(self):
- """
- Test that a special-case transitive adaption from something to
- IOldNevowResource to IResource is possible.
- """
- notResource = NotOldResource()
- resource = iweb.IResource(notResource)
- self.failUnless(isinstance(resource, compat.OldNevowResourceAdapter))
-
-
-
class SimpleRequest(server.Request):
"""I can be used in cases where a Request object is necessary
but it is benificial to bypass the chanRequest
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20100220/3b307901/attachment-0001.html>
More information about the calendarserver-changes
mailing list