From 0f6bf4d2e90d02eec9209f1dd70b22e3c6cc5463 Mon Sep 17 00:00:00 2001 From: Mauro Asprea Date: Tue, 19 Apr 2011 20:29:01 +0200 Subject: [PATCH] Add GAE support --- .hgignore | 14 +++++++++++++ wordpress_xmlrpc/base.py | 15 ++++++++++--- wordpress_xmlrpc/xmlrpc.py | 43 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 3 deletions(-) create mode 100644 .hgignore create mode 100644 wordpress_xmlrpc/xmlrpc.py diff --git a/.hgignore b/.hgignore new file mode 100644 index 0000000..061bb60 --- /dev/null +++ b/.hgignore @@ -0,0 +1,14 @@ +# use glob syntax. +syntax: glob + +*.settings +*.DS_Store +*.elc +*.pyc +*.tmp_* +org.eclipse.* +project/var* +project/eggs* +project/docs* +docs* + diff --git a/wordpress_xmlrpc/base.py b/wordpress_xmlrpc/base.py index d1cae6c..a2aff81 100644 --- a/wordpress_xmlrpc/base.py +++ b/wordpress_xmlrpc/base.py @@ -1,6 +1,7 @@ import xmlrpclib import collections import types +from wordpress_xmlrpc.xmlrpc import GAEXMLRPCTransport class Client(object): @@ -11,13 +12,21 @@ class Client(object): `XmlrpcMethod`-derived class to `Client`'s `call` method. """ - def __init__(self, url, username, password, blog_id=0): + def __init__(self, url, username, password, blog_id=0, appengine_mode=False): self.url = url self.username = username self.password = password self.blog_id = blog_id - - self.server = xmlrpclib.ServerProxy(url, use_datetime=True, allow_none=True) + if not appengine_mode: + self.server = xmlrpclib.ServerProxy(url, use_datetime=True, allow_none=True) + else: + import urllib + type, uri = urllib.splittype(url) + self.server = xmlrpclib.ServerProxy(url, + use_datetime=True, + allow_none=True, + transport=GAEXMLRPCTransport(protocol=type, + use_datetime=True)) self.supported_methods = self.server.mt.supportedMethods() def call(self, method): diff --git a/wordpress_xmlrpc/xmlrpc.py b/wordpress_xmlrpc/xmlrpc.py new file mode 100644 index 0000000..aeaeb55 --- /dev/null +++ b/wordpress_xmlrpc/xmlrpc.py @@ -0,0 +1,43 @@ +import sys +import xmlrpclib +import logging + +from google.appengine.api import urlfetch + +class GAEXMLRPCTransport(object): + """Handles an HTTP transaction to an XML-RPC server.""" + + def __init__(self, use_datetime=0, protocol='http', content_type='text/xml'): + self._use_datetime = use_datetime + self._content_type = content_type + self._protocol = protocol + + def request(self, host, handler, request_body, verbose=0): + result = None + url = '%s://%s%s' % (self._protocol, host, handler) + try: + response = urlfetch.fetch(url, + payload=request_body, + method=urlfetch.POST, + headers={'Content-Type': self._content_type}) + except: + msg = 'Failed to fetch %s' % url + logging.error(msg) + raise xmlrpclib.ProtocolError(host + handler, 500, msg, {}) + + if response.status_code != 200: + logging.error('%s returned status code %s' % + (url, response.status_code)) + raise xmlrpclib.ProtocolError(host + handler, + response.status_code, + "", + response.headers) + else: + result = self.__parse_response(response.content) + + return result + + def __parse_response(self, response_body): + p, u = xmlrpclib.getparser(use_datetime=self._use_datetime) + p.feed(response_body) + return u.close()