예제 #1
0
 def _marshaled_dispatch(self, address, data):
     params, method = xmlrpclib.loads(data)
     if not self.instance.check_acls(address, method):
         raise XMLRPCACLCheckException
     try:
         if '.' not in method:
             params = (address, ) + params
         response = self.instance._dispatch(method, params, self.funcs)
         # py3k compatibility
         if type(response) not in [bool, str, list, dict]:
             response = (response.decode('utf-8'), )
         else:
             response = (response, )
         raw_response = xmlrpclib.dumps(response, methodresponse=True,
                                        allow_none=self.allow_none,
                                        encoding=self.encoding)
     except xmlrpclib.Fault:
         fault = sys.exc_info()[1]
         raw_response = xmlrpclib.dumps(fault, methodresponse=True,
                                        allow_none=self.allow_none,
                                        encoding=self.encoding)
     except:
         err = sys.exc_info()
         self.logger.error("Unexpected handler error", exc_info=1)
         # report exception back to server
         raw_response = xmlrpclib.dumps(
             xmlrpclib.Fault(1, "%s:%s" % (err[0].__name__, err[1])),
             methodresponse=True, allow_none=self.allow_none,
             encoding=self.encoding)
     return raw_response
예제 #2
0
 def _marshaled_dispatch(self, address, data):
     method_func = None
     params, method = xmlrpclib.loads(data)
     try:
         if '.' not in method:
             params = (address, ) + params
         response = self.instance._dispatch(method, params, self.funcs)
         # py3k compatibility
         if type(response) not in [bool, str, list, dict]:
             response = (response.decode('utf-8'), )
         else:
             response = (response, )
         raw_response = xmlrpclib.dumps(response,
                                        methodresponse=1,
                                        allow_none=self.allow_none,
                                        encoding=self.encoding)
     except xmlrpclib.Fault:
         fault = sys.exc_info()[1]
         raw_response = xmlrpclib.dumps(fault,
                                        allow_none=self.allow_none,
                                        encoding=self.encoding)
     except:
         self.logger.error("Unexpected handler error", exc_info=1)
         # report exception back to server
         raw_response = xmlrpclib.dumps(xmlrpclib.Fault(
             1, "%s:%s" % (sys.exc_type, sys.exc_value)),
                                        allow_none=self.allow_none,
                                        encoding=self.encoding)
     return raw_response
예제 #3
0
파일: SSLServer.py 프로젝트: ab/bcfg2
 def _marshaled_dispatch(self, address, data):
     method_func = None
     params, method = xmlrpclib.loads(data)
     try:
         if '.' not in method:
             params = (address, ) + params
         response = self.instance._dispatch(method, params, self.funcs)
         # py3k compatibility
         if type(response) not in [bool, str, list, dict]:
             response = (response.decode('utf-8'), )
         else:
             response = (response, )
         raw_response = xmlrpclib.dumps(response, methodresponse=1,
                                        allow_none=self.allow_none,
                                        encoding=self.encoding)
     except xmlrpclib.Fault:
         fault = sys.exc_info()[1]
         raw_response = xmlrpclib.dumps(fault,
                                        allow_none=self.allow_none,
                                        encoding=self.encoding)
     except:
         self.logger.error("Unexpected handler error", exc_info=1)
         # report exception back to server
         raw_response = xmlrpclib.dumps(
             xmlrpclib.Fault(1, "%s:%s" % (sys.exc_type, sys.exc_value)),
             allow_none=self.allow_none, encoding=self.encoding)
     return raw_response
예제 #4
0
 def do_POST(self):
     try:
         max_chunk_size = 10 * 1024 * 1024
         size_remaining = int(self.headers["content-length"])
         L = []
         while size_remaining:
             try:
                 select.select([self.rfile.fileno()], [], [], 3)
             except select.error:
                 print("got select timeout")
                 raise
             chunk_size = min(size_remaining, max_chunk_size)
             L.append(self.rfile.read(chunk_size).decode('utf-8'))
             size_remaining -= len(L[-1])
         data = ''.join(L)
         response = self.server._marshaled_dispatch(self.client_address,
                                                    data)
         if sys.hexversion >= 0x03000000:
             response = response.encode('utf-8')
     except:  # pylint: disable=W0702
         try:
             self.send_response(500)
             self.end_headers()
         except:
             (etype, msg) = sys.exc_info()[:2]
             self.logger.error("Error sending 500 response (%s): %s" %
                               (etype.__name__, msg))
             raise
     else:
         # got a valid XML RPC response
         # first, check ACLs
         client_address = self.request.getpeername()
         method = xmlrpclib.loads(data)[1]
         if not self.server.instance.check_acls(client_address, method):
             self.send_error(401, self.responses[401][0])
             self.end_headers()
         try:
             self.send_response(200)
             self.send_header("Content-type", "text/xml")
             self.send_header("Content-length", str(len(response)))
             self.end_headers()
             failcount = 0
             while True:
                 try:
                     # If we hit SSL3_WRITE_PENDING here try to resend.
                     self.wfile.write(response)
                     break
                 except ssl.SSLError:
                     e = sys.exc_info()[1]
                     if str(e).find("SSL3_WRITE_PENDING") < 0:
                         raise
                     self.logger.error("SSL3_WRITE_PENDING")
                     failcount += 1
                     if failcount < 5:
                         continue
                     raise
         except socket.error:
             err = sys.exc_info()[1]
             if err[0] == 32:
                 self.logger.warning("Connection dropped from %s" %
                                     self.client_address[0])
             elif err[0] == 104:
                 self.logger.warning("Connection reset by peer: %s" %
                                     self.client_address[0])
             else:
                 self.logger.warning("Socket error sending response to %s: "
                                     "%s" % (self.client_address[0], err))
         except ssl.SSLError:
             err = sys.exc_info()[1]
             self.logger.warning("SSLError handling client %s: %s" %
                                 (self.client_address[0], err))
         except:
             etype, err = sys.exc_info()[:2]
             self.logger.error("Unknown error sending response to %s: "
                               "%s (%s)" %
                               (self.client_address[0], err,
                                etype.__name__))
예제 #5
0
 def do_POST(self):
     try:
         max_chunk_size = 10 * 1024 * 1024
         size_remaining = int(self.headers["content-length"])
         L = []
         while size_remaining:
             try:
                 select.select([self.rfile.fileno()], [], [], 3)
             except select.error:
                 print("got select timeout")
                 raise
             chunk_size = min(size_remaining, max_chunk_size)
             L.append(self.rfile.read(chunk_size).decode('utf-8'))
             size_remaining -= len(L[-1])
         data = ''.join(L)
         response = self.server._marshaled_dispatch(self.client_address,
                                                    data)
         if sys.hexversion >= 0x03000000:
             response = response.encode('utf-8')
     except:  # pylint: disable=W0702
         try:
             self.send_response(500)
             self.end_headers()
         except:
             (etype, msg) = sys.exc_info()[:2]
             self.logger.error("Error sending 500 response (%s): %s" %
                               (etype.__name__, msg))
             raise
     else:
         # got a valid XML RPC response
         # first, check ACLs
         client_address = self.request.getpeername()
         method = xmlrpclib.loads(data)[1]
         if not self.server.instance.check_acls(client_address, method):
             self.send_error(401, self.responses[401][0])
             self.end_headers()
         try:
             self.send_response(200)
             self.send_header("Content-type", "text/xml")
             self.send_header("Content-length", str(len(response)))
             self.end_headers()
             failcount = 0
             while True:
                 try:
                     # If we hit SSL3_WRITE_PENDING here try to resend.
                     self.wfile.write(response)
                     break
                 except ssl.SSLError:
                     e = sys.exc_info()[1]
                     if str(e).find("SSL3_WRITE_PENDING") < 0:
                         raise
                     self.logger.error("SSL3_WRITE_PENDING")
                     failcount += 1
                     if failcount < 5:
                         continue
                     raise
         except socket.error:
             err = sys.exc_info()[1]
             if isinstance(err, socket.timeout):
                 self.logger.warning("Connection timed out for %s" %
                                     self.client_address[0])
             elif err[0] == 32:
                 self.logger.warning("Connection dropped from %s" %
                                     self.client_address[0])
             elif err[0] == 104:
                 self.logger.warning("Connection reset by peer: %s" %
                                     self.client_address[0])
             else:
                 self.logger.warning("Socket error sending response to %s: "
                                     "%s" % (self.client_address[0], err))
         except ssl.SSLError:
             err = sys.exc_info()[1]
             self.logger.warning("SSLError handling client %s: %s" %
                                 (self.client_address[0], err))
         except:
             etype, err = sys.exc_info()[:2]
             self.logger.error(
                 "Unknown error sending response to %s: "
                 "%s (%s)" % (self.client_address[0], err, etype.__name__))