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"))
else:
self.factory.consumer.close()
self.factory.consumer = None
+ self.factory.finished()
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)
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: