diff --git a/ftp.go b/ftp.go index 698242c..a5e2d53 100644 --- a/ftp.go +++ b/ftp.go @@ -520,11 +520,7 @@ func (c *ServerConn) openDataConn() (net.Conn, error) { } if c.options.tlsConfig != nil { - conn, err := c.options.dialer.Dial("tcp", addr) - if err != nil { - return nil, err - } - return tls.Client(conn, c.options.tlsConfig), err + return tls.DialWithDialer(&c.options.dialer, "tcp", addr, c.options.tlsConfig) } return c.options.dialer.Dial("tcp", addr) @@ -812,24 +808,8 @@ func (c *ServerConn) StorFrom(path string, r io.Reader, offset uint64) error { // response otherwise if the failure is not due to a connection problem, // for example the server denied the upload for quota limits, we miss // the response and we cannot use the connection to send other commands. - // So we don't check io.Copy error and we return the error from - // ReadResponse so the user can see the real error - var n int64 - n, err = io.Copy(conn, r) - - // If we wrote no bytes but got no error, make sure we call - // tls.Handshake on the connection as it won't get called - // unless Write() is called. - // - // ProFTP doesn't like this and returns "Unable to build data - // connection: Operation not permitted" when trying to upload - // an empty file without this. - if n == 0 && err == nil { - if do, ok := conn.(interface{ Handshake() error }); ok { - if err := do.Handshake(); err != nil { - multierror.Append(errs, err) - } - } + if _, err := io.Copy(conn, r); err != nil { + multierror.Append(errs, err) } if err := conn.Close(); err != nil {