LEFT | RIGHT |
1 """Simple XML-RPC Server. | 1 """Simple XML-RPC Server. |
2 | 2 |
3 This module can be used to create simple XML-RPC servers | 3 This module can be used to create simple XML-RPC servers |
4 by creating a server and either installing functions, a | 4 by creating a server and either installing functions, a |
5 class instance, or by extending the SimpleXMLRPCServer | 5 class instance, or by extending the SimpleXMLRPCServer |
6 class. | 6 class. |
7 | 7 |
8 It can also be used to handle XML-RPC requests in a CGI | 8 It can also be used to handle XML-RPC requests in a CGI |
9 environment using CGIXMLRPCRequestHandler. | 9 environment using CGIXMLRPCRequestHandler. |
10 | 10 |
(...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
482 self.send_header("X-traceback", traceback.format_exc()) | 482 self.send_header("X-traceback", traceback.format_exc()) |
483 | 483 |
484 self.end_headers() | 484 self.end_headers() |
485 else: | 485 else: |
486 # got a valid XML RPC response | 486 # got a valid XML RPC response |
487 self.send_response(200) | 487 self.send_response(200) |
488 self.send_header("Content-type", "text/xml") | 488 self.send_header("Content-type", "text/xml") |
489 self.send_header("Content-length", str(len(response))) | 489 self.send_header("Content-length", str(len(response))) |
490 self.end_headers() | 490 self.end_headers() |
491 self.wfile.write(response) | 491 self.wfile.write(response) |
492 self.wfile.flush() | 492 |
493 · | |
494 def report_404 (self): | 493 def report_404 (self): |
495 # Report a 404 error | 494 # Report a 404 error |
496 self.send_response(404) | 495 self.send_response(404) |
497 response = 'No such page' | 496 response = 'No such page' |
498 self.send_header("Content-type", "text/plain") | 497 self.send_header("Content-type", "text/plain") |
499 self.send_header("Content-length", str(len(response))) | 498 self.send_header("Content-length", str(len(response))) |
500 self.end_headers() | 499 self.end_headers() |
501 self.wfile.write(response) | 500 self.wfile.write(response) |
502 self.wfile.flush() | 501 |
503 ········ | |
504 def log_request(self, code='-', size='-'): | 502 def log_request(self, code='-', size='-'): |
505 """Selectively log an accepted request.""" | 503 """Selectively log an accepted request.""" |
506 | 504 |
507 if self.server.logRequests: | 505 if self.server.logRequests: |
508 BaseHTTPServer.BaseHTTPRequestHandler.log_request(self, code, size) | 506 BaseHTTPServer.BaseHTTPRequestHandler.log_request(self, code, size) |
509 | 507 |
510 class SimpleXMLRPCServer(SocketServer.TCPServer, | 508 class SimpleXMLRPCServer(SocketServer.TCPServer, |
511 SimpleXMLRPCDispatcher): | 509 SimpleXMLRPCDispatcher): |
512 """Simple XML-RPC server. | 510 """Simple XML-RPC server. |
513 | 511 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
545 """Simple handler for XML-RPC data passed through CGI.""" | 543 """Simple handler for XML-RPC data passed through CGI.""" |
546 | 544 |
547 def __init__(self, allow_none=False, encoding=None): | 545 def __init__(self, allow_none=False, encoding=None): |
548 SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding) | 546 SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding) |
549 | 547 |
550 def handle_xmlrpc(self, request_text): | 548 def handle_xmlrpc(self, request_text): |
551 """Handle a single XML-RPC request""" | 549 """Handle a single XML-RPC request""" |
552 | 550 |
553 response = self._marshaled_dispatch(request_text) | 551 response = self._marshaled_dispatch(request_text) |
554 | 552 |
555 print 'Content-Type: text/xml' | 553 print 'Content-Type: text/xml' |
556 print 'Content-Length: %d' % len(response) | 554 print 'Content-Length: %d' % len(response) |
557 print | 555 print |
558 sys.stdout.write(response) | 556 sys.stdout.write(response) |
559 | 557 |
560 def handle_get(self): | 558 def handle_get(self): |
561 """Handle a single HTTP GET request. | 559 """Handle a single HTTP GET request. |
562 | 560 |
563 Default implementation indicates an error because | 561 Default implementation indicates an error because |
564 XML-RPC uses the POST method. | 562 XML-RPC uses the POST method. |
565 """ | 563 """ |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
601 request_text = sys.stdin.read(length) | 599 request_text = sys.stdin.read(length) |
602 | 600 |
603 self.handle_xmlrpc(request_text) | 601 self.handle_xmlrpc(request_text) |
604 | 602 |
605 if __name__ == '__main__': | 603 if __name__ == '__main__': |
606 print 'Running XML-RPC server on port 8000' | 604 print 'Running XML-RPC server on port 8000' |
607 server = SimpleXMLRPCServer(("localhost", 8000)) | 605 server = SimpleXMLRPCServer(("localhost", 8000)) |
608 server.register_function(pow) | 606 server.register_function(pow) |
609 server.register_function(lambda x,y: x+y, 'add') | 607 server.register_function(lambda x,y: x+y, 'add') |
610 server.serve_forever() | 608 server.serve_forever() |
LEFT | RIGHT |