From 49968be522fe7f3f4ad85e5112e539e6d746843a Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Mon, 25 Nov 2024 21:53:08 -0500 Subject: [PATCH] Implement HDR command --- lib/nntp/tiny/session.py | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/lib/nntp/tiny/session.py b/lib/nntp/tiny/session.py index 7c4d3f6..d2ce980 100644 --- a/lib/nntp/tiny/session.py +++ b/lib/nntp/tiny/session.py @@ -471,6 +471,38 @@ class Session(): def _cmd_article(self, identifier: Optional[str]=None): return self._serve_message(MessagePart.WHOLE, identifier) + def _send_message_header(self, message: Message, name: str): + return self.print("%d %s" % ( + message.id, message.headers.get(name, '') + )) + + def _cmd_hdr(self, name: str, msg: Optional[str]=None): + if self.newsgroup is None: + return self.respond(ResponseCode.NNTP_NEWSGROUP_NOT_SELECTED) + + if msg is None: + if self.article_id is None: + return self.respond(ResponseCode.NNTP_ARTICLE_INVALID_NUMBER) + + message = self.db.get(Message, self.article_id) + + self.respond(ResponseCode.NNTP_HEADERS_FOLLOW) + self._send_message_header(message, name) + else: + msgrange = MessageRange.parse(msg) + + sql = f"select * from {Message.name} where " + sql += " newsgroup_id = ? and " + msgrange.where() + + cr = self.db.query_sql(Message, sql, (self.newsgroup.id,)) + + self.respond(ResponseCode.NNTP_HEADERS_FOLLOW) + + for message in cr.each(): + self._send_message_header(message, name) + + return self.end() + COMMANDS = { 'CAPABILITIES': _cmd_capabilities, 'GROUP': _cmd_group, @@ -480,7 +512,8 @@ class Session(): 'NEWGROUPS': _cmd_newgroups, 'HEAD': _cmd_head, 'BODY': _cmd_body, - 'ARTICLE': _cmd_article + 'ARTICLE': _cmd_article, + 'HDR': _cmd_hdr, } def handle(self):