Can't get around HTTP/401 response using SUDS [SOLVED]

Adam Tauno Williams awilliam at whitemice.org
Sat Mar 10 08:36:03 EST 2012


On Fri, 2012-03-09 at 00:03 +0100, Rafael Durán Castañeda wrote:
> El 08/03/12 16:44, Adam Tauno Williams escribió:
> > SUDS version 0.4 pn x86_64 Python 2.7
> > I'm having a bear of a time getting HTTP Basic Authentication to work
> > for a SOAP request via suds.  Also using an HTTP proxy server.
> > In WireShark I just see a request -
> > GET http://...../services/services/JobService-0.0.1?wsdl HTTP/1.1
> > Accept-Encoding: identity
> > Host: .......
> > Connection: close
> > User-Agent: Python-urllib/2.7
> > This doesn't contain any authentication credentials so the response is
> > HTTP/401, and the client doesn't retry with credentials.  The response
> > does come from the remote as I can see there is a WWW-Authenticate
> > header and it is from an Apache Tomcat server - so it makes it through
> > the proxy server.
> > Code
> > ================
> >   url = 'http://....../services/services/JobService-0.0.1?wsdl'
> >   proxy = urllib2.ProxyHandler({'http': 'http://.....:3128'})
> >   transport = suds.transport.http.HttpAuthenticated()
> >   transport.urlopener = urllib2.build_opener(proxy)
> >   client = suds.client.Client(url, transport=transport,
> > username='******', password='********')
> > ....
> > "/usr/local/lib/python2.7/site-packages/suds-0.4-py2.7.egg/suds/transport/http.py", line 64, in open
> >      raise TransportError(str(e), e.code, e.fp)
> > suds.transport.TransportError: HTTP Error 401: Unauthorized
> When I've got issues like yours, I usually try using a console client 
> (telnet/curl/wget,...) adding all needed headers/data manually so I'm 
> totally sure the request is OK, if everything goes Ok you know your 
> python code need to be reviewed but when you are under proxies you can 
> find a lot of not python related issues (bad gateways, using proxy when 
> it shouldn't or vice-versa, requests changed by proxy,....).

Nope, proxy works perfectly [for hundreds of clients].

The problem turned out to be that SUDS uses the specified transport for
SOAP requests/operations.  When requesting the WSDL in order to built
the client interface it doesn't use the transport.

So either download the service description to a local file and use that
or just use urllib2 to retrieve the WSDL to a buffer (outside of SUDS).
Once the client is created the requests work with authentication and via
the proxy with no issues.

> wireshark can be very useful but in situations like this I usually 
> prefer tcpflow output, I think the request/response flow showed is 
> really useful, but that's a personal preference.

Wireshark does the same thing;  you just select a packet in the stream
and then select "follow conversation".

-- 
System & Network Administrator [ LPI & NCLA ]
<http://www.whitemiceconsulting.com>
OpenGroupware Developer <http://www.opengroupware.us>
Adam Tauno Williams




More information about the Python-list mailing list