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