Implement PRET command for distributed ftp servers, eg drftpd
See: https://tools.ietf.org/html/draft-dd-pret-00 Fixes #197
This commit is contained in:
parent
43afc84ae3
commit
fcad893ae7
13
ftp.go
13
ftp.go
@ -38,6 +38,7 @@ type ServerConn struct {
|
|||||||
features map[string]string
|
features map[string]string
|
||||||
skipEPSV bool
|
skipEPSV bool
|
||||||
mlstSupported bool
|
mlstSupported bool
|
||||||
|
usePRET bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// DialOption represents an option to start a new connection with Dial
|
// DialOption represents an option to start a new connection with Dial
|
||||||
@ -280,6 +281,9 @@ func (c *ServerConn) Login(user, password string) error {
|
|||||||
if _, mlstSupported := c.features["MLST"]; mlstSupported {
|
if _, mlstSupported := c.features["MLST"]; mlstSupported {
|
||||||
c.mlstSupported = true
|
c.mlstSupported = true
|
||||||
}
|
}
|
||||||
|
if _, usePRET := c.features["PRET"]; usePRET {
|
||||||
|
c.usePRET = true
|
||||||
|
}
|
||||||
|
|
||||||
// Switch to binary mode
|
// Switch to binary mode
|
||||||
if _, _, err = c.cmd(StatusCommandOK, "TYPE I"); err != nil {
|
if _, _, err = c.cmd(StatusCommandOK, "TYPE I"); err != nil {
|
||||||
@ -486,6 +490,15 @@ func (c *ServerConn) cmd(expected int, format string, args ...interface{}) (int,
|
|||||||
// cmdDataConnFrom executes a command which require a FTP data connection.
|
// cmdDataConnFrom executes a command which require a FTP data connection.
|
||||||
// Issues a REST FTP command to specify the number of bytes to skip for the transfer.
|
// Issues a REST FTP command to specify the number of bytes to skip for the transfer.
|
||||||
func (c *ServerConn) cmdDataConnFrom(offset uint64, format string, args ...interface{}) (net.Conn, error) {
|
func (c *ServerConn) cmdDataConnFrom(offset uint64, format string, args ...interface{}) (net.Conn, error) {
|
||||||
|
// If server requires PRET send the PRET command to warm it up
|
||||||
|
// See: https://tools.ietf.org/html/draft-dd-pret-00
|
||||||
|
if c.usePRET {
|
||||||
|
_, _, err := c.cmd(-1, "PRET "+format, args...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
conn, err := c.openDataConn()
|
conn, err := c.openDataConn()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
Loading…
Reference in New Issue
Block a user