added --method flag for HTTP request method
Signed-off-by: Vivek Singh <vivekkmr45@yahoo.in> changed method to httpMethod, and uppercase to camelCase Signed-off-by: Vivek Singh <vivekkmr45@yahoo.in>
This commit is contained in:
@@ -18,6 +18,7 @@ var (
|
||||
query []string
|
||||
headers []string
|
||||
invokeAsync bool
|
||||
httpMethod string
|
||||
)
|
||||
|
||||
func init() {
|
||||
@@ -29,12 +30,13 @@ func init() {
|
||||
invokeCmd.Flags().StringArrayVar(&query, "query", []string{}, "pass query-string options")
|
||||
invokeCmd.Flags().StringArrayVarP(&headers, "header", "H", []string{}, "pass HTTP request header")
|
||||
invokeCmd.Flags().BoolVarP(&invokeAsync, "async", "a", false, "Invoke the function asynchronously")
|
||||
invokeCmd.Flags().StringVarP(&httpMethod, "method", "m", "POST", "pass HTTP request method")
|
||||
|
||||
faasCmd.AddCommand(invokeCmd)
|
||||
}
|
||||
|
||||
var invokeCmd = &cobra.Command{
|
||||
Use: `invoke FUNCTION_NAME [--gateway GATEWAY_URL] [--content-type CONTENT_TYPE] [--query PARAM=VALUE] [--header PARAM=VALUE]`,
|
||||
Use: `invoke FUNCTION_NAME [--gateway GATEWAY_URL] [--content-type CONTENT_TYPE] [--query PARAM=VALUE] [--header PARAM=VALUE] [--method HTTP_METHOD]`,
|
||||
Short: "Invoke an OpenFaaS function",
|
||||
Long: `Invokes an OpenFaaS function and reads from STDIN for the body of the request`,
|
||||
Example: ` faas-cli invoke echo --gateway https://domain:port
|
||||
@@ -42,7 +44,8 @@ var invokeCmd = &cobra.Command{
|
||||
faas-cli invoke env --query repo=faas-cli --query org=openfaas
|
||||
faas-cli invoke env --header X-Ping-Url=http://request.bin/etc
|
||||
faas-cli invoke resize-img --async -H "X-Callback-Url=http://gateway:8080/function/send2slack" < image.png
|
||||
faas-cli invoke env -H X-Ping-Url=http://request.bin/etc`,
|
||||
faas-cli invoke env -H X-Ping-Url=http://request.bin/etc
|
||||
faas-cli invoke flask --method GET`,
|
||||
RunE: runInvoke,
|
||||
}
|
||||
|
||||
@@ -79,7 +82,7 @@ func runInvoke(cmd *cobra.Command, args []string) error {
|
||||
return fmt.Errorf("unable to read standard input: %s", err.Error())
|
||||
}
|
||||
|
||||
response, err := proxy.InvokeFunction(gatewayAddress, functionName, &functionInput, contentType, query, headers, invokeAsync)
|
||||
response, err := proxy.InvokeFunction(gatewayAddress, functionName, &functionInput, contentType, query, headers, invokeAsync, httpMethod)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ import (
|
||||
)
|
||||
|
||||
// InvokeFunction a function
|
||||
func InvokeFunction(gateway string, name string, bytesIn *[]byte, contentType string, query []string, headers []string, async bool) (*[]byte, error) {
|
||||
func InvokeFunction(gateway string, name string, bytesIn *[]byte, contentType string, query []string, headers []string, async bool, httpMethod string) (*[]byte, error) {
|
||||
var resBytes []byte
|
||||
|
||||
gateway = strings.TrimRight(gateway, "/")
|
||||
@@ -40,9 +40,14 @@ func InvokeFunction(gateway string, name string, bytesIn *[]byte, contentType st
|
||||
functionEndpoint = "/async-function/"
|
||||
}
|
||||
|
||||
httpMethodErr := validateHTTPMethod(httpMethod)
|
||||
if httpMethodErr != nil {
|
||||
return nil, httpMethodErr
|
||||
}
|
||||
|
||||
gatewayURL := gateway + functionEndpoint + name + qs
|
||||
|
||||
req, err := http.NewRequest(http.MethodPost, gatewayURL, reader)
|
||||
req, err := http.NewRequest(httpMethod, gatewayURL, reader)
|
||||
if err != nil {
|
||||
fmt.Println()
|
||||
fmt.Println(err)
|
||||
@@ -133,3 +138,23 @@ func parseHeaders(headers []string) (map[string]string, error) {
|
||||
}
|
||||
return headerMap, nil
|
||||
}
|
||||
|
||||
// validateMethod validates the HTTP request method
|
||||
func validateHTTPMethod(httpMethod string) error {
|
||||
var allowedMethods = []string{http.MethodGet, http.MethodPost}
|
||||
helpString := strings.Join(allowedMethods, "/")
|
||||
|
||||
if !contains(allowedMethods, httpMethod) {
|
||||
return fmt.Errorf("the --method or -m flag must take one of these values (%s)", helpString)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func contains(s []string, item string) bool {
|
||||
for _, value := range s {
|
||||
if value == item {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ func Test_InvokeFunction(t *testing.T) {
|
||||
[]string{},
|
||||
[]string{},
|
||||
false,
|
||||
http.MethodPost,
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
@@ -47,6 +48,7 @@ func Test_InvokeFunction_Async(t *testing.T) {
|
||||
[]string{},
|
||||
[]string{},
|
||||
true,
|
||||
http.MethodPost,
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
@@ -67,6 +69,7 @@ func Test_InvokeFunction_Not2xx(t *testing.T) {
|
||||
[]string{},
|
||||
[]string{},
|
||||
false,
|
||||
http.MethodPost,
|
||||
)
|
||||
|
||||
if err == nil {
|
||||
@@ -90,6 +93,7 @@ func Test_InvokeFunction_MissingURLPrefix(t *testing.T) {
|
||||
[]string{},
|
||||
[]string{},
|
||||
false,
|
||||
http.MethodPost,
|
||||
)
|
||||
|
||||
if err == nil {
|
||||
|
||||
Reference in New Issue
Block a user