Implemented hosts_avoid_pipelining in the smtp transport.
authorPhilip Hazel <ph10@hermes.cam.ac.uk>
Tue, 6 Feb 2007 14:49:13 +0000 (14:49 +0000)
committerPhilip Hazel <ph10@hermes.cam.ac.uk>
Tue, 6 Feb 2007 14:49:13 +0000 (14:49 +0000)
doc/doc-txt/ChangeLog
doc/doc-txt/NewStuff
doc/doc-txt/OptionLists.txt
src/src/transports/smtp.c
src/src/transports/smtp.h
test/confs/0217
test/log/0217
test/scripts/0000-Basic/0217
test/stderr/0217
test/stdout/0217

index fd3b4c4203463be580751681b73101818853f135..715a5789839e772caade12dd153c4165e12cda5e 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.472 2007/02/06 14:19:00 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.473 2007/02/06 14:49:13 ph10 Exp $
 
 Change log file for Exim from version 4.21
 -------------------------------------------
@@ -85,6 +85,8 @@ PH/19 Change 4.64/PH/36 introduced a bug: when address_retry_include_sender
       item, thus causing premature timeout of the address. The bug is now
       fixed.
 
+PH/20 Added hosts_avoid_pipelining to the smtp transport.
+
 
 Exim version 4.66
 -----------------
index b05db458aacb4e393116e2e0b830fa987dbba940..3fbb1b662ec1f85af1a084bfadf56376fc92410d 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/NewStuff,v 1.138 2007/02/06 12:19:27 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/NewStuff,v 1.139 2007/02/06 14:49:13 ph10 Exp $
 
 New Features in Exim
 --------------------
@@ -282,6 +282,10 @@ Version 4.67
     The value is expanded every time it is needed. If the expansion fails, a
     panic is logged, and the default setting is used.
 
+14. The smtp transport has a new option called hosts_avoid_pipelining. It can
+    be used to suppress the use of PIPELINING to certain hosts, while still
+    supporting the other SMTP extensions (cf hosts_avoid_tls).
+
 
 Version 4.66
 ------------
index 67b03c79320de45e2ad63b8c5fd4d842426d6ae5..4d7e3bdada318561538b01c28141ed829ef3bb08 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/OptionLists.txt,v 1.29 2007/01/18 15:35:42 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/OptionLists.txt,v 1.30 2007/02/06 14:49:13 ph10 Exp $
 
 LISTS OF EXIM OPTIONS
 ---------------------
@@ -265,6 +265,7 @@ host_reject_connection               host list       unset         main
 hosts                                string          unset         iplookup          4.00
                                      string list*    unset         smtp
 hosts_avoid_esmtp                    host list       unset         smtp              4.21
+hosts_avoid_pipelining               host list       unset         smtp              4.67
 hosts_avoid_tls                      host list       unset         smtp              3.20
 hosts_connection_nolog               host list       unset         main              4.43
 hosts_max_try                        integer         5             smtp              3.20
index 0bc5b533ee77872c801a1fedd738e3bb91d5cbea..509ff1949d589d575814cd0275a49e24d7eb0664 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/transports/smtp.c,v 1.34 2007/02/06 14:19:00 ph10 Exp $ */
+/* $Cambridge: exim/src/src/transports/smtp.c,v 1.35 2007/02/06 14:49:13 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -77,6 +77,8 @@ optionlist smtp_transport_options[] = {
       (void *)offsetof(smtp_transport_options_block, hosts) },
   { "hosts_avoid_esmtp",    opt_stringptr,
       (void *)offsetof(smtp_transport_options_block, hosts_avoid_esmtp) },
+  { "hosts_avoid_pipelining", opt_stringptr,
+      (void *)offsetof(smtp_transport_options_block, hosts_avoid_pipelining) },
   #ifdef SUPPORT_TLS
   { "hosts_avoid_tls",      opt_stringptr,
       (void *)offsetof(smtp_transport_options_block, hosts_avoid_tls) },
@@ -160,6 +162,7 @@ smtp_transport_options_block smtp_transport_option_defaults = {
   NULL,                /* hosts_require_auth */
   NULL,                /* hosts_require_tls */
   NULL,                /* hosts_avoid_tls */
+  NULL,                /* hosts_avoid_pipelining */
   NULL,                /* hosts_avoid_esmtp */
   NULL,                /* hosts_nopass_tls */
   5*60,                /* command_timeout */
@@ -1189,9 +1192,12 @@ if (continue_hostname == NULL
       PCRE_EOPT, NULL, 0) >= 0;
 
   /* Note whether the server supports PIPELINING. If hosts_avoid_esmtp matched
-  the current host, esmtp will be false, so PIPELINING can never be used. */
+  the current host, esmtp will be false, so PIPELINING can never be used. If
+  the current host matches hosts_avoid_pipelining, don't do it. */
 
   smtp_use_pipelining = esmtp &&
+    verify_check_this_host(&(ob->hosts_avoid_pipelining), NULL, host->name,
+      host->address, NULL) != OK &&
     pcre_exec(regex_PIPELINING, NULL, CS buffer, Ustrlen(CS buffer), 0,
       PCRE_EOPT, NULL, 0) >= 0;
 
index 4f5dec707e78fd37016daa3be7793512b9bb2e5f..63e76eb938a15a585568ed7b48e2263ca81c4b49 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/transports/smtp.h,v 1.11 2007/01/18 15:35:43 ph10 Exp $ */
+/* $Cambridge: exim/src/src/transports/smtp.h,v 1.12 2007/02/06 14:49:13 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -24,6 +24,7 @@ typedef struct {
   uschar *hosts_require_auth;
   uschar *hosts_require_tls;
   uschar *hosts_avoid_tls;
+  uschar *hosts_avoid_pipelining;
   uschar *hosts_avoid_esmtp;
   uschar *hosts_nopass_tls;
   int     command_timeout;
index 7ffc1b099b0eea2af7eb4bf5cdfd5007e255dea8..32c46e2325c7835af3f8001859869313bb009dfa 100644 (file)
@@ -1,5 +1,7 @@
 # Exim test configuration 0217
 
+HAP=
+
 exim_path = EXIM_PATH
 host_lookup_order = bydns
 primary_hostname = myhost.test.ex
@@ -43,7 +45,7 @@ send_to_server:
   command_timeout = 1s
   hosts = 127.0.0.1
   port = PORT_S
-
+  HAP
 
 # ----- Retry -----
 
index 4913cb03f4a78e700a762a15308f59082df2f3a5..c4e582c9059753538352a9e09500ccbbd6d3234f 100644 (file)
 1999-03-02 09:44:33 10HmbO-0005vi-00 ** CALLER@test.ex R=bounce: just discard
 1999-03-02 09:44:33 10HmbO-0005vi-00 CALLER@test.ex: error ignored
 1999-03-02 09:44:33 10HmbO-0005vi-00 Completed
+1999-03-02 09:44:33 10HmbP-0005vi-00 <= CALLER@test.ex U=CALLER P=local S=sss
+1999-03-02 09:44:33 10HmbP-0005vi-00 => w@test.ex R=client T=send_to_server H=127.0.0.1 [127.0.0.1]
+1999-03-02 09:44:33 10HmbP-0005vi-00 -> x@test.ex R=client T=send_to_server H=127.0.0.1 [127.0.0.1]
+1999-03-02 09:44:33 10HmbP-0005vi-00 -> y@test.ex R=client T=send_to_server H=127.0.0.1 [127.0.0.1]
+1999-03-02 09:44:33 10HmbP-0005vi-00 -> z@test.ex R=client T=send_to_server H=127.0.0.1 [127.0.0.1]
+1999-03-02 09:44:33 10HmbP-0005vi-00 Completed
index c91d2425449b51fe711f1d4e8dd6f58a29bc59d9..5722eb4d2ff9aa1e30e00f5efecab135f0dfedd7 100644 (file)
@@ -316,4 +316,30 @@ RCPT TO
 exim -odi a b c d e 
 .
 ****
+# Discard retry data
+sudo rm DIR/spool/db/*
+#
+# Test hosts_avoid_pipelining
+server PORT_S
+220 Server ready
+EHLO
+250-OK
+250 PIPELINING
+MAIL FROM
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+RCPT TO
+250 OK
+DATA
+351 Send more
+.
+250 OK
+****
+exim -v -odi -DHAP=hosts_avoid_pipelining=127.0.0.1 w x y z
+****
 no_msglog_check
index 30ab686c2f171c96799b05f40cc37d143b6981c8..32b046de1e8391efed187088e75a3c887344d143 100644 (file)
@@ -228,3 +228,36 @@ LOG: MAIN
   CALLER@test.ex: error ignored
 LOG: MAIN
   Completed
+LOG: MAIN
+  <= CALLER@test.ex U=CALLER P=local S=sss
+delivering 10HmbP-0005vi-00
+Connecting to 127.0.0.1 [127.0.0.1]:1224 ... connected
+  SMTP<< 220 Server ready
+  SMTP>> EHLO myhost.test.ex
+  SMTP<< 250-OK
+         250 PIPELINING
+  SMTP>> MAIL FROM:<CALLER@test.ex>
+  SMTP<< 250 OK
+  SMTP>> RCPT TO:<w@test.ex>
+  SMTP<< 250 OK
+  SMTP>> RCPT TO:<x@test.ex>
+  SMTP<< 250 OK
+  SMTP>> RCPT TO:<y@test.ex>
+  SMTP<< 250 OK
+  SMTP>> RCPT TO:<z@test.ex>
+  SMTP<< 250 OK
+  SMTP>> DATA
+  SMTP<< 351 Send more
+  SMTP>> writing message and terminating "."
+  SMTP<< 250 OK
+  SMTP>> QUIT
+LOG: MAIN
+  => w@test.ex R=client T=send_to_server H=127.0.0.1 [127.0.0.1]
+LOG: MAIN
+  -> x@test.ex R=client T=send_to_server H=127.0.0.1 [127.0.0.1]
+LOG: MAIN
+  -> y@test.ex R=client T=send_to_server H=127.0.0.1 [127.0.0.1]
+LOG: MAIN
+  -> z@test.ex R=client T=send_to_server H=127.0.0.1 [127.0.0.1]
+LOG: MAIN
+  Completed
index af856787becfebf1179b0acf67fc6ada92fea875..be5634b31cad47ec1365f7aa4fd2759bd49d4ff1 100644 (file)
@@ -289,3 +289,31 @@ RCPT TO:<a@test.ex>
 RCPT TO:<b@test.ex>
 550 NO
 End of script
+Listening on port 1224 ... 
+Connection request from [127.0.0.1]
+220 Server ready
+EHLO myhost.test.ex
+250-OK
+250 PIPELINING
+MAIL FROM:<CALLER@test.ex>
+250 OK
+RCPT TO:<w@test.ex>
+250 OK
+RCPT TO:<x@test.ex>
+250 OK
+RCPT TO:<y@test.ex>
+250 OK
+RCPT TO:<z@test.ex>
+250 OK
+DATA
+351 Send more
+Received: from CALLER by myhost.test.ex with local (Exim x.yz)
+       (envelope-from <CALLER@test.ex>)
+       id 10HmbP-0005vi-00; Tue, 2 Mar 1999 09:44:33 +0000
+Message-Id: <E10HmbP-0005vi-00@myhost.test.ex>
+From: CALLER_NAME <CALLER@test.ex>
+Date: Tue, 2 Mar 1999 09:44:33 +0000
+
+.
+250 OK
+End of script