Закройте прокси-сервер HTTP - PullRequest
0 голосов
/ 12 мая 2018

У меня небольшая проблема с моим кодом, я выполняю HTTP-прокси-сервер и отправляю ему случайное количество HTTP-запросов, и я хочу, чтобы моя программа закрывалась, когда я прекращал отправку. Я думаю, что проблема в том, чтобы принять, потому что программа по-прежнему работает всегда

Я попытался поставить recv после принятия для проверки, если там пусто, но программа туда не приходит

Мой код следующий

from socket import *
from _thread import *

MAX_DATA_RECV = 4096    # max number of bytes we receive at once


def start(port_5, my_port):
    s=socket(AF_INET, SOCK_STREAM)
    s.bind(('', my_port))
    s.listen(1)
    while 1:
        try:
            conn, client_addr = s.accept() 
        except KeyboardInterrupt:
            print('\nProgram closed. Interrupted by the user')
            exit()
        proxy_thread(conn, client_addr)

    s.close()

def proxy_thread(conn, client_addr):

  # get the request from browser
  request = conn.recv(MAX_DATA_RECV).decode('utf-8')

  # parse the first line
  first_line = request.split('n')[0]

  # get url
  url = first_line.split(' ')[1]


  # find the webserver and port
  http_pos = url.find("://")          # find pos of ://
  if (http_pos==-1):
    temp = url
  else:
    temp = url[(http_pos+3):]       # get the rest of url

  port_pos = temp.find(":")           # find the port pos (if any)

  # find end of web server
  webserver_pos = temp.find("/")
  if webserver_pos == -1:
    webserver_pos = len(temp)

  webserver = ""
  port = -1
  if (port_pos==-1 or webserver_pos < port_pos):      # default port
    port = 80
    webserver = temp[:webserver_pos]
  else:       # specific port
    port = int((temp[(port_pos+1):])[:webserver_pos-port_pos-1])
    webserver = temp[:port_pos]

  print("Connect to:", webserver, port)

  # create a socket to connect to the web server
  s = socket(AF_INET, SOCK_STREAM)
  s.connect((webserver, port))
  s.send(request.encode())         # send request to webserver
  print(temp)

  while 1:
    # receive data from web server
    data = s.recv(MAX_DATA_RECV)
    if (len(data) > 0):
      # send to browser
      conn.send(data)
    else:
      break
  s.close()
  conn.close()

Если кто-то может мне помочь, заранее спасибо

1 Ответ

0 голосов
/ 12 мая 2018

Я хочу, чтобы моя программа закрывалась при остановке отправки

На уровне сети не существует неявного индикатора того, что другая сторона больше не будет отправлять.Если все запросы будут выполняться через одно TCP-соединение, то конец соединения может рассматриваться как такой индикатор.Но вы используете новое TCP-соединение для каждого запроса, поэтому вам нужно определить свои собственные условия, как сервер должен определять, что клиент больше не будет отправлять.

Это может быть, например, тайм-аут, т. Е. Если клиент не отправлял больше запросов в течение 20 секунд, то клиент считается мертвым.Или это может быть специальное сообщение от клиента, сигнализирующее об окончании - в этом случае ваш код должен явно искать это сообщение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...