@sendnikkei

Как в списке найти значение и перевести его в строку?

Ребята, привет!
Я новичок в Python, и в целом в программировании, судите строго но помогите пожалуйста. Используя библиотеку socket я создаю socket, принимаю в него данные из браузера, а после - вывожу их себе в консоль.

Изначально, это выглядело так:
read = conn.recv(4096)
Но я получал ошибку:
initial_value must be str or None, not bytes
По этому, я изменил код:
read = conn.recv(4096).decode('UTF-8', errors='ignore')

Выводя в консоли данные в переменной read я получают много строк. Например если я перехожу на https:
Результат
CONNECT ksks.ru:443 HTTP/1.1
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:66.0) Gecko/20100101 Firefox/66.0
Proxy-Connection: keep-alive
Connection: keep-alive
Host: ksks.ru:443

Или же, если я перехожу по http:
Результат
GET http://ssjsjs.ru/ HTTP/1.1
Host: ssjsjs.ru
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:66.0) Gecko/20100101 Firefox/66.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1

Из всех данных, я хочу получать лишь строку с GET для http, и строку с CONNECT для https. Я смог это сделать используя библиотеки re и io.
Мой текущий код
while True:
            conn, addr = self.socket.accept()
            read = conn.recv(4096).decode('UTF-8', errors='ignore')
            list = io.StringIO(read).readlines()[0:1]
            line = ''.join(list)[4:]
            https_line = ''.join(list)[8:]
            http_re = re.findall(r'^\w+\:\/\/\w+\.\w+\.\w+', line)
            https_re = re.findall(r'^\w+\.\w+\:\w+', https_line)
            http_re_to_line = ''.join(http_re)
            https_re_to_line = ''.join(https_re)
            firefox_regex = re.findall(r'http://detectportal.firefox.com', line)
            if firefox_regex:
                pass
            elif http_regex:
                print(http_re_to_line)
            elif https_regex:
                print(https_re_to_line)

И мне кажется это ужасным решением. Подскажите как я могу оптимизировать свой код, и сделать его проще?
  • Вопрос задан
  • 93 просмотра
Пригласить эксперта
Ответы на вопрос 1
@kova1ev
можно сплитануть по переносу строки:

import socket

sock = socket.socket()
sock.bind(('', 8000))
sock.listen(1)

conn, addr = sock.accept()

data = conn.recv(1024).decode('utf-8')
data = data.split('\r')
print(data[0])

conn.close()
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы