Browse Source

Force EPSV for IPv6 hosts and fix split of IPv6:port

Arnaud Ysmal 12 years ago
parent
commit
691fac98af
2 changed files with 26 additions and 2 deletions
  1. 20 0
      client_test.go
  2. 6 2
      ftp.go

+ 20 - 0
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()
+}

+ 6 - 2
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 {