Mercurial > cpython-lru_cache-weakref
annotate Lib/ftplib.py @ 78069:a8aa77458e12 3.2
Add c_size_t and c_ssize_t to the ctypes summary table.
| author | Antoine Pitrou <solipsis@pitrou.net> |
|---|---|
| date | Thu, 12 Jul 2012 20:31:50 +0200 |
| parents | c741ba9e37ef |
| children | b7419f88c628 d68765bd6490 |
| rev | line source |
|---|---|
|
11708
4a23cc49e2b0
Actually, the previous batch's comment should have been different;
Guido van Rossum <guido@python.org>
parents:
11205
diff
changeset
|
1 """An FTP client class and some helper functions. |
|
4a23cc49e2b0
Actually, the previous batch's comment should have been different;
Guido van Rossum <guido@python.org>
parents:
11205
diff
changeset
|
2 |
|
14338
057c7ceb92f0
Added support for RFC 959's REST command (restart), closing SF patch
Barry Warsaw <barry@python.org>
parents:
14022
diff
changeset
|
3 Based on RFC 959: File Transfer Protocol (FTP), by J. Postel and J. Reynolds |
| 1085 | 4 |
|
3649
63cdfbb4a2bb
Docstringified and PASV support by Siebren (including new ftpcp() function).
Guido van Rossum <guido@python.org>
parents:
3398
diff
changeset
|
5 Example: |
|
63cdfbb4a2bb
Docstringified and PASV support by Siebren (including new ftpcp() function).
Guido van Rossum <guido@python.org>
parents:
3398
diff
changeset
|
6 |
|
63cdfbb4a2bb
Docstringified and PASV support by Siebren (including new ftpcp() function).
Guido van Rossum <guido@python.org>
parents:
3398
diff
changeset
|
7 >>> from ftplib import FTP |
|
63cdfbb4a2bb
Docstringified and PASV support by Siebren (including new ftpcp() function).
Guido van Rossum <guido@python.org>
parents:
3398
diff
changeset
|
8 >>> ftp = FTP('ftp.python.org') # connect to host, default port |
|
21583
ec623047073a
Update the docstring too. :-)
Guido van Rossum <guido@python.org>
parents:
21582
diff
changeset
|
9 >>> ftp.login() # default, i.e.: user anonymous, passwd anonymous@ |
|
6426
068254fe5617
Return the error code from most commands, rather than swallowing it.
Guido van Rossum <guido@python.org>
parents:
5753
diff
changeset
|
10 '230 Guest login ok, access restrictions apply.' |
|
3649
63cdfbb4a2bb
Docstringified and PASV support by Siebren (including new ftpcp() function).
Guido van Rossum <guido@python.org>
parents:
3398
diff
changeset
|
11 >>> ftp.retrlines('LIST') # list directory contents |
|
63cdfbb4a2bb
Docstringified and PASV support by Siebren (including new ftpcp() function).
Guido van Rossum <guido@python.org>
parents:
3398
diff
changeset
|
12 total 9 |
|
63cdfbb4a2bb
Docstringified and PASV support by Siebren (including new ftpcp() function).
Guido van Rossum <guido@python.org>
parents:
3398
diff
changeset
|
13 drwxr-xr-x 8 root wheel 1024 Jan 3 1994 . |
|
63cdfbb4a2bb
Docstringified and PASV support by Siebren (including new ftpcp() function).
Guido van Rossum <guido@python.org>
parents:
3398
diff
changeset
|
14 drwxr-xr-x 8 root wheel 1024 Jan 3 1994 .. |
|
63cdfbb4a2bb
Docstringified and PASV support by Siebren (including new ftpcp() function).
Guido van Rossum <guido@python.org>
parents:
3398
diff
changeset
|
15 drwxr-xr-x 2 root wheel 1024 Jan 3 1994 bin |
|
63cdfbb4a2bb
Docstringified and PASV support by Siebren (including new ftpcp() function).
Guido van Rossum <guido@python.org>
parents:
3398
diff
changeset
|
16 drwxr-xr-x 2 root wheel 1024 Jan 3 1994 etc |
|
63cdfbb4a2bb
Docstringified and PASV support by Siebren (including new ftpcp() function).
Guido van Rossum <guido@python.org>
parents:
3398
diff
changeset
|
17 d-wxrwxr-x 2 ftp wheel 1024 Sep 5 13:43 incoming |
|
63cdfbb4a2bb
Docstringified and PASV support by Siebren (including new ftpcp() function).
Guido van Rossum <guido@python.org>
parents:
3398
diff
changeset
|
18 drwxr-xr-x 2 root wheel 1024 Nov 17 1993 lib |
|
63cdfbb4a2bb
Docstringified and PASV support by Siebren (including new ftpcp() function).
Guido van Rossum <guido@python.org>
parents:
3398
diff
changeset
|
19 drwxr-xr-x 6 1094 wheel 1024 Sep 13 19:07 pub |
|
63cdfbb4a2bb
Docstringified and PASV support by Siebren (including new ftpcp() function).
Guido van Rossum <guido@python.org>
parents:
3398
diff
changeset
|
20 drwxr-xr-x 3 root wheel 1024 Jan 3 1994 usr |
|
63cdfbb4a2bb
Docstringified and PASV support by Siebren (including new ftpcp() function).
Guido van Rossum <guido@python.org>
parents:
3398
diff
changeset
|
21 -rw-r--r-- 1 root root 312 Aug 1 1994 welcome.msg |
|
6426
068254fe5617
Return the error code from most commands, rather than swallowing it.
Guido van Rossum <guido@python.org>
parents:
5753
diff
changeset
|
22 '226 Transfer complete.' |
|
3649
63cdfbb4a2bb
Docstringified and PASV support by Siebren (including new ftpcp() function).
Guido van Rossum <guido@python.org>
parents:
3398
diff
changeset
|
23 >>> ftp.quit() |
|
6426
068254fe5617
Return the error code from most commands, rather than swallowing it.
Guido van Rossum <guido@python.org>
parents:
5753
diff
changeset
|
24 '221 Goodbye.' |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
25 >>> |
|
3649
63cdfbb4a2bb
Docstringified and PASV support by Siebren (including new ftpcp() function).
Guido van Rossum <guido@python.org>
parents:
3398
diff
changeset
|
26 |
|
63cdfbb4a2bb
Docstringified and PASV support by Siebren (including new ftpcp() function).
Guido van Rossum <guido@python.org>
parents:
3398
diff
changeset
|
27 A nice test that reveals some of the network dialogue would be: |
|
63cdfbb4a2bb
Docstringified and PASV support by Siebren (including new ftpcp() function).
Guido van Rossum <guido@python.org>
parents:
3398
diff
changeset
|
28 python ftplib.py -d localhost -l -p -l |
|
11708
4a23cc49e2b0
Actually, the previous batch's comment should have been different;
Guido van Rossum <guido@python.org>
parents:
11205
diff
changeset
|
29 """ |
|
1087
b9e4f7321e28
Added much functionality, changed some names (errors, login).
Guido van Rossum <guido@python.org>
parents:
1085
diff
changeset
|
30 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
31 # |
|
11870
d7eca5b0960a
Simple changes by Gerrit Holl - move author acknowledgements out of
Guido van Rossum <guido@python.org>
parents:
11708
diff
changeset
|
32 # Changes and improvements suggested by Steve Majewski. |
|
d7eca5b0960a
Simple changes by Gerrit Holl - move author acknowledgements out of
Guido van Rossum <guido@python.org>
parents:
11708
diff
changeset
|
33 # Modified by Jack to work on the mac. |
|
d7eca5b0960a
Simple changes by Gerrit Holl - move author acknowledgements out of
Guido van Rossum <guido@python.org>
parents:
11708
diff
changeset
|
34 # Modified by Siebren to support docstrings and PASV. |
|
44885
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
35 # Modified by Phil Schwartz to add storbinary and storlines callbacks. |
|
57305
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
36 # Modified by Giampaolo Rodola' to add TLS support. |
|
11870
d7eca5b0960a
Simple changes by Gerrit Holl - move author acknowledgements out of
Guido van Rossum <guido@python.org>
parents:
11708
diff
changeset
|
37 # |
|
1087
b9e4f7321e28
Added much functionality, changed some names (errors, login).
Guido van Rossum <guido@python.org>
parents:
1085
diff
changeset
|
38 |
| 1085 | 39 import os |
| 40 import sys | |
|
64216
f9ab9c92db8d
remove obsolete 'import SOCKS' statement
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
63726
diff
changeset
|
41 import socket |
|
47559
2925b568aacc
Merged revisions 63562,63570,63728,63734,63784,63788,63802,63817,63827,63839,63887,63975,63998 via svnmerge from
Georg Brandl <georg@python.org>
parents:
46430
diff
changeset
|
42 from socket import _GLOBAL_DEFAULT_TIMEOUT |
|
1746
1940892d2fe3
Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents:
1435
diff
changeset
|
43 |
| 16072 | 44 __all__ = ["FTP","Netrc"] |
| 1085 | 45 |
|
1291
517d29ebc840
* ftplib.py: added abort() command (sends oob data).
Guido van Rossum <guido@python.org>
parents:
1286
diff
changeset
|
46 # Magic number from <socket.h> |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
47 MSG_OOB = 0x1 # Process data out of band |
|
1291
517d29ebc840
* ftplib.py: added abort() command (sends oob data).
Guido van Rossum <guido@python.org>
parents:
1286
diff
changeset
|
48 |
|
517d29ebc840
* ftplib.py: added abort() command (sends oob data).
Guido van Rossum <guido@python.org>
parents:
1286
diff
changeset
|
49 |
|
1087
b9e4f7321e28
Added much functionality, changed some names (errors, login).
Guido van Rossum <guido@python.org>
parents:
1085
diff
changeset
|
50 # The standard FTP server control port |
| 1085 | 51 FTP_PORT = 21 |
| 52 | |
| 53 | |
|
1089
8d62c9056fe1
Added all_errors, list of all possible exceptions.
Guido van Rossum <guido@python.org>
parents:
1088
diff
changeset
|
54 # Exception raised when an error or invalid response is received |
|
14022
d44603f2b928
Convert some old-style string exceptions to class exceptions.
Fred Drake <fdrake@acm.org>
parents:
14014
diff
changeset
|
55 class Error(Exception): pass |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
56 class error_reply(Error): pass # unexpected [123]xx reply |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
57 class error_temp(Error): pass # 4xx errors |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
58 class error_perm(Error): pass # 5xx errors |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
59 class error_proto(Error): pass # response does not begin with [1-5] |
| 1085 | 60 |
| 61 | |
|
1089
8d62c9056fe1
Added all_errors, list of all possible exceptions.
Guido van Rossum <guido@python.org>
parents:
1088
diff
changeset
|
62 # All exceptions (hopefully) that may be raised here and that aren't |
|
8d62c9056fe1
Added all_errors, list of all possible exceptions.
Guido van Rossum <guido@python.org>
parents:
1088
diff
changeset
|
63 # (always) programming errors on our side |
|
46430
47d9bbe10897
Merged revisions 62260-62261,62266,62271,62277-62279,62289-62290,62293-62298,62302-62306,62308,62311,62313-62315,62319-62321 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
44885
diff
changeset
|
64 all_errors = (Error, IOError, EOFError) |
|
1089
8d62c9056fe1
Added all_errors, list of all possible exceptions.
Guido van Rossum <guido@python.org>
parents:
1088
diff
changeset
|
65 |
|
8d62c9056fe1
Added all_errors, list of all possible exceptions.
Guido van Rossum <guido@python.org>
parents:
1088
diff
changeset
|
66 |
| 1085 | 67 # Line terminators (we always output CRLF, but accept any of CRLF, CR, LF) |
| 68 CRLF = '\r\n' | |
|
49316
5284768c264c
Merged revisions 66634 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48769
diff
changeset
|
69 B_CRLF = b'\r\n' |
| 1085 | 70 |
| 71 # The class itself | |
| 72 class FTP: | |
| 73 | |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
74 '''An FTP client class. |
|
3649
63cdfbb4a2bb
Docstringified and PASV support by Siebren (including new ftpcp() function).
Guido van Rossum <guido@python.org>
parents:
3398
diff
changeset
|
75 |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
76 To create a connection, call the class using these arguments: |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
77 host, user, passwd, acct, timeout |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
78 |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
79 The first four arguments are all strings, and have default value ''. |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
80 timeout must be numeric and defaults to None if not passed, |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
81 meaning that no timeout will be set on any ftp socket(s) |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
82 If a timeout is passed, then this is now the default timeout for all ftp |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
83 socket operations for this instance. |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
84 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
85 Then use self.connect() with optional host and port argument. |
|
3649
63cdfbb4a2bb
Docstringified and PASV support by Siebren (including new ftpcp() function).
Guido van Rossum <guido@python.org>
parents:
3398
diff
changeset
|
86 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
87 To download a file, use ftp.retrlines('RETR ' + filename), |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
88 or ftp.retrbinary() with slightly different arguments. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
89 To upload a file, use ftp.storlines() or ftp.storbinary(), |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
90 which have an open file as argument (see their definitions |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
91 below for details). |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
92 The download/upload functions first issue appropriate TYPE |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
93 and PORT or PASV commands. |
|
42302
67b01b05a81b
Minimal changes to make ftplib work. Basically, this opens the stream in
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
94 ''' |
|
3649
63cdfbb4a2bb
Docstringified and PASV support by Siebren (including new ftpcp() function).
Guido van Rossum <guido@python.org>
parents:
3398
diff
changeset
|
95 |
|
16851
e5f2ab811ec3
Move some constant initialization from FTP.__init__() and FTP.connect()
Fred Drake <fdrake@acm.org>
parents:
16609
diff
changeset
|
96 debugging = 0 |
|
e5f2ab811ec3
Move some constant initialization from FTP.__init__() and FTP.connect()
Fred Drake <fdrake@acm.org>
parents:
16609
diff
changeset
|
97 host = '' |
|
e5f2ab811ec3
Move some constant initialization from FTP.__init__() and FTP.connect()
Fred Drake <fdrake@acm.org>
parents:
16609
diff
changeset
|
98 port = FTP_PORT |
|
e5f2ab811ec3
Move some constant initialization from FTP.__init__() and FTP.connect()
Fred Drake <fdrake@acm.org>
parents:
16609
diff
changeset
|
99 sock = None |
|
e5f2ab811ec3
Move some constant initialization from FTP.__init__() and FTP.connect()
Fred Drake <fdrake@acm.org>
parents:
16609
diff
changeset
|
100 file = None |
|
e5f2ab811ec3
Move some constant initialization from FTP.__init__() and FTP.connect()
Fred Drake <fdrake@acm.org>
parents:
16609
diff
changeset
|
101 welcome = None |
|
e5f2ab811ec3
Move some constant initialization from FTP.__init__() and FTP.connect()
Fred Drake <fdrake@acm.org>
parents:
16609
diff
changeset
|
102 passiveserver = 1 |
|
43499
5713b176ddb6
Change the default encoding for ftplib.FTP to latin1 so that bytes can be in
Brett Cannon <bcannon@gmail.com>
parents:
43020
diff
changeset
|
103 encoding = "latin1" |
|
16851
e5f2ab811ec3
Move some constant initialization from FTP.__init__() and FTP.connect()
Fred Drake <fdrake@acm.org>
parents:
16609
diff
changeset
|
104 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
105 # Initialization method (called by class instantiation). |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
106 # Initialize host to localhost, port to standard ftp port |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
107 # Optional arguments are host (for connect()), |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
108 # and user, passwd, acct (for login()) |
|
47559
2925b568aacc
Merged revisions 63562,63570,63728,63734,63784,63788,63802,63817,63827,63839,63887,63975,63998 via svnmerge from
Georg Brandl <georg@python.org>
parents:
46430
diff
changeset
|
109 def __init__(self, host='', user='', passwd='', acct='', |
|
2925b568aacc
Merged revisions 63562,63570,63728,63734,63784,63788,63802,63817,63827,63839,63887,63975,63998 via svnmerge from
Georg Brandl <georg@python.org>
parents:
46430
diff
changeset
|
110 timeout=_GLOBAL_DEFAULT_TIMEOUT): |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
111 self.timeout = timeout |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
112 if host: |
|
16851
e5f2ab811ec3
Move some constant initialization from FTP.__init__() and FTP.connect()
Fred Drake <fdrake@acm.org>
parents:
16609
diff
changeset
|
113 self.connect(host) |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
114 if user: |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
115 self.login(user, passwd, acct) |
|
1314
918bee90f73e
* calendar.py: minor cleanups
Guido van Rossum <guido@python.org>
parents:
1297
diff
changeset
|
116 |
|
61474
67dc0a98b8f6
Fix issue #4972: adds ftplib.FTP context manager protocol
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
60735
diff
changeset
|
117 def __enter__(self): |
|
67dc0a98b8f6
Fix issue #4972: adds ftplib.FTP context manager protocol
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
60735
diff
changeset
|
118 return self |
|
67dc0a98b8f6
Fix issue #4972: adds ftplib.FTP context manager protocol
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
60735
diff
changeset
|
119 |
|
67dc0a98b8f6
Fix issue #4972: adds ftplib.FTP context manager protocol
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
60735
diff
changeset
|
120 # Context management protocol: try to quit() if active |
|
67dc0a98b8f6
Fix issue #4972: adds ftplib.FTP context manager protocol
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
60735
diff
changeset
|
121 def __exit__(self, *args): |
|
67dc0a98b8f6
Fix issue #4972: adds ftplib.FTP context manager protocol
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
60735
diff
changeset
|
122 if self.sock is not None: |
|
67dc0a98b8f6
Fix issue #4972: adds ftplib.FTP context manager protocol
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
60735
diff
changeset
|
123 try: |
|
67dc0a98b8f6
Fix issue #4972: adds ftplib.FTP context manager protocol
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
60735
diff
changeset
|
124 self.quit() |
|
67dc0a98b8f6
Fix issue #4972: adds ftplib.FTP context manager protocol
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
60735
diff
changeset
|
125 except (socket.error, EOFError): |
|
67dc0a98b8f6
Fix issue #4972: adds ftplib.FTP context manager protocol
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
60735
diff
changeset
|
126 pass |
|
67dc0a98b8f6
Fix issue #4972: adds ftplib.FTP context manager protocol
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
60735
diff
changeset
|
127 finally: |
|
67dc0a98b8f6
Fix issue #4972: adds ftplib.FTP context manager protocol
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
60735
diff
changeset
|
128 if self.sock is not None: |
|
67dc0a98b8f6
Fix issue #4972: adds ftplib.FTP context manager protocol
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
60735
diff
changeset
|
129 self.close() |
|
67dc0a98b8f6
Fix issue #4972: adds ftplib.FTP context manager protocol
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
60735
diff
changeset
|
130 |
|
47559
2925b568aacc
Merged revisions 63562,63570,63728,63734,63784,63788,63802,63817,63827,63839,63887,63975,63998 via svnmerge from
Georg Brandl <georg@python.org>
parents:
46430
diff
changeset
|
131 def connect(self, host='', port=0, timeout=-999): |
|
18834
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
132 '''Connect to host. Arguments are: |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
133 - host: hostname to connect to (string, default previous host) |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
134 - port: port to connect to (integer, default previous port) |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
135 ''' |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
136 if host != '': |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
137 self.host = host |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
138 if port > 0: |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
139 self.port = port |
|
47559
2925b568aacc
Merged revisions 63562,63570,63728,63734,63784,63788,63802,63817,63827,63839,63887,63975,63998 via svnmerge from
Georg Brandl <georg@python.org>
parents:
46430
diff
changeset
|
140 if timeout != -999: |
|
41554
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
141 self.timeout = timeout |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
142 self.sock = socket.create_connection((self.host, self.port), self.timeout) |
|
06145fbc7ab9
Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
40775
diff
changeset
|
143 self.af = self.sock.family |
|
42302
67b01b05a81b
Minimal changes to make ftplib work. Basically, this opens the stream in
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
144 self.file = self.sock.makefile('r', encoding=self.encoding) |
|
18834
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
145 self.welcome = self.getresp() |
|
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
146 return self.welcome |
| 1085 | 147 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
148 def getwelcome(self): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
149 '''Get the welcome message from the server. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
150 (this is read and squirreled away by connect())''' |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
151 if self.debugging: |
|
40775
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
40742
diff
changeset
|
152 print('*welcome*', self.sanitize(self.welcome)) |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
153 return self.welcome |
| 1085 | 154 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
155 def set_debuglevel(self, level): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
156 '''Set the debugging level. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
157 The required argument level means: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
158 0: no debugging output (default) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
159 1: print commands and responses but not body text etc. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
160 2: also print raw lines read and sent before stripping CR/LF''' |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
161 self.debugging = level |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
162 debug = set_debuglevel |
| 1085 | 163 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
164 def set_pasv(self, val): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
165 '''Use passive or active mode for data transfers. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
166 With a false argument, use the normal PORT mode, |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
167 With a true argument, use the PASV command.''' |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
168 self.passiveserver = val |
|
3649
63cdfbb4a2bb
Docstringified and PASV support by Siebren (including new ftpcp() function).
Guido van Rossum <guido@python.org>
parents:
3398
diff
changeset
|
169 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
170 # Internal: "sanitize" a string for printing |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
171 def sanitize(self, s): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
172 if s[:5] == 'pass ' or s[:5] == 'PASS ': |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
173 i = len(s) |
|
64479
8ef68ebec0e1
Take advantage of the frozenset constant optimization.
Raymond Hettinger <python@rcn.com>
parents:
64253
diff
changeset
|
174 while i > 5 and s[i-1] in {'\r', '\n'}: |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
175 i = i-1 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
176 s = s[:5] + '*'*(i-5) + s[i:] |
|
31515
71a294bd7950
Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents:
23644
diff
changeset
|
177 return repr(s) |
|
2710
b689e6f92f17
don't show print passwords in debug output
Guido van Rossum <guido@python.org>
parents:
2708
diff
changeset
|
178 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
179 # Internal: send one line to the server, appending CRLF |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
180 def putline(self, line): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
181 line = line + CRLF |
|
40775
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
40742
diff
changeset
|
182 if self.debugging > 1: print('*put*', self.sanitize(line)) |
|
42302
67b01b05a81b
Minimal changes to make ftplib work. Basically, this opens the stream in
Guido van Rossum <guido@python.org>
parents:
42084
diff
changeset
|
183 self.sock.sendall(line.encode(self.encoding)) |
| 1085 | 184 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
185 # Internal: send one command to the server (through putline()) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
186 def putcmd(self, line): |
|
40775
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
40742
diff
changeset
|
187 if self.debugging: print('*cmd*', self.sanitize(line)) |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
188 self.putline(line) |
| 1085 | 189 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
190 # Internal: return one line from the server, stripping CRLF. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
191 # Raise EOFError if the connection is closed |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
192 def getline(self): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
193 line = self.file.readline() |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
194 if self.debugging > 1: |
|
40775
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
40742
diff
changeset
|
195 print('*get*', self.sanitize(line)) |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
196 if not line: raise EOFError |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
197 if line[-2:] == CRLF: line = line[:-2] |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
198 elif line[-1:] in CRLF: line = line[:-1] |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
199 return line |
| 1085 | 200 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
201 # Internal: get a response from the server, which may possibly |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
202 # consist of multiple lines. Return a single string with no |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
203 # trailing CRLF. If the response consists of multiple lines, |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
204 # these are separated by '\n' characters in the string |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
205 def getmultiline(self): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
206 line = self.getline() |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
207 if line[3:4] == '-': |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
208 code = line[:3] |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
209 while 1: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
210 nextline = self.getline() |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
211 line = line + ('\n' + nextline) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
212 if nextline[:3] == code and \ |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
213 nextline[3:4] != '-': |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
214 break |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
215 return line |
| 1085 | 216 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
217 # Internal: get a response from the server. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
218 # Raise various errors if the response indicates an error |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
219 def getresp(self): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
220 resp = self.getmultiline() |
|
40775
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
40742
diff
changeset
|
221 if self.debugging: print('*resp*', self.sanitize(resp)) |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
222 self.lastresp = resp[:3] |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
223 c = resp[:1] |
|
64479
8ef68ebec0e1
Take advantage of the frozenset constant optimization.
Raymond Hettinger <python@rcn.com>
parents:
64253
diff
changeset
|
224 if c in {'1', '2', '3'}: |
| 35400 | 225 return resp |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
226 if c == '4': |
|
43020
907a45df1295
Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents:
42302
diff
changeset
|
227 raise error_temp(resp) |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
228 if c == '5': |
|
43020
907a45df1295
Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents:
42302
diff
changeset
|
229 raise error_perm(resp) |
|
907a45df1295
Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents:
42302
diff
changeset
|
230 raise error_proto(resp) |
| 1085 | 231 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
232 def voidresp(self): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
233 """Expect a response beginning with '2'.""" |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
234 resp = self.getresp() |
|
52892
792bb885029f
Merged revisions 70712,70714,70764-70765,70769-70771,70773,70776-70777,70788-70789,70824,70828,70832,70836,70842,70851,70855,70857,70866-70872,70883,70885,70893-70894,70896-70897,70903,70905-70907,70915,70927,70933,70951,70960,70962-70964,70998,71001,71006,71008,71010-71011,71019,71037,71056,71094,71101-71103,71106,71119,71123,71149-71150,71203,71212,71214-71217,71221,71240 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49317
diff
changeset
|
235 if resp[:1] != '2': |
|
43020
907a45df1295
Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents:
42302
diff
changeset
|
236 raise error_reply(resp) |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
237 return resp |
|
1087
b9e4f7321e28
Added much functionality, changed some names (errors, login).
Guido van Rossum <guido@python.org>
parents:
1085
diff
changeset
|
238 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
239 def abort(self): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
240 '''Abort a file transfer. Uses out-of-band data. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
241 This does not follow the procedure from the RFC to send Telnet |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
242 IP and Synch; that doesn't seem to work with the servers I've |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
243 tried. Instead, just send the ABOR command as OOB data.''' |
|
69919
31220cd936d2
#12002 - ftplib's abort() method raises TypeError
Giampaolo Rodola' <g.rodola@gmail.com>
parents:
60736
diff
changeset
|
244 line = b'ABOR' + B_CRLF |
|
40775
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
40742
diff
changeset
|
245 if self.debugging > 1: print('*put urgent*', self.sanitize(line)) |
|
21962
d3b1f2c0ebcf
The Grande 'sendall()' patch, copied from release21-maint. Fixes #516715.
Martin v. Löwis <martin@v.loewis.de>
parents:
21958
diff
changeset
|
246 self.sock.sendall(line, MSG_OOB) |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
247 resp = self.getmultiline() |
|
64479
8ef68ebec0e1
Take advantage of the frozenset constant optimization.
Raymond Hettinger <python@rcn.com>
parents:
64253
diff
changeset
|
248 if resp[:3] not in {'426', '225', '226'}: |
|
43020
907a45df1295
Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents:
42302
diff
changeset
|
249 raise error_proto(resp) |
|
69919
31220cd936d2
#12002 - ftplib's abort() method raises TypeError
Giampaolo Rodola' <g.rodola@gmail.com>
parents:
60736
diff
changeset
|
250 return resp |
|
1291
517d29ebc840
* ftplib.py: added abort() command (sends oob data).
Guido van Rossum <guido@python.org>
parents:
1286
diff
changeset
|
251 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
252 def sendcmd(self, cmd): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
253 '''Send a command and return the response.''' |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
254 self.putcmd(cmd) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
255 return self.getresp() |
| 1085 | 256 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
257 def voidcmd(self, cmd): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
258 """Send a command and expect a response beginning with '2'.""" |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
259 self.putcmd(cmd) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
260 return self.voidresp() |
|
1087
b9e4f7321e28
Added much functionality, changed some names (errors, login).
Guido van Rossum <guido@python.org>
parents:
1085
diff
changeset
|
261 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
262 def sendport(self, host, port): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
263 '''Send a PORT command with the current host and the given |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
264 port number. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
265 ''' |
|
16504
6ffce8be3e0b
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
16072
diff
changeset
|
266 hbytes = host.split('.') |
|
49317
d70bcf3b628d
#3911 FTP.makeport was giving bad port numbers
Benjamin Peterson <benjamin@python.org>
parents:
49316
diff
changeset
|
267 pbytes = [repr(port//256), repr(port%256)] |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
268 bytes = hbytes + pbytes |
|
16504
6ffce8be3e0b
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
16072
diff
changeset
|
269 cmd = 'PORT ' + ','.join(bytes) |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
270 return self.voidcmd(cmd) |
| 1085 | 271 |
|
18825
40900620293e
Patch #401196: Use getaddrinfo and AF_INET6 in TCP servers and clients.
Martin v. Löwis <martin@v.loewis.de>
parents:
17347
diff
changeset
|
272 def sendeprt(self, host, port): |
|
18834
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
273 '''Send a EPRT command with the current host and the given port number.''' |
|
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
274 af = 0 |
|
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
275 if self.af == socket.AF_INET: |
|
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
276 af = 1 |
|
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
277 if self.af == socket.AF_INET6: |
|
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
278 af = 2 |
|
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
279 if af == 0: |
|
43020
907a45df1295
Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents:
42302
diff
changeset
|
280 raise error_proto('unsupported address family') |
|
31515
71a294bd7950
Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents:
23644
diff
changeset
|
281 fields = ['', repr(af), host, repr(port), ''] |
|
23590
a4bb18212b48
Use string methods where possible, and remove import string
Neal Norwitz <nnorwitz@gmail.com>
parents:
23419
diff
changeset
|
282 cmd = 'EPRT ' + '|'.join(fields) |
|
18834
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
283 return self.voidcmd(cmd) |
|
18825
40900620293e
Patch #401196: Use getaddrinfo and AF_INET6 in TCP servers and clients.
Martin v. Löwis <martin@v.loewis.de>
parents:
17347
diff
changeset
|
284 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
285 def makeport(self): |
|
18834
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
286 '''Create a new socket and send a PORT command for it.''' |
|
18902
edf058b16ddf
Initialize msg to avoid unbound locals.
Martin v. Löwis <martin@v.loewis.de>
parents:
18834
diff
changeset
|
287 msg = "getaddrinfo returns an empty list" |
|
20303
faec69c11640
Only close sockets if they have been created. Reported by Blake Winton.
Martin v. Löwis <martin@v.loewis.de>
parents:
19341
diff
changeset
|
288 sock = None |
|
18834
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
289 for res in socket.getaddrinfo(None, 0, self.af, socket.SOCK_STREAM, 0, socket.AI_PASSIVE): |
|
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
290 af, socktype, proto, canonname, sa = res |
|
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
291 try: |
|
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
292 sock = socket.socket(af, socktype, proto) |
|
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
293 sock.bind(sa) |
|
40587
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
294 except socket.error as msg: |
|
20303
faec69c11640
Only close sockets if they have been created. Reported by Blake Winton.
Martin v. Löwis <martin@v.loewis.de>
parents:
19341
diff
changeset
|
295 if sock: |
|
faec69c11640
Only close sockets if they have been created. Reported by Blake Winton.
Martin v. Löwis <martin@v.loewis.de>
parents:
19341
diff
changeset
|
296 sock.close() |
|
18834
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
297 sock = None |
|
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
298 continue |
|
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
299 break |
|
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
300 if not sock: |
|
43020
907a45df1295
Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents:
42302
diff
changeset
|
301 raise socket.error(msg) |
|
18834
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
302 sock.listen(1) |
|
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
303 port = sock.getsockname()[1] # Get proper port |
|
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
304 host = self.sock.getsockname()[0] # Get proper host |
|
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
305 if self.af == socket.AF_INET: |
|
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
306 resp = self.sendport(host, port) |
|
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
307 else: |
|
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
308 resp = self.sendeprt(host, port) |
|
60736
c13f825fdeab
Merged revisions 80228 via svnmerge from
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
60682
diff
changeset
|
309 if self.timeout is not _GLOBAL_DEFAULT_TIMEOUT: |
|
c13f825fdeab
Merged revisions 80228 via svnmerge from
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
60682
diff
changeset
|
310 sock.settimeout(self.timeout) |
|
18834
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
311 return sock |
|
18825
40900620293e
Patch #401196: Use getaddrinfo and AF_INET6 in TCP servers and clients.
Martin v. Löwis <martin@v.loewis.de>
parents:
17347
diff
changeset
|
312 |
|
40900620293e
Patch #401196: Use getaddrinfo and AF_INET6 in TCP servers and clients.
Martin v. Löwis <martin@v.loewis.de>
parents:
17347
diff
changeset
|
313 def makepasv(self): |
|
18834
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
314 if self.af == socket.AF_INET: |
|
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
315 host, port = parse227(self.sendcmd('PASV')) |
|
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
316 else: |
|
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
317 host, port = parse229(self.sendcmd('EPSV'), self.sock.getpeername()) |
|
7e52bf52ae33
Untabify IPv6 changes.
Martin v. Löwis <martin@v.loewis.de>
parents:
18825
diff
changeset
|
318 return host, port |
| 1085 | 319 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
320 def ntransfercmd(self, cmd, rest=None): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
321 """Initiate a transfer over the data connection. |
|
14338
057c7ceb92f0
Added support for RFC 959's REST command (restart), closing SF patch
Barry Warsaw <barry@python.org>
parents:
14022
diff
changeset
|
322 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
323 If the transfer is active, send a port command and the |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
324 transfer command, and accept the connection. If the server is |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
325 passive, send a pasv command, connect to it, and start the |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
326 transfer command. Either way, return the socket for the |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
327 connection and the expected size of the transfer. The |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
328 expected size may be None if it could not be determined. |
|
14338
057c7ceb92f0
Added support for RFC 959's REST command (restart), closing SF patch
Barry Warsaw <barry@python.org>
parents:
14022
diff
changeset
|
329 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
330 Optional `rest' argument can be a string that is sent as the |
|
44885
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
331 argument to a REST command. This is essentially a server |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
332 marker used to tell the server to skip over any data up to the |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
333 given marker. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
334 """ |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
335 size = None |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
336 if self.passiveserver: |
|
18825
40900620293e
Patch #401196: Use getaddrinfo and AF_INET6 in TCP servers and clients.
Martin v. Löwis <martin@v.loewis.de>
parents:
17347
diff
changeset
|
337 host, port = self.makepasv() |
|
42084
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41554
diff
changeset
|
338 conn = socket.create_connection((host, port), self.timeout) |
|
71474
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
339 try: |
|
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
340 if rest is not None: |
|
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
341 self.sendcmd("REST %s" % rest) |
|
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
342 resp = self.sendcmd(cmd) |
|
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
343 # Some servers apparently send a 200 reply to |
|
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
344 # a LIST or STOR command, before the 150 reply |
|
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
345 # (and way before the 226 reply). This seems to |
|
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
346 # be in violation of the protocol (which only allows |
|
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
347 # 1xx or error messages for LIST), so we just discard |
|
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
348 # this response. |
|
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
349 if resp[0] == '2': |
|
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
350 resp = self.getresp() |
|
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
351 if resp[0] != '1': |
|
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
352 raise error_reply(resp) |
|
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
353 except: |
|
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
354 conn.close() |
|
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
355 raise |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
356 else: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
357 sock = self.makeport() |
|
71474
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
358 try: |
|
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
359 if rest is not None: |
|
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
360 self.sendcmd("REST %s" % rest) |
|
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
361 resp = self.sendcmd(cmd) |
|
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
362 # See above. |
|
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
363 if resp[0] == '2': |
|
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
364 resp = self.getresp() |
|
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
365 if resp[0] != '1': |
|
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
366 raise error_reply(resp) |
|
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
367 conn, sockaddr = sock.accept() |
|
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
368 if self.timeout is not _GLOBAL_DEFAULT_TIMEOUT: |
|
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
369 conn.settimeout(self.timeout) |
|
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
370 finally: |
|
c741ba9e37ef
Issue #10883: Fix socket leaks in urllib.request.
Nadeem Vawda <nadeem.vawda@gmail.com>
parents:
69920
diff
changeset
|
371 sock.close() |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
372 if resp[:3] == '150': |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
373 # this is conditional in case we received a 125 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
374 size = parse150(resp) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
375 return conn, size |
|
4927
040493de848d
(ftplib.py): Added parse150() function and FTP.ntransfercmd(). This allows
Fred Drake <fdrake@acm.org>
parents:
4345
diff
changeset
|
376 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
377 def transfercmd(self, cmd, rest=None): |
|
20461
7e71eebab4ea
Fix SF bug #459767: ftplib fails with files > 2GB
Guido van Rossum <guido@python.org>
parents:
20303
diff
changeset
|
378 """Like ntransfercmd() but returns only the socket.""" |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
379 return self.ntransfercmd(cmd, rest)[0] |
|
1087
b9e4f7321e28
Added much functionality, changed some names (errors, login).
Guido van Rossum <guido@python.org>
parents:
1085
diff
changeset
|
380 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
381 def login(self, user = '', passwd = '', acct = ''): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
382 '''Login, default anonymous.''' |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
383 if not user: user = 'anonymous' |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
384 if not passwd: passwd = '' |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
385 if not acct: acct = '' |
|
64479
8ef68ebec0e1
Take advantage of the frozenset constant optimization.
Raymond Hettinger <python@rcn.com>
parents:
64253
diff
changeset
|
386 if user == 'anonymous' and passwd in {'', '-'}: |
|
21958
5ed782bdbb2a
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
21583
diff
changeset
|
387 # If there is no anonymous ftp password specified |
|
5ed782bdbb2a
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
21583
diff
changeset
|
388 # then we'll just use anonymous@ |
|
5ed782bdbb2a
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
21583
diff
changeset
|
389 # We don't send any other thing because: |
|
5ed782bdbb2a
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
21583
diff
changeset
|
390 # - We want to remain anonymous |
|
5ed782bdbb2a
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
21583
diff
changeset
|
391 # - We want to stop SPAM |
|
5ed782bdbb2a
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
21583
diff
changeset
|
392 # - We don't want to let ftp sites to discriminate by the user, |
|
5ed782bdbb2a
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
21583
diff
changeset
|
393 # host or country. |
|
21582
a2eab4de5505
SF patch #497420 (Eduardo Pérez): ftplib: ftp anonymous password
Guido van Rossum <guido@python.org>
parents:
21536
diff
changeset
|
394 passwd = passwd + 'anonymous@' |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
395 resp = self.sendcmd('USER ' + user) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
396 if resp[0] == '3': resp = self.sendcmd('PASS ' + passwd) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
397 if resp[0] == '3': resp = self.sendcmd('ACCT ' + acct) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
398 if resp[0] != '2': |
|
43020
907a45df1295
Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents:
42302
diff
changeset
|
399 raise error_reply(resp) |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
400 return resp |
|
1087
b9e4f7321e28
Added much functionality, changed some names (errors, login).
Guido van Rossum <guido@python.org>
parents:
1085
diff
changeset
|
401 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
402 def retrbinary(self, cmd, callback, blocksize=8192, rest=None): |
|
44885
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
403 """Retrieve data in binary mode. A new port is created for you. |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
404 |
|
44885
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
405 Args: |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
406 cmd: A RETR command. |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
407 callback: A single parameter callable to be called on each |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
408 block of data read. |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
409 blocksize: The maximum number of bytes to read from the |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
410 socket at one time. [default: 8192] |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
411 rest: Passed to transfercmd(). [default: None] |
|
14338
057c7ceb92f0
Added support for RFC 959's REST command (restart), closing SF patch
Barry Warsaw <barry@python.org>
parents:
14022
diff
changeset
|
412 |
|
44885
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
413 Returns: |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
414 The response code. |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
415 """ |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
416 self.voidcmd('TYPE I') |
|
65836
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
417 with self.transfercmd(cmd, rest) as conn: |
|
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
418 while 1: |
|
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
419 data = conn.recv(blocksize) |
|
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
420 if not data: |
|
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
421 break |
|
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
422 callback(data) |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
423 return self.voidresp() |
| 1085 | 424 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
425 def retrlines(self, cmd, callback = None): |
|
44885
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
426 """Retrieve data in line mode. A new port is created for you. |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
427 |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
428 Args: |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
429 cmd: A RETR, LIST, NLST, or MLSD command. |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
430 callback: An optional single parameter callable that is called |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
431 for each line with the trailing CRLF stripped. |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
432 [default: print_line()] |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
433 |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
434 Returns: |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
435 The response code. |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
436 """ |
|
23419
4f67e56686e5
Closes SF patch 553277. Per GvR, reverting to original patch -- the way to
Raymond Hettinger <python@rcn.com>
parents:
23400
diff
changeset
|
437 if callback is None: callback = print_line |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
438 resp = self.sendcmd('TYPE A') |
|
65836
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
439 with self.transfercmd(cmd) as conn, \ |
|
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
440 conn.makefile('r', encoding=self.encoding) as fp: |
|
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
441 while 1: |
|
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
442 line = fp.readline() |
|
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
443 if self.debugging > 2: print('*retr*', repr(line)) |
|
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
444 if not line: |
|
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
445 break |
|
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
446 if line[-2:] == CRLF: |
|
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
447 line = line[:-2] |
|
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
448 elif line[-1:] == '\n': |
|
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
449 line = line[:-1] |
|
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
450 callback(line) |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
451 return self.voidresp() |
|
1087
b9e4f7321e28
Added much functionality, changed some names (errors, login).
Guido van Rossum <guido@python.org>
parents:
1085
diff
changeset
|
452 |
|
57470
c9369092fefc
Merged revisions 76546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57305
diff
changeset
|
453 def storbinary(self, cmd, fp, blocksize=8192, callback=None, rest=None): |
|
44885
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
454 """Store a file in binary mode. A new port is created for you. |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
455 |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
456 Args: |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
457 cmd: A STOR command. |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
458 fp: A file-like object with a read(num_bytes) method. |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
459 blocksize: The maximum data size to read from fp and send over |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
460 the connection at once. [default: 8192] |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
461 callback: An optional single parameter callable that is called on |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
462 on each block of data after it is sent. [default: None] |
|
57470
c9369092fefc
Merged revisions 76546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57305
diff
changeset
|
463 rest: Passed to transfercmd(). [default: None] |
|
44885
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
464 |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
465 Returns: |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
466 The response code. |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
467 """ |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
468 self.voidcmd('TYPE I') |
|
65836
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
469 with self.transfercmd(cmd, rest) as conn: |
|
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
470 while 1: |
|
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
471 buf = fp.read(blocksize) |
|
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
472 if not buf: break |
|
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
473 conn.sendall(buf) |
|
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
474 if callback: callback(buf) |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
475 return self.voidresp() |
| 1085 | 476 |
|
44885
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
477 def storlines(self, cmd, fp, callback=None): |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
478 """Store a file in line mode. A new port is created for you. |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
479 |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
480 Args: |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
481 cmd: A STOR command. |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
482 fp: A file-like object with a readline() method. |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
483 callback: An optional single parameter callable that is called on |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
484 on each line after it is sent. [default: None] |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
485 |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
486 Returns: |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
487 The response code. |
|
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
488 """ |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
489 self.voidcmd('TYPE A') |
|
65836
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
490 with self.transfercmd(cmd) as conn: |
|
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
491 while 1: |
|
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
492 buf = fp.readline() |
|
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
493 if not buf: break |
|
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
494 if buf[-2:] != B_CRLF: |
|
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
495 if buf[-1] in B_CRLF: buf = buf[:-1] |
|
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
496 buf = buf + B_CRLF |
|
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
497 conn.sendall(buf) |
|
43acc9543416
wrap some things in with blocks
Benjamin Peterson <benjamin@python.org>
parents:
64479
diff
changeset
|
498 if callback: callback(buf) |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
499 return self.voidresp() |
|
1087
b9e4f7321e28
Added much functionality, changed some names (errors, login).
Guido van Rossum <guido@python.org>
parents:
1085
diff
changeset
|
500 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
501 def acct(self, password): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
502 '''Send new account name.''' |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
503 cmd = 'ACCT ' + password |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
504 return self.voidcmd(cmd) |
|
3359
08985431500b
add acct() method to send new account name
Guido van Rossum <guido@python.org>
parents:
3201
diff
changeset
|
505 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
506 def nlst(self, *args): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
507 '''Return a list of files in a given directory (default the current).''' |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
508 cmd = 'NLST' |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
509 for arg in args: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
510 cmd = cmd + (' ' + arg) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
511 files = [] |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
512 self.retrlines(cmd, files.append) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
513 return files |
|
1087
b9e4f7321e28
Added much functionality, changed some names (errors, login).
Guido van Rossum <guido@python.org>
parents:
1085
diff
changeset
|
514 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
515 def dir(self, *args): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
516 '''List a directory in long form. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
517 By default list current directory to stdout. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
518 Optional last argument is callback function; all |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
519 non-empty arguments before it are concatenated to the |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
520 LIST command. (This *should* only be used for a pathname.)''' |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
521 cmd = 'LIST' |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
522 func = None |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
523 if args[-1:] and type(args[-1]) != type(''): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
524 args, func = args[:-1], args[-1] |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
525 for arg in args: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
526 if arg: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
527 cmd = cmd + (' ' + arg) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
528 self.retrlines(cmd, func) |
|
1416
d6f6a1cb7d79
* test_*.py: new lambda syntax (also affects tests for filter, map,
Guido van Rossum <guido@python.org>
parents:
1403
diff
changeset
|
529 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
530 def rename(self, fromname, toname): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
531 '''Rename a file.''' |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
532 resp = self.sendcmd('RNFR ' + fromname) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
533 if resp[0] != '3': |
|
43020
907a45df1295
Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents:
42302
diff
changeset
|
534 raise error_reply(resp) |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
535 return self.voidcmd('RNTO ' + toname) |
|
1087
b9e4f7321e28
Added much functionality, changed some names (errors, login).
Guido van Rossum <guido@python.org>
parents:
1085
diff
changeset
|
536 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
537 def delete(self, filename): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
538 '''Delete a file.''' |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
539 resp = self.sendcmd('DELE ' + filename) |
|
64479
8ef68ebec0e1
Take advantage of the frozenset constant optimization.
Raymond Hettinger <python@rcn.com>
parents:
64253
diff
changeset
|
540 if resp[:3] in {'250', '200'}: |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
541 return resp |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
542 else: |
|
43020
907a45df1295
Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents:
42302
diff
changeset
|
543 raise error_reply(resp) |
|
3201
19b58ce794c9
add delete() method to ftp object
Guido van Rossum <guido@python.org>
parents:
3132
diff
changeset
|
544 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
545 def cwd(self, dirname): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
546 '''Change to a directory.''' |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
547 if dirname == '..': |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
548 try: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
549 return self.voidcmd('CDUP') |
|
40587
6b18a095c2e7
SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents:
40450
diff
changeset
|
550 except error_perm as msg: |
|
22209
0b08eefb6fc0
Access the exception argument to see whether it starts with '500'.
Martin v. Löwis <martin@v.loewis.de>
parents:
21962
diff
changeset
|
551 if msg.args[0][:3] != '500': |
|
0b08eefb6fc0
Access the exception argument to see whether it starts with '500'.
Martin v. Löwis <martin@v.loewis.de>
parents:
21962
diff
changeset
|
552 raise |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
553 elif dirname == '': |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
554 dirname = '.' # does nothing, but could return error |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
555 cmd = 'CWD ' + dirname |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
556 return self.voidcmd(cmd) |
| 1286 | 557 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
558 def size(self, filename): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
559 '''Retrieve the size of a file.''' |
|
44885
fefaa0e66fdd
Merged revisions 60176-60209 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
43499
diff
changeset
|
560 # The SIZE command is defined in RFC-3659 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
561 resp = self.sendcmd('SIZE ' + filename) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
562 if resp[:3] == '213': |
|
20461
7e71eebab4ea
Fix SF bug #459767: ftplib fails with files > 2GB
Guido van Rossum <guido@python.org>
parents:
20303
diff
changeset
|
563 s = resp[3:].strip() |
|
7e71eebab4ea
Fix SF bug #459767: ftplib fails with files > 2GB
Guido van Rossum <guido@python.org>
parents:
20303
diff
changeset
|
564 try: |
|
7e71eebab4ea
Fix SF bug #459767: ftplib fails with files > 2GB
Guido van Rossum <guido@python.org>
parents:
20303
diff
changeset
|
565 return int(s) |
|
20500
fddacefeeb36
Oops. Catching OverflowError from int() doesn't help, since it raises
Guido van Rossum <guido@python.org>
parents:
20461
diff
changeset
|
566 except (OverflowError, ValueError): |
|
40644
1c26505c1de6
Rip out 'long' and 'L'-suffixed integer literals.
Guido van Rossum <guido@python.org>
parents:
40633
diff
changeset
|
567 return int(s) |
|
1297
9234c961ec43
* toaiff.py: import whatsound instead of sndhdr
Guido van Rossum <guido@python.org>
parents:
1291
diff
changeset
|
568 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
569 def mkd(self, dirname): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
570 '''Make a directory, return its full pathname.''' |
|
64253
7895c4553bf5
fix issue 9601: ftplib now provides a workaround for invalid response code returned on MKD and PWD by non-compliant FTPserver implementations such as ISS shipped with Windows server 2003
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
64216
diff
changeset
|
571 resp = self.voidcmd('MKD ' + dirname) |
|
7895c4553bf5
fix issue 9601: ftplib now provides a workaround for invalid response code returned on MKD and PWD by non-compliant FTPserver implementations such as ISS shipped with Windows server 2003
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
64216
diff
changeset
|
572 # fix around non-compliant implementations such as IIS shipped |
|
7895c4553bf5
fix issue 9601: ftplib now provides a workaround for invalid response code returned on MKD and PWD by non-compliant FTPserver implementations such as ISS shipped with Windows server 2003
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
64216
diff
changeset
|
573 # with Windows server 2003 |
|
7895c4553bf5
fix issue 9601: ftplib now provides a workaround for invalid response code returned on MKD and PWD by non-compliant FTPserver implementations such as ISS shipped with Windows server 2003
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
64216
diff
changeset
|
574 if not resp.startswith('257'): |
|
7895c4553bf5
fix issue 9601: ftplib now provides a workaround for invalid response code returned on MKD and PWD by non-compliant FTPserver implementations such as ISS shipped with Windows server 2003
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
64216
diff
changeset
|
575 return '' |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
576 return parse257(resp) |
|
1087
b9e4f7321e28
Added much functionality, changed some names (errors, login).
Guido van Rossum <guido@python.org>
parents:
1085
diff
changeset
|
577 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
578 def rmd(self, dirname): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
579 '''Remove a directory.''' |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
580 return self.voidcmd('RMD ' + dirname) |
|
7411
ad891f6a19ee
Add rmd() (remove directory command); fix comment in parse257.
Guido van Rossum <guido@python.org>
parents:
6733
diff
changeset
|
581 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
582 def pwd(self): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
583 '''Return current working directory.''' |
|
64253
7895c4553bf5
fix issue 9601: ftplib now provides a workaround for invalid response code returned on MKD and PWD by non-compliant FTPserver implementations such as ISS shipped with Windows server 2003
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
64216
diff
changeset
|
584 resp = self.voidcmd('PWD') |
|
7895c4553bf5
fix issue 9601: ftplib now provides a workaround for invalid response code returned on MKD and PWD by non-compliant FTPserver implementations such as ISS shipped with Windows server 2003
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
64216
diff
changeset
|
585 # fix around non-compliant implementations such as IIS shipped |
|
7895c4553bf5
fix issue 9601: ftplib now provides a workaround for invalid response code returned on MKD and PWD by non-compliant FTPserver implementations such as ISS shipped with Windows server 2003
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
64216
diff
changeset
|
586 # with Windows server 2003 |
|
7895c4553bf5
fix issue 9601: ftplib now provides a workaround for invalid response code returned on MKD and PWD by non-compliant FTPserver implementations such as ISS shipped with Windows server 2003
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
64216
diff
changeset
|
587 if not resp.startswith('257'): |
|
7895c4553bf5
fix issue 9601: ftplib now provides a workaround for invalid response code returned on MKD and PWD by non-compliant FTPserver implementations such as ISS shipped with Windows server 2003
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
64216
diff
changeset
|
588 return '' |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
589 return parse257(resp) |
| 1085 | 590 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
591 def quit(self): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
592 '''Quit, and close the connection.''' |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
593 resp = self.voidcmd('QUIT') |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
594 self.close() |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
595 return resp |
|
1297
9234c961ec43
* toaiff.py: import whatsound instead of sndhdr
Guido van Rossum <guido@python.org>
parents:
1291
diff
changeset
|
596 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
597 def close(self): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
598 '''Close the connection without assuming anything about it.''' |
|
16851
e5f2ab811ec3
Move some constant initialization from FTP.__init__() and FTP.connect()
Fred Drake <fdrake@acm.org>
parents:
16609
diff
changeset
|
599 if self.file: |
|
e5f2ab811ec3
Move some constant initialization from FTP.__init__() and FTP.connect()
Fred Drake <fdrake@acm.org>
parents:
16609
diff
changeset
|
600 self.file.close() |
|
e5f2ab811ec3
Move some constant initialization from FTP.__init__() and FTP.connect()
Fred Drake <fdrake@acm.org>
parents:
16609
diff
changeset
|
601 self.sock.close() |
|
e5f2ab811ec3
Move some constant initialization from FTP.__init__() and FTP.connect()
Fred Drake <fdrake@acm.org>
parents:
16609
diff
changeset
|
602 self.file = self.sock = None |
|
1087
b9e4f7321e28
Added much functionality, changed some names (errors, login).
Guido van Rossum <guido@python.org>
parents:
1085
diff
changeset
|
603 |
|
b9e4f7321e28
Added much functionality, changed some names (errors, login).
Guido van Rossum <guido@python.org>
parents:
1085
diff
changeset
|
604 |
|
57305
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
605 try: |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
606 import ssl |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
607 except ImportError: |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
608 pass |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
609 else: |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
610 class FTP_TLS(FTP): |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
611 '''A FTP subclass which adds TLS support to FTP as described |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
612 in RFC-4217. |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
613 |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
614 Connect as usual to port 21 implicitly securing the FTP control |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
615 connection before authenticating. |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
616 |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
617 Securing the data connection requires user to explicitly ask |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
618 for it by calling prot_p() method. |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
619 |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
620 Usage example: |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
621 >>> from ftplib import FTP_TLS |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
622 >>> ftps = FTP_TLS('ftp.python.org') |
|
68489
81d7f78a633a
#11515: Merge with 3.1.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
68257
diff
changeset
|
623 >>> ftps.login() # login anonymously previously securing control channel |
|
57305
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
624 '230 Guest login ok, access restrictions apply.' |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
625 >>> ftps.prot_p() # switch to secure data connection |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
626 '200 Protection level set to P' |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
627 >>> ftps.retrlines('LIST') # list directory content securely |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
628 total 9 |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
629 drwxr-xr-x 8 root wheel 1024 Jan 3 1994 . |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
630 drwxr-xr-x 8 root wheel 1024 Jan 3 1994 .. |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
631 drwxr-xr-x 2 root wheel 1024 Jan 3 1994 bin |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
632 drwxr-xr-x 2 root wheel 1024 Jan 3 1994 etc |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
633 d-wxrwxr-x 2 ftp wheel 1024 Sep 5 13:43 incoming |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
634 drwxr-xr-x 2 root wheel 1024 Nov 17 1993 lib |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
635 drwxr-xr-x 6 1094 wheel 1024 Sep 13 19:07 pub |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
636 drwxr-xr-x 3 root wheel 1024 Jan 3 1994 usr |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
637 -rw-r--r-- 1 root root 312 Aug 1 1994 welcome.msg |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
638 '226 Transfer complete.' |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
639 >>> ftps.quit() |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
640 '221 Goodbye.' |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
641 >>> |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
642 ''' |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
643 ssl_version = ssl.PROTOCOL_TLSv1 |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
644 |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
645 def __init__(self, host='', user='', passwd='', acct='', keyfile=None, |
|
61931
8328c5c3272c
Fix issue #8806: add SSL contexts support to ftplib
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
61474
diff
changeset
|
646 certfile=None, context=None, |
|
8328c5c3272c
Fix issue #8806: add SSL contexts support to ftplib
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
61474
diff
changeset
|
647 timeout=_GLOBAL_DEFAULT_TIMEOUT): |
|
8328c5c3272c
Fix issue #8806: add SSL contexts support to ftplib
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
61474
diff
changeset
|
648 if context is not None and keyfile is not None: |
|
8328c5c3272c
Fix issue #8806: add SSL contexts support to ftplib
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
61474
diff
changeset
|
649 raise ValueError("context and keyfile arguments are mutually " |
|
8328c5c3272c
Fix issue #8806: add SSL contexts support to ftplib
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
61474
diff
changeset
|
650 "exclusive") |
|
8328c5c3272c
Fix issue #8806: add SSL contexts support to ftplib
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
61474
diff
changeset
|
651 if context is not None and certfile is not None: |
|
8328c5c3272c
Fix issue #8806: add SSL contexts support to ftplib
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
61474
diff
changeset
|
652 raise ValueError("context and certfile arguments are mutually " |
|
8328c5c3272c
Fix issue #8806: add SSL contexts support to ftplib
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
61474
diff
changeset
|
653 "exclusive") |
|
57305
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
654 self.keyfile = keyfile |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
655 self.certfile = certfile |
|
61931
8328c5c3272c
Fix issue #8806: add SSL contexts support to ftplib
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
61474
diff
changeset
|
656 self.context = context |
|
57305
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
657 self._prot_p = False |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
658 FTP.__init__(self, host, user, passwd, acct, timeout) |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
659 |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
660 def login(self, user='', passwd='', acct='', secure=True): |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
661 if secure and not isinstance(self.sock, ssl.SSLSocket): |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
662 self.auth() |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
663 return FTP.login(self, user, passwd, acct) |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
664 |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
665 def auth(self): |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
666 '''Set up secure control connection by using TLS/SSL.''' |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
667 if isinstance(self.sock, ssl.SSLSocket): |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
668 raise ValueError("Already using TLS") |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
669 if self.ssl_version == ssl.PROTOCOL_TLSv1: |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
670 resp = self.voidcmd('AUTH TLS') |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
671 else: |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
672 resp = self.voidcmd('AUTH SSL') |
|
61931
8328c5c3272c
Fix issue #8806: add SSL contexts support to ftplib
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
61474
diff
changeset
|
673 if self.context is not None: |
|
8328c5c3272c
Fix issue #8806: add SSL contexts support to ftplib
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
61474
diff
changeset
|
674 self.sock = self.context.wrap_socket(self.sock) |
|
8328c5c3272c
Fix issue #8806: add SSL contexts support to ftplib
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
61474
diff
changeset
|
675 else: |
|
8328c5c3272c
Fix issue #8806: add SSL contexts support to ftplib
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
61474
diff
changeset
|
676 self.sock = ssl.wrap_socket(self.sock, self.keyfile, |
|
8328c5c3272c
Fix issue #8806: add SSL contexts support to ftplib
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
61474
diff
changeset
|
677 self.certfile, |
|
8328c5c3272c
Fix issue #8806: add SSL contexts support to ftplib
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
61474
diff
changeset
|
678 ssl_version=self.ssl_version) |
|
57305
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
679 self.file = self.sock.makefile(mode='r', encoding=self.encoding) |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
680 return resp |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
681 |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
682 def prot_p(self): |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
683 '''Set up secure data connection.''' |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
684 # PROT defines whether or not the data channel is to be protected. |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
685 # Though RFC-2228 defines four possible protection levels, |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
686 # RFC-4217 only recommends two, Clear and Private. |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
687 # Clear (PROT C) means that no security is to be used on the |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
688 # data-channel, Private (PROT P) means that the data-channel |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
689 # should be protected by TLS. |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
690 # PBSZ command MUST still be issued, but must have a parameter of |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
691 # '0' to indicate that no buffering is taking place and the data |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
692 # connection should not be encapsulated. |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
693 self.voidcmd('PBSZ 0') |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
694 resp = self.voidcmd('PROT P') |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
695 self._prot_p = True |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
696 return resp |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
697 |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
698 def prot_c(self): |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
699 '''Set up clear text data connection.''' |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
700 resp = self.voidcmd('PROT C') |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
701 self._prot_p = False |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
702 return resp |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
703 |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
704 # --- Overridden FTP methods |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
705 |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
706 def ntransfercmd(self, cmd, rest=None): |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
707 conn, size = FTP.ntransfercmd(self, cmd, rest) |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
708 if self._prot_p: |
|
61931
8328c5c3272c
Fix issue #8806: add SSL contexts support to ftplib
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
61474
diff
changeset
|
709 if self.context is not None: |
|
8328c5c3272c
Fix issue #8806: add SSL contexts support to ftplib
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
61474
diff
changeset
|
710 conn = self.context.wrap_socket(conn) |
|
8328c5c3272c
Fix issue #8806: add SSL contexts support to ftplib
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
61474
diff
changeset
|
711 else: |
|
8328c5c3272c
Fix issue #8806: add SSL contexts support to ftplib
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
61474
diff
changeset
|
712 conn = ssl.wrap_socket(conn, self.keyfile, self.certfile, |
|
8328c5c3272c
Fix issue #8806: add SSL contexts support to ftplib
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
61474
diff
changeset
|
713 ssl_version=self.ssl_version) |
|
57305
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
714 return conn, size |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
715 |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
716 def retrbinary(self, cmd, callback, blocksize=8192, rest=None): |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
717 self.voidcmd('TYPE I') |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
718 conn = self.transfercmd(cmd, rest) |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
719 try: |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
720 while 1: |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
721 data = conn.recv(blocksize) |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
722 if not data: |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
723 break |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
724 callback(data) |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
725 # shutdown ssl layer |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
726 if isinstance(conn, ssl.SSLSocket): |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
727 conn.unwrap() |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
728 finally: |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
729 conn.close() |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
730 return self.voidresp() |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
731 |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
732 def retrlines(self, cmd, callback = None): |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
733 if callback is None: callback = print_line |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
734 resp = self.sendcmd('TYPE A') |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
735 conn = self.transfercmd(cmd) |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
736 fp = conn.makefile('r', encoding=self.encoding) |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
737 try: |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
738 while 1: |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
739 line = fp.readline() |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
740 if self.debugging > 2: print('*retr*', repr(line)) |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
741 if not line: |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
742 break |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
743 if line[-2:] == CRLF: |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
744 line = line[:-2] |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
745 elif line[-1:] == '\n': |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
746 line = line[:-1] |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
747 callback(line) |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
748 # shutdown ssl layer |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
749 if isinstance(conn, ssl.SSLSocket): |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
750 conn.unwrap() |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
751 finally: |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
752 fp.close() |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
753 conn.close() |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
754 return self.voidresp() |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
755 |
|
57470
c9369092fefc
Merged revisions 76546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57305
diff
changeset
|
756 def storbinary(self, cmd, fp, blocksize=8192, callback=None, rest=None): |
|
57305
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
757 self.voidcmd('TYPE I') |
|
57470
c9369092fefc
Merged revisions 76546 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
57305
diff
changeset
|
758 conn = self.transfercmd(cmd, rest) |
|
57305
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
759 try: |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
760 while 1: |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
761 buf = fp.read(blocksize) |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
762 if not buf: break |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
763 conn.sendall(buf) |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
764 if callback: callback(buf) |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
765 # shutdown ssl layer |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
766 if isinstance(conn, ssl.SSLSocket): |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
767 conn.unwrap() |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
768 finally: |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
769 conn.close() |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
770 return self.voidresp() |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
771 |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
772 def storlines(self, cmd, fp, callback=None): |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
773 self.voidcmd('TYPE A') |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
774 conn = self.transfercmd(cmd) |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
775 try: |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
776 while 1: |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
777 buf = fp.readline() |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
778 if not buf: break |
|
63726
6c12b171792e
as per discussion with antoine revert changes made in 83708 as the user useing ftplib's readline methods is supposed to always use a binary file
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
63722
diff
changeset
|
779 if buf[-2:] != B_CRLF: |
|
6c12b171792e
as per discussion with antoine revert changes made in 83708 as the user useing ftplib's readline methods is supposed to always use a binary file
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
63722
diff
changeset
|
780 if buf[-1] in B_CRLF: buf = buf[:-1] |
|
6c12b171792e
as per discussion with antoine revert changes made in 83708 as the user useing ftplib's readline methods is supposed to always use a binary file
Giampaolo Rodolà <g.rodola@gmail.com>
parents:
63722
diff
changeset
|
781 buf = buf + B_CRLF |
|
57305
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
782 conn.sendall(buf) |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
783 if callback: callback(buf) |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
784 # shutdown ssl layer |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
785 if isinstance(conn, ssl.SSLSocket): |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
786 conn.unwrap() |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
787 finally: |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
788 conn.close() |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
789 return self.voidresp() |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
790 |
| 69920 | 791 def abort(self): |
| 792 # overridden as we can't pass MSG_OOB flag to sendall() | |
| 793 line = b'ABOR' + B_CRLF | |
| 794 self.sock.sendall(line) | |
| 795 resp = self.getmultiline() | |
| 796 if resp[:3] not in {'426', '225', '226'}: | |
| 797 raise error_proto(resp) | |
| 798 return resp | |
| 799 | |
|
57305
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
800 __all__.append('FTP_TLS') |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
801 all_errors = (Error, IOError, EOFError, ssl.SSLError) |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
802 |
|
f93b2a68dfb4
Merged revisions 76309 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
52892
diff
changeset
|
803 |
|
6514
6d9cfb53c7ed
Use re instead of regex. Also remove bogus return statement from __init__().
Guido van Rossum <guido@python.org>
parents:
6426
diff
changeset
|
804 _150_re = None |
|
4927
040493de848d
(ftplib.py): Added parse150() function and FTP.ntransfercmd(). This allows
Fred Drake <fdrake@acm.org>
parents:
4345
diff
changeset
|
805 |
|
040493de848d
(ftplib.py): Added parse150() function and FTP.ntransfercmd(). This allows
Fred Drake <fdrake@acm.org>
parents:
4345
diff
changeset
|
806 def parse150(resp): |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
807 '''Parse the '150' response for a RETR request. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
808 Returns the expected transfer size or None; size is not guaranteed to |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
809 be present in the 150 message. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
810 ''' |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
811 if resp[:3] != '150': |
|
43020
907a45df1295
Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents:
42302
diff
changeset
|
812 raise error_reply(resp) |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
813 global _150_re |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
814 if _150_re is None: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
815 import re |
|
48769
83b2d07b475b
#2834: Change re module semantics, so that str and bytes mixing is forbidden,
Antoine Pitrou <solipsis@pitrou.net>
parents:
47559
diff
changeset
|
816 _150_re = re.compile( |
|
83b2d07b475b
#2834: Change re module semantics, so that str and bytes mixing is forbidden,
Antoine Pitrou <solipsis@pitrou.net>
parents:
47559
diff
changeset
|
817 "150 .* \((\d+) bytes\)", re.IGNORECASE | re.ASCII) |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
818 m = _150_re.match(resp) |
|
20461
7e71eebab4ea
Fix SF bug #459767: ftplib fails with files > 2GB
Guido van Rossum <guido@python.org>
parents:
20303
diff
changeset
|
819 if not m: |
|
7e71eebab4ea
Fix SF bug #459767: ftplib fails with files > 2GB
Guido van Rossum <guido@python.org>
parents:
20303
diff
changeset
|
820 return None |
|
7e71eebab4ea
Fix SF bug #459767: ftplib fails with files > 2GB
Guido van Rossum <guido@python.org>
parents:
20303
diff
changeset
|
821 s = m.group(1) |
|
7e71eebab4ea
Fix SF bug #459767: ftplib fails with files > 2GB
Guido van Rossum <guido@python.org>
parents:
20303
diff
changeset
|
822 try: |
|
7e71eebab4ea
Fix SF bug #459767: ftplib fails with files > 2GB
Guido van Rossum <guido@python.org>
parents:
20303
diff
changeset
|
823 return int(s) |
|
20500
fddacefeeb36
Oops. Catching OverflowError from int() doesn't help, since it raises
Guido van Rossum <guido@python.org>
parents:
20461
diff
changeset
|
824 except (OverflowError, ValueError): |
|
40644
1c26505c1de6
Rip out 'long' and 'L'-suffixed integer literals.
Guido van Rossum <guido@python.org>
parents:
40633
diff
changeset
|
825 return int(s) |
|
4927
040493de848d
(ftplib.py): Added parse150() function and FTP.ntransfercmd(). This allows
Fred Drake <fdrake@acm.org>
parents:
4345
diff
changeset
|
826 |
|
040493de848d
(ftplib.py): Added parse150() function and FTP.ntransfercmd(). This allows
Fred Drake <fdrake@acm.org>
parents:
4345
diff
changeset
|
827 |
|
19341
d46682bda82f
Change the 227 response parser to use a more liberal regular
Guido van Rossum <guido@python.org>
parents:
18902
diff
changeset
|
828 _227_re = None |
|
d46682bda82f
Change the 227 response parser to use a more liberal regular
Guido van Rossum <guido@python.org>
parents:
18902
diff
changeset
|
829 |
|
3649
63cdfbb4a2bb
Docstringified and PASV support by Siebren (including new ftpcp() function).
Guido van Rossum <guido@python.org>
parents:
3398
diff
changeset
|
830 def parse227(resp): |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
831 '''Parse the '227' response for a PASV request. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
832 Raises error_proto if it does not contain '(h1,h2,h3,h4,p1,p2)' |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
833 Return ('host.addr.as.numbers', port#) tuple.''' |
|
3649
63cdfbb4a2bb
Docstringified and PASV support by Siebren (including new ftpcp() function).
Guido van Rossum <guido@python.org>
parents:
3398
diff
changeset
|
834 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
835 if resp[:3] != '227': |
|
43020
907a45df1295
Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents:
42302
diff
changeset
|
836 raise error_reply(resp) |
|
19341
d46682bda82f
Change the 227 response parser to use a more liberal regular
Guido van Rossum <guido@python.org>
parents:
18902
diff
changeset
|
837 global _227_re |
|
d46682bda82f
Change the 227 response parser to use a more liberal regular
Guido van Rossum <guido@python.org>
parents:
18902
diff
changeset
|
838 if _227_re is None: |
|
d46682bda82f
Change the 227 response parser to use a more liberal regular
Guido van Rossum <guido@python.org>
parents:
18902
diff
changeset
|
839 import re |
|
48769
83b2d07b475b
#2834: Change re module semantics, so that str and bytes mixing is forbidden,
Antoine Pitrou <solipsis@pitrou.net>
parents:
47559
diff
changeset
|
840 _227_re = re.compile(r'(\d+),(\d+),(\d+),(\d+),(\d+),(\d+)', re.ASCII) |
|
19341
d46682bda82f
Change the 227 response parser to use a more liberal regular
Guido van Rossum <guido@python.org>
parents:
18902
diff
changeset
|
841 m = _227_re.search(resp) |
|
d46682bda82f
Change the 227 response parser to use a more liberal regular
Guido van Rossum <guido@python.org>
parents:
18902
diff
changeset
|
842 if not m: |
|
43020
907a45df1295
Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents:
42302
diff
changeset
|
843 raise error_proto(resp) |
|
19341
d46682bda82f
Change the 227 response parser to use a more liberal regular
Guido van Rossum <guido@python.org>
parents:
18902
diff
changeset
|
844 numbers = m.groups() |
|
16504
6ffce8be3e0b
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
16072
diff
changeset
|
845 host = '.'.join(numbers[:4]) |
|
6ffce8be3e0b
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
16072
diff
changeset
|
846 port = (int(numbers[4]) << 8) + int(numbers[5]) |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
847 return host, port |
|
3649
63cdfbb4a2bb
Docstringified and PASV support by Siebren (including new ftpcp() function).
Guido van Rossum <guido@python.org>
parents:
3398
diff
changeset
|
848 |
|
63cdfbb4a2bb
Docstringified and PASV support by Siebren (including new ftpcp() function).
Guido van Rossum <guido@python.org>
parents:
3398
diff
changeset
|
849 |
|
18825
40900620293e
Patch #401196: Use getaddrinfo and AF_INET6 in TCP servers and clients.
Martin v. Löwis <martin@v.loewis.de>
parents:
17347
diff
changeset
|
850 def parse229(resp, peer): |
|
40900620293e
Patch #401196: Use getaddrinfo and AF_INET6 in TCP servers and clients.
Martin v. Löwis <martin@v.loewis.de>
parents:
17347
diff
changeset
|
851 '''Parse the '229' response for a EPSV request. |
|
40900620293e
Patch #401196: Use getaddrinfo and AF_INET6 in TCP servers and clients.
Martin v. Löwis <martin@v.loewis.de>
parents:
17347
diff
changeset
|
852 Raises error_proto if it does not contain '(|||port|)' |
|
40900620293e
Patch #401196: Use getaddrinfo and AF_INET6 in TCP servers and clients.
Martin v. Löwis <martin@v.loewis.de>
parents:
17347
diff
changeset
|
853 Return ('host.addr.as.numbers', port#) tuple.''' |
|
40900620293e
Patch #401196: Use getaddrinfo and AF_INET6 in TCP servers and clients.
Martin v. Löwis <martin@v.loewis.de>
parents:
17347
diff
changeset
|
854 |
| 35400 | 855 if resp[:3] != '229': |
|
43020
907a45df1295
Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents:
42302
diff
changeset
|
856 raise error_reply(resp) |
|
23590
a4bb18212b48
Use string methods where possible, and remove import string
Neal Norwitz <nnorwitz@gmail.com>
parents:
23419
diff
changeset
|
857 left = resp.find('(') |
|
43020
907a45df1295
Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents:
42302
diff
changeset
|
858 if left < 0: raise error_proto(resp) |
|
23590
a4bb18212b48
Use string methods where possible, and remove import string
Neal Norwitz <nnorwitz@gmail.com>
parents:
23419
diff
changeset
|
859 right = resp.find(')', left + 1) |
|
18825
40900620293e
Patch #401196: Use getaddrinfo and AF_INET6 in TCP servers and clients.
Martin v. Löwis <martin@v.loewis.de>
parents:
17347
diff
changeset
|
860 if right < 0: |
|
43020
907a45df1295
Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents:
42302
diff
changeset
|
861 raise error_proto(resp) # should contain '(|||port|)' |
| 35400 | 862 if resp[left + 1] != resp[right - 1]: |
|
43020
907a45df1295
Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents:
42302
diff
changeset
|
863 raise error_proto(resp) |
|
23644
3ebd376aa4cb
Fix a regression from the 1.68->1.69 checkin:
Walter Dörwald <walter@livinglogic.de>
parents:
23620
diff
changeset
|
864 parts = resp[left + 1:right].split(resp[left+1]) |
| 35400 | 865 if len(parts) != 5: |
|
43020
907a45df1295
Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents:
42302
diff
changeset
|
866 raise error_proto(resp) |
|
18825
40900620293e
Patch #401196: Use getaddrinfo and AF_INET6 in TCP servers and clients.
Martin v. Löwis <martin@v.loewis.de>
parents:
17347
diff
changeset
|
867 host = peer[0] |
|
23590
a4bb18212b48
Use string methods where possible, and remove import string
Neal Norwitz <nnorwitz@gmail.com>
parents:
23419
diff
changeset
|
868 port = int(parts[3]) |
|
18825
40900620293e
Patch #401196: Use getaddrinfo and AF_INET6 in TCP servers and clients.
Martin v. Löwis <martin@v.loewis.de>
parents:
17347
diff
changeset
|
869 return host, port |
|
40900620293e
Patch #401196: Use getaddrinfo and AF_INET6 in TCP servers and clients.
Martin v. Löwis <martin@v.loewis.de>
parents:
17347
diff
changeset
|
870 |
|
40900620293e
Patch #401196: Use getaddrinfo and AF_INET6 in TCP servers and clients.
Martin v. Löwis <martin@v.loewis.de>
parents:
17347
diff
changeset
|
871 |
|
1087
b9e4f7321e28
Added much functionality, changed some names (errors, login).
Guido van Rossum <guido@python.org>
parents:
1085
diff
changeset
|
872 def parse257(resp): |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
873 '''Parse the '257' response for a MKD or PWD request. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
874 This is a response to a MKD or PWD request: a directory name. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
875 Returns the directoryname in the 257 reply.''' |
|
3649
63cdfbb4a2bb
Docstringified and PASV support by Siebren (including new ftpcp() function).
Guido van Rossum <guido@python.org>
parents:
3398
diff
changeset
|
876 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
877 if resp[:3] != '257': |
|
43020
907a45df1295
Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents:
42302
diff
changeset
|
878 raise error_reply(resp) |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
879 if resp[3:5] != ' "': |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
880 return '' # Not compliant to RFC 959, but UNIX ftpd does this |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
881 dirname = '' |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
882 i = 5 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
883 n = len(resp) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
884 while i < n: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
885 c = resp[i] |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
886 i = i+1 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
887 if c == '"': |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
888 if i >= n or resp[i] != '"': |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
889 break |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
890 i = i+1 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
891 dirname = dirname + c |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
892 return dirname |
| 1085 | 893 |
|
6426
068254fe5617
Return the error code from most commands, rather than swallowing it.
Guido van Rossum <guido@python.org>
parents:
5753
diff
changeset
|
894 |
|
1416
d6f6a1cb7d79
* test_*.py: new lambda syntax (also affects tests for filter, map,
Guido van Rossum <guido@python.org>
parents:
1403
diff
changeset
|
895 def print_line(line): |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
896 '''Default retrlines callback to print a line.''' |
|
40775
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
40742
diff
changeset
|
897 print(line) |
|
1416
d6f6a1cb7d79
* test_*.py: new lambda syntax (also affects tests for filter, map,
Guido van Rossum <guido@python.org>
parents:
1403
diff
changeset
|
898 |
|
6426
068254fe5617
Return the error code from most commands, rather than swallowing it.
Guido van Rossum <guido@python.org>
parents:
5753
diff
changeset
|
899 |
|
3649
63cdfbb4a2bb
Docstringified and PASV support by Siebren (including new ftpcp() function).
Guido van Rossum <guido@python.org>
parents:
3398
diff
changeset
|
900 def ftpcp(source, sourcename, target, targetname = '', type = 'I'): |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
901 '''Copy file from one FTP-instance to another.''' |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
902 if not targetname: targetname = sourcename |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
903 type = 'TYPE ' + type |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
904 source.voidcmd(type) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
905 target.voidcmd(type) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
906 sourcehost, sourceport = parse227(source.sendcmd('PASV')) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
907 target.sendport(sourcehost, sourceport) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
908 # RFC 959: the user must "listen" [...] BEFORE sending the |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
909 # transfer request. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
910 # So: STOR before RETR, because here the target is a "user". |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
911 treply = target.sendcmd('STOR ' + targetname) |
|
64479
8ef68ebec0e1
Take advantage of the frozenset constant optimization.
Raymond Hettinger <python@rcn.com>
parents:
64253
diff
changeset
|
912 if treply[:3] not in {'125', '150'}: raise error_proto # RFC 959 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
913 sreply = source.sendcmd('RETR ' + sourcename) |
|
64479
8ef68ebec0e1
Take advantage of the frozenset constant optimization.
Raymond Hettinger <python@rcn.com>
parents:
64253
diff
changeset
|
914 if sreply[:3] not in {'125', '150'}: raise error_proto # RFC 959 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
915 source.voidresp() |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
916 target.voidresp() |
|
5190
a79ecd5af7e5
Added Fred Drake's netrc parser class.
Guido van Rossum <guido@python.org>
parents:
4927
diff
changeset
|
917 |
|
5753
64bc782a42ec
Wrapped up the ~/.netrc support. This is basically just the changes Guido &
Fred Drake <fdrake@acm.org>
parents:
5190
diff
changeset
|
918 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
919 class Netrc: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
920 """Class to parse & provide access to 'netrc' format files. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
921 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
922 See the netrc(4) man page for information on the file format. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
923 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
924 WARNING: This class is obsolete -- use module netrc instead. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
925 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
926 """ |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
927 __defuser = None |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
928 __defpasswd = None |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
929 __defacct = None |
|
3649
63cdfbb4a2bb
Docstringified and PASV support by Siebren (including new ftpcp() function).
Guido van Rossum <guido@python.org>
parents:
3398
diff
changeset
|
930 |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
931 def __init__(self, filename=None): |
|
23612
3caee2958387
Replace boolean test with is None
Raymond Hettinger <python@rcn.com>
parents:
23590
diff
changeset
|
932 if filename is None: |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23612
diff
changeset
|
933 if "HOME" in os.environ: |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
934 filename = os.path.join(os.environ["HOME"], |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
935 ".netrc") |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
936 else: |
|
43020
907a45df1295
Raise statement normalization in Lib/.
Collin Winter <collinw@gmail.com>
parents:
42302
diff
changeset
|
937 raise IOError("specify file to load or set $HOME") |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
938 self.__hosts = {} |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
939 self.__macros = {} |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
940 fp = open(filename, "r") |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
941 in_macro = 0 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
942 while 1: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
943 line = fp.readline() |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
944 if not line: break |
|
16504
6ffce8be3e0b
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
16072
diff
changeset
|
945 if in_macro and line.strip(): |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
946 macro_lines.append(line) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
947 continue |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
948 elif in_macro: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
949 self.__macros[macro_name] = tuple(macro_lines) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
950 in_macro = 0 |
|
16504
6ffce8be3e0b
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
16072
diff
changeset
|
951 words = line.split() |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
952 host = user = passwd = acct = None |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
953 default = 0 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
954 i = 0 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
955 while i < len(words): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
956 w1 = words[i] |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
957 if i+1 < len(words): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
958 w2 = words[i + 1] |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
959 else: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
960 w2 = None |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
961 if w1 == 'default': |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
962 default = 1 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
963 elif w1 == 'machine' and w2: |
|
16504
6ffce8be3e0b
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
16072
diff
changeset
|
964 host = w2.lower() |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
965 i = i + 1 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
966 elif w1 == 'login' and w2: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
967 user = w2 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
968 i = i + 1 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
969 elif w1 == 'password' and w2: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
970 passwd = w2 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
971 i = i + 1 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
972 elif w1 == 'account' and w2: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
973 acct = w2 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
974 i = i + 1 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
975 elif w1 == 'macdef' and w2: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
976 macro_name = w2 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
977 macro_lines = [] |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
978 in_macro = 1 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
979 break |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
980 i = i + 1 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
981 if default: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
982 self.__defuser = user or self.__defuser |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
983 self.__defpasswd = passwd or self.__defpasswd |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
984 self.__defacct = acct or self.__defacct |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
985 if host: |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23612
diff
changeset
|
986 if host in self.__hosts: |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
987 ouser, opasswd, oacct = \ |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
988 self.__hosts[host] |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
989 user = user or ouser |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
990 passwd = passwd or opasswd |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
991 acct = acct or oacct |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
992 self.__hosts[host] = user, passwd, acct |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
993 fp.close() |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
994 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
995 def get_hosts(self): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
996 """Return a list of hosts mentioned in the .netrc file.""" |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
997 return self.__hosts.keys() |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
998 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
999 def get_account(self, host): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1000 """Returns login information for the named host. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1001 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1002 The return value is a triple containing userid, |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1003 password, and the accounting field. |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1004 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1005 """ |
|
16504
6ffce8be3e0b
String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents:
16072
diff
changeset
|
1006 host = host.lower() |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1007 user = passwd = acct = None |
|
23620
a1de0bab5475
SF 563203. Replaced 'has_key()' with 'in'.
Raymond Hettinger <python@rcn.com>
parents:
23612
diff
changeset
|
1008 if host in self.__hosts: |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1009 user, passwd, acct = self.__hosts[host] |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1010 user = user or self.__defuser |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1011 passwd = passwd or self.__defpasswd |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1012 acct = acct or self.__defacct |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1013 return user, passwd, acct |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1014 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1015 def get_macros(self): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1016 """Return a list of all defined macro names.""" |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1017 return self.__macros.keys() |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1018 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1019 def get_macro(self, macro): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1020 """Return a sequence of lines which define a named macro.""" |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1021 return self.__macros[macro] |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1022 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1023 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1024 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1025 def test(): |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1026 '''Test program. |
| 35400 | 1027 Usage: ftp [-d] [-r[file]] host [-l[dir]] [-d[dir]] [-p] [file] ... |
| 1028 | |
| 1029 -d dir | |
| 1030 -l list | |
| 1031 -p password | |
| 1032 ''' | |
| 1033 | |
| 1034 if len(sys.argv) < 2: | |
|
40775
4cdf21a0dbbc
Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents:
40742
diff
changeset
|
1035 print(test.__doc__) |
| 35400 | 1036 sys.exit(0) |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1037 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1038 debugging = 0 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1039 rcfile = None |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1040 while sys.argv[1] == '-d': |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1041 debugging = debugging+1 |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1042 del sys.argv[1] |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1043 if sys.argv[1][:2] == '-r': |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1044 # get name of alternate ~/.netrc file: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1045 rcfile = sys.argv[1][2:] |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1046 del sys.argv[1] |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1047 host = sys.argv[1] |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1048 ftp = FTP(host) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1049 ftp.set_debuglevel(debugging) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1050 userid = passwd = acct = '' |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1051 try: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1052 netrc = Netrc(rcfile) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1053 except IOError: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1054 if rcfile is not None: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1055 sys.stderr.write("Could not open account file" |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1056 " -- using anonymous login.") |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1057 else: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1058 try: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1059 userid, passwd, acct = netrc.get_account(host) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1060 except KeyError: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1061 # no account for host |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1062 sys.stderr.write( |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1063 "No account -- using anonymous login.") |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1064 ftp.login(userid, passwd, acct) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1065 for file in sys.argv[2:]: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1066 if file[:2] == '-l': |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1067 ftp.dir(file[2:]) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1068 elif file[:2] == '-d': |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1069 cmd = 'CWD' |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1070 if file[2:]: cmd = cmd + ' ' + file[2:] |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1071 resp = ftp.sendcmd(cmd) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1072 elif file == '-p': |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1073 ftp.set_pasv(not ftp.passiveserver) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1074 else: |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1075 ftp.retrbinary('RETR ' + file, \ |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1076 sys.stdout.write, 1024) |
|
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1077 ftp.quit() |
|
2902
13581b417837
new sendport() interface; add test() program call
Guido van Rossum <guido@python.org>
parents:
2758
diff
changeset
|
1078 |
|
13581b417837
new sendport() interface; add test() program call
Guido van Rossum <guido@python.org>
parents:
2758
diff
changeset
|
1079 |
|
13581b417837
new sendport() interface; add test() program call
Guido van Rossum <guido@python.org>
parents:
2758
diff
changeset
|
1080 if __name__ == '__main__': |
|
15867
f5a3d98a35bc
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15543
diff
changeset
|
1081 test() |
