diff --git a/client_test.go b/client_test.go index d93d310..d92e2b0 100644 --- a/client_test.go +++ b/client_test.go @@ -130,3 +130,23 @@ func TestConn2(t *testing.T) { c.Quit() } + +// antioche.antioche.eu.org with IPv6 +func TestConnIPv6(t *testing.T) { + c, err := Connect("[2001:660:3302:282a:204:75ff:fe9f:9e11]:21") + if err != nil { + t.Fatal(err) + } + + err = c.Login("anonymous", "anonymous") + if err != nil { + t.Fatal(err) + } + + _, err = c.List(".") + if err != nil { + t.Error(err) + } + + c.Quit() +} diff --git a/ftp.go b/ftp.go index 93d7dfa..542565a 100644 --- a/ftp.go +++ b/ftp.go @@ -53,10 +53,10 @@ func Connect(addr string) (*ServerConn, error) { return nil, err } - a := strings.SplitN(addr, ":", 2) + a := addr[:strings.LastIndex(addr, ":")] c := &ServerConn{ conn: conn, - host: a[0], + host: a, features: make(map[string]string), } @@ -197,6 +197,10 @@ func (c *ServerConn) openDataConn() (net.Conn, error) { // else -> PASV _, nat6Supported := c.features["nat6"] _, epsvSupported := c.features["EPSV"] + // If host is IPv6 => EPSV + if c.host[0] == '[' { + epsvSupported = true + } if nat6Supported || epsvSupported { port, err = c.epsv() if err != nil {