Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enhance HTTP Method Handling to Integrate Query Parameters, Headers, and Body for Webhook Events #3174

Open
PieroValdebenito opened this issue Jun 21, 2024 · 1 comment
Labels
enhancement New feature or request

Comments

@PieroValdebenito
Copy link

Is your feature request related to a problem? Please describe.

Currently, the GET method in the webhook event handling only supports capturing query parameters, and the POST method only sends the body of the request. This limitation reduces flexibility and functionality when interacting with the API, as it does not allow for the integrated sending or capturing of other important data like headers and both query parameters and body across all requests.

Describe the solution you'd like

I would like all HTTP methods (GET, POST, PUT, DELETE, etc.) to handle the data sent in query parameters, headers, and body in an integrated manner. Specifically, this would involve modifying the route handling functions to capture and send all this data regardless of the HTTP method used. This would allow for greater flexibility in handling requests and responding to webhook events.

Describe alternatives you've considered

Extend the current functionality of each method to optionally capture headers and other data through additional configurations in the route definition.

Additional context

Here is the relevant code that might need changes to implement this enhancement:

eventsources/sources/webhook/start.go#L167

func GetBody(writer *http.ResponseWriter, request *http.Request, route *webhook.Route, logger *zap.SugaredLogger) (*json.RawMessage, error) {
	switch request.Method {
	case http.MethodGet:

		// Currently only captures query parameters

		body, _ := json.Marshal(request.URL.Query())
		ret := json.RawMessage(body)
		return &ret, nil
	case http.MethodPost: 		// <--- Currently only captures body
		contentType := ""
		if len(request.Header["Content-Type"]) > 0 {
			contentType = request.Header["Content-Type"][0]
		}

		switch contentType {
		case "application/x-www-form-urlencoded":
			if err := request.ParseForm(); err != nil {
				logger.Errorw("failed to parse form data", zap.Error(err))
				common.SendInternalErrorResponse(*writer, err.Error())
				route.Metrics.EventProcessingFailed(route.EventSourceName, route.EventName)
				return nil, err
			}
			body, _ := json.Marshal(request.PostForm)
			ret := json.RawMessage(body)
			return &ret, nil
		default:
			request.Body = http.MaxBytesReader(*writer, request.Body, route.Context.GetMaxPayloadSize())
			body, err := getRequestBody(request)
			if err != nil {
				logger.Errorw("failed to read request body", zap.Error(err))
				common.SendErrorResponse(*writer, err.Error())
				route.Metrics.EventProcessingFailed(route.EventSourceName, route.EventName)
				return nil, err
			}
			ret := json.RawMessage(body)
			return &ret, nil
		}
	default:
		return nil, fmt.Errorf("unsupported method: %s", request.Method)
	}
}

Message from the maintainers:

If you wish to see this enhancement implemented please add a 👍 reaction to this issue! We often sort issues this way to know what to prioritize.

@PieroValdebenito PieroValdebenito added the enhancement New feature or request label Jun 21, 2024
@dellnoantechnp
Copy link

+1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants