File size: 2,075 Bytes
3205dff
a460fdc
 
5bb5d81
146248c
059bbb9
0b67e3c
146248c
 
5bb5d81
 
059bbb9
be00d02
5bb5d81
 
 
 
33f8f7c
5bb5d81
 
3205dff
5bb5d81
3205dff
be00d02
5bb5d81
 
 
 
 
 
 
 
a71ce8a
 
5bb5d81
 
3205dff
 
5bb5d81
 
 
 
3205dff
5bb5d81
3205dff
 
 
5bb5d81
 
146248c
5bb5d81
 
 
 
 
 
 
a71ce8a
5bb5d81
a71ce8a
 
 
5bb5d81
a71ce8a
059bbb9
0b67e3c
5bb5d81
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
66
67
from flask import Flask, request, jsonify, Response
import random
import string
from collections import deque
import threading

app = Flask(__name__)

transfers = {}
transfer_data = {}
transfer_lock = threading.Lock()

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('/create_transfer', methods=['POST'])
def create_transfer():
    filename = request.json.get('filename')
    filesize = request.json.get('filesize', 0)
    
    transfer_id = generate_short_id(4)
    with transfer_lock:
        transfers[transfer_id] = {
            'filename': filename,
            'filesize': filesize,
            'completed': False
        }
        transfer_data[transfer_id] = deque()
    return jsonify({'transfer_id': transfer_id})

@app.route('/upload/<transfer_id>', methods=['POST'])
def upload_file(transfer_id):
    if transfer_id not in transfers:
        return jsonify({'error': 'Invalid transfer ID'}), 404
    
    data = request.data
    with transfer_lock:
        transfer_data[transfer_id].append(data)
        transfers[transfer_id]['completed'] = request.headers.get('X-Transfer-Complete') == 'true'
    
    return jsonify({'status': 'chunk uploaded'})

@app.route('/download/<transfer_id>', methods=['GET'])
def download_file(transfer_id):
    if transfer_id not in transfers:
        return jsonify({'error': 'Invalid transfer ID'}), 404

    def generate():
        while True:
            with transfer_lock:
                if transfer_data[transfer_id]:
                    chunk = transfer_data[transfer_id].popleft()
                    yield chunk
                elif transfers[transfer_id]['completed']:
                    break

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

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)