removing unnecessary python src and test directories
git-svn-id: http://google-refine.googlecode.com/svn/trunk@511 7d457c2a-affb-35e4-300a-418c747d4874
This commit is contained in:
parent
5ba67b7b26
commit
721e383bb5
Binary file not shown.
Before Width: | Height: | Size: 954 B |
Binary file not shown.
@ -1,19 +0,0 @@
|
||||
Return-Path: <bbb@zzz.org>
|
||||
Delivered-To: bbb@zzz.org
|
||||
Received: by mail.zzz.org (Postfix, from userid 889)
|
||||
id 27CEAD38CC; Fri, 4 May 2001 14:05:44 -0400 (EDT)
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=us-ascii
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Message-ID: <15090.61304.110929.45684@aaa.zzz.org>
|
||||
From: bbb@ddd.com (John X. Doe)
|
||||
To: bbb@zzz.org
|
||||
Subject: This is a test message
|
||||
Date: Fri, 4 May 2001 14:05:44 -0400
|
||||
|
||||
|
||||
Hi,
|
||||
|
||||
Do you like this message?
|
||||
|
||||
-Me
|
@ -1,135 +0,0 @@
|
||||
MIME-version: 1.0
|
||||
From: ppp-request@zzz.org
|
||||
Sender: ppp-admin@zzz.org
|
||||
To: ppp@zzz.org
|
||||
Subject: Ppp digest, Vol 1 #2 - 5 msgs
|
||||
Date: Fri, 20 Apr 2001 20:18:00 -0400 (EDT)
|
||||
X-Mailer: Mailman v2.0.4
|
||||
X-Mailman-Version: 2.0.4
|
||||
Content-Type: multipart/mixed; boundary="192.168.1.2.889.32614.987812255.500.21814"
|
||||
|
||||
--192.168.1.2.889.32614.987812255.500.21814
|
||||
Content-type: text/plain; charset=us-ascii
|
||||
Content-description: Masthead (Ppp digest, Vol 1 #2)
|
||||
|
||||
Send Ppp mailing list submissions to
|
||||
ppp@zzz.org
|
||||
|
||||
To subscribe or unsubscribe via the World Wide Web, visit
|
||||
http://www.zzz.org/mailman/listinfo/ppp
|
||||
or, via email, send a message with subject or body 'help' to
|
||||
ppp-request@zzz.org
|
||||
|
||||
You can reach the person managing the list at
|
||||
ppp-admin@zzz.org
|
||||
|
||||
When replying, please edit your Subject line so it is more specific
|
||||
than "Re: Contents of Ppp digest..."
|
||||
|
||||
|
||||
--192.168.1.2.889.32614.987812255.500.21814
|
||||
Content-type: text/plain; charset=us-ascii
|
||||
Content-description: Today's Topics (5 msgs)
|
||||
|
||||
Today's Topics:
|
||||
|
||||
1. testing #1 (Barry A. Warsaw)
|
||||
2. testing #2 (Barry A. Warsaw)
|
||||
3. testing #3 (Barry A. Warsaw)
|
||||
4. testing #4 (Barry A. Warsaw)
|
||||
5. testing #5 (Barry A. Warsaw)
|
||||
|
||||
--192.168.1.2.889.32614.987812255.500.21814
|
||||
Content-Type: multipart/digest; boundary="__--__--"
|
||||
|
||||
--__--__--
|
||||
|
||||
Message: 1
|
||||
Content-Type: text/plain; charset=us-ascii
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Date: Fri, 20 Apr 2001 20:16:13 -0400
|
||||
To: ppp@zzz.org
|
||||
From: barry@digicool.com (Barry A. Warsaw)
|
||||
Subject: [Ppp] testing #1
|
||||
Precedence: bulk
|
||||
|
||||
|
||||
hello
|
||||
|
||||
|
||||
--__--__--
|
||||
|
||||
Message: 2
|
||||
Date: Fri, 20 Apr 2001 20:16:21 -0400
|
||||
Content-Type: text/plain; charset=us-ascii
|
||||
Content-Transfer-Encoding: 7bit
|
||||
To: ppp@zzz.org
|
||||
From: barry@digicool.com (Barry A. Warsaw)
|
||||
Precedence: bulk
|
||||
|
||||
|
||||
hello
|
||||
|
||||
|
||||
--__--__--
|
||||
|
||||
Message: 3
|
||||
Date: Fri, 20 Apr 2001 20:16:25 -0400
|
||||
Content-Type: text/plain; charset=us-ascii
|
||||
Content-Transfer-Encoding: 7bit
|
||||
To: ppp@zzz.org
|
||||
From: barry@digicool.com (Barry A. Warsaw)
|
||||
Subject: [Ppp] testing #3
|
||||
Precedence: bulk
|
||||
|
||||
|
||||
hello
|
||||
|
||||
|
||||
--__--__--
|
||||
|
||||
Message: 4
|
||||
Date: Fri, 20 Apr 2001 20:16:28 -0400
|
||||
Content-Type: text/plain; charset=us-ascii
|
||||
Content-Transfer-Encoding: 7bit
|
||||
To: ppp@zzz.org
|
||||
From: barry@digicool.com (Barry A. Warsaw)
|
||||
Subject: [Ppp] testing #4
|
||||
Precedence: bulk
|
||||
|
||||
|
||||
hello
|
||||
|
||||
|
||||
--__--__--
|
||||
|
||||
Message: 5
|
||||
Date: Fri, 20 Apr 2001 20:16:32 -0400
|
||||
Content-Type: text/plain; charset=us-ascii
|
||||
Content-Transfer-Encoding: 7bit
|
||||
To: ppp@zzz.org
|
||||
From: barry@digicool.com (Barry A. Warsaw)
|
||||
Subject: [Ppp] testing #5
|
||||
Precedence: bulk
|
||||
|
||||
|
||||
hello
|
||||
|
||||
|
||||
|
||||
|
||||
--__--__----
|
||||
--192.168.1.2.889.32614.987812255.500.21814
|
||||
Content-type: text/plain; charset=us-ascii
|
||||
Content-description: Digest Footer
|
||||
|
||||
_______________________________________________
|
||||
Ppp mailing list
|
||||
Ppp@zzz.org
|
||||
http://www.zzz.org/mailman/listinfo/ppp
|
||||
|
||||
|
||||
--192.168.1.2.889.32614.987812255.500.21814--
|
||||
|
||||
End of Ppp Digest
|
||||
|
@ -1,16 +0,0 @@
|
||||
Return-Path: <bbb@zzz.org>
|
||||
Delivered-To: bbb@zzz.org
|
||||
Received: by mail.zzz.org (Postfix, from userid 889)
|
||||
id 27CEAD38CC; Fri, 4 May 2001 14:05:44 -0400 (EDT)
|
||||
Message-ID: <15090.61304.110929.45684@aaa.zzz.org>
|
||||
From: bbb@ddd.com (John X. Doe)
|
||||
To: bbb@zzz.org
|
||||
Subject: This is a test message
|
||||
Date: Fri, 4 May 2001 14:05:44 -0400
|
||||
|
||||
|
||||
Hi,
|
||||
|
||||
Do you like this message?
|
||||
|
||||
-Me
|
@ -1,37 +0,0 @@
|
||||
Return-Path: <barry@python.org>
|
||||
Delivered-To: barry@python.org
|
||||
Received: by mail.python.org (Postfix, from userid 889)
|
||||
id C2BF0D37C6; Tue, 11 Sep 2001 00:05:05 -0400 (EDT)
|
||||
MIME-Version: 1.0
|
||||
Content-Type: multipart/mixed; boundary="h90VIIIKmx"
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Message-ID: <15261.36209.358846.118674@anthem.python.org>
|
||||
From: barry@python.org (Barry A. Warsaw)
|
||||
To: barry@python.org
|
||||
Subject: a simple multipart
|
||||
Date: Tue, 11 Sep 2001 00:05:05 -0400
|
||||
X-Mailer: VM 6.95 under 21.4 (patch 4) "Artificial Intelligence" XEmacs Lucid
|
||||
X-Attribution: BAW
|
||||
X-Oblique-Strategy: Make a door into a window
|
||||
|
||||
|
||||
--h90VIIIKmx
|
||||
Content-Type: text/plain
|
||||
Content-Disposition: inline;
|
||||
filename="msg.txt"
|
||||
Content-Transfer-Encoding: 7bit
|
||||
|
||||
a simple kind of mirror
|
||||
to reflect upon our own
|
||||
|
||||
--h90VIIIKmx
|
||||
Content-Type: text/plain
|
||||
Content-Disposition: inline;
|
||||
filename="msg.txt"
|
||||
Content-Transfer-Encoding: 7bit
|
||||
|
||||
a simple kind of mirror
|
||||
to reflect upon our own
|
||||
|
||||
--h90VIIIKmx--
|
||||
|
@ -1,28 +0,0 @@
|
||||
From: foo
|
||||
Subject: bar
|
||||
To: baz
|
||||
MIME-Version: 1.0
|
||||
Content-Type: multipart/report; report-type=delivery-status;
|
||||
boundary="D1690A7AC1.996856090/mail.example.com"
|
||||
Message-Id: <20010803162810.0CA8AA7ACC@mail.example.com>
|
||||
|
||||
This is a MIME-encapsulated message.
|
||||
|
||||
--D1690A7AC1.996856090/mail.example.com
|
||||
Content-Type: text/plain
|
||||
|
||||
Yadda yadda yadda
|
||||
|
||||
--D1690A7AC1.996856090/mail.example.com
|
||||
|
||||
Yadda yadda yadda
|
||||
|
||||
--D1690A7AC1.996856090/mail.example.com
|
||||
Content-Type: message/rfc822
|
||||
|
||||
From: nobody@python.org
|
||||
|
||||
Yadda yadda yadda
|
||||
|
||||
--D1690A7AC1.996856090/mail.example.com--
|
||||
|
@ -1,33 +0,0 @@
|
||||
Return-Path: <barry@python.org>
|
||||
Delivered-To: barry@python.org
|
||||
MIME-Version: 1.0
|
||||
Content-Type: message/rfc822
|
||||
Content-Description: forwarded message
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Message-ID: <15265.9482.641338.555352@python.org>
|
||||
From: barry@zope.com (Barry A. Warsaw)
|
||||
Sender: barry@python.org
|
||||
To: barry@python.org
|
||||
Subject: forwarded message from Barry A. Warsaw
|
||||
Date: Thu, 13 Sep 2001 17:28:42 -0400
|
||||
X-Mailer: VM 6.95 under 21.4 (patch 4) "Artificial Intelligence" XEmacs Lucid
|
||||
X-Attribution: BAW
|
||||
X-Oblique-Strategy: Be dirty
|
||||
X-Url: http://barry.wooz.org
|
||||
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=us-ascii
|
||||
Return-Path: <barry@python.org>
|
||||
Delivered-To: barry@python.org
|
||||
Message-ID: <15265.9468.713530.98441@python.org>
|
||||
From: barry@zope.com (Barry A. Warsaw)
|
||||
Sender: barry@python.org
|
||||
To: barry@python.org
|
||||
Subject: testing
|
||||
Date: Thu, 13 Sep 2001 17:28:28 -0400
|
||||
X-Mailer: VM 6.95 under 21.4 (patch 4) "Artificial Intelligence" XEmacs Lucid
|
||||
X-Attribution: BAW
|
||||
X-Oblique-Strategy: Spectrum analysis
|
||||
X-Url: http://barry.wooz.org
|
||||
|
||||
|
@ -1,83 +0,0 @@
|
||||
MIME-Version: 1.0
|
||||
From: Barry <barry@digicool.com>
|
||||
To: Dingus Lovers <cravindogs@cravindogs.com>
|
||||
Subject: Here is your dingus fish
|
||||
Date: Fri, 20 Apr 2001 19:35:02 -0400
|
||||
Content-Type: multipart/mixed; boundary="BOUNDARY"
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: text/plain; charset="us-ascii"
|
||||
|
||||
Hi there,
|
||||
|
||||
This is the dingus fish.
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: image/gif; name="dingusfish.gif"
|
||||
Content-Transfer-Encoding: base64
|
||||
content-disposition: attachment; filename="dingusfish.gif"
|
||||
|
||||
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
|
||||
|
||||
--BOUNDARY--
|
@ -1,24 +0,0 @@
|
||||
MIME-Version: 1.0
|
||||
From: Barry Warsaw <barry@zope.com>
|
||||
To: Dingus Lovers <cravindogs@cravindogs.com>
|
||||
Subject: Lyrics
|
||||
Date: Fri, 20 Apr 2001 19:35:02 -0400
|
||||
Content-Type: multipart/mixed; boundary="BOUNDARY"
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: text/plain; charset="us-ascii"
|
||||
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: text/html; charset="iso-8859-1"
|
||||
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: text/plain; charset="iso-8859-2"
|
||||
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: text/plain; charset="koi8-r"
|
||||
|
||||
|
||||
--BOUNDARY--
|
@ -1,24 +0,0 @@
|
||||
MIME-Version: 1.0
|
||||
From: Barry Warsaw <barry@zope.com>
|
||||
To: Dingus Lovers <cravindogs@cravindogs.com>
|
||||
Subject: Lyrics
|
||||
Date: Fri, 20 Apr 2001 19:35:02 -0400
|
||||
Content-Type: multipart/mixed; boundary="BOUNDARY"
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: text/plain; charset="us-ascii"
|
||||
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: text/html; charset="iso-8859-1"
|
||||
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: text/plain
|
||||
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: text/plain; charset="koi8-r"
|
||||
|
||||
|
||||
--BOUNDARY--
|
@ -1,32 +0,0 @@
|
||||
MIME-Version: 1.0
|
||||
From: Barry Warsaw <barry@zope.com>
|
||||
To: Dingus Lovers <cravindogs@cravindogs.com>
|
||||
Subject: Lyrics
|
||||
Date: Fri, 20 Apr 2001 19:35:02 -0400
|
||||
Content-Type: multipart/mixed; boundary="BOUNDARY"
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: text/plain; charset="us-ascii"
|
||||
Content-Transfer-Encoding: 7bit
|
||||
|
||||
This is a 7bit encoded message.
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: text/html; charset="iso-8859-1"
|
||||
Content-Transfer-Encoding: Quoted-Printable
|
||||
|
||||
=A1This is a Quoted Printable encoded message!
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: text/plain; charset="iso-8859-1"
|
||||
Content-Transfer-Encoding: Base64
|
||||
|
||||
VGhpcyBpcyBhIEJhc2U2NCBlbmNvZGVkIG1lc3NhZ2Uu
|
||||
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: text/plain; charset="iso-8859-1"
|
||||
|
||||
This has no Content-Transfer-Encoding: header.
|
||||
|
||||
--BOUNDARY--
|
@ -1,7 +0,0 @@
|
||||
Content-Type: message/rfc822
|
||||
MIME-Version: 1.0
|
||||
Subject: The enclosing message
|
||||
|
||||
Subject: An enclosed message
|
||||
|
||||
Here is the body of the message.
|
@ -1,36 +0,0 @@
|
||||
MIME-Version: 1.0
|
||||
From: Barry Warsaw <barry@zope.com>
|
||||
To: Dingus Lovers <cravindogs@cravindogs.com>
|
||||
Subject: Lyrics
|
||||
Date: Fri, 20 Apr 2001 19:35:02 -0400
|
||||
Content-Type: multipart/mixed; boundary="BOUNDARY"
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: text/plain; charset="us-ascii"
|
||||
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: text/html; charset="iso-8859-1"
|
||||
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: multipart/mixed; boundary="ANOTHER"
|
||||
|
||||
--ANOTHER
|
||||
Content-Type: text/plain; charset="iso-8859-2"
|
||||
|
||||
|
||||
--ANOTHER
|
||||
Content-Type: text/plain; charset="iso-8859-3"
|
||||
|
||||
--ANOTHER--
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: text/plain; charset="us-ascii"
|
||||
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: text/plain; charset="koi8-r"
|
||||
|
||||
|
||||
--BOUNDARY--
|
@ -1,38 +0,0 @@
|
||||
MIME-Version: 1.0
|
||||
From: Barry Warsaw <barry@zope.com>
|
||||
To: Dingus Lovers <cravindogs@cravindogs.com>
|
||||
Subject: Lyrics
|
||||
Date: Fri, 20 Apr 2001 19:35:02 -0400
|
||||
Content-Type: multipart/mixed; boundary="BOUNDARY"
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: text/plain; charset="us-ascii"
|
||||
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: text/html; charset="iso-8859-1"
|
||||
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: multipart/mixed; boundary="ANOTHER"
|
||||
|
||||
--ANOTHER
|
||||
Content-Type: text/plain; charset="iso-8859-2"
|
||||
|
||||
|
||||
--ANOTHER
|
||||
Content-Type: text/plain; charset="iso-8859-3"
|
||||
|
||||
|
||||
--ANOTHER--
|
||||
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: text/plain; charset="us-ascii"
|
||||
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: text/plain; charset="koi8-r"
|
||||
|
||||
|
||||
--BOUNDARY--
|
@ -1,94 +0,0 @@
|
||||
MIME-Version: 1.0
|
||||
From: Barry <barry@digicool.com>
|
||||
To: Dingus Lovers <cravindogs@cravindogs.com>
|
||||
Subject: Here is your dingus fish
|
||||
Date: Fri, 20 Apr 2001 19:35:02 -0400
|
||||
Content-Type: multipart/mixed; boundary="OUTER"
|
||||
|
||||
--OUTER
|
||||
Content-Type: text/plain; charset="us-ascii"
|
||||
|
||||
A text/plain part
|
||||
|
||||
--OUTER
|
||||
Content-Type: multipart/mixed; boundary=BOUNDARY
|
||||
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: text/plain; charset="us-ascii"
|
||||
|
||||
Hi there,
|
||||
|
||||
This is the dingus fish.
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: image/gif; name="dingusfish.gif"
|
||||
Content-Transfer-Encoding: base64
|
||||
content-disposition: attachment; filename="dingusfish.gif"
|
||||
|
||||
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
|
||||
|
||||
--BOUNDARY--
|
||||
|
||||
--OUTER--
|
@ -1,23 +0,0 @@
|
||||
Return-Path: <bbb@zzz.org>
|
||||
Delivered-To: bbb@zzz.org
|
||||
Received: by mail.zzz.org (Postfix, from userid 889)
|
||||
id 27CEAD38CC; Fri, 4 May 2001 14:05:44 -0400 (EDT)
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text; charset=us-ascii
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Message-ID: <15090.61304.110929.45684@aaa.zzz.org>
|
||||
From: bbb@ddd.com (John X. Doe)
|
||||
To: bbb@zzz.org
|
||||
Subject: This is a test message
|
||||
Date: Fri, 4 May 2001 14:05:44 -0400
|
||||
|
||||
|
||||
Hi,
|
||||
|
||||
I'm sorry but I'm using a drainbread ISP, which although big and
|
||||
wealthy can't seem to generate standard compliant email. :(
|
||||
|
||||
This message has a Content-Type: header with no subtype. I hope you
|
||||
can still read it.
|
||||
|
||||
-Me
|
@ -1,52 +0,0 @@
|
||||
Return-Path: <xx@xx.dk>
|
||||
Received: from fepD.post.tele.dk (195.41.46.149) by mail.groupcare.dk (LSMTP for Windows NT v1.1b) with SMTP id <0.0014F8A2@mail.groupcare.dk>; Mon, 30 Apr 2001 12:17:50 +0200
|
||||
User-Agent: Microsoft-Outlook-Express-Macintosh-Edition/5.02.2106
|
||||
Subject: XX
|
||||
From: xx@xx.dk
|
||||
To: XX
|
||||
Message-ID: <xxxx>
|
||||
Mime-version: 1.0
|
||||
Content-type: multipart/mixed;
|
||||
boundary="MS_Mac_OE_3071477847_720252_MIME_Part"
|
||||
|
||||
> Denne meddelelse er i MIME-format. Da dit postl¾sningsprogram ikke forstŒr dette format, kan del af eller hele meddelelsen v¾re ul¾selig.
|
||||
|
||||
--MS_Mac_OE_3071477847_720252_MIME_Part
|
||||
Content-type: multipart/alternative;
|
||||
boundary="MS_Mac_OE_3071477847_720252_MIME_Part"
|
||||
|
||||
|
||||
--MS_Mac_OE_3071477847_720252_MIME_Part
|
||||
Content-type: text/plain; charset="ISO-8859-1"
|
||||
Content-transfer-encoding: quoted-printable
|
||||
|
||||
Some removed test.
|
||||
|
||||
--MS_Mac_OE_3071477847_720252_MIME_Part
|
||||
Content-type: text/html; charset="ISO-8859-1"
|
||||
Content-transfer-encoding: quoted-printable
|
||||
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>Some removed HTML</TITLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
Some removed text.
|
||||
</BODY>
|
||||
</HTML>
|
||||
|
||||
|
||||
--MS_Mac_OE_3071477847_720252_MIME_Part--
|
||||
|
||||
|
||||
--MS_Mac_OE_3071477847_720252_MIME_Part
|
||||
Content-type: image/gif; name="xx.gif";
|
||||
x-mac-creator="6F676C65";
|
||||
x-mac-type="47494666"
|
||||
Content-disposition: attachment
|
||||
Content-transfer-encoding: base64
|
||||
|
||||
Some removed base64 encoded chars.
|
||||
|
||||
--MS_Mac_OE_3071477847_720252_MIME_Part--
|
||||
|
@ -1,123 +0,0 @@
|
||||
Return-Path: <>
|
||||
Delivered-To: scr-admin@socal-raves.org
|
||||
Received: from cougar.noc.ucla.edu (cougar.noc.ucla.edu [169.232.10.18])
|
||||
by babylon.socal-raves.org (Postfix) with ESMTP id CCC2C51B84
|
||||
for <scr-admin@socal-raves.org>; Sun, 23 Sep 2001 20:13:54 -0700 (PDT)
|
||||
Received: from sims-ms-daemon by cougar.noc.ucla.edu
|
||||
(Sun Internet Mail Server sims.3.5.2000.03.23.18.03.p10)
|
||||
id <0GK500B01D0B8Y@cougar.noc.ucla.edu> for scr-admin@socal-raves.org; Sun,
|
||||
23 Sep 2001 20:14:35 -0700 (PDT)
|
||||
Received: from cougar.noc.ucla.edu
|
||||
(Sun Internet Mail Server sims.3.5.2000.03.23.18.03.p10)
|
||||
id <0GK500B01D0B8X@cougar.noc.ucla.edu>; Sun, 23 Sep 2001 20:14:35 -0700 (PDT)
|
||||
Date: Sun, 23 Sep 2001 20:14:35 -0700 (PDT)
|
||||
From: Internet Mail Delivery <postmaster@ucla.edu>
|
||||
Subject: Delivery Notification: Delivery has failed
|
||||
To: scr-admin@socal-raves.org
|
||||
Message-id: <0GK500B04D0B8X@cougar.noc.ucla.edu>
|
||||
MIME-version: 1.0
|
||||
Sender: scr-owner@socal-raves.org
|
||||
Errors-To: scr-owner@socal-raves.org
|
||||
X-BeenThere: scr@socal-raves.org
|
||||
X-Mailman-Version: 2.1a3
|
||||
Precedence: bulk
|
||||
List-Help: <mailto:scr-request@socal-raves.org?subject=help>
|
||||
List-Post: <mailto:scr@socal-raves.org>
|
||||
List-Subscribe: <http://socal-raves.org/mailman/listinfo/scr>,
|
||||
<mailto:scr-request@socal-raves.org?subject=subscribe>
|
||||
List-Id: SoCal-Raves <scr.socal-raves.org>
|
||||
List-Unsubscribe: <http://socal-raves.org/mailman/listinfo/scr>,
|
||||
<mailto:scr-request@socal-raves.org?subject=unsubscribe>
|
||||
List-Archive: <http://socal-raves.org/mailman/private/scr/>
|
||||
Content-Type: multipart/report; boundary="Boundary_(ID_PGS2F2a+z+/jL7hupKgRhA)"
|
||||
|
||||
|
||||
--Boundary_(ID_PGS2F2a+z+/jL7hupKgRhA)
|
||||
Content-type: text/plain; charset=ISO-8859-1
|
||||
|
||||
This report relates to a message you sent with the following header fields:
|
||||
|
||||
Message-id: <002001c144a6$8752e060$56104586@oxy.edu>
|
||||
Date: Sun, 23 Sep 2001 20:10:55 -0700
|
||||
From: "Ian T. Henry" <henryi@oxy.edu>
|
||||
To: SoCal Raves <scr@socal-raves.org>
|
||||
Subject: [scr] yeah for Ians!!
|
||||
|
||||
Your message cannot be delivered to the following recipients:
|
||||
|
||||
Recipient address: jangel1@cougar.noc.ucla.edu
|
||||
Reason: recipient reached disk quota
|
||||
|
||||
|
||||
--Boundary_(ID_PGS2F2a+z+/jL7hupKgRhA)
|
||||
Content-type: message/DELIVERY-STATUS
|
||||
|
||||
Original-envelope-id: 0GK500B4HD0888@cougar.noc.ucla.edu
|
||||
Reporting-MTA: dns; cougar.noc.ucla.edu
|
||||
|
||||
Action: failed
|
||||
Status: 5.0.0 (recipient reached disk quota)
|
||||
Original-recipient: rfc822;jangel1@cougar.noc.ucla.edu
|
||||
Final-recipient: rfc822;jangel1@cougar.noc.ucla.edu
|
||||
|
||||
--Boundary_(ID_PGS2F2a+z+/jL7hupKgRhA)
|
||||
Content-type: MESSAGE/RFC822
|
||||
|
||||
Return-path: scr-admin@socal-raves.org
|
||||
Received: from sims-ms-daemon by cougar.noc.ucla.edu
|
||||
(Sun Internet Mail Server sims.3.5.2000.03.23.18.03.p10)
|
||||
id <0GK500B01D0B8X@cougar.noc.ucla.edu>; Sun, 23 Sep 2001 20:14:35 -0700 (PDT)
|
||||
Received: from panther.noc.ucla.edu by cougar.noc.ucla.edu
|
||||
(Sun Internet Mail Server sims.3.5.2000.03.23.18.03.p10)
|
||||
with ESMTP id <0GK500B4GD0888@cougar.noc.ucla.edu> for jangel1@sims-ms-daemon;
|
||||
Sun, 23 Sep 2001 20:14:33 -0700 (PDT)
|
||||
Received: from babylon.socal-raves.org
|
||||
(ip-209-85-222-117.dreamhost.com [209.85.222.117])
|
||||
by panther.noc.ucla.edu (8.9.1a/8.9.1) with ESMTP id UAA09793 for
|
||||
<jangel1@ucla.edu>; Sun, 23 Sep 2001 20:14:32 -0700 (PDT)
|
||||
Received: from babylon (localhost [127.0.0.1]) by babylon.socal-raves.org
|
||||
(Postfix) with ESMTP id D3B2951B70; Sun, 23 Sep 2001 20:13:47 -0700 (PDT)
|
||||
Received: by babylon.socal-raves.org (Postfix, from userid 60001)
|
||||
id A611F51B82; Sun, 23 Sep 2001 20:13:46 -0700 (PDT)
|
||||
Received: from tiger.cc.oxy.edu (tiger.cc.oxy.edu [134.69.3.112])
|
||||
by babylon.socal-raves.org (Postfix) with ESMTP id ADA7351B70 for
|
||||
<scr@socal-raves.org>; Sun, 23 Sep 2001 20:13:44 -0700 (PDT)
|
||||
Received: from ent (n16h86.dhcp.oxy.edu [134.69.16.86])
|
||||
by tiger.cc.oxy.edu (8.8.8/8.8.8) with SMTP id UAA08100 for
|
||||
<scr@socal-raves.org>; Sun, 23 Sep 2001 20:14:24 -0700 (PDT)
|
||||
Date: Sun, 23 Sep 2001 20:10:55 -0700
|
||||
From: "Ian T. Henry" <henryi@oxy.edu>
|
||||
Subject: [scr] yeah for Ians!!
|
||||
Sender: scr-admin@socal-raves.org
|
||||
To: SoCal Raves <scr@socal-raves.org>
|
||||
Errors-to: scr-admin@socal-raves.org
|
||||
Message-id: <002001c144a6$8752e060$56104586@oxy.edu>
|
||||
MIME-version: 1.0
|
||||
X-Mailer: Microsoft Outlook Express 5.50.4522.1200
|
||||
Content-type: text/plain; charset=us-ascii
|
||||
Precedence: bulk
|
||||
Delivered-to: scr-post@babylon.socal-raves.org
|
||||
Delivered-to: scr@socal-raves.org
|
||||
X-Converted-To-Plain-Text: from multipart/alternative by demime 0.98e
|
||||
X-Converted-To-Plain-Text: Alternative section used was text/plain
|
||||
X-BeenThere: scr@socal-raves.org
|
||||
X-Mailman-Version: 2.1a3
|
||||
List-Help: <mailto:scr-request@socal-raves.org?subject=help>
|
||||
List-Post: <mailto:scr@socal-raves.org>
|
||||
List-Subscribe: <http://socal-raves.org/mailman/listinfo/scr>,
|
||||
<mailto:scr-request@socal-raves.org?subject=subscribe>
|
||||
List-Id: SoCal-Raves <scr.socal-raves.org>
|
||||
List-Unsubscribe: <http://socal-raves.org/mailman/listinfo/scr>,
|
||||
<mailto:scr-request@socal-raves.org?subject=unsubscribe>
|
||||
List-Archive: <http://socal-raves.org/mailman/private/scr/>
|
||||
|
||||
I always love to find more Ian's that are over 3 years old!!
|
||||
|
||||
Ian
|
||||
_______________________________________________
|
||||
For event info, list questions, or to unsubscribe, see http://www.socal-raves.org/
|
||||
|
||||
|
||||
|
||||
--Boundary_(ID_PGS2F2a+z+/jL7hupKgRhA)--
|
||||
|
@ -1,12 +0,0 @@
|
||||
MIME-Version: 1.0
|
||||
From: Barry <barry@digicool.com>
|
||||
To: Dingus Lovers <cravindogs@cravindogs.com>
|
||||
Subject: Here is your dingus fish
|
||||
Date: Fri, 20 Apr 2001 19:35:02 -0400
|
||||
Content-Type: multipart/mixed; boundary="BOUNDARY"
|
||||
|
||||
Hi there,
|
||||
|
||||
This is the dingus fish.
|
||||
|
||||
[Non-text (image/gif) part of message omitted, filename dingusfish.gif]
|
@ -1,6 +0,0 @@
|
||||
Content-Type: text/plain; charset="us-ascii"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
X-Foobar-Spoink-Defrobnit: wasnipoop; giraffes="very-long-necked-animals";
|
||||
spooge="yummy"; hippos="gargantuan"; marshmallows="gooey"
|
||||
|
@ -1,43 +0,0 @@
|
||||
Send Ppp mailing list submissions to
|
||||
ppp@zzz.org
|
||||
|
||||
To subscribe or unsubscribe via the World Wide Web, visit
|
||||
http://www.zzz.org/mailman/listinfo/ppp
|
||||
or, via email, send a message with subject or body 'help' to
|
||||
ppp-request@zzz.org
|
||||
|
||||
You can reach the person managing the list at
|
||||
ppp-admin@zzz.org
|
||||
|
||||
When replying, please edit your Subject line so it is more specific
|
||||
than "Re: Contents of Ppp digest..."
|
||||
|
||||
Today's Topics:
|
||||
|
||||
1. testing #1 (Barry A. Warsaw)
|
||||
2. testing #2 (Barry A. Warsaw)
|
||||
3. testing #3 (Barry A. Warsaw)
|
||||
4. testing #4 (Barry A. Warsaw)
|
||||
5. testing #5 (Barry A. Warsaw)
|
||||
|
||||
hello
|
||||
|
||||
|
||||
hello
|
||||
|
||||
|
||||
hello
|
||||
|
||||
|
||||
hello
|
||||
|
||||
|
||||
hello
|
||||
|
||||
|
||||
|
||||
_______________________________________________
|
||||
Ppp mailing list
|
||||
Ppp@zzz.org
|
||||
http://www.zzz.org/mailman/listinfo/ppp
|
||||
|
@ -1,22 +0,0 @@
|
||||
Return-Path: <bbb@zzz.org>
|
||||
Delivered-To: bbb@zzz.org
|
||||
Received: by mail.zzz.org (Postfix, from userid 889)
|
||||
id 27CEAD38CC; Fri, 4 May 2001 14:05:44 -0400 (EDT)
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=us-ascii
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Message-ID: <15090.61304.110929.45684@aaa.zzz.org>
|
||||
From: bbb@ddd.com (John X. Doe)
|
||||
To: bbb@zzz.org
|
||||
Cc: ccc@zzz.org
|
||||
CC: ddd@zzz.org
|
||||
cc: eee@zzz.org
|
||||
Subject: This is a test message
|
||||
Date: Fri, 4 May 2001 14:05:44 -0400
|
||||
|
||||
|
||||
Hi,
|
||||
|
||||
Do you like this message?
|
||||
|
||||
-Me
|
@ -1,20 +0,0 @@
|
||||
From: aperson@dom.ain
|
||||
To: bperson@dom.ain
|
||||
Subject: Test
|
||||
Content-Type: multipart/mixed; boundary="BOUNDARY"
|
||||
|
||||
MIME message
|
||||
--BOUNDARY
|
||||
Content-Type: text/plain; charset="us-ascii"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
|
||||
One
|
||||
--BOUNDARY
|
||||
Content-Type: text/plain; charset="us-ascii"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
|
||||
Two
|
||||
--BOUNDARY--
|
||||
End of MIME message
|
@ -1,46 +0,0 @@
|
||||
Mime-Version: 1.0
|
||||
Message-Id: <a05001902b7f1c33773e9@[134.84.183.138]>
|
||||
Date: Tue, 16 Oct 2001 13:59:25 +0300
|
||||
To: a@example.com
|
||||
From: b@example.com
|
||||
Content-Type: multipart/mixed; boundary="============_-1208892523==_============"
|
||||
|
||||
--============_-1208892523==_============
|
||||
Content-Type: text/plain; charset="us-ascii" ; format="flowed"
|
||||
|
||||
Text text text.
|
||||
--============_-1208892523==_============
|
||||
Content-Id: <a05001902b7f1c33773e9@[134.84.183.138].0.0>
|
||||
Content-Type: image/jpeg; name="wibble.JPG"
|
||||
; x-mac-type="4A504547"
|
||||
; x-mac-creator="474B4F4E"
|
||||
Content-Disposition: attachment; filename="wibble.JPG"
|
||||
Content-Transfer-Encoding: base64
|
||||
|
||||
/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB
|
||||
AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAALCAXABIEBAREA
|
||||
g6bCjjw/pIZSjO6FWFpldjySOmCNrO7DBZibUXhTwtCixw+GtAijVdqxxaPp0aKvmGXa
|
||||
qrbBQvms0mAMeYS/3iTV1dG0hHaRNK01XblnWxtVdjkHLMIgTyqnk9VB7CrP2KzIINpa
|
||||
4O7I+zxYO9WV8jZg71Zlb+8rMDkEirAVQFAUAKAFAAAUAYAUDgADgY6DjpRtXj5RxjHA
|
||||
4wQRj0wQCMdCAewpaKKK/9k=
|
||||
--============_-1208892523==_============
|
||||
Content-Id: <a05001902b7f1c33773e9@[134.84.183.138].0.1>
|
||||
Content-Type: image/jpeg; name="wibble2.JPG"
|
||||
; x-mac-type="4A504547"
|
||||
; x-mac-creator="474B4F4E"
|
||||
Content-Disposition: attachment; filename="wibble2.JPG"
|
||||
Content-Transfer-Encoding: base64
|
||||
|
||||
/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB
|
||||
AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAALCAXABJ0BAREA
|
||||
/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA
|
||||
W6NFJJBEkU10kKGTcWMDwxuU+0JHvk8qAtOpNwqSR0n8c3BlDyXHlqsUltHEiTvdXLxR
|
||||
7vMiGDNJAJWkAMk8ZkCFp5G2oo5W++INrbQtNfTQxJAuXlupz9oS4d5Y1W+E2XlWZJJE
|
||||
Y7LWYQxTLE1zuMbfBPxw8X2fibVdIbSbI6nLZxX635t9TjtYreWR7WGKJTLJFFKSlozO
|
||||
0ShxIXM43uC3/9k=
|
||||
--============_-1208892523==_============
|
||||
Content-Type: text/plain; charset="us-ascii" ; format="flowed"
|
||||
|
||||
Text text text.
|
||||
--============_-1208892523==_============--
|
||||
|
@ -1,8 +0,0 @@
|
||||
From: aperson@dom.ain
|
||||
Content-Type: multipart/mixed; boundary="BOUNDARY"
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: text/plain
|
||||
|
||||
A message part
|
||||
--BOUNDARY--
|
@ -1,10 +0,0 @@
|
||||
Content-Type: multipart/mixed; boundary="BOUNDARY"
|
||||
MIME-Version: 1.0
|
||||
Subject: A subject
|
||||
To: aperson@dom.ain
|
||||
From: bperson@dom.ain
|
||||
|
||||
--BOUNDARY
|
||||
|
||||
|
||||
--BOUNDARY--
|
@ -1,117 +0,0 @@
|
||||
From MAILER-DAEMON Fri Apr 06 16:46:09 2001
|
||||
Received: from [204.245.199.98] (helo=zinfandel.lacita.com)
|
||||
by www.linux.org.uk with esmtp (Exim 3.13 #1)
|
||||
id 14lYR6-0008Iv-00
|
||||
for linuxuser-admin@www.linux.org.uk; Fri, 06 Apr 2001 16:46:09 +0100
|
||||
Received: from localhost (localhost) by zinfandel.lacita.com (8.7.3/8.6.10-MT4.00) with internal id JAB03225; Fri, 6 Apr 2001 09:23:06 -0800 (GMT-0800)
|
||||
Date: Fri, 6 Apr 2001 09:23:06 -0800 (GMT-0800)
|
||||
From: Mail Delivery Subsystem <MAILER-DAEMON@zinfandel.lacita.com>
|
||||
Subject: Returned mail: Too many hops 19 (17 max): from <linuxuser-admin@www.linux.org.uk> via [199.164.235.226], to <scoffman@wellpartner.com>
|
||||
Message-Id: <200104061723.JAB03225@zinfandel.lacita.com>
|
||||
To: <linuxuser-admin@www.linux.org.uk>
|
||||
To: postmaster@zinfandel.lacita.com
|
||||
MIME-Version: 1.0
|
||||
Content-Type: multipart/report; report-type=delivery-status;
|
||||
bo
|
||||
Auto-Submitted: auto-generated (failure)
|
||||
|
||||
This is a MIME-encapsulated message
|
||||
|
||||
--JAB03225.986577786/zinfandel.lacita.com
|
||||
|
||||
The original message was received at Fri, 6 Apr 2001 09:23:03 -0800 (GMT-0800)
|
||||
from [199.164.235.226]
|
||||
|
||||
----- The following addresses have delivery notifications -----
|
||||
<scoffman@wellpartner.com> (unrecoverable error)
|
||||
|
||||
----- Transcript of session follows -----
|
||||
554 Too many hops 19 (17 max): from <linuxuser-admin@www.linux.org.uk> via [199.164.235.226], to <scoffman@wellpartner.com>
|
||||
|
||||
--JAB03225.986577786/zinfandel.lacita.com
|
||||
Content-Type: message/delivery-status
|
||||
|
||||
Reporting-MTA: dns; zinfandel.lacita.com
|
||||
Received-From-MTA: dns; [199.164.235.226]
|
||||
Arrival-Date: Fri, 6 Apr 2001 09:23:03 -0800 (GMT-0800)
|
||||
|
||||
Final-Recipient: rfc822; scoffman@wellpartner.com
|
||||
Action: failed
|
||||
Status: 5.4.6
|
||||
Last-Attempt-Date: Fri, 6 Apr 2001 09:23:06 -0800 (GMT-0800)
|
||||
|
||||
--JAB03225.986577786/zinfandel.lacita.com
|
||||
Content-Type: text/rfc822-headers
|
||||
|
||||
Return-Path: linuxuser-admin@www.linux.org.uk
|
||||
Received: from ns1.wellpartner.net ([199.164.235.226]) by zinfandel.lacita.com (8.7.3/8.6.10-MT4.00) with ESMTP id JAA03225 for <scoffman@wellpartner.com>; Fri, 6 Apr 2001 09:23:03 -0800 (GMT-0800)
|
||||
Received: from zinfandel.lacita.com ([204.245.199.98])
|
||||
by
|
||||
fo
|
||||
Received: from ns1.wellpartner.net ([199.164.235.226]) by zinfandel.lacita.com (8.7.3/8.6.10-MT4.00) with ESMTP id JAA03221 for <scoffman@wellpartner.com>; Fri, 6 Apr 2001 09:22:18 -0800 (GMT-0800)
|
||||
Received: from zinfandel.lacita.com ([204.245.199.98])
|
||||
by
|
||||
fo
|
||||
Received: from ns1.wellpartner.net ([199.164.235.226]) by zinfandel.lacita.com (8.7.3/8.6.10-MT4.00) with ESMTP id JAA03217 for <scoffman@wellpartner.com>; Fri, 6 Apr 2001 09:21:37 -0800 (GMT-0800)
|
||||
Received: from zinfandel.lacita.com ([204.245.199.98])
|
||||
by
|
||||
fo
|
||||
Received: from ns1.wellpartner.net ([199.164.235.226]) by zinfandel.lacita.com (8.7.3/8.6.10-MT4.00) with ESMTP id JAA03213 for <scoffman@wellpartner.com>; Fri, 6 Apr 2001 09:20:56 -0800 (GMT-0800)
|
||||
Received: from zinfandel.lacita.com ([204.245.199.98])
|
||||
by
|
||||
fo
|
||||
Received: from ns1.wellpartner.net ([199.164.235.226]) by zinfandel.lacita.com (8.7.3/8.6.10-MT4.00) with ESMTP id JAA03209 for <scoffman@wellpartner.com>; Fri, 6 Apr 2001 09:20:15 -0800 (GMT-0800)
|
||||
Received: from zinfandel.lacita.com ([204.245.199.98])
|
||||
by
|
||||
fo
|
||||
Received: from ns1.wellpartner.net ([199.164.235.226]) by zinfandel.lacita.com (8.7.3/8.6.10-MT4.00) with ESMTP id JAA03205 for <scoffman@wellpartner.com>; Fri, 6 Apr 2001 09:19:33 -0800 (GMT-0800)
|
||||
Received: from zinfandel.lacita.com ([204.245.199.98])
|
||||
by
|
||||
fo
|
||||
Received: from ns1.wellpartner.net ([199.164.235.226]) by zinfandel.lacita.com (8.7.3/8.6.10-MT4.00) with ESMTP id JAA03201 for <scoffman@wellpartner.com>; Fri, 6 Apr 2001 09:18:52 -0800 (GMT-0800)
|
||||
Received: from zinfandel.lacita.com ([204.245.199.98])
|
||||
by
|
||||
fo
|
||||
Received: from ns1.wellpartner.net ([199.164.235.226]) by zinfandel.lacita.com (8.7.3/8.6.10-MT4.00) with ESMTP id JAA03197 for <scoffman@wellpartner.com>; Fri, 6 Apr 2001 09:17:54 -0800 (GMT-0800)
|
||||
Received: from www.linux.org.uk (parcelfarce.linux.theplanet.co.uk [195.92.249.252])
|
||||
by
|
||||
fo
|
||||
Received: from localhost.localdomain
|
||||
([
|
||||
by
|
||||
id
|
||||
Received: from [212.1.130.11] (helo=s1.uklinux.net ident=root)
|
||||
by
|
||||
id
|
||||
fo
|
||||
Received: from server (ppp-2-22.cvx4.telinco.net [212.1.149.22])
|
||||
by
|
||||
fo
|
||||
From: Daniel James <daniel@linuxuser.co.uk>
|
||||
Organization: LinuxUser
|
||||
To: linuxuser@www.linux.org.uk
|
||||
X-Mailer: KMail [version 1.1.99]
|
||||
Content-Type: text/plain;
|
||||
c
|
||||
MIME-Version: 1.0
|
||||
Message-Id: <01040616033903.00962@server>
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Subject: [LinuxUser] bulletin no. 45
|
||||
Sender: linuxuser-admin@www.linux.org.uk
|
||||
Errors-To: linuxuser-admin@www.linux.org.uk
|
||||
X-BeenThere: linuxuser@www.linux.org.uk
|
||||
X-Mailman-Version: 2.0.3
|
||||
Precedence: bulk
|
||||
List-Help: <mailto:linuxuser-request@www.linux.org.uk?subject=help>
|
||||
List-Post: <mailto:linuxuser@www.linux.org.uk>
|
||||
List-Subscribe: <http://www.linux.org.uk/mailman/listinfo/linuxuser>,
|
||||
<m
|
||||
List-Id: bulletins from LinuxUser magazine <linuxuser.www.linux.org.uk>
|
||||
List-Unsubscribe: <http://www.linux.org.uk/mailman/listinfo/linuxuser>,
|
||||
<m
|
||||
List-Archive: <http://www.linux.org.uk/pipermail/linuxuser/>
|
||||
Date: Fri, 6 Apr 2001 16:03:39 +0100
|
||||
|
||||
--JAB03225.986577786/zinfandel.lacita.com--
|
||||
|
||||
|
@ -1,45 +0,0 @@
|
||||
Received: from xcar [192.168.0.2] by jeeves.wooster.local
|
||||
(SMTPD32-7.07 EVAL) id AFF92F0214; Sun, 12 May 2002 08:55:37 +0100
|
||||
Date: Sun, 12 May 2002 08:56:15 +0100
|
||||
From: Father Time <father.time@xcar.wooster.local>
|
||||
To: timbo@jeeves.wooster.local
|
||||
Subject: IMAP file test
|
||||
Message-ID: <6df65d354b.father.time@rpc.wooster.local>
|
||||
X-Organization: Home
|
||||
User-Agent: Messenger-Pro/2.50a (MsgServe/1.50) (RISC-OS/4.02) POPstar/2.03
|
||||
MIME-Version: 1.0
|
||||
Content-Type: multipart/mixed; boundary="1618492860--2051301190--113853680"
|
||||
Status: R
|
||||
X-UIDL: 319998302
|
||||
|
||||
This message is in MIME format which your mailer apparently does not support.
|
||||
You either require a newer version of your software which supports MIME, or
|
||||
a separate MIME decoding utility. Alternatively, ask the sender of this
|
||||
message to resend it in a different format.
|
||||
|
||||
--1618492860--2051301190--113853680
|
||||
Content-Type: text/plain; charset=us-ascii
|
||||
|
||||
Simple email with attachment.
|
||||
|
||||
|
||||
--1618492860--2051301190--113853680
|
||||
Content-Type: application/riscos; name="clock.bmp,69c"; type=BMP; load=&fff69c4b; exec=&355dd4d1; access=&03
|
||||
Content-Disposition: attachment; filename="clock.bmp"
|
||||
Content-Transfer-Encoding: base64
|
||||
|
||||
Qk12AgAAAAAAAHYAAAAoAAAAIAAAACAAAAABAAQAAAAAAAAAAADXDQAA1w0AAAAAAAAA
|
||||
AAAAAAAAAAAAiAAAiAAAAIiIAIgAAACIAIgAiIgAALu7uwCIiIgAERHdACLuIgAz//8A
|
||||
zAAAAN0R3QDu7iIA////AAAAAAAAAAAAAAAAAAAAAAAAAAi3AAAAAAAAADeAAAAAAAAA
|
||||
C3ADMzMzMANwAAAAAAAAAAAHMAAAAANwAAAAAAAAAACAMAd3zPfwAwgAAAAAAAAIAwd/
|
||||
f8x/f3AwgAAAAAAAgDB0x/f3//zPAwgAAAAAAAcHfM9////8z/AwAAAAAAiwd/f3////
|
||||
////A4AAAAAAcEx/f///////zAMAAAAAiwfM9////3///8zwOAAAAAcHf3////B/////
|
||||
8DAAAAALB/f3///wd3d3//AwAAAABwTPf//wCQAAD/zAMAAAAAsEx/f///B////8wDAA
|
||||
AAAHB39////wf/////AwAAAACwf39///8H/////wMAAAAIcHfM9///B////M8DgAAAAA
|
||||
sHTH///wf///xAMAAAAACHB3f3//8H////cDgAAAAAALB3zH//D//M9wMAAAAAAAgLB0
|
||||
z39///xHAwgAAAAAAAgLB3d3RHd3cDCAAAAAAAAAgLAHd0R3cAMIAAAAAAAAgAgLcAAA
|
||||
AAMwgAgAAAAACDAAAAu7t7cwAAgDgAAAAABzcIAAAAAAAAgDMwAAAAAAN7uwgAAAAAgH
|
||||
MzMAAAAACH97tzAAAAALu3c3gAAAAAAL+7tzDABAu7f7cAAAAAAACA+3MA7EQAv/sIAA
|
||||
AAAAAAAIAAAAAAAAAIAAAAAA
|
||||
|
||||
--1618492860--2051301190--113853680--
|
@ -1,15 +0,0 @@
|
||||
Return-Path: <aperson@dom.ain>
|
||||
Received: by mail.dom.ain (Postfix, from userid 889)
|
||||
id B9D0AD35DB; Tue, 4 Jun 2002 21:46:59 -0400 (EDT)
|
||||
Message-ID: <15613.28051.707126.569693@dom.ain>
|
||||
Date: Tue, 4 Jun 2002 21:46:59 -0400
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=us-ascii
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: bug demonstration
|
||||
12345678911234567892123456789312345678941234567895123456789612345678971234567898112345678911234567892123456789112345678911234567892123456789
|
||||
more text
|
||||
From: aperson@dom.ain (Anne P. Erson)
|
||||
To: bperson@dom.ain (Barney P. Erson)
|
||||
|
||||
test
|
@ -1,25 +0,0 @@
|
||||
From: aperson@dom.ain
|
||||
MIME-Version: 1.0
|
||||
Content-Type: multipart/digest; boundary=BOUNDARY
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: message/rfc822
|
||||
|
||||
Content-Type: text/plain; charset=us-ascii
|
||||
To: aa@bb.org
|
||||
From: cc@dd.org
|
||||
Subject: ee
|
||||
|
||||
message 1
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: message/rfc822
|
||||
|
||||
Content-Type: text/plain; charset=us-ascii
|
||||
To: aa@bb.org
|
||||
From: cc@dd.org
|
||||
Subject: ee
|
||||
|
||||
message 2
|
||||
|
||||
--BOUNDARY--
|
@ -1,22 +0,0 @@
|
||||
Return-Path: <bbb@zzz.org>
|
||||
Delivered-To: bbb@zzz.org
|
||||
Received: by mail.zzz.org (Postfix, from userid 889)
|
||||
id 27CEAD38CC; Fri, 4 May 2001 14:05:44 -0400 (EDT)
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=us-ascii;
|
||||
title*0*="us-ascii'en'This%20is%20even%20more%20";
|
||||
title*1*="%2A%2A%2Afun%2A%2A%2A%20";
|
||||
title*2="isn't it!"
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Message-ID: <15090.61304.110929.45684@aaa.zzz.org>
|
||||
From: bbb@ddd.com (John X. Doe)
|
||||
To: bbb@zzz.org
|
||||
Subject: This is a test message
|
||||
Date: Fri, 4 May 2001 14:05:44 -0400
|
||||
|
||||
|
||||
Hi,
|
||||
|
||||
Do you like this message?
|
||||
|
||||
-Me
|
@ -1,23 +0,0 @@
|
||||
From: aperson@dom.ain
|
||||
MIME-Version: 1.0
|
||||
Content-Type: multipart/digest; boundary=BOUNDARY
|
||||
|
||||
--BOUNDARY
|
||||
|
||||
Content-Type: text/plain; charset=us-ascii
|
||||
To: aa@bb.org
|
||||
From: cc@dd.org
|
||||
Subject: ee
|
||||
|
||||
message 1
|
||||
|
||||
--BOUNDARY
|
||||
|
||||
Content-Type: text/plain; charset=us-ascii
|
||||
To: aa@bb.org
|
||||
From: cc@dd.org
|
||||
Subject: ee
|
||||
|
||||
message 2
|
||||
|
||||
--BOUNDARY--
|
@ -1,15 +0,0 @@
|
||||
From: aperson@dom.ain
|
||||
MIME-Version: 1.0
|
||||
Content-Type: multipart/mixed; boundary=BOUNDARY_
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: text/plain
|
||||
|
||||
message 1
|
||||
|
||||
--BOUNDARY
|
||||
Content-Type: text/plain
|
||||
|
||||
message 2
|
||||
|
||||
--BOUNDARY--
|
@ -1,14 +0,0 @@
|
||||
Delivered-To: freebsd-isp@freebsd.org
|
||||
Date: Tue, 26 Sep 2000 12:23:03 -0500
|
||||
From: Anne Person <aperson@example.com>
|
||||
To: Barney Dude <bdude@example.com>
|
||||
Subject: Re: Limiting Perl CPU Utilization...
|
||||
Mime-Version: 1.0
|
||||
Content-Type: text/plain; charset*=ansi-x3.4-1968''us-ascii
|
||||
Content-Disposition: inline
|
||||
User-Agent: Mutt/1.3.8i
|
||||
Sender: owner-freebsd-isp@FreeBSD.ORG
|
||||
Precedence: bulk
|
||||
X-Loop: FreeBSD.org
|
||||
|
||||
Some message.
|
@ -1,29 +0,0 @@
|
||||
Delivered-To: freebsd-isp@freebsd.org
|
||||
Date: Wed, 27 Sep 2000 11:11:09 -0500
|
||||
From: Anne Person <aperson@example.com>
|
||||
To: Barney Dude <bdude@example.com>
|
||||
Subject: Re: Limiting Perl CPU Utilization...
|
||||
Mime-Version: 1.0
|
||||
Content-Type: multipart/signed; micalg*=ansi-x3.4-1968''pgp-md5;
|
||||
protocol*=ansi-x3.4-1968''application%2Fpgp-signature;
|
||||
boundary*="ansi-x3.4-1968''EeQfGwPcQSOJBaQU"
|
||||
Content-Disposition: inline
|
||||
Sender: owner-freebsd-isp@FreeBSD.ORG
|
||||
Precedence: bulk
|
||||
X-Loop: FreeBSD.org
|
||||
|
||||
|
||||
--EeQfGwPcQSOJBaQU
|
||||
Content-Type: text/plain; charset*=ansi-x3.4-1968''us-ascii
|
||||
Content-Disposition: inline
|
||||
Content-Transfer-Encoding: quoted-printable
|
||||
|
||||
part 1
|
||||
|
||||
--EeQfGwPcQSOJBaQU
|
||||
Content-Type: text/plain
|
||||
Content-Disposition: inline
|
||||
|
||||
part 2
|
||||
|
||||
--EeQfGwPcQSOJBaQU--
|
@ -1,19 +0,0 @@
|
||||
From: aperson@dom.ain
|
||||
To: bperson@dom.ain
|
||||
Content-Type: multipart/digest; boundary=XYZ
|
||||
|
||||
--XYZ
|
||||
Content-Type: text/plain
|
||||
|
||||
|
||||
This is a text plain part that is counter to recommended practice in
|
||||
RFC 2046, $5.1.5, but is not illegal
|
||||
|
||||
--XYZ
|
||||
|
||||
From: cperson@dom.ain
|
||||
To: dperson@dom.ain
|
||||
|
||||
A submessage
|
||||
|
||||
--XYZ--
|
@ -1,4 +0,0 @@
|
||||
From: aperson@dom.ain
|
||||
To: bperson@dom.ain
|
||||
Subject: here's something interesting
|
||||
counter to RFC 2822, there's no separating newline here
|
@ -1,40 +0,0 @@
|
||||
Mime-Version: 1.0
|
||||
Content-Type: Multipart/Mixed; Boundary="NextPart"
|
||||
To: IETF-Announce:;
|
||||
From: Internet-Drafts@ietf.org
|
||||
Subject: I-D ACTION:draft-ietf-mboned-mix-00.txt
|
||||
Date: Tue, 22 Dec 1998 16:55:06 -0500
|
||||
|
||||
--NextPart
|
||||
|
||||
Blah blah blah
|
||||
|
||||
--NextPart
|
||||
Content-Type: Multipart/Alternative; Boundary="OtherAccess"
|
||||
|
||||
--OtherAccess
|
||||
Content-Type: Message/External-body;
|
||||
access-type="mail-server";
|
||||
server="mailserv@ietf.org"
|
||||
|
||||
Content-Type: text/plain
|
||||
Content-ID: <19981222151406.I-D@ietf.org>
|
||||
|
||||
ENCODING mime
|
||||
FILE /internet-drafts/draft-ietf-mboned-mix-00.txt
|
||||
|
||||
--OtherAccess
|
||||
Content-Type: Message/External-body;
|
||||
name="draft-ietf-mboned-mix-00.txt";
|
||||
site="ftp.ietf.org";
|
||||
access-type="anon-ftp";
|
||||
directory="internet-drafts"
|
||||
|
||||
Content-Type: text/plain
|
||||
Content-ID: <19981222151406.I-D@ietf.org>
|
||||
|
||||
|
||||
--OtherAccess--
|
||||
|
||||
--NextPart--
|
||||
|
@ -1,22 +0,0 @@
|
||||
Content-Type: multipart/mixed; boundary=ABCDE
|
||||
|
||||
--ABCDE
|
||||
Content-Type: text/x-one
|
||||
|
||||
Blah
|
||||
|
||||
--ABCDE
|
||||
--ABCDE
|
||||
Content-Type: text/x-two
|
||||
|
||||
Blah
|
||||
|
||||
--ABCDE
|
||||
--ABCDE
|
||||
--ABCDE
|
||||
--ABCDE
|
||||
Content-Type: text/x-two
|
||||
|
||||
Blah
|
||||
|
||||
--ABCDE--
|
@ -1,101 +0,0 @@
|
||||
MIME-Version: 1.0
|
||||
Content-Type: multipart/mixed; boundary="----- =_aaaaaaaaaa0"
|
||||
|
||||
------- =_aaaaaaaaaa0
|
||||
Content-Type: multipart/mixed; boundary="----- =_aaaaaaaaaa1"
|
||||
Content-ID: <20592.1022586929.1@example.com>
|
||||
|
||||
------- =_aaaaaaaaaa1
|
||||
Content-Type: multipart/alternative; boundary="----- =_aaaaaaaaaa2"
|
||||
Content-ID: <20592.1022586929.2@example.com>
|
||||
|
||||
------- =_aaaaaaaaaa2
|
||||
Content-Type: text/plain
|
||||
Content-ID: <20592.1022586929.3@example.com>
|
||||
Content-Description: very tricky
|
||||
Content-Transfer-Encoding: 7bit
|
||||
|
||||
|
||||
Unlike the test test_nested-multiples-with-internal-boundary, this
|
||||
piece of text not only contains the outer boundary tags
|
||||
------- =_aaaaaaaaaa1
|
||||
and
|
||||
------- =_aaaaaaaaaa0
|
||||
but puts them at the start of a line! And, to be even nastier, it
|
||||
even includes a couple of end tags, such as this one:
|
||||
|
||||
------- =_aaaaaaaaaa1--
|
||||
|
||||
and this one, which is from a multipart we haven't even seen yet!
|
||||
|
||||
------- =_aaaaaaaaaa4--
|
||||
|
||||
This will, I'm sure, cause much breakage of MIME parsers. But, as
|
||||
far as I can tell, it's perfectly legal. I have not yet ever seen
|
||||
a case of this in the wild, but I've seen *similar* things.
|
||||
|
||||
|
||||
------- =_aaaaaaaaaa2
|
||||
Content-Type: application/octet-stream
|
||||
Content-ID: <20592.1022586929.4@example.com>
|
||||
Content-Description: patch2
|
||||
Content-Transfer-Encoding: base64
|
||||
|
||||
XXX
|
||||
|
||||
------- =_aaaaaaaaaa2--
|
||||
|
||||
------- =_aaaaaaaaaa1
|
||||
Content-Type: multipart/alternative; boundary="----- =_aaaaaaaaaa3"
|
||||
Content-ID: <20592.1022586929.6@example.com>
|
||||
|
||||
------- =_aaaaaaaaaa3
|
||||
Content-Type: application/octet-stream
|
||||
Content-ID: <20592.1022586929.7@example.com>
|
||||
Content-Description: patch3
|
||||
Content-Transfer-Encoding: base64
|
||||
|
||||
XXX
|
||||
|
||||
------- =_aaaaaaaaaa3
|
||||
Content-Type: application/octet-stream
|
||||
Content-ID: <20592.1022586929.8@example.com>
|
||||
Content-Description: patch4
|
||||
Content-Transfer-Encoding: base64
|
||||
|
||||
XXX
|
||||
|
||||
------- =_aaaaaaaaaa3--
|
||||
|
||||
------- =_aaaaaaaaaa1
|
||||
Content-Type: multipart/alternative; boundary="----- =_aaaaaaaaaa4"
|
||||
Content-ID: <20592.1022586929.10@example.com>
|
||||
|
||||
------- =_aaaaaaaaaa4
|
||||
Content-Type: application/octet-stream
|
||||
Content-ID: <20592.1022586929.11@example.com>
|
||||
Content-Description: patch5
|
||||
Content-Transfer-Encoding: base64
|
||||
|
||||
XXX
|
||||
|
||||
------- =_aaaaaaaaaa4
|
||||
Content-Type: application/octet-stream
|
||||
Content-ID: <20592.1022586929.12@example.com>
|
||||
Content-Description: patch6
|
||||
Content-Transfer-Encoding: base64
|
||||
|
||||
XXX
|
||||
|
||||
------- =_aaaaaaaaaa4--
|
||||
|
||||
------- =_aaaaaaaaaa1--
|
||||
|
||||
------- =_aaaaaaaaaa0
|
||||
Content-Type: text/plain; charset="us-ascii"
|
||||
Content-ID: <20592.1022586929.15@example.com>
|
||||
|
||||
--
|
||||
It's never too late to have a happy childhood.
|
||||
|
||||
------- =_aaaaaaaaaa0--
|
@ -1,83 +0,0 @@
|
||||
MIME-Version: 1.0
|
||||
Content-Type: multipart/mixed; boundary="----- =_aaaaaaaaaa0"
|
||||
|
||||
------- =_aaaaaaaaaa0
|
||||
Content-Type: multipart/mixed; boundary="----- =_aaaaaaaaaa1"
|
||||
Content-ID: <20592.1022586929.1@example.com>
|
||||
|
||||
------- =_aaaaaaaaaa1
|
||||
Content-Type: multipart/alternative; boundary="----- =_aaaaaaaaaa1"
|
||||
Content-ID: <20592.1022586929.2@example.com>
|
||||
|
||||
------- =_aaaaaaaaaa1
|
||||
Content-Type: application/octet-stream
|
||||
Content-ID: <20592.1022586929.3@example.com>
|
||||
Content-Description: patch1
|
||||
Content-Transfer-Encoding: base64
|
||||
|
||||
XXX
|
||||
|
||||
------- =_aaaaaaaaaa1
|
||||
Content-Type: application/octet-stream
|
||||
Content-ID: <20592.1022586929.4@example.com>
|
||||
Content-Description: patch2
|
||||
Content-Transfer-Encoding: base64
|
||||
|
||||
XXX
|
||||
|
||||
------- =_aaaaaaaaaa1--
|
||||
|
||||
------- =_aaaaaaaaaa1
|
||||
Content-Type: multipart/alternative; boundary="----- =_aaaaaaaaaa1"
|
||||
Content-ID: <20592.1022586929.6@example.com>
|
||||
|
||||
------- =_aaaaaaaaaa1
|
||||
Content-Type: application/octet-stream
|
||||
Content-ID: <20592.1022586929.7@example.com>
|
||||
Content-Description: patch3
|
||||
Content-Transfer-Encoding: base64
|
||||
|
||||
XXX
|
||||
|
||||
------- =_aaaaaaaaaa1
|
||||
Content-Type: application/octet-stream
|
||||
Content-ID: <20592.1022586929.8@example.com>
|
||||
Content-Description: patch4
|
||||
Content-Transfer-Encoding: base64
|
||||
|
||||
XXX
|
||||
|
||||
------- =_aaaaaaaaaa1--
|
||||
|
||||
------- =_aaaaaaaaaa1
|
||||
Content-Type: multipart/alternative; boundary="----- =_aaaaaaaaaa1"
|
||||
Content-ID: <20592.1022586929.10@example.com>
|
||||
|
||||
------- =_aaaaaaaaaa1
|
||||
Content-Type: application/octet-stream
|
||||
Content-ID: <20592.1022586929.11@example.com>
|
||||
Content-Description: patch5
|
||||
Content-Transfer-Encoding: base64
|
||||
|
||||
XXX
|
||||
|
||||
------- =_aaaaaaaaaa1
|
||||
Content-Type: application/octet-stream
|
||||
Content-ID: <20592.1022586929.12@example.com>
|
||||
Content-Description: patch6
|
||||
Content-Transfer-Encoding: base64
|
||||
|
||||
XXX
|
||||
|
||||
------- =_aaaaaaaaaa1--
|
||||
|
||||
------- =_aaaaaaaaaa1--
|
||||
|
||||
------- =_aaaaaaaaaa0
|
||||
Content-Type: text/plain; charset="us-ascii"
|
||||
Content-ID: <20592.1022586929.15@example.com>
|
||||
|
||||
--
|
||||
It's never too late to have a happy childhood.
|
||||
|
||||
------- =_aaaaaaaaaa0--
|
@ -1,10 +0,0 @@
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/html; boundary="--961284236552522269"
|
||||
|
||||
----961284236552522269
|
||||
Content-Type: text/html;
|
||||
Content-Transfer-Encoding: 7Bit
|
||||
|
||||
<html></html>
|
||||
|
||||
----961284236552522269--
|
@ -1,8 +0,0 @@
|
||||
From: "Allison Dunlap" <xxx@example.com>
|
||||
To: yyy@example.com
|
||||
Subject: 64423
|
||||
Date: Sun, 11 Jul 2004 16:09:27 -0300
|
||||
MIME-Version: 1.0
|
||||
Content-Type: multipart/alternative;
|
||||
|
||||
Blah blah blah
|
@ -1,20 +0,0 @@
|
||||
Content-Type: multipart/mixed; boundary="AAA"
|
||||
From: Mail Delivery Subsystem <xxx@example.com>
|
||||
To: yyy@example.com
|
||||
|
||||
This is a MIME-encapsulated message
|
||||
|
||||
--AAA
|
||||
|
||||
Stuff
|
||||
|
||||
--AAA
|
||||
Content-Type: message/rfc822
|
||||
|
||||
From: webmaster@python.org
|
||||
To: zzz@example.com
|
||||
Content-Type: multipart/mixed; boundary="BBB"
|
||||
|
||||
--BBB--
|
||||
|
||||
--AAA--
|
@ -1,217 +0,0 @@
|
||||
From SRS0=aO/p=ON=bag.python.org=None@bounce2.pobox.com Fri Nov 26 21:40:36 2004
|
||||
X-VM-v5-Data: ([nil nil nil nil nil nil nil nil nil]
|
||||
[nil nil nil nil nil nil nil "MAILER DAEMON <>" "MAILER DAEMON <>" nil nil "Banned file: auto__mail.python.bat in mail from you" "^From:" nil nil nil nil "Banned file: auto__mail.python.bat in mail from you" nil nil nil nil nil nil nil]
|
||||
nil)
|
||||
MIME-Version: 1.0
|
||||
Message-Id: <edab.7804f5cb8070@python.org>
|
||||
Content-Type: multipart/report; report-type=delivery-status;
|
||||
charset=utf-8;
|
||||
boundary="----------=_1101526904-1956-5"
|
||||
X-Virus-Scanned: by XS4ALL Virus Scanner
|
||||
X-UIDL: 4\G!!!<c"!UV["!M7C!!
|
||||
From: MAILER DAEMON <>
|
||||
To: <webmaster@python.org>
|
||||
Subject: Banned file: auto__mail.python.bat in mail from you
|
||||
Date: Fri, 26 Nov 2004 19:41:44 -0800 (PST)
|
||||
|
||||
This is a multi-part message in MIME format...
|
||||
|
||||
------------=_1101526904-1956-5
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
Content-Disposition: inline
|
||||
Content-Transfer-Encoding: 7bit
|
||||
|
||||
BANNED FILENAME ALERT
|
||||
|
||||
Your message to: xxxxxxx@dot.ca.gov, xxxxxxxxxxxxx@dot.ca.gov, xxxxxxxxxx@dot.ca.gov, xxxxxxxx@dot.ca.gov, xxxxxxxxxx@dot.ca.gov, xxxxxx@dot.ca.gov, xxxxxxxxxx@dot.ca.gov, xxxxxx@dot.ca.gov, xxxxxx@dot.ca.gov, xxxxxxxxxxxxxxxx@dot.ca.gov, xxxxxxxxxxx@dot.ca.gov, xxxxxxxxxx@dot.ca.gov, xxxxxxxxxx@dot.ca.gov, xxxxxxxxxxxx@dot.ca.gov, xxxxxxxxxxxx@dot.ca.gov, xxxxxxx@dot.ca.gov, xxxxxxxxx@dot.ca.gov, xxxxxxxxxx@dot.ca.gov, xxxxxx@dot.ca.gov, xxx@dot.ca.gov, xxxxxxx@dot.ca.gov, xxxxxxx@dot.ca.gov, xxxxxxxxxxxxxxx@dot.ca.gov, xxxxxxxxxx@dot.ca.gov, xxxxxxx@dot.ca.gov, xxx@dot.ca.gov, xxxxxxxx@dot.ca.gov, xxxxxxxxxxxxx@dot.ca.gov, xxxxxxxxxxxxx@dot.ca.gov, xxxxxxxxxxx@dot.ca.gov, xxxxxxxxx@dot.ca.gov, xxxxxxxxxx@dot.ca.gov, xxxxxxxxxxxx@dot.ca.gov, xxxxxxx@dot.ca.gov, xxxxxxxxxxxxxxx@dot.ca.gov, xxxxxxxxxxxxx@dot.ca.gov, xxxx@dot.ca.gov, xxxxxxxx@dot.ca.gov, xxxxxxxxxx@dot.ca.gov, xxxxxxxxxxxxxxxxxx@dot.ca.gov
|
||||
was blocked by our Spam Firewall. The email you sent with the following subject has NOT BEEN DELIVERED:
|
||||
|
||||
Subject: Delivery_failure_notice
|
||||
|
||||
An attachment in that mail was of a file type that the Spam Firewall is set to block.
|
||||
|
||||
|
||||
|
||||
------------=_1101526904-1956-5
|
||||
Content-Type: message/delivery-status
|
||||
Content-Disposition: inline
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Content-Description: Delivery error report
|
||||
|
||||
Reporting-MTA: dns; sacspam01.dot.ca.gov
|
||||
Received-From-MTA: smtp; sacspam01.dot.ca.gov ([127.0.0.1])
|
||||
Arrival-Date: Fri, 26 Nov 2004 19:41:44 -0800 (PST)
|
||||
|
||||
Final-Recipient: rfc822; xxxxxxx@dot.ca.gov
|
||||
Action: failed
|
||||
Status: 5.7.1
|
||||
Diagnostic-Code: smtp; 550 5.7.1 Message content rejected, id=01956-02-2 - BANNED: auto__mail.python.bat
|
||||
Last-Attempt-Date: Fri, 26 Nov 2004 19:41:44 -0800 (PST)
|
||||
|
||||
Final-Recipient: rfc822; xxxxxxxxxxxxx@dot.ca.gov
|
||||
Action: failed
|
||||
Status: 5.7.1
|
||||
Diagnostic-Code: smtp; 550 5.7.1 Message content rejected, id=01956-02-2 - BANNED: auto__mail.python.bat
|
||||
Last-Attempt-Date: Fri, 26 Nov 2004 19:41:44 -0800 (PST)
|
||||
|
||||
Final-Recipient: rfc822; xxxxxxxxxx@dot.ca.gov
|
||||
Action: failed
|
||||
Status: 5.7.1
|
||||
Diagnostic-Code: smtp; 550 5.7.1 Message content rejected, id=01956-02-2 - BANNED: auto__mail.python.bat
|
||||
Last-Attempt-Date: Fri, 26 Nov 2004 19:41:44 -0800 (PST)
|
||||
|
||||
Final-Recipient: rfc822; xxxxxxxx@dot.ca.gov
|
||||
Action: failed
|
||||
Status: 5.7.1
|
||||
Diagnostic-Code: smtp; 550 5.7.1 Message content rejected, id=01956-02-2 - BANNED: auto__mail.python.bat
|
||||
Last-Attempt-Date: Fri, 26 Nov 2004 19:41:44 -0800 (PST)
|
||||
|
||||
Final-Recipient: rfc822; xxxxxxxxxx@dot.ca.gov
|
||||
Action: failed
|
||||
Status: 5.7.1
|
||||
Diagnostic-Code: smtp; 550 5.7.1 Message content rejected, id=01956-02-2 - BANNED: auto__mail.python.bat
|
||||
Last-Attempt-Date: Fri, 26 Nov 2004 19:41:44 -0800 (PST)
|
||||
|
||||
Final-Recipient: rfc822; xxxxxx@dot.ca.gov
|
||||
Action: failed
|
||||
Status: 5.7.1
|
||||
Diagnostic-Code: smtp; 550 5.7.1 Message content rejected, id=01956-02-2 - BANNED: auto__mail.python.bat
|
||||
Last-Attempt-Date: Fri, 26 Nov 2004 19:41:44 -0800 (PST)
|
||||
|
||||
Final-Recipient: rfc822; xxxxxxxxxx@dot.ca.gov
|
||||
Action: failed
|
||||
Status: 5.7.1
|
||||
Diagnostic-Code: smtp; 550 5.7.1 Message content rejected, id=01956-02-2 - BANNED: auto__mail.python.bat
|
||||
Last-Attempt-Date: Fri, 26 Nov 2004 19:41:44 -0800 (PST)
|
||||
|
||||
Final-Recipient: rfc822; xxxxxx@dot.ca.gov
|
||||
Action: failed
|
||||
Status: 5.7.1
|
||||
Diagnostic-Code: smtp; 550 5.7.1 Message content rejected, id=01956-02-2 - BANNED: auto__mail.python.bat
|
||||
Last-Attempt-Date: Fri, 26 Nov 2004 19:41:44 -0800 (PST)
|
||||
|
||||
Final-Recipient: rfc822; xxxxxx@dot.ca.gov
|
||||
Action: failed
|
||||
Status: 5.7.1
|
||||
Diagnostic-Code: smtp; 550 5.7.1 Message content rejected, id=01956-02-2 - BANNED: auto__mail.python.bat
|
||||
Last-Attempt-Date: Fri, 26 Nov 2004 19:41:44 -0800 (PST)
|
||||
|
||||
Final-Recipient: rfc822; xxxxxxxxxxxxxxxx@dot.ca.gov
|
||||
Action: failed
|
||||
Status: 5.7.1
|
||||
Diagnostic-Code: smtp; 550 5.7.1 Message content rejected, id=01956-02-2 - BANNED: auto__mail.python.bat
|
||||
Last-Attempt-Date: Fri, 26 Nov 2004 19:41:44 -0800 (PST)
|
||||
|
||||
Final-Recipient: rfc822; xxxxxxxxxxx@dot.ca.gov
|
||||
Action: failed
|
||||
Status: 5.7.1
|
||||
Diagnostic-Code: smtp; 550 5.7.1 Message content rejected, id=01956-02-2 - BANNED: auto__mail.python.bat
|
||||
Last-Attempt-Date: Fri, 26 Nov 2004 19:41:44 -0800 (PST)
|
||||
|
||||
Final-Recipient: rfc822; xxxxxxxxxx@dot.ca.gov
|
||||
Action: failed
|
||||
Status: 5.7.1
|
||||
Diagnostic-Code: smtp; 550 5.7.1 Message content rejected, id=01956-02-2 - BANNED: auto__mail.python.bat
|
||||
Last-Attempt-Date: Fri, 26 Nov 2004 19:41:44 -0800 (PST)
|
||||
|
||||
Final-Recipient: rfc822; xxxxxxxxxx@dot.ca.gov
|
||||
Action: failed
|
||||
Status: 5.7.1
|
||||
Diagnostic-Code: smtp; 550 5.7.1 Message content rejected, id=01956-02-2 - BANNED: auto__mail.python.bat
|
||||
Last-Attempt-Date: Fri, 26 Nov 2004 19:41:44 -0800 (PST)
|
||||
|
||||
Final-Recipient: rfc822; xxxxxxxxxxxx@dot.ca.gov
|
||||
Action: failed
|
||||
Status: 5.7.1
|
||||
Diagnostic-Code: smtp; 550 5.7.1 Message content rejected, id=01956-02-2 - BANNED: auto__mail.python.bat
|
||||
Last-Attempt-Date: Fri, 26 Nov 2004 19:41:44 -0800 (PST)
|
||||
|
||||
Final-Recipient: rfc822; xxxxxxxxxxxx@dot.ca.gov
|
||||
Action: failed
|
||||
Status: 5.7.1
|
||||
Diagnostic-Code: smtp; 550 5.7.1 Message content rejected, id=01956-02-2 - BANNED: auto__mail.python.bat
|
||||
Last-Attempt-Date: Fri, 26 Nov 2004 19:41:44 -0800 (PST)
|
||||
|
||||
Final-Recipient: rfc822; xxxxxxx@dot.ca.gov
|
||||
Action: failed
|
||||
Status: 5.7.1
|
||||
Diagnostic-Code: smtp; 550 5.7.1 Message content rejected, id=01956-02-2 - BANNED: auto__mail.python.bat
|
||||
Last-Attempt-Date: Fri, 26 Nov 2004 19:41:44 -0800 (PST)
|
||||
|
||||
Final-Recipient: rfc822; xxxxxxxxx@dot.ca.gov
|
||||
Action: failed
|
||||
Status: 5.7.1
|
||||
Diagnostic-Code: smtp; 550 5.7.1 Message content rejected, id=01956-02-2 - BANNED: auto__mail.python.bat
|
||||
Last-Attempt-Date: Fri, 26 Nov 2004 19:41:44 -0800 (PST)
|
||||
|
||||
Final-Recipient: rfc822; xxxxxxxxxx@dot.ca.gov
|
||||
Action: failed
|
||||
Status: 5.7.1
|
||||
Diagnostic-Code: smtp; 550 5.7.1 Message content rejected, id=01956-02-2 - BANNED: auto__mail.python.bat
|
||||
Last-Attempt-Date: Fri, 26 Nov 2004 19:41:44 -0800 (PST)
|
||||
|
||||
Final-Recipient: rfc822; xxxxxx@dot.ca.gov
|
||||
Action: failed
|
||||
Status: 5.7.1
|
||||
Diagnostic-Code: smtp; 550 5.7.1 Message content rejected, id=01956-02-2 - BANNED: auto__mail.python.bat
|
||||
Last-Attempt-Date: Fri, 26 Nov 2004 19:41:44 -0800 (PST)
|
||||
|
||||
Final-Recipient: rfc822; xxx@dot.ca.gov
|
||||
Action: failed
|
||||
Status: 5.7.1
|
||||
Diagnostic-Code: smtp; 550 5.7.1 Message content rejected, id=01956-02-2 - BANNED: auto__mail.python.bat
|
||||
Last-Attempt-Date: Fri, 26 Nov 2004 19:41:44 -0800 (PST)
|
||||
|
||||
Final-Recipient: rfc822; xxxxxxx@dot.ca.gov
|
||||
Action: failed
|
||||
Status: 5.7.1
|
||||
Diagnostic-Code: smtp; 550 5.7.1 Message content rejected, id=01956-02-2 - BANNED: auto__mail.python.bat
|
||||
Last-Attempt-Date: Fri, 26 Nov 2004 19:41:44 -0800 (PST)
|
||||
|
||||
Final-Recipient: rfc822; xxxxxxx@dot.ca.gov
|
||||
Action: failed
|
||||
Status: 5.7.1
|
||||
Diagnostic-Code: smtp; 550 5.7.1 Message content rejected, id=01956-02-2 - BANNED: auto__mail.python.bat
|
||||
Last-Attempt-Date: Fri, 26 Nov 2004 19:41:44 -0800 (PST)
|
||||
|
||||
Final-Recipient: rfc822; xxxxxxxxxxxxxxx@dot.ca.gov
|
||||
Action: failed
|
||||
Status: 5.7.1
|
||||
Diagnostic-Code: smtp; 550 5.7.1 Message content rejected, id=01956-02-2 - BANNED: auto__mail.python.bat
|
||||
Last-Attempt-Date: Fri, 26 Nov 2004 19:41:44 -0800 (PST)
|
||||
|
||||
Final-Recipient: rfc822; xxxxxxxxxx@dot.ca.gov
|
||||
Action: failed
|
||||
Status: 5.7.1
|
||||
Diagnostic-Code: smtp; 550 5.7.1 Message content rejected, id=01956-02-2 - BANNED: auto__mail.python.bat
|
||||
Last-Attempt-Date: Fri, 26 Nov 2004 19:41:44 -0800 (PST)
|
||||
|
||||
Final-Recipient: rfc822; xxxxxxx@dot.ca.gov
|
||||
Action: failed
|
||||
Status: 5.7.1
|
||||
Diagnostic-Code: smtp; 550 5.7.1 Message content rejected, id=01956-02-2 - BANNED: auto__mail.python.bat
|
||||
Last-Attempt-Date: Fri, 26 Nov 2004 19:41:44 -0800 (PST)
|
||||
|
||||
------------=_1101526904-1956-5
|
||||
Content-Type: text/rfc822-headers
|
||||
Content-Disposition: inline
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Content-Description: Undelivered-message headers
|
||||
|
||||
Received: from kgsav.org (ppp-70-242-162-63.dsl.spfdmo.swbell.net [70.242.162.63])
|
||||
by sacspam01.dot.ca.gov (Spam Firewall) with SMTP
|
||||
id A232AD03DE3A; Fri, 26 Nov 2004 19:41:35 -0800 (PST)
|
||||
From: webmaster@python.org
|
||||
To: xxxxx@dot.ca.gov
|
||||
Date: Sat, 27 Nov 2004 03:35:30 UTC
|
||||
Subject: Delivery_failure_notice
|
||||
Importance: Normal
|
||||
X-Priority: 3 (Normal)
|
||||
X-MSMail-Priority: Normal
|
||||
Message-ID: <edab.7804f5cb8070@python.org>
|
||||
MIME-Version: 1.0
|
||||
Content-Type: multipart/mixed; boundary="====67bd2b7a5.f99f7"
|
||||
Content-Transfer-Encoding: 7bit
|
||||
|
||||
------------=_1101526904-1956-5--
|
||||
|
@ -1,35 +0,0 @@
|
||||
Return-Path: <barry@python.org>
|
||||
Delivered-To: barry@python.org
|
||||
Received: by mail.python.org (Postfix, from userid 889)
|
||||
id C2BF0D37C6; Tue, 11 Sep 2001 00:05:05 -0400 (EDT)
|
||||
MIME-Version: 1.0
|
||||
Content-Type: multipart/mixed; boundary="h90VIIIKmx"
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Message-ID: <15261.36209.358846.118674@anthem.python.org>
|
||||
From: barry@python.org (Barry A. Warsaw)
|
||||
To: barry@python.org
|
||||
Subject: a simple multipart
|
||||
Date: Tue, 11 Sep 2001 00:05:05 -0400
|
||||
X-Mailer: VM 6.95 under 21.4 (patch 4) "Artificial Intelligence" XEmacs Lucid
|
||||
X-Attribution: BAW
|
||||
X-Oblique-Strategy: Make a door into a window
|
||||
|
||||
|
||||
--h90VIIIKmx
|
||||
Content-Type: text/plain
|
||||
Content-Disposition: inline; name="msg.txt"
|
||||
Content-Transfer-Encoding: 7bit
|
||||
|
||||
a simple kind of mirror
|
||||
to reflect upon our own
|
||||
|
||||
--h90VIIIKmx
|
||||
Content-Type: text/plain
|
||||
Content-Disposition: inline; name="msg.txt"
|
||||
Content-Transfer-Encoding: 7bit
|
||||
|
||||
a simple kind of mirror
|
||||
to reflect upon our own
|
||||
|
||||
--h90VIIIKmx--
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,77 +0,0 @@
|
||||
# Copyright (C) 2002-2006 Python Software Foundation
|
||||
# Contact: email-sig@python.org
|
||||
# email package unit tests for (optional) Asian codecs
|
||||
|
||||
import unittest
|
||||
from test.test_support import TestSkipped, run_unittest
|
||||
|
||||
from email.test.test_email import TestEmailBase
|
||||
from email.Charset import Charset
|
||||
from email.Header import Header, decode_header
|
||||
from email.Message import Message
|
||||
|
||||
# We're compatible with Python 2.3, but it doesn't have the built-in Asian
|
||||
# codecs, so we have to skip all these tests.
|
||||
try:
|
||||
unicode('foo', 'euc-jp')
|
||||
except LookupError:
|
||||
raise TestSkipped
|
||||
|
||||
|
||||
|
||||
class TestEmailAsianCodecs(TestEmailBase):
|
||||
def test_japanese_codecs(self):
|
||||
eq = self.ndiffAssertEqual
|
||||
j = Charset("euc-jp")
|
||||
g = Charset("iso-8859-1")
|
||||
h = Header("Hello World!")
|
||||
jhello = '\xa5\xcf\xa5\xed\xa1\xbc\xa5\xef\xa1\xbc\xa5\xeb\xa5\xc9\xa1\xaa'
|
||||
ghello = 'Gr\xfc\xdf Gott!'
|
||||
h.append(jhello, j)
|
||||
h.append(ghello, g)
|
||||
# BAW: This used to -- and maybe should -- fold the two iso-8859-1
|
||||
# chunks into a single encoded word. However it doesn't violate the
|
||||
# standard to have them as two encoded chunks and maybe it's
|
||||
# reasonable <wink> for each .append() call to result in a separate
|
||||
# encoded word.
|
||||
eq(h.encode(), """\
|
||||
Hello World! =?iso-2022-jp?b?GyRCJU8lbSE8JW8hPCVrJUkhKhsoQg==?=
|
||||
=?iso-8859-1?q?Gr=FC=DF?= =?iso-8859-1?q?_Gott!?=""")
|
||||
eq(decode_header(h.encode()),
|
||||
[('Hello World!', None),
|
||||
('\x1b$B%O%m!<%o!<%k%I!*\x1b(B', 'iso-2022-jp'),
|
||||
('Gr\xfc\xdf Gott!', 'iso-8859-1')])
|
||||
long = 'test-ja \xa4\xd8\xc5\xea\xb9\xc6\xa4\xb5\xa4\xec\xa4\xbf\xa5\xe1\xa1\xbc\xa5\xeb\xa4\xcf\xbb\xca\xb2\xf1\xbc\xd4\xa4\xce\xbe\xb5\xc7\xa7\xa4\xf2\xc2\xd4\xa4\xc3\xa4\xc6\xa4\xa4\xa4\xde\xa4\xb9'
|
||||
h = Header(long, j, header_name="Subject")
|
||||
# test a very long header
|
||||
enc = h.encode()
|
||||
# TK: splitting point may differ by codec design and/or Header encoding
|
||||
eq(enc , """\
|
||||
=?iso-2022-jp?b?dGVzdC1qYSAbJEIkWEVqOUYkNSRsJD8lYSE8JWskTztKGyhC?=
|
||||
=?iso-2022-jp?b?GyRCMnE8VCROPjVHJyRyQlQkQyRGJCQkXiQ5GyhC?=""")
|
||||
# TK: full decode comparison
|
||||
eq(h.__unicode__().encode('euc-jp'), long)
|
||||
|
||||
def test_payload_encoding(self):
|
||||
jhello = '\xa5\xcf\xa5\xed\xa1\xbc\xa5\xef\xa1\xbc\xa5\xeb\xa5\xc9\xa1\xaa'
|
||||
jcode = 'euc-jp'
|
||||
msg = Message()
|
||||
msg.set_payload(jhello, jcode)
|
||||
ustr = unicode(msg.get_payload(), msg.get_content_charset())
|
||||
self.assertEqual(jhello, ustr.encode(jcode))
|
||||
|
||||
|
||||
|
||||
def suite():
|
||||
suite = unittest.TestSuite()
|
||||
suite.addTest(unittest.makeSuite(TestEmailAsianCodecs))
|
||||
return suite
|
||||
|
||||
|
||||
def test_main():
|
||||
run_unittest(TestEmailAsianCodecs)
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main(defaultTest='suite')
|
@ -1,77 +0,0 @@
|
||||
# Copyright (C) 2002-2006 Python Software Foundation
|
||||
# Contact: email-sig@python.org
|
||||
# email package unit tests for (optional) Asian codecs
|
||||
|
||||
import unittest
|
||||
from test.test_support import TestSkipped, run_unittest
|
||||
|
||||
from email.test.test_email import TestEmailBase
|
||||
from email.charset import Charset
|
||||
from email.header import Header, decode_header
|
||||
from email.message import Message
|
||||
|
||||
# We're compatible with Python 2.3, but it doesn't have the built-in Asian
|
||||
# codecs, so we have to skip all these tests.
|
||||
try:
|
||||
unicode('foo', 'euc-jp')
|
||||
except LookupError:
|
||||
raise TestSkipped
|
||||
|
||||
|
||||
|
||||
class TestEmailAsianCodecs(TestEmailBase):
|
||||
def test_japanese_codecs(self):
|
||||
eq = self.ndiffAssertEqual
|
||||
j = Charset("euc-jp")
|
||||
g = Charset("iso-8859-1")
|
||||
h = Header("Hello World!")
|
||||
jhello = '\xa5\xcf\xa5\xed\xa1\xbc\xa5\xef\xa1\xbc\xa5\xeb\xa5\xc9\xa1\xaa'
|
||||
ghello = 'Gr\xfc\xdf Gott!'
|
||||
h.append(jhello, j)
|
||||
h.append(ghello, g)
|
||||
# BAW: This used to -- and maybe should -- fold the two iso-8859-1
|
||||
# chunks into a single encoded word. However it doesn't violate the
|
||||
# standard to have them as two encoded chunks and maybe it's
|
||||
# reasonable <wink> for each .append() call to result in a separate
|
||||
# encoded word.
|
||||
eq(h.encode(), """\
|
||||
Hello World! =?iso-2022-jp?b?GyRCJU8lbSE8JW8hPCVrJUkhKhsoQg==?=
|
||||
=?iso-8859-1?q?Gr=FC=DF?= =?iso-8859-1?q?_Gott!?=""")
|
||||
eq(decode_header(h.encode()),
|
||||
[('Hello World!', None),
|
||||
('\x1b$B%O%m!<%o!<%k%I!*\x1b(B', 'iso-2022-jp'),
|
||||
('Gr\xfc\xdf Gott!', 'iso-8859-1')])
|
||||
long = 'test-ja \xa4\xd8\xc5\xea\xb9\xc6\xa4\xb5\xa4\xec\xa4\xbf\xa5\xe1\xa1\xbc\xa5\xeb\xa4\xcf\xbb\xca\xb2\xf1\xbc\xd4\xa4\xce\xbe\xb5\xc7\xa7\xa4\xf2\xc2\xd4\xa4\xc3\xa4\xc6\xa4\xa4\xa4\xde\xa4\xb9'
|
||||
h = Header(long, j, header_name="Subject")
|
||||
# test a very long header
|
||||
enc = h.encode()
|
||||
# TK: splitting point may differ by codec design and/or Header encoding
|
||||
eq(enc , """\
|
||||
=?iso-2022-jp?b?dGVzdC1qYSAbJEIkWEVqOUYkNSRsJD8lYSE8JWskTztKGyhC?=
|
||||
=?iso-2022-jp?b?GyRCMnE8VCROPjVHJyRyQlQkQyRGJCQkXiQ5GyhC?=""")
|
||||
# TK: full decode comparison
|
||||
eq(h.__unicode__().encode('euc-jp'), long)
|
||||
|
||||
def test_payload_encoding(self):
|
||||
jhello = '\xa5\xcf\xa5\xed\xa1\xbc\xa5\xef\xa1\xbc\xa5\xeb\xa5\xc9\xa1\xaa'
|
||||
jcode = 'euc-jp'
|
||||
msg = Message()
|
||||
msg.set_payload(jhello, jcode)
|
||||
ustr = unicode(msg.get_payload(), msg.get_content_charset())
|
||||
self.assertEqual(jhello, ustr.encode(jcode))
|
||||
|
||||
|
||||
|
||||
def suite():
|
||||
suite = unittest.TestSuite()
|
||||
suite.addTest(unittest.makeSuite(TestEmailAsianCodecs))
|
||||
return suite
|
||||
|
||||
|
||||
def test_main():
|
||||
run_unittest(TestEmailAsianCodecs)
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main(defaultTest='suite')
|
File diff suppressed because it is too large
Load Diff
@ -1,136 +0,0 @@
|
||||
# Copyright (C) 2002-2004 Python Software Foundation
|
||||
#
|
||||
# A torture test of the email package. This should not be run as part of the
|
||||
# standard Python test suite since it requires several meg of email messages
|
||||
# collected in the wild. These source messages are not checked into the
|
||||
# Python distro, but are available as part of the standalone email package at
|
||||
# http://sf.net/projects/mimelib
|
||||
|
||||
import sys
|
||||
import os
|
||||
import unittest
|
||||
from cStringIO import StringIO
|
||||
from types import ListType
|
||||
|
||||
from email.test.test_email import TestEmailBase
|
||||
from test.test_support import TestSkipped
|
||||
|
||||
import email
|
||||
from email import __file__ as testfile
|
||||
from email.Iterators import _structure
|
||||
|
||||
def openfile(filename):
|
||||
from os.path import join, dirname, abspath
|
||||
path = abspath(join(dirname(testfile), os.pardir, 'moredata', filename))
|
||||
return open(path, 'r')
|
||||
|
||||
# Prevent this test from running in the Python distro
|
||||
try:
|
||||
openfile('crispin-torture.txt')
|
||||
except IOError:
|
||||
raise TestSkipped
|
||||
|
||||
|
||||
|
||||
class TortureBase(TestEmailBase):
|
||||
def _msgobj(self, filename):
|
||||
fp = openfile(filename)
|
||||
try:
|
||||
msg = email.message_from_file(fp)
|
||||
finally:
|
||||
fp.close()
|
||||
return msg
|
||||
|
||||
|
||||
|
||||
class TestCrispinTorture(TortureBase):
|
||||
# Mark Crispin's torture test from the SquirrelMail project
|
||||
def test_mondo_message(self):
|
||||
eq = self.assertEqual
|
||||
neq = self.ndiffAssertEqual
|
||||
msg = self._msgobj('crispin-torture.txt')
|
||||
payload = msg.get_payload()
|
||||
eq(type(payload), ListType)
|
||||
eq(len(payload), 12)
|
||||
eq(msg.preamble, None)
|
||||
eq(msg.epilogue, '\n')
|
||||
# Probably the best way to verify the message is parsed correctly is to
|
||||
# dump its structure and compare it against the known structure.
|
||||
fp = StringIO()
|
||||
_structure(msg, fp=fp)
|
||||
neq(fp.getvalue(), """\
|
||||
multipart/mixed
|
||||
text/plain
|
||||
message/rfc822
|
||||
multipart/alternative
|
||||
text/plain
|
||||
multipart/mixed
|
||||
text/richtext
|
||||
application/andrew-inset
|
||||
message/rfc822
|
||||
audio/basic
|
||||
audio/basic
|
||||
image/pbm
|
||||
message/rfc822
|
||||
multipart/mixed
|
||||
multipart/mixed
|
||||
text/plain
|
||||
audio/x-sun
|
||||
multipart/mixed
|
||||
image/gif
|
||||
image/gif
|
||||
application/x-be2
|
||||
application/atomicmail
|
||||
audio/x-sun
|
||||
message/rfc822
|
||||
multipart/mixed
|
||||
text/plain
|
||||
image/pgm
|
||||
text/plain
|
||||
message/rfc822
|
||||
multipart/mixed
|
||||
text/plain
|
||||
image/pbm
|
||||
message/rfc822
|
||||
application/postscript
|
||||
image/gif
|
||||
message/rfc822
|
||||
multipart/mixed
|
||||
audio/basic
|
||||
audio/basic
|
||||
message/rfc822
|
||||
multipart/mixed
|
||||
application/postscript
|
||||
text/plain
|
||||
message/rfc822
|
||||
multipart/mixed
|
||||
text/plain
|
||||
multipart/parallel
|
||||
image/gif
|
||||
audio/basic
|
||||
application/atomicmail
|
||||
message/rfc822
|
||||
audio/x-sun
|
||||
""")
|
||||
|
||||
|
||||
def _testclasses():
|
||||
mod = sys.modules[__name__]
|
||||
return [getattr(mod, name) for name in dir(mod) if name.startswith('Test')]
|
||||
|
||||
|
||||
def suite():
|
||||
suite = unittest.TestSuite()
|
||||
for testclass in _testclasses():
|
||||
suite.addTest(unittest.makeSuite(testclass))
|
||||
return suite
|
||||
|
||||
|
||||
def test_main():
|
||||
for testclass in _testclasses():
|
||||
test_support.run_unittest(testclass)
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main(defaultTest='suite')
|
@ -1,22 +0,0 @@
|
||||
###
|
||||
#
|
||||
# Copyright Alan Kennedy.
|
||||
#
|
||||
# You may contact the copyright holder at this uri:
|
||||
#
|
||||
# http://www.xhaus.com/contact/modjy
|
||||
#
|
||||
# The licence under which this code is released is the Apache License v2.0.
|
||||
#
|
||||
# The terms and conditions of this license are listed in a file contained
|
||||
# in the distribution that also contained this file, under the name
|
||||
# LICENSE.txt.
|
||||
#
|
||||
# You may also read a copy of the license at the following web address.
|
||||
#
|
||||
# http://modjy.xhaus.com/LICENSE.txt
|
||||
#
|
||||
###
|
||||
|
||||
__all__ = ['modjy', 'modjy_exceptions', 'modjy_impl', 'modjy_log', 'modjy_params', 'modjy_publish', 'modjy_response', 'modjy_write', 'modjy_wsgi',]
|
||||
|
@ -1,121 +0,0 @@
|
||||
###
|
||||
#
|
||||
# Copyright Alan Kennedy.
|
||||
#
|
||||
# You may contact the copyright holder at this uri:
|
||||
#
|
||||
# http://www.xhaus.com/contact/modjy
|
||||
#
|
||||
# The licence under which this code is released is the Apache License v2.0.
|
||||
#
|
||||
# The terms and conditions of this license are listed in a file contained
|
||||
# in the distribution that also contained this file, under the name
|
||||
# LICENSE.txt.
|
||||
#
|
||||
# You may also read a copy of the license at the following web address.
|
||||
#
|
||||
# http://modjy.xhaus.com/LICENSE.txt
|
||||
#
|
||||
###
|
||||
|
||||
import jarray
|
||||
import synchronize
|
||||
import sys
|
||||
import types
|
||||
|
||||
sys.add_package("javax.servlet")
|
||||
sys.add_package("javax.servlet.http")
|
||||
sys.add_package("org.python.core")
|
||||
|
||||
from modjy_exceptions import *
|
||||
from modjy_log import *
|
||||
from modjy_params import modjy_param_mgr, modjy_servlet_params
|
||||
from modjy_wsgi import modjy_wsgi
|
||||
from modjy_response import start_response_object
|
||||
from modjy_impl import modjy_impl
|
||||
from modjy_publish import modjy_publisher
|
||||
|
||||
from javax.servlet.http import HttpServlet
|
||||
|
||||
class modjy_servlet(HttpServlet, modjy_publisher, modjy_wsgi, modjy_impl):
|
||||
|
||||
def __init__(self):
|
||||
HttpServlet.__init__(self)
|
||||
|
||||
def do_param(self, name, value):
|
||||
if name[:3] == 'log':
|
||||
getattr(self.log, "set_%s" % name)(value)
|
||||
else:
|
||||
self.params[name] = value
|
||||
|
||||
def process_param_container(self, param_container):
|
||||
param_enum = param_container.getInitParameterNames()
|
||||
while param_enum.hasMoreElements():
|
||||
param_name = param_enum.nextElement()
|
||||
self.do_param(param_name, param_container.getInitParameter(param_name))
|
||||
|
||||
def get_params(self):
|
||||
self.process_param_container(self.servlet_context)
|
||||
self.process_param_container(self.servlet)
|
||||
|
||||
def init(self, delegator):
|
||||
self.servlet = delegator
|
||||
self.servlet_context = self.servlet.getServletContext()
|
||||
self.servlet_config = self.servlet.getServletConfig()
|
||||
self.log = modjy_logger(self.servlet_context)
|
||||
self.params = modjy_param_mgr(modjy_servlet_params)
|
||||
self.get_params()
|
||||
self.init_impl()
|
||||
self.init_publisher()
|
||||
import modjy_exceptions
|
||||
self.exc_handler = getattr(modjy_exceptions, '%s_handler' % self.params['exc_handler'])()
|
||||
|
||||
def service (self, req, resp):
|
||||
wsgi_environ = {}
|
||||
try:
|
||||
self.dispatch_to_application(req, resp, wsgi_environ)
|
||||
except ModjyException, mx:
|
||||
self.log.error("Exception servicing request: %s" % str(mx))
|
||||
typ, value, tb = sys.exc_info()[:]
|
||||
self.exc_handler.handle(req, resp, wsgi_environ, mx, (typ, value, tb) )
|
||||
|
||||
def get_j2ee_ns(self, req, resp):
|
||||
return {
|
||||
'servlet': self.servlet,
|
||||
'servlet_context': self.servlet_context,
|
||||
'servlet_config': self.servlet_config,
|
||||
'request': req,
|
||||
'response': resp,
|
||||
}
|
||||
|
||||
def dispatch_to_application(self, req, resp, environ):
|
||||
app_callable = self.get_app_object(req, environ)
|
||||
self.set_wsgi_environment(req, resp, environ, self.params, self.get_j2ee_ns(req, resp))
|
||||
response_callable = start_response_object(req, resp)
|
||||
try:
|
||||
app_return = self.call_application(app_callable, environ, response_callable)
|
||||
if app_return is None:
|
||||
raise ReturnNotIterable("Application returned None: must return an iterable")
|
||||
self.deal_with_app_return(environ, response_callable, app_return)
|
||||
except ModjyException, mx:
|
||||
self.raise_exc(mx.__class__, str(mx))
|
||||
except Exception, x:
|
||||
self.raise_exc(ApplicationException, str(x))
|
||||
|
||||
def call_application(self, app_callable, environ, response_callable):
|
||||
if self.params['multithread']:
|
||||
return app_callable.__call__(environ, response_callable)
|
||||
else:
|
||||
return synchronize.apply_synchronized( \
|
||||
app_callable, \
|
||||
app_callable, \
|
||||
(environ, response_callable))
|
||||
|
||||
def expand_relative_path(self, path):
|
||||
if path.startswith("$"):
|
||||
return self.servlet.getServletContext().getRealPath(path[1:])
|
||||
return path
|
||||
|
||||
def raise_exc(self, exc_class, message):
|
||||
self.log.error(message)
|
||||
raise exc_class(message)
|
@ -1,91 +0,0 @@
|
||||
###
|
||||
#
|
||||
# Copyright Alan Kennedy.
|
||||
#
|
||||
# You may contact the copyright holder at this uri:
|
||||
#
|
||||
# http://www.xhaus.com/contact/modjy
|
||||
#
|
||||
# The licence under which this code is released is the Apache License v2.0.
|
||||
#
|
||||
# The terms and conditions of this license are listed in a file contained
|
||||
# in the distribution that also contained this file, under the name
|
||||
# LICENSE.txt.
|
||||
#
|
||||
# You may also read a copy of the license at the following web address.
|
||||
#
|
||||
# http://modjy.xhaus.com/LICENSE.txt
|
||||
#
|
||||
###
|
||||
|
||||
import sys
|
||||
import StringIO
|
||||
import traceback
|
||||
|
||||
from java.lang import IllegalStateException
|
||||
from java.io import IOException
|
||||
from javax.servlet import ServletException
|
||||
|
||||
class ModjyException(Exception): pass
|
||||
|
||||
class ModjyIOException(ModjyException): pass
|
||||
|
||||
class ConfigException(ModjyException): pass
|
||||
class BadParameter(ConfigException): pass
|
||||
class ApplicationNotFound(ConfigException): pass
|
||||
class NoCallable(ConfigException): pass
|
||||
|
||||
class RequestException(ModjyException): pass
|
||||
|
||||
class ApplicationException(ModjyException): pass
|
||||
class StartResponseNotCalled(ApplicationException): pass
|
||||
class StartResponseCalledTwice(ApplicationException): pass
|
||||
class ResponseCommitted(ApplicationException): pass
|
||||
class HopByHopHeaderSet(ApplicationException): pass
|
||||
class WrongLength(ApplicationException): pass
|
||||
class BadArgument(ApplicationException): pass
|
||||
class ReturnNotIterable(ApplicationException): pass
|
||||
class NonStringOutput(ApplicationException): pass
|
||||
|
||||
class exception_handler:
|
||||
|
||||
def handle(self, req, resp, environ, exc, exc_info):
|
||||
pass
|
||||
|
||||
def get_status_and_message(self, req, resp, exc):
|
||||
return resp.SC_INTERNAL_SERVER_ERROR, "Server configuration error"
|
||||
|
||||
#
|
||||
# Special exception handler for testing
|
||||
#
|
||||
|
||||
class testing_handler(exception_handler):
|
||||
|
||||
def handle(self, req, resp, environ, exc, exc_info):
|
||||
typ, value, tb = exc_info
|
||||
err_msg = StringIO.StringIO()
|
||||
err_msg.write("%s: %s\n" % (typ, value,) )
|
||||
err_msg.write(">Environment\n")
|
||||
for k in environ.keys():
|
||||
err_msg.write("%s=%s\n" % (k, repr(environ[k])) )
|
||||
err_msg.write("<Environment\n")
|
||||
err_msg.write(">TraceBack\n")
|
||||
for line in traceback.format_exception(typ, value, tb):
|
||||
err_msg.write(line)
|
||||
err_msg.write("<TraceBack\n")
|
||||
try:
|
||||
status, message = self.get_status_and_message(req, resp, exc)
|
||||
resp.setStatus(status)
|
||||
resp.setContentLength(len(err_msg.getvalue()))
|
||||
resp.getOutputStream().write(err_msg.getvalue())
|
||||
except IllegalStateException, ise:
|
||||
raise exc # Let the container deal with it
|
||||
|
||||
#
|
||||
# Standard exception handler
|
||||
#
|
||||
|
||||
class standard_handler(exception_handler):
|
||||
|
||||
def handle(self, req, resp, environ, exc, exc_info):
|
||||
raise exc_info[0], exc_info[1], exc_info[2]
|
@ -1,101 +0,0 @@
|
||||
###
|
||||
#
|
||||
# Copyright Alan Kennedy.
|
||||
#
|
||||
# You may contact the copyright holder at this uri:
|
||||
#
|
||||
# http://www.xhaus.com/contact/modjy
|
||||
#
|
||||
# The licence under which this code is released is the Apache License v2.0.
|
||||
#
|
||||
# The terms and conditions of this license are listed in a file contained
|
||||
# in the distribution that also contained this file, under the name
|
||||
# LICENSE.txt.
|
||||
#
|
||||
# You may also read a copy of the license at the following web address.
|
||||
#
|
||||
# http://modjy.xhaus.com/LICENSE.txt
|
||||
#
|
||||
###
|
||||
|
||||
import types
|
||||
import sys
|
||||
|
||||
from modjy_exceptions import *
|
||||
|
||||
class modjy_impl:
|
||||
|
||||
def deal_with_app_return(self, environ, start_response_callable, app_return):
|
||||
self.log.debug("Processing app return type: %s" % str(type(app_return)))
|
||||
if isinstance(app_return, types.StringTypes):
|
||||
raise ReturnNotIterable("Application returned object that was not an iterable: %s" % str(type(app_return)))
|
||||
if type(app_return) is types.FileType:
|
||||
pass # TBD: What to do here? can't call fileno()
|
||||
if hasattr(app_return, '__len__') and callable(app_return.__len__):
|
||||
expected_pieces = app_return.__len__()
|
||||
else:
|
||||
expected_pieces = -1
|
||||
try:
|
||||
try:
|
||||
ix = 0
|
||||
for next_piece in app_return:
|
||||
if not isinstance(next_piece, types.StringTypes):
|
||||
raise NonStringOutput("Application returned iterable containing non-strings: %s" % str(type(next_piece)))
|
||||
if ix == 0:
|
||||
# The application may have called start_response in the first iteration
|
||||
if not start_response_callable.called:
|
||||
raise StartResponseNotCalled("Start_response callable was never called.")
|
||||
if not start_response_callable.content_length \
|
||||
and expected_pieces == 1 \
|
||||
and start_response_callable.write_callable.num_writes == 0:
|
||||
# Take the length of the first piece
|
||||
start_response_callable.set_content_length(len(next_piece))
|
||||
start_response_callable.write_callable(next_piece)
|
||||
ix += 1
|
||||
if ix == expected_pieces:
|
||||
break
|
||||
if expected_pieces != -1 and ix != expected_pieces:
|
||||
raise WrongLength("Iterator len() was wrong. Expected %d pieces: got %d" % (expected_pieces, ix) )
|
||||
except AttributeError, ax:
|
||||
if str(ax) == "__getitem__":
|
||||
raise ReturnNotIterable("Application returned object that was not an iterable: %s" % str(type(app_return)))
|
||||
else:
|
||||
raise ax
|
||||
except TypeError, tx:
|
||||
raise ReturnNotIterable("Application returned object that was not an iterable: %s" % str(type(app_return)))
|
||||
except ModjyException, mx:
|
||||
raise mx
|
||||
except Exception, x:
|
||||
raise ApplicationException(x)
|
||||
finally:
|
||||
if hasattr(app_return, 'close') and callable(app_return.close):
|
||||
app_return.close()
|
||||
|
||||
def init_impl(self):
|
||||
self.do_j_env_params()
|
||||
|
||||
def add_packages(self, package_list):
|
||||
packages = [p.strip() for p in package_list.split(';')]
|
||||
for p in packages:
|
||||
self.log.info("Adding java package %s to jython" % p)
|
||||
sys.add_package(p)
|
||||
|
||||
def add_classdirs(self, classdir_list):
|
||||
classdirs = [cd.strip() for cd in classdir_list.split(';')]
|
||||
for cd in classdirs:
|
||||
self.log.info("Adding directory %s to jython class file search path" % cd)
|
||||
sys.add_classdir(cd)
|
||||
|
||||
def add_extdirs(self, extdir_list):
|
||||
extdirs = [ed.strip() for ed in extdir_list.split(';')]
|
||||
for ed in extdirs:
|
||||
self.log.info("Adding directory %s for .jars and .zips search path" % ed)
|
||||
sys.add_extdir(self.expand_relative_path(ed))
|
||||
|
||||
def do_j_env_params(self):
|
||||
if self.params['packages']:
|
||||
self.add_packages(self.params['packages'])
|
||||
if self.params['classdirs']:
|
||||
self.add_classdirs(self.params['classdirs'])
|
||||
if self.params['extdirs']:
|
||||
self.add_extdirs(self.params['extdirs'])
|
@ -1,80 +0,0 @@
|
||||
###
|
||||
#
|
||||
# Copyright Alan Kennedy.
|
||||
#
|
||||
# You may contact the copyright holder at this uri:
|
||||
#
|
||||
# http://www.xhaus.com/contact/modjy
|
||||
#
|
||||
# The licence under which this code is released is the Apache License v2.0.
|
||||
#
|
||||
# The terms and conditions of this license are listed in a file contained
|
||||
# in the distribution that also contained this file, under the name
|
||||
# LICENSE.txt.
|
||||
#
|
||||
# You may also read a copy of the license at the following web address.
|
||||
#
|
||||
# http://modjy.xhaus.com/LICENSE.txt
|
||||
#
|
||||
###
|
||||
|
||||
import java
|
||||
|
||||
import sys
|
||||
|
||||
DEBUG = 'debug'
|
||||
INFO = 'info'
|
||||
WARN = 'warn'
|
||||
ERROR = 'error'
|
||||
FATAL = 'fatal'
|
||||
|
||||
levels_dict = {}
|
||||
ix = 0
|
||||
for level in [DEBUG, INFO, WARN, ERROR, FATAL, ]:
|
||||
levels_dict[level]=ix
|
||||
ix += 1
|
||||
|
||||
class modjy_logger:
|
||||
|
||||
def __init__(self, context):
|
||||
self.log_ctx = context
|
||||
self.format_str = "%(lvl)s:\t%(msg)s"
|
||||
self.log_level = levels_dict[DEBUG]
|
||||
|
||||
def _log(self, level, level_str, msg, exc):
|
||||
if level >= self.log_level:
|
||||
msg = self.format_str % {'lvl': level_str, 'msg': msg, }
|
||||
if exc:
|
||||
# java.lang.System.err.println(msg, exc)
|
||||
self.log_ctx.log(msg, exc)
|
||||
else:
|
||||
# java.lang.System.err.println(msg)
|
||||
self.log_ctx.log(msg)
|
||||
|
||||
def debug(self, msg, exc=None):
|
||||
self._log(0, DEBUG, msg, exc)
|
||||
|
||||
def info(self, msg, exc=None):
|
||||
self._log(1, INFO, msg, exc)
|
||||
|
||||
def warn(self, msg, exc=None):
|
||||
self._log(2, WARN, msg, exc)
|
||||
|
||||
def error(self, msg, exc=None):
|
||||
self._log(3, ERROR, msg, exc)
|
||||
|
||||
def fatal(self, msg, exc=None):
|
||||
self._log(4, FATAL, msg, exc)
|
||||
|
||||
def set_log_level(self, level_string):
|
||||
try:
|
||||
self.log_level = levels_dict[level_string]
|
||||
except KeyError:
|
||||
raise BadParameter("Invalid log level: '%s'" % level_string)
|
||||
|
||||
def set_log_format(self, format_string):
|
||||
# BUG! Format string never actually used in this function.
|
||||
try:
|
||||
self._log(debug, "This is a log formatting test", None)
|
||||
except KeyError:
|
||||
raise BadParameter("Bad format string: '%s'" % format_string)
|
@ -1,84 +0,0 @@
|
||||
###
|
||||
#
|
||||
# Copyright Alan Kennedy.
|
||||
#
|
||||
# You may contact the copyright holder at this uri:
|
||||
#
|
||||
# http://www.xhaus.com/contact/modjy
|
||||
#
|
||||
# The licence under which this code is released is the Apache License v2.0.
|
||||
#
|
||||
# The terms and conditions of this license are listed in a file contained
|
||||
# in the distribution that also contained this file, under the name
|
||||
# LICENSE.txt.
|
||||
#
|
||||
# You may also read a copy of the license at the following web address.
|
||||
#
|
||||
# http://modjy.xhaus.com/LICENSE.txt
|
||||
#
|
||||
###
|
||||
|
||||
from UserDict import UserDict
|
||||
|
||||
BOOLEAN = ('boolean', int)
|
||||
INTEGER = ('integer', int)
|
||||
FLOAT = ('float', float)
|
||||
STRING = ('string', None)
|
||||
|
||||
modjy_servlet_params = {
|
||||
|
||||
'multithread': (BOOLEAN, 1),
|
||||
'cache_callables': (BOOLEAN, 1),
|
||||
'reload_on_mod': (BOOLEAN, 0),
|
||||
|
||||
'app_import_name': (STRING, None),
|
||||
|
||||
'app_directory': (STRING, None),
|
||||
'app_filename': (STRING, 'application.py'),
|
||||
'app_callable_name': (STRING, 'handler'),
|
||||
'callable_query_name': (STRING, None),
|
||||
|
||||
'exc_handler': (STRING, 'standard'),
|
||||
|
||||
'log_level': (STRING, 'info'),
|
||||
|
||||
'packages': (STRING, None),
|
||||
'classdirs': (STRING, None),
|
||||
'extdirs': (STRING, None),
|
||||
|
||||
'initial_env': (STRING, None),
|
||||
}
|
||||
|
||||
class modjy_param_mgr(UserDict):
|
||||
|
||||
def __init__(self, param_types):
|
||||
UserDict.__init__(self)
|
||||
self.param_types = param_types
|
||||
for pname in self.param_types.keys():
|
||||
typ, default = self.param_types[pname]
|
||||
self.__setitem__(pname, default)
|
||||
|
||||
def __getitem__(self, name):
|
||||
return self._get_defaulted_value(name)
|
||||
|
||||
def __setitem__(self, name, value):
|
||||
self.data[name] = self._convert_value(name, value)
|
||||
|
||||
def _convert_value(self, name, value):
|
||||
if self.param_types.has_key(name):
|
||||
typ, default = self.param_types[name]
|
||||
typ_str, typ_func = typ
|
||||
if typ_func:
|
||||
try:
|
||||
return typ_func(value)
|
||||
except ValueError:
|
||||
raise BadParameter("Illegal value for %s parameter '%s': %s" % (typ_str, name, value) )
|
||||
return value
|
||||
|
||||
def _get_defaulted_value(self, name):
|
||||
if self.data.has_key(name):
|
||||
return self.data[name]
|
||||
if self.param_types.has_key(name):
|
||||
typ, default = self.param_types[name]
|
||||
return default
|
||||
raise KeyError(name)
|
@ -1,138 +0,0 @@
|
||||
###
|
||||
#
|
||||
# Copyright Alan Kennedy.
|
||||
#
|
||||
# You may contact the copyright holder at this uri:
|
||||
#
|
||||
# http://www.xhaus.com/contact/modjy
|
||||
#
|
||||
# The licence under which this code is released is the Apache License v2.0.
|
||||
#
|
||||
# The terms and conditions of this license are listed in a file contained
|
||||
# in the distribution that also contained this file, under the name
|
||||
# LICENSE.txt.
|
||||
#
|
||||
# You may also read a copy of the license at the following web address.
|
||||
#
|
||||
# http://modjy.xhaus.com/LICENSE.txt
|
||||
#
|
||||
###
|
||||
|
||||
import sys
|
||||
import synchronize
|
||||
|
||||
from java.io import File
|
||||
|
||||
from modjy_exceptions import *
|
||||
|
||||
class modjy_publisher:
|
||||
|
||||
def init_publisher(self):
|
||||
self.cache = None
|
||||
if self.params['app_directory']:
|
||||
self.app_directory = self.expand_relative_path(self.params['app_directory'])
|
||||
else:
|
||||
self.app_directory = self.servlet_context.getRealPath('/')
|
||||
self.params['app_directory'] = self.app_directory
|
||||
if not self.app_directory in sys.path:
|
||||
sys.path.append(self.app_directory)
|
||||
|
||||
def map_uri(self, req, environ):
|
||||
source_uri = '%s%s%s' % (self.app_directory, File.separator, self.params['app_filename'])
|
||||
callable_name = self.params['app_callable_name']
|
||||
if self.params['callable_query_name']:
|
||||
query_string = req.getQueryString()
|
||||
if query_string and '=' in query_string:
|
||||
for name_val in query_string.split('&'):
|
||||
name, value = name_val.split('=')
|
||||
if name == self.params['callable_query_name']:
|
||||
callable_name = value
|
||||
return source_uri, callable_name
|
||||
|
||||
def get_app_object(self, req, environ):
|
||||
environ["SCRIPT_NAME"] = "%s%s" % (req.getContextPath(), req.getServletPath())
|
||||
path_info = req.getPathInfo() or ""
|
||||
environ["PATH_INFO"] = path_info
|
||||
environ["PATH_TRANSLATED"] = File(self.app_directory, path_info).getPath()
|
||||
|
||||
if self.params['app_import_name'] is not None:
|
||||
return self.get_app_object_importable(self.params['app_import_name'])
|
||||
else:
|
||||
if self.cache is None:
|
||||
self.cache = {}
|
||||
return self.get_app_object_old_style(req, environ)
|
||||
|
||||
get_app_object = synchronize.make_synchronized(get_app_object)
|
||||
|
||||
def get_app_object_importable(self, importable_name):
|
||||
self.log.debug("Attempting to import application callable '%s'\n" % (importable_name, ))
|
||||
# Under the importable mechanism, the cache contains a single object
|
||||
if self.cache is None:
|
||||
application, instantiable, method_name = self.load_importable(importable_name.strip())
|
||||
if instantiable and self.params['cache_callables']:
|
||||
application = application()
|
||||
self.cache = application, instantiable, method_name
|
||||
application, instantiable, method_name = self.cache
|
||||
self.log.debug("Application is " + str(application))
|
||||
if instantiable and not self.params['cache_callables']:
|
||||
application = application()
|
||||
self.log.debug("Instantiated application is " + str(application))
|
||||
if method_name is not None:
|
||||
if not hasattr(application, method_name):
|
||||
self.log.fatal("Attribute error application callable '%s' as no method '%s'" % (application, method_name))
|
||||
self.raise_exc(ApplicationNotFound, "Attribute error application callable '%s' as no method '%s'" % (application, method_name))
|
||||
application = getattr(application, method_name)
|
||||
self.log.debug("Application method is " + str(application))
|
||||
return application
|
||||
|
||||
def load_importable(self, name):
|
||||
try:
|
||||
instantiable = False ; method_name = None
|
||||
importable_name = name
|
||||
if name.find('()') != -1:
|
||||
instantiable = True
|
||||
importable_name, method_name = name.split('()')
|
||||
if method_name.startswith('.'):
|
||||
method_name = method_name[1:]
|
||||
if not method_name:
|
||||
method_name = None
|
||||
module_path, from_name = importable_name.rsplit('.', 1)
|
||||
imported = __import__(module_path, globals(), locals(), [from_name])
|
||||
imported = getattr(imported, from_name)
|
||||
return imported, instantiable, method_name
|
||||
except (ImportError, AttributeError), aix:
|
||||
self.log.fatal("Import error import application callable '%s': %s\n" % (name, str(aix)))
|
||||
self.raise_exc(ApplicationNotFound, "Failed to import app callable '%s': %s" % (name, str(aix)))
|
||||
|
||||
def get_app_object_old_style(self, req, environ):
|
||||
source_uri, callable_name = self.map_uri(req, environ)
|
||||
source_filename = source_uri
|
||||
if not self.params['cache_callables']:
|
||||
self.log.debug("Caching of callables disabled")
|
||||
return self.load_object(source_filename, callable_name)
|
||||
if not self.cache.has_key( (source_filename, callable_name) ):
|
||||
self.log.debug("Callable object not in cache: %s#%s" % (source_filename, callable_name) )
|
||||
return self.load_object(source_filename, callable_name)
|
||||
app_callable, last_mod = self.cache.get( (source_filename, callable_name) )
|
||||
self.log.debug("Callable object was in cache: %s#%s" % (source_filename, callable_name) )
|
||||
if self.params['reload_on_mod']:
|
||||
f = File(source_filename)
|
||||
if f.lastModified() > last_mod:
|
||||
self.log.info("Source file '%s' has been modified: reloading" % source_filename)
|
||||
return self.load_object(source_filename, callable_name)
|
||||
return app_callable
|
||||
|
||||
def load_object(self, path, callable_name):
|
||||
try:
|
||||
app_ns = {} ; execfile(path, app_ns)
|
||||
app_callable = app_ns[callable_name]
|
||||
f = File(path)
|
||||
self.cache[ (path, callable_name) ] = (app_callable, f.lastModified())
|
||||
return app_callable
|
||||
except IOError, ioe:
|
||||
self.raise_exc(ApplicationNotFound, "Application filename not found: %s" % path)
|
||||
except KeyError, k:
|
||||
self.raise_exc(NoCallable, "No callable named '%s' in %s" % (callable_name, path))
|
||||
except Exception, x:
|
||||
self.raise_exc(NoCallable, "Error loading jython callable '%s': %s" % (callable_name, str(x)) )
|
||||
|
@ -1,113 +0,0 @@
|
||||
###
|
||||
#
|
||||
# Copyright Alan Kennedy.
|
||||
#
|
||||
# You may contact the copyright holder at this uri:
|
||||
#
|
||||
# http://www.xhaus.com/contact/modjy
|
||||
#
|
||||
# The licence under which this code is released is the Apache License v2.0.
|
||||
#
|
||||
# The terms and conditions of this license are listed in a file contained
|
||||
# in the distribution that also contained this file, under the name
|
||||
# LICENSE.txt.
|
||||
#
|
||||
# You may also read a copy of the license at the following web address.
|
||||
#
|
||||
# http://modjy.xhaus.com/LICENSE.txt
|
||||
#
|
||||
###
|
||||
|
||||
import types
|
||||
|
||||
from java.lang import System
|
||||
|
||||
from modjy_exceptions import *
|
||||
from modjy_write import write_object
|
||||
|
||||
# From: http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.5.1
|
||||
|
||||
hop_by_hop_headers = {
|
||||
'connection': None,
|
||||
'keep-alive': None,
|
||||
'proxy-authenticate': None,
|
||||
'proxy-authorization': None,
|
||||
'te': None,
|
||||
'trailers': None,
|
||||
'transfer-encoding': None,
|
||||
'upgrade': None,
|
||||
}
|
||||
|
||||
class start_response_object:
|
||||
|
||||
def __init__(self, req, resp):
|
||||
self.http_req = req
|
||||
self.http_resp = resp
|
||||
self.write_callable = None
|
||||
self.called = 0
|
||||
self.content_length = None
|
||||
|
||||
# I'm doing the parameters this way to facilitate porting back to java
|
||||
def __call__(self, *args, **keywords):
|
||||
if len(args) < 2 or len(args) > 3:
|
||||
raise BadArgument("Start response callback requires either two or three arguments: got %s" % str(args))
|
||||
if len(args) == 3:
|
||||
exc_info = args[2]
|
||||
try:
|
||||
try:
|
||||
self.http_resp.reset()
|
||||
except IllegalStateException, isx:
|
||||
raise exc_info[0], exc_info[1], exc_info[2]
|
||||
finally:
|
||||
exc_info = None
|
||||
else:
|
||||
if self.called > 0:
|
||||
raise StartResponseCalledTwice("Start response callback may only be called once, without exception information.")
|
||||
status_str = args[0]
|
||||
headers_list = args[1]
|
||||
if not isinstance(status_str, types.StringType):
|
||||
raise BadArgument("Start response callback requires string as first argument")
|
||||
if not isinstance(headers_list, types.ListType):
|
||||
raise BadArgument("Start response callback requires list as second argument")
|
||||
try:
|
||||
status_code, status_message_str = status_str.split(" ", 1)
|
||||
self.http_resp.setStatus(int(status_code))
|
||||
except ValueError:
|
||||
raise BadArgument("Status string must be of the form '<int> <string>'")
|
||||
self.make_write_object()
|
||||
try:
|
||||
for header_name, header_value in headers_list:
|
||||
header_name_lower = header_name.lower()
|
||||
if hop_by_hop_headers.has_key(header_name_lower):
|
||||
raise HopByHopHeaderSet("Under WSGI, it is illegal to set hop-by-hop headers, i.e. '%s'" % header_name)
|
||||
if header_name_lower == "content-length":
|
||||
try:
|
||||
self.set_content_length(int(header_value))
|
||||
except ValueError, v:
|
||||
raise BadArgument("Content-Length header value must be a string containing an integer, not '%s'" % header_value)
|
||||
else:
|
||||
final_value = header_value.encode('latin-1')
|
||||
# Here would be the place to check for control characters, whitespace, etc
|
||||
self.http_resp.addHeader(header_name, final_value)
|
||||
except (AttributeError, TypeError), t:
|
||||
raise BadArgument("Start response callback headers must contain a list of (<string>,<string>) tuples")
|
||||
except UnicodeError, u:
|
||||
raise BadArgument("Encoding error: header values may only contain latin-1 characters, not '%s'" % repr(header_value))
|
||||
except ValueError, v:
|
||||
raise BadArgument("Headers list must contain 2-tuples")
|
||||
self.called += 1
|
||||
return self.write_callable
|
||||
|
||||
def set_content_length(self, length):
|
||||
if self.write_callable.num_writes == 0:
|
||||
self.content_length = length
|
||||
self.http_resp.setContentLength(length)
|
||||
else:
|
||||
raise ResponseCommitted("Cannot set content-length: response is already commited.")
|
||||
|
||||
def make_write_object(self):
|
||||
try:
|
||||
self.write_callable = write_object(self.http_resp.getOutputStream())
|
||||
except IOException, iox:
|
||||
raise IOError(iox)
|
||||
return self.write_callable
|
@ -1,43 +0,0 @@
|
||||
###
|
||||
#
|
||||
# Copyright Alan Kennedy.
|
||||
#
|
||||
# You may contact the copyright holder at this uri:
|
||||
#
|
||||
# http://www.xhaus.com/contact/modjy
|
||||
#
|
||||
# The licence under which this code is released is the Apache License v2.0.
|
||||
#
|
||||
# The terms and conditions of this license are listed in a file contained
|
||||
# in the distribution that also contained this file, under the name
|
||||
# LICENSE.txt.
|
||||
#
|
||||
# You may also read a copy of the license at the following web address.
|
||||
#
|
||||
# http://modjy.xhaus.com/LICENSE.txt
|
||||
#
|
||||
###
|
||||
|
||||
import types
|
||||
|
||||
from modjy_exceptions import *
|
||||
|
||||
class write_object:
|
||||
|
||||
def __init__(self, ostream):
|
||||
self.ostream = ostream
|
||||
self.num_writes = 0
|
||||
|
||||
def __call__(self, *args, **keywords):
|
||||
if len(args) != 1 or not isinstance(args[0], types.StringTypes):
|
||||
raise NonStringOutput("Invocation of write callable requires exactly one string argument")
|
||||
try:
|
||||
self.ostream.write(args[0]) # Jython implicitly converts the (binary) string to a byte array
|
||||
# WSGI requires that all output be flushed before returning to the application
|
||||
# According to the java docs: " The flush method of OutputStream does nothing."
|
||||
# Still, leave it in place for now: it's in the right place should this
|
||||
# code ever be ported to another platform.
|
||||
self.ostream.flush()
|
||||
self.num_writes += 1
|
||||
except Exception, x:
|
||||
raise ModjyIOException(x)
|
@ -1,156 +0,0 @@
|
||||
###
|
||||
#
|
||||
# Copyright Alan Kennedy.
|
||||
#
|
||||
# You may contact the copyright holder at this uri:
|
||||
#
|
||||
# http://www.xhaus.com/contact/modjy
|
||||
#
|
||||
# The licence under which this code is released is the Apache License v2.0.
|
||||
#
|
||||
# The terms and conditions of this license are listed in a file contained
|
||||
# in the distribution that also contained this file, under the name
|
||||
# LICENSE.txt.
|
||||
#
|
||||
# You may also read a copy of the license at the following web address.
|
||||
#
|
||||
# http://modjy.xhaus.com/LICENSE.txt
|
||||
#
|
||||
###
|
||||
|
||||
from java.lang import System
|
||||
|
||||
try:
|
||||
from org.python.core.util import FileUtil
|
||||
create_py_file = FileUtil.wrap
|
||||
except ImportError:
|
||||
from org.python.core import PyFile
|
||||
create_py_file = PyFile
|
||||
|
||||
from modjy_exceptions import *
|
||||
|
||||
server_name = "modjy"
|
||||
server_param_prefix = "%s.param" % server_name
|
||||
j2ee_ns_prefix = "j2ee"
|
||||
|
||||
cgi_var_char_encoding = "iso-8859-1"
|
||||
|
||||
class modjy_wsgi:
|
||||
|
||||
#
|
||||
# WSGI constants
|
||||
#
|
||||
|
||||
empty_pystring = u""
|
||||
wsgi_version = (1,0)
|
||||
|
||||
#
|
||||
# Container-specific constants
|
||||
#
|
||||
|
||||
modjy_version = (0, 25, 3)
|
||||
|
||||
def set_string_envvar(self, dict, name, value):
|
||||
if value is None:
|
||||
value = self.empty_pystring
|
||||
value = value.encode(cgi_var_char_encoding)
|
||||
dict[name] = value
|
||||
|
||||
def set_string_envvar_optional(self, dict, name, value, default_value):
|
||||
if value != default_value:
|
||||
self.set_string_envvar(dict, name, value)
|
||||
|
||||
def set_int_envvar(self, dict, name, value, default_value):
|
||||
if value == default_value:
|
||||
value = self.empty_pystring
|
||||
else:
|
||||
value = unicode(value)
|
||||
self.set_string_envvar(dict, name, value)
|
||||
|
||||
def set_container_specific_wsgi_vars(self, req, resp, dict, params):
|
||||
dict["%s.version" % server_name] = self.modjy_version
|
||||
for pname in params.keys():
|
||||
dict["%s.%s" % (server_param_prefix, pname)] = params[pname]
|
||||
|
||||
def set_j2ee_specific_wsgi_vars(self, dict, j2ee_ns):
|
||||
for p in j2ee_ns.keys():
|
||||
dict["%s.%s" % (j2ee_ns_prefix, p)] = j2ee_ns[p]
|
||||
|
||||
def set_required_cgi_environ (self, req, resp, dict):
|
||||
self.set_string_envvar(dict, "REQUEST_METHOD", req.getMethod())
|
||||
self.set_string_envvar(dict, "QUERY_STRING", req.getQueryString())
|
||||
self.set_string_envvar(dict, "CONTENT_TYPE", req.getContentType())
|
||||
self.set_int_envvar(dict, "CONTENT_LENGTH", req.getContentLength(), -1)
|
||||
self.set_string_envvar(dict, "SERVER_NAME", req.getLocalName())
|
||||
self.set_int_envvar(dict, "SERVER_PORT", req.getLocalPort(), 0)
|
||||
|
||||
def set_other_cgi_environ (self, req, resp, dict):
|
||||
if req.isSecure():
|
||||
self.set_string_envvar(dict, "HTTPS", 'on')
|
||||
else:
|
||||
self.set_string_envvar(dict, "HTTPS", 'off')
|
||||
self.set_string_envvar(dict, "SERVER_PROTOCOL", req.getProtocol())
|
||||
self.set_string_envvar(dict, "REMOTE_HOST", req.getRemoteHost())
|
||||
self.set_string_envvar(dict, "REMOTE_ADDR", req.getRemoteAddr())
|
||||
self.set_int_envvar(dict, "REMOTE_PORT", req.getRemotePort(), -1)
|
||||
self.set_string_envvar_optional(dict, "AUTH_TYPE", req.getAuthType(), None)
|
||||
self.set_string_envvar_optional(dict, "REMOTE_USER", req.getRemoteUser(), None)
|
||||
|
||||
def set_http_header_environ(self, req, resp, dict):
|
||||
header_name_enum = req.getHeaderNames()
|
||||
while header_name_enum.hasMoreElements():
|
||||
curr_header_name = header_name_enum.nextElement()
|
||||
values = None
|
||||
values_enum = req.getHeaders(curr_header_name)
|
||||
while values_enum.hasMoreElements():
|
||||
next_value = values_enum.nextElement().encode(cgi_var_char_encoding)
|
||||
if values is None:
|
||||
values = next_value
|
||||
else:
|
||||
if isinstance(values, list):
|
||||
values.append(next_value)
|
||||
else:
|
||||
values = [values]
|
||||
dict["HTTP_%s" % str(curr_header_name).replace('-', '_').upper()] = values
|
||||
|
||||
def set_required_wsgi_vars(self, req, resp, dict):
|
||||
dict["wsgi.version"] = self.wsgi_version
|
||||
dict["wsgi.url_scheme"] = req.getScheme()
|
||||
dict["wsgi.multithread"] = \
|
||||
int(dict["%s.cache_callables" % server_param_prefix]) \
|
||||
and \
|
||||
int(dict["%s.multithread" % server_param_prefix])
|
||||
dict["wsgi.multiprocess"] = self.wsgi_multiprocess = 0
|
||||
dict["wsgi.run_once"] = not(dict["%s.cache_callables" % server_param_prefix])
|
||||
|
||||
def set_wsgi_streams(self, req, resp, dict):
|
||||
try:
|
||||
dict["wsgi.input"] = create_py_file(req.getInputStream())
|
||||
dict["wsgi.errors"] = create_py_file(System.err)
|
||||
except IOException, iox:
|
||||
raise ModjyIOException(iox)
|
||||
|
||||
def set_wsgi_classes(self, req, resp, dict):
|
||||
# dict["wsgi.file_wrapper"] = modjy_file_wrapper
|
||||
pass
|
||||
|
||||
def set_user_specified_environment(self, req, resp, wsgi_environ, params):
|
||||
if not params.has_key('initial_env') or not params['initial_env']:
|
||||
return
|
||||
user_env_string = params['initial_env']
|
||||
for l in user_env_string.split('\n'):
|
||||
l = l.strip()
|
||||
if l:
|
||||
name, value = l.split(':', 1)
|
||||
wsgi_environ[name.strip()] = value.strip()
|
||||
|
||||
def set_wsgi_environment(self, req, resp, wsgi_environ, params, j2ee_ns):
|
||||
self.set_container_specific_wsgi_vars(req, resp, wsgi_environ, params)
|
||||
self.set_j2ee_specific_wsgi_vars(wsgi_environ, j2ee_ns)
|
||||
self.set_required_cgi_environ(req, resp, wsgi_environ)
|
||||
self.set_other_cgi_environ(req, resp, wsgi_environ)
|
||||
self.set_http_header_environ(req, resp, wsgi_environ)
|
||||
self.set_required_wsgi_vars(req, resp, wsgi_environ)
|
||||
self.set_wsgi_streams(req, resp, wsgi_environ)
|
||||
self.set_wsgi_classes(req, resp, wsgi_environ)
|
||||
self.set_user_specified_environment(req, resp, wsgi_environ, params)
|
@ -1,35 +0,0 @@
|
||||
import sys
|
||||
from java import awt
|
||||
|
||||
def test(panel, size=None, name='AWT Tester'):
|
||||
f = awt.Frame(name, windowClosing=lambda event: sys.exit(0))
|
||||
if hasattr(panel, 'init'):
|
||||
panel.init()
|
||||
|
||||
f.add('Center', panel)
|
||||
f.pack()
|
||||
if size is not None:
|
||||
f.setSize(apply(awt.Dimension, size))
|
||||
f.setVisible(1)
|
||||
return f
|
||||
|
||||
class GridBag:
|
||||
def __init__(self, frame, **defaults):
|
||||
self.frame = frame
|
||||
self.gridbag = awt.GridBagLayout()
|
||||
self.defaults = defaults
|
||||
frame.setLayout(self.gridbag)
|
||||
|
||||
def addRow(self, widget, **kw):
|
||||
kw['gridwidth'] = 'REMAINDER'
|
||||
apply(self.add, (widget, ), kw)
|
||||
|
||||
def add(self, widget, **kw):
|
||||
constraints = awt.GridBagConstraints()
|
||||
|
||||
for key, value in self.defaults.items()+kw.items():
|
||||
if isinstance(value, type('')):
|
||||
value = getattr(awt.GridBagConstraints, value)
|
||||
setattr(constraints, key, value)
|
||||
self.gridbag.setConstraints(widget, constraints)
|
||||
self.frame.add(widget)
|
@ -1,144 +0,0 @@
|
||||
from java.awt import Color
|
||||
|
||||
aliceblue = Color(240, 248, 255)
|
||||
antiquewhite = Color(250, 235, 215)
|
||||
aqua = Color(0, 255, 255)
|
||||
aquamarine = Color(127, 255, 212)
|
||||
azure = Color(240, 255, 255)
|
||||
beige = Color(245, 245, 220)
|
||||
bisque = Color(255, 228, 196)
|
||||
black = Color(0, 0, 0)
|
||||
blanchedalmond = Color(255, 235, 205)
|
||||
blue = Color(0, 0, 255)
|
||||
blueviolet = Color(138, 43, 226)
|
||||
brown = Color(165, 42, 42)
|
||||
burlywood = Color(222, 184, 135)
|
||||
cadetblue = Color(95, 158, 160)
|
||||
chartreuse = Color(127, 255, 0)
|
||||
chocolate = Color(210, 105, 30)
|
||||
coral = Color(255, 127, 80)
|
||||
cornflowerblue = Color(100, 149, 237)
|
||||
cornsilk = Color(255, 248, 220)
|
||||
crimson = Color(220, 20, 60)
|
||||
cyan = Color(0, 255, 255)
|
||||
darkblue = Color(0, 0, 139)
|
||||
darkcyan = Color(0, 139, 139)
|
||||
darkgoldenrod = Color(184, 134, 11)
|
||||
darkgray = Color(169, 169, 169)
|
||||
darkgreen = Color(0, 100, 0)
|
||||
darkkhaki = Color(189, 183, 107)
|
||||
darkmagenta = Color(139, 0, 139)
|
||||
darkolivegreen = Color(85, 107, 47)
|
||||
darkorange = Color(255, 140, 0)
|
||||
darkorchid = Color(153, 50, 204)
|
||||
darkred = Color(139, 0, 0)
|
||||
darksalmon = Color(233, 150, 122)
|
||||
darkseagreen = Color(143, 188, 143)
|
||||
darkslateblue = Color(72, 61, 139)
|
||||
darkslategray = Color(47, 79, 79)
|
||||
darkturquoise = Color(0, 206, 209)
|
||||
darkviolet = Color(148, 0, 211)
|
||||
deeppink = Color(255, 20, 147)
|
||||
deepskyblue = Color(0, 191, 255)
|
||||
dimgray = Color(105, 105, 105)
|
||||
dodgerblue = Color(30, 144, 255)
|
||||
firebrick = Color(178, 34, 34)
|
||||
floralwhite = Color(255, 250, 240)
|
||||
forestgreen = Color(34, 139, 34)
|
||||
fuchsia = Color(255, 0, 255)
|
||||
gainsboro = Color(220, 220, 220)
|
||||
ghostwhite = Color(248, 248, 255)
|
||||
gold = Color(255, 215, 0)
|
||||
goldenrod = Color(218, 165, 32)
|
||||
gray = Color(128, 128, 128)
|
||||
green = Color(0, 128, 0)
|
||||
greenyellow = Color(173, 255, 47)
|
||||
honeydew = Color(240, 255, 240)
|
||||
hotpink = Color(255, 105, 180)
|
||||
indianred = Color(205, 92, 92)
|
||||
indigo = Color(75, 0, 130)
|
||||
ivory = Color(255, 255, 240)
|
||||
khaki = Color(240, 230, 140)
|
||||
lavender = Color(230, 230, 250)
|
||||
lavenderblush = Color(255, 240, 245)
|
||||
lawngreen = Color(124, 252, 0)
|
||||
lemonchiffon = Color(255, 250, 205)
|
||||
lightblue = Color(173, 216, 230)
|
||||
lightcoral = Color(240, 128, 128)
|
||||
lightcyan = Color(224, 255, 255)
|
||||
lightgoldenrodyellow = Color(250, 250, 210)
|
||||
lightgreen = Color(144, 238, 144)
|
||||
lightgrey = Color(211, 211, 211)
|
||||
lightpink = Color(255, 182, 193)
|
||||
lightsalmon = Color(255, 160, 122)
|
||||
lightseagreen = Color(32, 178, 170)
|
||||
lightskyblue = Color(135, 206, 250)
|
||||
lightslategray = Color(119, 136, 153)
|
||||
lightsteelblue = Color(176, 196, 222)
|
||||
lightyellow = Color(255, 255, 224)
|
||||
lime = Color(0, 255, 0)
|
||||
limegreen = Color(50, 205, 50)
|
||||
linen = Color(250, 240, 230)
|
||||
magenta = Color(255, 0, 255)
|
||||
maroon = Color(128, 0, 0)
|
||||
mediumaquamarine = Color(102, 205, 170)
|
||||
mediumblue = Color(0, 0, 205)
|
||||
mediumorchid = Color(186, 85, 211)
|
||||
mediumpurple = Color(147, 112, 219)
|
||||
mediumseagreen = Color(60, 179, 113)
|
||||
mediumslateblue = Color(123, 104, 238)
|
||||
mediumspringgreen = Color(0, 250, 154)
|
||||
mediumturquoise = Color(72, 209, 204)
|
||||
mediumvioletred = Color(199, 21, 133)
|
||||
midnightblue = Color(25, 25, 112)
|
||||
mintcream = Color(245, 255, 250)
|
||||
mistyrose = Color(255, 228, 225)
|
||||
moccasin = Color(255, 228, 181)
|
||||
navajowhite = Color(255, 222, 173)
|
||||
navy = Color(0, 0, 128)
|
||||
oldlace = Color(253, 245, 230)
|
||||
olive = Color(128, 128, 0)
|
||||
olivedrab = Color(107, 142, 35)
|
||||
orange = Color(255, 165, 0)
|
||||
orangered = Color(255, 69, 0)
|
||||
orchid = Color(218, 112, 214)
|
||||
palegoldenrod = Color(238, 232, 170)
|
||||
palegreen = Color(152, 251, 152)
|
||||
paleturquoise = Color(175, 238, 238)
|
||||
palevioletred = Color(219, 112, 147)
|
||||
papayawhip = Color(255, 239, 213)
|
||||
peachpuff = Color(255, 218, 185)
|
||||
peru = Color(205, 133, 63)
|
||||
pink = Color(255, 192, 203)
|
||||
plum = Color(221, 160, 221)
|
||||
powderblue = Color(176, 224, 230)
|
||||
purple = Color(128, 0, 128)
|
||||
red = Color(255, 0, 0)
|
||||
rosybrown = Color(188, 143, 143)
|
||||
royalblue = Color(65, 105, 225)
|
||||
saddlebrown = Color(139, 69, 19)
|
||||
salmon = Color(250, 128, 114)
|
||||
sandybrown = Color(244, 164, 96)
|
||||
seagreen = Color(46, 139, 87)
|
||||
seashell = Color(255, 245, 238)
|
||||
sienna = Color(160, 82, 45)
|
||||
silver = Color(192, 192, 192)
|
||||
skyblue = Color(135, 206, 235)
|
||||
slateblue = Color(106, 90, 205)
|
||||
slategray = Color(112, 128, 144)
|
||||
snow = Color(255, 250, 250)
|
||||
springgreen = Color(0, 255, 127)
|
||||
steelblue = Color(70, 130, 180)
|
||||
tan = Color(210, 180, 140)
|
||||
teal = Color(0, 128, 128)
|
||||
thistle = Color(216, 191, 216)
|
||||
tomato = Color(255, 99, 71)
|
||||
turquoise = Color(64, 224, 208)
|
||||
violet = Color(238, 130, 238)
|
||||
wheat = Color(245, 222, 179)
|
||||
white = Color(255, 255, 255)
|
||||
whitesmoke = Color(245, 245, 245)
|
||||
yellow = Color(255, 255, 0)
|
||||
yellowgreen = Color(154, 205, 50)
|
||||
|
||||
del Color
|
@ -1,24 +0,0 @@
|
||||
"""
|
||||
No longer needed, but keeping for backwards compatibility.
|
||||
"""
|
||||
from javax import swing
|
||||
import sys
|
||||
|
||||
def test(panel, size=None, name='Swing Tester'):
|
||||
f = swing.JFrame(name, windowClosing=lambda event: sys.exit(0))
|
||||
if hasattr(panel, 'init'):
|
||||
panel.init()
|
||||
|
||||
f.contentPane.add(panel)
|
||||
f.pack()
|
||||
if size is not None:
|
||||
from java import awt
|
||||
f.setSize(apply(awt.Dimension, size))
|
||||
f.setVisible(1)
|
||||
return f
|
||||
|
||||
if swing is not None:
|
||||
import pawt, sys
|
||||
pawt.swing = swing
|
||||
sys.modules['pawt.swing'] = swing
|
||||
swing.__dict__['test'] = test
|
Binary file not shown.
@ -1,62 +0,0 @@
|
||||
from java import awt
|
||||
from math import *
|
||||
from jarray import array
|
||||
|
||||
class Graph(awt.Canvas):
|
||||
def __init__(self):
|
||||
self.function = None
|
||||
|
||||
def paint(self, g):
|
||||
if self.function is None:
|
||||
return self.error(g)
|
||||
|
||||
sz = self.size
|
||||
xs = range(0, sz.width, 2)
|
||||
|
||||
xscale = 4*pi/sz.width
|
||||
xoffset = -2*pi
|
||||
|
||||
yscale = -sz.height/2.
|
||||
yoffset = sz.height/2.
|
||||
|
||||
ys = []
|
||||
for x in xs:
|
||||
x = xscale*x + xoffset
|
||||
y = int(yscale*self.function(x)+yoffset)
|
||||
ys.append(y)
|
||||
g.drawPolyline(array(xs, 'i'), array(ys, 'i'), len(xs))
|
||||
|
||||
def error(self, g):
|
||||
message = "Invalid Expression"
|
||||
g.font = awt.Font('Serif', awt.Font.BOLD, 20)
|
||||
width = g.fontMetrics.stringWidth(message)
|
||||
|
||||
x = (self.size.width-width)/2
|
||||
y = (self.size.height+g.fontMetrics.height)/2
|
||||
g.drawString("Invalid Expression", x, y)
|
||||
|
||||
def setExpression(self, e):
|
||||
try:
|
||||
self.function = eval('lambda x: '+e)
|
||||
except:
|
||||
self.function = None
|
||||
self.repaint()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
def enter(e):
|
||||
graph.setExpression(expression.text)
|
||||
expression.caretPosition=0
|
||||
expression.selectAll()
|
||||
|
||||
p = awt.Panel(layout=awt.BorderLayout())
|
||||
graph = Graph()
|
||||
p.add(graph, 'Center')
|
||||
|
||||
expression = awt.TextField(text='(sin(3*x)+cos(x))/2', actionPerformed=enter)
|
||||
p.add(expression, 'South')
|
||||
|
||||
import pawt
|
||||
pawt.test(p, size=(300,300))
|
||||
|
||||
enter(None)
|
@ -1,422 +0,0 @@
|
||||
+++++++++++++++++++++++++++++++
|
||||
Writing Python Regression Tests
|
||||
+++++++++++++++++++++++++++++++
|
||||
|
||||
:Author: Skip Montanaro
|
||||
:Contact: skip@mojam.com
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
If you add a new module to Python or modify the functionality of an existing
|
||||
module, you should write one or more test cases to exercise that new
|
||||
functionality. There are different ways to do this within the regression
|
||||
testing facility provided with Python; any particular test should use only
|
||||
one of these options. Each option requires writing a test module using the
|
||||
conventions of the selected option:
|
||||
|
||||
- unittest_ based tests
|
||||
- doctest_ based tests
|
||||
- "traditional" Python test modules
|
||||
|
||||
Regardless of the mechanics of the testing approach you choose,
|
||||
you will be writing unit tests (isolated tests of functions and objects
|
||||
defined by the module) using white box techniques. Unlike black box
|
||||
testing, where you only have the external interfaces to guide your test case
|
||||
writing, in white box testing you can see the code being tested and tailor
|
||||
your test cases to exercise it more completely. In particular, you will be
|
||||
able to refer to the C and Python code in the CVS repository when writing
|
||||
your regression test cases.
|
||||
|
||||
.. _unittest: http://www.python.org/doc/current/lib/module-unittest.html
|
||||
.. _doctest: http://www.python.org/doc/current/lib/module-doctest.html
|
||||
|
||||
unittest-based tests
|
||||
------------------
|
||||
The unittest_ framework is based on the ideas of unit testing as espoused
|
||||
by Kent Beck and the `Extreme Programming`_ (XP) movement. The specific
|
||||
interface provided by the framework is tightly based on the JUnit_
|
||||
Java implementation of Beck's original SmallTalk test framework. Please
|
||||
see the documentation of the unittest_ module for detailed information on
|
||||
the interface and general guidelines on writing unittest-based tests.
|
||||
|
||||
The test_support helper module provides two functions for use by
|
||||
unittest-based tests in the Python regression testing framework:
|
||||
|
||||
- ``run_unittest()`` takes a number of ``unittest.TestCase`` derived class as
|
||||
parameters and runs the tests defined in those classes.
|
||||
|
||||
- ``run_suite()`` takes a populated ``TestSuite`` instance and runs the
|
||||
tests.
|
||||
|
||||
``run_suite()`` is preferred because unittest files typically grow multiple
|
||||
test classes, and you might as well be prepared.
|
||||
|
||||
All test methods in the Python regression framework have names that
|
||||
start with "``test_``" and use lower-case names with words separated with
|
||||
underscores.
|
||||
|
||||
Test methods should *not* have docstrings! The unittest module prints
|
||||
the docstring if there is one, but otherwise prints the function name
|
||||
and the full class name. When there's a problem with a test, the
|
||||
latter information makes it easier to find the source for the test
|
||||
than the docstring.
|
||||
|
||||
All unittest-based tests in the Python test suite use boilerplate that
|
||||
looks like this (with minor variations)::
|
||||
|
||||
import unittest
|
||||
from test import test_support
|
||||
|
||||
class MyTestCase1(unittest.TestCase):
|
||||
|
||||
# Define setUp and tearDown only if needed
|
||||
|
||||
def setUp(self):
|
||||
unittest.TestCase.setUp(self)
|
||||
... additional initialization...
|
||||
|
||||
def tearDown(self):
|
||||
... additional finalization...
|
||||
unittest.TestCase.tearDown(self)
|
||||
|
||||
def test_feature_one(self):
|
||||
# Testing feature one
|
||||
...unit test for feature one...
|
||||
|
||||
def test_feature_two(self):
|
||||
# Testing feature two
|
||||
...unit test for feature two...
|
||||
|
||||
...etc...
|
||||
|
||||
class MyTestCase2(unittest.TestCase):
|
||||
...same structure as MyTestCase1...
|
||||
|
||||
...etc...
|
||||
|
||||
def test_main():
|
||||
suite = unittest.TestSuite()
|
||||
suite.addTest(unittest.makeSuite(MyTestCase1))
|
||||
suite.addTest(unittest.makeSuite(MyTestCase2))
|
||||
...add more suites...
|
||||
test_support.run_suite(suite)
|
||||
|
||||
if __name__ == "__main__":
|
||||
test_main()
|
||||
|
||||
This has the advantage that it allows the unittest module to be used
|
||||
as a script to run individual tests as well as working well with the
|
||||
regrtest framework.
|
||||
|
||||
.. _Extreme Programming: http://www.extremeprogramming.org/
|
||||
.. _JUnit: http://www.junit.org/
|
||||
|
||||
doctest based tests
|
||||
-------------------
|
||||
Tests written to use doctest_ are actually part of the docstrings for
|
||||
the module being tested. Each test is written as a display of an
|
||||
interactive session, including the Python prompts, statements that would
|
||||
be typed by the user, and the output of those statements (including
|
||||
tracebacks, although only the exception msg needs to be retained then).
|
||||
The module in the test package is simply a wrapper that causes doctest
|
||||
to run over the tests in the module. The test for the difflib module
|
||||
provides a convenient example::
|
||||
|
||||
import difflib
|
||||
from test import test_support
|
||||
test_support.run_doctest(difflib)
|
||||
|
||||
If the test is successful, nothing is written to stdout (so you should not
|
||||
create a corresponding output/test_difflib file), but running regrtest
|
||||
with -v will give a detailed report, the same as if passing -v to doctest.
|
||||
|
||||
A second argument can be passed to run_doctest to tell doctest to search
|
||||
``sys.argv`` for -v instead of using test_support's idea of verbosity. This
|
||||
is useful for writing doctest-based tests that aren't simply running a
|
||||
doctest'ed Lib module, but contain the doctests themselves. Then at
|
||||
times you may want to run such a test directly as a doctest, independent
|
||||
of the regrtest framework. The tail end of test_descrtut.py is a good
|
||||
example::
|
||||
|
||||
def test_main(verbose=None):
|
||||
from test import test_support, test_descrtut
|
||||
test_support.run_doctest(test_descrtut, verbose)
|
||||
|
||||
if __name__ == "__main__":
|
||||
test_main(1)
|
||||
|
||||
If run via regrtest, ``test_main()`` is called (by regrtest) without
|
||||
specifying verbose, and then test_support's idea of verbosity is used. But
|
||||
when run directly, ``test_main(1)`` is called, and then doctest's idea of
|
||||
verbosity is used.
|
||||
|
||||
See the documentation for the doctest module for information on
|
||||
writing tests using the doctest framework.
|
||||
|
||||
"traditional" Python test modules
|
||||
---------------------------------
|
||||
The mechanics of how the "traditional" test system operates are fairly
|
||||
straightforward. When a test case is run, the output is compared with the
|
||||
expected output that is stored in .../Lib/test/output. If the test runs to
|
||||
completion and the actual and expected outputs match, the test succeeds, if
|
||||
not, it fails. If an ``ImportError`` or ``test_support.TestSkipped`` error
|
||||
is raised, the test is not run.
|
||||
|
||||
Executing Test Cases
|
||||
====================
|
||||
If you are writing test cases for module spam, you need to create a file
|
||||
in .../Lib/test named test_spam.py. In addition, if the tests are expected
|
||||
to write to stdout during a successful run, you also need to create an
|
||||
expected output file in .../Lib/test/output named test_spam ("..."
|
||||
represents the top-level directory in the Python source tree, the directory
|
||||
containing the configure script). If needed, generate the initial version
|
||||
of the test output file by executing::
|
||||
|
||||
./python Lib/test/regrtest.py -g test_spam.py
|
||||
|
||||
from the top-level directory.
|
||||
|
||||
Any time you modify test_spam.py you need to generate a new expected
|
||||
output file. Don't forget to desk check the generated output to make sure
|
||||
it's really what you expected to find! All in all it's usually better
|
||||
not to have an expected-out file (note that doctest- and unittest-based
|
||||
tests do not).
|
||||
|
||||
To run a single test after modifying a module, simply run regrtest.py
|
||||
without the -g flag::
|
||||
|
||||
./python Lib/test/regrtest.py test_spam.py
|
||||
|
||||
While debugging a regression test, you can of course execute it
|
||||
independently of the regression testing framework and see what it prints::
|
||||
|
||||
./python Lib/test/test_spam.py
|
||||
|
||||
To run the entire test suite:
|
||||
|
||||
- [UNIX, + other platforms where "make" works] Make the "test" target at the
|
||||
top level::
|
||||
|
||||
make test
|
||||
|
||||
- [WINDOWS] Run rt.bat from your PCBuild directory. Read the comments at
|
||||
the top of rt.bat for the use of special -d, -O and -q options processed
|
||||
by rt.bat.
|
||||
|
||||
- [OTHER] You can simply execute the two runs of regrtest (optimized and
|
||||
non-optimized) directly::
|
||||
|
||||
./python Lib/test/regrtest.py
|
||||
./python -O Lib/test/regrtest.py
|
||||
|
||||
But note that this way picks up whatever .pyc and .pyo files happen to be
|
||||
around. The makefile and rt.bat ways run the tests twice, the first time
|
||||
removing all .pyc and .pyo files from the subtree rooted at Lib/.
|
||||
|
||||
Test cases generate output based upon values computed by the test code.
|
||||
When executed, regrtest.py compares the actual output generated by executing
|
||||
the test case with the expected output and reports success or failure. It
|
||||
stands to reason that if the actual and expected outputs are to match, they
|
||||
must not contain any machine dependencies. This means your test cases
|
||||
should not print out absolute machine addresses (e.g. the return value of
|
||||
the id() builtin function) or floating point numbers with large numbers of
|
||||
significant digits (unless you understand what you are doing!).
|
||||
|
||||
|
||||
Test Case Writing Tips
|
||||
======================
|
||||
Writing good test cases is a skilled task and is too complex to discuss in
|
||||
detail in this short document. Many books have been written on the subject.
|
||||
I'll show my age by suggesting that Glenford Myers' `"The Art of Software
|
||||
Testing"`_, published in 1979, is still the best introduction to the subject
|
||||
available. It is short (177 pages), easy to read, and discusses the major
|
||||
elements of software testing, though its publication predates the
|
||||
object-oriented software revolution, so doesn't cover that subject at all.
|
||||
Unfortunately, it is very expensive (about $100 new). If you can borrow it
|
||||
or find it used (around $20), I strongly urge you to pick up a copy.
|
||||
|
||||
The most important goal when writing test cases is to break things. A test
|
||||
case that doesn't uncover a bug is much less valuable than one that does.
|
||||
In designing test cases you should pay attention to the following:
|
||||
|
||||
* Your test cases should exercise all the functions and objects defined
|
||||
in the module, not just the ones meant to be called by users of your
|
||||
module. This may require you to write test code that uses the module
|
||||
in ways you don't expect (explicitly calling internal functions, for
|
||||
example - see test_atexit.py).
|
||||
|
||||
* You should consider any boundary values that may tickle exceptional
|
||||
conditions (e.g. if you were writing regression tests for division,
|
||||
you might well want to generate tests with numerators and denominators
|
||||
at the limits of floating point and integer numbers on the machine
|
||||
performing the tests as well as a denominator of zero).
|
||||
|
||||
* You should exercise as many paths through the code as possible. This
|
||||
may not always be possible, but is a goal to strive for. In
|
||||
particular, when considering if statements (or their equivalent), you
|
||||
want to create test cases that exercise both the true and false
|
||||
branches. For loops, you should create test cases that exercise the
|
||||
loop zero, one and multiple times.
|
||||
|
||||
* You should test with obviously invalid input. If you know that a
|
||||
function requires an integer input, try calling it with other types of
|
||||
objects to see how it responds.
|
||||
|
||||
* You should test with obviously out-of-range input. If the domain of a
|
||||
function is only defined for positive integers, try calling it with a
|
||||
negative integer.
|
||||
|
||||
* If you are going to fix a bug that wasn't uncovered by an existing
|
||||
test, try to write a test case that exposes the bug (preferably before
|
||||
fixing it).
|
||||
|
||||
* If you need to create a temporary file, you can use the filename in
|
||||
``test_support.TESTFN`` to do so. It is important to remove the file
|
||||
when done; other tests should be able to use the name without cleaning
|
||||
up after your test.
|
||||
|
||||
.. _"The Art of Software Testing":
|
||||
http://www.amazon.com/exec/obidos/ISBN=0471043281
|
||||
|
||||
Regression Test Writing Rules
|
||||
=============================
|
||||
Each test case is different. There is no "standard" form for a Python
|
||||
regression test case, though there are some general rules (note that
|
||||
these mostly apply only to the "classic" tests; unittest_- and doctest_-
|
||||
based tests should follow the conventions natural to those frameworks)::
|
||||
|
||||
* If your test case detects a failure, raise ``TestFailed`` (found in
|
||||
``test.test_support``).
|
||||
|
||||
* Import everything you'll need as early as possible.
|
||||
|
||||
* If you'll be importing objects from a module that is at least
|
||||
partially platform-dependent, only import those objects you need for
|
||||
the current test case to avoid spurious ``ImportError`` exceptions
|
||||
that prevent the test from running to completion.
|
||||
|
||||
* Print all your test case results using the ``print`` statement. For
|
||||
non-fatal errors, print an error message (or omit a successful
|
||||
completion print) to indicate the failure, but proceed instead of
|
||||
raising ``TestFailed``.
|
||||
|
||||
* Use ``assert`` sparingly, if at all. It's usually better to just print
|
||||
what you got, and rely on regrtest's got-vs-expected comparison to
|
||||
catch deviations from what you expect. ``assert`` statements aren't
|
||||
executed at all when regrtest is run in -O mode; and, because they
|
||||
cause the test to stop immediately, can lead to a long & tedious
|
||||
test-fix, test-fix, test-fix, ... cycle when things are badly broken
|
||||
(and note that "badly broken" often includes running the test suite
|
||||
for the first time on new platforms or under new implementations of
|
||||
the language).
|
||||
|
||||
Miscellaneous
|
||||
=============
|
||||
There is a test_support module in the test package you can import for
|
||||
your test case. Import this module using either::
|
||||
|
||||
import test.test_support
|
||||
|
||||
or::
|
||||
|
||||
from test import test_support
|
||||
|
||||
test_support provides the following useful objects:
|
||||
|
||||
* ``TestFailed`` - raise this exception when your regression test detects
|
||||
a failure.
|
||||
|
||||
* ``TestSkipped`` - raise this if the test could not be run because the
|
||||
platform doesn't offer all the required facilities (like large
|
||||
file support), even if all the required modules are available.
|
||||
|
||||
* ``ResourceDenied`` - this is raised when a test requires a resource that
|
||||
is not available. Primarily used by 'requires'.
|
||||
|
||||
* ``verbose`` - you can use this variable to control print output. Many
|
||||
modules use it. Search for "verbose" in the test_*.py files to see
|
||||
lots of examples.
|
||||
|
||||
* ``forget(module_name)`` - attempts to cause Python to "forget" that it
|
||||
loaded a module and erase any PYC files.
|
||||
|
||||
* ``is_resource_enabled(resource)`` - Returns a boolean based on whether
|
||||
the resource is enabled or not.
|
||||
|
||||
* ``requires(resource [, msg])`` - if the required resource is not
|
||||
available the ResourceDenied exception is raised.
|
||||
|
||||
* ``verify(condition, reason='test failed')``. Use this instead of::
|
||||
|
||||
assert condition[, reason]
|
||||
|
||||
``verify()`` has two advantages over ``assert``: it works even in -O
|
||||
mode, and it raises ``TestFailed`` on failure instead of
|
||||
``AssertionError``.
|
||||
|
||||
* ``have_unicode`` - true if Unicode is available, false otherwise.
|
||||
|
||||
* ``is_jython`` - true if the interpreter is Jython, false otherwise.
|
||||
|
||||
* ``TESTFN`` - a string that should always be used as the filename when
|
||||
you need to create a temp file. Also use ``try``/``finally`` to
|
||||
ensure that your temp files are deleted before your test completes.
|
||||
Note that you cannot unlink an open file on all operating systems, so
|
||||
also be sure to close temp files before trying to unlink them.
|
||||
|
||||
* ``sortdict(dict)`` - acts like ``repr(dict.items())``, but sorts the
|
||||
items first. This is important when printing a dict value, because
|
||||
the order of items produced by ``dict.items()`` is not defined by the
|
||||
language.
|
||||
|
||||
* ``findfile(file)`` - you can call this function to locate a file
|
||||
somewhere along sys.path or in the Lib/test tree - see
|
||||
test_linuxaudiodev.py for an example of its use.
|
||||
|
||||
* ``fcmp(x,y)`` - you can call this function to compare two floating
|
||||
point numbers when you expect them to only be approximately equal
|
||||
withing a fuzz factor (``test_support.FUZZ``, which defaults to 1e-6).
|
||||
|
||||
* ``check_syntax(statement)`` - make sure that the statement is *not*
|
||||
correct Python syntax.
|
||||
|
||||
|
||||
Python and C statement coverage results are currently available at
|
||||
|
||||
http://www.musi-cal.com/~skip/python/Python/dist/src/
|
||||
|
||||
As of this writing (July, 2000) these results are being generated nightly.
|
||||
You can refer to the summaries and the test coverage output files to see
|
||||
where coverage is adequate or lacking and write test cases to beef up the
|
||||
coverage.
|
||||
|
||||
Some Non-Obvious regrtest Features
|
||||
==================================
|
||||
* Automagic test detection: When you create a new test file
|
||||
test_spam.py, you do not need to modify regrtest (or anything else)
|
||||
to advertise its existence. regrtest searches for and runs all
|
||||
modules in the test directory with names of the form test_xxx.py.
|
||||
|
||||
* Miranda output: If, when running test_spam.py, regrtest does not
|
||||
find an expected-output file test/output/test_spam, regrtest
|
||||
pretends that it did find one, containing the single line
|
||||
|
||||
test_spam
|
||||
|
||||
This allows new tests that don't expect to print anything to stdout
|
||||
to not bother creating expected-output files.
|
||||
|
||||
* Two-stage testing: To run test_spam.py, regrtest imports test_spam
|
||||
as a module. Most tests run to completion as a side-effect of
|
||||
getting imported. After importing test_spam, regrtest also executes
|
||||
``test_spam.test_main()``, if test_spam has a ``test_main`` attribute.
|
||||
This is rarely required with the "traditional" Python tests, and
|
||||
you shouldn't create a module global with name test_main unless
|
||||
you're specifically exploiting this gimmick. This usage does
|
||||
prove useful with unittest-based tests as well, however; defining
|
||||
a ``test_main()`` which is run by regrtest and a script-stub in the
|
||||
test module ("``if __name__ == '__main__': test_main()``") allows
|
||||
the test to be used like any other Python test and also work
|
||||
with the unittest.py-as-a-script approach, allowing a developer
|
||||
to run specific tests from the command line.
|
@ -1 +0,0 @@
|
||||
# Dummy file to make this directory a package.
|
@ -1,2 +0,0 @@
|
||||
from java.awt.geom import Ellipse2D, EllipseIterator
|
||||
EllipseIterator(Ellipse2D.Float(), None)
|
@ -1,4 +0,0 @@
|
||||
from org.python.tests import Invisible
|
||||
Invisible.protectedStaticField
|
||||
Invisible().protectedField
|
||||
Invisible.packageField
|
@ -1,40 +0,0 @@
|
||||
'''Used by test_import_jy/test_getattr_module'''
|
||||
import sys
|
||||
|
||||
class anygui:
|
||||
__all__ = ['Window'] # Etc...
|
||||
|
||||
def __init__(self):
|
||||
self.__backend = None
|
||||
self.__backends = ['msw', 'x', 'mac', 'wx', 'tk', 'java']
|
||||
|
||||
def __try_to_get(self, modulename):
|
||||
import imp
|
||||
try:
|
||||
module = imp.find_module(modulename)
|
||||
except (IOError, ImportError, AttributeError, AssertionError):
|
||||
return None
|
||||
else:
|
||||
return module
|
||||
|
||||
def __import_backend(self, wishlist):
|
||||
candidates = self.__backends[:]
|
||||
for wish in wishlist:
|
||||
if wish in candidates:
|
||||
candidates.remove(wish)
|
||||
else:
|
||||
wishlist.remove(wish)
|
||||
candidates = wishlist + candidates
|
||||
|
||||
for name in candidates:
|
||||
backend = self.__try_to_get('%sgui' % name)
|
||||
if not backend:
|
||||
raise Exception, 'not able to import any GUI backends'
|
||||
self.__backend = backend
|
||||
|
||||
def __getattr__(self, name):
|
||||
if not self.__backend:
|
||||
self.__import_backend(self.__dict__.get('wishlist', []))
|
||||
return self.__backend.__dict__[name]
|
||||
|
||||
sys.modules[__name__] = anygui()
|
Binary file not shown.
@ -1,6 +0,0 @@
|
||||
# This should be equivalent to running regrtest.py from the cmdline.
|
||||
# It can be especially handy if you're in an interactive shell, e.g.,
|
||||
# from test import autotest.
|
||||
|
||||
from test import regrtest
|
||||
regrtest.main()
|
@ -1 +0,0 @@
|
||||
# -*- coding: uft-8 -*-
|
@ -1,5 +0,0 @@
|
||||
#coding: uft8
|
||||
print '我'
|
||||
|
||||
#Changed for Jython because the original "coding: utf8" is supposed to be a
|
||||
#misspelling, but Java accepts this spelling for an encoding.
|
@ -1,5 +0,0 @@
|
||||
def hi():
|
||||
pass
|
||||
|
||||
def bye():
|
||||
hi(
|
@ -1,10 +0,0 @@
|
||||
"""This is a test"""
|
||||
from __future__ import nested_scopes
|
||||
from __future__ import rested_snopes
|
||||
|
||||
def f(x):
|
||||
def g(y):
|
||||
return x + y
|
||||
return g
|
||||
|
||||
result = f(2)(4)
|
@ -1,10 +0,0 @@
|
||||
"""This is a test"""
|
||||
import __future__
|
||||
from __future__ import nested_scopes
|
||||
|
||||
def f(x):
|
||||
def g(y):
|
||||
return x + y
|
||||
return g
|
||||
|
||||
result = f(2)(4)
|
@ -1,12 +0,0 @@
|
||||
"""This is a test"""
|
||||
from __future__ import nested_scopes
|
||||
import foo
|
||||
from __future__ import nested_scopes
|
||||
|
||||
|
||||
def f(x):
|
||||
def g(y):
|
||||
return x + y
|
||||
return g
|
||||
|
||||
result = f(2)(4)
|
@ -1,10 +0,0 @@
|
||||
"""This is a test"""
|
||||
"this isn't a doc string"
|
||||
from __future__ import nested_scopes
|
||||
|
||||
def f(x):
|
||||
def g(y):
|
||||
return x + y
|
||||
return g
|
||||
|
||||
result = f(2)(4)
|
@ -1,11 +0,0 @@
|
||||
"""This is a test"""
|
||||
|
||||
from __future__ import nested_scopes; import string; from __future__ import \
|
||||
nested_scopes
|
||||
|
||||
def f(x):
|
||||
def g(y):
|
||||
return x + y
|
||||
return g
|
||||
|
||||
result = f(2)(4)
|
@ -1,10 +0,0 @@
|
||||
"""This is a test"""
|
||||
|
||||
from __future__ import *
|
||||
|
||||
def f(x):
|
||||
def g(y):
|
||||
return x + y
|
||||
return g
|
||||
|
||||
print f(2)(4)
|
@ -1,10 +0,0 @@
|
||||
"""This is a test"""
|
||||
|
||||
from __future__ import nested_scopes, braces
|
||||
|
||||
def f(x):
|
||||
def g(y):
|
||||
return x + y
|
||||
return g
|
||||
|
||||
print f(2)(4)
|
@ -1,2 +0,0 @@
|
||||
def f(x):
|
||||
[x for x in x] = x
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,139 +0,0 @@
|
||||
import sys
|
||||
import os
|
||||
dir = os.path.dirname(sys.argv[0])
|
||||
scriptsdir = os.path.normpath(os.path.join(dir, os.pardir, 'scripts'))
|
||||
sys.path.append(scriptsdir)
|
||||
from test_support import *
|
||||
|
||||
print 'Bug Fixes'
|
||||
print 'From 1.0.0 to 1.0.1'
|
||||
print 'Recursive assignment to list slices handled incorrectly #1'
|
||||
|
||||
x = [1,2,3,4,5]
|
||||
x[1:] = x
|
||||
assert x == [1,1,2,3,4,5]
|
||||
|
||||
print 'sys.platform should be javax.y.z not jdkx.y.z #4'
|
||||
|
||||
import sys
|
||||
assert sys.platform[:4] == 'java'
|
||||
|
||||
print 'java.io.IOExceptions are mangled into IOErrors #5'
|
||||
|
||||
from java import io, lang
|
||||
try:
|
||||
io.FileInputStream("doesnotexist")
|
||||
raise TestFailed
|
||||
except io.FileNotFoundException:
|
||||
pass
|
||||
|
||||
try:
|
||||
io.FileInputStream("doesnotexist")
|
||||
raise TestFailed
|
||||
except IOError:
|
||||
pass
|
||||
|
||||
|
||||
print 'java.util.Vector\'s can\'t be used in for loops #7'
|
||||
|
||||
from java.util import Vector
|
||||
|
||||
vec = Vector()
|
||||
vec.addElement(1)
|
||||
vec.addElement(10)
|
||||
vec.addElement(100)
|
||||
|
||||
sum = 0
|
||||
for x in vec:
|
||||
sum = sum+x
|
||||
assert sum == 111
|
||||
|
||||
print 'Exception tuple contains nulls #8'
|
||||
|
||||
str(Exception)
|
||||
|
||||
print '0.001 comes out as 0.0010 #11'
|
||||
|
||||
assert str(0.001) == '0.001'
|
||||
|
||||
print "thread.LockType doesn't exist #12"
|
||||
|
||||
import thread
|
||||
assert hasattr(thread, 'LockType')
|
||||
|
||||
print 'sys.exit can only be called with an integer argument #13'
|
||||
|
||||
import sys
|
||||
try:
|
||||
sys.exit("goodbye")
|
||||
except SystemExit, exc:
|
||||
# exc is an instance now
|
||||
assert str(exc) == "goodbye"
|
||||
|
||||
print '"%012d" % -4 displays "0000000000-4" #15'
|
||||
|
||||
assert "%012d" % -4 == "-00000000004"
|
||||
|
||||
|
||||
print 'Indexing a string with starting slice larger than string length throws StringIndexOutOfBoundsException #19'
|
||||
|
||||
assert "a"[10:] == ""
|
||||
|
||||
print 'Java exception thrown for non-keyword argument following keyword #20'
|
||||
|
||||
def foo(x,y=10): pass
|
||||
|
||||
try:
|
||||
exec("foo(y=20, 30)")
|
||||
raise TestFailed
|
||||
except SyntaxError:
|
||||
pass
|
||||
|
||||
print 'Java field names which conflict with Python reserved words are not renamed #23'
|
||||
|
||||
# In JPython 1.1, the registry entry python.deprecated.keywordMangling sets
|
||||
# whether trailing underscore is still used to `escape' Python keywords when
|
||||
# used as attributes. This is current set to true, but will eventually be
|
||||
# turned to false.
|
||||
assert hasattr(lang.System, 'in_') or hasattr(lang.System, 'in')
|
||||
|
||||
print 'Bad input to __import__ raises a Java exception #27'
|
||||
|
||||
try:
|
||||
__import__("")
|
||||
raise TestFailed
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
print 'xrange implementation is broken for almost any complex case #29'
|
||||
|
||||
assert list(xrange(10)[9:1:-1]) == [9, 8, 7, 6, 5, 4, 3, 2]
|
||||
|
||||
print 'Trying to assign to a method of a Java instance throws a NullPointerException #30'
|
||||
|
||||
from java.awt import Button
|
||||
b = Button()
|
||||
try:
|
||||
b.setLabel = 4
|
||||
raise TestFailed
|
||||
except TypeError:
|
||||
pass
|
||||
|
||||
|
||||
print 'From 1.0.1 to 1.0.2'
|
||||
print 'A threading test'
|
||||
|
||||
from java.lang import Thread
|
||||
|
||||
class TestThread(Thread):
|
||||
def run(self):
|
||||
for i in range(100):
|
||||
exec("x=2+2")
|
||||
print ' finished'
|
||||
|
||||
testers = []
|
||||
for i in range(10):
|
||||
testers.append(TestThread())
|
||||
|
||||
for tester in testers:
|
||||
tester.start()
|
@ -1,57 +0,0 @@
|
||||
import sys
|
||||
import os
|
||||
dir = os.path.dirname(sys.argv[0])
|
||||
scriptsdir = os.path.normpath(os.path.join(dir, os.pardir, 'scripts'))
|
||||
sys.path.append(scriptsdir)
|
||||
from test_support import *
|
||||
|
||||
def test931():
|
||||
'''exec and eval are not thread safe'''
|
||||
|
||||
from java.lang import Thread
|
||||
|
||||
class TestThread(Thread):
|
||||
def run(self):
|
||||
for i in range(30):
|
||||
exec("x=2+2")
|
||||
|
||||
testers = []
|
||||
for i in range(10):
|
||||
testers.append(TestThread())
|
||||
|
||||
for tester in testers:
|
||||
tester.start()
|
||||
|
||||
|
||||
for tester in testers:
|
||||
tester.join()
|
||||
|
||||
code32 = """\
|
||||
def foo():
|
||||
try:
|
||||
2+2
|
||||
finally:
|
||||
return 4
|
||||
"""
|
||||
|
||||
def test32():
|
||||
'return in finally clause causes java.lang.VerifyError at compile time'
|
||||
exec code32
|
||||
|
||||
print 'Bug Fixes'
|
||||
print 'From 1.0.1 to 1.0.2'
|
||||
|
||||
items = locals().items()
|
||||
items.sort()
|
||||
|
||||
errors = 0
|
||||
for name, value in items:
|
||||
if name[:4] == 'test':
|
||||
print value.__doc__+' #'+name[4:]
|
||||
try:
|
||||
value()
|
||||
except:
|
||||
print 'Error!', sys.exc_type, sys.exc_value
|
||||
errors = errors+1
|
||||
|
||||
print errors, 'errors'
|
@ -1,10 +0,0 @@
|
||||
import sys
|
||||
print sys.platform
|
||||
try:
|
||||
try:
|
||||
raise KeyError
|
||||
except KeyError:
|
||||
# no bug
|
||||
print 'Your JVM seems to be working'
|
||||
except:
|
||||
print 'Your JVM seems broken'
|
@ -1,59 +0,0 @@
|
||||
# test of reload -- PR#101 and related PR#128
|
||||
#
|
||||
# javac must be on your $PATH
|
||||
|
||||
import sys
|
||||
import os
|
||||
from java.lang import Runtime, System
|
||||
rt = Runtime.getRuntime()
|
||||
|
||||
# make sure this directory doesn't appear on your CLASSPATH
|
||||
tmpdir = '/tmp' # TBD: Un*xism
|
||||
|
||||
# assert
|
||||
cpath = System.getProperty('java.class.path')
|
||||
for dir in cpath.split(os.pathsep):
|
||||
assert os.path.normpath(dir) <> tmpdir
|
||||
|
||||
sys.path.insert(0, tmpdir)
|
||||
javafile = os.path.join(tmpdir, 'pr101j.java')
|
||||
|
||||
def makejavaclass(s):
|
||||
fp = open(javafile, 'w')
|
||||
fp.write('''
|
||||
// Java side of the PR#101 test -- reload of a Java class
|
||||
public class pr101j {
|
||||
public static String doit() {
|
||||
return "%s";
|
||||
}
|
||||
}
|
||||
''' % s)
|
||||
fp.close()
|
||||
proc = rt.exec('javac ' + javafile)
|
||||
status = proc.waitFor()
|
||||
if status <> 0:
|
||||
raise RuntimeError, 'javac process failed'
|
||||
|
||||
try:
|
||||
makejavaclass("first")
|
||||
import pr101j
|
||||
ret = pr101j.doit()
|
||||
if ret <> 'first':
|
||||
print 'unexpected first doit() result:', ret
|
||||
|
||||
makejavaclass("second")
|
||||
pr101j = reload(pr101j)
|
||||
ret = pr101j.doit()
|
||||
if ret <> 'second':
|
||||
print 'unexpected second doit() result:', ret
|
||||
|
||||
makejavaclass("third")
|
||||
pr101j = reload(pr101j)
|
||||
ret = pr101j.doit()
|
||||
if ret <> 'third':
|
||||
print 'unexpected third doit() result:', ret
|
||||
|
||||
finally:
|
||||
classfile = os.path.splitext(javafile)[0]+'.class'
|
||||
os.unlink(javafile)
|
||||
os.unlink(classfile)
|
@ -1,9 +0,0 @@
|
||||
def parrot(**args):
|
||||
pass
|
||||
|
||||
try:
|
||||
compile("parrot(voltage=5.0, 'expired')", '<string>', 'exec')
|
||||
except SyntaxError:
|
||||
pass
|
||||
else:
|
||||
print 'PR#104 regressed'
|
@ -1,14 +0,0 @@
|
||||
# test for PR#112 -- functions should not have __module__ attributes
|
||||
|
||||
def f():
|
||||
pass
|
||||
|
||||
if hasattr(f, '__module__'):
|
||||
print 'functions should not have __module__ attributes'
|
||||
|
||||
# but make sure classes still do have __module__ attributes
|
||||
class F:
|
||||
pass
|
||||
|
||||
if not hasattr(F, '__module__'):
|
||||
print 'classes should still have __module__ attributes'
|
@ -1,16 +0,0 @@
|
||||
d = {}
|
||||
l = [1]
|
||||
try:
|
||||
d[l] = 2
|
||||
except TypeError:
|
||||
pass
|
||||
else:
|
||||
print 'Should not be able to use a list as a dict key!'
|
||||
|
||||
a = {}
|
||||
try:
|
||||
d[a] = 2
|
||||
except TypeError:
|
||||
pass
|
||||
else:
|
||||
print 'Should not be able to use a dict as a dict key!'
|
@ -1,10 +0,0 @@
|
||||
class foo:
|
||||
def bar():
|
||||
return 'bar'
|
||||
|
||||
try:
|
||||
foo.bar()
|
||||
except TypeError:
|
||||
pass
|
||||
else:
|
||||
print 'unbound method must be called with class instance 1st argument'
|
@ -1,12 +0,0 @@
|
||||
import pr133.test
|
||||
|
||||
name = pr133.test.__name__
|
||||
reload(pr133.test)
|
||||
|
||||
if name <> pr133.test.__name__:
|
||||
print 'Name changed after reload'
|
||||
|
||||
reload(pr133.test)
|
||||
|
||||
if name <> pr133.test.__name__:
|
||||
print 'Name changed after reload'
|
@ -1 +0,0 @@
|
||||
# empty
|
@ -1,2 +0,0 @@
|
||||
def spam():
|
||||
print 'spam'
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user