/
usr
/
lib64
/
python2.6
/
/usr/lib64/python2.6
mkdir
upload
Name
Size
Mode
Actions
bsddb/
-
0755
rm
compiler/
-
0755
rm
config/
-
0755
rm
ctypes/
-
0755
rm
curses/
-
0755
rm
Demo/
-
0755
rm
distutils/
-
0755
rm
Doc/
-
0755
rm
email/
-
0755
rm
encodings/
-
0755
rm
hotshot/
-
0755
rm
idlelib/
-
0755
rm
json/
-
0755
rm
lib-dynload/
-
0755
rm
lib-tk/
-
0755
rm
lib2to3/
-
0755
rm
logging/
-
0755
rm
multiprocessing/
-
0755
rm
plat-linux2/
-
0755
rm
site-packages/
-
0755
rm
sqlite3/
-
0755
rm
test/
-
0755
rm
Tools/
-
0755
rm
wsgiref/
-
0755
rm
xml/
-
0755
rm
abc.py
7034
0644
edit
dl
rm
abc.pyc
6071
0644
edit
dl
rm
abc.pyo
6013
0644
edit
dl
rm
aifc.py
33188
0644
edit
dl
rm
aifc.pyc
29564
0644
edit
dl
rm
aifc.pyo
29564
0644
edit
dl
rm
anydbm.py
2620
0644
edit
dl
rm
anydbm.pyc
2775
0644
edit
dl
rm
anydbm.pyo
2775
0644
edit
dl
rm
ast.py
11347
0644
edit
dl
rm
ast.pyc
12780
0644
edit
dl
rm
ast.pyo
12780
0644
edit
dl
rm
asynchat.py
11402
0644
edit
dl
rm
asynchat.pyc
8737
0644
edit
dl
rm
asynchat.pyo
8737
0644
edit
dl
rm
asyncore.py
20061
0644
edit
dl
rm
asyncore.pyc
18452
0644
edit
dl
rm
asyncore.pyo
18452
0644
edit
dl
rm
atexit.py
1705
0644
edit
dl
rm
atexit.pyc
2215
0644
edit
dl
rm
atexit.pyo
2215
0644
edit
dl
rm
audiodev.py
7597
0644
edit
dl
rm
audiodev.pyc
8537
0644
edit
dl
rm
audiodev.pyo
8537
0644
edit
dl
rm
base64.py
11335
0755
edit
dl
rm
base64.pyc
11003
0644
edit
dl
rm
base64.pyo
11003
0644
edit
dl
rm
BaseHTTPServer.py
21974
0644
edit
dl
rm
BaseHTTPServer.pyc
21575
0644
edit
dl
rm
BaseHTTPServer.pyo
21575
0644
edit
dl
rm
Bastion.py
5744
0644
edit
dl
rm
Bastion.pyc
6667
0644
edit
dl
rm
Bastion.pyo
6667
0644
edit
dl
rm
bdb.py
20597
0644
edit
dl
rm
bdb.pyc
18567
0644
edit
dl
rm
bdb.pyo
18567
0644
edit
dl
rm
binhex.py
14878
0644
edit
dl
rm
binhex.pyc
15875
0644
edit
dl
rm
binhex.pyo
15875
0644
edit
dl
rm
bisect.py
2662
0644
edit
dl
rm
bisect.pyc
3173
0644
edit
dl
rm
bisect.pyo
3173
0644
edit
dl
rm
calendar.py
23110
0644
edit
dl
rm
calendar.pyc
28165
0644
edit
dl
rm
calendar.pyo
28165
0644
edit
dl
rm
cgi.py
34478
0755
edit
dl
rm
cgi.pyc
32818
0644
edit
dl
rm
cgi.pyo
32818
0644
edit
dl
rm
CGIHTTPServer.py
12773
0644
edit
dl
rm
CGIHTTPServer.pyc
10820
0644
edit
dl
rm
CGIHTTPServer.pyo
10820
0644
edit
dl
rm
cgitb.py
12155
0644
edit
dl
rm
cgitb.pyc
12461
0644
edit
dl
rm
cgitb.pyo
12461
0644
edit
dl
rm
chunk.py
5372
0644
edit
dl
rm
chunk.pyc
5645
0644
edit
dl
rm
chunk.pyo
5645
0644
edit
dl
rm
cmd.py
14962
0644
edit
dl
rm
cmd.pyc
13954
0644
edit
dl
rm
cmd.pyo
13954
0644
edit
dl
rm
code.py
10217
0644
edit
dl
rm
code.pyc
10427
0644
edit
dl
rm
code.pyo
10427
0644
edit
dl
rm
codecs.py
35266
0644
edit
dl
rm
codecs.pyc
36721
0644
edit
dl
rm
codecs.pyo
36721
0644
edit
dl
rm
codeop.py
5999
0644
edit
dl
rm
codeop.pyc
6636
0644
edit
dl
rm
codeop.pyo
6636
0644
edit
dl
rm
collections.py
13730
0644
edit
dl
rm
collections.pyc
14462
0644
edit
dl
rm
collections.pyo
14409
0644
edit
dl
rm
colorsys.py
3459
0644
edit
dl
rm
colorsys.pyc
4041
0644
edit
dl
rm
colorsys.pyo
4041
0644
edit
dl
rm
commands.py
2543
0644
edit
dl
rm
commands.pyc
2489
0644
edit
dl
rm
commands.pyo
2489
0644
edit
dl
rm
compileall.py
5285
0644
edit
dl
rm
compileall.pyc
4997
0644
edit
dl
rm
compileall.pyo
4997
0644
edit
dl
rm
ConfigParser.py
25989
0644
edit
dl
rm
ConfigParser.pyc
23865
0644
edit
dl
rm
ConfigParser.pyo
23865
0644
edit
dl
rm
contextlib.py
4136
0644
edit
dl
rm
contextlib.pyc
4151
0644
edit
dl
rm
contextlib.pyo
4151
0644
edit
dl
rm
Cookie.py
25054
0644
edit
dl
rm
Cookie.pyc
22145
0644
edit
dl
rm
Cookie.pyo
22145
0644
edit
dl
rm
cookielib.py
64726
0644
edit
dl
rm
cookielib.pyc
55370
0644
edit
dl
rm
cookielib.pyo
55179
0644
edit
dl
rm
copy.py
11177
0644
edit
dl
rm
copy.pyc
11675
0644
edit
dl
rm
copy.pyo
11579
0644
edit
dl
rm
copy_reg.py
6800
0644
edit
dl
rm
copy_reg.pyc
5178
0644
edit
dl
rm
copy_reg.pyo
5132
0644
edit
dl
rm
cProfile.py
6337
0755
edit
dl
rm
cProfile.pyc
6239
0644
edit
dl
rm
cProfile.pyo
6239
0644
edit
dl
rm
crypt.py
2229
0644
edit
dl
rm
crypt.pyc
3055
0644
edit
dl
rm
crypt.pyo
3055
0644
edit
dl
rm
csv.py
15730
0644
edit
dl
rm
csv.pyc
13226
0644
edit
dl
rm
csv.pyo
13226
0644
edit
dl
rm
dbhash.py
535
0644
edit
dl
rm
dbhash.pyc
760
0644
edit
dl
rm
dbhash.pyo
760
0644
edit
dl
rm
decimal.py
199273
0644
edit
dl
rm
decimal.pyc
155681
0644
edit
dl
rm
decimal.pyo
155615
0644
edit
dl
rm
difflib.py
81080
0644
edit
dl
rm
difflib.pyc
61193
0644
edit
dl
rm
difflib.pyo
61139
0644
edit
dl
rm
dircache.py
1126
0644
edit
dl
rm
dircache.pyc
1584
0644
edit
dl
rm
dircache.pyo
1584
0644
edit
dl
rm
dis.py
6449
0644
edit
dl
rm
dis.pyc
6366
0644
edit
dl
rm
dis.pyo
6366
0644
edit
dl
rm
doctest.py
101516
0644
edit
dl
rm
doctest.pyc
80994
0644
edit
dl
rm
doctest.pyo
80706
0644
edit
dl
rm
DocXMLRPCServer.py
10599
0644
edit
dl
rm
DocXMLRPCServer.pyc
9957
0644
edit
dl
rm
DocXMLRPCServer.pyo
9849
0644
edit
dl
rm
dumbdbm.py
8820
0644
edit
dl
rm
dumbdbm.pyc
6585
0644
edit
dl
rm
dumbdbm.pyo
6585
0644
edit
dl
rm
dummy_thread.py
4418
0644
edit
dl
rm
dummy_thread.pyc
5413
0644
edit
dl
rm
dummy_thread.pyo
5413
0644
edit
dl
rm
dummy_threading.py
2804
0644
edit
dl
rm
dummy_threading.pyc
1297
0644
edit
dl
rm
dummy_threading.pyo
1297
0644
edit
dl
rm
filecmp.py
9470
0644
edit
dl
rm
filecmp.pyc
9632
0644
edit
dl
rm
filecmp.pyo
9632
0644
edit
dl
rm
fileinput.py
14143
0644
edit
dl
rm
fileinput.pyc
14928
0644
edit
dl
rm
fileinput.pyo
14928
0644
edit
dl
rm
fnmatch.py
3239
0644
edit
dl
rm
fnmatch.pyc
3579
0644
edit
dl
rm
fnmatch.pyo
3579
0644
edit
dl
rm
formatter.py
14911
0644
edit
dl
rm
formatter.pyc
19303
0644
edit
dl
rm
formatter.pyo
19303
0644
edit
dl
rm
fpformat.py
4699
0644
edit
dl
rm
fpformat.pyc
4735
0644
edit
dl
rm
fpformat.pyo
4735
0644
edit
dl
rm
fractions.py
20073
0644
edit
dl
rm
fractions.pyc
18119
0644
edit
dl
rm
fractions.pyo
18119
0644
edit
dl
rm
ftplib.py
29197
0644
edit
dl
rm
ftplib.pyc
28503
0644
edit
dl
rm
ftplib.pyo
28503
0644
edit
dl
rm
functools.py
2162
0644
edit
dl
rm
functools.pyc
1927
0644
edit
dl
rm
functools.pyo
1927
0644
edit
dl
rm
genericpath.py
3020
0644
edit
dl
rm
genericpath.pyc
3292
0644
edit
dl
rm
genericpath.pyo
3292
0644
edit
dl
rm
getopt.py
7328
0644
edit
dl
rm
getopt.pyc
6730
0644
edit
dl
rm
getopt.pyo
6683
0644
edit
dl
rm
getpass.py
5534
0644
edit
dl
rm
getpass.pyc
4754
0644
edit
dl
rm
getpass.pyo
4754
0644
edit
dl
rm
gettext.py
19968
0644
edit
dl
rm
gettext.pyc
15760
0644
edit
dl
rm
gettext.pyo
15760
0644
edit
dl
rm
glob.py
2249
0644
edit
dl
rm
glob.pyc
2409
0644
edit
dl
rm
glob.pyo
2409
0644
edit
dl
rm
gzip.py
16754
0644
edit
dl
rm
gzip.pyc
14386
0644
edit
dl
rm
gzip.pyo
14386
0644
edit
dl
rm
hashlib.py
4427
0644
edit
dl
rm
hashlib.pyc
3981
0644
edit
dl
rm
hashlib.pyo
3981
0644
edit
dl
rm
heapq.py
15995
0644
edit
dl
rm
heapq.pyc
12694
0644
edit
dl
rm
heapq.pyo
12694
0644
edit
dl
rm
hmac.py
4531
0644
edit
dl
rm
hmac.pyc
4509
0644
edit
dl
rm
hmac.pyo
4509
0644
edit
dl
rm
htmlentitydefs.py
18054
0644
edit
dl
rm
htmlentitydefs.pyc
6371
0644
edit
dl
rm
htmlentitydefs.pyo
6371
0644
edit
dl
rm
htmllib.py
12869
0644
edit
dl
rm
htmllib.pyc
20384
0644
edit
dl
rm
htmllib.pyo
20384
0644
edit
dl
rm
HTMLParser.py
13576
0644
edit
dl
rm
HTMLParser.pyc
12258
0644
edit
dl
rm
HTMLParser.pyo
11950
0644
edit
dl
rm
httplib.py
48797
0644
edit
dl
rm
httplib.pyc
37732
0644
edit
dl
rm
httplib.pyo
37536
0644
edit
dl
rm
ihooks.py
17452
0644
edit
dl
rm
ihooks.pyc
20837
0644
edit
dl
rm
ihooks.pyo
20758
0644
edit
dl
rm
imaplib.py
47771
0644
edit
dl
rm
imaplib.pyc
45225
0644
edit
dl
rm
imaplib.pyo
42475
0644
edit
dl
rm
imghdr.py
3544
0644
edit
dl
rm
imghdr.pyc
4905
0644
edit
dl
rm
imghdr.pyo
4905
0644
edit
dl
rm
imputil.py
26009
0644
edit
dl
rm
imputil.pyc
16037
0644
edit
dl
rm
imputil.pyo
15865
0644
edit
dl
rm
inspect.py
38189
0644
edit
dl
rm
inspect.pyc
37165
0644
edit
dl
rm
inspect.pyo
37165
0644
edit
dl
rm
io.py
66165
0644
edit
dl
rm
io.pyc
63042
0644
edit
dl
rm
io.pyo
63042
0644
edit
dl
rm
keyword.py
1997
0755
edit
dl
rm
keyword.pyc
2117
0644
edit
dl
rm
keyword.pyo
2117
0644
edit
dl
rm
linecache.py
4128
0644
edit
dl
rm
linecache.pyc
3268
0644
edit
dl
rm
linecache.pyo
3268
0644
edit
dl
rm
locale.py
82674
0644
edit
dl
rm
locale.pyc
46676
0644
edit
dl
rm
locale.pyo
46676
0644
edit
dl
rm
macpath.py
6253
0644
edit
dl
rm
macpath.pyc
7707
0644
edit
dl
rm
macpath.pyo
7707
0644
edit
dl
rm
macurl2path.py
3275
0644
edit
dl
rm
macurl2path.pyc
2825
0644
edit
dl
rm
macurl2path.pyo
2825
0644
edit
dl
rm
mailbox.py
75824
0644
edit
dl
rm
mailbox.pyc
76069
0644
edit
dl
rm
mailbox.pyo
76020
0644
edit
dl
rm
mailcap.py
8402
0644
edit
dl
rm
mailcap.pyc
8079
0644
edit
dl
rm
mailcap.pyo
8079
0644
edit
dl
rm
markupbase.py
14350
0644
edit
dl
rm
markupbase.pyc
9464
0644
edit
dl
rm
markupbase.pyo
9270
0644
edit
dl
rm
md5.py
410
0644
edit
dl
rm
md5.pyc
378
0644
edit
dl
rm
md5.pyo
378
0644
edit
dl
rm
mhlib.py
33434
0644
edit
dl
rm
mhlib.pyc
34137
0644
edit
dl
rm
mhlib.pyo
34137
0644
edit
dl
rm
mimetools.py
7168
0644
edit
dl
rm
mimetools.pyc
8320
0644
edit
dl
rm
mimetools.pyo
8320
0644
edit
dl
rm
mimetypes.py
18822
0644
edit
dl
rm
mimetypes.pyc
16872
0644
edit
dl
rm
mimetypes.pyo
16872
0644
edit
dl
rm
MimeWriter.py
6482
0644
edit
dl
rm
MimeWriter.pyc
7383
0644
edit
dl
rm
MimeWriter.pyo
7383
0644
edit
dl
rm
mimify.py
15024
0755
edit
dl
rm
mimify.pyc
12219
0644
edit
dl
rm
mimify.pyo
12219
0644
edit
dl
rm
modulefinder.py
24283
0644
edit
dl
rm
modulefinder.pyc
19007
0644
edit
dl
rm
modulefinder.pyo
18919
0644
edit
dl
rm
multifile.py
4820
0644
edit
dl
rm
multifile.pyc
5479
0644
edit
dl
rm
multifile.pyo
5435
0644
edit
dl
rm
mutex.py
1866
0644
edit
dl
rm
mutex.pyc
2526
0644
edit
dl
rm
mutex.pyo
2526
0644
edit
dl
rm
netrc.py
4111
0644
edit
dl
rm
netrc.pyc
3602
0644
edit
dl
rm
netrc.pyo
3602
0644
edit
dl
rm
new.py
706
0644
edit
dl
rm
new.pyc
910
0644
edit
dl
rm
new.pyo
910
0644
edit
dl
rm
nntplib.py
21470
0644
edit
dl
rm
nntplib.pyc
21179
0644
edit
dl
rm
nntplib.pyo
21179
0644
edit
dl
rm
ntpath.py
17752
0644
edit
dl
rm
ntpath.pyc
11620
0644
edit
dl
rm
ntpath.pyo
11573
0644
edit
dl
rm
nturl2path.py
2239
0644
edit
dl
rm
nturl2path.pyc
1777
0644
edit
dl
rm
nturl2path.pyo
1777
0644
edit
dl
rm
numbers.py
10271
0644
edit
dl
rm
numbers.pyc
13964
0644
edit
dl
rm
numbers.pyo
13964
0644
edit
dl
rm
opcode.py
5248
0644
edit
dl
rm
opcode.pyc
5917
0644
edit
dl
rm
opcode.pyo
5917
0644
edit
dl
rm
optparse.py
60849
0644
edit
dl
rm
optparse.pyc
54239
0644
edit
dl
rm
optparse.pyo
54157
0644
edit
dl
rm
ordereddict.py
36
0644
edit
dl
rm
ordereddict.pyc
185
0644
edit
dl
rm
ordereddict.pyo
185
0644
edit
dl
rm
os.py
25802
0644
edit
dl
rm
os.pyc
25808
0644
edit
dl
rm
os.pyo
25808
0644
edit
dl
rm
os2emxpath.py
4603
0644
edit
dl
rm
os2emxpath.pyc
4536
0644
edit
dl
rm
os2emxpath.pyo
4536
0644
edit
dl
rm
pdb.doc
7899
0644
edit
dl
rm
pdb.py
45333
0755
edit
dl
rm
pdb.pyc
43813
0644
edit
dl
rm
pdb.pyo
43813
0644
edit
dl
rm
pickle.py
44811
0644
edit
dl
rm
pickle.pyc
38645
0644
edit
dl
rm
pickle.pyo
38440
0644
edit
dl
rm
pickletools.py
74348
0644
edit
dl
rm
pickletools.pyc
57143
0644
edit
dl
rm
pickletools.pyo
56246
0644
edit
dl
rm
pipes.py
9647
0644
edit
dl
rm
pipes.pyc
9460
0644
edit
dl
rm
pipes.pyo
9460
0644
edit
dl
rm
pkgutil.py
20001
0644
edit
dl
rm
pkgutil.pyc
19020
0644
edit
dl
rm
pkgutil.pyo
19020
0644
edit
dl
rm
platform.py
52630
0755
edit
dl
rm
platform.pyc
38797
0644
edit
dl
rm
platform.pyo
38797
0644
edit
dl
rm
plistlib.py
15806
0644
edit
dl
rm
plistlib.pyc
20050
0644
edit
dl
rm
plistlib.pyo
19960
0644
edit
dl
rm
popen2.py
8416
0644
edit
dl
rm
popen2.pyc
9064
0644
edit
dl
rm
popen2.pyo
9020
0644
edit
dl
rm
poplib.py
12825
0644
edit
dl
rm
poplib.pyc
13418
0644
edit
dl
rm
poplib.pyo
13418
0644
edit
dl
rm
posixfile.py
8003
0644
edit
dl
rm
posixfile.pyc
7724
0644
edit
dl
rm
posixfile.pyo
7724
0644
edit
dl
rm
posixpath.py
13119
0644
edit
dl
rm
posixpath.pyc
11188
0644
edit
dl
rm
posixpath.pyo
11188
0644
edit
dl
rm
pprint.py
11932
0644
edit
dl
rm
pprint.pyc
10394
0644
edit
dl
rm
pprint.pyo
10219
0644
edit
dl
rm
profile.py
23510
0755
edit
dl
rm
profile.pyc
16680
0644
edit
dl
rm
profile.pyo
16435
0644
edit
dl
rm
pstats.py
27310
0644
edit
dl
rm
pstats.pyc
25340
0644
edit
dl
rm
pstats.pyo
25340
0644
edit
dl
rm
pty.py
4869
0644
edit
dl
rm
pty.pyc
4919
0644
edit
dl
rm
pty.pyo
4919
0644
edit
dl
rm
pyclbr.py
13282
0644
edit
dl
rm
pyclbr.pyc
9732
0644
edit
dl
rm
pyclbr.pyo
9732
0644
edit
dl
rm
pydoc.py
92432
0755
edit
dl
rm
pydoc.pyc
91052
0644
edit
dl
rm
pydoc.pyo
90984
0644
edit
dl
rm
pydoc_topics.py
423126
0644
edit
dl
rm
pydoc_topics.pyc
407588
0644
edit
dl
rm
pydoc_topics.pyo
407588
0644
edit
dl
rm
py_compile.py
5633
0644
edit
dl
rm
py_compile.pyc
6554
0644
edit
dl
rm
py_compile.pyo
6554
0644
edit
dl
rm
Queue.py
8574
0644
edit
dl
rm
Queue.pyc
9447
0644
edit
dl
rm
Queue.pyo
9447
0644
edit
dl
rm
quopri.py
6972
0755
edit
dl
rm
quopri.pyc
6688
0644
edit
dl
rm
quopri.pyo
6688
0644
edit
dl
rm
random.py
31966
0644
edit
dl
rm
random.pyc
25106
0644
edit
dl
rm
random.pyo
25106
0644
edit
dl
rm
re.py
12966
0644
edit
dl
rm
re.pyc
13164
0644
edit
dl
rm
re.pyo
13164
0644
edit
dl
rm
repr.py
4296
0644
edit
dl
rm
repr.pyc
5434
0644
edit
dl
rm
repr.pyo
5434
0644
edit
dl
rm
rexec.py
20152
0644
edit
dl
rm
rexec.pyc
24220
0644
edit
dl
rm
rexec.pyo
24220
0644
edit
dl
rm
rfc822.py
33295
0644
edit
dl
rm
rfc822.pyc
32110
0644
edit
dl
rm
rfc822.pyo
32110
0644
edit
dl
rm
rlcompleter.py
5866
0644
edit
dl
rm
rlcompleter.pyc
6073
0644
edit
dl
rm
rlcompleter.pyo
6073
0644
edit
dl
rm
robotparser.py
7014
0644
edit
dl
rm
robotparser.pyc
7852
0644
edit
dl
rm
robotparser.pyo
7852
0644
edit
dl
rm
runpy.py
5413
0644
edit
dl
rm
runpy.pyc
3979
0644
edit
dl
rm
runpy.pyo
3979
0644
edit
dl
rm
sched.py
5091
0644
edit
dl
rm
sched.pyc
5005
0644
edit
dl
rm
sched.pyo
5005
0644
edit
dl
rm
sets.py
19050
0644
edit
dl
rm
sets.pyc
16997
0644
edit
dl
rm
sets.pyo
16997
0644
edit
dl
rm
sgmllib.py
17884
0644
edit
dl
rm
sgmllib.pyc
15598
0644
edit
dl
rm
sgmllib.pyo
15598
0644
edit
dl
rm
sha.py
445
0644
edit
dl
rm
sha.pyc
421
0644
edit
dl
rm
sha.pyo
421
0644
edit
dl
rm
shelve.py
8078
0644
edit
dl
rm
shelve.pyc
10296
0644
edit
dl
rm
shelve.pyo
10296
0644
edit
dl
rm
shlex.py
11137
0644
edit
dl
rm
shlex.pyc
7710
0644
edit
dl
rm
shlex.pyo
7710
0644
edit
dl
rm
shutil.py
8632
0644
edit
dl
rm
shutil.pyc
9555
0644
edit
dl
rm
shutil.pyo
9555
0644
edit
dl
rm
SimpleHTTPServer.py
7422
0644
edit
dl
rm
SimpleHTTPServer.pyc
7766
0644
edit
dl
rm
SimpleHTTPServer.pyo
7766
0644
edit
dl
rm
SimpleXMLRPCServer.py
21992
0644
edit
dl
rm
SimpleXMLRPCServer.pyc
19633
0644
edit
dl
rm
SimpleXMLRPCServer.pyo
19633
0644
edit
dl
rm
site.py
19187
0644
edit
dl
rm
site.pyc
18825
0644
edit
dl
rm
site.pyo
18825
0644
edit
dl
rm
smtpd.py
18920
0755
edit
dl
rm
smtpd.pyc
16188
0644
edit
dl
rm
smtpd.pyo
16188
0644
edit
dl
rm
smtplib.py
30924
0755
edit
dl
rm
smtplib.pyc
29737
0644
edit
dl
rm
smtplib.pyo
29737
0644
edit
dl
rm
sndhdr.py
5973
0644
edit
dl
rm
sndhdr.pyc
7420
0644
edit
dl
rm
sndhdr.pyo
7420
0644
edit
dl
rm
socket.py
20149
0644
edit
dl
rm
socket.pyc
16129
0644
edit
dl
rm
socket.pyo
16044
0644
edit
dl
rm
SocketServer.py
22326
0644
edit
dl
rm
SocketServer.pyc
23143
0644
edit
dl
rm
SocketServer.pyo
23143
0644
edit
dl
rm
sre.py
384
0644
edit
dl
rm
sre.pyc
519
0644
edit
dl
rm
sre.pyo
519
0644
edit
dl
rm
sre_compile.py
16507
0644
edit
dl
rm
sre_compile.pyc
11483
0644
edit
dl
rm
sre_compile.pyo
11370
0644
edit
dl
rm
sre_constants.py
7137
0644
edit
dl
rm
sre_constants.pyc
6093
0644
edit
dl
rm
sre_constants.pyo
6093
0644
edit
dl
rm
sre_parse.py
26878
0644
edit
dl
rm
sre_parse.pyc
19696
0644
edit
dl
rm
sre_parse.pyo
19696
0644
edit
dl
rm
ssl.py
16677
0644
edit
dl
rm
ssl.pyc
14276
0644
edit
dl
rm
ssl.pyo
14276
0644
edit
dl
rm
stat.py
1718
0644
edit
dl
rm
stat.pyc
2703
0644
edit
dl
rm
stat.pyo
2703
0644
edit
dl
rm
statvfs.py
898
0644
edit
dl
rm
statvfs.pyc
620
0644
edit
dl
rm
statvfs.pyo
620
0644
edit
dl
rm
string.py
20745
0644
edit
dl
rm
string.pyc
20066
0644
edit
dl
rm
string.pyo
20066
0644
edit
dl
rm
StringIO.py
10621
0644
edit
dl
rm
StringIO.pyc
11532
0644
edit
dl
rm
StringIO.pyo
11532
0644
edit
dl
rm
stringold.py
12449
0644
edit
dl
rm
stringold.pyc
12593
0644
edit
dl
rm
stringold.pyo
12593
0644
edit
dl
rm
stringprep.py
13522
0644
edit
dl
rm
stringprep.pyc
14526
0644
edit
dl
rm
stringprep.pyo
14452
0644
edit
dl
rm
struct.py
82
0644
edit
dl
rm
struct.pyc
239
0644
edit
dl
rm
struct.pyo
239
0644
edit
dl
rm
subprocess.py
57945
0644
edit
dl
rm
subprocess.pyc
41071
0644
edit
dl
rm
subprocess.pyo
41014
0644
edit
dl
rm
sunau.py
16537
0644
edit
dl
rm
sunau.pyc
18072
0644
edit
dl
rm
sunau.pyo
18072
0644
edit
dl
rm
sunaudio.py
1399
0644
edit
dl
rm
sunaudio.pyc
1997
0644
edit
dl
rm
sunaudio.pyo
1997
0644
edit
dl
rm
symbol.py
2050
0755
edit
dl
rm
symbol.pyc
3025
0644
edit
dl
rm
symbol.pyo
3025
0644
edit
dl
rm
symtable.py
7911
0644
edit
dl
rm
symtable.pyc
12609
0644
edit
dl
rm
symtable.pyo
12479
0644
edit
dl
rm
tabnanny.py
11339
0755
edit
dl
rm
tabnanny.pyc
8333
0644
edit
dl
rm
tabnanny.pyo
8333
0644
edit
dl
rm
tarfile.py
87786
0644
edit
dl
rm
tarfile.pyc
73922
0644
edit
dl
rm
tarfile.pyo
73922
0644
edit
dl
rm
telnetlib.py
21808
0644
edit
dl
rm
telnetlib.pyc
19913
0644
edit
dl
rm
telnetlib.pyo
19913
0644
edit
dl
rm
tempfile.py
17774
0644
edit
dl
rm
tempfile.pyc
19571
0644
edit
dl
rm
tempfile.pyo
19571
0644
edit
dl
rm
textwrap.py
16889
0644
edit
dl
rm
textwrap.pyc
11792
0644
edit
dl
rm
textwrap.pyo
11700
0644
edit
dl
rm
this.py
1002
0644
edit
dl
rm
this.pyc
1241
0644
edit
dl
rm
this.pyo
1241
0644
edit
dl
rm
threading.py
31808
0644
edit
dl
rm
threading.pyc
28152
0644
edit
dl
rm
threading.pyo
26080
0644
edit
dl
rm
timeit.py
12003
0644
edit
dl
rm
timeit.pyc
11827
0644
edit
dl
rm
timeit.pyo
11827
0644
edit
dl
rm
toaiff.py
3142
0644
edit
dl
rm
toaiff.pyc
3134
0644
edit
dl
rm
toaiff.pyo
3134
0644
edit
dl
rm
token.py
2947
0755
edit
dl
rm
token.pyc
3840
0644
edit
dl
rm
token.pyo
3840
0644
edit
dl
rm
tokenize.py
16326
0644
edit
dl
rm
tokenize.pyc
14018
0644
edit
dl
rm
tokenize.pyo
13925
0644
edit
dl
rm
trace.py
30325
0644
edit
dl
rm
trace.pyc
23051
0644
edit
dl
rm
trace.pyo
22989
0644
edit
dl
rm
traceback.py
11211
0644
edit
dl
rm
traceback.pyc
11677
0644
edit
dl
rm
traceback.pyo
11677
0644
edit
dl
rm
tty.py
879
0644
edit
dl
rm
tty.pyc
1317
0644
edit
dl
rm
tty.pyo
1317
0644
edit
dl
rm
types.py
2323
0644
edit
dl
rm
types.pyc
2620
0644
edit
dl
rm
types.pyo
2620
0644
edit
dl
rm
unittest.py
31157
0644
edit
dl
rm
unittest.pyc
34862
0644
edit
dl
rm
unittest.pyo
34862
0644
edit
dl
rm
urllib.py
59022
0644
edit
dl
rm
urllib.pyc
51348
0644
edit
dl
rm
urllib.pyo
51254
0644
edit
dl
rm
urllib2.py
50866
0644
edit
dl
rm
urllib2.pyc
45813
0644
edit
dl
rm
urllib2.pyo
45719
0644
edit
dl
rm
urlparse.py
15618
0644
edit
dl
rm
urlparse.pyc
14777
0644
edit
dl
rm
urlparse.pyo
14777
0644
edit
dl
rm
user.py
1627
0644
edit
dl
rm
user.pyc
1736
0644
edit
dl
rm
user.pyo
1736
0644
edit
dl
rm
UserDict.py
5778
0644
edit
dl
rm
UserDict.pyc
8892
0644
edit
dl
rm
UserDict.pyo
8892
0644
edit
dl
rm
UserList.py
3644
0644
edit
dl
rm
UserList.pyc
6603
0644
edit
dl
rm
UserList.pyo
6603
0644
edit
dl
rm
UserString.py
9691
0755
edit
dl
rm
UserString.pyc
14922
0644
edit
dl
rm
UserString.pyo
14922
0644
edit
dl
rm
uu.py
5942
0755
edit
dl
rm
uu.pyc
4237
0644
edit
dl
rm
uu.pyo
4237
0644
edit
dl
rm
uuid.py
20944
0644
edit
dl
rm
uuid.pyc
21279
0644
edit
dl
rm
uuid.pyo
21279
0644
edit
dl
rm
warnings.py
14172
0644
edit
dl
rm
warnings.pyc
13042
0644
edit
dl
rm
warnings.pyo
12205
0644
edit
dl
rm
wave.py
17952
0644
edit
dl
rm
wave.pyc
19436
0644
edit
dl
rm
wave.pyo
19436
0644
edit
dl
rm
weakref.py
10087
0644
edit
dl
rm
weakref.pyc
13375
0644
edit
dl
rm
weakref.pyo
13375
0644
edit
dl
rm
webbrowser.py
21073
0644
edit
dl
rm
webbrowser.pyc
18755
0644
edit
dl
rm
webbrowser.pyo
18708
0644
edit
dl
rm
whichdb.py
3353
0644
edit
dl
rm
whichdb.pyc
2247
0644
edit
dl
rm
whichdb.pyo
2247
0644
edit
dl
rm
xdrlib.py
5513
0644
edit
dl
rm
xdrlib.pyc
9157
0644
edit
dl
rm
xdrlib.pyo
9157
0644
edit
dl
rm
xmllib.py
34865
0644
edit
dl
rm
xmllib.pyc
27274
0644
edit
dl
rm
xmllib.pyo
27274
0644
edit
dl
rm
xmlrpclib.py
47775
0644
edit
dl
rm
xmlrpclib.pyc
41496
0644
edit
dl
rm
xmlrpclib.pyo
41313
0644
edit
dl
rm
zipfile.py
53092
0644
edit
dl
rm
zipfile.pyc
37652
0644
edit
dl
rm
zipfile.pyo
37652
0644
edit
dl
rm
_abcoll.py
14242
0644
edit
dl
rm
_abcoll.pyc
21591
0644
edit
dl
rm
_abcoll.pyo
21591
0644
edit
dl
rm
_LWPCookieJar.py
6553
0644
edit
dl
rm
_LWPCookieJar.pyc
5601
0644
edit
dl
rm
_LWPCookieJar.pyo
5601
0644
edit
dl
rm
_MozillaCookieJar.py
5809
0644
edit
dl
rm
_MozillaCookieJar.pyc
4517
0644
edit
dl
rm
_MozillaCookieJar.pyo
4476
0644
edit
dl
rm
_strptime.py
19754
0644
edit
dl
rm
_strptime.pyc
14966
0644
edit
dl
rm
_strptime.pyo
14966
0644
edit
dl
rm
_threading_local.py
7114
0644
edit
dl
rm
_threading_local.pyc
6385
0644
edit
dl
rm
_threading_local.pyo
6385
0644
edit
dl
rm
__future__.py
4380
0644
edit
dl
rm
__future__.pyc
4233
0644
edit
dl
rm
__future__.pyo
4233
0644
edit
dl
rm
__phello__.foo.py
64
0644
edit
dl
rm
__phello__.foo.pyc
125
0644
edit
dl
rm
__phello__.foo.pyo
125
0644
edit
dl
rm
Edit:
/usr/lib64/python2.6/rfc822.py
(33295B)
"""RFC 2822 message manipulation. Note: This is only a very rough sketch of a full RFC-822 parser; in particular the tokenizing of addresses does not adhere to all the quoting rules. Note: RFC 2822 is a long awaited update to RFC 822. This module should conform to RFC 2822, and is thus mis-named (it's not worth renaming it). Some effort at RFC 2822 updates have been made, but a thorough audit has not been performed. Consider any RFC 2822 non-conformance to be a bug. RFC 2822: http://www.faqs.org/rfcs/rfc2822.html RFC 822 : http://www.faqs.org/rfcs/rfc822.html (obsolete) Directions for use: To create a Message object: first open a file, e.g.: fp = open(file, 'r') You can use any other legal way of getting an open file object, e.g. use sys.stdin or call os.popen(). Then pass the open file object to the Message() constructor: m = Message(fp) This class can work with any input object that supports a readline method. If the input object has seek and tell capability, the rewindbody method will work; also illegal lines will be pushed back onto the input stream. If the input object lacks seek but has an `unread' method that can push back a line of input, Message will use that to push back illegal lines. Thus this class can be used to parse messages coming from a buffered stream. The optional `seekable' argument is provided as a workaround for certain stdio libraries in which tell() discards buffered data before discovering that the lseek() system call doesn't work. For maximum portability, you should set the seekable argument to zero to prevent that initial \code{tell} when passing in an unseekable object such as a a file object created from a socket object. If it is 1 on entry -- which it is by default -- the tell() method of the open file object is called once; if this raises an exception, seekable is reset to 0. For other nonzero values of seekable, this test is not made. To get the text of a particular header there are several methods: str = m.getheader(name) str = m.getrawheader(name) where name is the name of the header, e.g. 'Subject'. The difference is that getheader() strips the leading and trailing whitespace, while getrawheader() doesn't. Both functions retain embedded whitespace (including newlines) exactly as they are specified in the header, and leave the case of the text unchanged. For addresses and address lists there are functions realname, mailaddress = m.getaddr(name) list = m.getaddrlist(name) where the latter returns a list of (realname, mailaddr) tuples. There is also a method time = m.getdate(name) which parses a Date-like field and returns a time-compatible tuple, i.e. a tuple such as returned by time.localtime() or accepted by time.mktime(). See the class definition for lower level access methods. There are also some utility functions here. """ # Cleanup and extensions by Eric S. Raymond <esr@thyrsus.com> import time from warnings import warnpy3k warnpy3k("in 3.x, rfc822 has been removed in favor of the email package", stacklevel=2) __all__ = ["Message","AddressList","parsedate","parsedate_tz","mktime_tz"] _blanklines = ('\r\n', '\n') # Optimization for islast() class Message: """Represents a single RFC 2822-compliant message.""" def __init__(self, fp, seekable = 1): """Initialize the class instance and read the headers.""" if seekable == 1: # Exercise tell() to make sure it works # (and then assume seek() works, too) try: fp.tell() except (AttributeError, IOError): seekable = 0 self.fp = fp self.seekable = seekable self.startofheaders = None self.startofbody = None # if self.seekable: try: self.startofheaders = self.fp.tell() except IOError: self.seekable = 0 # self.readheaders() # if self.seekable: try: self.startofbody = self.fp.tell() except IOError: self.seekable = 0 def rewindbody(self): """Rewind the file to the start of the body (if seekable).""" if not self.seekable: raise IOError, "unseekable file" self.fp.seek(self.startofbody) def readheaders(self): """Read header lines. Read header lines up to the entirely blank line that terminates them. The (normally blank) line that ends the headers is skipped, but not included in the returned list. If a non-header line ends the headers, (which is an error), an attempt is made to backspace over it; it is never included in the returned list. The variable self.status is set to the empty string if all went well, otherwise it is an error message. The variable self.headers is a completely uninterpreted list of lines contained in the header (so printing them will reproduce the header exactly as it appears in the file). """ self.dict = {} self.unixfrom = '' self.headers = lst = [] self.status = '' headerseen = "" firstline = 1 startofline = unread = tell = None if hasattr(self.fp, 'unread'): unread = self.fp.unread elif self.seekable: tell = self.fp.tell while 1: if tell: try: startofline = tell() except IOError: startofline = tell = None self.seekable = 0 line = self.fp.readline() if not line: self.status = 'EOF in headers' break # Skip unix From name time lines if firstline and line.startswith('From '): self.unixfrom = self.unixfrom + line continue firstline = 0 if headerseen and line[0] in ' \t': # It's a continuation line. lst.append(line) x = (self.dict[headerseen] + "\n " + line.strip()) self.dict[headerseen] = x.strip() continue elif self.iscomment(line): # It's a comment. Ignore it. continue elif self.islast(line): # Note! No pushback here! The delimiter line gets eaten. break headerseen = self.isheader(line) if headerseen: # It's a legal header line, save it. lst.append(line) self.dict[headerseen] = line[len(headerseen)+1:].strip() continue else: # It's not a header line; throw it back and stop here. if not self.dict: self.status = 'No headers' else: self.status = 'Non-header line where header expected' # Try to undo the read. if unread: unread(line) elif tell: self.fp.seek(startofline) else: self.status = self.status + '; bad seek' break def isheader(self, line): """Determine whether a given line is a legal header. This method should return the header name, suitably canonicalized. You may override this method in order to use Message parsing on tagged data in RFC 2822-like formats with special header formats. """ i = line.find(':') if i > 0: return line[:i].lower() return None def islast(self, line): """Determine whether a line is a legal end of RFC 2822 headers. You may override this method if your application wants to bend the rules, e.g. to strip trailing whitespace, or to recognize MH template separators ('--------'). For convenience (e.g. for code reading from sockets) a line consisting of \r\n also matches. """ return line in _blanklines def iscomment(self, line): """Determine whether a line should be skipped entirely. You may override this method in order to use Message parsing on tagged data in RFC 2822-like formats that support embedded comments or free-text data. """ return False def getallmatchingheaders(self, name): """Find all header lines matching a given header name. Look through the list of headers and find all lines matching a given header name (and their continuation lines). A list of the lines is returned, without interpretation. If the header does not occur, an empty list is returned. If the header occurs multiple times, all occurrences are returned. Case is not important in the header name. """ name = name.lower() + ':' n = len(name) lst = [] hit = 0 for line in self.headers: if line[:n].lower() == name: hit = 1 elif not line[:1].isspace(): hit = 0 if hit: lst.append(line) return lst def getfirstmatchingheader(self, name): """Get the first header line matching name. This is similar to getallmatchingheaders, but it returns only the first matching header (and its continuation lines). """ name = name.lower() + ':' n = len(name) lst = [] hit = 0 for line in self.headers: if hit: if not line[:1].isspace(): break elif line[:n].lower() == name: hit = 1 if hit: lst.append(line) return lst def getrawheader(self, name): """A higher-level interface to getfirstmatchingheader(). Return a string containing the literal text of the header but with the keyword stripped. All leading, trailing and embedded whitespace is kept in the string, however. Return None if the header does not occur. """ lst = self.getfirstmatchingheader(name) if not lst: return None lst[0] = lst[0][len(name) + 1:] return ''.join(lst) def getheader(self, name, default=None): """Get the header value for a name. This is the normal interface: it returns a stripped version of the header value for a given header name, or None if it doesn't exist. This uses the dictionary version which finds the *last* such header. """ return self.dict.get(name.lower(), default) get = getheader def getheaders(self, name): """Get all values for a header. This returns a list of values for headers given more than once; each value in the result list is stripped in the same way as the result of getheader(). If the header is not given, return an empty list. """ result = [] current = '' have_header = 0 for s in self.getallmatchingheaders(name): if s[0].isspace(): if current: current = "%s\n %s" % (current, s.strip()) else: current = s.strip() else: if have_header: result.append(current) current = s[s.find(":") + 1:].strip() have_header = 1 if have_header: result.append(current) return result def getaddr(self, name): """Get a single address from a header, as a tuple. An example return value: ('Guido van Rossum', 'guido@cwi.nl') """ # New, by Ben Escoto alist = self.getaddrlist(name) if alist: return alist[0] else: return (None, None) def getaddrlist(self, name): """Get a list of addresses from a header. Retrieves a list of addresses from a header, where each address is a tuple as returned by getaddr(). Scans all named headers, so it works properly with multiple To: or Cc: headers for example. """ raw = [] for h in self.getallmatchingheaders(name): if h[0] in ' \t': raw.append(h) else: if raw: raw.append(', ') i = h.find(':') if i > 0: addr = h[i+1:] raw.append(addr) alladdrs = ''.join(raw) a = AddressList(alladdrs) return a.addresslist def getdate(self, name): """Retrieve a date field from a header. Retrieves a date field from the named header, returning a tuple compatible with time.mktime(). """ try: data = self[name] except KeyError: return None return parsedate(data) def getdate_tz(self, name): """Retrieve a date field from a header as a 10-tuple. The first 9 elements make up a tuple compatible with time.mktime(), and the 10th is the offset of the poster's time zone from GMT/UTC. """ try: data = self[name] except KeyError: return None return parsedate_tz(data) # Access as a dictionary (only finds *last* header of each type): def __len__(self): """Get the number of headers in a message.""" return len(self.dict) def __getitem__(self, name): """Get a specific header, as from a dictionary.""" return self.dict[name.lower()] def __setitem__(self, name, value): """Set the value of a header. Note: This is not a perfect inversion of __getitem__, because any changed headers get stuck at the end of the raw-headers list rather than where the altered header was. """ del self[name] # Won't fail if it doesn't exist self.dict[name.lower()] = value text = name + ": " + value for line in text.split("\n"): self.headers.append(line + "\n") def __delitem__(self, name): """Delete all occurrences of a specific header, if it is present.""" name = name.lower() if not name in self.dict: return del self.dict[name] name = name + ':' n = len(name) lst = [] hit = 0 for i in range(len(self.headers)): line = self.headers[i] if line[:n].lower() == name: hit = 1 elif not line[:1].isspace(): hit = 0 if hit: lst.append(i) for i in reversed(lst): del self.headers[i] def setdefault(self, name, default=""): lowername = name.lower() if lowername in self.dict: return self.dict[lowername] else: text = name + ": " + default for line in text.split("\n"): self.headers.append(line + "\n") self.dict[lowername] = default return default def has_key(self, name): """Determine whether a message contains the named header.""" return name.lower() in self.dict def __contains__(self, name): """Determine whether a message contains the named header.""" return name.lower() in self.dict def __iter__(self): return iter(self.dict) def keys(self): """Get all of a message's header field names.""" return self.dict.keys() def values(self): """Get all of a message's header field values.""" return self.dict.values() def items(self): """Get all of a message's headers. Returns a list of name, value tuples. """ return self.dict.items() def __str__(self): return ''.join(self.headers) # Utility functions # ----------------- # XXX Should fix unquote() and quote() to be really conformant. # XXX The inverses of the parse functions may also be useful. def unquote(s): """Remove quotes from a string.""" if len(s) > 1: if s.startswith('"') and s.endswith('"'): return s[1:-1].replace('\\\\', '\\').replace('\\"', '"') if s.startswith('<') and s.endswith('>'): return s[1:-1] return s def quote(s): """Add quotes around a string.""" return s.replace('\\', '\\\\').replace('"', '\\"') def parseaddr(address): """Parse an address into a (realname, mailaddr) tuple.""" a = AddressList(address) lst = a.addresslist if not lst: return (None, None) return lst[0] class AddrlistClass: """Address parser class by Ben Escoto. To understand what this class does, it helps to have a copy of RFC 2822 in front of you. http://www.faqs.org/rfcs/rfc2822.html Note: this class interface is deprecated and may be removed in the future. Use rfc822.AddressList instead. """ def __init__(self, field): """Initialize a new instance. `field' is an unparsed address header field, containing one or more addresses. """ self.specials = '()<>@,:;.\"[]' self.pos = 0 self.LWS = ' \t' self.CR = '\r\n' self.atomends = self.specials + self.LWS + self.CR # Note that RFC 2822 now specifies `.' as obs-phrase, meaning that it # is obsolete syntax. RFC 2822 requires that we recognize obsolete # syntax, so allow dots in phrases. self.phraseends = self.atomends.replace('.', '') self.field = field self.commentlist = [] def gotonext(self): """Parse up to the start of the next address.""" while self.pos < len(self.field): if self.field[self.pos] in self.LWS + '\n\r': self.pos = self.pos + 1 elif self.field[self.pos] == '(': self.commentlist.append(self.getcomment()) else: break def getaddrlist(self): """Parse all addresses. Returns a list containing all of the addresses. """ result = [] ad = self.getaddress() while ad: result += ad ad = self.getaddress() return result def getaddress(self): """Parse the next address.""" self.commentlist = [] self.gotonext() oldpos = self.pos oldcl = self.commentlist plist = self.getphraselist() self.gotonext() returnlist = [] if self.pos >= len(self.field): # Bad email address technically, no domain. if plist: returnlist = [(' '.join(self.commentlist), plist[0])] elif self.field[self.pos] in '.@': # email address is just an addrspec # this isn't very efficient since we start over self.pos = oldpos self.commentlist = oldcl addrspec = self.getaddrspec() returnlist = [(' '.join(self.commentlist), addrspec)] elif self.field[self.pos] == ':': # address is a group returnlist = [] fieldlen = len(self.field) self.pos += 1 while self.pos < len(self.field): self.gotonext() if self.pos < fieldlen and self.field[self.pos] == ';': self.pos += 1 break returnlist = returnlist + self.getaddress() elif self.field[self.pos] == '<': # Address is a phrase then a route addr routeaddr = self.getrouteaddr() if self.commentlist: returnlist = [(' '.join(plist) + ' (' + \ ' '.join(self.commentlist) + ')', routeaddr)] else: returnlist = [(' '.join(plist), routeaddr)] else: if plist: returnlist = [(' '.join(self.commentlist), plist[0])] elif self.field[self.pos] in self.specials: self.pos += 1 self.gotonext() if self.pos < len(self.field) and self.field[self.pos] == ',': self.pos += 1 return returnlist def getrouteaddr(self): """Parse a route address (Return-path value). This method just skips all the route stuff and returns the addrspec. """ if self.field[self.pos] != '<': return expectroute = 0 self.pos += 1 self.gotonext() adlist = "" while self.pos < len(self.field): if expectroute: self.getdomain() expectroute = 0 elif self.field[self.pos] == '>': self.pos += 1 break elif self.field[self.pos] == '@': self.pos += 1 expectroute = 1 elif self.field[self.pos] == ':': self.pos += 1 else: adlist = self.getaddrspec() self.pos += 1 break self.gotonext() return adlist def getaddrspec(self): """Parse an RFC 2822 addr-spec.""" aslist = [] self.gotonext() while self.pos < len(self.field): if self.field[self.pos] == '.': aslist.append('.') self.pos += 1 elif self.field[self.pos] == '"': aslist.append('"%s"' % self.getquote()) elif self.field[self.pos] in self.atomends: break else: aslist.append(self.getatom()) self.gotonext() if self.pos >= len(self.field) or self.field[self.pos] != '@': return ''.join(aslist) aslist.append('@') self.pos += 1 self.gotonext() return ''.join(aslist) + self.getdomain() def getdomain(self): """Get the complete domain name from an address.""" sdlist = [] while self.pos < len(self.field): if self.field[self.pos] in self.LWS: self.pos += 1 elif self.field[self.pos] == '(': self.commentlist.append(self.getcomment()) elif self.field[self.pos] == '[': sdlist.append(self.getdomainliteral()) elif self.field[self.pos] == '.': self.pos += 1 sdlist.append('.') elif self.field[self.pos] in self.atomends: break else: sdlist.append(self.getatom()) return ''.join(sdlist) def getdelimited(self, beginchar, endchars, allowcomments = 1): """Parse a header fragment delimited by special characters. `beginchar' is the start character for the fragment. If self is not looking at an instance of `beginchar' then getdelimited returns the empty string. `endchars' is a sequence of allowable end-delimiting characters. Parsing stops when one of these is encountered. If `allowcomments' is non-zero, embedded RFC 2822 comments are allowed within the parsed fragment. """ if self.field[self.pos] != beginchar: return '' slist = [''] quote = 0 self.pos += 1 while self.pos < len(self.field): if quote == 1: slist.append(self.field[self.pos]) quote = 0 elif self.field[self.pos] in endchars: self.pos += 1 break elif allowcomments and self.field[self.pos] == '(': slist.append(self.getcomment()) continue # have already advanced pos from getcomment elif self.field[self.pos] == '\\': quote = 1 else: slist.append(self.field[self.pos]) self.pos += 1 return ''.join(slist) def getquote(self): """Get a quote-delimited fragment from self's field.""" return self.getdelimited('"', '"\r', 0) def getcomment(self): """Get a parenthesis-delimited fragment from self's field.""" return self.getdelimited('(', ')\r', 1) def getdomainliteral(self): """Parse an RFC 2822 domain-literal.""" return '[%s]' % self.getdelimited('[', ']\r', 0) def getatom(self, atomends=None): """Parse an RFC 2822 atom. Optional atomends specifies a different set of end token delimiters (the default is to use self.atomends). This is used e.g. in getphraselist() since phrase endings must not include the `.' (which is legal in phrases).""" atomlist = [''] if atomends is None: atomends = self.atomends while self.pos < len(self.field): if self.field[self.pos] in atomends: break else: atomlist.append(self.field[self.pos]) self.pos += 1 return ''.join(atomlist) def getphraselist(self): """Parse a sequence of RFC 2822 phrases. A phrase is a sequence of words, which are in turn either RFC 2822 atoms or quoted-strings. Phrases are canonicalized by squeezing all runs of continuous whitespace into one space. """ plist = [] while self.pos < len(self.field): if self.field[self.pos] in self.LWS: self.pos += 1 elif self.field[self.pos] == '"': plist.append(self.getquote()) elif self.field[self.pos] == '(': self.commentlist.append(self.getcomment()) elif self.field[self.pos] in self.phraseends: break else: plist.append(self.getatom(self.phraseends)) return plist class AddressList(AddrlistClass): """An AddressList encapsulates a list of parsed RFC 2822 addresses.""" def __init__(self, field): AddrlistClass.__init__(self, field) if field: self.addresslist = self.getaddrlist() else: self.addresslist = [] def __len__(self): return len(self.addresslist) def __str__(self): return ", ".join(map(dump_address_pair, self.addresslist)) def __add__(self, other): # Set union newaddr = AddressList(None) newaddr.addresslist = self.addresslist[:] for x in other.addresslist: if not x in self.addresslist: newaddr.addresslist.append(x) return newaddr def __iadd__(self, other): # Set union, in-place for x in other.addresslist: if not x in self.addresslist: self.addresslist.append(x) return self def __sub__(self, other): # Set difference newaddr = AddressList(None) for x in self.addresslist: if not x in other.addresslist: newaddr.addresslist.append(x) return newaddr def __isub__(self, other): # Set difference, in-place for x in other.addresslist: if x in self.addresslist: self.addresslist.remove(x) return self def __getitem__(self, index): # Make indexing, slices, and 'in' work return self.addresslist[index] def dump_address_pair(pair): """Dump a (name, address) pair in a canonicalized form.""" if pair[0]: return '"' + pair[0] + '" <' + pair[1] + '>' else: return pair[1] # Parse a date field _monthnames = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec', 'january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december'] _daynames = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'] # The timezone table does not include the military time zones defined # in RFC822, other than Z. According to RFC1123, the description in # RFC822 gets the signs wrong, so we can't rely on any such time # zones. RFC1123 recommends that numeric timezone indicators be used # instead of timezone names. _timezones = {'UT':0, 'UTC':0, 'GMT':0, 'Z':0, 'AST': -400, 'ADT': -300, # Atlantic (used in Canada) 'EST': -500, 'EDT': -400, # Eastern 'CST': -600, 'CDT': -500, # Central 'MST': -700, 'MDT': -600, # Mountain 'PST': -800, 'PDT': -700 # Pacific } def parsedate_tz(data): """Convert a date string to a time tuple. Accounts for military timezones. """ if not data: return None data = data.split() if data[0][-1] in (',', '.') or data[0].lower() in _daynames: # There's a dayname here. Skip it del data[0] else: # no space after the "weekday,"? i = data[0].rfind(',') if i >= 0: data[0] = data[0][i+1:] if len(data) == 3: # RFC 850 date, deprecated stuff = data[0].split('-') if len(stuff) == 3: data = stuff + data[1:] if len(data) == 4: s = data[3] i = s.find('+') if i > 0: data[3:] = [s[:i], s[i+1:]] else: data.append('') # Dummy tz if len(data) < 5: return None data = data[:5] [dd, mm, yy, tm, tz] = data mm = mm.lower() if not mm in _monthnames: dd, mm = mm, dd.lower() if not mm in _monthnames: return None mm = _monthnames.index(mm)+1 if mm > 12: mm = mm - 12 if dd[-1] == ',': dd = dd[:-1] i = yy.find(':') if i > 0: yy, tm = tm, yy if yy[-1] == ',': yy = yy[:-1] if not yy[0].isdigit(): yy, tz = tz, yy if tm[-1] == ',': tm = tm[:-1] tm = tm.split(':') if len(tm) == 2: [thh, tmm] = tm tss = '0' elif len(tm) == 3: [thh, tmm, tss] = tm else: return None try: yy = int(yy) dd = int(dd) thh = int(thh) tmm = int(tmm) tss = int(tss) except ValueError: return None tzoffset = None tz = tz.upper() if tz in _timezones: tzoffset = _timezones[tz] else: try: tzoffset = int(tz) except ValueError: pass # Convert a timezone offset into seconds ; -0500 -> -18000 if tzoffset: if tzoffset < 0: tzsign = -1 tzoffset = -tzoffset else: tzsign = 1 tzoffset = tzsign * ( (tzoffset//100)*3600 + (tzoffset % 100)*60) return (yy, mm, dd, thh, tmm, tss, 0, 1, 0, tzoffset) def parsedate(data): """Convert a time string to a time tuple.""" t = parsedate_tz(data) if t is None: return t return t[:9] def mktime_tz(data): """Turn a 10-tuple as returned by parsedate_tz() into a UTC timestamp.""" if data[9] is None: # No zone info, so localtime is better assumption than GMT return time.mktime(data[:8] + (-1,)) else: t = time.mktime(data[:8] + (0,)) return t - data[9] - time.timezone def formatdate(timeval=None): """Returns time format preferred for Internet standards. Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123 According to RFC 1123, day and month names must always be in English. If not for that, this code could use strftime(). It can't because strftime() honors the locale and could generated non-English names. """ if timeval is None: timeval = time.time() timeval = time.gmtime(timeval) return "%s, %02d %s %04d %02d:%02d:%02d GMT" % ( ("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")[timeval[6]], timeval[2], ("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")[timeval[1]-1], timeval[0], timeval[3], timeval[4], timeval[5]) # When used as script, run a small test program. # The first command line argument must be a filename containing one # message in RFC-822 format. if __name__ == '__main__': import sys, os file = os.path.join(os.environ['HOME'], 'Mail/inbox/1') if sys.argv[1:]: file = sys.argv[1] f = open(file, 'r') m = Message(f) print 'From:', m.getaddr('from') print 'To:', m.getaddrlist('to') print 'Subject:', m.getheader('subject') print 'Date:', m.getheader('date') date = m.getdate_tz('date') tz = date[-1] date = time.localtime(mktime_tz(date)) if date: print 'ParsedDate:', time.asctime(date), hhmmss = tz hhmm, ss = divmod(hhmmss, 60) hh, mm = divmod(hhmm, 60) print "%+03d%02d" % (hh, mm), if ss: print ".%02d" % ss, print else: print 'ParsedDate:', None m.rewindbody() n = 0 while f.readline(): n += 1 print 'Lines:', n print '-'*70 print 'len =', len(m) if 'Date' in m: print 'Date =', m['Date'] if 'X-Nonsense' in m: pass print 'keys =', m.keys() print 'values =', m.values() print 'items =', m.items()
Save
cmd:
run