Ребята, привет!
Я новичок в 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)
И мне кажется это ужасным решением. Подскажите как я могу оптимизировать свой код, и сделать его проще?