1 #=======================================================================
3 __version__
= '''0.0.07'''
4 __sub_version__
= '''20041016142240'''
5 __copyright__
= '''(c) Alex A. Naanou 2003-2004'''
8 #=======================================================================
10 import SocketServer
, BaseHTTPServer
17 #-----------------------------------------------------------------------
18 #----------------------------------------------------XMLRPCServerExit---
19 class XMLRPCServerExit(Exception):
23 #-----------------------------------------------------------------------
24 #------------------------------------------------------RequestHandler---
25 # this is based on the xmlrpc server included in xmlrpc lib
26 # (xmlrpcserver.py) written by Fredrik Lundh, January 1999
28 # Copyright (c) 1999 by Secret Labs AB.
29 # Copyright (c) 1999 by Fredrik Lundh.
30 # fredrik@pythonware.com
31 # http://www.pythonware.com
33 # this code is modified by Alex A. Naanou <alex_nanou@yahoo.com>
35 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
37 # TODO do a more thorough security check + test...
38 # TODO do a proper GET handler...
39 # TODO do a https server...
41 class RequestHandler(BaseHTTPServer
.BaseHTTPRequestHandler
):
43 this is the basic xmlrpc request handler.
46 __server_debug__
= False
48 # this enables/disables basic security
50 # this defines the iterable containing the allowed client addresses
51 ## _sec_allowed_client_addr = ['127.0.0.1']
55 the POST http command handler.
57 # do security check...
59 if self
._sec
_enabled
and hasattr(self
, '_sec_allowed_client_addr'):
60 if self
.client_address
[0] not in self
._sec
_allowed
_client
_addr
:
61 # return err response...
62 self
.send_response(403)
64 self
.wfile
.write(response
)
65 # shut down the connection
67 self
.connection
.shutdown(1)
69 # handle the actual request...
72 data
= self
.rfile
.read(int(self
.headers
["content-length"]))
73 if self
.__server
_debug
__ and self
.__verbosity
__ > 2:
80 # parse the request...
81 params
, method
= xmlrpclib
.loads(data
)
83 response
= self
.call(method
, params
)
84 if type(response
) != type(()):
85 response
= (response
,)
86 ## except XMLRPCServerExit:
87 ## ##!!! prepare for exit...
88 ## self._exit_now = True
89 ## response = xmlrpclib.dumps(0, methodresponse=1)
91 # report exception back to server
92 exc_type
, exc_value
, exc_trackback
= sys
.exc_info()
93 if self
.__server
_debug
__:
94 # TODO verbosity level...
96 print 'ERR:', "%s:%s" % (exc_type
, exc_value
)
97 if self
.__verbosity
__ > 1:
99 traceback
.print_tb(exc_trackback
)
101 response
= xmlrpclib
.dumps(xmlrpclib
.Fault(1, "%s:%s" % (exc_type
, exc_value
)))
103 ##!!! use an encoding....
104 ## response = xmlrpclib.dumps(response, methodresponse=1, encoding='cp1251')
105 response
= xmlrpclib
.dumps(response
, methodresponse
=1)
106 if self
.__server
_debug
__ and self
.__verbosity
__ > 2:
113 # internal error, report as HTTP server error
114 self
.send_response(500)
117 # got a valid XML RPC response
118 self
.send_response(200)
119 self
.send_header("Content-type", "text/xml")
120 self
.send_header("Content-length", str(len(response
)))
122 self
.wfile
.write(response
)
123 # shut down the connection (from Skip Montanaro)
125 self
.connection
.shutdown(1)
126 ## if hasattr(self, '_exit_now') and self._exit_now:
128 ## print 'Exiting...'
129 ## raise XMLRPCServerExit
134 the GET http command handler.
136 # this currently does not differ from post...
137 return self
.do_POST()
138 # override this method to implement RPC methods
139 def call(self
, method
, params
):
141 base rpc call dispatch method (not for direct use).
143 raise NotImplementedError, 'this method is not for direct use. (Call: %s(%s))' % (method
, params
)
145 ## def Error(self, faultCode=1, faultString='', **extra):
152 #=======================================================================
153 if __name__
== '__main__':
154 server
= SocketServer
.TCPServer(('', 8000), RequestHandler
)
155 server
.serve_forever()
159 #=======================================================================
160 # vim:set ts=4 sw=4 nowrap :