]> 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
 
+
+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"))
@@ -58,6 +73,7 @@ class OOBSendConnector(http.HTTPClient):
                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)
-
+       
+       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.finished = sendResult
                        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: