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