From 4ade4ab3d9809134f446368bacb1c3367a7f1d10 Mon Sep 17 00:00:00 2001 From: Kapil Sareen Date: Thu, 6 Mar 2025 19:15:00 +0530 Subject: [PATCH] refactor data member of the InvokeMessage to be []byte (#2733) Signed-off-by: KapilSareen --- cmd/invoke.go | 16 +++++++++------- pkg/functions/client_test.go | 2 +- pkg/functions/invoke.go | 28 ++++++++-------------------- 3 files changed, 18 insertions(+), 28 deletions(-) diff --git a/cmd/invoke.go b/cmd/invoke.go index 0d544f073..142f349e9 100644 --- a/cmd/invoke.go +++ b/cmd/invoke.go @@ -172,7 +172,7 @@ func runInvoke(cmd *cobra.Command, _ []string, newClient ClientFactory) (err err if err != nil { return err } - m.Data = string(content) + m.Data = content } // Invoke @@ -217,7 +217,7 @@ type invokeConfig struct { ID string Source string Type string - Data string + Data []byte ContentType string File string Confirm bool @@ -233,7 +233,7 @@ func newInvokeConfig() (cfg invokeConfig, err error) { ID: viper.GetString("id"), Source: viper.GetString("source"), Type: viper.GetString("type"), - Data: viper.GetString("data"), + Data: []byte(viper.GetString("data")), ContentType: viper.GetString("content-type"), File: viper.GetString("file"), Confirm: viper.GetBool("confirm"), @@ -247,7 +247,7 @@ func newInvokeConfig() (cfg invokeConfig, err error) { if err != nil { return cfg, err } - cfg.Data = string(b) + cfg.Data = b } // if not in confirm/prompting mode, the cfg structure is complete. @@ -368,7 +368,7 @@ func (c invokeConfig) prompt() (invokeConfig, error) { Name: "Data", Prompt: &survey.Input{ Message: "Data Content", - Default: c.Data, + Default: string(c.Data), }, }, } @@ -389,7 +389,8 @@ func (c invokeConfig) prompt() (invokeConfig, error) { Message: contentTypeMessage, Default: c.ContentType, }, - }} + }, + } if err := survey.Ask(qs, &c); err != nil { return c, err } @@ -401,7 +402,8 @@ func (c invokeConfig) prompt() (invokeConfig, error) { Message: "Allow insecure server connections when using SSL", Default: c.Insecure, }, - }} + }, + } if err := survey.Ask(qs, &c); err != nil { return c, err } diff --git a/pkg/functions/client_test.go b/pkg/functions/client_test.go index e60eef490..10a367528 100644 --- a/pkg/functions/client_test.go +++ b/pkg/functions/client_test.go @@ -1710,7 +1710,7 @@ func TestClient_Invoke_HTTP(t *testing.T) { dataAsStr := string(data) // Verify the body is correct - if dataAsStr != message.Data { + if dataAsStr != string(message.Data) { t.Errorf("expected message data %q, got %q", message.Data, dataAsStr) return } diff --git a/pkg/functions/invoke.go b/pkg/functions/invoke.go index 029493030..cda4bc430 100644 --- a/pkg/functions/invoke.go +++ b/pkg/functions/invoke.go @@ -3,7 +3,6 @@ package functions import ( "bytes" "context" - "encoding/json" "errors" "fmt" "io" @@ -30,8 +29,8 @@ type InvokeMessage struct { Source string Type string ContentType string - Data string - Format string //optional override for function-defined message format + Data []byte + Format string // optional override for function-defined message format } // NewInvokeMessage creates a new InvokeMessage with fields populated @@ -41,7 +40,7 @@ func NewInvokeMessage() InvokeMessage { Source: DefaultInvokeSource, Type: DefaultInvokeType, ContentType: DefaultInvokeContentType, - Data: DefaultInvokeData, + Data: []byte(DefaultInvokeData), // Format override not set by default: value from function being preferred. } } @@ -50,7 +49,6 @@ func NewInvokeMessage() InvokeMessage { // invocation message. Returned is metadata (such as HTTP headers or // CloudEvent fields) and a stringified version of the payload. func invoke(ctx context.Context, c *Client, f Function, target string, m InvokeMessage, verbose bool) (metadata map[string][]string, body string, err error) { - // Get the first available route from 'local', 'remote', a named environment // or treat target route, err := invocationRoute(ctx, c, f, target) // choose instance to invoke @@ -153,20 +151,10 @@ func sendEvent(ctx context.Context, route string, m InvokeMessage, t http.RoundT event.SetID(m.ID) event.SetSource(m.Source) event.SetType(m.Type) - if m.ContentType == "application/json" { - var d interface{} - err = json.Unmarshal([]byte(m.Data), &d) - if err != nil { - return - } - err = event.SetData(m.ContentType, d) - if err != nil { - return - } - } else if err = event.SetData(m.ContentType, m.Data); err != nil { - return + err = event.SetData(m.ContentType, (m.Data)) + if err != nil { + return "", fmt.Errorf("cannot set data: %w", err) } - c, err := cloudevents.NewClientHTTP( cloudevents.WithTarget(route), cloudevents.WithRoundTripper(t)) @@ -200,7 +188,7 @@ func sendPost(ctx context.Context, route string, m InvokeMessage, t http.RoundTr "Source": {m.Source}, "Type": {m.Type}, "ContentType": {m.ContentType}, - "Data": {m.Data}, + "Data": {string(m.Data)}, } if verbose { fmt.Println("Sending values") @@ -209,7 +197,7 @@ func sendPost(ctx context.Context, route string, m InvokeMessage, t http.RoundTr } } - req, err := http.NewRequestWithContext(ctx, "POST", route, bytes.NewBufferString(m.Data)) + req, err := http.NewRequestWithContext(ctx, "POST", route, bytes.NewReader(m.Data)) if err != nil { return nil, "", fmt.Errorf("failure to create request: %w", err) }