9
0
mirror of https://github.com/donlon/cloudflare-error-page.git synced 2025-12-19 14:59:28 +00:00

editor: support shortened share URLs

This commit is contained in:
Anthony Donlon
2025-12-16 21:39:48 +08:00
parent e08850ba92
commit ed711a2521
4 changed files with 25 additions and 4 deletions

View File

@@ -92,9 +92,11 @@ def create_app(test_config=None) -> Flask:
return '', 204 return '', 204
url_prefix = app.config.get('URL_PREFIX', '') url_prefix = app.config.get('URL_PREFIX', '')
short_share_url = app.config.get('SHORT_SHARE_URL', False)
app.register_blueprint(editor.bp, url_prefix=f'{url_prefix}/editor') app.register_blueprint(editor.bp, url_prefix=f'{url_prefix}/editor')
app.register_blueprint(examples.bp, url_prefix=f'{url_prefix}/examples') app.register_blueprint(examples.bp, url_prefix=f'{url_prefix}/examples')
app.register_blueprint(share.bp, url_prefix=f'{url_prefix}/s') app.register_blueprint(share.bp, url_prefix=f'{url_prefix}/s')
app.register_blueprint(share.bp_short, url_prefix=f'{url_prefix}' + ('' if short_share_url else '/s'))
return app return app

View File

@@ -1,6 +1,12 @@
# Url prefix for app urls # Url prefix for app urls
URL_PREFIX = '' URL_PREFIX = ''
# Digits of item name in shared links
SHARE_LINK_DIGITS = 7
# Use short share url (without '/s' path)
SHORT_SHARE_URL = false
# Set to true if trust X-Forwarded-For/X-Forwarded-Proto header # Set to true if trust X-Forwarded-For/X-Forwarded-Proto header
BEHIND_PROXY = true BEHIND_PROXY = true

View File

@@ -6,9 +6,11 @@ import string
from flask import ( from flask import (
Blueprint, Blueprint,
current_app,
request, request,
abort, abort,
jsonify, jsonify,
redirect,
url_for, url_for,
) )
from jinja2 import Environment, select_autoescape from jinja2 import Environment, select_autoescape
@@ -51,6 +53,7 @@ template = env.from_string('''
''') ''')
bp = Blueprint('share', __name__, url_prefix='/') bp = Blueprint('share', __name__, url_prefix='/')
bp_short = Blueprint('share_short', __name__, url_prefix='/')
rand_charset = string.ascii_lowercase + string.digits rand_charset = string.ascii_lowercase + string.digits
@@ -81,7 +84,8 @@ def create():
# TODO: strip unused params # TODO: strip unused params
try: try:
item = models.Item() item = models.Item()
item.name = get_rand_name() digits = current_app.config.get('SHARE_LINK_DIGITS', 7)
item.name = get_rand_name(digits)
item.params = params item.params = params
db.session.add(item) db.session.add(item)
db.session.commit() db.session.commit()
@@ -93,12 +97,12 @@ def create():
return jsonify({ return jsonify({
'status': 'ok', 'status': 'ok',
'name': item.name, 'name': item.name,
'url': request.host_url[:-1] + url_for('share.get', name=item.name), 'url': request.host_url[:-1] + url_for('share_short.get', name=item.name),
# TODO: better way to handle this # TODO: better way to handle this
}) })
@bp.get('/<name>') @bp_short.get('/<name>')
def get(name: str): def get(name: str):
accept = request.headers.get('Accept', '') accept = request.headers.get('Accept', '')
is_json = 'application/json' in accept is_json = 'application/json' in accept
@@ -136,3 +140,12 @@ def get(name: str):
base=cf_template, base=cf_template,
url=request.url, url=request.url,
description='Cloudflare error page') description='Cloudflare error page')
@bp.get('/<name>')
def get_redir(name: str):
short_share_url = current_app.config.get('SHORT_SHARE_URL', False)
if short_share_url:
return redirect(f'../{name}', code=308)
else:
return get(name=name)

View File

@@ -17,7 +17,7 @@ export default defineConfig(({ mode }) => {
server: { server: {
port: 3000, port: 3000,
proxy: { proxy: {
'/s': { '/s/': {
target: 'http://localhost:5000', target: 'http://localhost:5000',
}, },
}, },