pynex/nex.py

73 lines
1.8 KiB
Python
Raw Normal View History

2023-06-19 08:00:03 +00:00
import sys
import socket
PORT = 1900
class Session:
def __init__(self):
self.history = [Page('home')]
self.current_page = 0
def back(self):
if self.current_page > 0:
self.current_page -= 1
self.render()
def forward(self):
if self.current_page < len(self.history) - 1:
self.current_page += 1
self.render()
def load(self, url):
self.current_page += 1
if self.current_page >= len(self.history):
self.history.append(Page(url))
else:
self.history[self.current_page] = Page(url)
self.history[self.current_page].request()
def render(self):
print(self.history[self.current_page].content)
class Page:
def __init__(self, url):
self.url = url
self.host, self.selector = parse_url(url)
self.content = ''
def request(self):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
sock.connect((self.host, PORT))
selector = self.selector + '\r\n'
sock.sendall(selector.encode('ascii'))
buf = bytearray()
while True:
data = sock.recv(4096)
if len(data) == 0:
break
buf.extend(data)
self.content = buf.decode('ascii')
def parse_url(url: str) -> (str, str):
clean_url = url.replace('nex://', '')
split_url = clean_url.split('/', 1)
if len(split_url) == 1:
return clean_url, ''
return split_url[0], split_url[1]
if __name__ == '__main__':
session = Session()
while True:
url = input('Enter a URL')
session.load(url)
session.render()
command = input('Go [b]ack or [f]orward')
if command == 'b':
session.back()
elif command == 'f':
session.forward()