From 4251fbc151da58e287cd66450a116aba7390a604 Mon Sep 17 00:00:00 2001
From: "Stuart D. Gathman" <stuart@gathman.org>
Date: Tue, 27 Aug 2019 22:29:38 -0400
Subject: [PATCH] Work in python2 and python3

---
 Milter/__init__.py | 6 +++++-
 Milter/testctx.py  | 5 +++--
 miltermodule.c     | 6 +++++-
 3 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/Milter/__init__.py b/Milter/__init__.py
index 16c1e73..f34694d 100755
--- a/Milter/__init__.py
+++ b/Milter/__init__.py
@@ -14,6 +14,7 @@ __version__ = '1.0.4'
 import os
 import re
 import milter
+import sys
 try:
   import thread
 except:
@@ -773,7 +774,10 @@ def runmilter(name,socketname,timeout = 0,rmsock=True):
   # dictfromlist to make parsing the ESMTP args convenient.
   milter.set_envfrom_callback(lambda ctx,*str: ctx.getpriv().envfrom(*str))
   milter.set_envrcpt_callback(lambda ctx,*str: ctx.getpriv().envrcpt(*str))
-  milter.set_header_callback(lambda ctx,fld,val: ctx.getpriv().header(fld,val))
+  if sys.version < '3.0.0':
+    milter.set_header_callback(lambda ctx,f,v: ctx.getpriv().header(f,v))
+  else:
+    milter.set_header_callback(header_callback)
   milter.set_eoh_callback(lambda ctx: ctx.getpriv().eoh())
   milter.set_body_callback(lambda ctx,chunk: ctx.getpriv().body(chunk))
   milter.set_eom_callback(lambda ctx: ctx.getpriv().eom())
diff --git a/Milter/testctx.py b/Milter/testctx.py
index 84a595c..4225615 100644
--- a/Milter/testctx.py
+++ b/Milter/testctx.py
@@ -6,6 +6,7 @@
 
 from __future__ import print_function
 from socket import AF_INET,AF_INET6
+from sys import version as VERSION
 import time
 import mime
 try:
@@ -14,8 +15,6 @@ except:
   from StringIO import StringIO as BytesIO
 import Milter
 from Milter import utils
-import mime
-import email
 
 ## Milter context for unit testing %milter applications.
 # A substitute for milter.milterContext that can be passed to
@@ -220,6 +219,8 @@ class TestCtx(object):
     return rc
 
   def _header(self,fld,val):
+    if VERSION < '3.0.0':
+      return self._priv.header(fld,val)
     # email.message_from_binary_file uses surrogateescape to 
     # preserve original bytes in unicode string for decoding errors.
     # convert str or Header back to original bytes
diff --git a/miltermodule.c b/miltermodule.c
index ba67953..2987b02 100644
--- a/miltermodule.c
+++ b/miltermodule.c
@@ -674,7 +674,11 @@ milter_wrap_header(SMFICTX *ctx, char *headerf, char *headerv) {
    if (header_callback == NULL) return SMFIS_CONTINUE;
    c = _get_context(ctx);
    if (!c) return SMFIS_TEMPFAIL;
-   arglist = Py_BuildValue("(Oyy)", c, headerf, headerv);
+#if PY_MAJOR_VERSION >= 3
+   arglist = Py_BuildValue("(Osy)", c, headerf, headerv);
+#else
+   arglist = Py_BuildValue("(Oss)", c, headerf, headerv);
+#endif
    return _generic_wrapper(c, header_callback, arglist);
 }
 
-- 
GitLab