diff --git a/dockerd/dockerd.go b/dockerd/dockerd.go index 5e12c1d3f6..e5021df53f 100644 --- a/dockerd/dockerd.go +++ b/dockerd/dockerd.go @@ -293,24 +293,30 @@ func (w *AutoFlush) Write(data []byte) (int, error) { } func (docker *Docker) ServeHTTP(w http.ResponseWriter, r *http.Request) { + stdout := &AutoFlush{w} + stdin := r.Body + flags := flag.NewFlagSet("docker", flag.ContinueOnError) + flags.SetOutput(stdout) + flags.Usage = func() { docker.CmdHelp(stdin, stdout) } cmd, args := URLToCall(r.URL) + if err := flags.Parse(append([]string{cmd}, args...)); err != nil { + return + } log.Printf("%s\n", strings.Join(append(append([]string{"docker"}, cmd), args...), " ")) if cmd == "" { - docker.CmdUsage(r.Body, w, "") - return + cmd = "help" } method := docker.getMethod(cmd) if method == nil { - docker.CmdUsage(r.Body, w, cmd) + fmt.Fprintf(stdout, "Error: no such command: %s\n", cmd) } else { - err := method(r.Body, &AutoFlush{w}, args...) + err := method(stdin, stdout, args...) if err != nil { - fmt.Fprintf(w, "Error: %s\n", err) + fmt.Fprintf(stdout, "Error: %s\n", err) } } } - func (docker *Docker) getMethod(name string) Cmd { methodName := "Cmd"+strings.ToUpper(name[:1])+strings.ToLower(name[1:]) method, exists := reflect.TypeOf(docker).MethodByName(methodName)