Starchik1 commited on
Commit
a71ce8a
·
verified ·
1 Parent(s): a460fdc

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +72 -37
main.py CHANGED
@@ -1,52 +1,87 @@
1
- from flask import Flask, request, jsonify
2
  import random
3
  import string
 
4
  import threading
 
5
 
6
  app = Flask(__name__)
7
- connections = {}
8
- lock = threading.Lock()
 
 
 
 
 
 
 
 
 
 
9
 
10
  def generate_id():
11
  return ''.join(random.choices(string.ascii_letters + string.digits, k=8))
12
 
13
- @app.route('/create_offer', methods=['POST'])
14
- def create_offer():
15
- offer = request.json
16
- conn_id = generate_id()
17
 
18
- with lock:
19
- connections[conn_id] = {
20
- 'offer': offer,
21
- 'answer': None
22
- }
23
 
24
- return jsonify({'connection_id': conn_id})
25
-
26
- @app.route('/get_offer/<conn_id>', methods=['GET'])
27
- def get_offer(conn_id):
28
- with lock:
29
- conn = connections.get(conn_id)
30
- if not conn:
31
- return jsonify({'error': 'Invalid ID'}), 404
32
- return jsonify(conn['offer'])
33
-
34
- @app.route('/send_answer/<conn_id>', methods=['POST'])
35
- def send_answer(conn_id):
36
- with lock:
37
- if conn_id not in connections:
38
- return jsonify({'error': 'Invalid ID'}), 404
39
 
40
- connections[conn_id]['answer'] = request.json
41
- return jsonify({'status': 'success'})
42
-
43
- @app.route('/get_answer/<conn_id>', methods=['GET'])
44
- def get_answer(conn_id):
45
- with lock:
46
- conn = connections.get(conn_id)
47
- if not conn or not conn['answer']:
48
- return jsonify({'error': 'Not ready'}), 404
49
- return jsonify(conn['answer'])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
 
51
  if __name__ == '__main__':
52
  app.run(host='0.0.0.0', port=5000, threaded=True)
 
1
+ from flask import Flask, request, Response
2
  import random
3
  import string
4
+ from collections import deque
5
  import threading
6
+ import time
7
 
8
  app = Flask(__name__)
9
+
10
+ transfers = {}
11
+ transfer_lock = threading.Lock()
12
+ BUFFER_SIZE = 5 # Максимальное количество хранимых чанков
13
+
14
+ class TransferSession:
15
+ def __init__(self, filename):
16
+ self.filename = filename
17
+ self.buffer = deque(maxlen=BUFFER_SIZE)
18
+ self.completed = False
19
+ self.event = threading.Event()
20
+ self.last_activity = time.time()
21
 
22
  def generate_id():
23
  return ''.join(random.choices(string.ascii_letters + string.digits, k=8))
24
 
25
+ @app.route('/start_upload', methods=['POST'])
26
+ def start_upload():
27
+ filename = request.json.get('filename', 'file.bin')
28
+ transfer_id = generate_id()
29
 
30
+ with transfer_lock:
31
+ transfers[transfer_id] = TransferSession(filename)
 
 
 
32
 
33
+ return {'transfer_id': transfer_id}
34
+
35
+ @app.route('/upload/<transfer_id>', methods=['POST'])
36
+ def upload_chunk(transfer_id):
37
+ with transfer_lock:
38
+ session = transfers.get(transfer_id)
39
+ if not session:
40
+ return {'error': 'Invalid transfer ID'}, 404
41
+
42
+ chunk = request.data
43
+ session.buffer.append(chunk)
44
+ session.last_activity = time.time()
45
+ session.event.set()
46
+ session.event.clear()
 
47
 
48
+ if request.headers.get('X-Transfer-Complete') == 'true':
49
+ session.completed = True
50
+
51
+ return {'status': 'chunk accepted'}
52
+
53
+ @app.route('/download/<transfer_id>')
54
+ def download_chunks(transfer_id):
55
+ def generate():
56
+ with transfer_lock:
57
+ session = transfers.get(transfer_id)
58
+ if not session:
59
+ yield b'Transfer not found'
60
+ return
61
+
62
+ while True:
63
+ while session.buffer:
64
+ chunk = session.buffer.popleft()
65
+ yield chunk
66
+
67
+ if session.completed:
68
+ break
69
+
70
+ session.event.wait(timeout=30)
71
+ if time.time() - session.last_activity > 60:
72
+ break
73
+
74
+ # Очистка через минуту после завершения
75
+ time.sleep(60)
76
+ with transfer_lock:
77
+ if transfer_id in transfers:
78
+ del transfers[transfer_id]
79
+
80
+ return Response(
81
+ generate(),
82
+ mimetype='application/octet-stream',
83
+ headers={'Content-Disposition': f'attachment; filename="{session.filename}"'}
84
+ )
85
 
86
  if __name__ == '__main__':
87
  app.run(host='0.0.0.0', port=5000, threaded=True)