File size: 2,084 Bytes
3205dff
a460fdc
 
146248c
b86f530
 
059bbb9
0b67e3c
146248c
 
5bb5d81
 
059bbb9
8a2ca83
 
 
b86f530
8a2ca83
5bb5d81
 
 
 
33f8f7c
3205dff
 
5bb5d81
8a2ca83
b86f530
8a2ca83
5bb5d81
 
8a2ca83
 
 
 
b86f530
 
 
 
 
 
8a2ca83
b86f530
 
8a2ca83
b86f530
 
 
a71ce8a
b86f530
8a2ca83
 
 
 
 
 
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=8):
    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.5)

    return Response(
        generate(),
        mimetype='application/octet-stream',
        headers={
            'Content-Disposition': f'attachment; filename="{transfers[transfer_id]["filename"]}"',
            'Cache-Control': 'no-store'
        }
    )