[pyOpenSSL] pyopenssl and xmlrpclib

Andrew Gaffney agaffney at gentoo.org
Mon Jun 19 02:24:17 CEST 2006


Andrew Gaffney wrote:
> Andrew Gaffney wrote:
>> Dan Williams wrote:
>>> On Thu, 2006-06-15 at 10:14 -0500, Andrew Gaffney wrote:
>>>> I'm trying to integrate xmlrpclib and pyopenssl. I'm mostly there, but I'm 
>>>> running into a problem:
>>> If you need some example code of doing SSL and all things XMLRPC, take a
>>> look at the files here:
>>>
>>> http://cvs.fedora.redhat.com/viewcvs/extras-buildsys/common/?root=fedora
>>>
>>> specifically SSLCommon.py and SSLConnection.py.  Furthermore,
>>> XMLRPCServerProxy.py, URLopener.py, FileTranser.py, FileDownloader.py,
>>> and FileUploader.py might be of of interest as well.
>>>
>>> These implementations use nonblocking sockets by default, which have a
>>> few other complications, but you can safely turn that off by passing
>>> timeout values of None, I think.
>>>
>>> We've been running variations on this code for almost a year now in the
>>> Fedora Extras build system, and it's been working pretty well.
>>>
>>> Dan
>> The RH implementation is close to what I had come up with, so I at least know I 
>> was on the right track. That does get me a little farther, however, there's a 
>> still a problem somewhere. I've modified my code to be as close to the RH code 
>> and still have my own touches.
>>
>> Currently, it looks like the request is sent, the headers are received back from 
>> the server, and then the connection closes (but in a weird way). The 'closed' 
>> var is getting set in the SSLConnection class, but stuff like select.select() 
>> and socket.revc() don't seem to notice...they return "Bad file descriptor". I 
>> added some code to SSLConnection's recv() to check self.closed and return None, 
>> which gets me past that error. At that point, I get an exception from the XML 
>> parsing code in xmlrpclib, apparently because no XML was ever sent back. The 
>> following is a transcript of the session with the client code:
> 
> <transcript snipped>
> 
> Okay, I've gotten a little further in tracking down the problem. It appears to 
> be an issue with the close_refcount thing in SSLConnection. It increments when 
> makefile() is called and decrements when close() is called. Apparently, it looks 
> like when HTTPConnection.getresponse() closes the connection after instantiating 
> the response class, the response class never called makefile(), so the 
> close_refcount is decremented to 0 and closed, even though the response class is 
> using it. Any ideas on how to get around this?

Okay, I finally have it "working". My above statement was actually wrong. It 
looks like HTTPResponse *does* use makefile(), but HTTPConnection does *not*. 
So, it calls close() which decrements the counter without ever calling 
makefile() which increments the counter. The way I made it "work" was by 
commenting all the calls to .close() and .shutdown(). This is technically 
"wrong", but it gets around the faulty close_refcount logic. Can anyone suggest 
a better way to do this?

-- 
Andrew Gaffney                            http://dev.gentoo.org/~agaffney/
Gentoo Linux Developer                                   Installer Project




More information about the pyopenssl-users mailing list