73 lines
1.8 KiB
Python
73 lines
1.8 KiB
Python
|
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()
|