commit-gnue
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

gnue/common/src/rpc/drivers/pw_xmlrpc ServerAda...


From: Jan Ischebeck
Subject: gnue/common/src/rpc/drivers/pw_xmlrpc ServerAda...
Date: Sat, 05 Apr 2003 07:58:23 -0500

CVSROOT:        /cvsroot/gnue
Module name:    gnue
Changes by:     Jan Ischebeck <address@hidden>  03/04/05 07:58:23

Modified files:
        common/src/rpc/drivers/pw_xmlrpc: ServerAdapter.py 

Log message:
        minor fixes + server enhancement

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue/common/src/rpc/drivers/pw_xmlrpc/ServerAdapter.py.diff?tr1=1.9&tr2=1.10&r1=text&r2=text

Patches:
Index: gnue/common/src/rpc/drivers/pw_xmlrpc/ServerAdapter.py
diff -c gnue/common/src/rpc/drivers/pw_xmlrpc/ServerAdapter.py:1.9 
gnue/common/src/rpc/drivers/pw_xmlrpc/ServerAdapter.py:1.10
*** gnue/common/src/rpc/drivers/pw_xmlrpc/ServerAdapter.py:1.9  Thu Apr  3 
14:57:20 2003
--- gnue/common/src/rpc/drivers/pw_xmlrpc/ServerAdapter.py      Sat Apr  5 
07:58:23 2003
***************
*** 41,60 ****
  #
  SERVER = 1      # ServerAdapter
  
- 
- #from gnue.common.rpc.drivers._helpers.AsyncSocketServer import 
AsyncHTTPServer
- 
- #from DebugSocketServer import HTTPServer,MyHTTPServer
- import BaseHTTPServer
- import SocketServer
- import socket
  from gnue.common.rpc import GComm
  from gnue.common.apps import GDebug
  from gnue.common.rpc.drivers._helpers import ObjectLibrarian
  from gnue.common.rpc.drivers._directory import DirectoryServer
  from gnue.common.rpc.drivers import GCommBase
  
! import string, sys
  
  try:
  
--- 41,57 ----
  #
  SERVER = 1      # ServerAdapter
  
  from gnue.common.rpc import GComm
  from gnue.common.apps import GDebug
  from gnue.common.rpc.drivers._helpers import ObjectLibrarian
  from gnue.common.rpc.drivers._directory import DirectoryServer
  from gnue.common.rpc.drivers import GCommBase
  
! from BaseHTTPServer import BaseHTTPRequestHandler;
! from SimpleHTTPServer import SimpleHTTPRequestHandler;
! import SocketServer
! 
! import string, sys, os, posixpath, urllib, socket
  
  try:
  
***************
*** 82,88 ****
    'binary': 'base64'
  }
  
! class MyHTTPServer(SocketServer.ThreadingTCPServer):
    def setParent(self,parent):
      self._parent=parent
      
--- 79,93 ----
    'binary': 'base64'
  }
  
! class MyThreadingHTTPServer(SocketServer.ThreadingTCPServer):
!   def setParent(self,parent):
!     self._parent=parent
!     
!   def server_bind(self):
!     self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
!     self.socket.bind(self.server_address)
! 
! class MyForkingHTTPServer(SocketServer.ForkingTCPServer):
    def setParent(self,parent):
      self._parent=parent
      
***************
*** 90,95 ****
--- 95,101 ----
      self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
      self.socket.bind(self.server_address)
  
+ 
  # TO BE CHECKED:
  # Python 2.1: SocketServer.ThreadingMixIn
  #SocketServer.ThreadingMixIn does not work properly
***************
*** 106,111 ****
--- 112,119 ----
  #def close_request(self, request):
  #pass
  
+ # an medusa like server 
+ #  should also be implemented: import asyncore, overwrite asyncore.dispatcher
  
  
  ##############################################################################
***************
*** 121,131 ****
        tmsg = _('Required parameter "port" not supplied') 
        raise GComm.AdapterConfigurationError, tmsg 
  
!     if hasattr(params,'loglevel'):
        self._loglevel = params['loglevel']
      else:
        self._loglevel = 1
  
      DirectoryServer.DirectoryServer.__init__(self, rpcdef, bindings, params)
      
      # To make "Object" definitions with w/non-object RPC,
--- 129,163 ----
        tmsg = _('Required parameter "port" not supplied') 
        raise GComm.AdapterConfigurationError, tmsg 
  
!     if params.has_key('bindto'):
!       self._bindto = params['bindto']
!     else:
!       self._bindto = '' # bind to all interfaces
! 
!     if params.has_key('loglevel'):
        self._loglevel = params['loglevel']
      else:
        self._loglevel = 1
  
+     if params.has_key('httpbind'):
+       self._httpbind = params['httpbind']
+       
+     self._httpserver=MyThreadingHTTPServer
+     
+     if params.has_key('servertype'):
+       if params['servertype']=='threading':
+         self._httpserver=MyThreadingHTTPServer            
+       elif params['servertype']=='forking':
+         self._httpserver=MyForkingHTTPServer
+ #      elif params['servertype']=='asyncore':
+ #        self._httpserver=MyAsyncoreDispatcher
+       else:
+         raise GComm.AdapterConfigurationError, \
+               _('Value %s for parameter "servertype" is not supported.') \
+               % params['servertype'] + _('Valid values are: threading,'+ \
+               'forking.')  #  ',asyncore.')
+       
+ 
      DirectoryServer.DirectoryServer.__init__(self, rpcdef, bindings, params)
      
      # To make "Object" definitions with w/non-object RPC,
***************
*** 150,158 ****
    #                                                                        #
    ##########################################################################
    def serve(self):
!     self._requestHandler = RequestHandler
!     self._tcpserver = MyHTTPServer(('',self._port),
!                                              self._requestHandler)
      self._tcpserver.setParent(self)
      try: 
        self._tcpserver.serve_forever()
--- 182,194 ----
    #                                                                        #
    ##########################################################################
    def serve(self):
!     if hasattr(self,'_httpbind'):
!       self._requestHandler = EnhancedRequestHandler
!     else:
!       self._requestHandler = RequestHandler
!       
!     self._tcpserver = self._httpserver((self._bindto,self._port),
!                                        self._requestHandler)
      self._tcpserver.setParent(self)
      try: 
        self._tcpserver.serve_forever()
***************
*** 364,373 ****
  
  ##############################################################################
  #
! # Class to Handle the HTTP Post Request
  #
  
! class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
  
    #
    # Handle the HTTP POST command
--- 400,409 ----
  
  ##############################################################################
  #
! # Class to Handle the HTTP Post Request for XMLRPC only
  #
  
! class RequestHandler(BaseHTTPRequestHandler):
  
    #
    # Handle the HTTP POST command
***************
*** 379,386 ****
      try:
        # get arguments
        data = self.rfile.read(int(self.headers["content-length"]))
        params, method = xmlrpclib.loads(data)
! 
        # generate response
        try:
  
--- 415,423 ----
      try:
        # get arguments
        data = self.rfile.read(int(self.headers["content-length"]))
+       
        params, method = xmlrpclib.loads(data)
!       
        # generate response
        try:
  
***************
*** 400,405 ****
--- 437,446 ----
          response = xmlrpclib.dumps(response,methodresponse=1)
      except:
        # internal error, report as HTTP server error
+       GDebug.printMesg(1,
+                        'Unexpected Exception in XML-RPC code: %s:%s' % \
+                        (sys.exc_type, sys.exc_value))
+       # TODO: try to be a bit more informative (on client side)
        self.send_response(500)
        self.end_headers()
      else:
***************
*** 414,419 ****
--- 455,484 ----
        self.wfile.flush()
        self.connection.shutdown(1)
  
+ ##############################################################################
+ #
+ # Enhanced HTTP Request Handler serving XMLRPC Post requests and allows to
+ # access appserver data directory
+ #
+ 
+ class EnhancedRequestHandler(RequestHandler,SimpleHTTPRequestHandler):
+   
+   def translate_path(self, path):
+     path = posixpath.normpath(urllib.unquote(path))
+     words = path.split('/')
+     words = filter(None, words)    
+     path = self.server._parent._httpbind
+     ## security check
+     if (type(path)!=type("") or (len(path)<4)):
+         return "/dev/null"
+     for word in words:
+       drive, word = os.path.splitdrive(word)
+       head, word = os.path.split(word)
+       if word in (os.curdir, os.pardir): continue
+       path = os.path.join(path, word)
+       
+     return path
+     
  
  ###########################
  # The following part is not used at the moment




reply via email to

[Prev in Thread] Current Thread [Next in Thread]