summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bitbake/lib/bb/server/xmlrpc.py68
1 files changed, 66 insertions, 2 deletions
diff --git a/bitbake/lib/bb/server/xmlrpc.py b/bitbake/lib/bb/server/xmlrpc.py
index 5d3cc3e106..c2bfe12176 100644
--- a/bitbake/lib/bb/server/xmlrpc.py
+++ b/bitbake/lib/bb/server/xmlrpc.py
@@ -45,6 +45,68 @@ if sys.hexversion < 0x020600F0:
45 print("Sorry, python 2.6 or later is required for bitbake's XMLRPC mode") 45 print("Sorry, python 2.6 or later is required for bitbake's XMLRPC mode")
46 sys.exit(1) 46 sys.exit(1)
47 47
48##
49# The xmlrpclib.Transport class has undergone various changes in Python 2.7
50# which break BitBake's XMLRPC implementation.
51# To work around this we subclass Transport and have a copy/paste of method
52# implementations from Python 2.6.6's xmlrpclib.
53#
54# Upstream Python bug is #8194 (http://bugs.python.org/issue8194)
55##
56
57class BBTransport(xmlrpclib.Transport):
58 def request(self, host, handler, request_body, verbose=0):
59 h = self.make_connection(host)
60 if verbose:
61 h.set_debuglevel(1)
62
63 self.send_request(h, handler, request_body)
64 self.send_host(h, host)
65 self.send_user_agent(h)
66 self.send_content(h, request_body)
67
68 errcode, errmsg, headers = h.getreply()
69
70 if errcode != 200:
71 raise ProtocolError(
72 host + handler,
73 errcode, errmsg,
74 headers
75 )
76
77 self.verbose = verbose
78
79 try:
80 sock = h._conn.sock
81 except AttributeError:
82 sock = None
83
84 return self._parse_response(h.getfile(), sock)
85
86 def make_connection(self, host):
87 import httplib
88 host, extra_headers, x509 = self.get_host_info(host)
89 return httplib.HTTP(host)
90
91 def _parse_response(self, file, sock):
92 p, u = self.getparser()
93
94 while 1:
95 if sock:
96 response = sock.recv(1024)
97 else:
98 response = file.read(1024)
99 if not response:
100 break
101 if self.verbose:
102 print "body:", repr(response)
103 p.feed(response)
104
105 file.close()
106 p.close()
107
108 return u.close()
109
48class BitBakeServerCommands(): 110class BitBakeServerCommands():
49 def __init__(self, server, cooker): 111 def __init__(self, server, cooker):
50 self.cooker = cooker 112 self.cooker = cooker
@@ -54,7 +116,8 @@ class BitBakeServerCommands():
54 """ 116 """
55 Register a remote UI Event Handler 117 Register a remote UI Event Handler
56 """ 118 """
57 s = xmlrpclib.Server("http://%s:%d" % (host, port), allow_none=True) 119 t = BBTransport()
120 s = xmlrpclib.Server("http://%s:%d/" % (host, port), transport=t, allow_none=True)
58 return bb.event.register_UIHhandler(s) 121 return bb.event.register_UIHhandler(s)
59 122
60 def unregisterEventHandler(self, handlerNum): 123 def unregisterEventHandler(self, handlerNum):
@@ -177,7 +240,8 @@ class BitbakeUILauch():
177 240
178class BitBakeServerConnection(): 241class BitBakeServerConnection():
179 def __init__(self, serverinfo): 242 def __init__(self, serverinfo):
180 self.connection = xmlrpclib.Server("http://%s:%s" % (serverinfo.host, serverinfo.port), allow_none=True) 243 t = BBTransport()
244 self.connection = xmlrpclib.Server("http://%s:%s" % (serverinfo.host, serverinfo.port), transport=t, allow_none=True)
181 self.events = uievent.BBUIEventQueue(self.connection) 245 self.events = uievent.BBUIEventQueue(self.connection)
182 246
183 def terminate(self): 247 def terminate(self):