Starchik1 commited on
Commit
6048a58
·
verified ·
1 Parent(s): 840aae5

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +42 -48
main.py CHANGED
@@ -1,67 +1,61 @@
1
  from flask import Flask, request, jsonify, Response
2
  import random
3
  import string
4
- from collections import deque
5
  import threading
 
6
 
7
  app = Flask(__name__)
 
 
8
 
9
- transfers = {}
10
- transfer_data = {}
11
- transfer_lock = threading.Lock()
12
-
13
- def generate_short_id(length=4):
14
- while True:
15
- token = ''.join(random.choices(string.ascii_letters + string.digits, k=length))
16
- if token not in transfers:
17
- return token
18
 
19
  @app.route('/create_transfer', methods=['POST'])
20
  def create_transfer():
21
- filename = request.json.get('filename')
22
- filesize = request.json.get('filesize', 0)
23
-
24
- transfer_id = generate_short_id(4)
25
- with transfer_lock:
26
- transfers[transfer_id] = {
27
- 'filename': filename,
28
- 'filesize': filesize,
29
- 'completed': False
30
  }
31
- transfer_data[transfer_id] = deque()
32
  return jsonify({'transfer_id': transfer_id})
33
 
34
  @app.route('/upload/<transfer_id>', methods=['POST'])
35
- def upload_file(transfer_id):
36
- if transfer_id not in transfers:
37
- return jsonify({'error': 'Invalid transfer ID'}), 404
38
-
39
- data = request.data
40
- with transfer_lock:
41
- transfer_data[transfer_id].append(data)
42
- transfers[transfer_id]['completed'] = request.headers.get('X-Transfer-Complete') == 'true'
43
-
44
- return jsonify({'status': 'chunk uploaded'})
45
-
46
- @app.route('/download/<transfer_id>', methods=['GET'])
47
- def download_file(transfer_id):
48
- if transfer_id not in transfers:
49
- return jsonify({'error': 'Invalid transfer ID'}), 404
50
-
51
  def generate():
52
- while True:
53
- with transfer_lock:
54
- if transfer_data[transfer_id]:
55
- chunk = transfer_data[transfer_id].popleft()
 
 
 
 
 
 
 
56
  yield chunk
57
- elif transfers[transfer_id]['completed']:
58
- break
59
 
60
- return Response(
61
- generate(),
62
- mimetype='application/octet-stream',
63
- headers={'Content-Disposition': f'attachment; filename="{transfers[transfer_id]["filename"]}"'}
64
- )
65
 
66
  if __name__ == '__main__':
67
- app.run(host='0.0.0.0', port=5000)
 
1
  from flask import Flask, request, jsonify, Response
2
  import random
3
  import string
 
4
  import threading
5
+ from queue import Queue
6
 
7
  app = Flask(__name__)
8
+ transfer_queues = {}
9
+ lock = threading.Lock()
10
 
11
+ def generate_id():
12
+ return ''.join(random.choices(string.ascii_letters + string.digits, k=8))
 
 
 
 
 
 
 
13
 
14
  @app.route('/create_transfer', methods=['POST'])
15
  def create_transfer():
16
+ transfer_id = generate_id()
17
+ with lock:
18
+ transfer_queues[transfer_id] = {
19
+ 'queue': Queue(maxsize=10),
20
+ 'filename': request.json['filename'],
21
+ 'active': False
 
 
 
22
  }
 
23
  return jsonify({'transfer_id': transfer_id})
24
 
25
  @app.route('/upload/<transfer_id>', methods=['POST'])
26
+ def upload(transfer_id):
27
+ if transfer_id not in transfer_queues:
28
+ return jsonify({'error': 'Invalid ID'}), 404
29
+
30
+ chunk = request.data
31
+ try:
32
+ transfer_queues[transfer_id]['queue'].put(chunk, timeout=30)
33
+ return jsonify({'status': 'ok'})
34
+ except:
35
+ return jsonify({'error': 'Receiver not connected'}), 408
36
+
37
+ @app.route('/download/<transfer_id>')
38
+ def download(transfer_id):
 
 
 
39
  def generate():
40
+ with lock:
41
+ if transfer_id not in transfer_queues:
42
+ yield 'Transfer ID invalid'
43
+ return
44
+
45
+ transfer = transfer_queues[transfer_id]
46
+ transfer['active'] = True
47
+
48
+ try:
49
+ while True:
50
+ chunk = transfer['queue'].get(timeout=30)
51
  yield chunk
52
+ except:
53
+ transfer_queues.pop(transfer_id, None)
54
 
55
+ headers = {
56
+ 'Content-Disposition': f'attachment; filename="{transfer_queues[transfer_id]["filename"]}"'
57
+ }
58
+ return Response(generate(), mimetype='application/octet-stream', headers=headers)
 
59
 
60
  if __name__ == '__main__':
61
+ app.run(host='0.0.0.0', port=5000, threaded=True)