Starchik1 commited on
Commit
8a2ca83
·
verified ·
1 Parent(s): b86f530

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +20 -64
main.py CHANGED
@@ -11,99 +11,55 @@ transfers = {}
11
  transfer_data = {}
12
  transfer_lock = threading.Lock()
13
 
14
- # Настройки хранения данных
15
- TRANSFER_LIFETIME = timedelta(hours=1) # Время хранения завершенных передач
16
- CLEANUP_INTERVAL = 3600 # 5 минут в секундах
17
 
18
- def cleanup_task():
19
- """Фоновая задача для очистки старых передач"""
20
- while True:
21
- time.sleep(CLEANUP_INTERVAL)
22
- with transfer_lock:
23
- now = datetime.now()
24
- to_delete = []
25
- for transfer_id, info in transfers.items():
26
- if info['completed'] and (now - info['completed_time']) > TRANSFER_LIFETIME:
27
- to_delete.append(transfer_id)
28
-
29
- for transfer_id in to_delete:
30
- del transfers[transfer_id]
31
- del transfer_data[transfer_id]
32
-
33
- threading.Thread(target=cleanup_task, daemon=True).start()
34
-
35
- def generate_short_id(length=4):
36
  while True:
37
  token = ''.join(random.choices(string.ascii_letters + string.digits, k=length))
38
  if token not in transfers:
39
  return token
40
 
41
- @app.route('/create_transfer', methods=['POST'])
42
- def create_transfer():
43
- data = request.json
44
- transfer_id = generate_short_id()
45
-
46
- with transfer_lock:
47
- transfers[transfer_id] = {
48
- 'filename': data['filename'],
49
- 'filesize': data.get('filesize', 0),
50
- 'completed': False,
51
- 'created_time': datetime.now(),
52
- 'completed_time': None
53
- }
54
- transfer_data[transfer_id] = []
55
-
56
- return jsonify({'transfer_id': transfer_id})
57
-
58
- @app.route('/upload/<transfer_id>', methods=['POST'])
59
- def upload_chunk(transfer_id):
60
- if transfer_id not in transfers:
61
- return jsonify({'error': 'Invalid transfer ID'}), 404
62
-
63
- chunk = request.data
64
- with transfer_lock:
65
- transfer_data[transfer_id].append(chunk)
66
-
67
- if request.headers.get('X-Transfer-Complete') == 'true':
68
- transfers[transfer_id]['completed'] = True
69
- transfers[transfer_id]['completed_time'] = datetime.now()
70
-
71
- return jsonify({'status': 'chunk accepted'})
72
-
73
  @app.route('/download/<transfer_id>', methods=['GET'])
74
  def download_file(transfer_id):
75
  def generate():
 
76
  index = 0
 
77
  while True:
78
  with transfer_lock:
 
 
 
 
79
  transfer = transfers.get(transfer_id)
80
  if not transfer:
81
  break
82
 
83
  chunks = transfer_data.get(transfer_id, [])
84
 
85
- # Отправляем все новые чанки
86
  while index < len(chunks):
87
  yield chunks[index]
 
88
  index += 1
89
 
90
- # Проверяем завершение передачи
91
  if transfer['completed']:
92
  break
93
-
94
- time.sleep(1) # Ожидание новых чанков
95
 
96
- if transfer_id not in transfers:
97
- return jsonify({'error': 'Transfer not found'}), 404
 
 
 
 
98
 
99
  return Response(
100
  generate(),
101
  mimetype='application/octet-stream',
102
  headers={
103
  'Content-Disposition': f'attachment; filename="{transfers[transfer_id]["filename"]}"',
104
- 'Transfer-Encoding': 'chunked'
105
  }
106
- )
107
-
108
- if __name__ == '__main__':
109
- app.run(host='0.0.0.0', port=5000, threaded=True)
 
11
  transfer_data = {}
12
  transfer_lock = threading.Lock()
13
 
14
+ # Настройки
15
+ KEEP_ALIVE_INTERVAL = 10 # Отправлять keep-alive каждые 25 секунд
16
+ TRANSFER_TIMEOUT = 3600 # 1 час таймаута передачи
17
 
18
+ def generate_short_id(length=8):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  while True:
20
  token = ''.join(random.choices(string.ascii_letters + string.digits, k=length))
21
  if token not in transfers:
22
  return token
23
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  @app.route('/download/<transfer_id>', methods=['GET'])
25
  def download_file(transfer_id):
26
  def generate():
27
+ last_activity = time.time()
28
  index = 0
29
+
30
  while True:
31
  with transfer_lock:
32
+ # Проверка таймаута
33
+ if time.time() - last_activity > TRANSFER_TIMEOUT:
34
+ break
35
+
36
  transfer = transfers.get(transfer_id)
37
  if not transfer:
38
  break
39
 
40
  chunks = transfer_data.get(transfer_id, [])
41
 
42
+ # Отправка доступных чанков
43
  while index < len(chunks):
44
  yield chunks[index]
45
+ last_activity = time.time()
46
  index += 1
47
 
 
48
  if transfer['completed']:
49
  break
 
 
50
 
51
+ # Отправка keep-alive
52
+ if time.time() - last_activity > KEEP_ALIVE_INTERVAL:
53
+ yield b'\0' # Пустой чанк для поддержания соединения
54
+ last_activity = time.time()
55
+
56
+ time.sleep(0.5)
57
 
58
  return Response(
59
  generate(),
60
  mimetype='application/octet-stream',
61
  headers={
62
  'Content-Disposition': f'attachment; filename="{transfers[transfer_id]["filename"]}"',
63
+ 'Cache-Control': 'no-store'
64
  }
65
+ )