From bae3e8394b69bc55377b796baef4426e1ca5270b Mon Sep 17 00:00:00 2001 From: Lucas Lobosque Date: Fri, 17 Apr 2015 19:40:19 -0300 Subject: [PATCH 1/5] Handles 301 redirects --- wordpress_xmlrpc/base.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/wordpress_xmlrpc/base.py b/wordpress_xmlrpc/base.py index d2f4f83..5e62d65 100644 --- a/wordpress_xmlrpc/base.py +++ b/wordpress_xmlrpc/base.py @@ -1,3 +1,6 @@ +from mimetools import Message +from StringIO import StringIO + import collections import sys @@ -19,13 +22,22 @@ def __init__(self, url, username, password, blog_id=0, transport=None, verbose=F self.password = password self.blog_id = blog_id + self.setup(transport, verbose) + + + def setup(self, transport, verbose): try: - self.server = xmlrpc_client.ServerProxy(url, allow_none=True, transport=transport, + self.server = xmlrpc_client.ServerProxy(self.url, allow_none=True, transport=transport, verbose=verbose) self.supported_methods = self.server.mt.supportedMethods() except xmlrpc_client.ProtocolError: e = sys.exc_info()[1] - raise ServerConnectionError(repr(e)) + if e.errcode == 301: + headers = Message(StringIO(e.headers)) + self.url = headers['location'] + self.setup(transport, verbose) + else: + raise ServerConnectionError(repr(e)) def call(self, method): if method.method_name not in self.supported_methods: From d8969874a6c021de258bd14b5bd4cb6720934469 Mon Sep 17 00:00:00 2001 From: Lucas Lobosque Date: Mon, 13 Jul 2015 16:02:43 -0300 Subject: [PATCH 2/5] 301 redirect now works with python 3.x --- wordpress_xmlrpc/base.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wordpress_xmlrpc/base.py b/wordpress_xmlrpc/base.py index 5e62d65..0903ed7 100644 --- a/wordpress_xmlrpc/base.py +++ b/wordpress_xmlrpc/base.py @@ -1,5 +1,5 @@ -from mimetools import Message -from StringIO import StringIO +from email.message import Message +from io import StringIO import collections import sys From c99ed2faabf198a113404a152ad17ce47d1058ca Mon Sep 17 00:00:00 2001 From: Lucas Lobosque Date: Mon, 13 Jul 2015 16:54:31 -0300 Subject: [PATCH 3/5] better location getter --- wordpress_xmlrpc/base.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/wordpress_xmlrpc/base.py b/wordpress_xmlrpc/base.py index 0903ed7..062d03f 100644 --- a/wordpress_xmlrpc/base.py +++ b/wordpress_xmlrpc/base.py @@ -1,6 +1,3 @@ -from email.message import Message -from io import StringIO - import collections import sys @@ -33,8 +30,10 @@ def setup(self, transport, verbose): except xmlrpc_client.ProtocolError: e = sys.exc_info()[1] if e.errcode == 301: - headers = Message(StringIO(e.headers)) - self.url = headers['location'] + try: + self.url = e.headers['location'] + except KeyError: + self.url = e.headers['Location'] self.setup(transport, verbose) else: raise ServerConnectionError(repr(e)) From 54f0fbe3ba974b3214aa78ebed9d948a85d5437f Mon Sep 17 00:00:00 2001 From: Johni Douglas Marangon Date: Wed, 9 Dec 2015 09:04:29 -0200 Subject: [PATCH 4/5] solved problem when try to connect blogs with HTTPS --- wordpress_xmlrpc/base.py | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/wordpress_xmlrpc/base.py b/wordpress_xmlrpc/base.py index 062d03f..e1d27a1 100644 --- a/wordpress_xmlrpc/base.py +++ b/wordpress_xmlrpc/base.py @@ -1,11 +1,13 @@ import collections import sys +import urllib.parse from wordpress_xmlrpc.compat import xmlrpc_client, dict_type from wordpress_xmlrpc.exceptions import ServerConnectionError, UnsupportedXmlrpcMethodError, InvalidCredentialsError, XmlrpcDisabledError class Client(object): + """ Connection to a WordPress XML-RPC API endpoint. @@ -13,19 +15,18 @@ class Client(object): `XmlrpcMethod`-derived class to `Client`'s `call` method. """ - def __init__(self, url, username, password, blog_id=0, transport=None, verbose=False): + def __init__(self, url, username, password, blog_id=0, transport=None, verbose=False, safe_transport=None): self.url = url self.username = username self.password = password self.blog_id = blog_id - self.setup(transport, verbose) - + self.setup(transport, verbose, safe_transport) - def setup(self, transport, verbose): + def setup(self, transport, verbose, safe_transport): try: self.server = xmlrpc_client.ServerProxy(self.url, allow_none=True, transport=transport, - verbose=verbose) + verbose=verbose) self.supported_methods = self.server.mt.supportedMethods() except xmlrpc_client.ProtocolError: e = sys.exc_info()[1] @@ -34,7 +35,12 @@ def setup(self, transport, verbose): self.url = e.headers['location'] except KeyError: self.url = e.headers['Location'] - self.setup(transport, verbose) + + protocol, _ = urllib.parse.splittype(self.url) + if protocol == 'https': + transport = safe_transport + + self.setup(transport, verbose, None) else: raise ServerConnectionError(repr(e)) @@ -59,6 +65,7 @@ def call(self, method): class XmlrpcMethod(object): + """ Base class for XML-RPC methods. @@ -80,10 +87,12 @@ def __init__(self, *args, **kwargs): if self.optional_args: max_num_args = len(self.method_args) + len(self.optional_args) if not (len(self.method_args) <= len(args) <= max_num_args): - raise ValueError("Invalid number of parameters to %s" % self.method_name) + raise ValueError( + "Invalid number of parameters to %s" % self.method_name) else: if len(args) != len(self.method_args): - raise ValueError("Invalid number of parameters to %s" % self.method_name) + raise ValueError( + "Invalid number of parameters to %s" % self.method_name) for i, arg_name in enumerate(self.method_args): setattr(self, arg_name, args[i]) @@ -144,6 +153,7 @@ def process_result(self, raw_result): class AnonymousMethod(XmlrpcMethod): + """ An XML-RPC method for which no authentication is required. """ @@ -151,6 +161,7 @@ class AnonymousMethod(XmlrpcMethod): class AuthenticatedMethod(XmlrpcMethod): + """ An XML-RPC method for which user authentication is required. From de0b6fc4baac75f1c3475c5c3c25111f7c1d38c7 Mon Sep 17 00:00:00 2001 From: Johni Douglas Marangon Date: Wed, 27 Jul 2016 15:13:40 -0300 Subject: [PATCH 5/5] When error code is 302 force to user safe transport --- wordpress_xmlrpc/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wordpress_xmlrpc/base.py b/wordpress_xmlrpc/base.py index e1d27a1..eb1cdbd 100644 --- a/wordpress_xmlrpc/base.py +++ b/wordpress_xmlrpc/base.py @@ -30,7 +30,7 @@ def setup(self, transport, verbose, safe_transport): self.supported_methods = self.server.mt.supportedMethods() except xmlrpc_client.ProtocolError: e = sys.exc_info()[1] - if e.errcode == 301: + if e.errcode in [301, 302]: try: self.url = e.headers['location'] except KeyError: