added file reader offset
This commit is contained in:
parent
723d004e5c
commit
c23b286540
@ -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:
|
||||||
|
30
src/httpapi/fileoffsetreader/__init__.py
Normal file
30
src/httpapi/fileoffsetreader/__init__.py
Normal 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
17
src/utils/readoffset.py
Normal 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)
|
@ -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
29
tests/test_read_offset.py
Normal 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()
|
Loading…
Reference in New Issue
Block a user