/
usr
/
lib64
/
python2.7
/
/usr/lib64/python2.7
mkdir
upload
Name
Size
Mode
Actions
bsddb/
-
0755
rm
compiler/
-
0755
rm
config/
-
0755
rm
ctypes/
-
0755
rm
curses/
-
0755
rm
distutils/
-
0755
rm
email/
-
0755
rm
encodings/
-
0755
rm
ensurepip/
-
0755
rm
hotshot/
-
0755
rm
idlelib/
-
0755
rm
importlib/
-
0755
rm
json/
-
0755
rm
lib-dynload/
-
0755
rm
lib2to3/
-
0755
rm
logging/
-
0755
rm
multiprocessing/
-
0755
rm
plat-linux2/
-
0755
rm
pydoc_data/
-
0755
rm
site-packages/
-
0755
rm
sqlite3/
-
0755
rm
test/
-
0755
rm
unittest/
-
0755
rm
wsgiref/
-
0755
rm
xml/
-
0755
rm
abc.py
7145
0644
edit
dl
rm
abc.pyc
6143
0644
edit
dl
rm
abc.pyo
6087
0644
edit
dl
rm
aifc.py
34579
0644
edit
dl
rm
aifc.pyc
30459
0644
edit
dl
rm
aifc.pyo
30459
0644
edit
dl
rm
antigravity.py
60
0644
edit
dl
rm
antigravity.pyc
203
0644
edit
dl
rm
antigravity.pyo
203
0644
edit
dl
rm
anydbm.py
2663
0644
edit
dl
rm
anydbm.pyc
2800
0644
edit
dl
rm
anydbm.pyo
2800
0644
edit
dl
rm
argparse.py
89228
0644
edit
dl
rm
argparse.pyc
64367
0644
edit
dl
rm
argparse.pyo
64202
0644
edit
dl
rm
ast.py
11805
0644
edit
dl
rm
ast.pyc
12938
0644
edit
dl
rm
ast.pyo
12938
0644
edit
dl
rm
asynchat.py
11581
0644
edit
dl
rm
asynchat.pyc
8810
0644
edit
dl
rm
asynchat.pyo
8810
0644
edit
dl
rm
asyncore.py
20943
0644
edit
dl
rm
asyncore.pyc
18893
0644
edit
dl
rm
asyncore.pyo
18893
0644
edit
dl
rm
atexit.py
1705
0644
edit
dl
rm
atexit.pyc
2203
0644
edit
dl
rm
atexit.pyo
2203
0644
edit
dl
rm
audiodev.py
7597
0644
edit
dl
rm
audiodev.pyc
8469
0644
edit
dl
rm
audiodev.pyo
8469
0644
edit
dl
rm
base64.py
11806
0755
edit
dl
rm
base64.pyc
11297
0644
edit
dl
rm
base64.pyo
11297
0644
edit
dl
rm
BaseHTTPServer.py
22747
0644
edit
dl
rm
BaseHTTPServer.pyc
21722
0644
edit
dl
rm
BaseHTTPServer.pyo
21722
0644
edit
dl
rm
Bastion.py
5744
0644
edit
dl
rm
Bastion.pyc
6660
0644
edit
dl
rm
Bastion.pyo
6660
0644
edit
dl
rm
bdb.py
21714
0644
edit
dl
rm
bdb.pyc
19101
0644
edit
dl
rm
bdb.pyo
19101
0644
edit
dl
rm
binhex.py
14698
0644
edit
dl
rm
binhex.pyc
15460
0644
edit
dl
rm
binhex.pyo
15460
0644
edit
dl
rm
bisect.py
2595
0644
edit
dl
rm
bisect.pyc
3071
0644
edit
dl
rm
bisect.pyo
3071
0644
edit
dl
rm
calendar.py
23384
0644
edit
dl
rm
calendar.pyc
27913
0644
edit
dl
rm
calendar.pyo
27913
0644
edit
dl
rm
cgi.py
36308
0755
edit
dl
rm
cgi.pyc
33366
0644
edit
dl
rm
cgi.pyo
33366
0644
edit
dl
rm
CGIHTTPServer.py
13089
0644
edit
dl
rm
CGIHTTPServer.pyc
11018
0644
edit
dl
rm
CGIHTTPServer.pyo
11018
0644
edit
dl
rm
cgitb.py
12175
0644
edit
dl
rm
cgitb.pyc
12138
0644
edit
dl
rm
cgitb.pyo
12138
0644
edit
dl
rm
chunk.py
5419
0644
edit
dl
rm
chunk.pyc
5602
0644
edit
dl
rm
chunk.pyo
5602
0644
edit
dl
rm
cmd.py
15026
0644
edit
dl
rm
cmd.pyc
14039
0644
edit
dl
rm
cmd.pyo
14039
0644
edit
dl
rm
code.py
10189
0644
edit
dl
rm
code.pyc
10334
0644
edit
dl
rm
code.pyo
10334
0644
edit
dl
rm
codecs.py
36143
0644
edit
dl
rm
codecs.pyc
36824
0644
edit
dl
rm
codecs.pyo
36824
0644
edit
dl
rm
codeop.py
5999
0644
edit
dl
rm
codeop.pyc
6597
0644
edit
dl
rm
codeop.pyo
6597
0644
edit
dl
rm
collections.py
27798
0644
edit
dl
rm
collections.pyc
26163
0644
edit
dl
rm
collections.pyo
26112
0644
edit
dl
rm
colorsys.py
3691
0644
edit
dl
rm
colorsys.pyc
3991
0644
edit
dl
rm
colorsys.pyo
3991
0644
edit
dl
rm
commands.py
2545
0644
edit
dl
rm
commands.pyc
2469
0644
edit
dl
rm
commands.pyo
2469
0644
edit
dl
rm
compileall.py
7763
0644
edit
dl
rm
compileall.pyc
7017
0644
edit
dl
rm
compileall.pyo
7017
0644
edit
dl
rm
ConfigParser.py
27746
0644
edit
dl
rm
ConfigParser.pyc
25213
0644
edit
dl
rm
ConfigParser.pyo
25213
0644
edit
dl
rm
contextlib.py
4424
0644
edit
dl
rm
contextlib.pyc
4454
0644
edit
dl
rm
contextlib.pyo
4454
0644
edit
dl
rm
Cookie.py
26538
0644
edit
dl
rm
Cookie.pyc
22658
0644
edit
dl
rm
Cookie.pyo
22658
0644
edit
dl
rm
cookielib.py
65486
0644
edit
dl
rm
cookielib.pyc
54725
0644
edit
dl
rm
cookielib.pyo
54537
0644
edit
dl
rm
copy.py
11533
0644
edit
dl
rm
copy.pyc
12170
0644
edit
dl
rm
copy.pyo
12078
0644
edit
dl
rm
copy_reg.py
6974
0644
edit
dl
rm
copy_reg.pyc
5167
0644
edit
dl
rm
copy_reg.pyo
5123
0644
edit
dl
rm
cProfile.py
6573
0755
edit
dl
rm
cProfile.pyc
6395
0644
edit
dl
rm
cProfile.pyo
6395
0644
edit
dl
rm
crypt.py
2292
0644
edit
dl
rm
crypt.pyc
2960
0644
edit
dl
rm
crypt.pyo
2960
0644
edit
dl
rm
csv.py
16708
0644
edit
dl
rm
csv.pyc
13507
0644
edit
dl
rm
csv.pyo
13507
0644
edit
dl
rm
dbhash.py
498
0644
edit
dl
rm
dbhash.pyc
718
0644
edit
dl
rm
dbhash.pyo
718
0644
edit
dl
rm
decimal.py
221933
0644
edit
dl
rm
decimal.pyc
172155
0644
edit
dl
rm
decimal.pyo
172155
0644
edit
dl
rm
difflib.py
82325
0644
edit
dl
rm
difflib.pyc
61898
0644
edit
dl
rm
difflib.pyo
61847
0644
edit
dl
rm
dircache.py
1126
0644
edit
dl
rm
dircache.pyc
1576
0644
edit
dl
rm
dircache.pyo
1576
0644
edit
dl
rm
dis.py
6499
0644
edit
dl
rm
dis.pyc
6228
0644
edit
dl
rm
dis.pyo
6228
0644
edit
dl
rm
doctest.py
105095
0644
edit
dl
rm
doctest.pyc
83637
0644
edit
dl
rm
doctest.pyo
83350
0644
edit
dl
rm
DocXMLRPCServer.py
10768
0644
edit
dl
rm
DocXMLRPCServer.pyc
10195
0644
edit
dl
rm
DocXMLRPCServer.pyo
10086
0644
edit
dl
rm
dumbdbm.py
9141
0644
edit
dl
rm
dumbdbm.pyc
6746
0644
edit
dl
rm
dumbdbm.pyo
6746
0644
edit
dl
rm
dummy_thread.py
4418
0644
edit
dl
rm
dummy_thread.pyc
5394
0644
edit
dl
rm
dummy_thread.pyo
5394
0644
edit
dl
rm
dummy_threading.py
2804
0644
edit
dl
rm
dummy_threading.pyc
1285
0644
edit
dl
rm
dummy_threading.pyo
1285
0644
edit
dl
rm
filecmp.py
9588
0644
edit
dl
rm
filecmp.pyc
9622
0644
edit
dl
rm
filecmp.pyo
9622
0644
edit
dl
rm
fileinput.py
13746
0644
edit
dl
rm
fileinput.pyc
14500
0644
edit
dl
rm
fileinput.pyo
14500
0644
edit
dl
rm
fnmatch.py
3315
0644
edit
dl
rm
fnmatch.pyc
3614
0644
edit
dl
rm
fnmatch.pyo
3614
0644
edit
dl
rm
formatter.py
14911
0644
edit
dl
rm
formatter.pyc
19178
0644
edit
dl
rm
formatter.pyo
19178
0644
edit
dl
rm
fpformat.py
4732
0644
edit
dl
rm
fpformat.pyc
4703
0644
edit
dl
rm
fpformat.pyo
4703
0644
edit
dl
rm
fractions.py
22390
0644
edit
dl
rm
fractions.pyc
19711
0644
edit
dl
rm
fractions.pyo
19711
0644
edit
dl
rm
ftplib.py
38555
0644
edit
dl
rm
ftplib.pyc
34939
0644
edit
dl
rm
ftplib.pyo
34939
0644
edit
dl
rm
functools.py
4806
0644
edit
dl
rm
functools.pyc
6629
0644
edit
dl
rm
functools.pyo
6629
0644
edit
dl
rm
genericpath.py
3201
0644
edit
dl
rm
genericpath.pyc
3517
0644
edit
dl
rm
genericpath.pyo
3517
0644
edit
dl
rm
getopt.py
7319
0644
edit
dl
rm
getopt.pyc
6654
0644
edit
dl
rm
getopt.pyo
6609
0644
edit
dl
rm
getpass.py
5563
0644
edit
dl
rm
getpass.pyc
4744
0644
edit
dl
rm
getpass.pyo
4744
0644
edit
dl
rm
gettext.py
22666
0644
edit
dl
rm
gettext.pyc
18004
0644
edit
dl
rm
gettext.pyo
18004
0644
edit
dl
rm
glob.py
3114
0644
edit
dl
rm
glob.pyc
2943
0644
edit
dl
rm
glob.pyo
2943
0644
edit
dl
rm
gzip.py
19028
0644
edit
dl
rm
gzip.pyc
15236
0644
edit
dl
rm
gzip.pyo
15236
0644
edit
dl
rm
hashlib.py
7841
0644
edit
dl
rm
hashlib.pyc
6919
0644
edit
dl
rm
hashlib.pyo
6919
0644
edit
dl
rm
heapq.py
18295
0644
edit
dl
rm
heapq.pyc
14564
0644
edit
dl
rm
heapq.pyo
14564
0644
edit
dl
rm
hmac.py
4588
0644
edit
dl
rm
hmac.pyc
4542
0644
edit
dl
rm
hmac.pyo
4542
0644
edit
dl
rm
htmlentitydefs.py
18056
0644
edit
dl
rm
htmlentitydefs.pyc
6367
0644
edit
dl
rm
htmlentitydefs.pyo
6367
0644
edit
dl
rm
htmllib.py
12869
0644
edit
dl
rm
htmllib.pyc
20309
0644
edit
dl
rm
htmllib.pyo
20309
0644
edit
dl
rm
HTMLParser.py
17171
0644
edit
dl
rm
HTMLParser.pyc
13727
0644
edit
dl
rm
HTMLParser.pyo
13422
0644
edit
dl
rm
httplib.py
53306
0644
edit
dl
rm
httplib.pyc
38724
0644
edit
dl
rm
httplib.pyo
38540
0644
edit
dl
rm
ihooks.py
18986
0644
edit
dl
rm
ihooks.pyc
21372
0644
edit
dl
rm
ihooks.pyo
21372
0644
edit
dl
rm
imaplib.py
48366
0644
edit
dl
rm
imaplib.pyc
45011
0644
edit
dl
rm
imaplib.pyo
42310
0644
edit
dl
rm
imghdr.py
3541
0644
edit
dl
rm
imghdr.pyc
4838
0644
edit
dl
rm
imghdr.pyo
4838
0644
edit
dl
rm
imputil.py
25764
0644
edit
dl
rm
imputil.pyc
15623
0644
edit
dl
rm
imputil.pyo
15445
0644
edit
dl
rm
inspect.py
43008
0644
edit
dl
rm
inspect.pyc
40229
0644
edit
dl
rm
inspect.pyo
40229
0644
edit
dl
rm
io.py
3322
0644
edit
dl
rm
io.pyc
3589
0644
edit
dl
rm
io.pyo
3589
0644
edit
dl
rm
keyword.py
1995
0755
edit
dl
rm
keyword.pyc
2105
0644
edit
dl
rm
keyword.pyo
2105
0644
edit
dl
rm
linecache.py
4027
0644
edit
dl
rm
linecache.pyc
3272
0644
edit
dl
rm
linecache.pyo
3272
0644
edit
dl
rm
locale.py
102834
0644
edit
dl
rm
locale.pyc
56610
0644
edit
dl
rm
locale.pyo
56610
0644
edit
dl
rm
macpath.py
6289
0644
edit
dl
rm
macpath.pyc
7681
0644
edit
dl
rm
macpath.pyo
7681
0644
edit
dl
rm
macurl2path.py
2731
0644
edit
dl
rm
macurl2path.pyc
2244
0644
edit
dl
rm
macurl2path.pyo
2244
0644
edit
dl
rm
mailbox.py
81240
0644
edit
dl
rm
mailbox.pyc
76717
0644
edit
dl
rm
mailbox.pyo
76670
0644
edit
dl
rm
mailcap.py
8404
0644
edit
dl
rm
mailcap.pyc
7955
0644
edit
dl
rm
mailcap.pyo
7955
0644
edit
dl
rm
markupbase.py
14643
0644
edit
dl
rm
markupbase.pyc
9267
0644
edit
dl
rm
markupbase.pyo
9071
0644
edit
dl
rm
md5.py
358
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
33777
0644
edit
dl
rm
mhlib.pyo
33777
0644
edit
dl
rm
mimetools.py
7168
0644
edit
dl
rm
mimetools.pyc
8201
0644
edit
dl
rm
mimetools.pyo
8201
0644
edit
dl
rm
mimetypes.py
21028
0644
edit
dl
rm
mimetypes.pyc
18489
0644
edit
dl
rm
mimetypes.pyo
18489
0644
edit
dl
rm
MimeWriter.py
6482
0644
edit
dl
rm
MimeWriter.pyc
7364
0644
edit
dl
rm
MimeWriter.pyo
7364
0644
edit
dl
rm
mimify.py
15020
0755
edit
dl
rm
mimify.pyc
12001
0644
edit
dl
rm
mimify.pyo
12001
0644
edit
dl
rm
modulefinder.py
24461
0644
edit
dl
rm
modulefinder.pyc
19127
0644
edit
dl
rm
modulefinder.pyo
19045
0644
edit
dl
rm
multifile.py
4820
0644
edit
dl
rm
multifile.pyc
5420
0644
edit
dl
rm
multifile.pyo
5378
0644
edit
dl
rm
mutex.py
1878
0644
edit
dl
rm
mutex.pyc
2516
0644
edit
dl
rm
mutex.pyo
2516
0644
edit
dl
rm
netrc.py
5888
0644
edit
dl
rm
netrc.pyc
4714
0644
edit
dl
rm
netrc.pyo
4714
0644
edit
dl
rm
new.py
610
0644
edit
dl
rm
new.pyc
862
0644
edit
dl
rm
new.pyo
862
0644
edit
dl
rm
nntplib.py
21470
0644
edit
dl
rm
nntplib.pyc
21044
0644
edit
dl
rm
nntplib.pyo
21044
0644
edit
dl
rm
ntpath.py
19429
0644
edit
dl
rm
ntpath.pyc
13129
0644
edit
dl
rm
ntpath.pyo
13129
0644
edit
dl
rm
nturl2path.py
2419
0644
edit
dl
rm
nturl2path.pyc
1815
0644
edit
dl
rm
nturl2path.pyo
1815
0644
edit
dl
rm
numbers.py
10319
0644
edit
dl
rm
numbers.pyc
14012
0644
edit
dl
rm
numbers.pyo
14012
0644
edit
dl
rm
opcode.py
5474
0644
edit
dl
rm
opcode.pyc
6145
0644
edit
dl
rm
opcode.pyo
6145
0644
edit
dl
rm
optparse.py
61203
0644
edit
dl
rm
optparse.pyc
53894
0644
edit
dl
rm
optparse.pyo
53811
0644
edit
dl
rm
os.py
25910
0644
edit
dl
rm
os.pyc
25689
0644
edit
dl
rm
os.pyo
25689
0644
edit
dl
rm
os2emxpath.py
4635
0644
edit
dl
rm
os2emxpath.pyc
4525
0644
edit
dl
rm
os2emxpath.pyo
4525
0644
edit
dl
rm
pdb.doc
7914
0644
edit
dl
rm
pdb.py
46098
0755
edit
dl
rm
pdb.pyc
43669
0644
edit
dl
rm
pdb.pyo
43669
0644
edit
dl
rm
pickle.py
45489
0644
edit
dl
rm
pickle.pyc
38560
0644
edit
dl
rm
pickle.pyo
38364
0644
edit
dl
rm
pickletools.py
74523
0644
edit
dl
rm
pickletools.pyc
57032
0644
edit
dl
rm
pickletools.pyo
56171
0644
edit
dl
rm
pipes.py
9582
0644
edit
dl
rm
pipes.pyc
9308
0644
edit
dl
rm
pipes.pyo
9308
0644
edit
dl
rm
pkgutil.py
20243
0644
edit
dl
rm
pkgutil.pyc
18959
0644
edit
dl
rm
pkgutil.pyo
18959
0644
edit
dl
rm
platform.py
52801
0755
edit
dl
rm
platform.pyc
37971
0644
edit
dl
rm
platform.pyo
37971
0644
edit
dl
rm
plistlib.py
15810
0644
edit
dl
rm
plistlib.pyc
19963
0644
edit
dl
rm
plistlib.pyo
19877
0644
edit
dl
rm
popen2.py
8416
0644
edit
dl
rm
popen2.pyc
9025
0644
edit
dl
rm
popen2.pyo
8983
0644
edit
dl
rm
poplib.py
12824
0644
edit
dl
rm
poplib.pyc
13345
0644
edit
dl
rm
poplib.pyo
13345
0644
edit
dl
rm
posixfile.py
8003
0644
edit
dl
rm
posixfile.pyc
7652
0644
edit
dl
rm
posixfile.pyo
7652
0644
edit
dl
rm
posixpath.py
14293
0644
edit
dl
rm
posixpath.pyc
11462
0644
edit
dl
rm
posixpath.pyo
11462
0644
edit
dl
rm
pprint.py
11777
0644
edit
dl
rm
pprint.pyc
10194
0644
edit
dl
rm
pprint.pyo
10017
0644
edit
dl
rm
profile.py
22781
0755
edit
dl
rm
profile.pyc
16456
0644
edit
dl
rm
profile.pyo
16209
0644
edit
dl
rm
pstats.py
26712
0644
edit
dl
rm
pstats.pyc
25013
0644
edit
dl
rm
pstats.pyo
25013
0644
edit
dl
rm
pty.py
5058
0644
edit
dl
rm
pty.pyc
4966
0644
edit
dl
rm
pty.pyo
4966
0644
edit
dl
rm
pyclbr.py
13388
0644
edit
dl
rm
pyclbr.pyc
9651
0644
edit
dl
rm
pyclbr.pyo
9651
0644
edit
dl
rm
pydoc.py
95739
0755
edit
dl
rm
pydoc.pyc
92342
0644
edit
dl
rm
pydoc.pyo
92278
0644
edit
dl
rm
py_compile.py
5936
0644
edit
dl
rm
py_compile.pyc
6428
0644
edit
dl
rm
py_compile.pyo
6428
0644
edit
dl
rm
Queue.py
8577
0644
edit
dl
rm
Queue.pyc
9424
0644
edit
dl
rm
Queue.pyo
9424
0644
edit
dl
rm
quopri.py
6968
0755
edit
dl
rm
quopri.pyc
6574
0644
edit
dl
rm
quopri.pyo
6574
0644
edit
dl
rm
random.py
32457
0644
edit
dl
rm
random.pyc
25704
0644
edit
dl
rm
random.pyo
25704
0644
edit
dl
rm
re.py
13423
0644
edit
dl
rm
re.pyc
13413
0644
edit
dl
rm
re.pyo
13413
0644
edit
dl
rm
repr.py
4296
0644
edit
dl
rm
repr.pyc
5385
0644
edit
dl
rm
repr.pyo
5385
0644
edit
dl
rm
rexec.py
20148
0644
edit
dl
rm
rexec.pyc
23807
0644
edit
dl
rm
rexec.pyo
23807
0644
edit
dl
rm
rfc822.py
33542
0644
edit
dl
rm
rfc822.pyc
31813
0644
edit
dl
rm
rfc822.pyo
31813
0644
edit
dl
rm
rlcompleter.py
5991
0644
edit
dl
rm
rlcompleter.pyc
6078
0644
edit
dl
rm
rlcompleter.pyo
6078
0644
edit
dl
rm
robotparser.py
7695
0644
edit
dl
rm
robotparser.pyc
8003
0644
edit
dl
rm
robotparser.pyo
8003
0644
edit
dl
rm
runpy.py
11081
0644
edit
dl
rm
runpy.pyc
8803
0644
edit
dl
rm
runpy.pyo
8803
0644
edit
dl
rm
sched.py
5088
0644
edit
dl
rm
sched.pyc
4994
0644
edit
dl
rm
sched.pyo
4994
0644
edit
dl
rm
sets.py
19050
0644
edit
dl
rm
sets.pyc
16895
0644
edit
dl
rm
sets.pyo
16895
0644
edit
dl
rm
sgmllib.py
17884
0644
edit
dl
rm
sgmllib.pyc
15436
0644
edit
dl
rm
sgmllib.pyo
15436
0644
edit
dl
rm
sha.py
393
0644
edit
dl
rm
sha.pyc
421
0644
edit
dl
rm
sha.pyo
421
0644
edit
dl
rm
shelve.py
8178
0644
edit
dl
rm
shelve.pyc
10256
0644
edit
dl
rm
shelve.pyo
10256
0644
edit
dl
rm
shlex.py
11164
0644
edit
dl
rm
shlex.pyc
7558
0644
edit
dl
rm
shlex.pyo
7558
0644
edit
dl
rm
shutil.py
19871
0644
edit
dl
rm
shutil.pyc
19259
0644
edit
dl
rm
shutil.pyo
19259
0644
edit
dl
rm
SimpleHTTPServer.py
7997
0644
edit
dl
rm
SimpleHTTPServer.pyc
8010
0644
edit
dl
rm
SimpleHTTPServer.pyo
8010
0644
edit
dl
rm
SimpleXMLRPCServer.py
25812
0644
edit
dl
rm
SimpleXMLRPCServer.pyc
22863
0644
edit
dl
rm
SimpleXMLRPCServer.pyo
22863
0644
edit
dl
rm
site.py
21296
0644
edit
dl
rm
site.pyc
20786
0644
edit
dl
rm
site.pyo
20786
0644
edit
dl
rm
smtpd.py
18542
0755
edit
dl
rm
smtpd.pyc
15883
0644
edit
dl
rm
smtpd.pyo
15883
0644
edit
dl
rm
smtplib.py
32134
0755
edit
dl
rm
smtplib.pyc
30304
0644
edit
dl
rm
smtplib.pyo
30304
0644
edit
dl
rm
sndhdr.py
5973
0644
edit
dl
rm
sndhdr.pyc
7361
0644
edit
dl
rm
sndhdr.pyo
7361
0644
edit
dl
rm
socket.py
20615
0644
edit
dl
rm
socket.pyc
16152
0644
edit
dl
rm
socket.pyo
16066
0644
edit
dl
rm
SocketServer.py
23948
0644
edit
dl
rm
SocketServer.pyc
24087
0644
edit
dl
rm
SocketServer.pyo
24087
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
19823
0644
edit
dl
rm
sre_compile.pyc
12560
0644
edit
dl
rm
sre_compile.pyo
12404
0644
edit
dl
rm
sre_constants.py
7197
0644
edit
dl
rm
sre_constants.pyc
6195
0644
edit
dl
rm
sre_constants.pyo
6195
0644
edit
dl
rm
sre_parse.py
30700
0644
edit
dl
rm
sre_parse.pyc
21156
0644
edit
dl
rm
sre_parse.pyo
21156
0644
edit
dl
rm
ssl.py
39310
0644
edit
dl
rm
ssl.pyc
32716
0644
edit
dl
rm
ssl.pyo
32716
0644
edit
dl
rm
stat.py
1842
0644
edit
dl
rm
stat.pyc
2751
0644
edit
dl
rm
stat.pyo
2751
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
21548
0644
edit
dl
rm
string.pyc
20459
0644
edit
dl
rm
string.pyo
20459
0644
edit
dl
rm
StringIO.py
10662
0644
edit
dl
rm
StringIO.pyc
11480
0644
edit
dl
rm
StringIO.pyo
11480
0644
edit
dl
rm
stringold.py
12449
0644
edit
dl
rm
stringold.pyc
12549
0644
edit
dl
rm
stringold.pyo
12549
0644
edit
dl
rm
stringprep.py
13522
0644
edit
dl
rm
stringprep.pyc
14487
0644
edit
dl
rm
stringprep.pyo
14415
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
50520
0644
edit
dl
rm
subprocess.pyc
32398
0644
edit
dl
rm
subprocess.pyo
32398
0644
edit
dl
rm
sunau.py
17222
0644
edit
dl
rm
sunau.pyc
18394
0644
edit
dl
rm
sunau.pyo
18394
0644
edit
dl
rm
sunaudio.py
1399
0644
edit
dl
rm
sunaudio.pyc
1987
0644
edit
dl
rm
sunaudio.pyo
1987
0644
edit
dl
rm
symbol.py
2057
0755
edit
dl
rm
symbol.pyc
3026
0644
edit
dl
rm
symbol.pyo
3026
0644
edit
dl
rm
symtable.py
7437
0644
edit
dl
rm
symtable.pyc
11786
0644
edit
dl
rm
symtable.pyo
11655
0644
edit
dl
rm
sysconfig.py
22852
0644
edit
dl
rm
sysconfig.pyc
17818
0644
edit
dl
rm
sysconfig.pyo
17818
0644
edit
dl
rm
tabnanny.py
11339
0755
edit
dl
rm
tabnanny.pyc
8247
0644
edit
dl
rm
tabnanny.pyo
8247
0644
edit
dl
rm
tarfile.py
90655
0644
edit
dl
rm
tarfile.pyc
76193
0644
edit
dl
rm
tarfile.pyo
76193
0644
edit
dl
rm
telnetlib.py
27036
0644
edit
dl
rm
telnetlib.pyc
23154
0644
edit
dl
rm
telnetlib.pyo
23154
0644
edit
dl
rm
tempfile.py
19547
0644
edit
dl
rm
tempfile.pyc
20344
0644
edit
dl
rm
tempfile.pyo
20344
0644
edit
dl
rm
textwrap.py
17280
0644
edit
dl
rm
textwrap.pyc
12097
0644
edit
dl
rm
textwrap.pyo
12005
0644
edit
dl
rm
this.py
1002
0644
edit
dl
rm
this.pyc
1220
0644
edit
dl
rm
this.pyo
1220
0644
edit
dl
rm
threading.py
47377
0644
edit
dl
rm
threading.pyc
42726
0644
edit
dl
rm
threading.pyo
40552
0644
edit
dl
rm
timeit.py
12791
0755
edit
dl
rm
timeit.pyc
12183
0644
edit
dl
rm
timeit.pyo
12183
0644
edit
dl
rm
toaiff.py
3142
0644
edit
dl
rm
toaiff.pyc
3106
0644
edit
dl
rm
toaiff.pyo
3106
0644
edit
dl
rm
token.py
2922
0644
edit
dl
rm
token.pyc
3816
0644
edit
dl
rm
token.pyo
3816
0644
edit
dl
rm
tokenize.py
17483
0644
edit
dl
rm
tokenize.pyc
14505
0644
edit
dl
rm
tokenize.pyo
14449
0644
edit
dl
rm
trace.py
29891
0755
edit
dl
rm
trace.pyc
22793
0644
edit
dl
rm
trace.pyo
22730
0644
edit
dl
rm
traceback.py
11285
0644
edit
dl
rm
traceback.pyc
11679
0644
edit
dl
rm
traceback.pyo
11679
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
2094
0644
edit
dl
rm
types.pyc
2725
0644
edit
dl
rm
types.pyo
2725
0644
edit
dl
rm
urllib.py
60228
0644
edit
dl
rm
urllib.pyc
51241
0644
edit
dl
rm
urllib.pyo
51146
0644
edit
dl
rm
urllib2.py
52541
0644
edit
dl
rm
urllib2.pyc
47302
0644
edit
dl
rm
urllib2.pyo
47207
0644
edit
dl
rm
urlparse.py
20461
0644
edit
dl
rm
urlparse.pyc
18015
0644
edit
dl
rm
urlparse.pyo
18015
0644
edit
dl
rm
user.py
1627
0644
edit
dl
rm
user.pyc
1724
0644
edit
dl
rm
user.pyo
1724
0644
edit
dl
rm
UserDict.py
7060
0644
edit
dl
rm
UserDict.pyc
9711
0644
edit
dl
rm
UserDict.pyo
9711
0644
edit
dl
rm
UserList.py
3644
0644
edit
dl
rm
UserList.pyc
6577
0644
edit
dl
rm
UserList.pyo
6577
0644
edit
dl
rm
UserString.py
9687
0755
edit
dl
rm
UserString.pyc
14864
0644
edit
dl
rm
UserString.pyo
14864
0644
edit
dl
rm
uu.py
6697
0755
edit
dl
rm
uu.pyc
4390
0644
edit
dl
rm
uu.pyo
4390
0644
edit
dl
rm
uuid.py
23530
0644
edit
dl
rm
uuid.pyc
23366
0644
edit
dl
rm
uuid.pyo
23250
0644
edit
dl
rm
warnings.py
14823
0644
edit
dl
rm
warnings.pyc
13510
0644
edit
dl
rm
warnings.pyo
12721
0644
edit
dl
rm
wave.py
18582
0644
edit
dl
rm
wave.pyc
20013
0644
edit
dl
rm
wave.pyo
19869
0644
edit
dl
rm
weakref.py
14830
0644
edit
dl
rm
weakref.pyc
16441
0644
edit
dl
rm
weakref.pyo
16441
0644
edit
dl
rm
webbrowser.py
22725
0755
edit
dl
rm
webbrowser.pyc
19750
0644
edit
dl
rm
webbrowser.pyo
19705
0644
edit
dl
rm
whichdb.py
3379
0644
edit
dl
rm
whichdb.pyc
2241
0644
edit
dl
rm
whichdb.pyo
2241
0644
edit
dl
rm
wsgiref.egg-info
187
0644
edit
dl
rm
xdrlib.py
6069
0644
edit
dl
rm
xdrlib.pyc
9902
0644
edit
dl
rm
xdrlib.pyo
9902
0644
edit
dl
rm
xmllib.py
34865
0644
edit
dl
rm
xmllib.pyc
26848
0644
edit
dl
rm
xmllib.pyo
26848
0644
edit
dl
rm
xmlrpclib.py
52136
0644
edit
dl
rm
xmlrpclib.pyc
44106
0644
edit
dl
rm
xmlrpclib.pyo
43922
0644
edit
dl
rm
zipfile.py
59477
0644
edit
dl
rm
zipfile.pyc
42137
0644
edit
dl
rm
zipfile.pyo
42137
0644
edit
dl
rm
_abcoll.py
18619
0644
edit
dl
rm
_abcoll.pyc
25682
0644
edit
dl
rm
_abcoll.pyo
25682
0644
edit
dl
rm
_LWPCookieJar.py
6553
0644
edit
dl
rm
_LWPCookieJar.pyc
5434
0644
edit
dl
rm
_LWPCookieJar.pyo
5434
0644
edit
dl
rm
_MozillaCookieJar.py
5797
0644
edit
dl
rm
_MozillaCookieJar.pyc
4461
0644
edit
dl
rm
_MozillaCookieJar.pyo
4422
0644
edit
dl
rm
_osx_support.py
19100
0644
edit
dl
rm
_osx_support.pyc
11758
0644
edit
dl
rm
_osx_support.pyo
11758
0644
edit
dl
rm
_pyio.py
69630
0644
edit
dl
rm
_pyio.pyc
64701
0644
edit
dl
rm
_pyio.pyo
64701
0644
edit
dl
rm
_strptime.py
20728
0644
edit
dl
rm
_strptime.pyc
15172
0644
edit
dl
rm
_strptime.pyo
15172
0644
edit
dl
rm
_sysconfigdata.py
19732
0644
edit
dl
rm
_sysconfigdata.pyc
22968
0644
edit
dl
rm
_sysconfigdata.pyo
22968
0644
edit
dl
rm
_threading_local.py
7260
0644
edit
dl
rm
_threading_local.pyc
6373
0644
edit
dl
rm
_threading_local.pyo
6373
0644
edit
dl
rm
_weakrefset.py
5911
0644
edit
dl
rm
_weakrefset.pyc
9678
0644
edit
dl
rm
_weakrefset.pyo
9678
0644
edit
dl
rm
__future__.py
4380
0644
edit
dl
rm
__future__.pyc
4223
0644
edit
dl
rm
__future__.pyo
4223
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.7/rfc822.py
(33542B)
"""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 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 elif headerseen is not None: # An empty header name. These aren't allowed in HTTP, but it's # probably a benign mistake. Don't add the header, just keep # going. 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 > -1: 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 generate 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