File size: 2,084 Bytes
3205dff a460fdc 146248c b86f530 059bbb9 0b67e3c 146248c 5bb5d81 059bbb9 8a2ca83 b86f530 448021a 5bb5d81 33f8f7c 3205dff 5bb5d81 8a2ca83 b86f530 8a2ca83 5bb5d81 8a2ca83 b86f530 8a2ca83 b86f530 8a2ca83 b86f530 a71ce8a b86f530 8a2ca83 448021a 5bb5d81 a71ce8a b86f530 8a2ca83 b86f530 8a2ca83 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
from flask import Flask, request, jsonify, Response
import random
import string
import threading
import time
from datetime import datetime, timedelta
app = Flask(__name__)
transfers = {}
transfer_data = {}
transfer_lock = threading.Lock()
# Настройки
KEEP_ALIVE_INTERVAL = 10 # Отправлять keep-alive каждые 25 секунд
TRANSFER_TIMEOUT = 3600 # 1 час таймаута передачи
def generate_short_id(length=4):
while True:
token = ''.join(random.choices(string.ascii_letters + string.digits, k=length))
if token not in transfers:
return token
@app.route('/download/<transfer_id>', methods=['GET'])
def download_file(transfer_id):
def generate():
last_activity = time.time()
index = 0
while True:
with transfer_lock:
# Проверка таймаута
if time.time() - last_activity > TRANSFER_TIMEOUT:
break
transfer = transfers.get(transfer_id)
if not transfer:
break
chunks = transfer_data.get(transfer_id, [])
# Отправка доступных чанков
while index < len(chunks):
yield chunks[index]
last_activity = time.time()
index += 1
if transfer['completed']:
break
# Отправка keep-alive
if time.time() - last_activity > KEEP_ALIVE_INTERVAL:
yield b'\0' # Пустой чанк для поддержания соединения
last_activity = time.time()
time.sleep(0.1)
return Response(
generate(),
mimetype='application/octet-stream',
headers={
'Content-Disposition': f'attachment; filename="{transfers[transfer_id]["filename"]}"',
'Cache-Control': 'no-store'
}
) |