added file reader offset

master
Kevin Froman 2020-10-17 07:51:28 +00:00
parent 723d004e5c
commit c23b286540
5 changed files with 80 additions and 2 deletions

View File

@ -9,6 +9,7 @@ from httpapi import security, friendsapi, profilesapi, configapi, insertblock
from httpapi import miscclientapi, onionrsitesapi, apiutils from httpapi import miscclientapi, onionrsitesapi, apiutils
from httpapi import directconnections from httpapi import directconnections
from httpapi import themeapi from httpapi import themeapi
from httpapi import fileoffsetreader
from httpapi.sse.private import private_sse_blueprint from httpapi.sse.private import private_sse_blueprint
""" """
@ -46,6 +47,7 @@ def register_private_blueprints(private_api, app):
private_api).direct_conn_management_bp) private_api).direct_conn_management_bp)
app.register_blueprint(themeapi.theme_blueprint) app.register_blueprint(themeapi.theme_blueprint)
app.register_blueprint(private_sse_blueprint) app.register_blueprint(private_sse_blueprint)
app.register_blueprint(fileoffsetreader.offset_reader_api)
def _add_events_bp(): def _add_events_bp():
while True: while True:

View File

@ -0,0 +1,30 @@
from os.path import exists, dirname
import ujson
from flask import Blueprint, Response, request
from utils.identifyhome import identify_home
from utils.readoffset import read_from_offset
offset_reader_api = Blueprint('offsetreaderapi', __name__)
@offset_reader_api.route('/readfileoffset/<name>')
def offset_reader_endpoint(name):
if not name[:-4].isalnum():
return Response(400, "Path must be alphanumeric except for file ext")
path = identify_home() + name
if not exists(path):
return Response(404, "Path not found in Onionr data directory")
offset = request.args.get('offset')
if not offset:
offset = 0
else:
offset = int(offset)
result = read_from_offset(path, offset)._asdict()
return ujson.dumps(result, reject_bytes=False)

17
src/utils/readoffset.py Normal file
View File

@ -0,0 +1,17 @@
"""Onionr - Private P2P Communication.
read from a file from an offset (efficiently)
"""
from collections import namedtuple
OffsetReadResult = namedtuple('OffsetReadResult', ['data', 'new_offset'])
def read_from_offset(file_path, offset=0):
with open(file_path, 'rb') as f:
if offset:
f.seek(offset)
data = f.read()
offset = f.tell()
return OffsetReadResult(data, offset)

View File

@ -20,11 +20,11 @@ import os
""" """
def get_static_dir()->str: def get_static_dir() -> str:
return os.path.dirname(os.path.realpath(__file__)) + '/../../static-data/' return os.path.dirname(os.path.realpath(__file__)) + '/../../static-data/'
def read_static(file:str, ret_bin:bool=False)->Union[str, bytes]: def read_static(file: str, ret_bin: bool = False) -> Union[str, bytes]:
static_file = get_static_dir() + file static_file = get_static_dir() + file
if ret_bin: if ret_bin:

29
tests/test_read_offset.py Normal file
View File

@ -0,0 +1,29 @@
#!/usr/bin/env python3
import sys, os
from time import sleep
import tempfile
sys.path.append(".")
sys.path.append("src/")
import uuid
TEST_DIR = 'testdata/%s-%s' % (uuid.uuid4(), os.path.basename(__file__)) + '/'
print("Test directory:", TEST_DIR)
os.environ["ONIONR_HOME"] = TEST_DIR
import unittest, json
from utils import identifyhome, createdirs, readoffset
from onionrsetup import setup_config
createdirs.create_dirs()
setup_config()
class TestReadOffset(unittest.TestCase):
def test_read_whole(self):
temp = tempfile.mkstemp()[1]
f = open(temp, 'wb')
data = b"test1\ntest2\ntest3\test4"
f.write(data)
f.close()
self.assertEqual(readoffset.read_from_offset(temp).data, data)
os.remove(temp)
unittest.main()