]> code.delx.au - pymsnt/commitdiff
OOB file sending works.
authorjamesbunton <jamesbunton@55fbd22a-6204-0410-b2f0-b6c764c7e90a>
Sat, 21 Jan 2006 10:45:51 +0000 (10:45 +0000)
committerjamesbunton <jamesbunton@55fbd22a-6204-0410-b2f0-b6c764c7e90a>
Sat, 21 Jan 2006 10:45:51 +0000 (10:45 +0000)
git-svn-id: http://delx.cjb.net/svn/pymsnt/trunk@93 55fbd22a-6204-0410-b2f0-b6c764c7e90a

committer: jamesbunton <jamesbunton@55fbd22a-6204-0410-b2f0-b6c764c7e90a>

src/ft.py
src/misciq.py

index eb13dcd5df978860b282462dc76eb757b5a99ac0..51021e26c86863c65678cb06f2f47fd593a842a5 100644 (file)
--- a/src/ft.py
+++ b/src/ft.py
@@ -40,6 +40,21 @@ except ImportError:
                print "Couldn't find http.HTTPClient. If you're using Twisted 2.0, make sure that you've installed twisted.web"
                raise
 
                print "Couldn't find http.HTTPClient. If you're using Twisted 2.0, make sure that you've installed twisted.web"
                raise
 
+
+class OOBHeaderHelper(http.HTTPClient):
+       """ Makes a HEAD request and grabs the length """
+       def connectionMade(self):
+               self.sendCommand("HEAD", self.factory.path.encode("utf-8"))
+               self.sendHeader("Host", (self.factory.host + ":" + str(self.factory.port)).encode("utf-8"))
+               self.endHeaders()
+       
+       def handleEndHeaders(self):
+               self.factory.gotLength(self.length)
+       
+       def handleResponse(self, data):
+               pass
+
+
 class OOBSendConnector(http.HTTPClient):
        def connectionMade(self):
                self.sendCommand("GET", self.factory.path.encode("utf-8"))
 class OOBSendConnector(http.HTTPClient):
        def connectionMade(self):
                self.sendCommand("GET", self.factory.path.encode("utf-8"))
@@ -58,6 +73,7 @@ class OOBSendConnector(http.HTTPClient):
                else:
                        self.factory.consumer.close()
                        self.factory.consumer = None
                else:
                        self.factory.consumer.close()
                        self.factory.consumer = None
+                       self.factory.finished()
 
 
 
 
 
 
@@ -368,6 +384,16 @@ class FileTransferOOBReceive(resource.Resource):
                else:
                        page = error.NoResource(message="404 File Not Found")
                        return page.render(request)
                else:
                        page = error.NoResource(message="404 File Not Found")
                        return page.render(request)
-
+       
+       def render_HEAD(self, request):
+               filename = request.path[1:] # Remove the leading /
+               if self.files.has_key(filename):
+                       file = self.files[filename]
+                       request.setHeader("Content-Length", str(file.legacyftp.filesize))
+                       request.setHeader("Content-Disposition", "attachment; filename=\"%s\"" % file.legacyftp.filename.encode("utf-8"))
+                       return ""
+               else:
+                       page = error.NoResource(message="404 File Not Found")
+                       return page.render(request)
 
 
 
 
index 685cdc7d3548c9b48730f15a5c39f28ec6011b28..33336c4137ab9c554f0ccd9efe87c7921958b8e8 100644 (file)
@@ -505,8 +505,21 @@ class FileTransferOOBSend:
                        factory.host = host
                        factory.port = port
                        factory.consumer = consumer
                        factory.host = host
                        factory.port = port
                        factory.consumer = consumer
+                       factory.finished = sendResult
                        reactor.connectTCP(host, port, factory)
                        reactor.connectTCP(host, port, factory)
-               session.legacycon.sendFile(toj.userhost(), ft.FTSend(startTransfer, filename, 1024))
+
+               def doSendFile(length):
+                       session.legacycon.sendFile(toj.userhost(), ft.FTSend(startTransfer, filename, length))
+
+               # Make a HEAD request to grab the length of data first
+               factory = protocol.ClientFactory()
+               factory.protocol = ft.OOBHeaderHelper
+               factory.path = path
+               factory.host = host
+               factory.port = port
+               factory.gotLength = doSendFile
+               reactor.connectTCP(host, port, factory)
+
 
 
 class Socks5FileTransfer:
 
 
 class Socks5FileTransfer: