From 7ea369f3bbe2e9eb47979333e8ac8ffc70393edb Mon Sep 17 00:00:00 2001 From: tanyamadaan Date: Wed, 2 Apr 2025 13:26:12 +0530 Subject: [PATCH] bug fix - request body not read properly --- .../reqpreprocessor/reqpreprocessor.go | 64 ++++++------------- 1 file changed, 18 insertions(+), 46 deletions(-) diff --git a/pkg/plugin/implementation/reqpreprocessor/reqpreprocessor.go b/pkg/plugin/implementation/reqpreprocessor/reqpreprocessor.go index 24ffa67..b9da290 100644 --- a/pkg/plugin/implementation/reqpreprocessor/reqpreprocessor.go +++ b/pkg/plugin/implementation/reqpreprocessor/reqpreprocessor.go @@ -10,88 +10,60 @@ import ( "net/http" "github.com/beckn/beckn-onix/pkg/log" - "github.com/google/uuid" ) -// Config holds the configuration settings for the application. type Config struct { - ContextKeys []string // ContextKeys is a list of context keys used for request processing. - Role string // Role specifies the role of the entity (e.g., subscriber, gateway). -} - -type becknRequest struct { - Context map[string]any `json:"context"` + ContextKeys []string + Role string } const contextKey = "context" const subscriberIDKey = "subscriber_id" -// NewPreProcessor creates a middleware that processes incoming HTTP requests by extracting -// and modifying the request context based on the provided configuration. func NewPreProcessor(cfg *Config) (func(http.Handler) http.Handler, error) { if err := validateConfig(cfg); err != nil { return nil, err } return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - body, _ := io.ReadAll(r.Body) - var req becknRequest + body, err := io.ReadAll(r.Body) + if err != nil { + http.Error(w, "Failed to read request body", http.StatusBadRequest) + return + } + var req map[string]interface{} ctx := r.Context() if err := json.Unmarshal(body, &req); err != nil { http.Error(w, "Failed to decode request body", http.StatusBadRequest) return } - if req.Context == nil { - http.Error(w, fmt.Sprintf("%s field not found.", contextKey), http.StatusBadRequest) + + // Extract context from request + reqContext, ok := req["context"].(map[string]interface{}) + if !ok { + http.Error(w, fmt.Sprintf("%s field not found or invalid.", contextKey), http.StatusBadRequest) return } var subID any switch cfg.Role { case "bap": - subID = req.Context["bap_id"] + subID = reqContext["bap_id"] case "bpp": - subID = req.Context["bpp_id"] + subID = reqContext["bap_id"] } if subID != nil { log.Debugf(ctx, "adding subscriberId to request:%s, %v", subscriberIDKey, subID) - // TODO: Add a ContextKey type in model and use it here instead of raw context key. ctx = context.WithValue(ctx, subscriberIDKey, subID) } - for _, key := range cfg.ContextKeys { - value := uuid.NewString() - updatedValue := update(req.Context, key, value) - ctx = context.WithValue(ctx, key, updatedValue) - } - reqData := map[string]any{"context": req.Context} - updatedBody, _ := json.Marshal(reqData) - r.Body = io.NopCloser(bytes.NewBuffer(updatedBody)) - r.ContentLength = int64(len(updatedBody)) + + r.Body = io.NopCloser(bytes.NewBuffer(body)) + r.ContentLength = int64(len(body)) r = r.WithContext(ctx) next.ServeHTTP(w, r) }) }, nil } -func update(wrapper map[string]any, key string, value any) any { - field, exists := wrapper[key] - if !exists || isEmpty(field) { - wrapper[key] = value - return value - } - - return field -} -func isEmpty(v any) bool { - switch v := v.(type) { - case string: - return v == "" - case nil: - return true - default: - return false - } -} - func validateConfig(cfg *Config) error { if cfg == nil { return errors.New("config cannot be nil")