Update of /cvsroot/freevo/freevo/src/www
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22672/www
Modified Files:
server.py
Log Message:
support non blocking write
Index: server.py
===================================================================
RCS file: /cvsroot/freevo/freevo/src/www/server.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** server.py 21 Oct 2004 18:01:44 -0000 1.1
--- server.py 4 Nov 2004 17:37:33 -0000 1.2
***************
*** 47,60 ****
! class socketStream:
- def __init__(self,sock):
- self.sock=sock
- self.closed=1
-
- def write(self,data):
- self.sock.send(data)
class RequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
--- 47,132 ----
! class ResultStream:
! """
! A wrapper class for sending a result to the www client. It is possible
! to send strings using the write function. After that, it is also possible
! to use the writefd function to send the content of a file descriptor
! to the client. You can only call writefd once and can not use write after
! using writefd.
! """
! def __init__(self, sock):
! self.sock = sock
! self.closed = 1
! self.buffer = cStringIO.StringIO()
! self.__blocked = False
! self.__datafd = None
! self.__close = False
+ def write(self, data):
+ """
+ Send data to the client
+ """
+ if self.__blocked:
+ return self.buffer.write(data)
+ try:
+ return self.sock.send(data)
+ except socket.error, e:
+ self.__blocked = True
+ notifier.addSocket(self.sock, self.__nf_callback, notifier.IO_OUT)
+ return self.buffer.write(data)
+
+
+ def writefd(self, fd):
+ """
+ Send the content of the fd to the client. The fd will be closed
+ after everything is sent.
+ """
+ if self.__blocked:
+ self.__datafd = fd
+ else:
+ self.__blocked = True
+ self.buffer = fd
+ notifier.addSocket(self.sock, self.__nf_callback, notifier.IO_OUT)
+
+
+ def close(self):
+ """
+ Wrapper for close(). This won't really close the fd, it will still
+ try to send all blocked data to the client.
+ """
+ if self.__blocked:
+ self.__close = True
+ else:
+ self.sock.close()
+
+
+ def __nf_callback(self, sock):
+ """
+ Internal callback for notifier
+ """
+ data = self.buffer.read(16384)
+ if not data:
+ # no more data in the buffer. Check if we have a fd
+ # the send more data from
+ if self.__datafd:
+ self.buffer.close()
+ self.buffer = self.__datafd
+ self.__datafd = None
+ return True
+ self.__blocked = False
+ if self.__close:
+ self.buffer.close()
+ self.sock.close()
+ return False
+ try:
+ return self.sock.send(data)
+ except socket.error, e:
+ # This function has called because it is possible to send.
+ # If it still doesn't work, the connection is broken
+ self.sock.close()
+ return False
+
class RequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
***************
*** 62,67 ****
self.client_address=addr
self.connection=conn
self.server=server
! self.wfile=socketStream(conn)
self.buffer=cStringIO.StringIO()
notifier.addSocket(conn, self.read_socket)
--- 134,140 ----
self.client_address=addr
self.connection=conn
+ self.connection.setblocking(0)
self.server=server
! self.wfile=ResultStream(conn)
self.buffer=cStringIO.StringIO()
notifier.addSocket(conn, self.read_socket)
***************
*** 71,79 ****
data = socket.recv(1000)
if len(data) == 0:
! return self.finish()
self.buffer.write(data)
if data.find('\r\n\r\n') != -1:
self.handle_request_line()
!
def do_GET(self):
--- 144,154 ----
data = socket.recv(1000)
if len(data) == 0:
! self.finish()
! return False
self.buffer.write(data)
if data.find('\r\n\r\n') != -1:
self.handle_request_line()
! return True
!
def do_GET(self):
***************
*** 104,108 ****
self.end_headers()
! self.copyfile(f, self.wfile)
return None
--- 179,183 ----
self.end_headers()
! self.wfile.writefd(f)
return None
***************
*** 114,118 ****
module = path[1:].replace('/', '.')
if not self.server.resources.has_key(path):
! exec('import %s.%s as r' % (self.server.scripts[1], module))
self.server.resources[path] = r
else:
--- 189,194 ----
module = path[1:].replace('/', '.')
if not self.server.resources.has_key(path):
! exec('import %s.%s as r' % \
! (self.server.scripts[1], module))
self.server.resources[path] = r
else:
***************
*** 204,208 ****
def finish(self):
notifier.removeSocket( self.connection )
! self.connection.close()
--- 280,284 ----
def finish(self):
notifier.removeSocket( self.connection )
! self.wfile.close()
***************
*** 237,248 ****
except socket.error:
print 'warning: server accept() threw an exception'
! return
except TypeError:
print 'warning: server accept() threw EWOULDBLOCK'
! return
! # creates an instance of the handler class to handle the request/response
! # on the incoming connexion
self.handler(conn, addr, self)
!
--- 313,324 ----
except socket.error:
print 'warning: server accept() threw an exception'
! return True
except TypeError:
print 'warning: server accept() threw EWOULDBLOCK'
! return True
! # creates an instance of the handler class to handle the
! # request/response on the incoming connexion
self.handler(conn, addr, self)
! return True
-------------------------------------------------------
This SF.Net email is sponsored by:
Sybase ASE Linux Express Edition - download now for FREE
LinuxWorld Reader's Choice Award Winner for best database on Linux.
http://ads.osdn.com/?ad_id=5588&alloc_id=12065&op=click
_______________________________________________
Freevo-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog