Если сообщение об ошибке 104 не отображается, время соединения истекает и веб-страница не отображается.Браузер должен отправить запрос прокси, чтобы прокси мог запросить веб-сайт, а затем вернуть его браузеру.Это тестовый код, и у меня есть более полная версия с черным списком и кешем, но я не могу отобразить данные в браузере и в другой версии, поэтому я пытаюсь написать простую.В обеих версиях я получаю сообщение об ошибке 104.
Кроме того, я не могу отправить, как http-страницу в браузер, когда сайт занесен в черный список, я могу просто закрыть активное соединение.Есть ли в любом случае, чтобы сделать это?
Вот мой код:
import socket, sys
import _thread
port = 8080
maxConn = 10
bufferSize = 8192
def start():
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', port))
s.listen(maxConn)
except Exception as e:
print(e)
sys.exit(2)
while 1:
try:
conn, addr = s.accept()
data = str(conn.recv(bufferSize))
_thread.start_new_thread(conn_string, (conn, data, addr))
except KeyboardInterrupt as e:
print(e)
s.close
sys.exit(1)
s.close()
def conn_string(conn, data, addr):
try:
first_line = data.split("\n")[0]
url = first_line.split(' ')[1]
http_pos = url.find("://")
if (http_pos == -1):
temp = url
else:
temp = url[(http_pos+3):]
port_pos = temp.find(":")
webserver_pos = temp.find("/")
if (webserver_pos == -1):
webserver_pos = len(temp)
webserver = ""
port = -1
if (port_pos == -1 or webserver_pos < port_pos):
port = 80
webserver = temp[:webserver_pos]
else:
port = int((temp[(port_pos+1):])[:webserver_pos-port_pos-1])
webserver = temp[:port_pos]
proxy_server(webserver, port, conn, addr, data)
except Exception as e:
print(e)
def proxy_server(webserver, port, conn, addr, data):
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((webserver, port))
s.send(data.encode())
while 1:
reply = s.recv(bufferSize)
if (len(reply) > 0):
conn.send(reply)
dar = float(len(reply))
dar = float(dar/1024)
dar = "%.3s" % (str(dar))
dar = "%s KB" % (dar)
print("REQUEST DONE: %s => %s <=" % (str(addr[0]), str(dar)))
s.close()
conn.close()
except socket.error as e:
print(e)
s.close()
conn.close()
sys.exit(1)
start()