Просмотр исходного кода

make api for normalize and validate to ease migration to sqlpage

Daniel Sheffield 4 месяцев назад
Родитель
Сommit
24f128220d
2 измененных файлов с 37 добавлено и 6 удалено
  1. 22 2
      rest/pyapi.py
  2. 15 4
      rest/validate.py

+ 22 - 2
rest/pyapi.py

@@ -12,10 +12,11 @@ from bottle import (
 )
 from linkpreview import link_preview
 
-from .validate import CLIP_SIZE_LIMIT, get_file_mimetype, get_file_size, get_filename, validate, validate_file, validate_parameter, validate_url
+from .validate import CLIP_SIZE_LIMIT, _validate, get_file_mimetype, get_file_size, get_filename, validate, validate_file, validate_parameter, validate_url
 from .hash_util import normalize_base32
 from .save import save, save_upload
-
+from json import dumps
+import bottle
 
 SCHEME = "https://"
 HOST = ""
@@ -23,6 +24,25 @@ DOMAIN = "shandan.one"
 PORT = ""
 LOCATION = SCHEME + (f"{HOST}." if HOST else "") + DOMAIN + (f":{PORT}" if PORT else "")
 
+@route('/normalize', method=['GET'])
+def normalize():
+    _hash = request.params.hash
+    response.content_type = 'application/json'
+    return dumps({
+        'i': _hash,
+        'o': normalize_base32(_hash) if _hash else None,
+    })
+
+@route('/clip/validate', method=['GET'])
+def validate_clip():
+    _hash = request.params.hash
+    ret = _validate(_hash, 'clip', root='rest/static/files').decode('utf-8')
+    return bottle.get(ret[0])(*ret[1:]) if isinstance(ret, tuple) else dumps({
+        'i': _hash,
+        'o': ret,
+    })
+
+
 @route('/static/<filename:path>')
 def send_static(filename):
     return static_file(filename, root='rest/static')

+ 15 - 4
rest/validate.py

@@ -27,6 +27,7 @@ import os
 from bottle import static_file, response, HTTPError, abort, LocalRequest, HTTPResponse
 from urllib.parse import urlparse, quote, quote_plus
 from .hash_util import blake_file, bytes_to_base32, blake
+import bottle
 
 # according to rfc3696
 URL_MUST_ESCAPE = bytes([
@@ -43,24 +44,34 @@ URL_MUST_ESCAPE = bytes([
 URL_SAFE = bytes(( i for i in range(int('0xff',0)+1) if i not in map(int, URL_MUST_ESCAPE) ))
 
 CLIP_SIZE_LIMIT = 65535
-def validate(filename: str, tool: str, root='rest/static/files') -> bytes:
+def _validate(filename: str, tool: str, root='rest/static/files') -> bytes:
     ret = static_file('/'.join([filename,]*2) + '.file', root=root)
     if isinstance(ret, HTTPError):
-        return abort(404, f"No such `{tool.title()}`: {filename}")
+        return (
+            'abort', 404, f"No such `{tool.title()}`: {filename}"
+        )
     if ret.status_code == 304:
         return ret
 
     if ret.content_length > CLIP_SIZE_LIMIT:
-        return abort(418, f"{tool.title()} size exceeds {CLIP_SIZE_LIMIT}")
+        return (
+            'abort', 418, f"{tool.title()} size exceeds {CLIP_SIZE_LIMIT}"
+        )
 
     content: bytes = ret.body.read() if isinstance(ret.body, BufferedReader) else ret.body.encode('utf-8')
 
     _bytes = blake(content, person=tool.encode('utf-8'))
     _b32 = bytes_to_base32(_bytes)
     if _b32 != filename:
-        return abort(410, f"{tool.title()} content differs")
+        return (
+            'abort', 410, f"{tool.title()} content differs"
+        )
     return content
 
+def validate(filename: str, tool: str, root='rest/static/files') -> bytes:
+    ret = _validate(filename, tool, root)
+    return bottle.get(ret[0])(*ret[1:]) if isinstance(ret, tuple) else ret
+
 
 def get_filename(filename: str, root: str = 'rest/static/files'):
     path = '/'.join([filename,]*2)