Browse Source

Merge branch 'master' of ssh://github.com/dotcloud/docker

Solomon Hykes 12 năm trước cách đây
mục cha
commit
5edafd6284
2 tập tin đã thay đổi với 58 bổ sung14 xóa
  1. 32 14
      network.go
  2. 26 0
      network_test.go

+ 32 - 14
network.go

@@ -485,20 +485,38 @@ type Nat struct {
 
 
 func parseNat(spec string) (*Nat, error) {
 func parseNat(spec string) (*Nat, error) {
 	var nat Nat
 	var nat Nat
-	// If spec starts with ':', external and internal ports must be the same.
-	// This might fail if the requested external port is not available.
-	var sameFrontend bool
-	if spec[0] == ':' {
-		sameFrontend = true
-		spec = spec[1:]
-	}
-	port, err := strconv.ParseUint(spec, 10, 16)
-	if err != nil {
-		return nil, err
-	}
-	nat.Backend = int(port)
-	if sameFrontend {
-		nat.Frontend = nat.Backend
+
+	if strings.Contains(spec, ":") {
+		specParts := strings.Split(spec, ":")
+		if len(specParts) != 2 {
+			return nil, fmt.Errorf("Invalid port format.")
+		}
+		// If spec starts with ':', external and internal ports must be the same.
+		// This might fail if the requested external port is not available.
+		var sameFrontend bool
+		if len(specParts[0]) == 0 {
+			sameFrontend = true
+		} else {
+			front, err := strconv.ParseUint(specParts[0], 10, 16)
+			if err != nil {
+				return nil, err
+			}
+			nat.Frontend = int(front)
+		}
+		back, err := strconv.ParseUint(specParts[1], 10, 16)
+		if err != nil {
+			return nil, err
+		}
+		nat.Backend = int(back)
+		if sameFrontend {
+			nat.Frontend = nat.Backend
+		}
+	} else {
+		port, err := strconv.ParseUint(spec, 10, 16)
+		if err != nil {
+			return nil, err
+		}
+		nat.Backend = int(port)
 	}
 	}
 	nat.Proto = "tcp"
 	nat.Proto = "tcp"
 	return &nat, nil
 	return &nat, nil

+ 26 - 0
network_test.go

@@ -18,6 +18,32 @@ func TestIptables(t *testing.T) {
 	}
 	}
 }
 }
 
 
+func TestParseNat(t *testing.T) {
+	if nat, err := parseNat("4500"); err == nil {
+		if nat.Frontend != 0 || nat.Backend != 4500 {
+			t.Errorf("-p 4500 should produce 0->4500, got %d->%d", nat.Frontend, nat.Backend)
+		}
+	} else {
+		t.Fatal(err)
+	}
+
+	if nat, err := parseNat(":4501"); err == nil {
+		if nat.Frontend != 4501 || nat.Backend != 4501 {
+			t.Errorf("-p :4501 should produce 4501->4501, got %d->%d", nat.Frontend, nat.Backend)
+		}
+	} else {
+		t.Fatal(err)
+	}
+
+	if nat, err := parseNat("4502:4503"); err == nil {
+		if nat.Frontend != 4502 || nat.Backend != 4503 {
+			t.Errorf("-p 4502:4503 should produce 4502->4503, got %d->%d", nat.Frontend, nat.Backend)
+		}
+	} else {
+		t.Fatal(err)
+	}
+}
+
 func TestPortAllocation(t *testing.T) {
 func TestPortAllocation(t *testing.T) {
 	allocator, err := newPortAllocator()
 	allocator, err := newPortAllocator()
 	if err != nil {
 	if err != nil {