[Zope] Isolating changes that can only be done globally

robert rottermann robert at redcor.ch
Tue May 30 13:50:06 EDT 2006


why can you not use something along the following:
(note timeoutsocket is part of python 2.4)
robert

class Connection(httplib.HTTPConnection):

    def __init__(self, host, port=None, strict=None, scheme="http", 
timeout=5):
        self.scheme = scheme
        if scheme == "http":
            self.default_port = httplib.HTTP_PORT
        elif scheme == "https":
            self.default_port = httplib.HTTPS_PORT
        else:
            raise ValueError, "Invalid scheme '%s'" % (scheme,)
        httplib.HTTPConnection.__init__(self, host, port, strict)
        self.timeout = timeout

    def connect(self):
        # We want to connect in normal blocking mode, else Python on Windows
        # will timeout even for 'connection refused' style errors (fixed in
        # Python 2.4 on Windows)
        if self.scheme == "http":
            httplib.HTTPConnection.connect(self)
        elif self.scheme == "https":
            # Clone of httplib.HTTPSConnection.connect
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.connect((self.host, self.port))
            key_file = cert_file = None
            ssl = socket.ssl(sock, key_file, cert_file)
            self.sock = httplib.FakeSocket(sock, ssl)
        else:
            raise ValueError, "Invalid scheme '%s'" % (self.scheme,)
        # Once we have connected, set the timeout.
        self.sock.settimeout(self.timeout)

Michael Vartanyan wrote:
> Hello All,
>
> This is probably more a Python question but maybe you will have a 
> quick solution for me - I guess the greatest *multi-threaded* Python 
> application provides the greatest basis for this problem domain :-)
>
> The situation: external method that is doing a http request using 
> urllib2. I don't care about the response, and whether there was any 
> response at all, I just need to send the request through - thus I want 
> this request to time out very fast (let it be 2 seconds). I found no 
> documented way to set the timeout for urllib2, after some googling I 
> found an advice to manipulate the timeout on the lower-level socket 
> module, something like this:
>
> import socket
> import urllib2
>
> def do_request():
>  timeout = 2
>  socket.setdefaulttimeout(timeout)
>  req = urllib2.Request(url='http://my.site.com/do_something_quick')
>  response = urllib2.urlopen(req)
>
> The problem is this way this default timeout is set for _all_ new 
> socket created by this Python process using the socket module. Even if 
> I return the default to its previous state after the request it won't 
> help me much - there are three more threads in my Zope that should be 
> able to work with default timeout. So there are two possible solutions 
> - to find a (preferably documented) way of accessing and 
> parameterizing the socket object created by urllib2 to make a request 
> or to find a way to isolate(??) global module settings between Zope 
> threads.
>
> Zope 2.8.3, Python 2.4.2, FreeBSD 4.10 if this is relevant.
>
> Any hints/TFMs?
>
> Many thanks
> Michael
>
> _______________________________________________
> Zope maillist  -  Zope at zope.org
> http://mail.zope.org/mailman/listinfo/zope
> **   No cross posts or HTML encoding!  **
> (Related lists - http://mail.zope.org/mailman/listinfo/zope-announce
> http://mail.zope.org/mailman/listinfo/zope-dev )
>

-------------- next part --------------
A non-text attachment was scrubbed...
Name: robert.vcf
Type: text/x-vcard
Size: 200 bytes
Desc: not available
Url : http://mail.zope.org/pipermail/zope/attachments/20060530/2125ac40/robert.vcf


More information about the Zope mailing list