diff --git a/fn/routes.go b/fn/routes.go index 0e9069fe9..d525617e4 100644 --- a/fn/routes.go +++ b/fn/routes.go @@ -231,11 +231,19 @@ func (a *routesCmd) call(c *cli.Context) error { u.Path = path.Join(u.Path, "r", appName, route) content := stdin() - return callfn(u.String(), content, os.Stdout, c.StringSlice("e")) + return callfn(u.String(), content, os.Stdout, c.String("method"), c.StringSlice("e")) } -func callfn(u string, content io.Reader, output io.Writer, env []string) error { - req, err := http.NewRequest("POST", u, content) +func callfn(u string, content io.Reader, output io.Writer, method string, env []string) error { + if method == "" { + if content == nil { + method = "GET" + } else { + method = "POST" + } + } + + req, err := http.NewRequest(method, u, content) if err != nil { return fmt.Errorf("error running route: %v", err) } diff --git a/fn/run.go b/fn/run.go index 23a6d5c5a..b8bec1bec 100644 --- a/fn/run.go +++ b/fn/run.go @@ -35,6 +35,10 @@ func runflags() []cli.Flag { Name: "link", Usage: "select container links for the function", }, + cli.StringFlag{ + Name: "method", + Usage: "http method for function", + }, } } @@ -51,10 +55,10 @@ func (r *runCmd) run(c *cli.Context) error { image = ff.FullName() } - return runff(image, stdin(), os.Stdout, os.Stderr, c.StringSlice("e"), c.StringSlice("link")) + return runff(image, stdin(), os.Stdout, os.Stderr, c.String("method"), c.StringSlice("e"), c.StringSlice("link")) } -func runff(image string, stdin io.Reader, stdout, stderr io.Writer, restrictedEnv []string, links []string) error { +func runff(image string, stdin io.Reader, stdout, stderr io.Writer, method string, restrictedEnv []string, links []string) error { sh := []string{"docker", "run", "--rm", "-i"} var env []string @@ -63,6 +67,15 @@ func runff(image string, stdin io.Reader, stdout, stderr io.Writer, restrictedEn detectedEnv = restrictedEnv } + if method == "" { + if stdin == nil { + method = "GET" + } else { + method = "POST" + } + } + sh = append(sh, "-e", kvEq("METHOD", method)) + for _, e := range detectedEnv { shellvar, envvar := extractEnvVar(e) sh = append(sh, shellvar...) @@ -97,8 +110,11 @@ func extractEnvVar(e string) ([]string, string) { } else { v = os.Getenv(kv[0]) } - env := fmt.Sprintf("%s=%s", name, v) - return sh, env + return sh, kvEq(name, v) +} + +func kvEq(k, v string) string { + return fmt.Sprintf("%s=%s", k, v) } // From server.toEnvName() diff --git a/fn/run_others.go b/fn/run_others.go index de402efb3..ad42df35b 100644 --- a/fn/run_others.go +++ b/fn/run_others.go @@ -5,14 +5,12 @@ package main import ( "io" "os" - "strings" ) func stdin() io.Reader { - var stdin io.Reader = os.Stdin stat, err := os.Stdin.Stat() if err != nil || (stat.Mode()&os.ModeCharDevice) != 0 { - stdin = strings.NewReader("") + return nil } - return stdin + return os.Stdin } diff --git a/fn/run_windows.go b/fn/run_windows.go index c79cc47fb..1a7e24218 100644 --- a/fn/run_windows.go +++ b/fn/run_windows.go @@ -5,17 +5,15 @@ package main import ( "io" "os" - "strings" "syscall" "unsafe" ) func stdin() io.Reader { - var stdin io.Reader = os.Stdin if isTerminal(int(os.Stdin.Fd())) { - stdin = strings.NewReader("") + return nil } - return stdin + return os.Stdin } func isTerminal(fd int) bool { diff --git a/fn/testfn.go b/fn/testfn.go index a05ea8f1d..0758eed66 100644 --- a/fn/testfn.go +++ b/fn/testfn.go @@ -134,7 +134,7 @@ func runlocaltest(target string, in, expectedOut, expectedErr *string, env map[s restrictedEnv = append(restrictedEnv, k) } - if err := runff(target, stdin, &stdout, &stderr, restrictedEnv, nil); err != nil { + if err := runff(target, stdin, &stdout, &stderr, "", restrictedEnv, nil); err != nil { return fmt.Errorf("%v\nstdout:%s\nstderr:%s\n", err, stdout.String(), stderr.String()) } @@ -172,7 +172,7 @@ func runremotetest(target string, in, expectedOut, expectedErr *string, env map[ os.Setenv(k, v) restrictedEnv = append(restrictedEnv, k) } - if err := callfn(target, stdin, &stdout, restrictedEnv); err != nil { + if err := callfn(target, stdin, &stdout, "", restrictedEnv); err != nil { return fmt.Errorf("%v\nstdout:%s\n", err, stdout.String()) }