| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- import socket
- import time
- def http_download_file(url: str, file_path: str, buff_size=1024):
- # Parse the URL to extract the host and path
- if not url.startswith('http://'):
- print("Only HTTP protocol is supported")
- return -1
- host = url.split("//")[1].split('/')[0]
- path = url[url.find(host) + len(host):]
- if len(path) == 0:
- path = "/"
- print("Host:", host)
- print("Path:", path)
- # Establish a socket connection
- try:
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.connect((host, 80))
- print("Connected to:", host)
- except Exception as e:
- print("Connection error:", e)
- return -1
- # Send HTTP GET request
- get_request = "GET " + path + " HTTP/1.1\r\nHost: " + \
- host + "\r\nConnection: close\r\n\r\n"
- sock.send(get_request.encode())
- # Open file to write
- f = open(file_path, 'wb') # Manually open the file
- data_received = False
- head_received = False
- while True:
- try:
- data = sock.recv(buff_size)
- except:
- print('End of data')
- break
- print("[Data received:", len(data), ']')
- if head_received:
- sz = f.write(data)
- # print("Data written:", sz)
- # print(data.decode())
- if len(data) == 0:
- print("Length of data:", len(data))
- if not data_received:
- print("No data received.")
- f.close()
- return -1
- print("No more data to receive")
- break
- data_received = True
- # Handle the end of the HTTP header if it's still present
- if head_received == False:
- if b'\r\n\r\n' in data:
- # print("Header received", data)
- head_received = True
- aplited = data.split(b'\r\n\r\n', 1)
- if len(aplited) == 2:
- sz = f.write(aplited[1])
- # Close file and socket manually
- f.close()
- sock.close()
- print("Download completed")
- return 0
- assert http_download_file("http://pikapython.com", "pikapython.html") == 0
- print("PASS")
|