Merge pull request #14304 from vieux/http_proxy_support

add support for base path in docker cli -H
This commit is contained in:
Jessie Frazelle 2015-07-14 13:21:51 -07:00
commit 4e9280ffdb
6 changed files with 32 additions and 9 deletions

View File

@ -7,6 +7,7 @@ import (
"fmt" "fmt"
"io" "io"
"net/http" "net/http"
"net/url"
"reflect" "reflect"
"strings" "strings"
"text/template" "text/template"
@ -24,6 +25,8 @@ type DockerCli struct {
proto string proto string
// addr holds the client address. // addr holds the client address.
addr string addr string
// basePath holds the path to prepend to the requests
basePath string
// configFile has the client configuration file // configFile has the client configuration file
configFile *cliconfig.ConfigFile configFile *cliconfig.ConfigFile
@ -187,6 +190,7 @@ func NewDockerCli(in io.ReadCloser, out, err io.Writer, keyFile string, proto, a
isTerminalIn = false isTerminalIn = false
isTerminalOut = false isTerminalOut = false
scheme = "http" scheme = "http"
basePath = ""
) )
if tlsConfig != nil { if tlsConfig != nil {
@ -215,9 +219,17 @@ func NewDockerCli(in io.ReadCloser, out, err io.Writer, keyFile string, proto, a
fmt.Fprintf(err, "WARNING: Error loading config file:%v\n", e) fmt.Fprintf(err, "WARNING: Error loading config file:%v\n", e)
} }
if proto == "tcp" {
// error is checked in pkg/parsers already
parsed, _ := url.Parse("tcp://" + addr)
addr = parsed.Host
basePath = parsed.Path
}
return &DockerCli{ return &DockerCli{
proto: proto, proto: proto,
addr: addr, addr: addr,
basePath: basePath,
configFile: configFile, configFile: configFile,
in: in, in: in,
out: out, out: out,

View File

@ -138,7 +138,7 @@ func (cli *DockerCli) hijack(method, path string, setRawTerminal bool, in io.Rea
if err != nil { if err != nil {
return err return err
} }
req, err := http.NewRequest(method, fmt.Sprintf("/v%s%s", api.Version, path), params) req, err := http.NewRequest(method, fmt.Sprintf("%s/v%s%s", cli.basePath, api.Version, path), params)
if err != nil { if err != nil {
return err return err
} }

View File

@ -65,7 +65,7 @@ func (cli *DockerCli) clientRequest(method, path string, in io.Reader, headers m
if expectedPayload && in == nil { if expectedPayload && in == nil {
in = bytes.NewReader([]byte{}) in = bytes.NewReader([]byte{})
} }
req, err := http.NewRequest(method, fmt.Sprintf("/v%s%s", api.Version, path), in) req, err := http.NewRequest(method, fmt.Sprintf("%s/v%s%s", cli.basePath, api.Version, path), in)
if err != nil { if err != nil {
return serverResp, err return serverResp, err
} }

View File

@ -83,12 +83,14 @@ Similarly, the Docker client can use `-H` to connect to a custom port.
`-H` accepts host and port assignment in the following format: `-H` accepts host and port assignment in the following format:
tcp://[host][:port] or unix://path tcp://[host][:port][path] or unix://path
For example: For example:
- `tcp://host:2375` -> TCP connection on - `tcp://host:2375` -> TCP connection on
host:2375 host:2375
- `tcp://host:2375/path` -> TCP connection on
host:2375 and prepend path to all requests
- `unix://path/to/socket` -> Unix socket located - `unix://path/to/socket` -> Unix socket located
at `path/to/socket` at `path/to/socket`

View File

@ -2,6 +2,7 @@ package parsers
import ( import (
"fmt" "fmt"
"net/url"
"runtime" "runtime"
"strconv" "strconv"
"strings" "strings"
@ -52,7 +53,11 @@ func ParseTCPAddr(addr string, defaultAddr string) (string, error) {
return "", fmt.Errorf("Invalid proto, expected tcp: %s", addr) return "", fmt.Errorf("Invalid proto, expected tcp: %s", addr)
} }
hostParts := strings.Split(addr, ":") u, err := url.Parse("tcp://" + addr)
if err != nil {
return "", err
}
hostParts := strings.Split(u.Host, ":")
if len(hostParts) != 2 { if len(hostParts) != 2 {
return "", fmt.Errorf("Invalid bind address format: %s", addr) return "", fmt.Errorf("Invalid bind address format: %s", addr)
} }
@ -65,7 +70,7 @@ func ParseTCPAddr(addr string, defaultAddr string) (string, error) {
if err != nil && p == 0 { if err != nil && p == 0 {
return "", fmt.Errorf("Invalid bind address format: %s", addr) return "", fmt.Errorf("Invalid bind address format: %s", addr)
} }
return fmt.Sprintf("tcp://%s:%d", host, p), nil return fmt.Sprintf("tcp://%s:%d%s", host, p, u.Path), nil
} }
// Get a repos name and returns the right reposName + tag|digest // Get a repos name and returns the right reposName + tag|digest

View File

@ -14,14 +14,18 @@ func TestParseHost(t *testing.T) {
"0.0.0.0": "Invalid bind address format: 0.0.0.0", "0.0.0.0": "Invalid bind address format: 0.0.0.0",
"tcp://": "Invalid proto, expected tcp: ", "tcp://": "Invalid proto, expected tcp: ",
"tcp:a.b.c.d": "Invalid bind address format: tcp:a.b.c.d", "tcp:a.b.c.d": "Invalid bind address format: tcp:a.b.c.d",
"tcp:a.b.c.d/path": "Invalid bind address format: tcp:a.b.c.d/path",
"udp://127.0.0.1": "Invalid bind address format: udp://127.0.0.1", "udp://127.0.0.1": "Invalid bind address format: udp://127.0.0.1",
"udp://127.0.0.1:2375": "Invalid bind address format: udp://127.0.0.1:2375", "udp://127.0.0.1:2375": "Invalid bind address format: udp://127.0.0.1:2375",
} }
valids := map[string]string{ valids := map[string]string{
"0.0.0.1:5555": "tcp://0.0.0.1:5555", "0.0.0.1:5555": "tcp://0.0.0.1:5555",
":6666": "tcp://127.0.0.1:6666", "0.0.0.1:5555/path": "tcp://0.0.0.1:5555/path",
"tcp://:7777": "tcp://127.0.0.1:7777", ":6666": "tcp://127.0.0.1:6666",
"": "unix:///var/run/docker.sock", ":6666/path": "tcp://127.0.0.1:6666/path",
"tcp://:7777": "tcp://127.0.0.1:7777",
"tcp://:7777/path": "tcp://127.0.0.1:7777/path",
"": "unix:///var/run/docker.sock",
"unix:///run/docker.sock": "unix:///run/docker.sock", "unix:///run/docker.sock": "unix:///run/docker.sock",
"unix://": "unix:///var/run/docker.sock", "unix://": "unix:///var/run/docker.sock",
"fd://": "fd://", "fd://": "fd://",