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

Reply via email to