浏览代码

Merge branch 'ipv6' of https://github.com/stacktic/ftp into stacktic-ipv6

Conflicts:
	ftp.go
Julien Laffaye 10 年之前
父节点
当前提交
a6e47bb27d
共有 2 个文件被更改,包括 32 次插入10 次删除
  1. 20 0
      client_test.go
  2. 12 10
      ftp.go

+ 20 - 0
client_test.go

@@ -139,3 +139,23 @@ func TestMultiline(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()
+}

+ 12 - 10
ftp.go

@@ -4,7 +4,6 @@ package ftp
 import (
 	"bufio"
 	"errors"
-	"fmt"
 	"io"
 	"net"
 	"net/textproto"
@@ -67,10 +66,14 @@ func DialTimeout(addr string, timeout time.Duration) (*ServerConn, error) {
 
 	conn := textproto.NewConn(tconn)
 
-	a := strings.SplitN(addr, ":", 2)
+	host, _, err := net.SplitHostPort(addr)
+	if err != nil {
+		conn.Close()
+		return nil, err
+	}
 	c := &ServerConn{
 		conn:     conn,
-		host:     a[0],
+		host:     host,
 		timeout:  timeout,
 		features: make(map[string]string),
 	}
@@ -218,20 +221,19 @@ func (c *ServerConn) openDataConn() (net.Conn, error) {
 	//  else -> PASV
 	_, nat6Supported := c.features["nat6"]
 	_, epsvSupported := c.features["EPSV"]
-	if nat6Supported || epsvSupported {
+
+	if !nat6Supported && !epsvSupported {
+		port, _ = c.pasv()
+	}
+	if port == 0 {
 		port, err = c.epsv()
 		if err != nil {
 			return nil, err
 		}
-	} else {
-		port, err = c.pasv()
-		if err != nil {
-			return nil, err
-		}
 	}
 
 	// Build the new net address string
-	addr := fmt.Sprintf("%s:%d", c.host, port)
+	addr := net.JoinHostPort(c.host, strconv.Itoa(port))
 
 	conn, err := net.DialTimeout("tcp", addr, c.timeout)
 	if err != nil {