[mod_python] More file-like behavior

Rich Salz rsalz at zolera.com
Fri May 25 09:41:44 EST 2001


The attached class provides a more complete implementation of Python's
file object.  We'd be quite pleased if it were accepted into the core.
:)
	/r$
-------------- next part --------------
#! /usr/bin/env python
##  ContentReader -- wrapper class for mod_python's request object that
##  provides a more complete set of file methods.
##  Copyright 2001, Zolera Systems, Inc.  All Rights Reserved.
##  This software is distributed under the terms of the mod_python license.
try:
    import xreadlines
except:
    pass

class ContentReader:
    '''A simple object that provides a minimal set of file methods from a
    mod_python request object.  Methods provided: read, readline, readlines,
    close, flush, and tell (and, if available, xreadlines).
    Attributes provided: closed, mode, and name.
    '''

    def __init__(self, req):
	'''req is the mod_python request handler.'''
	self.size = int(req.headers_in['content-length'])
	self.name = '<%s at 0x%x>' % (str(self.__class__), id(self))
	self.req, self.left, self.closed, self.mode = \
		req, self.size, 0, 'r'

    def read(self, size = 0):
	if self.closed: raise ValueError
	if self.left <= 0: return ''
	if size <= 0: size = self.left
	v = self.req.read(size)
	self.left = self.left - len(v)
	return v

    def readline(self, size = 0):
	v = self.req.readline(size)
	if len(v) > 1 and v[-2:] == '\r\n': v = v[:-2] + '\n'
	return v

    def readlines(self, sizehint = None):
	result = []
	while 1:
	    l = x.readline()
	    if l == '': break
	    result.append(l)
	    if sizehint != None:
		sizehint = sizehint - len(l)
		if sizehint <= 0: break
	return result

    def xreadlines(self):
	return xreadlines.xreadlines(self)

    def tell(self):
	return self.size - self.left

    def close(self):
	self.closed = 1

    def flush(self):
	pass


More information about the Mod_python mailing list