[docs] [issue28389] xmlrpc.client HTTP proxy example code does not work

Attila Vangel report at bugs.python.org
Sat Oct 8 07:53:34 EDT 2016


New submission from Attila Vangel:

Go to https://docs.python.org/3/library/xmlrpc.client.html
Under '21.26.8. Example of Client Usage' -> 'To access an XML-RPC 
server through a HTTP proxy, you need to define a custom transport. The 
following example shows how:' copy the example code to a .py file (for 
me it is easier than REPL), e.g. xmlrpc_client_http_proxy_test.py

This is the example code:

import xmlrpc.client, http.client

class ProxiedTransport(xmlrpc.client.Transport):
    def set_proxy(self, proxy):
        self.proxy = proxy

    def make_connection(self, host):
        self.realhost = host
        h = http.client.HTTPConnection(self.proxy)
        return h

    def send_request(self, connection, handler, request_body, debug):
        connection.putrequest("POST", 'http://%s%s' % (self.realhost, handler))

    def send_host(self, connection, host):
        connection.putheader('Host', self.realhost)

p = ProxiedTransport()
p.set_proxy('proxy-server:8080')
server = xmlrpc.client.ServerProxy('http://time.xmlrpc.com/RPC2', transport=p)
print(server.currentTime.getCurrentTime())


I changed the 'proxy-server:8080' to '10.144.1.11:8080' which is a 
valid HTTP/HTTPS proxy in company I work for.

Try to run this code:

$ python3 xmlrpc_client_http_proxy_test.py 
Traceback (most recent call last):
  File "xmlrpc_client_http_proxy_test.py", line 21, in <module>
    print(server.currentTime.getCurrentTime())
  File "/usr/lib/python3.5/xmlrpc/client.py", line 1092, in __call__
    return self.__send(self.__name, args)
  File "/usr/lib/python3.5/xmlrpc/client.py", line 1432, in __request
    verbose=self.__verbose
  File "/usr/lib/python3.5/xmlrpc/client.py", line 1134, in request
    return self.single_request(host, handler, request_body, verbose)
  File "/usr/lib/python3.5/xmlrpc/client.py", line 1146, in single_request
    http_conn = self.send_request(host, handler, request_body, verbose)
  File "xmlrpc_client_http_proxy_test.py", line 13, in send_request
    connection.putrequest("POST", 'http://%s%s' % (self.realhost, handler))
AttributeError: 'str' object has no attribute 'putrequest'

Personally I don't like the idea of putting this amount of code to 
documentation:
- as it seems, without automated tests running it, the code seems to rot, and gets outdated
- I need to paste this boilerplate code to my application if I want 
this functionality.

IMHO it would be much better to move this ProxiedTransport example code 
(after fixing it) to e.g. xmlrpc.client.HttpProxyTransport
(or similar name) class.

Details about python3:
$ python3
Python 3.5.2 (default, Sep 10 2016, 08:21:44) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

----------
assignee: docs at python
components: Documentation
files: xmlrpc_client_http_proxy_test.py
messages: 278291
nosy: avangel, docs at python
priority: normal
severity: normal
status: open
title: xmlrpc.client HTTP proxy example code does not work
type: crash
versions: Python 3.5
Added file: http://bugs.python.org/file45010/xmlrpc_client_http_proxy_test.py

_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue28389>
_______________________________________


More information about the docs mailing list