46 lines
1.2 KiB
Python
46 lines
1.2 KiB
Python
import re
|
|
import socket
|
|
import ssl
|
|
|
|
from nntp.tiny.socket import Connection
|
|
from nntp.tiny.host import Host
|
|
from nntp.tiny.response import Response, ResponseCode
|
|
|
|
class Client(Connection):
|
|
def __init__(self, host: str, port: int, tls: bool=False):
|
|
sock = socket.create_connection((host, port))
|
|
|
|
if tls:
|
|
sslctx = ssl.create_default_context()
|
|
sslctx.check_hostname = False
|
|
sslctx.verify_mode = ssl.CERT_NONE
|
|
|
|
if Host.is_hostname(host):
|
|
sock = sslctx.wrap_socket(sock, server_hostname=host)
|
|
else:
|
|
sock = sslctx.wrap_socket(sock)
|
|
|
|
self.host = host
|
|
self.port = port
|
|
self.tls = tls
|
|
|
|
super().__init__(sock)
|
|
|
|
RE_SPLIT = re.compile(r'\s+')
|
|
|
|
def request(self, *args):
|
|
self.print(' '.join(args))
|
|
|
|
line = self.readline()
|
|
|
|
if line == '':
|
|
return
|
|
|
|
parts = self.RE_SPLIT.split(line.rstrip(), 1)
|
|
|
|
if len(parts) == 0:
|
|
return
|
|
elif len(parts) == 1:
|
|
return Response(ResponseCode(int(parts[0])))
|
|
else:
|
|
return Response(ResponseCode(int(parts[0])), parts[1])
|