$NetBSD: patch-ab,v 1.1 2012/10/17 18:36:42 drochner Exp $

http://coherence.beebits.net/ticket/360

--- coherence/upnp/core/utils.py.orig	2010-01-02 15:10:21.000000000 +0000
+++ coherence/upnp/core/utils.py
@@ -517,48 +517,14 @@ class HeaderAwareHTTPClientFactory(clien
     protocol = myHTTPPageGetter
     noisy = False
 
-    def __init__(self, url, method='GET', postdata=None, headers=None,
-                 agent="Twisted PageGetter", timeout=0, cookies=None,
-                 followRedirect=True, redirectLimit=20):
-        self.followRedirect = followRedirect
-        self.redirectLimit = redirectLimit
-        self._redirectCount = 0
-        self.timeout = timeout
-        self.agent = agent
-
-        if cookies is None:
-            cookies = {}
-        self.cookies = cookies
-        if headers is not None:
-            self.headers = InsensitiveDict(headers)
-        else:
-            self.headers = InsensitiveDict()
-        if postdata is not None:
-            self.headers.setdefault('Content-Length', len(postdata))
-            # just in case a broken http/1.1 decides to keep connection alive
-            self.headers.setdefault("connection", "close")
-        self.postdata = postdata
-        self.method = method
-
-        self.setURL(url)
-
-        self.waiting = 1
-        self.deferred = defer.Deferred()
-        self.response_headers = None
-
     def buildProtocol(self, addr):
-        p = protocol.ClientFactory.buildProtocol(self, addr)
+        p = client.HTTPClientFactory.buildProtocol(self, addr)
         p.method = self.method
         p.followRedirect = self.followRedirect
-        if self.timeout:
-            timeoutCall = reactor.callLater(self.timeout, p.timeout)
-            self.deferred.addBoth(self._cancelTimeout, timeoutCall)
         return p
 
     def page(self, page):
-        if self.waiting:
-            self.waiting = 0
-            self.deferred.callback((page, self.response_headers))
+        client.HTTPClientFactory.page(self, (page, self.response_headers))
 
 
 class HeaderAwareHTTPDownloader(client.HTTPDownloader):
@@ -577,24 +543,22 @@ class HeaderAwareHTTPDownloader(client.H
                 self.requestedPartial = 0
 
 
+
 def getPage(url, contextFactory=None, *args, **kwargs):
-    """Download a web page as a string.
+    """
+    Download a web page as a string.
 
     Download a page. Return a deferred, which will callback with a
     page (as a string) or errback with a description of the error.
 
     See HTTPClientFactory to see what extra args can be passed.
     """
-    scheme, host, port, path = client._parse(url)
-    factory = HeaderAwareHTTPClientFactory(url, *args, **kwargs)
-    if scheme == 'https':
-        from twisted.internet import ssl
-        if contextFactory is None:
-            contextFactory = ssl.ClientContextFactory()
-        reactor.connectSSL(host, port, factory, contextFactory)
-    else:
-        reactor.connectTCP(host, port, factory)
-    return factory.deferred
+    kwargs['agent'] = "Coherence PageGetter"
+    return client._makeGetterFactory(
+        url,
+        HeaderAwareHTTPClientFactory,
+        contextFactory=contextFactory,
+        *args, **kwargs).deferred
 
 
 def downloadPage(url, file, contextFactory=None, *args, **kwargs):
@@ -705,7 +669,7 @@ class StaticFile(static.File):
                     str(start), str(end), str(tsize)))
                 #print "StaticFile", start, end, tsize
 
-        request.setHeader('content-length', str(fsize))
+        producer = self.makeProducer(request, f)
 
         if request.method == 'HEAD' or trans == False:
             # pretend we're a HEAD request, so content-length
@@ -718,7 +682,7 @@ class StaticFile(static.File):
 
         # return data
         # size is the byte position to stop sending, not how many bytes to send
-        static.FileTransfer(f, size, request)
+        producer.start()
         # and make sure the connection doesn't get closed
         return server.NOT_DONE_YET
 
