Header & body state not reset on abort
Reproduced from GH-2
The following from https://github.com/domsekotill/kilter.service/issues/2 shows an issue when sending multiple messages in a single session, which seems to be related to headers (and body) accessors not being reset on receipt of an Abort
.
Milter code
import logging
import anyio
from kilter.protocol import Accept
from kilter.service import Runner, Session
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
async def tryme(session: Session) -> Accept:
await session.headers.collect()
async with session.headers as headers:
async for header in headers:
logger.info(f"{header.name} -> {header.value!r}")
return Accept()
async def main() -> None:
listener = await anyio.create_tcp_listener(local_host="0.0.0.0", local_port=9000)
await listener.serve(Runner(tryme))
if __name__ == "__main__":
anyio.run(main)
Send messages with
#!/usr/bin/env python3
import smtplib
frm = "test@kodo.org.uk"
to = "root@smtp.test.kodo.org.uk"
msg = f"""
To: {to}
From: {frm}
Subject: Test
Multi message test emails
""".lstrip()
with smtplib.SMTP() as client:
client.connect("postfix")
client.sendmail(frm, to, msg)
client.sendmail(frm, to, msg)
client.sendmail(frm, to, msg)
client.sendmail(frm, to, msg)
Postfix logs
postfix-1 | Feb 17 18:30:59 smtp postfix/smtpd[19]: connect from test-milter-1.test_test[172.24.0.3]
postfix-1 | Feb 17 18:30:59 smtp postfix/smtpd[19]: using backwards-compatible default setting mynetworks_style=subnet to permit request from client "test-milter-1.test_test[172.24.0.3]"
postfix-1 | Feb 17 18:30:59 smtp postfix/smtpd[19]: 3FC9C244824: client=test-milter-1.test_test[172.24.0.3]
postfix-1 | Feb 17 18:30:59 smtp postfix/cleanup[23]: 3FC9C244824: message-id=<>
postfix-1 | Feb 17 18:30:59 smtp postfix/qmgr[9]: 3FC9C244824: from=<test@kodo.org.uk>, size=342, nrcpt=1 (queue active)
postfix-1 | Feb 17 18:30:59 smtp postfix/smtpd[19]: warning: milter inet:milter:9000: can't read SMFIC_MAIL reply packet header: Application error
postfix-1 | Feb 17 18:30:59 smtp postfix/smtpd[19]: NOQUEUE: milter-reject: MAIL from test-milter-1.test_test[172.24.0.3]: 451 4.7.1 Service unavailable - try again later; from=<test@kodo.org.uk> proto=ESMTP helo=<[172.24.0.3]>
postfix-1 | Feb 17 18:30:59 smtp postfix/smtpd[19]: disconnect from test-milter-1.test_test[172.24.0.3] ehlo=1 mail=1/2 rcpt=1 data=1 rset=1 quit=1 commands=6/7
postfix-1 | Feb 17 18:30:59 smtp postfix/local[24]: warning: dict_nis_init: NIS domain name not set - NIS lookups disabled
postfix-1 | Feb 17 18:30:59 smtp postfix/local[24]: 3FC9C244824: to=<root@smtp.test.kodo.org.uk>, relay=local, delay=0.12, delays=0.06/0.02/0/0.03, dsn=2.0.0, status=sent (delivered to mailbox)
postfix-1 | Feb 17 18:30:59 smtp postfix/qmgr[9]: 3FC9C244824: removed
Milter logs
milter-1 | DEBUG:kilter.service:received: Negotiate(version=6, action_flags=<ActionFlags.ALL: 511>, protocol_flags=<ProtocolFlags.NO_CONNECT|NO_HELO|NO_SENDER|NO_RECIPIENT|NO_BODY|NO_HEADERS|NO_END_OF_HEADERS|NO_UNKNOWN|NO_DATA|SKIP|REJECTED_RECIPIENT|NR_CONNECT|NR_HELO|NR_SENDER|NR_RECIPIENT|NR_DATA|NR_UNKNOWN|NR_END_OF_HEADERS|NR_BODY|NR_HEADER|HEADER_LEADING_SPACE: 2097151>, macros={})
milter-1 | INFO:kilter.service:Negotiating with MTA
milter-1 | DEBUG:kilter.service:sent: Negotiate(version=6, action_flags=<ActionFlags.ALL: 511>, protocol_flags=<ProtocolFlags.SKIP: 1024>, macros={})
milter-1 | DEBUG:kilter.service:received: Macro(stage=67, macros={'j': 'smtp.test.kodo.org.uk', '{daemon_name}': 'smtp.test.kodo.org.uk', '{daemon_addr}': '172.24.0.2', 'v': 'Postfix 3.7.11', '_': 'test-milter-1.test_test [172.24.0.3]'})
milter-1 | DEBUG:kilter.service:received: Connect(hostname='test-milter-1.test_test', address=IPv4Address('172.24.0.3'), port=46448)
milter-1 | INFO:kilter.service:Client connected from test-milter-1.test_test
milter-1 | DEBUG:kilter.service:sent: Continue()
milter-1 | DEBUG:kilter.service:received: Macro(stage=72, macros={})
milter-1 | DEBUG:kilter.service:received: Helo(hostname='[172.24.0.3]')
milter-1 | DEBUG:kilter.service:sent: Continue()
milter-1 | DEBUG:kilter.service:received: Macro(stage=77, macros={'{mail_addr}': 'test@kodo.org.uk', '{mail_host}': 'kodo.org.uk', '{mail_mailer}': 'smtp'})
milter-1 | DEBUG:kilter.service:received: EnvelopeFrom(sender=<memory at 0x7fc34f353b80>, arguments=[<memory at 0x7fc34f1f8340>])
milter-1 | DEBUG:kilter.service:sent: Continue()
milter-1 | DEBUG:kilter.service:received: Macro(stage=82, macros={'{rcpt_addr}': 'root@smtp.test.kodo.org.uk', '{rcpt_host}': 'smtp.test.kodo.org.uk', '{rcpt_mailer}': 'local'})
milter-1 | DEBUG:kilter.service:received: EnvelopeRecipient(recipient=<memory at 0x7fc34f353dc0>, arguments=[])
milter-1 | DEBUG:kilter.service:sent: Continue()
milter-1 | DEBUG:kilter.service:received: Macro(stage=84, macros={'i': '3FC9C244824'})
milter-1 | DEBUG:kilter.service:received: Data()
milter-1 | DEBUG:kilter.service:sent: Continue()
milter-1 | DEBUG:kilter.service:received: Macro(stage=76, macros={'i': '3FC9C244824'})
milter-1 | DEBUG:kilter.service:received: Header(name='To', value=<memory at 0x7fc34f1f81c0>)
milter-1 | DEBUG:kilter.service:sent: Continue()
milter-1 | DEBUG:kilter.service:received: Macro(stage=76, macros={'i': '3FC9C244824'})
milter-1 | DEBUG:kilter.service:received: Header(name='From', value=<memory at 0x7fc34f1f8340>)
milter-1 | DEBUG:kilter.service:sent: Continue()
milter-1 | DEBUG:kilter.service:received: Macro(stage=76, macros={'i': '3FC9C244824'})
milter-1 | DEBUG:kilter.service:received: Header(name='Subject', value=<memory at 0x7fc34f1f81c0>)
milter-1 | DEBUG:kilter.service:sent: Continue()
milter-1 | DEBUG:kilter.service:received: Macro(stage=78, macros={'i': '3FC9C244824'})
milter-1 | DEBUG:kilter.service:received: EndOfHeaders()
milter-1 | INFO:__main__:To -> b'root@smtp.test.kodo.org.uk'
milter-1 | INFO:__main__:From -> b'test@kodo.org.uk'
milter-1 | INFO:__main__:Subject -> b'Test'
milter-1 | INFO:kilter.service:Returning response Accept from tryme
milter-1 | DEBUG:kilter.service:sent: Accept()
milter-1 | DEBUG:kilter.service:received: Abort()
milter-1 | DEBUG:kilter.service:received: Macro(stage=77, macros={'{mail_addr}': 'test@kodo.org.uk', '{mail_host}': 'kodo.org.uk', '{mail_mailer}': 'smtp'})
milter-1 | DEBUG:kilter.service:received: EnvelopeFrom(sender=<memory at 0x7fc34f353f40>, arguments=[<memory at 0x7fc34f353880>])
milter-1 | INFO:__main__:To -> b'root@smtp.test.kodo.org.uk'
milter-1 | INFO:__main__:From -> b'test@kodo.org.uk'
milter-1 | INFO:__main__:Subject -> b'Test'
Edited by Dom Sekotill