Add existing bigfiles to piecefield if they were downloaded outside of ZeroNet
This commit is contained in:
parent
fbc10b8e32
commit
1189c76691
2 changed files with 22 additions and 6 deletions
|
@ -324,6 +324,12 @@ class ContentManagerPlugin(object):
|
||||||
# Only add to site size on first request
|
# Only add to site size on first request
|
||||||
if hash in self.hashfield:
|
if hash in self.hashfield:
|
||||||
size = 0
|
size = 0
|
||||||
|
elif size > 1024 * 1024:
|
||||||
|
file_info = self.getFileInfo(inner_path)
|
||||||
|
if file_info: # We already have the file, but not in piecefield
|
||||||
|
sha512 = file_info["sha512"]
|
||||||
|
if sha512 not in self.site.storage.piecefields:
|
||||||
|
self.site.storage.checkBigfile(inner_path)
|
||||||
|
|
||||||
return super(ContentManagerPlugin, self).optionalDownloaded(inner_path, hash, size, own)
|
return super(ContentManagerPlugin, self).optionalDownloaded(inner_path, hash, size, own)
|
||||||
|
|
||||||
|
@ -399,12 +405,10 @@ class SiteStoragePlugin(object):
|
||||||
del content
|
del content
|
||||||
self.onUpdated(inner_path)
|
self.onUpdated(inner_path)
|
||||||
|
|
||||||
def openBigfile(self, inner_path, prebuffer=0):
|
def checkBigfile(self, inner_path):
|
||||||
file_info = self.site.content_manager.getFileInfo(inner_path)
|
file_info = self.site.content_manager.getFileInfo(inner_path)
|
||||||
if not file_info or (file_info and "piecemap" not in file_info): # It's not a big file
|
if not file_info or (file_info and "piecemap" not in file_info): # It's not a big file
|
||||||
return False
|
return False
|
||||||
|
|
||||||
self.site.needFile(inner_path, blocking=False) # Download piecemap
|
|
||||||
file_path = self.getPath(inner_path)
|
file_path = self.getPath(inner_path)
|
||||||
sha512 = file_info["sha512"]
|
sha512 = file_info["sha512"]
|
||||||
piece_num = int(math.ceil(float(file_info["size"]) / file_info["piece_size"]))
|
piece_num = int(math.ceil(float(file_info["size"]) / file_info["piece_size"]))
|
||||||
|
@ -419,7 +423,13 @@ class SiteStoragePlugin(object):
|
||||||
else:
|
else:
|
||||||
self.log.debug("Creating bigfile: %s" % inner_path)
|
self.log.debug("Creating bigfile: %s" % inner_path)
|
||||||
self.createSparseFile(inner_path, file_info["size"], sha512)
|
self.createSparseFile(inner_path, file_info["size"], sha512)
|
||||||
self.piecefields[sha512].fromstring(piece_data * "0")
|
self.piecefields[sha512].fromstring("0" * piece_num)
|
||||||
|
return True
|
||||||
|
|
||||||
|
def openBigfile(self, inner_path, prebuffer=0):
|
||||||
|
if not self.checkBigfile(inner_path):
|
||||||
|
return False
|
||||||
|
self.site.needFile(inner_path, blocking=False) # Download piecemap
|
||||||
return BigFile(self.site, inner_path, prebuffer=prebuffer)
|
return BigFile(self.site, inner_path, prebuffer=prebuffer)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2,9 +2,11 @@ import time
|
||||||
import gevent
|
import gevent
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
import mock
|
||||||
|
|
||||||
from Crypt import CryptConnection
|
from Crypt import CryptConnection
|
||||||
from Connection import ConnectionServer
|
from Connection import ConnectionServer
|
||||||
|
from Config import config
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.usefixtures("resetSettings")
|
@pytest.mark.usefixtures("resetSettings")
|
||||||
|
@ -15,7 +17,9 @@ class TestConnection:
|
||||||
assert file_server != client
|
assert file_server != client
|
||||||
|
|
||||||
# Connect to myself
|
# Connect to myself
|
||||||
|
with mock.patch('Config.config.ip_local', return_value=[]): # SSL not used for local ips
|
||||||
connection = client.getConnection("127.0.0.1", 1544)
|
connection = client.getConnection("127.0.0.1", 1544)
|
||||||
|
|
||||||
assert len(file_server.connections) == 1
|
assert len(file_server.connections) == 1
|
||||||
assert connection.handshake
|
assert connection.handshake
|
||||||
assert connection.crypt
|
assert connection.crypt
|
||||||
|
@ -35,6 +39,8 @@ class TestConnection:
|
||||||
crypt_supported_bk = CryptConnection.manager.crypt_supported
|
crypt_supported_bk = CryptConnection.manager.crypt_supported
|
||||||
CryptConnection.manager.crypt_supported = []
|
CryptConnection.manager.crypt_supported = []
|
||||||
|
|
||||||
|
print "---"
|
||||||
|
with mock.patch('Config.config.ip_local', return_value=[]): # SSL not used for local ips
|
||||||
connection = client.getConnection("127.0.0.1", 1544)
|
connection = client.getConnection("127.0.0.1", 1544)
|
||||||
assert len(file_server.connections) == 1
|
assert len(file_server.connections) == 1
|
||||||
assert not connection.crypt
|
assert not connection.crypt
|
||||||
|
|
Loading…
Reference in a new issue