Net::FTP::AutoReconnect - FTP client class with automatic reconnect on failure
"Net::FTP::AutoReconnect" is a wrapper module around
"Net::FTP". For many commands, if anything goes wrong on the first
try, it tries to disconnect and reconnect to the server, restore the state to
the same as it was when the command was executed, then execute it again. The
state includes login credentials, authorize credentials, transfer mode (ASCII
or binary), current working directory, and any restart, passive, or port
commands sent.
The goal of this method is to hide some implementation details of FTP server
systems from the programmer. In particular, many FTP systems will
automatically disconnect a user after a relatively short idle time or after a
transfer is aborted. In this case, "Net::FTP::AutoReconnect" will
simply reconnect, send the commands necessary to return your session to its
previous state, then resend the command. If that fails, it will return the
error.
It makes no effort to determine what sorts of errors are likely to succeed when
they're retried. Partly that's because it's hard to know; if you're retreiving
a file from an FTP site with several mirrors and the file is not found, for
example, maybe on the next try you'll connect to a different server and find
it. But mostly it's from laziness; if you have some good ideas about how to
determine when to retry and when not to bother, by all means send patches.
This module contains an instance of "Net::FTP", which it passes most
method calls along to.
These methods also record their state: "alloc", "ascii",
"authorize", "binary", "cdup", "cwd",
"hash", "login","restart", "pasv",
"port". Directory changing commands execute a "pwd"
afterwards and store their new working directory.
These methods are automatically retried: "alloc", "appe",
"append", "ascii", "binary", "cdup",
"cwd", "delete", "dir", "get",
"list", "ls", "mdtm", "mkdir",
"nlst", "pasv", "port", "put",
"put_unique", "pwd", "rename", "retr",
"rmdir", "size", "stou", "supported".
These methods are tried just once: "abort", "authorize",
"hash", "login", "pasv_xfer",
"pasv_xfer_unique", "pasv_wait", "quit",
"restart", "site", "unique_name". From
"Net::Cmd": "code", "message", "ok",
"status". "restart" doesn't actually send any FTP commands
(they're sent along with the command they apply to), which is why it's not
restarted.
Any other commands are unimplemented (or possibly misdocumented); if I missed
one you'd like, please send a patch.
new
All parameters are passed along verbatim to "Net::FTP", as well as
stored in case we have to reconnect.
Most of the methods are those of Net::FTP. One additional method is available:
reconnect()
Abandon the current FTP connection and create a new one, restoring all the state
we can.
disconnect()
Disconnect the current FTP connection abruptly. Mostly useful for testing.
connect_count()
Return the number of times we have connected or reconnected to this server.
Mostly useful for testing.
Scott Gifford <sgifford@suspectclass.com>
We should really be smarter about when to retry.
We shouldn't be hardwired to use "Net::FTP", but any FTP-compatible
class; that would allow all modules similar to this one to be chained
together.
Much of this is only lightly tested; it's hard to find an FTP server unreliable
enough to test all aspects of it. It's mostly been tested with a server that
dicsonnects after an aborted transfer, and the module seems to work OK.
Net::FTP.
Copyright (c) 2006 Scott Gifford. All rights reserved. This program is free
software; you can redistribute it and/or modify it under the same terms as
Perl itself.