Errno 104 - Сброс соединения одноранговым узлом на прокси-сервере Python http - PullRequest
0 голосов
/ 25 сентября 2019

Если сообщение об ошибке 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...