Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b905633

Browse files
author
Fredrik Lundh
committed
xmlrpclib for python 2.2; initial checkin
1 parent c2c12dc commit b905633

3 files changed

Lines changed: 1115 additions & 0 deletions

File tree

Demo/xmlrpc/xmlrpc_handler.py

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
#
2+
# XML-RPC SERVER
3+
# $Id$
4+
#
5+
# an asynchronous XML-RPC server for Medusa
6+
#
7+
# written by Sam Rushing
8+
#
9+
# Based on "xmlrpcserver.py" by Fredrik Lundh ([email protected])
10+
#
11+
12+
import http_server
13+
import xmlrpclib
14+
15+
import regex
16+
import string
17+
import sys
18+
19+
class xmlrpc_handler:
20+
21+
def match (self, request):
22+
# Note: /RPC2 is not required by the spec, so you may override this method.
23+
if request.uri[:5] == '/RPC2':
24+
return 1
25+
else:
26+
return 0
27+
28+
def handle_request (self, request):
29+
[path, params, query, fragment] = request.split_uri()
30+
31+
if request.command in ('post', 'put'):
32+
request.collector = collector (self, request)
33+
else:
34+
request.error (400)
35+
36+
def continue_request (self, data, request):
37+
params, method = xmlrpclib.loads (data)
38+
try:
39+
# generate response
40+
try:
41+
response = self.call (method, params)
42+
response = (response,)
43+
except:
44+
# report exception back to server
45+
response = xmlrpclib.dumps (
46+
xmlrpclib.Fault (1, "%s:%s" % (sys.exc_type, sys.exc_value))
47+
)
48+
else:
49+
response = xmlrpclib.dumps (response, methodresponse=1)
50+
except:
51+
# internal error, report as HTTP server error
52+
request.error (500)
53+
else:
54+
# got a valid XML RPC response
55+
request['Content-Type'] = 'text/xml'
56+
request.push (response)
57+
request.done()
58+
59+
def call (self, method, params):
60+
# override this method to implement RPC methods
61+
raise "NotYetImplemented"
62+
63+
class collector:
64+
65+
"gathers input for POST and PUT requests"
66+
67+
def __init__ (self, handler, request):
68+
69+
self.handler = handler
70+
self.request = request
71+
self.data = ''
72+
73+
# make sure there's a content-length header
74+
cl = request.get_header ('content-length')
75+
76+
if not cl:
77+
request.error (411)
78+
else:
79+
cl = string.atoi (cl)
80+
# using a 'numeric' terminator
81+
self.request.channel.set_terminator (cl)
82+
83+
def collect_incoming_data (self, data):
84+
self.data = self.data + data
85+
86+
def found_terminator (self):
87+
# set the terminator back to the default
88+
self.request.channel.set_terminator ('\r\n\r\n')
89+
self.handler.continue_request (self.data, self.request)
90+
91+
if __name__ == '__main__':
92+
93+
class rpc_demo (xmlrpc_handler):
94+
95+
def call (self, method, params):
96+
print 'method="%s" params=%s' % (method, params)
97+
return "Sure, that works"
98+
99+
import asyncore
100+
import http_server
101+
102+
hs = http_server.http_server ('', 8000)
103+
rpc = rpc_demo()
104+
hs.install_handler (rpc)
105+
106+
asyncore.loop()

Demo/xmlrpc/xmlrpcserver.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
#
2+
# XML-RPC SERVER
3+
# $Id$
4+
#
5+
# a simple XML-RPC server for Python
6+
#
7+
# History:
8+
# 1999-02-01 fl added to xmlrpclib distribution
9+
#
10+
# written by Fredrik Lundh, January 1999.
11+
#
12+
# Copyright (c) 1999 by Secret Labs AB.
13+
# Copyright (c) 1999 by Fredrik Lundh.
14+
#
15+
16+
# http://www.pythonware.com
17+
#
18+
# --------------------------------------------------------------------
19+
# Permission to use, copy, modify, and distribute this software and
20+
# its associated documentation for any purpose and without fee is
21+
# hereby granted. This software is provided as is.
22+
# --------------------------------------------------------------------
23+
#
24+
25+
import SocketServer, BaseHTTPServer
26+
import xmlrpclib
27+
import sys
28+
29+
class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
30+
31+
def do_POST(self):
32+
try:
33+
# get arguments
34+
data = self.rfile.read(int(self.headers["content-length"]))
35+
params, method = xmlrpclib.loads(data)
36+
37+
# generate response
38+
try:
39+
response = self.call(method, params)
40+
# wrap response in a singleton tuple
41+
response = (response,)
42+
except:
43+
# report exception back to server
44+
response = xmlrpclib.dumps(
45+
xmlrpclib.Fault(1, "%s:%s" % (sys.exc_type, sys.exc_value))
46+
)
47+
else:
48+
response = xmlrpclib.dumps(
49+
response,
50+
methodresponse=1
51+
)
52+
except:
53+
# internal error, report as HTTP server error
54+
self.send_response(500)
55+
self.end_headers()
56+
else:
57+
# got a valid XML RPC response
58+
self.send_response(200)
59+
self.send_header("Content-type", "text/xml")
60+
self.send_header("Content-length", str(len(response)))
61+
self.end_headers()
62+
self.wfile.write(response)
63+
64+
# shut down the connection (from Skip Montanaro)
65+
self.wfile.flush()
66+
self.connection.shutdown(1)
67+
68+
def call(self, method, params):
69+
# override this method to implement RPC methods
70+
print "CALL", method, params
71+
return params
72+
73+
if __name__ == '__main__':
74+
server = SocketServer.TCPServer(('', 8000), RequestHandler)
75+
server.serve_forever()

0 commit comments

Comments
 (0)