summaryrefslogtreecommitdiff
path: root/paste/webkit/wkresponse.py
diff options
context:
space:
mode:
authorIan Bicking <ian@ianbicking.org>2005-08-22 23:29:31 +0000
committerIan Bicking <ian@ianbicking.org>2005-08-22 23:29:31 +0000
commit82d331036f311709b77a1e3a90a9b191c9e49c61 (patch)
tree2c91bcd0181be8babe4146c3f448429e4840f29f /paste/webkit/wkresponse.py
parent36d1c63f5e12f1dfd6d5187359093a96a2fd2de4 (diff)
downloadpaste-git-82d331036f311709b77a1e3a90a9b191c9e49c61.tar.gz
Moved webkit to separate project
Diffstat (limited to 'paste/webkit/wkresponse.py')
-rw-r--r--paste/webkit/wkresponse.py273
1 files changed, 0 insertions, 273 deletions
diff --git a/paste/webkit/wkresponse.py b/paste/webkit/wkresponse.py
deleted file mode 100644
index 2738934..0000000
--- a/paste/webkit/wkresponse.py
+++ /dev/null
@@ -1,273 +0,0 @@
-"""
-A Webware HTTPResponse object.
-"""
-
-import time
-from wkcommon import NoDefault, Cookie
-from types import *
-TimeTupleType = type(time.gmtime(0))
-
-class HTTPResponse(object):
-
- def __init__(self, transaction, environ, start_response):
- self._transaction = transaction
- self._environ = environ
- self._start_response = start_response
- self._writer = None
- self._committed = False
- self._autoFlush = False
- self.reset()
-
- def endTime(self):
- return self._endTime
-
- def recordEndTime(self):
- """
- Stores the current time as the end time of the response. This
- should be invoked at the end of deliver(). It may also be
- invoked by the application for those responses that never
- deliver due to an error."""
- self._endTime = time.time()
-
- ## Headers ##
-
- def header(self, name, default=NoDefault):
- """ Returns the value of the specified header. """
- if default is NoDefault:
- return self._headers[name.lower()]
- else:
- return self._headers.get(name.lower(), default)
-
- def hasHeader(self, name):
- return self._headers.has_key(name.lower())
-
- def setHeader(self, name, value):
- """
- Sets a specific header by name.
- """
- assert self._committed==0, "Headers have already been sent"
- assert type(name) is str, (
- "Header %r name is not string" % name)
- assert type(value) is str, (
- "Header %s value is not string (%r)" % (name, value))
- self._headers[name.lower()] = value
-
- def headers(self):
- """
- Returns a dictionary-style object of all Header objects
- contained by this request. """
- return self._headers
-
- def clearHeaders(self):
- """
- Clears all the headers. You might consider a
- setHeader('Content-type', 'text/html') or something similar
- after this."""
- assert self._committed==0
- self._headers = {}
-
- ## Cookies ##
-
- def cookie(self, name):
- """ Returns the value of the specified cookie. """
- return self._cookies[name]
-
- def hasCookie(self, name):
- """
- Returns true if the specified cookie is present.
- """
- return self._cookies.has_key(name)
-
- def setCookie(self, name, value, path='/', expires='ONCLOSE',
- secure=False):
- """
- Set a cookie. You can also set the path (which defaults to /),
- You can also set when it expires. It can expire:
- 'NOW': this is the same as trying to delete it, but it
- doesn't really seem to work in IE
- 'ONCLOSE': the default behavior for cookies (expires when
- the browser closes)
- 'NEVER': some time in the far, far future.
- integer: a timestamp value
- tuple: a tuple, as created by the time module
- """
- cookie = Cookie(name, value)
- if expires == 'ONCLOSE' or not expires:
- pass # this is already default behavior
- elif expires == 'NOW' or expires == 'NEVER':
- t = time.gmtime(time.time())
- if expires == 'NEVER':
- t = (t[0] + 10,) + t[1:]
- t = time.strftime("%a, %d-%b-%Y %H:%M:%S GMT", t)
- cookie.setExpires(t)
- else:
- t = expires
- if type(t) is StringType and t and t[0] == '+':
- interval = timeDecode(t[1:])
- t = time.time() + interval
- if type(t) in (IntType, LongType,FloatType):
- t = time.gmtime(t)
- if type(t) in (TupleType, TimeTupleType):
- t = time.strftime("%a, %d-%b-%Y %H:%M:%S GMT", t)
- cookie.setExpires(t)
- if path:
- cookie.setPath(path)
- if secure:
- cookie.setSecure(secure)
- self.addCookie(cookie)
-
- def addCookie(self, cookie):
- """
- Adds a cookie that will be sent with this response.
- cookie is a Cookie object instance. See WebKit.Cookie.
- """
- assert self._committed==0
- assert isinstance(cookie, Cookie)
- self._cookies[cookie.name()] = cookie
-
- def delCookie(self, name):
- """
- Deletes a cookie at the browser. To do so, one has
- to create and send to the browser a cookie with
- parameters that will cause the browser to delete it.
- """
- if self._cookies.has_key(name):
- self._cookies[name].delete()
- else:
- cookie = Cookie(name, None)
- cookie.delete()
- self.addCookie(cookie)
-
- def cookies(self):
- """
- Returns a dictionary-style object of all Cookie objects that will be sent
- with this response.
- """
- return self._cookies
-
- def clearCookies(self):
- """ Clears all the cookies. """
- assert self._committed==0
- self._cookies = {}
-
- ## Status ##
-
- def setStatus(self, code, msg=''):
- """ Set the status code of the response, such as 200, 'OK'. """
- assert self._committed==0, "Headers already sent."
- self.setHeader('Status', str(code) + ' ' + msg)
-
- ## Special responses ##
-
- def sendError(self, code, msg=''):
- """
- Sets the status code to the specified code and message.
- """
- assert self._committed==0, "Response already partially sent"
- self.setStatus(code, msg)
-
- def sendRedirect(self, url):
- """
- This method sets the headers and content for the redirect, but
- does NOT change the cookies. Use clearCookies() as
- appropriate.
-
- @@ 2002-03-21 ce: I thought cookies were ignored by user
- agents if a redirect occurred. We should verify and update
- code or docs as appropriate.
- """
- # ftp://ftp.isi.edu/in-notes/rfc2616.txt
- # Sections: 10.3.3 and others
-
- assert self._committed==0, "Headers already sent"
-
- self.setHeader('Status', '302 Redirect')
- self.setHeader('Location', url)
- self.setHeader('Content-type', 'text/html')
-
- self.write('<html> <body> This page has been redirected to '
- '<a href="%s">%s</a>. </body> </html>' % (url, url))
-
- ## Output ##
-
- def write(self, charstr=None):
- """
- Write charstr to the response stream.
- """
- import pdb
- if not charstr:
- return
- if self._autoFlush:
- assert self._committed
- self._writer(charstr)
- else:
- self._output.append(charstr)
-
- def flush(self, autoFlush=True):
- """
- Send all accumulated response data now. Commits the response
- headers and tells the underlying stream to flush. if
- autoFlush is true, the responseStream will flush itself
- automatically from now on.
- """
- if not self._committed:
- self.commit()
- if self._output:
- self._writer(''.join(self._output))
- self._autoFlush = autoFlush
-
- def isCommitted(self):
- """
- Has the reponse already been partially or completely sent? If
- this returns true, no new headers/cookies can be added to the
- response.
- """
- return self._committed
-
- def deliver(self):
- """
- The final step in the processing cycle.
- Not used for much with responseStreams added.
- """
- self.recordEndTime()
- if not self._committed: self.commit()
-
- def commit(self):
- """
- Write out all headers to the reponse stream, and tell the
- underlying response stream it can start sending data.
- """
- status = self._headers['status']
- del self._headers['status']
- headers = self._headers.items()
- for cookie in self._cookies.values():
- headers.append(('Set-Cookie', cookie.headerValue()))
- self._writer = self._start_response(status, headers)
- self._committed = True
-
- def wsgiIterator(self):
- return self._output
-
- def recordSession(self):
- raise NotImplementedError
-
- def reset(self):
- """
- Resets the response (such as headers, cookies and contents).
- """
-
- assert self._committed == 0
- self._headers = {}
- self.setHeader('Content-type','text/html')
- self.setHeader('Status', '200 OK')
- self._cookies = {}
- self._output = []
-
- def rawResponse(self):
- raise NotImplementedError
-
- def size(self):
- raise NotImplementedError
-
- def mergeTextHeaders(self, headerstr):
- raise NotImplementedError