From e9d91965bc1bd4042b7316e162398b14c41d30b2 Mon Sep 17 00:00:00 2001 From: Viktoras Makauskas Date: Sat, 15 Mar 2025 16:11:30 +0200 Subject: [PATCH 1/6] wip --- internal/test/issues/issue1799/chi/out.gen.go | 249 ++++++++++++++++++ .../test/issues/issue1799/client/out.gen.go | 234 ++++++++++++++++ .../issues/issue1799/config-chi-server.yaml | 7 + .../test/issues/issue1799/config-client.yaml | 7 + .../issues/issue1799/config-echo-server.yaml | 7 + .../issues/issue1799/config-fiber-server.yaml | 7 + .../issues/issue1799/config-gin-server.yaml | 7 + .../issue1799/config-gorilla-server.yaml | 7 + .../issues/issue1799/config-iris-server.yaml | 7 + .../issue1799/config-std-http-server.yaml | 7 + .../test/issues/issue1799/echo/out.gen.go | 125 +++++++++ .../test/issues/issue1799/fiber/out.gen.go | 117 ++++++++ internal/test/issues/issue1799/generate.go | 10 + internal/test/issues/issue1799/gin/out.gen.go | 133 ++++++++++ .../test/issues/issue1799/gorilla/out.gen.go | 238 +++++++++++++++++ .../test/issues/issue1799/iris/out.gen.go | 118 +++++++++ internal/test/issues/issue1799/spec.yaml | 16 ++ .../test/issues/issue1799/std-http/out.gen.go | 246 +++++++++++++++++ pkg/codegen/codegen.go | 4 + pkg/codegen/templates/strict/strict-echo.tmpl | 2 +- .../strict/strict-fiber-interface.tmpl | 2 +- .../templates/strict/strict-fiber.tmpl | 2 +- pkg/codegen/templates/strict/strict-gin.tmpl | 2 +- pkg/codegen/templates/strict/strict-http.tmpl | 2 +- .../templates/strict/strict-interface.tmpl | 2 +- .../strict/strict-iris-interface.tmpl | 2 +- pkg/codegen/templates/strict/strict-iris.tmpl | 2 +- 27 files changed, 1554 insertions(+), 8 deletions(-) create mode 100644 internal/test/issues/issue1799/chi/out.gen.go create mode 100644 internal/test/issues/issue1799/client/out.gen.go create mode 100644 internal/test/issues/issue1799/config-chi-server.yaml create mode 100644 internal/test/issues/issue1799/config-client.yaml create mode 100644 internal/test/issues/issue1799/config-echo-server.yaml create mode 100644 internal/test/issues/issue1799/config-fiber-server.yaml create mode 100644 internal/test/issues/issue1799/config-gin-server.yaml create mode 100644 internal/test/issues/issue1799/config-gorilla-server.yaml create mode 100644 internal/test/issues/issue1799/config-iris-server.yaml create mode 100644 internal/test/issues/issue1799/config-std-http-server.yaml create mode 100644 internal/test/issues/issue1799/echo/out.gen.go create mode 100644 internal/test/issues/issue1799/fiber/out.gen.go create mode 100644 internal/test/issues/issue1799/generate.go create mode 100644 internal/test/issues/issue1799/gin/out.gen.go create mode 100644 internal/test/issues/issue1799/gorilla/out.gen.go create mode 100644 internal/test/issues/issue1799/iris/out.gen.go create mode 100644 internal/test/issues/issue1799/spec.yaml create mode 100644 internal/test/issues/issue1799/std-http/out.gen.go diff --git a/internal/test/issues/issue1799/chi/out.gen.go b/internal/test/issues/issue1799/chi/out.gen.go new file mode 100644 index 0000000000..7bd9f689b1 --- /dev/null +++ b/internal/test/issues/issue1799/chi/out.gen.go @@ -0,0 +1,249 @@ +// Package chi provides primitives to interact with the openapi HTTP API. +// +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.0.0-00010101000000-000000000000 DO NOT EDIT. +package chi + +import ( + "context" + "encoding/json" + "fmt" + "net/http" + + "github.com/go-chi/chi/v5" + strictnethttp "github.com/oapi-codegen/runtime/strictmiddleware/nethttp" +) + +// ServerInterface represents all server handlers. +type ServerInterface interface { + + // (GET /object) + GetObject(w http.ResponseWriter, r *http.Request) +} + +// Unimplemented server implementation that returns http.StatusNotImplemented for each endpoint. + +type Unimplemented struct{} + +// (GET /object) +func (_ Unimplemented) GetObject(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusNotImplemented) +} + +// ServerInterfaceWrapper converts contexts to parameters. +type ServerInterfaceWrapper struct { + Handler ServerInterface + HandlerMiddlewares []MiddlewareFunc + ErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error) +} + +type MiddlewareFunc func(http.Handler) http.Handler + +// GetObject operation middleware +func (siw *ServerInterfaceWrapper) GetObject(w http.ResponseWriter, r *http.Request) { + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.GetObject(w, r) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + +type UnescapedCookieParamError struct { + ParamName string + Err error +} + +func (e *UnescapedCookieParamError) Error() string { + return fmt.Sprintf("error unescaping cookie parameter '%s'", e.ParamName) +} + +func (e *UnescapedCookieParamError) Unwrap() error { + return e.Err +} + +type UnmarshalingParamError struct { + ParamName string + Err error +} + +func (e *UnmarshalingParamError) Error() string { + return fmt.Sprintf("Error unmarshaling parameter %s as JSON: %s", e.ParamName, e.Err.Error()) +} + +func (e *UnmarshalingParamError) Unwrap() error { + return e.Err +} + +type RequiredParamError struct { + ParamName string +} + +func (e *RequiredParamError) Error() string { + return fmt.Sprintf("Query argument %s is required, but not found", e.ParamName) +} + +type RequiredHeaderError struct { + ParamName string + Err error +} + +func (e *RequiredHeaderError) Error() string { + return fmt.Sprintf("Header parameter %s is required, but not found", e.ParamName) +} + +func (e *RequiredHeaderError) Unwrap() error { + return e.Err +} + +type InvalidParamFormatError struct { + ParamName string + Err error +} + +func (e *InvalidParamFormatError) Error() string { + return fmt.Sprintf("Invalid format for parameter %s: %s", e.ParamName, e.Err.Error()) +} + +func (e *InvalidParamFormatError) Unwrap() error { + return e.Err +} + +type TooManyValuesForParamError struct { + ParamName string + Count int +} + +func (e *TooManyValuesForParamError) Error() string { + return fmt.Sprintf("Expected one value for %s, got %d", e.ParamName, e.Count) +} + +// Handler creates http.Handler with routing matching OpenAPI spec. +func Handler(si ServerInterface) http.Handler { + return HandlerWithOptions(si, ChiServerOptions{}) +} + +type ChiServerOptions struct { + BaseURL string + BaseRouter chi.Router + Middlewares []MiddlewareFunc + ErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error) +} + +// HandlerFromMux creates http.Handler with routing matching OpenAPI spec based on the provided mux. +func HandlerFromMux(si ServerInterface, r chi.Router) http.Handler { + return HandlerWithOptions(si, ChiServerOptions{ + BaseRouter: r, + }) +} + +func HandlerFromMuxWithBaseURL(si ServerInterface, r chi.Router, baseURL string) http.Handler { + return HandlerWithOptions(si, ChiServerOptions{ + BaseURL: baseURL, + BaseRouter: r, + }) +} + +// HandlerWithOptions creates http.Handler with additional options +func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handler { + r := options.BaseRouter + + if r == nil { + r = chi.NewRouter() + } + if options.ErrorHandlerFunc == nil { + options.ErrorHandlerFunc = func(w http.ResponseWriter, r *http.Request, err error) { + http.Error(w, err.Error(), http.StatusBadRequest) + } + } + wrapper := ServerInterfaceWrapper{ + Handler: si, + HandlerMiddlewares: options.Middlewares, + ErrorHandlerFunc: options.ErrorHandlerFunc, + } + + r.Group(func(r chi.Router) { + r.Get(options.BaseURL+"/object", wrapper.GetObject) + }) + + return r +} + +type GetObjectRequestObject struct { +} + +type GetObjectResponseObject interface { + VisitGetObjectResponse(w http.ResponseWriter) error +} + +type GetObject200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string + +func (response GetObject200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetObjectResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) +} + +// StrictServerInterface represents all server handlers. +type StrictServerInterface interface { + + // (GET /object) + GetObject(ctx context.Context, request GetObjectRequestObject) (GetObjectResponseObject, error) +} + +type StrictHandlerFunc = strictnethttp.StrictHTTPHandlerFunc +type StrictMiddlewareFunc = strictnethttp.StrictHTTPMiddlewareFunc + +type StrictHTTPServerOptions struct { + RequestErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error) + ResponseErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error) +} + +func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { + return &strictHandler{ssi: ssi, middlewares: middlewares, options: StrictHTTPServerOptions{ + RequestErrorHandlerFunc: func(w http.ResponseWriter, r *http.Request, err error) { + http.Error(w, err.Error(), http.StatusBadRequest) + }, + ResponseErrorHandlerFunc: func(w http.ResponseWriter, r *http.Request, err error) { + http.Error(w, err.Error(), http.StatusInternalServerError) + }, + }} +} + +func NewStrictHandlerWithOptions(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc, options StrictHTTPServerOptions) ServerInterface { + return &strictHandler{ssi: ssi, middlewares: middlewares, options: options} +} + +type strictHandler struct { + ssi StrictServerInterface + middlewares []StrictMiddlewareFunc + options StrictHTTPServerOptions +} + +// GetObject operation middleware +func (sh *strictHandler) GetObject(w http.ResponseWriter, r *http.Request) { + var request GetObjectRequestObject + + handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { + return sh.ssi.GetObject(ctx, request.(GetObjectRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "GetObject") + } + + response, err := handler(r.Context(), w, r, request) + + if err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } else if validResponse, ok := response.(GetObjectResponseObject); ok { + if err := validResponse.VisitGetObjectResponse(w); err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } + } else if response != nil { + sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) + } +} diff --git a/internal/test/issues/issue1799/client/out.gen.go b/internal/test/issues/issue1799/client/out.gen.go new file mode 100644 index 0000000000..44a014a0c9 --- /dev/null +++ b/internal/test/issues/issue1799/client/out.gen.go @@ -0,0 +1,234 @@ +// Package client provides primitives to interact with the openapi HTTP API. +// +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.0.0-00010101000000-000000000000 DO NOT EDIT. +package client + +import ( + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "net/url" + "strings" +) + +// RequestEditorFn is the function signature for the RequestEditor callback function +type RequestEditorFn func(ctx context.Context, req *http.Request) error + +// Doer performs HTTP requests. +// +// The standard http.Client implements this interface. +type HttpRequestDoer interface { + Do(req *http.Request) (*http.Response, error) +} + +// Client which conforms to the OpenAPI3 specification for this service. +type Client struct { + // The endpoint of the server conforming to this interface, with scheme, + // https://api.deepmap.com for example. This can contain a path relative + // to the server, such as https://api.deepmap.com/dev-test, and all the + // paths in the swagger spec will be appended to the server. + Server string + + // Doer for performing requests, typically a *http.Client with any + // customized settings, such as certificate chains. + Client HttpRequestDoer + + // A list of callbacks for modifying requests which are generated before sending over + // the network. + RequestEditors []RequestEditorFn +} + +// ClientOption allows setting custom parameters during construction +type ClientOption func(*Client) error + +// Creates a new Client, with reasonable defaults +func NewClient(server string, opts ...ClientOption) (*Client, error) { + // create a client with sane default values + client := Client{ + Server: server, + } + // mutate client and add all optional params + for _, o := range opts { + if err := o(&client); err != nil { + return nil, err + } + } + // ensure the server URL always has a trailing slash + if !strings.HasSuffix(client.Server, "/") { + client.Server += "/" + } + // create httpClient, if not already present + if client.Client == nil { + client.Client = &http.Client{} + } + return &client, nil +} + +// WithHTTPClient allows overriding the default Doer, which is +// automatically created using http.Client. This is useful for tests. +func WithHTTPClient(doer HttpRequestDoer) ClientOption { + return func(c *Client) error { + c.Client = doer + return nil + } +} + +// WithRequestEditorFn allows setting up a callback function, which will be +// called right before sending the request. This can be used to mutate the request. +func WithRequestEditorFn(fn RequestEditorFn) ClientOption { + return func(c *Client) error { + c.RequestEditors = append(c.RequestEditors, fn) + return nil + } +} + +// The interface specification for the client above. +type ClientInterface interface { + // GetObject request + GetObject(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) +} + +func (c *Client) GetObject(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetObjectRequest(c.Server) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +// NewGetObjectRequest generates requests for GetObject +func NewGetObjectRequest(server string) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/object") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("GET", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + +func (c *Client) applyEditors(ctx context.Context, req *http.Request, additionalEditors []RequestEditorFn) error { + for _, r := range c.RequestEditors { + if err := r(ctx, req); err != nil { + return err + } + } + for _, r := range additionalEditors { + if err := r(ctx, req); err != nil { + return err + } + } + return nil +} + +// ClientWithResponses builds on ClientInterface to offer response payloads +type ClientWithResponses struct { + ClientInterface +} + +// NewClientWithResponses creates a new ClientWithResponses, which wraps +// Client with return type handling +func NewClientWithResponses(server string, opts ...ClientOption) (*ClientWithResponses, error) { + client, err := NewClient(server, opts...) + if err != nil { + return nil, err + } + return &ClientWithResponses{client}, nil +} + +// WithBaseURL overrides the baseURL. +func WithBaseURL(baseURL string) ClientOption { + return func(c *Client) error { + newBaseURL, err := url.Parse(baseURL) + if err != nil { + return err + } + c.Server = newBaseURL.String() + return nil + } +} + +// ClientWithResponsesInterface is the interface specification for the client with responses above. +type ClientWithResponsesInterface interface { + // GetObjectWithResponse request + GetObjectWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetObjectResponse, error) +} + +type GetObjectResponse struct { + Body []byte + HTTPResponse *http.Response + ApplicationldJSONProfilehttpswwwW3Orgnsactivitystreams200 *string +} + +// Status returns HTTPResponse.Status +func (r GetObjectResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r GetObjectResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + +// GetObjectWithResponse request returning *GetObjectResponse +func (c *ClientWithResponses) GetObjectWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetObjectResponse, error) { + rsp, err := c.GetObject(ctx, reqEditors...) + if err != nil { + return nil, err + } + return ParseGetObjectResponse(rsp) +} + +// ParseGetObjectResponse parses an HTTP response from a GetObjectWithResponse call +func ParseGetObjectResponse(rsp *http.Response) (*GetObjectResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &GetObjectResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest string + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.ApplicationldJSONProfilehttpswwwW3Orgnsactivitystreams200 = &dest + + } + + return response, nil +} diff --git a/internal/test/issues/issue1799/config-chi-server.yaml b/internal/test/issues/issue1799/config-chi-server.yaml new file mode 100644 index 0000000000..5975cb9194 --- /dev/null +++ b/internal/test/issues/issue1799/config-chi-server.yaml @@ -0,0 +1,7 @@ +package: chi +generate: + chi-server: true + strict-server: true +output: chi/out.gen.go +output-options: + skip-prune: true diff --git a/internal/test/issues/issue1799/config-client.yaml b/internal/test/issues/issue1799/config-client.yaml new file mode 100644 index 0000000000..94ee59f486 --- /dev/null +++ b/internal/test/issues/issue1799/config-client.yaml @@ -0,0 +1,7 @@ +package: client +generate: + client: true + models: true +output: client/out.gen.go +output-options: + skip-prune: true diff --git a/internal/test/issues/issue1799/config-echo-server.yaml b/internal/test/issues/issue1799/config-echo-server.yaml new file mode 100644 index 0000000000..8d36795337 --- /dev/null +++ b/internal/test/issues/issue1799/config-echo-server.yaml @@ -0,0 +1,7 @@ +package: echo +generate: + echo-server: true + strict-server: true +output: echo/out.gen.go +output-options: + skip-prune: true diff --git a/internal/test/issues/issue1799/config-fiber-server.yaml b/internal/test/issues/issue1799/config-fiber-server.yaml new file mode 100644 index 0000000000..b2bb2b3999 --- /dev/null +++ b/internal/test/issues/issue1799/config-fiber-server.yaml @@ -0,0 +1,7 @@ +package: fiber +generate: + fiber-server: true + strict-server: true +output: fiber/out.gen.go +output-options: + skip-prune: true diff --git a/internal/test/issues/issue1799/config-gin-server.yaml b/internal/test/issues/issue1799/config-gin-server.yaml new file mode 100644 index 0000000000..6217685765 --- /dev/null +++ b/internal/test/issues/issue1799/config-gin-server.yaml @@ -0,0 +1,7 @@ +package: gin +generate: + gin-server: true + strict-server: true +output: gin/out.gen.go +output-options: + skip-prune: true diff --git a/internal/test/issues/issue1799/config-gorilla-server.yaml b/internal/test/issues/issue1799/config-gorilla-server.yaml new file mode 100644 index 0000000000..85b6bbef68 --- /dev/null +++ b/internal/test/issues/issue1799/config-gorilla-server.yaml @@ -0,0 +1,7 @@ +package: gorilla +generate: + gorilla-server: true + strict-server: true +output: gorilla/out.gen.go +output-options: + skip-prune: true diff --git a/internal/test/issues/issue1799/config-iris-server.yaml b/internal/test/issues/issue1799/config-iris-server.yaml new file mode 100644 index 0000000000..320326056c --- /dev/null +++ b/internal/test/issues/issue1799/config-iris-server.yaml @@ -0,0 +1,7 @@ +package: iris +generate: + iris-server: true + strict-server: true +output: iris/out.gen.go +output-options: + skip-prune: true diff --git a/internal/test/issues/issue1799/config-std-http-server.yaml b/internal/test/issues/issue1799/config-std-http-server.yaml new file mode 100644 index 0000000000..2baf073e24 --- /dev/null +++ b/internal/test/issues/issue1799/config-std-http-server.yaml @@ -0,0 +1,7 @@ +package: stdhttp +generate: + std-http-server: true + strict-server: true +output: std-http/out.gen.go +output-options: + skip-prune: true diff --git a/internal/test/issues/issue1799/echo/out.gen.go b/internal/test/issues/issue1799/echo/out.gen.go new file mode 100644 index 0000000000..e8b1c9998e --- /dev/null +++ b/internal/test/issues/issue1799/echo/out.gen.go @@ -0,0 +1,125 @@ +// Package echo provides primitives to interact with the openapi HTTP API. +// +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.0.0-00010101000000-000000000000 DO NOT EDIT. +package echo + +import ( + "context" + "encoding/json" + "fmt" + "net/http" + + "github.com/labstack/echo/v4" + strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" +) + +// ServerInterface represents all server handlers. +type ServerInterface interface { + + // (GET /object) + GetObject(ctx echo.Context) error +} + +// ServerInterfaceWrapper converts echo contexts to parameters. +type ServerInterfaceWrapper struct { + Handler ServerInterface +} + +// GetObject converts echo context to params. +func (w *ServerInterfaceWrapper) GetObject(ctx echo.Context) error { + var err error + + // Invoke the callback with all the unmarshaled arguments + err = w.Handler.GetObject(ctx) + return err +} + +// This is a simple interface which specifies echo.Route addition functions which +// are present on both echo.Echo and echo.Group, since we want to allow using +// either of them for path registration +type EchoRouter interface { + CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route + TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route +} + +// RegisterHandlers adds each server route to the EchoRouter. +func RegisterHandlers(router EchoRouter, si ServerInterface) { + RegisterHandlersWithBaseURL(router, si, "") +} + +// Registers handlers, and prepends BaseURL to the paths, so that the paths +// can be served under a prefix. +func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL string) { + + wrapper := ServerInterfaceWrapper{ + Handler: si, + } + + router.GET(baseURL+"/object", wrapper.GetObject) + +} + +type GetObjectRequestObject struct { +} + +type GetObjectResponseObject interface { + VisitGetObjectResponse(w http.ResponseWriter) error +} + +type GetObject200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string + +func (response GetObject200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetObjectResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) +} + +// StrictServerInterface represents all server handlers. +type StrictServerInterface interface { + + // (GET /object) + GetObject(ctx context.Context, request GetObjectRequestObject) (GetObjectResponseObject, error) +} + +type StrictHandlerFunc = strictecho.StrictEchoHandlerFunc +type StrictMiddlewareFunc = strictecho.StrictEchoMiddlewareFunc + +func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { + return &strictHandler{ssi: ssi, middlewares: middlewares} +} + +type strictHandler struct { + ssi StrictServerInterface + middlewares []StrictMiddlewareFunc +} + +// GetObject operation middleware +func (sh *strictHandler) GetObject(ctx echo.Context) error { + var request GetObjectRequestObject + + handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + return sh.ssi.GetObject(ctx.Request().Context(), request.(GetObjectRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "GetObject") + } + + response, err := handler(ctx, request) + + if err != nil { + return err + } else if validResponse, ok := response.(GetObjectResponseObject); ok { + return validResponse.VisitGetObjectResponse(ctx.Response()) + } else if response != nil { + return fmt.Errorf("unexpected response type: %T", response) + } + return nil +} diff --git a/internal/test/issues/issue1799/fiber/out.gen.go b/internal/test/issues/issue1799/fiber/out.gen.go new file mode 100644 index 0000000000..c2475971ee --- /dev/null +++ b/internal/test/issues/issue1799/fiber/out.gen.go @@ -0,0 +1,117 @@ +// Package fiber provides primitives to interact with the openapi HTTP API. +// +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.0.0-00010101000000-000000000000 DO NOT EDIT. +package fiber + +import ( + "context" + "fmt" + + "github.com/gofiber/fiber/v2" +) + +// ServerInterface represents all server handlers. +type ServerInterface interface { + + // (GET /object) + GetObject(c *fiber.Ctx) error +} + +// ServerInterfaceWrapper converts contexts to parameters. +type ServerInterfaceWrapper struct { + Handler ServerInterface +} + +type MiddlewareFunc fiber.Handler + +// GetObject operation middleware +func (siw *ServerInterfaceWrapper) GetObject(c *fiber.Ctx) error { + + return siw.Handler.GetObject(c) +} + +// FiberServerOptions provides options for the Fiber server. +type FiberServerOptions struct { + BaseURL string + Middlewares []MiddlewareFunc +} + +// RegisterHandlers creates http.Handler with routing matching OpenAPI spec. +func RegisterHandlers(router fiber.Router, si ServerInterface) { + RegisterHandlersWithOptions(router, si, FiberServerOptions{}) +} + +// RegisterHandlersWithOptions creates http.Handler with additional options +func RegisterHandlersWithOptions(router fiber.Router, si ServerInterface, options FiberServerOptions) { + wrapper := ServerInterfaceWrapper{ + Handler: si, + } + + for _, m := range options.Middlewares { + router.Use(fiber.Handler(m)) + } + + router.Get(options.BaseURL+"/object", wrapper.GetObject) + +} + +type GetObjectRequestObject struct { +} + +type GetObjectResponseObject interface { + VisitGetObjectResponse(ctx *fiber.Ctx) error +} + +type GetObject200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string + +func (response GetObject200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetObjectResponse(ctx *fiber.Ctx) error { + ctx.Response().Header.Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") + ctx.Status(200) + + return ctx.JSON(&response) +} + +// StrictServerInterface represents all server handlers. +type StrictServerInterface interface { + + // (GET /object) + GetObject(ctx context.Context, request GetObjectRequestObject) (GetObjectResponseObject, error) +} + +type StrictHandlerFunc func(ctx *fiber.Ctx, args interface{}) (interface{}, error) + +type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc + +func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { + return &strictHandler{ssi: ssi, middlewares: middlewares} +} + +type strictHandler struct { + ssi StrictServerInterface + middlewares []StrictMiddlewareFunc +} + +// GetObject operation middleware +func (sh *strictHandler) GetObject(ctx *fiber.Ctx) error { + var request GetObjectRequestObject + + handler := func(ctx *fiber.Ctx, request interface{}) (interface{}, error) { + return sh.ssi.GetObject(ctx.UserContext(), request.(GetObjectRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "GetObject") + } + + response, err := handler(ctx, request) + + if err != nil { + return fiber.NewError(fiber.StatusBadRequest, err.Error()) + } else if validResponse, ok := response.(GetObjectResponseObject); ok { + if err := validResponse.VisitGetObjectResponse(ctx); err != nil { + return fiber.NewError(fiber.StatusBadRequest, err.Error()) + } + } else if response != nil { + return fmt.Errorf("unexpected response type: %T", response) + } + return nil +} diff --git a/internal/test/issues/issue1799/generate.go b/internal/test/issues/issue1799/generate.go new file mode 100644 index 0000000000..e1143bb5af --- /dev/null +++ b/internal/test/issues/issue1799/generate.go @@ -0,0 +1,10 @@ +package issue1799 + +//go:generate go run github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen --config=config-iris-server.yaml spec.yaml +//go:generate go run github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen --config=config-chi-server.yaml spec.yaml +//go:generate go run github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen --config=config-fiber-server.yaml spec.yaml +//go:generate go run github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen --config=config-echo-server.yaml spec.yaml +//go:generate go run github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen --config=config-gin-server.yaml spec.yaml +//go:generate go run github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen --config=config-gorilla-server.yaml spec.yaml +//go:generate go run github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen --config=config-std-http-server.yaml spec.yaml +//go:generate go run github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen --config=config-client.yaml spec.yaml diff --git a/internal/test/issues/issue1799/gin/out.gen.go b/internal/test/issues/issue1799/gin/out.gen.go new file mode 100644 index 0000000000..a61561b868 --- /dev/null +++ b/internal/test/issues/issue1799/gin/out.gen.go @@ -0,0 +1,133 @@ +// Package gin provides primitives to interact with the openapi HTTP API. +// +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.0.0-00010101000000-000000000000 DO NOT EDIT. +package gin + +import ( + "context" + "encoding/json" + "fmt" + "net/http" + + "github.com/gin-gonic/gin" + strictgin "github.com/oapi-codegen/runtime/strictmiddleware/gin" +) + +// ServerInterface represents all server handlers. +type ServerInterface interface { + + // (GET /object) + GetObject(c *gin.Context) +} + +// ServerInterfaceWrapper converts contexts to parameters. +type ServerInterfaceWrapper struct { + Handler ServerInterface + HandlerMiddlewares []MiddlewareFunc + ErrorHandler func(*gin.Context, error, int) +} + +type MiddlewareFunc func(c *gin.Context) + +// GetObject operation middleware +func (siw *ServerInterfaceWrapper) GetObject(c *gin.Context) { + + for _, middleware := range siw.HandlerMiddlewares { + middleware(c) + if c.IsAborted() { + return + } + } + + siw.Handler.GetObject(c) +} + +// GinServerOptions provides options for the Gin server. +type GinServerOptions struct { + BaseURL string + Middlewares []MiddlewareFunc + ErrorHandler func(*gin.Context, error, int) +} + +// RegisterHandlers creates http.Handler with routing matching OpenAPI spec. +func RegisterHandlers(router gin.IRouter, si ServerInterface) { + RegisterHandlersWithOptions(router, si, GinServerOptions{}) +} + +// RegisterHandlersWithOptions creates http.Handler with additional options +func RegisterHandlersWithOptions(router gin.IRouter, si ServerInterface, options GinServerOptions) { + errorHandler := options.ErrorHandler + if errorHandler == nil { + errorHandler = func(c *gin.Context, err error, statusCode int) { + c.JSON(statusCode, gin.H{"msg": err.Error()}) + } + } + + wrapper := ServerInterfaceWrapper{ + Handler: si, + HandlerMiddlewares: options.Middlewares, + ErrorHandler: errorHandler, + } + + router.GET(options.BaseURL+"/object", wrapper.GetObject) +} + +type GetObjectRequestObject struct { +} + +type GetObjectResponseObject interface { + VisitGetObjectResponse(w http.ResponseWriter) error +} + +type GetObject200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string + +func (response GetObject200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetObjectResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) +} + +// StrictServerInterface represents all server handlers. +type StrictServerInterface interface { + + // (GET /object) + GetObject(ctx context.Context, request GetObjectRequestObject) (GetObjectResponseObject, error) +} + +type StrictHandlerFunc = strictgin.StrictGinHandlerFunc +type StrictMiddlewareFunc = strictgin.StrictGinMiddlewareFunc + +func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { + return &strictHandler{ssi: ssi, middlewares: middlewares} +} + +type strictHandler struct { + ssi StrictServerInterface + middlewares []StrictMiddlewareFunc +} + +// GetObject operation middleware +func (sh *strictHandler) GetObject(ctx *gin.Context) { + var request GetObjectRequestObject + + handler := func(ctx *gin.Context, request interface{}) (interface{}, error) { + return sh.ssi.GetObject(ctx, request.(GetObjectRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "GetObject") + } + + response, err := handler(ctx, request) + + if err != nil { + ctx.Error(err) + ctx.Status(http.StatusInternalServerError) + } else if validResponse, ok := response.(GetObjectResponseObject); ok { + if err := validResponse.VisitGetObjectResponse(ctx.Writer); err != nil { + ctx.Error(err) + } + } else if response != nil { + ctx.Error(fmt.Errorf("unexpected response type: %T", response)) + } +} diff --git a/internal/test/issues/issue1799/gorilla/out.gen.go b/internal/test/issues/issue1799/gorilla/out.gen.go new file mode 100644 index 0000000000..2d53e77a90 --- /dev/null +++ b/internal/test/issues/issue1799/gorilla/out.gen.go @@ -0,0 +1,238 @@ +// Package gorilla provides primitives to interact with the openapi HTTP API. +// +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.0.0-00010101000000-000000000000 DO NOT EDIT. +package gorilla + +import ( + "context" + "encoding/json" + "fmt" + "net/http" + + "github.com/gorilla/mux" + strictnethttp "github.com/oapi-codegen/runtime/strictmiddleware/nethttp" +) + +// ServerInterface represents all server handlers. +type ServerInterface interface { + + // (GET /object) + GetObject(w http.ResponseWriter, r *http.Request) +} + +// ServerInterfaceWrapper converts contexts to parameters. +type ServerInterfaceWrapper struct { + Handler ServerInterface + HandlerMiddlewares []MiddlewareFunc + ErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error) +} + +type MiddlewareFunc func(http.Handler) http.Handler + +// GetObject operation middleware +func (siw *ServerInterfaceWrapper) GetObject(w http.ResponseWriter, r *http.Request) { + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.GetObject(w, r) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + +type UnescapedCookieParamError struct { + ParamName string + Err error +} + +func (e *UnescapedCookieParamError) Error() string { + return fmt.Sprintf("error unescaping cookie parameter '%s'", e.ParamName) +} + +func (e *UnescapedCookieParamError) Unwrap() error { + return e.Err +} + +type UnmarshalingParamError struct { + ParamName string + Err error +} + +func (e *UnmarshalingParamError) Error() string { + return fmt.Sprintf("Error unmarshaling parameter %s as JSON: %s", e.ParamName, e.Err.Error()) +} + +func (e *UnmarshalingParamError) Unwrap() error { + return e.Err +} + +type RequiredParamError struct { + ParamName string +} + +func (e *RequiredParamError) Error() string { + return fmt.Sprintf("Query argument %s is required, but not found", e.ParamName) +} + +type RequiredHeaderError struct { + ParamName string + Err error +} + +func (e *RequiredHeaderError) Error() string { + return fmt.Sprintf("Header parameter %s is required, but not found", e.ParamName) +} + +func (e *RequiredHeaderError) Unwrap() error { + return e.Err +} + +type InvalidParamFormatError struct { + ParamName string + Err error +} + +func (e *InvalidParamFormatError) Error() string { + return fmt.Sprintf("Invalid format for parameter %s: %s", e.ParamName, e.Err.Error()) +} + +func (e *InvalidParamFormatError) Unwrap() error { + return e.Err +} + +type TooManyValuesForParamError struct { + ParamName string + Count int +} + +func (e *TooManyValuesForParamError) Error() string { + return fmt.Sprintf("Expected one value for %s, got %d", e.ParamName, e.Count) +} + +// Handler creates http.Handler with routing matching OpenAPI spec. +func Handler(si ServerInterface) http.Handler { + return HandlerWithOptions(si, GorillaServerOptions{}) +} + +type GorillaServerOptions struct { + BaseURL string + BaseRouter *mux.Router + Middlewares []MiddlewareFunc + ErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error) +} + +// HandlerFromMux creates http.Handler with routing matching OpenAPI spec based on the provided mux. +func HandlerFromMux(si ServerInterface, r *mux.Router) http.Handler { + return HandlerWithOptions(si, GorillaServerOptions{ + BaseRouter: r, + }) +} + +func HandlerFromMuxWithBaseURL(si ServerInterface, r *mux.Router, baseURL string) http.Handler { + return HandlerWithOptions(si, GorillaServerOptions{ + BaseURL: baseURL, + BaseRouter: r, + }) +} + +// HandlerWithOptions creates http.Handler with additional options +func HandlerWithOptions(si ServerInterface, options GorillaServerOptions) http.Handler { + r := options.BaseRouter + + if r == nil { + r = mux.NewRouter() + } + if options.ErrorHandlerFunc == nil { + options.ErrorHandlerFunc = func(w http.ResponseWriter, r *http.Request, err error) { + http.Error(w, err.Error(), http.StatusBadRequest) + } + } + wrapper := ServerInterfaceWrapper{ + Handler: si, + HandlerMiddlewares: options.Middlewares, + ErrorHandlerFunc: options.ErrorHandlerFunc, + } + + r.HandleFunc(options.BaseURL+"/object", wrapper.GetObject).Methods("GET") + + return r +} + +type GetObjectRequestObject struct { +} + +type GetObjectResponseObject interface { + VisitGetObjectResponse(w http.ResponseWriter) error +} + +type GetObject200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string + +func (response GetObject200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetObjectResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) +} + +// StrictServerInterface represents all server handlers. +type StrictServerInterface interface { + + // (GET /object) + GetObject(ctx context.Context, request GetObjectRequestObject) (GetObjectResponseObject, error) +} + +type StrictHandlerFunc = strictnethttp.StrictHTTPHandlerFunc +type StrictMiddlewareFunc = strictnethttp.StrictHTTPMiddlewareFunc + +type StrictHTTPServerOptions struct { + RequestErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error) + ResponseErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error) +} + +func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { + return &strictHandler{ssi: ssi, middlewares: middlewares, options: StrictHTTPServerOptions{ + RequestErrorHandlerFunc: func(w http.ResponseWriter, r *http.Request, err error) { + http.Error(w, err.Error(), http.StatusBadRequest) + }, + ResponseErrorHandlerFunc: func(w http.ResponseWriter, r *http.Request, err error) { + http.Error(w, err.Error(), http.StatusInternalServerError) + }, + }} +} + +func NewStrictHandlerWithOptions(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc, options StrictHTTPServerOptions) ServerInterface { + return &strictHandler{ssi: ssi, middlewares: middlewares, options: options} +} + +type strictHandler struct { + ssi StrictServerInterface + middlewares []StrictMiddlewareFunc + options StrictHTTPServerOptions +} + +// GetObject operation middleware +func (sh *strictHandler) GetObject(w http.ResponseWriter, r *http.Request) { + var request GetObjectRequestObject + + handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { + return sh.ssi.GetObject(ctx, request.(GetObjectRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "GetObject") + } + + response, err := handler(r.Context(), w, r, request) + + if err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } else if validResponse, ok := response.(GetObjectResponseObject); ok { + if err := validResponse.VisitGetObjectResponse(w); err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } + } else if response != nil { + sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) + } +} diff --git a/internal/test/issues/issue1799/iris/out.gen.go b/internal/test/issues/issue1799/iris/out.gen.go new file mode 100644 index 0000000000..266531de56 --- /dev/null +++ b/internal/test/issues/issue1799/iris/out.gen.go @@ -0,0 +1,118 @@ +// Package iris provides primitives to interact with the openapi HTTP API. +// +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.0.0-00010101000000-000000000000 DO NOT EDIT. +package iris + +import ( + "context" + "net/http" + + "github.com/kataras/iris/v12" + strictiris "github.com/oapi-codegen/runtime/strictmiddleware/iris" +) + +// ServerInterface represents all server handlers. +type ServerInterface interface { + + // (GET /object) + GetObject(ctx iris.Context) +} + +// ServerInterfaceWrapper converts echo contexts to parameters. +type ServerInterfaceWrapper struct { + Handler ServerInterface +} + +type MiddlewareFunc iris.Handler + +// GetObject converts iris context to params. +func (w *ServerInterfaceWrapper) GetObject(ctx iris.Context) { + + // Invoke the callback with all the unmarshaled arguments + w.Handler.GetObject(ctx) +} + +// IrisServerOption is the option for iris server +type IrisServerOptions struct { + BaseURL string + Middlewares []MiddlewareFunc +} + +// RegisterHandlers creates http.Handler with routing matching OpenAPI spec. +func RegisterHandlers(router *iris.Application, si ServerInterface) { + RegisterHandlersWithOptions(router, si, IrisServerOptions{}) +} + +// RegisterHandlersWithOptions creates http.Handler with additional options +func RegisterHandlersWithOptions(router *iris.Application, si ServerInterface, options IrisServerOptions) { + + wrapper := ServerInterfaceWrapper{ + Handler: si, + } + + router.Get(options.BaseURL+"/object", wrapper.GetObject) + + router.Build() +} + +type GetObjectRequestObject struct { +} + +type GetObjectResponseObject interface { + VisitGetObjectResponse(ctx iris.Context) error +} + +type GetObject200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string + +func (response GetObject200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetObjectResponse(ctx iris.Context) error { + ctx.ResponseWriter().Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") + ctx.StatusCode(200) + + return ctx.JSON(&response) +} + +// StrictServerInterface represents all server handlers. +type StrictServerInterface interface { + + // (GET /object) + GetObject(ctx context.Context, request GetObjectRequestObject) (GetObjectResponseObject, error) +} + +type StrictHandlerFunc = strictiris.StrictIrisHandlerFunc +type StrictMiddlewareFunc = strictiris.StrictIrisMiddlewareFunc + +func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { + return &strictHandler{ssi: ssi, middlewares: middlewares} +} + +type strictHandler struct { + ssi StrictServerInterface + middlewares []StrictMiddlewareFunc +} + +// GetObject operation middleware +func (sh *strictHandler) GetObject(ctx iris.Context) { + var request GetObjectRequestObject + + handler := func(ctx iris.Context, request interface{}) (interface{}, error) { + return sh.ssi.GetObject(ctx, request.(GetObjectRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "GetObject") + } + + response, err := handler(ctx, request) + + if err != nil { + ctx.StopWithError(http.StatusBadRequest, err) + return + } else if validResponse, ok := response.(GetObjectResponseObject); ok { + if err := validResponse.VisitGetObjectResponse(ctx); err != nil { + ctx.StopWithError(http.StatusBadRequest, err) + return + } + } else if response != nil { + ctx.Writef("Unexpected response type: %T", response) + return + } +} diff --git a/internal/test/issues/issue1799/spec.yaml b/internal/test/issues/issue1799/spec.yaml new file mode 100644 index 0000000000..4cbbd821aa --- /dev/null +++ b/internal/test/issues/issue1799/spec.yaml @@ -0,0 +1,16 @@ +openapi: "3.0.0" + +info: + version: 0.0.1 + title: example + +paths: + /object: + get: + responses: + '200': + description: something + content: + "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"": + schema: + type: string \ No newline at end of file diff --git a/internal/test/issues/issue1799/std-http/out.gen.go b/internal/test/issues/issue1799/std-http/out.gen.go new file mode 100644 index 0000000000..8785b4db10 --- /dev/null +++ b/internal/test/issues/issue1799/std-http/out.gen.go @@ -0,0 +1,246 @@ +//go:build go1.22 + +// Package stdhttp provides primitives to interact with the openapi HTTP API. +// +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.0.0-00010101000000-000000000000 DO NOT EDIT. +package stdhttp + +import ( + "context" + "encoding/json" + "fmt" + "net/http" + + strictnethttp "github.com/oapi-codegen/runtime/strictmiddleware/nethttp" +) + +// ServerInterface represents all server handlers. +type ServerInterface interface { + + // (GET /object) + GetObject(w http.ResponseWriter, r *http.Request) +} + +// ServerInterfaceWrapper converts contexts to parameters. +type ServerInterfaceWrapper struct { + Handler ServerInterface + HandlerMiddlewares []MiddlewareFunc + ErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error) +} + +type MiddlewareFunc func(http.Handler) http.Handler + +// GetObject operation middleware +func (siw *ServerInterfaceWrapper) GetObject(w http.ResponseWriter, r *http.Request) { + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.GetObject(w, r) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + +type UnescapedCookieParamError struct { + ParamName string + Err error +} + +func (e *UnescapedCookieParamError) Error() string { + return fmt.Sprintf("error unescaping cookie parameter '%s'", e.ParamName) +} + +func (e *UnescapedCookieParamError) Unwrap() error { + return e.Err +} + +type UnmarshalingParamError struct { + ParamName string + Err error +} + +func (e *UnmarshalingParamError) Error() string { + return fmt.Sprintf("Error unmarshaling parameter %s as JSON: %s", e.ParamName, e.Err.Error()) +} + +func (e *UnmarshalingParamError) Unwrap() error { + return e.Err +} + +type RequiredParamError struct { + ParamName string +} + +func (e *RequiredParamError) Error() string { + return fmt.Sprintf("Query argument %s is required, but not found", e.ParamName) +} + +type RequiredHeaderError struct { + ParamName string + Err error +} + +func (e *RequiredHeaderError) Error() string { + return fmt.Sprintf("Header parameter %s is required, but not found", e.ParamName) +} + +func (e *RequiredHeaderError) Unwrap() error { + return e.Err +} + +type InvalidParamFormatError struct { + ParamName string + Err error +} + +func (e *InvalidParamFormatError) Error() string { + return fmt.Sprintf("Invalid format for parameter %s: %s", e.ParamName, e.Err.Error()) +} + +func (e *InvalidParamFormatError) Unwrap() error { + return e.Err +} + +type TooManyValuesForParamError struct { + ParamName string + Count int +} + +func (e *TooManyValuesForParamError) Error() string { + return fmt.Sprintf("Expected one value for %s, got %d", e.ParamName, e.Count) +} + +// Handler creates http.Handler with routing matching OpenAPI spec. +func Handler(si ServerInterface) http.Handler { + return HandlerWithOptions(si, StdHTTPServerOptions{}) +} + +// ServeMux is an abstraction of http.ServeMux. +type ServeMux interface { + HandleFunc(pattern string, handler func(http.ResponseWriter, *http.Request)) + ServeHTTP(w http.ResponseWriter, r *http.Request) +} + +type StdHTTPServerOptions struct { + BaseURL string + BaseRouter ServeMux + Middlewares []MiddlewareFunc + ErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error) +} + +// HandlerFromMux creates http.Handler with routing matching OpenAPI spec based on the provided mux. +func HandlerFromMux(si ServerInterface, m ServeMux) http.Handler { + return HandlerWithOptions(si, StdHTTPServerOptions{ + BaseRouter: m, + }) +} + +func HandlerFromMuxWithBaseURL(si ServerInterface, m ServeMux, baseURL string) http.Handler { + return HandlerWithOptions(si, StdHTTPServerOptions{ + BaseURL: baseURL, + BaseRouter: m, + }) +} + +// HandlerWithOptions creates http.Handler with additional options +func HandlerWithOptions(si ServerInterface, options StdHTTPServerOptions) http.Handler { + m := options.BaseRouter + + if m == nil { + m = http.NewServeMux() + } + if options.ErrorHandlerFunc == nil { + options.ErrorHandlerFunc = func(w http.ResponseWriter, r *http.Request, err error) { + http.Error(w, err.Error(), http.StatusBadRequest) + } + } + + wrapper := ServerInterfaceWrapper{ + Handler: si, + HandlerMiddlewares: options.Middlewares, + ErrorHandlerFunc: options.ErrorHandlerFunc, + } + + m.HandleFunc("GET "+options.BaseURL+"/object", wrapper.GetObject) + + return m +} + +type GetObjectRequestObject struct { +} + +type GetObjectResponseObject interface { + VisitGetObjectResponse(w http.ResponseWriter) error +} + +type GetObject200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string + +func (response GetObject200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetObjectResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) +} + +// StrictServerInterface represents all server handlers. +type StrictServerInterface interface { + + // (GET /object) + GetObject(ctx context.Context, request GetObjectRequestObject) (GetObjectResponseObject, error) +} + +type StrictHandlerFunc = strictnethttp.StrictHTTPHandlerFunc +type StrictMiddlewareFunc = strictnethttp.StrictHTTPMiddlewareFunc + +type StrictHTTPServerOptions struct { + RequestErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error) + ResponseErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error) +} + +func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { + return &strictHandler{ssi: ssi, middlewares: middlewares, options: StrictHTTPServerOptions{ + RequestErrorHandlerFunc: func(w http.ResponseWriter, r *http.Request, err error) { + http.Error(w, err.Error(), http.StatusBadRequest) + }, + ResponseErrorHandlerFunc: func(w http.ResponseWriter, r *http.Request, err error) { + http.Error(w, err.Error(), http.StatusInternalServerError) + }, + }} +} + +func NewStrictHandlerWithOptions(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc, options StrictHTTPServerOptions) ServerInterface { + return &strictHandler{ssi: ssi, middlewares: middlewares, options: options} +} + +type strictHandler struct { + ssi StrictServerInterface + middlewares []StrictMiddlewareFunc + options StrictHTTPServerOptions +} + +// GetObject operation middleware +func (sh *strictHandler) GetObject(w http.ResponseWriter, r *http.Request) { + var request GetObjectRequestObject + + handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { + return sh.ssi.GetObject(ctx, request.(GetObjectRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "GetObject") + } + + response, err := handler(r.Context(), w, r, request) + + if err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } else if validResponse, ok := response.(GetObjectResponseObject); ok { + if err := validResponse.VisitGetObjectResponse(w); err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } + } else if response != nil { + sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) + } +} diff --git a/pkg/codegen/codegen.go b/pkg/codegen/codegen.go index ef175afdd5..039ec6c0a3 100644 --- a/pkg/codegen/codegen.go +++ b/pkg/codegen/codegen.go @@ -26,6 +26,7 @@ import ( "os" "runtime/debug" "sort" + "strconv" "strings" "text/template" "time" @@ -995,6 +996,9 @@ func LoadTemplates(src embed.FS, t *template.Template) error { templateName := strings.TrimPrefix(path, "templates/") tmpl := t.New(templateName) + tmpl.Funcs(template.FuncMap{ + "quote": strconv.Quote, + }) _, err = tmpl.Parse(string(buf)) if err != nil { return fmt.Errorf("parsing template '%s': %w", path, err) diff --git a/pkg/codegen/templates/strict/strict-echo.tmpl b/pkg/codegen/templates/strict/strict-echo.tmpl index 676690fab3..6e425658b0 100644 --- a/pkg/codegen/templates/strict/strict-echo.tmpl +++ b/pkg/codegen/templates/strict/strict-echo.tmpl @@ -30,7 +30,7 @@ type strictHandler struct { {{$multipleBodies := gt (len .Bodies) 1 -}} {{range .Bodies -}} - {{if $multipleBodies}}if strings.HasPrefix(ctx.Request().Header.Get("Content-Type"), "{{.ContentType}}") { {{end}} + {{if $multipleBodies}}if strings.HasPrefix(ctx.Request().Header.Get("Content-Type"), "{{.ContentType | quote}}") { {{end}} {{if .IsJSON -}} var body {{$opid}}{{.NameTag}}RequestBody if err := ctx.Bind(&body); err != nil { diff --git a/pkg/codegen/templates/strict/strict-fiber-interface.tmpl b/pkg/codegen/templates/strict/strict-fiber-interface.tmpl index 8bcfc89b10..c4c6fab77f 100644 --- a/pkg/codegen/templates/strict/strict-fiber-interface.tmpl +++ b/pkg/codegen/templates/strict/strict-fiber-interface.tmpl @@ -77,7 +77,7 @@ {{if eq .NameTag "Multipart" -}} writer := multipart.NewWriter(ctx.Response().BodyWriter()) {{end -}} - ctx.Response().Header.Set("Content-Type", {{if eq .NameTag "Multipart"}}{{if eq .ContentType "multipart/form-data"}}writer.FormDataContentType(){{else}}mime.FormatMediaType("{{.ContentType}}", map[string]string{"boundary": writer.Boundary()}){{end}}{{else if .HasFixedContentType }}"{{.ContentType}}"{{else}}response.ContentType{{end}}) + ctx.Response().Header.Set("Content-Type", {{if eq .NameTag "Multipart"}}{{if eq .ContentType "multipart/form-data"}}writer.FormDataContentType(){{else}}mime.FormatMediaType({{.ContentType | quote}}, map[string]string{"boundary": writer.Boundary()}){{end}}{{else if .HasFixedContentType }}{{.ContentType | quote}}{{else}}response.ContentType{{end}}) {{if not .IsSupported -}} if response.ContentLength != 0 { ctx.Response().Header.Set("Content-Length", fmt.Sprint(response.ContentLength)) diff --git a/pkg/codegen/templates/strict/strict-fiber.tmpl b/pkg/codegen/templates/strict/strict-fiber.tmpl index 510899c9e0..398635e62d 100644 --- a/pkg/codegen/templates/strict/strict-fiber.tmpl +++ b/pkg/codegen/templates/strict/strict-fiber.tmpl @@ -32,7 +32,7 @@ type strictHandler struct { {{$multipleBodies := gt (len .Bodies) 1 -}} {{range .Bodies -}} - {{if $multipleBodies}}if strings.HasPrefix(string(ctx.Request().Header.ContentType()), "{{.ContentType}}") { {{end}} + {{if $multipleBodies}}if strings.HasPrefix(string(ctx.Request().Header.ContentType()), {{.ContentType | quote}}) { {{end}} {{if .IsJSON }} var body {{$opid}}{{.NameTag}}RequestBody if err := ctx.BodyParser(&body); err != nil { diff --git a/pkg/codegen/templates/strict/strict-gin.tmpl b/pkg/codegen/templates/strict/strict-gin.tmpl index d4c43164a6..406de4ec13 100644 --- a/pkg/codegen/templates/strict/strict-gin.tmpl +++ b/pkg/codegen/templates/strict/strict-gin.tmpl @@ -30,7 +30,7 @@ type strictHandler struct { {{$multipleBodies := gt (len .Bodies) 1 -}} {{range .Bodies -}} - {{if $multipleBodies}}if strings.HasPrefix(ctx.GetHeader("Content-Type"), "{{.ContentType}}") { {{end}} + {{if $multipleBodies}}if strings.HasPrefix(ctx.GetHeader("Content-Type"), {{.ContentType | quote}}) { {{end}} {{if .IsJSON }} var body {{$opid}}{{.NameTag}}RequestBody if err := ctx.ShouldBindJSON(&body); err != nil { diff --git a/pkg/codegen/templates/strict/strict-http.tmpl b/pkg/codegen/templates/strict/strict-http.tmpl index 8d32415ad6..c411aa280d 100644 --- a/pkg/codegen/templates/strict/strict-http.tmpl +++ b/pkg/codegen/templates/strict/strict-http.tmpl @@ -47,7 +47,7 @@ type strictHandler struct { {{$multipleBodies := gt (len .Bodies) 1 -}} {{range .Bodies -}} - {{if $multipleBodies}}if strings.HasPrefix(r.Header.Get("Content-Type"), "{{.ContentType}}") { {{end}} + {{if $multipleBodies}}if strings.HasPrefix(r.Header.Get("Content-Type"), {{.ContentType | quote}}) { {{end}} {{if .IsJSON }} var body {{$opid}}{{.NameTag}}RequestBody if err := json.NewDecoder(r.Body).Decode(&body); err != nil { diff --git a/pkg/codegen/templates/strict/strict-interface.tmpl b/pkg/codegen/templates/strict/strict-interface.tmpl index e19936d6a7..e3a31d5e74 100644 --- a/pkg/codegen/templates/strict/strict-interface.tmpl +++ b/pkg/codegen/templates/strict/strict-interface.tmpl @@ -74,7 +74,7 @@ {{if eq .NameTag "Multipart" -}} writer := multipart.NewWriter(w) {{end -}} - w.Header().Set("Content-Type", {{if eq .NameTag "Multipart"}}{{if eq .ContentType "multipart/form-data"}}writer.FormDataContentType(){{else}}mime.FormatMediaType("{{.ContentType}}", map[string]string{"boundary": writer.Boundary()}){{end}}{{else if .HasFixedContentType }}"{{.ContentType}}"{{else}}response.ContentType{{end}}) + w.Header().Set("Content-Type", {{if eq .NameTag "Multipart"}}{{if eq .ContentType "multipart/form-data"}}writer.FormDataContentType(){{else}}mime.FormatMediaType({{.ContentType | quote }}, map[string]string{"boundary": writer.Boundary()}){{end}}{{else if .HasFixedContentType }}{{.ContentType | quote }}{{else}}response.ContentType{{end}}) {{if not .IsSupported -}} if response.ContentLength != 0 { w.Header().Set("Content-Length", fmt.Sprint(response.ContentLength)) diff --git a/pkg/codegen/templates/strict/strict-iris-interface.tmpl b/pkg/codegen/templates/strict/strict-iris-interface.tmpl index e93fdf6166..7638429b7e 100644 --- a/pkg/codegen/templates/strict/strict-iris-interface.tmpl +++ b/pkg/codegen/templates/strict/strict-iris-interface.tmpl @@ -79,7 +79,7 @@ {{if eq .NameTag "Multipart" -}} writer := multipart.NewWriter(ctx.ResponseWriter()) {{end -}} - ctx.ResponseWriter().Header().Set("Content-Type", {{if eq .NameTag "Multipart"}}{{if eq .ContentType "multipart/form-data"}}writer.FormDataContentType(){{else}}mime.FormatMediaType("{{.ContentType}}", map[string]string{"boundary": writer.Boundary()}){{end}}{{else if .HasFixedContentType }}"{{.ContentType}}"{{else}}response.ContentType{{end}}) + ctx.ResponseWriter().Header().Set("Content-Type", {{if eq .NameTag "Multipart"}}{{if eq .ContentType "multipart/form-data"}}writer.FormDataContentType(){{else}}mime.FormatMediaType({{.ContentType | quote }}, map[string]string{"boundary": writer.Boundary()}){{end}}{{else if .HasFixedContentType }}{{.ContentType | quote}}{{else}}response.ContentType{{end}}) {{if not .IsSupported -}} if response.ContentLength != 0 { ctx.ResponseWriter().Header().Set("Content-Length", fmt.Sprint(response.ContentLength)) diff --git a/pkg/codegen/templates/strict/strict-iris.tmpl b/pkg/codegen/templates/strict/strict-iris.tmpl index dfdeb1546f..26d02428aa 100644 --- a/pkg/codegen/templates/strict/strict-iris.tmpl +++ b/pkg/codegen/templates/strict/strict-iris.tmpl @@ -30,7 +30,7 @@ type strictHandler struct { {{$multipleBodies := gt (len .Bodies) 1 -}} {{range .Bodies -}} - {{if $multipleBodies}}if strings.HasPrefix(ctx.GetHeader("Content-Type"), "{{.ContentType}}") { {{end}} + {{if $multipleBodies}}if strings.HasPrefix(ctx.GetHeader("Content-Type"), {{.ContentType | quote}}) { {{end}} {{if .IsJSON }} var body {{$opid}}{{.NameTag}}RequestBody if err := ctx.ReadJSON(&body); err != nil { From 9109e1d2661578b472326a6ee0f1e9b109b2427d Mon Sep 17 00:00:00 2001 From: Viktoras Makauskas Date: Sat, 15 Mar 2025 16:36:19 +0200 Subject: [PATCH 2/6] wip --- internal/test/issues/issue1799/chi/out.gen.go | 77 ++++++++++++ .../test/issues/issue1799/client/out.gen.go | 110 ++++++++++++++++++ .../test/issues/issue1799/echo/out.gen.go | 64 ++++++++++ .../test/issues/issue1799/fiber/out.gen.go | 64 ++++++++++ internal/test/issues/issue1799/gin/out.gen.go | 70 +++++++++++ .../test/issues/issue1799/gorilla/out.gen.go | 71 +++++++++++ .../test/issues/issue1799/iris/out.gen.go | 66 +++++++++++ internal/test/issues/issue1799/spec.yaml | 14 ++- .../test/issues/issue1799/std-http/out.gen.go | 70 +++++++++++ pkg/codegen/codegen.go | 4 - pkg/codegen/template_helpers.go | 6 +- pkg/codegen/templates/client.tmpl | 2 +- pkg/codegen/templates/strict/strict-echo.tmpl | 2 +- 13 files changed, 611 insertions(+), 9 deletions(-) diff --git a/internal/test/issues/issue1799/chi/out.gen.go b/internal/test/issues/issue1799/chi/out.gen.go index 7bd9f689b1..a15609b4fd 100644 --- a/internal/test/issues/issue1799/chi/out.gen.go +++ b/internal/test/issues/issue1799/chi/out.gen.go @@ -18,6 +18,9 @@ type ServerInterface interface { // (GET /object) GetObject(w http.ResponseWriter, r *http.Request) + + // (GET /object-multibody) + GetObjectMultibody(w http.ResponseWriter, r *http.Request) } // Unimplemented server implementation that returns http.StatusNotImplemented for each endpoint. @@ -29,6 +32,11 @@ func (_ Unimplemented) GetObject(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNotImplemented) } +// (GET /object-multibody) +func (_ Unimplemented) GetObjectMultibody(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusNotImplemented) +} + // ServerInterfaceWrapper converts contexts to parameters. type ServerInterfaceWrapper struct { Handler ServerInterface @@ -52,6 +60,20 @@ func (siw *ServerInterfaceWrapper) GetObject(w http.ResponseWriter, r *http.Requ handler.ServeHTTP(w, r) } +// GetObjectMultibody operation middleware +func (siw *ServerInterfaceWrapper) GetObjectMultibody(w http.ResponseWriter, r *http.Request) { + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.GetObjectMultibody(w, r) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + type UnescapedCookieParamError struct { ParamName string Err error @@ -168,6 +190,9 @@ func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handl r.Group(func(r chi.Router) { r.Get(options.BaseURL+"/object", wrapper.GetObject) }) + r.Group(func(r chi.Router) { + r.Get(options.BaseURL+"/object-multibody", wrapper.GetObjectMultibody) + }) return r } @@ -188,11 +213,39 @@ func (response GetObject200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivityst return json.NewEncoder(w).Encode(response) } +type GetObjectMultibodyRequestObject struct { +} + +type GetObjectMultibodyResponseObject interface { + VisitGetObjectMultibodyResponse(w http.ResponseWriter) error +} + +type GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string + +func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetObjectMultibodyResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) +} + +type GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string + +func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitGetObjectMultibodyResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) +} + // StrictServerInterface represents all server handlers. type StrictServerInterface interface { // (GET /object) GetObject(ctx context.Context, request GetObjectRequestObject) (GetObjectResponseObject, error) + + // (GET /object-multibody) + GetObjectMultibody(ctx context.Context, request GetObjectMultibodyRequestObject) (GetObjectMultibodyResponseObject, error) } type StrictHandlerFunc = strictnethttp.StrictHTTPHandlerFunc @@ -247,3 +300,27 @@ func (sh *strictHandler) GetObject(w http.ResponseWriter, r *http.Request) { sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) } } + +// GetObjectMultibody operation middleware +func (sh *strictHandler) GetObjectMultibody(w http.ResponseWriter, r *http.Request) { + var request GetObjectMultibodyRequestObject + + handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { + return sh.ssi.GetObjectMultibody(ctx, request.(GetObjectMultibodyRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "GetObjectMultibody") + } + + response, err := handler(r.Context(), w, r, request) + + if err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } else if validResponse, ok := response.(GetObjectMultibodyResponseObject); ok { + if err := validResponse.VisitGetObjectMultibodyResponse(w); err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } + } else if response != nil { + sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) + } +} diff --git a/internal/test/issues/issue1799/client/out.gen.go b/internal/test/issues/issue1799/client/out.gen.go index 44a014a0c9..1db04e8217 100644 --- a/internal/test/issues/issue1799/client/out.gen.go +++ b/internal/test/issues/issue1799/client/out.gen.go @@ -88,6 +88,9 @@ func WithRequestEditorFn(fn RequestEditorFn) ClientOption { type ClientInterface interface { // GetObject request GetObject(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) + + // GetObjectMultibody request + GetObjectMultibody(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) } func (c *Client) GetObject(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { @@ -102,6 +105,18 @@ func (c *Client) GetObject(ctx context.Context, reqEditors ...RequestEditorFn) ( return c.Client.Do(req) } +func (c *Client) GetObjectMultibody(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetObjectMultibodyRequest(c.Server) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + // NewGetObjectRequest generates requests for GetObject func NewGetObjectRequest(server string) (*http.Request, error) { var err error @@ -129,6 +144,33 @@ func NewGetObjectRequest(server string) (*http.Request, error) { return req, nil } +// NewGetObjectMultibodyRequest generates requests for GetObjectMultibody +func NewGetObjectMultibodyRequest(server string) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/object-multibody") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("GET", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + func (c *Client) applyEditors(ctx context.Context, req *http.Request, additionalEditors []RequestEditorFn) error { for _, r := range c.RequestEditors { if err := r(ctx, req); err != nil { @@ -174,6 +216,9 @@ func WithBaseURL(baseURL string) ClientOption { type ClientWithResponsesInterface interface { // GetObjectWithResponse request GetObjectWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetObjectResponse, error) + + // GetObjectMultibodyWithResponse request + GetObjectMultibodyWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetObjectMultibodyResponse, error) } type GetObjectResponse struct { @@ -198,6 +243,29 @@ func (r GetObjectResponse) StatusCode() int { return 0 } +type GetObjectMultibodyResponse struct { + Body []byte + HTTPResponse *http.Response + ApplicationldJSONProfilehttpswwwW3Orgnsactivitystreams200 *string + ApplicationldJSONProfilehttpswwwW3Orgnsactivitystreams2200 *string +} + +// Status returns HTTPResponse.Status +func (r GetObjectMultibodyResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r GetObjectMultibodyResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + // GetObjectWithResponse request returning *GetObjectResponse func (c *ClientWithResponses) GetObjectWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetObjectResponse, error) { rsp, err := c.GetObject(ctx, reqEditors...) @@ -207,6 +275,15 @@ func (c *ClientWithResponses) GetObjectWithResponse(ctx context.Context, reqEdit return ParseGetObjectResponse(rsp) } +// GetObjectMultibodyWithResponse request returning *GetObjectMultibodyResponse +func (c *ClientWithResponses) GetObjectMultibodyWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetObjectMultibodyResponse, error) { + rsp, err := c.GetObjectMultibody(ctx, reqEditors...) + if err != nil { + return nil, err + } + return ParseGetObjectMultibodyResponse(rsp) +} + // ParseGetObjectResponse parses an HTTP response from a GetObjectWithResponse call func ParseGetObjectResponse(rsp *http.Response) (*GetObjectResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) @@ -232,3 +309,36 @@ func ParseGetObjectResponse(rsp *http.Response) (*GetObjectResponse, error) { return response, nil } + +// ParseGetObjectMultibodyResponse parses an HTTP response from a GetObjectMultibodyWithResponse call +func ParseGetObjectMultibodyResponse(rsp *http.Response) (*GetObjectMultibodyResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &GetObjectMultibodyResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case rsp.Header.Get("Content-Type") == "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"" && rsp.StatusCode == 200: + var dest string + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.ApplicationldJSONProfilehttpswwwW3Orgnsactivitystreams200 = &dest + + case rsp.Header.Get("Content-Type") == "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"" && rsp.StatusCode == 200: + var dest string + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.ApplicationldJSONProfilehttpswwwW3Orgnsactivitystreams2200 = &dest + + } + + return response, nil +} diff --git a/internal/test/issues/issue1799/echo/out.gen.go b/internal/test/issues/issue1799/echo/out.gen.go index e8b1c9998e..9fdef5f490 100644 --- a/internal/test/issues/issue1799/echo/out.gen.go +++ b/internal/test/issues/issue1799/echo/out.gen.go @@ -18,6 +18,9 @@ type ServerInterface interface { // (GET /object) GetObject(ctx echo.Context) error + + // (GET /object-multibody) + GetObjectMultibody(ctx echo.Context) error } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -34,6 +37,15 @@ func (w *ServerInterfaceWrapper) GetObject(ctx echo.Context) error { return err } +// GetObjectMultibody converts echo context to params. +func (w *ServerInterfaceWrapper) GetObjectMultibody(ctx echo.Context) error { + var err error + + // Invoke the callback with all the unmarshaled arguments + err = w.Handler.GetObjectMultibody(ctx) + return err +} + // This is a simple interface which specifies echo.Route addition functions which // are present on both echo.Echo and echo.Group, since we want to allow using // either of them for path registration @@ -63,6 +75,7 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL } router.GET(baseURL+"/object", wrapper.GetObject) + router.GET(baseURL+"/object-multibody", wrapper.GetObjectMultibody) } @@ -82,11 +95,39 @@ func (response GetObject200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivityst return json.NewEncoder(w).Encode(response) } +type GetObjectMultibodyRequestObject struct { +} + +type GetObjectMultibodyResponseObject interface { + VisitGetObjectMultibodyResponse(w http.ResponseWriter) error +} + +type GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string + +func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetObjectMultibodyResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) +} + +type GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string + +func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitGetObjectMultibodyResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) +} + // StrictServerInterface represents all server handlers. type StrictServerInterface interface { // (GET /object) GetObject(ctx context.Context, request GetObjectRequestObject) (GetObjectResponseObject, error) + + // (GET /object-multibody) + GetObjectMultibody(ctx context.Context, request GetObjectMultibodyRequestObject) (GetObjectMultibodyResponseObject, error) } type StrictHandlerFunc = strictecho.StrictEchoHandlerFunc @@ -123,3 +164,26 @@ func (sh *strictHandler) GetObject(ctx echo.Context) error { } return nil } + +// GetObjectMultibody operation middleware +func (sh *strictHandler) GetObjectMultibody(ctx echo.Context) error { + var request GetObjectMultibodyRequestObject + + handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + return sh.ssi.GetObjectMultibody(ctx.Request().Context(), request.(GetObjectMultibodyRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "GetObjectMultibody") + } + + response, err := handler(ctx, request) + + if err != nil { + return err + } else if validResponse, ok := response.(GetObjectMultibodyResponseObject); ok { + return validResponse.VisitGetObjectMultibodyResponse(ctx.Response()) + } else if response != nil { + return fmt.Errorf("unexpected response type: %T", response) + } + return nil +} diff --git a/internal/test/issues/issue1799/fiber/out.gen.go b/internal/test/issues/issue1799/fiber/out.gen.go index c2475971ee..7241dbe275 100644 --- a/internal/test/issues/issue1799/fiber/out.gen.go +++ b/internal/test/issues/issue1799/fiber/out.gen.go @@ -15,6 +15,9 @@ type ServerInterface interface { // (GET /object) GetObject(c *fiber.Ctx) error + + // (GET /object-multibody) + GetObjectMultibody(c *fiber.Ctx) error } // ServerInterfaceWrapper converts contexts to parameters. @@ -30,6 +33,12 @@ func (siw *ServerInterfaceWrapper) GetObject(c *fiber.Ctx) error { return siw.Handler.GetObject(c) } +// GetObjectMultibody operation middleware +func (siw *ServerInterfaceWrapper) GetObjectMultibody(c *fiber.Ctx) error { + + return siw.Handler.GetObjectMultibody(c) +} + // FiberServerOptions provides options for the Fiber server. type FiberServerOptions struct { BaseURL string @@ -53,6 +62,8 @@ func RegisterHandlersWithOptions(router fiber.Router, si ServerInterface, option router.Get(options.BaseURL+"/object", wrapper.GetObject) + router.Get(options.BaseURL+"/object-multibody", wrapper.GetObjectMultibody) + } type GetObjectRequestObject struct { @@ -71,11 +82,39 @@ func (response GetObject200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivityst return ctx.JSON(&response) } +type GetObjectMultibodyRequestObject struct { +} + +type GetObjectMultibodyResponseObject interface { + VisitGetObjectMultibodyResponse(ctx *fiber.Ctx) error +} + +type GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string + +func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetObjectMultibodyResponse(ctx *fiber.Ctx) error { + ctx.Response().Header.Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") + ctx.Status(200) + + return ctx.JSON(&response) +} + +type GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string + +func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitGetObjectMultibodyResponse(ctx *fiber.Ctx) error { + ctx.Response().Header.Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") + ctx.Status(200) + + return ctx.JSON(&response) +} + // StrictServerInterface represents all server handlers. type StrictServerInterface interface { // (GET /object) GetObject(ctx context.Context, request GetObjectRequestObject) (GetObjectResponseObject, error) + + // (GET /object-multibody) + GetObjectMultibody(ctx context.Context, request GetObjectMultibodyRequestObject) (GetObjectMultibodyResponseObject, error) } type StrictHandlerFunc func(ctx *fiber.Ctx, args interface{}) (interface{}, error) @@ -115,3 +154,28 @@ func (sh *strictHandler) GetObject(ctx *fiber.Ctx) error { } return nil } + +// GetObjectMultibody operation middleware +func (sh *strictHandler) GetObjectMultibody(ctx *fiber.Ctx) error { + var request GetObjectMultibodyRequestObject + + handler := func(ctx *fiber.Ctx, request interface{}) (interface{}, error) { + return sh.ssi.GetObjectMultibody(ctx.UserContext(), request.(GetObjectMultibodyRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "GetObjectMultibody") + } + + response, err := handler(ctx, request) + + if err != nil { + return fiber.NewError(fiber.StatusBadRequest, err.Error()) + } else if validResponse, ok := response.(GetObjectMultibodyResponseObject); ok { + if err := validResponse.VisitGetObjectMultibodyResponse(ctx); err != nil { + return fiber.NewError(fiber.StatusBadRequest, err.Error()) + } + } else if response != nil { + return fmt.Errorf("unexpected response type: %T", response) + } + return nil +} diff --git a/internal/test/issues/issue1799/gin/out.gen.go b/internal/test/issues/issue1799/gin/out.gen.go index a61561b868..b334ff0d18 100644 --- a/internal/test/issues/issue1799/gin/out.gen.go +++ b/internal/test/issues/issue1799/gin/out.gen.go @@ -18,6 +18,9 @@ type ServerInterface interface { // (GET /object) GetObject(c *gin.Context) + + // (GET /object-multibody) + GetObjectMultibody(c *gin.Context) } // ServerInterfaceWrapper converts contexts to parameters. @@ -42,6 +45,19 @@ func (siw *ServerInterfaceWrapper) GetObject(c *gin.Context) { siw.Handler.GetObject(c) } +// GetObjectMultibody operation middleware +func (siw *ServerInterfaceWrapper) GetObjectMultibody(c *gin.Context) { + + for _, middleware := range siw.HandlerMiddlewares { + middleware(c) + if c.IsAborted() { + return + } + } + + siw.Handler.GetObjectMultibody(c) +} + // GinServerOptions provides options for the Gin server. type GinServerOptions struct { BaseURL string @@ -70,6 +86,7 @@ func RegisterHandlersWithOptions(router gin.IRouter, si ServerInterface, options } router.GET(options.BaseURL+"/object", wrapper.GetObject) + router.GET(options.BaseURL+"/object-multibody", wrapper.GetObjectMultibody) } type GetObjectRequestObject struct { @@ -88,11 +105,39 @@ func (response GetObject200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivityst return json.NewEncoder(w).Encode(response) } +type GetObjectMultibodyRequestObject struct { +} + +type GetObjectMultibodyResponseObject interface { + VisitGetObjectMultibodyResponse(w http.ResponseWriter) error +} + +type GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string + +func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetObjectMultibodyResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) +} + +type GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string + +func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitGetObjectMultibodyResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) +} + // StrictServerInterface represents all server handlers. type StrictServerInterface interface { // (GET /object) GetObject(ctx context.Context, request GetObjectRequestObject) (GetObjectResponseObject, error) + + // (GET /object-multibody) + GetObjectMultibody(ctx context.Context, request GetObjectMultibodyRequestObject) (GetObjectMultibodyResponseObject, error) } type StrictHandlerFunc = strictgin.StrictGinHandlerFunc @@ -131,3 +176,28 @@ func (sh *strictHandler) GetObject(ctx *gin.Context) { ctx.Error(fmt.Errorf("unexpected response type: %T", response)) } } + +// GetObjectMultibody operation middleware +func (sh *strictHandler) GetObjectMultibody(ctx *gin.Context) { + var request GetObjectMultibodyRequestObject + + handler := func(ctx *gin.Context, request interface{}) (interface{}, error) { + return sh.ssi.GetObjectMultibody(ctx, request.(GetObjectMultibodyRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "GetObjectMultibody") + } + + response, err := handler(ctx, request) + + if err != nil { + ctx.Error(err) + ctx.Status(http.StatusInternalServerError) + } else if validResponse, ok := response.(GetObjectMultibodyResponseObject); ok { + if err := validResponse.VisitGetObjectMultibodyResponse(ctx.Writer); err != nil { + ctx.Error(err) + } + } else if response != nil { + ctx.Error(fmt.Errorf("unexpected response type: %T", response)) + } +} diff --git a/internal/test/issues/issue1799/gorilla/out.gen.go b/internal/test/issues/issue1799/gorilla/out.gen.go index 2d53e77a90..85951e07d1 100644 --- a/internal/test/issues/issue1799/gorilla/out.gen.go +++ b/internal/test/issues/issue1799/gorilla/out.gen.go @@ -18,6 +18,9 @@ type ServerInterface interface { // (GET /object) GetObject(w http.ResponseWriter, r *http.Request) + + // (GET /object-multibody) + GetObjectMultibody(w http.ResponseWriter, r *http.Request) } // ServerInterfaceWrapper converts contexts to parameters. @@ -43,6 +46,20 @@ func (siw *ServerInterfaceWrapper) GetObject(w http.ResponseWriter, r *http.Requ handler.ServeHTTP(w, r) } +// GetObjectMultibody operation middleware +func (siw *ServerInterfaceWrapper) GetObjectMultibody(w http.ResponseWriter, r *http.Request) { + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.GetObjectMultibody(w, r) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + type UnescapedCookieParamError struct { ParamName string Err error @@ -158,6 +175,8 @@ func HandlerWithOptions(si ServerInterface, options GorillaServerOptions) http.H r.HandleFunc(options.BaseURL+"/object", wrapper.GetObject).Methods("GET") + r.HandleFunc(options.BaseURL+"/object-multibody", wrapper.GetObjectMultibody).Methods("GET") + return r } @@ -177,11 +196,39 @@ func (response GetObject200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivityst return json.NewEncoder(w).Encode(response) } +type GetObjectMultibodyRequestObject struct { +} + +type GetObjectMultibodyResponseObject interface { + VisitGetObjectMultibodyResponse(w http.ResponseWriter) error +} + +type GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string + +func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetObjectMultibodyResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) +} + +type GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string + +func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitGetObjectMultibodyResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) +} + // StrictServerInterface represents all server handlers. type StrictServerInterface interface { // (GET /object) GetObject(ctx context.Context, request GetObjectRequestObject) (GetObjectResponseObject, error) + + // (GET /object-multibody) + GetObjectMultibody(ctx context.Context, request GetObjectMultibodyRequestObject) (GetObjectMultibodyResponseObject, error) } type StrictHandlerFunc = strictnethttp.StrictHTTPHandlerFunc @@ -236,3 +283,27 @@ func (sh *strictHandler) GetObject(w http.ResponseWriter, r *http.Request) { sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) } } + +// GetObjectMultibody operation middleware +func (sh *strictHandler) GetObjectMultibody(w http.ResponseWriter, r *http.Request) { + var request GetObjectMultibodyRequestObject + + handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { + return sh.ssi.GetObjectMultibody(ctx, request.(GetObjectMultibodyRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "GetObjectMultibody") + } + + response, err := handler(r.Context(), w, r, request) + + if err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } else if validResponse, ok := response.(GetObjectMultibodyResponseObject); ok { + if err := validResponse.VisitGetObjectMultibodyResponse(w); err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } + } else if response != nil { + sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) + } +} diff --git a/internal/test/issues/issue1799/iris/out.gen.go b/internal/test/issues/issue1799/iris/out.gen.go index 266531de56..54db83c21a 100644 --- a/internal/test/issues/issue1799/iris/out.gen.go +++ b/internal/test/issues/issue1799/iris/out.gen.go @@ -16,6 +16,9 @@ type ServerInterface interface { // (GET /object) GetObject(ctx iris.Context) + + // (GET /object-multibody) + GetObjectMultibody(ctx iris.Context) } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -32,6 +35,13 @@ func (w *ServerInterfaceWrapper) GetObject(ctx iris.Context) { w.Handler.GetObject(ctx) } +// GetObjectMultibody converts iris context to params. +func (w *ServerInterfaceWrapper) GetObjectMultibody(ctx iris.Context) { + + // Invoke the callback with all the unmarshaled arguments + w.Handler.GetObjectMultibody(ctx) +} + // IrisServerOption is the option for iris server type IrisServerOptions struct { BaseURL string @@ -51,6 +61,7 @@ func RegisterHandlersWithOptions(router *iris.Application, si ServerInterface, o } router.Get(options.BaseURL+"/object", wrapper.GetObject) + router.Get(options.BaseURL+"/object-multibody", wrapper.GetObjectMultibody) router.Build() } @@ -71,11 +82,39 @@ func (response GetObject200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivityst return ctx.JSON(&response) } +type GetObjectMultibodyRequestObject struct { +} + +type GetObjectMultibodyResponseObject interface { + VisitGetObjectMultibodyResponse(ctx iris.Context) error +} + +type GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string + +func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetObjectMultibodyResponse(ctx iris.Context) error { + ctx.ResponseWriter().Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") + ctx.StatusCode(200) + + return ctx.JSON(&response) +} + +type GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string + +func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitGetObjectMultibodyResponse(ctx iris.Context) error { + ctx.ResponseWriter().Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") + ctx.StatusCode(200) + + return ctx.JSON(&response) +} + // StrictServerInterface represents all server handlers. type StrictServerInterface interface { // (GET /object) GetObject(ctx context.Context, request GetObjectRequestObject) (GetObjectResponseObject, error) + + // (GET /object-multibody) + GetObjectMultibody(ctx context.Context, request GetObjectMultibodyRequestObject) (GetObjectMultibodyResponseObject, error) } type StrictHandlerFunc = strictiris.StrictIrisHandlerFunc @@ -116,3 +155,30 @@ func (sh *strictHandler) GetObject(ctx iris.Context) { return } } + +// GetObjectMultibody operation middleware +func (sh *strictHandler) GetObjectMultibody(ctx iris.Context) { + var request GetObjectMultibodyRequestObject + + handler := func(ctx iris.Context, request interface{}) (interface{}, error) { + return sh.ssi.GetObjectMultibody(ctx, request.(GetObjectMultibodyRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "GetObjectMultibody") + } + + response, err := handler(ctx, request) + + if err != nil { + ctx.StopWithError(http.StatusBadRequest, err) + return + } else if validResponse, ok := response.(GetObjectMultibodyResponseObject); ok { + if err := validResponse.VisitGetObjectMultibodyResponse(ctx); err != nil { + ctx.StopWithError(http.StatusBadRequest, err) + return + } + } else if response != nil { + ctx.Writef("Unexpected response type: %T", response) + return + } +} diff --git a/internal/test/issues/issue1799/spec.yaml b/internal/test/issues/issue1799/spec.yaml index 4cbbd821aa..4af6ea01a5 100644 --- a/internal/test/issues/issue1799/spec.yaml +++ b/internal/test/issues/issue1799/spec.yaml @@ -13,4 +13,16 @@ paths: content: "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"": schema: - type: string \ No newline at end of file + type: string + /object-multibody: + get: + responses: + '200': + description: something + content: + "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"": + schema: + type: string + "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"": + schema: + type: string diff --git a/internal/test/issues/issue1799/std-http/out.gen.go b/internal/test/issues/issue1799/std-http/out.gen.go index 8785b4db10..2ec0234d22 100644 --- a/internal/test/issues/issue1799/std-http/out.gen.go +++ b/internal/test/issues/issue1799/std-http/out.gen.go @@ -19,6 +19,9 @@ type ServerInterface interface { // (GET /object) GetObject(w http.ResponseWriter, r *http.Request) + + // (GET /object-multibody) + GetObjectMultibody(w http.ResponseWriter, r *http.Request) } // ServerInterfaceWrapper converts contexts to parameters. @@ -44,6 +47,20 @@ func (siw *ServerInterfaceWrapper) GetObject(w http.ResponseWriter, r *http.Requ handler.ServeHTTP(w, r) } +// GetObjectMultibody operation middleware +func (siw *ServerInterfaceWrapper) GetObjectMultibody(w http.ResponseWriter, r *http.Request) { + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.GetObjectMultibody(w, r) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + type UnescapedCookieParamError struct { ParamName string Err error @@ -165,6 +182,7 @@ func HandlerWithOptions(si ServerInterface, options StdHTTPServerOptions) http.H } m.HandleFunc("GET "+options.BaseURL+"/object", wrapper.GetObject) + m.HandleFunc("GET "+options.BaseURL+"/object-multibody", wrapper.GetObjectMultibody) return m } @@ -185,11 +203,39 @@ func (response GetObject200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivityst return json.NewEncoder(w).Encode(response) } +type GetObjectMultibodyRequestObject struct { +} + +type GetObjectMultibodyResponseObject interface { + VisitGetObjectMultibodyResponse(w http.ResponseWriter) error +} + +type GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string + +func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetObjectMultibodyResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) +} + +type GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string + +func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitGetObjectMultibodyResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) +} + // StrictServerInterface represents all server handlers. type StrictServerInterface interface { // (GET /object) GetObject(ctx context.Context, request GetObjectRequestObject) (GetObjectResponseObject, error) + + // (GET /object-multibody) + GetObjectMultibody(ctx context.Context, request GetObjectMultibodyRequestObject) (GetObjectMultibodyResponseObject, error) } type StrictHandlerFunc = strictnethttp.StrictHTTPHandlerFunc @@ -244,3 +290,27 @@ func (sh *strictHandler) GetObject(w http.ResponseWriter, r *http.Request) { sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) } } + +// GetObjectMultibody operation middleware +func (sh *strictHandler) GetObjectMultibody(w http.ResponseWriter, r *http.Request) { + var request GetObjectMultibodyRequestObject + + handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { + return sh.ssi.GetObjectMultibody(ctx, request.(GetObjectMultibodyRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "GetObjectMultibody") + } + + response, err := handler(r.Context(), w, r, request) + + if err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } else if validResponse, ok := response.(GetObjectMultibodyResponseObject); ok { + if err := validResponse.VisitGetObjectMultibodyResponse(w); err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } + } else if response != nil { + sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) + } +} diff --git a/pkg/codegen/codegen.go b/pkg/codegen/codegen.go index 039ec6c0a3..ef175afdd5 100644 --- a/pkg/codegen/codegen.go +++ b/pkg/codegen/codegen.go @@ -26,7 +26,6 @@ import ( "os" "runtime/debug" "sort" - "strconv" "strings" "text/template" "time" @@ -996,9 +995,6 @@ func LoadTemplates(src embed.FS, t *template.Template) error { templateName := strings.TrimPrefix(path, "templates/") tmpl := t.New(templateName) - tmpl.Funcs(template.FuncMap{ - "quote": strconv.Quote, - }) _, err = tmpl.Parse(string(buf)) if err != nil { return fmt.Errorf("parsing template '%s': %w", path, err) diff --git a/pkg/codegen/template_helpers.go b/pkg/codegen/template_helpers.go index b9efe2cf45..5a23e00ab3 100644 --- a/pkg/codegen/template_helpers.go +++ b/pkg/codegen/template_helpers.go @@ -17,6 +17,7 @@ import ( "bytes" "fmt" "os" + "strconv" "strings" "text/template" @@ -245,14 +246,14 @@ func genResponseUnmarshal(op *OperationDefinition) string { func buildUnmarshalCase(typeDefinition ResponseTypeDefinition, caseAction string, contentType string) (caseKey string, caseClause string) { caseKey = fmt.Sprintf("%s.%s.%s", prefixLeastSpecific, contentType, typeDefinition.ResponseName) caseClauseKey := getConditionOfResponseName("rsp.StatusCode", typeDefinition.ResponseName) - caseClause = fmt.Sprintf("case strings.Contains(rsp.Header.Get(\"%s\"), \"%s\") && %s:\n%s\n", "Content-Type", contentType, caseClauseKey, caseAction) + caseClause = fmt.Sprintf("case strings.Contains(rsp.Header.Get(\"%s\"), %q) && %s:\n%s\n", "Content-Type", contentType, caseClauseKey, caseAction) return caseKey, caseClause } func buildUnmarshalCaseStrict(typeDefinition ResponseTypeDefinition, caseAction string, contentType string) (caseKey string, caseClause string) { caseKey = fmt.Sprintf("%s.%s.%s", prefixLeastSpecific, contentType, typeDefinition.ResponseName) caseClauseKey := getConditionOfResponseName("rsp.StatusCode", typeDefinition.ResponseName) - caseClause = fmt.Sprintf("case rsp.Header.Get(\"%s\") == \"%s\" && %s:\n%s\n", "Content-Type", contentType, caseClauseKey, caseAction) + caseClause = fmt.Sprintf("case rsp.Header.Get(\"%s\") == %q && %s:\n%s\n", "Content-Type", contentType, caseClauseKey, caseAction) return caseKey, caseClause } @@ -320,6 +321,7 @@ var TemplateFunctions = template.FuncMap{ "toStringArray": toStringArray, "lower": strings.ToLower, "title": titleCaser.String, + "quote": strconv.Quote, "stripNewLines": stripNewLines, "sanitizeGoIdentity": SanitizeGoIdentity, "toGoComment": StringWithTypeNameToGoComment, diff --git a/pkg/codegen/templates/client.tmpl b/pkg/codegen/templates/client.tmpl index 10ee5644d2..6cded0021d 100644 --- a/pkg/codegen/templates/client.tmpl +++ b/pkg/codegen/templates/client.tmpl @@ -150,7 +150,7 @@ func New{{$opid}}Request{{.Suffix}}(server string{{genParamArgs $pathParams}}{{i {{else if eq .NameTag "Text" -}} bodyReader = strings.NewReader(string(body)) {{end -}} - return New{{$opid}}RequestWithBody(server{{genParamNames $pathParams}}{{if $hasParams}}, params{{end}}, "{{.ContentType}}", bodyReader) + return New{{$opid}}RequestWithBody(server{{genParamNames $pathParams}}{{if $hasParams}}, params{{end}}, {{.ContentType | quote}}, bodyReader) } {{end -}} {{end}} diff --git a/pkg/codegen/templates/strict/strict-echo.tmpl b/pkg/codegen/templates/strict/strict-echo.tmpl index 6e425658b0..69892605e9 100644 --- a/pkg/codegen/templates/strict/strict-echo.tmpl +++ b/pkg/codegen/templates/strict/strict-echo.tmpl @@ -30,7 +30,7 @@ type strictHandler struct { {{$multipleBodies := gt (len .Bodies) 1 -}} {{range .Bodies -}} - {{if $multipleBodies}}if strings.HasPrefix(ctx.Request().Header.Get("Content-Type"), "{{.ContentType | quote}}") { {{end}} + {{if $multipleBodies}}if XXXX strings.HasPrefix(ctx.Request().Header.Get("Content-Type"), "{{.ContentType | quote}}") { {{end}} {{if .IsJSON -}} var body {{$opid}}{{.NameTag}}RequestBody if err := ctx.Bind(&body); err != nil { From db83e40ed114dcb4fd55a79c80c74e071ffead92 Mon Sep 17 00:00:00 2001 From: Viktoras Makauskas Date: Sat, 15 Mar 2025 16:40:42 +0200 Subject: [PATCH 3/6] wip --- internal/test/issues/issue1799/chi/out.gen.go | 147 +++++++++-- .../test/issues/issue1799/client/out.gen.go | 235 ++++++++++++++++-- .../test/issues/issue1799/echo/out.gen.go | 126 ++++++++-- .../test/issues/issue1799/fiber/out.gen.go | 128 ++++++++-- internal/test/issues/issue1799/gin/out.gen.go | 138 ++++++++-- .../test/issues/issue1799/gorilla/out.gen.go | 137 ++++++++-- .../test/issues/issue1799/iris/out.gen.go | 132 ++++++++-- internal/test/issues/issue1799/spec.yaml | 24 +- .../test/issues/issue1799/std-http/out.gen.go | 136 ++++++++-- pkg/codegen/templates/strict/strict-echo.tmpl | 2 +- 10 files changed, 1027 insertions(+), 178 deletions(-) diff --git a/internal/test/issues/issue1799/chi/out.gen.go b/internal/test/issues/issue1799/chi/out.gen.go index a15609b4fd..d0f46cae48 100644 --- a/internal/test/issues/issue1799/chi/out.gen.go +++ b/internal/test/issues/issue1799/chi/out.gen.go @@ -8,6 +8,7 @@ import ( "encoding/json" "fmt" "net/http" + "strings" "github.com/go-chi/chi/v5" strictnethttp "github.com/oapi-codegen/runtime/strictmiddleware/nethttp" @@ -16,24 +17,32 @@ import ( // ServerInterface represents all server handlers. type ServerInterface interface { + // (GET /get-multibody) + GetGetMultibody(w http.ResponseWriter, r *http.Request) + // (GET /object) GetObject(w http.ResponseWriter, r *http.Request) - // (GET /object-multibody) - GetObjectMultibody(w http.ResponseWriter, r *http.Request) + // (POST /post-multibody) + PostPostMultibody(w http.ResponseWriter, r *http.Request) } // Unimplemented server implementation that returns http.StatusNotImplemented for each endpoint. type Unimplemented struct{} +// (GET /get-multibody) +func (_ Unimplemented) GetGetMultibody(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusNotImplemented) +} + // (GET /object) func (_ Unimplemented) GetObject(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNotImplemented) } -// (GET /object-multibody) -func (_ Unimplemented) GetObjectMultibody(w http.ResponseWriter, r *http.Request) { +// (POST /post-multibody) +func (_ Unimplemented) PostPostMultibody(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNotImplemented) } @@ -46,6 +55,20 @@ type ServerInterfaceWrapper struct { type MiddlewareFunc func(http.Handler) http.Handler +// GetGetMultibody operation middleware +func (siw *ServerInterfaceWrapper) GetGetMultibody(w http.ResponseWriter, r *http.Request) { + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.GetGetMultibody(w, r) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + // GetObject operation middleware func (siw *ServerInterfaceWrapper) GetObject(w http.ResponseWriter, r *http.Request) { @@ -60,11 +83,11 @@ func (siw *ServerInterfaceWrapper) GetObject(w http.ResponseWriter, r *http.Requ handler.ServeHTTP(w, r) } -// GetObjectMultibody operation middleware -func (siw *ServerInterfaceWrapper) GetObjectMultibody(w http.ResponseWriter, r *http.Request) { +// PostPostMultibody operation middleware +func (siw *ServerInterfaceWrapper) PostPostMultibody(w http.ResponseWriter, r *http.Request) { handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.GetObjectMultibody(w, r) + siw.Handler.PostPostMultibody(w, r) })) for _, middleware := range siw.HandlerMiddlewares { @@ -187,16 +210,44 @@ func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handl ErrorHandlerFunc: options.ErrorHandlerFunc, } + r.Group(func(r chi.Router) { + r.Get(options.BaseURL+"/get-multibody", wrapper.GetGetMultibody) + }) r.Group(func(r chi.Router) { r.Get(options.BaseURL+"/object", wrapper.GetObject) }) r.Group(func(r chi.Router) { - r.Get(options.BaseURL+"/object-multibody", wrapper.GetObjectMultibody) + r.Post(options.BaseURL+"/post-multibody", wrapper.PostPostMultibody) }) return r } +type GetGetMultibodyRequestObject struct { +} + +type GetGetMultibodyResponseObject interface { + VisitGetGetMultibodyResponse(w http.ResponseWriter) error +} + +type GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string + +func (response GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetGetMultibodyResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) +} + +type GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string + +func (response GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitGetGetMultibodyResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) +} + type GetObjectRequestObject struct { } @@ -213,25 +264,27 @@ func (response GetObject200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivityst return json.NewEncoder(w).Encode(response) } -type GetObjectMultibodyRequestObject struct { +type PostPostMultibodyRequestObject struct { + ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody *PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody + ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body *PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody } -type GetObjectMultibodyResponseObject interface { - VisitGetObjectMultibodyResponse(w http.ResponseWriter) error +type PostPostMultibodyResponseObject interface { + VisitPostPostMultibodyResponse(w http.ResponseWriter) error } -type GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string +type PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string -func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetObjectMultibodyResponse(w http.ResponseWriter) error { +func (response PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitPostPostMultibodyResponse(w http.ResponseWriter) error { w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") w.WriteHeader(200) return json.NewEncoder(w).Encode(response) } -type GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string +type PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string -func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitGetObjectMultibodyResponse(w http.ResponseWriter) error { +func (response PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitPostPostMultibodyResponse(w http.ResponseWriter) error { w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") w.WriteHeader(200) @@ -241,11 +294,14 @@ func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsa // StrictServerInterface represents all server handlers. type StrictServerInterface interface { + // (GET /get-multibody) + GetGetMultibody(ctx context.Context, request GetGetMultibodyRequestObject) (GetGetMultibodyResponseObject, error) + // (GET /object) GetObject(ctx context.Context, request GetObjectRequestObject) (GetObjectResponseObject, error) - // (GET /object-multibody) - GetObjectMultibody(ctx context.Context, request GetObjectMultibodyRequestObject) (GetObjectMultibodyResponseObject, error) + // (POST /post-multibody) + PostPostMultibody(ctx context.Context, request PostPostMultibodyRequestObject) (PostPostMultibodyResponseObject, error) } type StrictHandlerFunc = strictnethttp.StrictHTTPHandlerFunc @@ -277,6 +333,30 @@ type strictHandler struct { options StrictHTTPServerOptions } +// GetGetMultibody operation middleware +func (sh *strictHandler) GetGetMultibody(w http.ResponseWriter, r *http.Request) { + var request GetGetMultibodyRequestObject + + handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { + return sh.ssi.GetGetMultibody(ctx, request.(GetGetMultibodyRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "GetGetMultibody") + } + + response, err := handler(r.Context(), w, r, request) + + if err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } else if validResponse, ok := response.(GetGetMultibodyResponseObject); ok { + if err := validResponse.VisitGetGetMultibodyResponse(w); err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } + } else if response != nil { + sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) + } +} + // GetObject operation middleware func (sh *strictHandler) GetObject(w http.ResponseWriter, r *http.Request) { var request GetObjectRequestObject @@ -301,23 +381,42 @@ func (sh *strictHandler) GetObject(w http.ResponseWriter, r *http.Request) { } } -// GetObjectMultibody operation middleware -func (sh *strictHandler) GetObjectMultibody(w http.ResponseWriter, r *http.Request) { - var request GetObjectMultibodyRequestObject +// PostPostMultibody operation middleware +func (sh *strictHandler) PostPostMultibody(w http.ResponseWriter, r *http.Request) { + var request PostPostMultibodyRequestObject + + if strings.HasPrefix(r.Header.Get("Content-Type"), "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") { + + var body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody + if err := json.NewDecoder(r.Body).Decode(&body); err != nil { + sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) + return + } + request.ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = &body + } + if strings.HasPrefix(r.Header.Get("Content-Type"), "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") { + + var body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody + if err := json.NewDecoder(r.Body).Decode(&body); err != nil { + sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) + return + } + request.ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body = &body + } handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { - return sh.ssi.GetObjectMultibody(ctx, request.(GetObjectMultibodyRequestObject)) + return sh.ssi.PostPostMultibody(ctx, request.(PostPostMultibodyRequestObject)) } for _, middleware := range sh.middlewares { - handler = middleware(handler, "GetObjectMultibody") + handler = middleware(handler, "PostPostMultibody") } response, err := handler(r.Context(), w, r, request) if err != nil { sh.options.ResponseErrorHandlerFunc(w, r, err) - } else if validResponse, ok := response.(GetObjectMultibodyResponseObject); ok { - if err := validResponse.VisitGetObjectMultibodyResponse(w); err != nil { + } else if validResponse, ok := response.(PostPostMultibodyResponseObject); ok { + if err := validResponse.VisitPostPostMultibodyResponse(w); err != nil { sh.options.ResponseErrorHandlerFunc(w, r, err) } } else if response != nil { diff --git a/internal/test/issues/issue1799/client/out.gen.go b/internal/test/issues/issue1799/client/out.gen.go index 1db04e8217..10523dbeec 100644 --- a/internal/test/issues/issue1799/client/out.gen.go +++ b/internal/test/issues/issue1799/client/out.gen.go @@ -4,6 +4,7 @@ package client import ( + "bytes" "context" "encoding/json" "fmt" @@ -13,6 +14,18 @@ import ( "strings" ) +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody defines parameters for PostPostMultibody. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = string + +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body defines parameters for PostPostMultibody. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body = string + +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody defines body for PostPostMultibody for application/ld+json; profile="https://www.w3.org/ns/activitystreams" ContentType. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody = PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody + +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody defines body for PostPostMultibody for application/ld+json; profile="https://www.w3.org/ns/activitystreams2" ContentType. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody = PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body + // RequestEditorFn is the function signature for the RequestEditor callback function type RequestEditorFn func(ctx context.Context, req *http.Request) error @@ -86,11 +99,30 @@ func WithRequestEditorFn(fn RequestEditorFn) ClientOption { // The interface specification for the client above. type ClientInterface interface { + // GetGetMultibody request + GetGetMultibody(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) + // GetObject request GetObject(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) - // GetObjectMultibody request - GetObjectMultibody(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) + // PostPostMultibodyWithBody request with any body + PostPostMultibodyWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + PostPostMultibodyWithApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody(ctx context.Context, body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + PostPostMultibodyWithApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body(ctx context.Context, body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) +} + +func (c *Client) GetGetMultibody(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetGetMultibodyRequest(c.Server) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) } func (c *Client) GetObject(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { @@ -105,8 +137,20 @@ func (c *Client) GetObject(ctx context.Context, reqEditors ...RequestEditorFn) ( return c.Client.Do(req) } -func (c *Client) GetObjectMultibody(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewGetObjectMultibodyRequest(c.Server) +func (c *Client) PostPostMultibodyWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewPostPostMultibodyRequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) PostPostMultibodyWithApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody(ctx context.Context, body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewPostPostMultibodyRequestWithApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody(c.Server, body) if err != nil { return nil, err } @@ -117,6 +161,45 @@ func (c *Client) GetObjectMultibody(ctx context.Context, reqEditors ...RequestEd return c.Client.Do(req) } +func (c *Client) PostPostMultibodyWithApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body(ctx context.Context, body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewPostPostMultibodyRequestWithApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body(c.Server, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +// NewGetGetMultibodyRequest generates requests for GetGetMultibody +func NewGetGetMultibodyRequest(server string) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/get-multibody") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("GET", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + // NewGetObjectRequest generates requests for GetObject func NewGetObjectRequest(server string) (*http.Request, error) { var err error @@ -144,8 +227,30 @@ func NewGetObjectRequest(server string) (*http.Request, error) { return req, nil } -// NewGetObjectMultibodyRequest generates requests for GetObjectMultibody -func NewGetObjectMultibodyRequest(server string) (*http.Request, error) { +// NewPostPostMultibodyRequestWithApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody calls the generic PostPostMultibody builder with application/ld+json; profile="https://www.w3.org/ns/activitystreams" body +func NewPostPostMultibodyRequestWithApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody(server string, body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewPostPostMultibodyRequestWithBody(server, "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"", bodyReader) +} + +// NewPostPostMultibodyRequestWithApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body calls the generic PostPostMultibody builder with application/ld+json; profile="https://www.w3.org/ns/activitystreams2" body +func NewPostPostMultibodyRequestWithApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body(server string, body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewPostPostMultibodyRequestWithBody(server, "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"", bodyReader) +} + +// NewPostPostMultibodyRequestWithBody generates requests for PostPostMultibody with any type of body +func NewPostPostMultibodyRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -153,7 +258,7 @@ func NewGetObjectMultibodyRequest(server string) (*http.Request, error) { return nil, err } - operationPath := fmt.Sprintf("/object-multibody") + operationPath := fmt.Sprintf("/post-multibody") if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -163,11 +268,13 @@ func NewGetObjectMultibodyRequest(server string) (*http.Request, error) { return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest("POST", queryURL.String(), body) if err != nil { return nil, err } + req.Header.Add("Content-Type", contentType) + return req, nil } @@ -214,11 +321,41 @@ func WithBaseURL(baseURL string) ClientOption { // ClientWithResponsesInterface is the interface specification for the client with responses above. type ClientWithResponsesInterface interface { + // GetGetMultibodyWithResponse request + GetGetMultibodyWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetGetMultibodyResponse, error) + // GetObjectWithResponse request GetObjectWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetObjectResponse, error) - // GetObjectMultibodyWithResponse request - GetObjectMultibodyWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetObjectMultibodyResponse, error) + // PostPostMultibodyWithBodyWithResponse request with any body + PostPostMultibodyWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*PostPostMultibodyResponse, error) + + PostPostMultibodyWithApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBodyWithResponse(ctx context.Context, body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody, reqEditors ...RequestEditorFn) (*PostPostMultibodyResponse, error) + + PostPostMultibodyWithApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2BodyWithResponse(ctx context.Context, body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody, reqEditors ...RequestEditorFn) (*PostPostMultibodyResponse, error) +} + +type GetGetMultibodyResponse struct { + Body []byte + HTTPResponse *http.Response + ApplicationldJSONProfilehttpswwwW3Orgnsactivitystreams200 *string + ApplicationldJSONProfilehttpswwwW3Orgnsactivitystreams2200 *string +} + +// Status returns HTTPResponse.Status +func (r GetGetMultibodyResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r GetGetMultibodyResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 } type GetObjectResponse struct { @@ -243,7 +380,7 @@ func (r GetObjectResponse) StatusCode() int { return 0 } -type GetObjectMultibodyResponse struct { +type PostPostMultibodyResponse struct { Body []byte HTTPResponse *http.Response ApplicationldJSONProfilehttpswwwW3Orgnsactivitystreams200 *string @@ -251,7 +388,7 @@ type GetObjectMultibodyResponse struct { } // Status returns HTTPResponse.Status -func (r GetObjectMultibodyResponse) Status() string { +func (r PostPostMultibodyResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -259,13 +396,22 @@ func (r GetObjectMultibodyResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r GetObjectMultibodyResponse) StatusCode() int { +func (r PostPostMultibodyResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } +// GetGetMultibodyWithResponse request returning *GetGetMultibodyResponse +func (c *ClientWithResponses) GetGetMultibodyWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetGetMultibodyResponse, error) { + rsp, err := c.GetGetMultibody(ctx, reqEditors...) + if err != nil { + return nil, err + } + return ParseGetGetMultibodyResponse(rsp) +} + // GetObjectWithResponse request returning *GetObjectResponse func (c *ClientWithResponses) GetObjectWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetObjectResponse, error) { rsp, err := c.GetObject(ctx, reqEditors...) @@ -275,13 +421,62 @@ func (c *ClientWithResponses) GetObjectWithResponse(ctx context.Context, reqEdit return ParseGetObjectResponse(rsp) } -// GetObjectMultibodyWithResponse request returning *GetObjectMultibodyResponse -func (c *ClientWithResponses) GetObjectMultibodyWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetObjectMultibodyResponse, error) { - rsp, err := c.GetObjectMultibody(ctx, reqEditors...) +// PostPostMultibodyWithBodyWithResponse request with arbitrary body returning *PostPostMultibodyResponse +func (c *ClientWithResponses) PostPostMultibodyWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*PostPostMultibodyResponse, error) { + rsp, err := c.PostPostMultibodyWithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParsePostPostMultibodyResponse(rsp) +} + +func (c *ClientWithResponses) PostPostMultibodyWithApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBodyWithResponse(ctx context.Context, body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody, reqEditors ...RequestEditorFn) (*PostPostMultibodyResponse, error) { + rsp, err := c.PostPostMultibodyWithApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody(ctx, body, reqEditors...) if err != nil { return nil, err } - return ParseGetObjectMultibodyResponse(rsp) + return ParsePostPostMultibodyResponse(rsp) +} + +func (c *ClientWithResponses) PostPostMultibodyWithApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2BodyWithResponse(ctx context.Context, body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody, reqEditors ...RequestEditorFn) (*PostPostMultibodyResponse, error) { + rsp, err := c.PostPostMultibodyWithApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParsePostPostMultibodyResponse(rsp) +} + +// ParseGetGetMultibodyResponse parses an HTTP response from a GetGetMultibodyWithResponse call +func ParseGetGetMultibodyResponse(rsp *http.Response) (*GetGetMultibodyResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &GetGetMultibodyResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case rsp.Header.Get("Content-Type") == "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"" && rsp.StatusCode == 200: + var dest string + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.ApplicationldJSONProfilehttpswwwW3Orgnsactivitystreams200 = &dest + + case rsp.Header.Get("Content-Type") == "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"" && rsp.StatusCode == 200: + var dest string + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.ApplicationldJSONProfilehttpswwwW3Orgnsactivitystreams2200 = &dest + + } + + return response, nil } // ParseGetObjectResponse parses an HTTP response from a GetObjectWithResponse call @@ -310,15 +505,15 @@ func ParseGetObjectResponse(rsp *http.Response) (*GetObjectResponse, error) { return response, nil } -// ParseGetObjectMultibodyResponse parses an HTTP response from a GetObjectMultibodyWithResponse call -func ParseGetObjectMultibodyResponse(rsp *http.Response) (*GetObjectMultibodyResponse, error) { +// ParsePostPostMultibodyResponse parses an HTTP response from a PostPostMultibodyWithResponse call +func ParsePostPostMultibodyResponse(rsp *http.Response) (*PostPostMultibodyResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &GetObjectMultibodyResponse{ + response := &PostPostMultibodyResponse{ Body: bodyBytes, HTTPResponse: rsp, } diff --git a/internal/test/issues/issue1799/echo/out.gen.go b/internal/test/issues/issue1799/echo/out.gen.go index 9fdef5f490..6f2b77f127 100644 --- a/internal/test/issues/issue1799/echo/out.gen.go +++ b/internal/test/issues/issue1799/echo/out.gen.go @@ -8,6 +8,7 @@ import ( "encoding/json" "fmt" "net/http" + "strings" "github.com/labstack/echo/v4" strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" @@ -16,11 +17,14 @@ import ( // ServerInterface represents all server handlers. type ServerInterface interface { + // (GET /get-multibody) + GetGetMultibody(ctx echo.Context) error + // (GET /object) GetObject(ctx echo.Context) error - // (GET /object-multibody) - GetObjectMultibody(ctx echo.Context) error + // (POST /post-multibody) + PostPostMultibody(ctx echo.Context) error } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -28,6 +32,15 @@ type ServerInterfaceWrapper struct { Handler ServerInterface } +// GetGetMultibody converts echo context to params. +func (w *ServerInterfaceWrapper) GetGetMultibody(ctx echo.Context) error { + var err error + + // Invoke the callback with all the unmarshaled arguments + err = w.Handler.GetGetMultibody(ctx) + return err +} + // GetObject converts echo context to params. func (w *ServerInterfaceWrapper) GetObject(ctx echo.Context) error { var err error @@ -37,12 +50,12 @@ func (w *ServerInterfaceWrapper) GetObject(ctx echo.Context) error { return err } -// GetObjectMultibody converts echo context to params. -func (w *ServerInterfaceWrapper) GetObjectMultibody(ctx echo.Context) error { +// PostPostMultibody converts echo context to params. +func (w *ServerInterfaceWrapper) PostPostMultibody(ctx echo.Context) error { var err error // Invoke the callback with all the unmarshaled arguments - err = w.Handler.GetObjectMultibody(ctx) + err = w.Handler.PostPostMultibody(ctx) return err } @@ -74,9 +87,35 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL Handler: si, } + router.GET(baseURL+"/get-multibody", wrapper.GetGetMultibody) router.GET(baseURL+"/object", wrapper.GetObject) - router.GET(baseURL+"/object-multibody", wrapper.GetObjectMultibody) + router.POST(baseURL+"/post-multibody", wrapper.PostPostMultibody) + +} +type GetGetMultibodyRequestObject struct { +} + +type GetGetMultibodyResponseObject interface { + VisitGetGetMultibodyResponse(w http.ResponseWriter) error +} + +type GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string + +func (response GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetGetMultibodyResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) +} + +type GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string + +func (response GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitGetGetMultibodyResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) } type GetObjectRequestObject struct { @@ -95,25 +134,27 @@ func (response GetObject200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivityst return json.NewEncoder(w).Encode(response) } -type GetObjectMultibodyRequestObject struct { +type PostPostMultibodyRequestObject struct { + ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody *PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody + ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body *PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody } -type GetObjectMultibodyResponseObject interface { - VisitGetObjectMultibodyResponse(w http.ResponseWriter) error +type PostPostMultibodyResponseObject interface { + VisitPostPostMultibodyResponse(w http.ResponseWriter) error } -type GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string +type PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string -func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetObjectMultibodyResponse(w http.ResponseWriter) error { +func (response PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitPostPostMultibodyResponse(w http.ResponseWriter) error { w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") w.WriteHeader(200) return json.NewEncoder(w).Encode(response) } -type GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string +type PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string -func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitGetObjectMultibodyResponse(w http.ResponseWriter) error { +func (response PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitPostPostMultibodyResponse(w http.ResponseWriter) error { w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") w.WriteHeader(200) @@ -123,11 +164,14 @@ func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsa // StrictServerInterface represents all server handlers. type StrictServerInterface interface { + // (GET /get-multibody) + GetGetMultibody(ctx context.Context, request GetGetMultibodyRequestObject) (GetGetMultibodyResponseObject, error) + // (GET /object) GetObject(ctx context.Context, request GetObjectRequestObject) (GetObjectResponseObject, error) - // (GET /object-multibody) - GetObjectMultibody(ctx context.Context, request GetObjectMultibodyRequestObject) (GetObjectMultibodyResponseObject, error) + // (POST /post-multibody) + PostPostMultibody(ctx context.Context, request PostPostMultibodyRequestObject) (PostPostMultibodyResponseObject, error) } type StrictHandlerFunc = strictecho.StrictEchoHandlerFunc @@ -142,6 +186,29 @@ type strictHandler struct { middlewares []StrictMiddlewareFunc } +// GetGetMultibody operation middleware +func (sh *strictHandler) GetGetMultibody(ctx echo.Context) error { + var request GetGetMultibodyRequestObject + + handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + return sh.ssi.GetGetMultibody(ctx.Request().Context(), request.(GetGetMultibodyRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "GetGetMultibody") + } + + response, err := handler(ctx, request) + + if err != nil { + return err + } else if validResponse, ok := response.(GetGetMultibodyResponseObject); ok { + return validResponse.VisitGetGetMultibodyResponse(ctx.Response()) + } else if response != nil { + return fmt.Errorf("unexpected response type: %T", response) + } + return nil +} + // GetObject operation middleware func (sh *strictHandler) GetObject(ctx echo.Context) error { var request GetObjectRequestObject @@ -165,23 +232,38 @@ func (sh *strictHandler) GetObject(ctx echo.Context) error { return nil } -// GetObjectMultibody operation middleware -func (sh *strictHandler) GetObjectMultibody(ctx echo.Context) error { - var request GetObjectMultibodyRequestObject +// PostPostMultibody operation middleware +func (sh *strictHandler) PostPostMultibody(ctx echo.Context) error { + var request PostPostMultibodyRequestObject + + if strings.HasPrefix(ctx.Request().Header.Get("Content-Type"), "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") { + var body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody + if err := ctx.Bind(&body); err != nil { + return err + } + request.ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = &body + } + if strings.HasPrefix(ctx.Request().Header.Get("Content-Type"), "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") { + var body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody + if err := ctx.Bind(&body); err != nil { + return err + } + request.ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body = &body + } handler := func(ctx echo.Context, request interface{}) (interface{}, error) { - return sh.ssi.GetObjectMultibody(ctx.Request().Context(), request.(GetObjectMultibodyRequestObject)) + return sh.ssi.PostPostMultibody(ctx.Request().Context(), request.(PostPostMultibodyRequestObject)) } for _, middleware := range sh.middlewares { - handler = middleware(handler, "GetObjectMultibody") + handler = middleware(handler, "PostPostMultibody") } response, err := handler(ctx, request) if err != nil { return err - } else if validResponse, ok := response.(GetObjectMultibodyResponseObject); ok { - return validResponse.VisitGetObjectMultibodyResponse(ctx.Response()) + } else if validResponse, ok := response.(PostPostMultibodyResponseObject); ok { + return validResponse.VisitPostPostMultibodyResponse(ctx.Response()) } else if response != nil { return fmt.Errorf("unexpected response type: %T", response) } diff --git a/internal/test/issues/issue1799/fiber/out.gen.go b/internal/test/issues/issue1799/fiber/out.gen.go index 7241dbe275..97ccdad0d5 100644 --- a/internal/test/issues/issue1799/fiber/out.gen.go +++ b/internal/test/issues/issue1799/fiber/out.gen.go @@ -6,6 +6,7 @@ package fiber import ( "context" "fmt" + "strings" "github.com/gofiber/fiber/v2" ) @@ -13,11 +14,14 @@ import ( // ServerInterface represents all server handlers. type ServerInterface interface { + // (GET /get-multibody) + GetGetMultibody(c *fiber.Ctx) error + // (GET /object) GetObject(c *fiber.Ctx) error - // (GET /object-multibody) - GetObjectMultibody(c *fiber.Ctx) error + // (POST /post-multibody) + PostPostMultibody(c *fiber.Ctx) error } // ServerInterfaceWrapper converts contexts to parameters. @@ -27,16 +31,22 @@ type ServerInterfaceWrapper struct { type MiddlewareFunc fiber.Handler +// GetGetMultibody operation middleware +func (siw *ServerInterfaceWrapper) GetGetMultibody(c *fiber.Ctx) error { + + return siw.Handler.GetGetMultibody(c) +} + // GetObject operation middleware func (siw *ServerInterfaceWrapper) GetObject(c *fiber.Ctx) error { return siw.Handler.GetObject(c) } -// GetObjectMultibody operation middleware -func (siw *ServerInterfaceWrapper) GetObjectMultibody(c *fiber.Ctx) error { +// PostPostMultibody operation middleware +func (siw *ServerInterfaceWrapper) PostPostMultibody(c *fiber.Ctx) error { - return siw.Handler.GetObjectMultibody(c) + return siw.Handler.PostPostMultibody(c) } // FiberServerOptions provides options for the Fiber server. @@ -60,10 +70,37 @@ func RegisterHandlersWithOptions(router fiber.Router, si ServerInterface, option router.Use(fiber.Handler(m)) } + router.Get(options.BaseURL+"/get-multibody", wrapper.GetGetMultibody) + router.Get(options.BaseURL+"/object", wrapper.GetObject) - router.Get(options.BaseURL+"/object-multibody", wrapper.GetObjectMultibody) + router.Post(options.BaseURL+"/post-multibody", wrapper.PostPostMultibody) + +} + +type GetGetMultibodyRequestObject struct { +} + +type GetGetMultibodyResponseObject interface { + VisitGetGetMultibodyResponse(ctx *fiber.Ctx) error +} + +type GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string + +func (response GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetGetMultibodyResponse(ctx *fiber.Ctx) error { + ctx.Response().Header.Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") + ctx.Status(200) + return ctx.JSON(&response) +} + +type GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string + +func (response GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitGetGetMultibodyResponse(ctx *fiber.Ctx) error { + ctx.Response().Header.Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") + ctx.Status(200) + + return ctx.JSON(&response) } type GetObjectRequestObject struct { @@ -82,25 +119,27 @@ func (response GetObject200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivityst return ctx.JSON(&response) } -type GetObjectMultibodyRequestObject struct { +type PostPostMultibodyRequestObject struct { + ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody *PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody + ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body *PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody } -type GetObjectMultibodyResponseObject interface { - VisitGetObjectMultibodyResponse(ctx *fiber.Ctx) error +type PostPostMultibodyResponseObject interface { + VisitPostPostMultibodyResponse(ctx *fiber.Ctx) error } -type GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string +type PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string -func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetObjectMultibodyResponse(ctx *fiber.Ctx) error { +func (response PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitPostPostMultibodyResponse(ctx *fiber.Ctx) error { ctx.Response().Header.Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") ctx.Status(200) return ctx.JSON(&response) } -type GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string +type PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string -func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitGetObjectMultibodyResponse(ctx *fiber.Ctx) error { +func (response PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitPostPostMultibodyResponse(ctx *fiber.Ctx) error { ctx.Response().Header.Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") ctx.Status(200) @@ -110,11 +149,14 @@ func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsa // StrictServerInterface represents all server handlers. type StrictServerInterface interface { + // (GET /get-multibody) + GetGetMultibody(ctx context.Context, request GetGetMultibodyRequestObject) (GetGetMultibodyResponseObject, error) + // (GET /object) GetObject(ctx context.Context, request GetObjectRequestObject) (GetObjectResponseObject, error) - // (GET /object-multibody) - GetObjectMultibody(ctx context.Context, request GetObjectMultibodyRequestObject) (GetObjectMultibodyResponseObject, error) + // (POST /post-multibody) + PostPostMultibody(ctx context.Context, request PostPostMultibodyRequestObject) (PostPostMultibodyResponseObject, error) } type StrictHandlerFunc func(ctx *fiber.Ctx, args interface{}) (interface{}, error) @@ -130,6 +172,31 @@ type strictHandler struct { middlewares []StrictMiddlewareFunc } +// GetGetMultibody operation middleware +func (sh *strictHandler) GetGetMultibody(ctx *fiber.Ctx) error { + var request GetGetMultibodyRequestObject + + handler := func(ctx *fiber.Ctx, request interface{}) (interface{}, error) { + return sh.ssi.GetGetMultibody(ctx.UserContext(), request.(GetGetMultibodyRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "GetGetMultibody") + } + + response, err := handler(ctx, request) + + if err != nil { + return fiber.NewError(fiber.StatusBadRequest, err.Error()) + } else if validResponse, ok := response.(GetGetMultibodyResponseObject); ok { + if err := validResponse.VisitGetGetMultibodyResponse(ctx); err != nil { + return fiber.NewError(fiber.StatusBadRequest, err.Error()) + } + } else if response != nil { + return fmt.Errorf("unexpected response type: %T", response) + } + return nil +} + // GetObject operation middleware func (sh *strictHandler) GetObject(ctx *fiber.Ctx) error { var request GetObjectRequestObject @@ -155,23 +222,40 @@ func (sh *strictHandler) GetObject(ctx *fiber.Ctx) error { return nil } -// GetObjectMultibody operation middleware -func (sh *strictHandler) GetObjectMultibody(ctx *fiber.Ctx) error { - var request GetObjectMultibodyRequestObject +// PostPostMultibody operation middleware +func (sh *strictHandler) PostPostMultibody(ctx *fiber.Ctx) error { + var request PostPostMultibodyRequestObject + + if strings.HasPrefix(string(ctx.Request().Header.ContentType()), "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") { + + var body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody + if err := ctx.BodyParser(&body); err != nil { + return fiber.NewError(fiber.StatusBadRequest, err.Error()) + } + request.ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = &body + } + if strings.HasPrefix(string(ctx.Request().Header.ContentType()), "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") { + + var body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody + if err := ctx.BodyParser(&body); err != nil { + return fiber.NewError(fiber.StatusBadRequest, err.Error()) + } + request.ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body = &body + } handler := func(ctx *fiber.Ctx, request interface{}) (interface{}, error) { - return sh.ssi.GetObjectMultibody(ctx.UserContext(), request.(GetObjectMultibodyRequestObject)) + return sh.ssi.PostPostMultibody(ctx.UserContext(), request.(PostPostMultibodyRequestObject)) } for _, middleware := range sh.middlewares { - handler = middleware(handler, "GetObjectMultibody") + handler = middleware(handler, "PostPostMultibody") } response, err := handler(ctx, request) if err != nil { return fiber.NewError(fiber.StatusBadRequest, err.Error()) - } else if validResponse, ok := response.(GetObjectMultibodyResponseObject); ok { - if err := validResponse.VisitGetObjectMultibodyResponse(ctx); err != nil { + } else if validResponse, ok := response.(PostPostMultibodyResponseObject); ok { + if err := validResponse.VisitPostPostMultibodyResponse(ctx); err != nil { return fiber.NewError(fiber.StatusBadRequest, err.Error()) } } else if response != nil { diff --git a/internal/test/issues/issue1799/gin/out.gen.go b/internal/test/issues/issue1799/gin/out.gen.go index b334ff0d18..eb899af985 100644 --- a/internal/test/issues/issue1799/gin/out.gen.go +++ b/internal/test/issues/issue1799/gin/out.gen.go @@ -8,6 +8,7 @@ import ( "encoding/json" "fmt" "net/http" + "strings" "github.com/gin-gonic/gin" strictgin "github.com/oapi-codegen/runtime/strictmiddleware/gin" @@ -16,11 +17,14 @@ import ( // ServerInterface represents all server handlers. type ServerInterface interface { + // (GET /get-multibody) + GetGetMultibody(c *gin.Context) + // (GET /object) GetObject(c *gin.Context) - // (GET /object-multibody) - GetObjectMultibody(c *gin.Context) + // (POST /post-multibody) + PostPostMultibody(c *gin.Context) } // ServerInterfaceWrapper converts contexts to parameters. @@ -32,6 +36,19 @@ type ServerInterfaceWrapper struct { type MiddlewareFunc func(c *gin.Context) +// GetGetMultibody operation middleware +func (siw *ServerInterfaceWrapper) GetGetMultibody(c *gin.Context) { + + for _, middleware := range siw.HandlerMiddlewares { + middleware(c) + if c.IsAborted() { + return + } + } + + siw.Handler.GetGetMultibody(c) +} + // GetObject operation middleware func (siw *ServerInterfaceWrapper) GetObject(c *gin.Context) { @@ -45,8 +62,8 @@ func (siw *ServerInterfaceWrapper) GetObject(c *gin.Context) { siw.Handler.GetObject(c) } -// GetObjectMultibody operation middleware -func (siw *ServerInterfaceWrapper) GetObjectMultibody(c *gin.Context) { +// PostPostMultibody operation middleware +func (siw *ServerInterfaceWrapper) PostPostMultibody(c *gin.Context) { for _, middleware := range siw.HandlerMiddlewares { middleware(c) @@ -55,7 +72,7 @@ func (siw *ServerInterfaceWrapper) GetObjectMultibody(c *gin.Context) { } } - siw.Handler.GetObjectMultibody(c) + siw.Handler.PostPostMultibody(c) } // GinServerOptions provides options for the Gin server. @@ -85,8 +102,34 @@ func RegisterHandlersWithOptions(router gin.IRouter, si ServerInterface, options ErrorHandler: errorHandler, } + router.GET(options.BaseURL+"/get-multibody", wrapper.GetGetMultibody) router.GET(options.BaseURL+"/object", wrapper.GetObject) - router.GET(options.BaseURL+"/object-multibody", wrapper.GetObjectMultibody) + router.POST(options.BaseURL+"/post-multibody", wrapper.PostPostMultibody) +} + +type GetGetMultibodyRequestObject struct { +} + +type GetGetMultibodyResponseObject interface { + VisitGetGetMultibodyResponse(w http.ResponseWriter) error +} + +type GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string + +func (response GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetGetMultibodyResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) +} + +type GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string + +func (response GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitGetGetMultibodyResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) } type GetObjectRequestObject struct { @@ -105,25 +148,27 @@ func (response GetObject200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivityst return json.NewEncoder(w).Encode(response) } -type GetObjectMultibodyRequestObject struct { +type PostPostMultibodyRequestObject struct { + ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody *PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody + ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body *PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody } -type GetObjectMultibodyResponseObject interface { - VisitGetObjectMultibodyResponse(w http.ResponseWriter) error +type PostPostMultibodyResponseObject interface { + VisitPostPostMultibodyResponse(w http.ResponseWriter) error } -type GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string +type PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string -func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetObjectMultibodyResponse(w http.ResponseWriter) error { +func (response PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitPostPostMultibodyResponse(w http.ResponseWriter) error { w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") w.WriteHeader(200) return json.NewEncoder(w).Encode(response) } -type GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string +type PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string -func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitGetObjectMultibodyResponse(w http.ResponseWriter) error { +func (response PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitPostPostMultibodyResponse(w http.ResponseWriter) error { w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") w.WriteHeader(200) @@ -133,11 +178,14 @@ func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsa // StrictServerInterface represents all server handlers. type StrictServerInterface interface { + // (GET /get-multibody) + GetGetMultibody(ctx context.Context, request GetGetMultibodyRequestObject) (GetGetMultibodyResponseObject, error) + // (GET /object) GetObject(ctx context.Context, request GetObjectRequestObject) (GetObjectResponseObject, error) - // (GET /object-multibody) - GetObjectMultibody(ctx context.Context, request GetObjectMultibodyRequestObject) (GetObjectMultibodyResponseObject, error) + // (POST /post-multibody) + PostPostMultibody(ctx context.Context, request PostPostMultibodyRequestObject) (PostPostMultibodyResponseObject, error) } type StrictHandlerFunc = strictgin.StrictGinHandlerFunc @@ -152,6 +200,31 @@ type strictHandler struct { middlewares []StrictMiddlewareFunc } +// GetGetMultibody operation middleware +func (sh *strictHandler) GetGetMultibody(ctx *gin.Context) { + var request GetGetMultibodyRequestObject + + handler := func(ctx *gin.Context, request interface{}) (interface{}, error) { + return sh.ssi.GetGetMultibody(ctx, request.(GetGetMultibodyRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "GetGetMultibody") + } + + response, err := handler(ctx, request) + + if err != nil { + ctx.Error(err) + ctx.Status(http.StatusInternalServerError) + } else if validResponse, ok := response.(GetGetMultibodyResponseObject); ok { + if err := validResponse.VisitGetGetMultibodyResponse(ctx.Writer); err != nil { + ctx.Error(err) + } + } else if response != nil { + ctx.Error(fmt.Errorf("unexpected response type: %T", response)) + } +} + // GetObject operation middleware func (sh *strictHandler) GetObject(ctx *gin.Context) { var request GetObjectRequestObject @@ -177,15 +250,36 @@ func (sh *strictHandler) GetObject(ctx *gin.Context) { } } -// GetObjectMultibody operation middleware -func (sh *strictHandler) GetObjectMultibody(ctx *gin.Context) { - var request GetObjectMultibodyRequestObject +// PostPostMultibody operation middleware +func (sh *strictHandler) PostPostMultibody(ctx *gin.Context) { + var request PostPostMultibodyRequestObject + + if strings.HasPrefix(ctx.GetHeader("Content-Type"), "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") { + + var body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody + if err := ctx.ShouldBindJSON(&body); err != nil { + ctx.Status(http.StatusBadRequest) + ctx.Error(err) + return + } + request.ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = &body + } + if strings.HasPrefix(ctx.GetHeader("Content-Type"), "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") { + + var body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody + if err := ctx.ShouldBindJSON(&body); err != nil { + ctx.Status(http.StatusBadRequest) + ctx.Error(err) + return + } + request.ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body = &body + } handler := func(ctx *gin.Context, request interface{}) (interface{}, error) { - return sh.ssi.GetObjectMultibody(ctx, request.(GetObjectMultibodyRequestObject)) + return sh.ssi.PostPostMultibody(ctx, request.(PostPostMultibodyRequestObject)) } for _, middleware := range sh.middlewares { - handler = middleware(handler, "GetObjectMultibody") + handler = middleware(handler, "PostPostMultibody") } response, err := handler(ctx, request) @@ -193,8 +287,8 @@ func (sh *strictHandler) GetObjectMultibody(ctx *gin.Context) { if err != nil { ctx.Error(err) ctx.Status(http.StatusInternalServerError) - } else if validResponse, ok := response.(GetObjectMultibodyResponseObject); ok { - if err := validResponse.VisitGetObjectMultibodyResponse(ctx.Writer); err != nil { + } else if validResponse, ok := response.(PostPostMultibodyResponseObject); ok { + if err := validResponse.VisitPostPostMultibodyResponse(ctx.Writer); err != nil { ctx.Error(err) } } else if response != nil { diff --git a/internal/test/issues/issue1799/gorilla/out.gen.go b/internal/test/issues/issue1799/gorilla/out.gen.go index 85951e07d1..884a757369 100644 --- a/internal/test/issues/issue1799/gorilla/out.gen.go +++ b/internal/test/issues/issue1799/gorilla/out.gen.go @@ -8,6 +8,7 @@ import ( "encoding/json" "fmt" "net/http" + "strings" "github.com/gorilla/mux" strictnethttp "github.com/oapi-codegen/runtime/strictmiddleware/nethttp" @@ -16,11 +17,14 @@ import ( // ServerInterface represents all server handlers. type ServerInterface interface { + // (GET /get-multibody) + GetGetMultibody(w http.ResponseWriter, r *http.Request) + // (GET /object) GetObject(w http.ResponseWriter, r *http.Request) - // (GET /object-multibody) - GetObjectMultibody(w http.ResponseWriter, r *http.Request) + // (POST /post-multibody) + PostPostMultibody(w http.ResponseWriter, r *http.Request) } // ServerInterfaceWrapper converts contexts to parameters. @@ -32,6 +36,20 @@ type ServerInterfaceWrapper struct { type MiddlewareFunc func(http.Handler) http.Handler +// GetGetMultibody operation middleware +func (siw *ServerInterfaceWrapper) GetGetMultibody(w http.ResponseWriter, r *http.Request) { + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.GetGetMultibody(w, r) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + // GetObject operation middleware func (siw *ServerInterfaceWrapper) GetObject(w http.ResponseWriter, r *http.Request) { @@ -46,11 +64,11 @@ func (siw *ServerInterfaceWrapper) GetObject(w http.ResponseWriter, r *http.Requ handler.ServeHTTP(w, r) } -// GetObjectMultibody operation middleware -func (siw *ServerInterfaceWrapper) GetObjectMultibody(w http.ResponseWriter, r *http.Request) { +// PostPostMultibody operation middleware +func (siw *ServerInterfaceWrapper) PostPostMultibody(w http.ResponseWriter, r *http.Request) { handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.GetObjectMultibody(w, r) + siw.Handler.PostPostMultibody(w, r) })) for _, middleware := range siw.HandlerMiddlewares { @@ -173,13 +191,40 @@ func HandlerWithOptions(si ServerInterface, options GorillaServerOptions) http.H ErrorHandlerFunc: options.ErrorHandlerFunc, } + r.HandleFunc(options.BaseURL+"/get-multibody", wrapper.GetGetMultibody).Methods("GET") + r.HandleFunc(options.BaseURL+"/object", wrapper.GetObject).Methods("GET") - r.HandleFunc(options.BaseURL+"/object-multibody", wrapper.GetObjectMultibody).Methods("GET") + r.HandleFunc(options.BaseURL+"/post-multibody", wrapper.PostPostMultibody).Methods("POST") return r } +type GetGetMultibodyRequestObject struct { +} + +type GetGetMultibodyResponseObject interface { + VisitGetGetMultibodyResponse(w http.ResponseWriter) error +} + +type GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string + +func (response GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetGetMultibodyResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) +} + +type GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string + +func (response GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitGetGetMultibodyResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) +} + type GetObjectRequestObject struct { } @@ -196,25 +241,27 @@ func (response GetObject200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivityst return json.NewEncoder(w).Encode(response) } -type GetObjectMultibodyRequestObject struct { +type PostPostMultibodyRequestObject struct { + ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody *PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody + ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body *PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody } -type GetObjectMultibodyResponseObject interface { - VisitGetObjectMultibodyResponse(w http.ResponseWriter) error +type PostPostMultibodyResponseObject interface { + VisitPostPostMultibodyResponse(w http.ResponseWriter) error } -type GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string +type PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string -func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetObjectMultibodyResponse(w http.ResponseWriter) error { +func (response PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitPostPostMultibodyResponse(w http.ResponseWriter) error { w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") w.WriteHeader(200) return json.NewEncoder(w).Encode(response) } -type GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string +type PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string -func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitGetObjectMultibodyResponse(w http.ResponseWriter) error { +func (response PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitPostPostMultibodyResponse(w http.ResponseWriter) error { w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") w.WriteHeader(200) @@ -224,11 +271,14 @@ func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsa // StrictServerInterface represents all server handlers. type StrictServerInterface interface { + // (GET /get-multibody) + GetGetMultibody(ctx context.Context, request GetGetMultibodyRequestObject) (GetGetMultibodyResponseObject, error) + // (GET /object) GetObject(ctx context.Context, request GetObjectRequestObject) (GetObjectResponseObject, error) - // (GET /object-multibody) - GetObjectMultibody(ctx context.Context, request GetObjectMultibodyRequestObject) (GetObjectMultibodyResponseObject, error) + // (POST /post-multibody) + PostPostMultibody(ctx context.Context, request PostPostMultibodyRequestObject) (PostPostMultibodyResponseObject, error) } type StrictHandlerFunc = strictnethttp.StrictHTTPHandlerFunc @@ -260,6 +310,30 @@ type strictHandler struct { options StrictHTTPServerOptions } +// GetGetMultibody operation middleware +func (sh *strictHandler) GetGetMultibody(w http.ResponseWriter, r *http.Request) { + var request GetGetMultibodyRequestObject + + handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { + return sh.ssi.GetGetMultibody(ctx, request.(GetGetMultibodyRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "GetGetMultibody") + } + + response, err := handler(r.Context(), w, r, request) + + if err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } else if validResponse, ok := response.(GetGetMultibodyResponseObject); ok { + if err := validResponse.VisitGetGetMultibodyResponse(w); err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } + } else if response != nil { + sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) + } +} + // GetObject operation middleware func (sh *strictHandler) GetObject(w http.ResponseWriter, r *http.Request) { var request GetObjectRequestObject @@ -284,23 +358,42 @@ func (sh *strictHandler) GetObject(w http.ResponseWriter, r *http.Request) { } } -// GetObjectMultibody operation middleware -func (sh *strictHandler) GetObjectMultibody(w http.ResponseWriter, r *http.Request) { - var request GetObjectMultibodyRequestObject +// PostPostMultibody operation middleware +func (sh *strictHandler) PostPostMultibody(w http.ResponseWriter, r *http.Request) { + var request PostPostMultibodyRequestObject + + if strings.HasPrefix(r.Header.Get("Content-Type"), "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") { + + var body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody + if err := json.NewDecoder(r.Body).Decode(&body); err != nil { + sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) + return + } + request.ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = &body + } + if strings.HasPrefix(r.Header.Get("Content-Type"), "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") { + + var body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody + if err := json.NewDecoder(r.Body).Decode(&body); err != nil { + sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) + return + } + request.ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body = &body + } handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { - return sh.ssi.GetObjectMultibody(ctx, request.(GetObjectMultibodyRequestObject)) + return sh.ssi.PostPostMultibody(ctx, request.(PostPostMultibodyRequestObject)) } for _, middleware := range sh.middlewares { - handler = middleware(handler, "GetObjectMultibody") + handler = middleware(handler, "PostPostMultibody") } response, err := handler(r.Context(), w, r, request) if err != nil { sh.options.ResponseErrorHandlerFunc(w, r, err) - } else if validResponse, ok := response.(GetObjectMultibodyResponseObject); ok { - if err := validResponse.VisitGetObjectMultibodyResponse(w); err != nil { + } else if validResponse, ok := response.(PostPostMultibodyResponseObject); ok { + if err := validResponse.VisitPostPostMultibodyResponse(w); err != nil { sh.options.ResponseErrorHandlerFunc(w, r, err) } } else if response != nil { diff --git a/internal/test/issues/issue1799/iris/out.gen.go b/internal/test/issues/issue1799/iris/out.gen.go index 54db83c21a..66e2b1a360 100644 --- a/internal/test/issues/issue1799/iris/out.gen.go +++ b/internal/test/issues/issue1799/iris/out.gen.go @@ -6,6 +6,7 @@ package iris import ( "context" "net/http" + "strings" "github.com/kataras/iris/v12" strictiris "github.com/oapi-codegen/runtime/strictmiddleware/iris" @@ -14,11 +15,14 @@ import ( // ServerInterface represents all server handlers. type ServerInterface interface { + // (GET /get-multibody) + GetGetMultibody(ctx iris.Context) + // (GET /object) GetObject(ctx iris.Context) - // (GET /object-multibody) - GetObjectMultibody(ctx iris.Context) + // (POST /post-multibody) + PostPostMultibody(ctx iris.Context) } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -28,6 +32,13 @@ type ServerInterfaceWrapper struct { type MiddlewareFunc iris.Handler +// GetGetMultibody converts iris context to params. +func (w *ServerInterfaceWrapper) GetGetMultibody(ctx iris.Context) { + + // Invoke the callback with all the unmarshaled arguments + w.Handler.GetGetMultibody(ctx) +} + // GetObject converts iris context to params. func (w *ServerInterfaceWrapper) GetObject(ctx iris.Context) { @@ -35,11 +46,11 @@ func (w *ServerInterfaceWrapper) GetObject(ctx iris.Context) { w.Handler.GetObject(ctx) } -// GetObjectMultibody converts iris context to params. -func (w *ServerInterfaceWrapper) GetObjectMultibody(ctx iris.Context) { +// PostPostMultibody converts iris context to params. +func (w *ServerInterfaceWrapper) PostPostMultibody(ctx iris.Context) { // Invoke the callback with all the unmarshaled arguments - w.Handler.GetObjectMultibody(ctx) + w.Handler.PostPostMultibody(ctx) } // IrisServerOption is the option for iris server @@ -60,12 +71,38 @@ func RegisterHandlersWithOptions(router *iris.Application, si ServerInterface, o Handler: si, } + router.Get(options.BaseURL+"/get-multibody", wrapper.GetGetMultibody) router.Get(options.BaseURL+"/object", wrapper.GetObject) - router.Get(options.BaseURL+"/object-multibody", wrapper.GetObjectMultibody) + router.Post(options.BaseURL+"/post-multibody", wrapper.PostPostMultibody) router.Build() } +type GetGetMultibodyRequestObject struct { +} + +type GetGetMultibodyResponseObject interface { + VisitGetGetMultibodyResponse(ctx iris.Context) error +} + +type GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string + +func (response GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetGetMultibodyResponse(ctx iris.Context) error { + ctx.ResponseWriter().Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") + ctx.StatusCode(200) + + return ctx.JSON(&response) +} + +type GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string + +func (response GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitGetGetMultibodyResponse(ctx iris.Context) error { + ctx.ResponseWriter().Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") + ctx.StatusCode(200) + + return ctx.JSON(&response) +} + type GetObjectRequestObject struct { } @@ -82,25 +119,27 @@ func (response GetObject200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivityst return ctx.JSON(&response) } -type GetObjectMultibodyRequestObject struct { +type PostPostMultibodyRequestObject struct { + ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody *PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody + ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body *PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody } -type GetObjectMultibodyResponseObject interface { - VisitGetObjectMultibodyResponse(ctx iris.Context) error +type PostPostMultibodyResponseObject interface { + VisitPostPostMultibodyResponse(ctx iris.Context) error } -type GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string +type PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string -func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetObjectMultibodyResponse(ctx iris.Context) error { +func (response PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitPostPostMultibodyResponse(ctx iris.Context) error { ctx.ResponseWriter().Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") ctx.StatusCode(200) return ctx.JSON(&response) } -type GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string +type PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string -func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitGetObjectMultibodyResponse(ctx iris.Context) error { +func (response PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitPostPostMultibodyResponse(ctx iris.Context) error { ctx.ResponseWriter().Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") ctx.StatusCode(200) @@ -110,11 +149,14 @@ func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsa // StrictServerInterface represents all server handlers. type StrictServerInterface interface { + // (GET /get-multibody) + GetGetMultibody(ctx context.Context, request GetGetMultibodyRequestObject) (GetGetMultibodyResponseObject, error) + // (GET /object) GetObject(ctx context.Context, request GetObjectRequestObject) (GetObjectResponseObject, error) - // (GET /object-multibody) - GetObjectMultibody(ctx context.Context, request GetObjectMultibodyRequestObject) (GetObjectMultibodyResponseObject, error) + // (POST /post-multibody) + PostPostMultibody(ctx context.Context, request PostPostMultibodyRequestObject) (PostPostMultibodyResponseObject, error) } type StrictHandlerFunc = strictiris.StrictIrisHandlerFunc @@ -129,6 +171,33 @@ type strictHandler struct { middlewares []StrictMiddlewareFunc } +// GetGetMultibody operation middleware +func (sh *strictHandler) GetGetMultibody(ctx iris.Context) { + var request GetGetMultibodyRequestObject + + handler := func(ctx iris.Context, request interface{}) (interface{}, error) { + return sh.ssi.GetGetMultibody(ctx, request.(GetGetMultibodyRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "GetGetMultibody") + } + + response, err := handler(ctx, request) + + if err != nil { + ctx.StopWithError(http.StatusBadRequest, err) + return + } else if validResponse, ok := response.(GetGetMultibodyResponseObject); ok { + if err := validResponse.VisitGetGetMultibodyResponse(ctx); err != nil { + ctx.StopWithError(http.StatusBadRequest, err) + return + } + } else if response != nil { + ctx.Writef("Unexpected response type: %T", response) + return + } +} + // GetObject operation middleware func (sh *strictHandler) GetObject(ctx iris.Context) { var request GetObjectRequestObject @@ -156,15 +225,34 @@ func (sh *strictHandler) GetObject(ctx iris.Context) { } } -// GetObjectMultibody operation middleware -func (sh *strictHandler) GetObjectMultibody(ctx iris.Context) { - var request GetObjectMultibodyRequestObject +// PostPostMultibody operation middleware +func (sh *strictHandler) PostPostMultibody(ctx iris.Context) { + var request PostPostMultibodyRequestObject + + if strings.HasPrefix(ctx.GetHeader("Content-Type"), "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") { + + var body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody + if err := ctx.ReadJSON(&body); err != nil { + ctx.StopWithError(http.StatusBadRequest, err) + return + } + request.ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = &body + } + if strings.HasPrefix(ctx.GetHeader("Content-Type"), "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") { + + var body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody + if err := ctx.ReadJSON(&body); err != nil { + ctx.StopWithError(http.StatusBadRequest, err) + return + } + request.ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body = &body + } handler := func(ctx iris.Context, request interface{}) (interface{}, error) { - return sh.ssi.GetObjectMultibody(ctx, request.(GetObjectMultibodyRequestObject)) + return sh.ssi.PostPostMultibody(ctx, request.(PostPostMultibodyRequestObject)) } for _, middleware := range sh.middlewares { - handler = middleware(handler, "GetObjectMultibody") + handler = middleware(handler, "PostPostMultibody") } response, err := handler(ctx, request) @@ -172,8 +260,8 @@ func (sh *strictHandler) GetObjectMultibody(ctx iris.Context) { if err != nil { ctx.StopWithError(http.StatusBadRequest, err) return - } else if validResponse, ok := response.(GetObjectMultibodyResponseObject); ok { - if err := validResponse.VisitGetObjectMultibodyResponse(ctx); err != nil { + } else if validResponse, ok := response.(PostPostMultibodyResponseObject); ok { + if err := validResponse.VisitPostPostMultibodyResponse(ctx); err != nil { ctx.StopWithError(http.StatusBadRequest, err) return } diff --git a/internal/test/issues/issue1799/spec.yaml b/internal/test/issues/issue1799/spec.yaml index 4af6ea01a5..780e9b951c 100644 --- a/internal/test/issues/issue1799/spec.yaml +++ b/internal/test/issues/issue1799/spec.yaml @@ -14,7 +14,29 @@ paths: "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"": schema: type: string - /object-multibody: + /post-multibody: + post: + requestBody: + content: + "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"": + schema: + type: string + "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"": + schema: + type: string + + responses: + '200': + description: something + content: + "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"": + schema: + type: string + "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"": + schema: + type: string + + /get-multibody: get: responses: '200': diff --git a/internal/test/issues/issue1799/std-http/out.gen.go b/internal/test/issues/issue1799/std-http/out.gen.go index 2ec0234d22..50527066de 100644 --- a/internal/test/issues/issue1799/std-http/out.gen.go +++ b/internal/test/issues/issue1799/std-http/out.gen.go @@ -10,6 +10,7 @@ import ( "encoding/json" "fmt" "net/http" + "strings" strictnethttp "github.com/oapi-codegen/runtime/strictmiddleware/nethttp" ) @@ -17,11 +18,14 @@ import ( // ServerInterface represents all server handlers. type ServerInterface interface { + // (GET /get-multibody) + GetGetMultibody(w http.ResponseWriter, r *http.Request) + // (GET /object) GetObject(w http.ResponseWriter, r *http.Request) - // (GET /object-multibody) - GetObjectMultibody(w http.ResponseWriter, r *http.Request) + // (POST /post-multibody) + PostPostMultibody(w http.ResponseWriter, r *http.Request) } // ServerInterfaceWrapper converts contexts to parameters. @@ -33,6 +37,20 @@ type ServerInterfaceWrapper struct { type MiddlewareFunc func(http.Handler) http.Handler +// GetGetMultibody operation middleware +func (siw *ServerInterfaceWrapper) GetGetMultibody(w http.ResponseWriter, r *http.Request) { + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.GetGetMultibody(w, r) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + // GetObject operation middleware func (siw *ServerInterfaceWrapper) GetObject(w http.ResponseWriter, r *http.Request) { @@ -47,11 +65,11 @@ func (siw *ServerInterfaceWrapper) GetObject(w http.ResponseWriter, r *http.Requ handler.ServeHTTP(w, r) } -// GetObjectMultibody operation middleware -func (siw *ServerInterfaceWrapper) GetObjectMultibody(w http.ResponseWriter, r *http.Request) { +// PostPostMultibody operation middleware +func (siw *ServerInterfaceWrapper) PostPostMultibody(w http.ResponseWriter, r *http.Request) { handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.GetObjectMultibody(w, r) + siw.Handler.PostPostMultibody(w, r) })) for _, middleware := range siw.HandlerMiddlewares { @@ -181,12 +199,38 @@ func HandlerWithOptions(si ServerInterface, options StdHTTPServerOptions) http.H ErrorHandlerFunc: options.ErrorHandlerFunc, } + m.HandleFunc("GET "+options.BaseURL+"/get-multibody", wrapper.GetGetMultibody) m.HandleFunc("GET "+options.BaseURL+"/object", wrapper.GetObject) - m.HandleFunc("GET "+options.BaseURL+"/object-multibody", wrapper.GetObjectMultibody) + m.HandleFunc("POST "+options.BaseURL+"/post-multibody", wrapper.PostPostMultibody) return m } +type GetGetMultibodyRequestObject struct { +} + +type GetGetMultibodyResponseObject interface { + VisitGetGetMultibodyResponse(w http.ResponseWriter) error +} + +type GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string + +func (response GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetGetMultibodyResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) +} + +type GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string + +func (response GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitGetGetMultibodyResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") + w.WriteHeader(200) + + return json.NewEncoder(w).Encode(response) +} + type GetObjectRequestObject struct { } @@ -203,25 +247,27 @@ func (response GetObject200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivityst return json.NewEncoder(w).Encode(response) } -type GetObjectMultibodyRequestObject struct { +type PostPostMultibodyRequestObject struct { + ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody *PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody + ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body *PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody } -type GetObjectMultibodyResponseObject interface { - VisitGetObjectMultibodyResponse(w http.ResponseWriter) error +type PostPostMultibodyResponseObject interface { + VisitPostPostMultibodyResponse(w http.ResponseWriter) error } -type GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string +type PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string -func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetObjectMultibodyResponse(w http.ResponseWriter) error { +func (response PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitPostPostMultibodyResponse(w http.ResponseWriter) error { w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") w.WriteHeader(200) return json.NewEncoder(w).Encode(response) } -type GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string +type PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string -func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitGetObjectMultibodyResponse(w http.ResponseWriter) error { +func (response PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitPostPostMultibodyResponse(w http.ResponseWriter) error { w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") w.WriteHeader(200) @@ -231,11 +277,14 @@ func (response GetObjectMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsa // StrictServerInterface represents all server handlers. type StrictServerInterface interface { + // (GET /get-multibody) + GetGetMultibody(ctx context.Context, request GetGetMultibodyRequestObject) (GetGetMultibodyResponseObject, error) + // (GET /object) GetObject(ctx context.Context, request GetObjectRequestObject) (GetObjectResponseObject, error) - // (GET /object-multibody) - GetObjectMultibody(ctx context.Context, request GetObjectMultibodyRequestObject) (GetObjectMultibodyResponseObject, error) + // (POST /post-multibody) + PostPostMultibody(ctx context.Context, request PostPostMultibodyRequestObject) (PostPostMultibodyResponseObject, error) } type StrictHandlerFunc = strictnethttp.StrictHTTPHandlerFunc @@ -267,6 +316,30 @@ type strictHandler struct { options StrictHTTPServerOptions } +// GetGetMultibody operation middleware +func (sh *strictHandler) GetGetMultibody(w http.ResponseWriter, r *http.Request) { + var request GetGetMultibodyRequestObject + + handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { + return sh.ssi.GetGetMultibody(ctx, request.(GetGetMultibodyRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "GetGetMultibody") + } + + response, err := handler(r.Context(), w, r, request) + + if err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } else if validResponse, ok := response.(GetGetMultibodyResponseObject); ok { + if err := validResponse.VisitGetGetMultibodyResponse(w); err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } + } else if response != nil { + sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) + } +} + // GetObject operation middleware func (sh *strictHandler) GetObject(w http.ResponseWriter, r *http.Request) { var request GetObjectRequestObject @@ -291,23 +364,42 @@ func (sh *strictHandler) GetObject(w http.ResponseWriter, r *http.Request) { } } -// GetObjectMultibody operation middleware -func (sh *strictHandler) GetObjectMultibody(w http.ResponseWriter, r *http.Request) { - var request GetObjectMultibodyRequestObject +// PostPostMultibody operation middleware +func (sh *strictHandler) PostPostMultibody(w http.ResponseWriter, r *http.Request) { + var request PostPostMultibodyRequestObject + + if strings.HasPrefix(r.Header.Get("Content-Type"), "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") { + + var body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody + if err := json.NewDecoder(r.Body).Decode(&body); err != nil { + sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) + return + } + request.ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = &body + } + if strings.HasPrefix(r.Header.Get("Content-Type"), "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") { + + var body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody + if err := json.NewDecoder(r.Body).Decode(&body); err != nil { + sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) + return + } + request.ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body = &body + } handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { - return sh.ssi.GetObjectMultibody(ctx, request.(GetObjectMultibodyRequestObject)) + return sh.ssi.PostPostMultibody(ctx, request.(PostPostMultibodyRequestObject)) } for _, middleware := range sh.middlewares { - handler = middleware(handler, "GetObjectMultibody") + handler = middleware(handler, "PostPostMultibody") } response, err := handler(r.Context(), w, r, request) if err != nil { sh.options.ResponseErrorHandlerFunc(w, r, err) - } else if validResponse, ok := response.(GetObjectMultibodyResponseObject); ok { - if err := validResponse.VisitGetObjectMultibodyResponse(w); err != nil { + } else if validResponse, ok := response.(PostPostMultibodyResponseObject); ok { + if err := validResponse.VisitPostPostMultibodyResponse(w); err != nil { sh.options.ResponseErrorHandlerFunc(w, r, err) } } else if response != nil { diff --git a/pkg/codegen/templates/strict/strict-echo.tmpl b/pkg/codegen/templates/strict/strict-echo.tmpl index 69892605e9..71234a8988 100644 --- a/pkg/codegen/templates/strict/strict-echo.tmpl +++ b/pkg/codegen/templates/strict/strict-echo.tmpl @@ -30,7 +30,7 @@ type strictHandler struct { {{$multipleBodies := gt (len .Bodies) 1 -}} {{range .Bodies -}} - {{if $multipleBodies}}if XXXX strings.HasPrefix(ctx.Request().Header.Get("Content-Type"), "{{.ContentType | quote}}") { {{end}} + {{if $multipleBodies}}if strings.HasPrefix(ctx.Request().Header.Get("Content-Type"), {{.ContentType | quote}}) { {{end}} {{if .IsJSON -}} var body {{$opid}}{{.NameTag}}RequestBody if err := ctx.Bind(&body); err != nil { From 182fa6cbe229e2f15d767cd58fe6b2f6a67bb4ae Mon Sep 17 00:00:00 2001 From: Viktoras Makauskas Date: Sat, 15 Mar 2025 16:44:53 +0200 Subject: [PATCH 4/6] wip --- internal/test/issues/issue1799/chi/out.gen.go | 77 +++++++-- .../test/issues/issue1799/client/out.gen.go | 149 ++++++++++++++++-- .../test/issues/issue1799/echo/out.gen.go | 63 ++++++-- .../test/issues/issue1799/fiber/out.gen.go | 63 ++++++-- internal/test/issues/issue1799/gin/out.gen.go | 71 +++++++-- .../test/issues/issue1799/gorilla/out.gen.go | 71 +++++++-- .../test/issues/issue1799/iris/out.gen.go | 66 ++++++-- internal/test/issues/issue1799/spec.yaml | 45 +++--- .../test/issues/issue1799/std-http/out.gen.go | 70 ++++++-- 9 files changed, 538 insertions(+), 137 deletions(-) diff --git a/internal/test/issues/issue1799/chi/out.gen.go b/internal/test/issues/issue1799/chi/out.gen.go index d0f46cae48..f80783ec1e 100644 --- a/internal/test/issues/issue1799/chi/out.gen.go +++ b/internal/test/issues/issue1799/chi/out.gen.go @@ -25,6 +25,9 @@ type ServerInterface interface { // (POST /post-multibody) PostPostMultibody(w http.ResponseWriter, r *http.Request) + + // (POST /post-object) + PostPostObject(w http.ResponseWriter, r *http.Request) } // Unimplemented server implementation that returns http.StatusNotImplemented for each endpoint. @@ -46,6 +49,11 @@ func (_ Unimplemented) PostPostMultibody(w http.ResponseWriter, r *http.Request) w.WriteHeader(http.StatusNotImplemented) } +// (POST /post-object) +func (_ Unimplemented) PostPostObject(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusNotImplemented) +} + // ServerInterfaceWrapper converts contexts to parameters. type ServerInterfaceWrapper struct { Handler ServerInterface @@ -97,6 +105,20 @@ func (siw *ServerInterfaceWrapper) PostPostMultibody(w http.ResponseWriter, r *h handler.ServeHTTP(w, r) } +// PostPostObject operation middleware +func (siw *ServerInterfaceWrapper) PostPostObject(w http.ResponseWriter, r *http.Request) { + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.PostPostObject(w, r) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + type UnescapedCookieParamError struct { ParamName string Err error @@ -219,6 +241,9 @@ func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handl r.Group(func(r chi.Router) { r.Post(options.BaseURL+"/post-multibody", wrapper.PostPostMultibody) }) + r.Group(func(r chi.Router) { + r.Post(options.BaseURL+"/post-object", wrapper.PostPostObject) + }) return r } @@ -273,22 +298,12 @@ type PostPostMultibodyResponseObject interface { VisitPostPostMultibodyResponse(w http.ResponseWriter) error } -type PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string - -func (response PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitPostPostMultibodyResponse(w http.ResponseWriter) error { - w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") - w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) +type PostPostObjectRequestObject struct { + Body *PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody } -type PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string - -func (response PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitPostPostMultibodyResponse(w http.ResponseWriter) error { - w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") - w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) +type PostPostObjectResponseObject interface { + VisitPostPostObjectResponse(w http.ResponseWriter) error } // StrictServerInterface represents all server handlers. @@ -302,6 +317,9 @@ type StrictServerInterface interface { // (POST /post-multibody) PostPostMultibody(ctx context.Context, request PostPostMultibodyRequestObject) (PostPostMultibodyResponseObject, error) + + // (POST /post-object) + PostPostObject(ctx context.Context, request PostPostObjectRequestObject) (PostPostObjectResponseObject, error) } type StrictHandlerFunc = strictnethttp.StrictHTTPHandlerFunc @@ -423,3 +441,34 @@ func (sh *strictHandler) PostPostMultibody(w http.ResponseWriter, r *http.Reques sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) } } + +// PostPostObject operation middleware +func (sh *strictHandler) PostPostObject(w http.ResponseWriter, r *http.Request) { + var request PostPostObjectRequestObject + + var body PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody + if err := json.NewDecoder(r.Body).Decode(&body); err != nil { + sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) + return + } + request.Body = &body + + handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { + return sh.ssi.PostPostObject(ctx, request.(PostPostObjectRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "PostPostObject") + } + + response, err := handler(r.Context(), w, r, request) + + if err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } else if validResponse, ok := response.(PostPostObjectResponseObject); ok { + if err := validResponse.VisitPostPostObjectResponse(w); err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } + } else if response != nil { + sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) + } +} diff --git a/internal/test/issues/issue1799/client/out.gen.go b/internal/test/issues/issue1799/client/out.gen.go index 10523dbeec..9eaa5f3cd6 100644 --- a/internal/test/issues/issue1799/client/out.gen.go +++ b/internal/test/issues/issue1799/client/out.gen.go @@ -20,12 +20,18 @@ type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams // PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body defines parameters for PostPostMultibody. type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body = string +// PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody defines parameters for PostPostObject. +type PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = string + // PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody defines body for PostPostMultibody for application/ld+json; profile="https://www.w3.org/ns/activitystreams" ContentType. type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody = PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody // PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody defines body for PostPostMultibody for application/ld+json; profile="https://www.w3.org/ns/activitystreams2" ContentType. type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody = PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body +// PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody defines body for PostPostObject for application/ld+json; profile="https://www.w3.org/ns/activitystreams" ContentType. +type PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody = PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody + // RequestEditorFn is the function signature for the RequestEditor callback function type RequestEditorFn func(ctx context.Context, req *http.Request) error @@ -111,6 +117,11 @@ type ClientInterface interface { PostPostMultibodyWithApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody(ctx context.Context, body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) PostPostMultibodyWithApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body(ctx context.Context, body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + + // PostPostObjectWithBody request with any body + PostPostObjectWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + PostPostObjectWithApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody(ctx context.Context, body PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) } func (c *Client) GetGetMultibody(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { @@ -173,6 +184,30 @@ func (c *Client) PostPostMultibodyWithApplicationLdPlusJSONProfilehttpswwwW3Orgn return c.Client.Do(req) } +func (c *Client) PostPostObjectWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewPostPostObjectRequestWithBody(c.Server, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) PostPostObjectWithApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody(ctx context.Context, body PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewPostPostObjectRequestWithApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody(c.Server, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + // NewGetGetMultibodyRequest generates requests for GetGetMultibody func NewGetGetMultibodyRequest(server string) (*http.Request, error) { var err error @@ -278,6 +313,46 @@ func NewPostPostMultibodyRequestWithBody(server string, contentType string, body return req, nil } +// NewPostPostObjectRequestWithApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody calls the generic PostPostObject builder with application/ld+json; profile="https://www.w3.org/ns/activitystreams" body +func NewPostPostObjectRequestWithApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody(server string, body PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewPostPostObjectRequestWithBody(server, "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"", bodyReader) +} + +// NewPostPostObjectRequestWithBody generates requests for PostPostObject with any type of body +func NewPostPostObjectRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/post-object") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + func (c *Client) applyEditors(ctx context.Context, req *http.Request, additionalEditors []RequestEditorFn) error { for _, r := range c.RequestEditors { if err := r(ctx, req); err != nil { @@ -333,6 +408,11 @@ type ClientWithResponsesInterface interface { PostPostMultibodyWithApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBodyWithResponse(ctx context.Context, body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody, reqEditors ...RequestEditorFn) (*PostPostMultibodyResponse, error) PostPostMultibodyWithApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2BodyWithResponse(ctx context.Context, body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody, reqEditors ...RequestEditorFn) (*PostPostMultibodyResponse, error) + + // PostPostObjectWithBodyWithResponse request with any body + PostPostObjectWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*PostPostObjectResponse, error) + + PostPostObjectWithApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBodyWithResponse(ctx context.Context, body PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody, reqEditors ...RequestEditorFn) (*PostPostObjectResponse, error) } type GetGetMultibodyResponse struct { @@ -381,10 +461,8 @@ func (r GetObjectResponse) StatusCode() int { } type PostPostMultibodyResponse struct { - Body []byte - HTTPResponse *http.Response - ApplicationldJSONProfilehttpswwwW3Orgnsactivitystreams200 *string - ApplicationldJSONProfilehttpswwwW3Orgnsactivitystreams2200 *string + Body []byte + HTTPResponse *http.Response } // Status returns HTTPResponse.Status @@ -403,6 +481,27 @@ func (r PostPostMultibodyResponse) StatusCode() int { return 0 } +type PostPostObjectResponse struct { + Body []byte + HTTPResponse *http.Response +} + +// Status returns HTTPResponse.Status +func (r PostPostObjectResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r PostPostObjectResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + // GetGetMultibodyWithResponse request returning *GetGetMultibodyResponse func (c *ClientWithResponses) GetGetMultibodyWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetGetMultibodyResponse, error) { rsp, err := c.GetGetMultibody(ctx, reqEditors...) @@ -446,6 +545,23 @@ func (c *ClientWithResponses) PostPostMultibodyWithApplicationLdPlusJSONProfileh return ParsePostPostMultibodyResponse(rsp) } +// PostPostObjectWithBodyWithResponse request with arbitrary body returning *PostPostObjectResponse +func (c *ClientWithResponses) PostPostObjectWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*PostPostObjectResponse, error) { + rsp, err := c.PostPostObjectWithBody(ctx, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParsePostPostObjectResponse(rsp) +} + +func (c *ClientWithResponses) PostPostObjectWithApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBodyWithResponse(ctx context.Context, body PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody, reqEditors ...RequestEditorFn) (*PostPostObjectResponse, error) { + rsp, err := c.PostPostObjectWithApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody(ctx, body, reqEditors...) + if err != nil { + return nil, err + } + return ParsePostPostObjectResponse(rsp) +} + // ParseGetGetMultibodyResponse parses an HTTP response from a GetGetMultibodyWithResponse call func ParseGetGetMultibodyResponse(rsp *http.Response) (*GetGetMultibodyResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) @@ -518,21 +634,20 @@ func ParsePostPostMultibodyResponse(rsp *http.Response) (*PostPostMultibodyRespo HTTPResponse: rsp, } - switch { - case rsp.Header.Get("Content-Type") == "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"" && rsp.StatusCode == 200: - var dest string - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.ApplicationldJSONProfilehttpswwwW3Orgnsactivitystreams200 = &dest + return response, nil +} - case rsp.Header.Get("Content-Type") == "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"" && rsp.StatusCode == 200: - var dest string - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.ApplicationldJSONProfilehttpswwwW3Orgnsactivitystreams2200 = &dest +// ParsePostPostObjectResponse parses an HTTP response from a PostPostObjectWithResponse call +func ParsePostPostObjectResponse(rsp *http.Response) (*PostPostObjectResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + response := &PostPostObjectResponse{ + Body: bodyBytes, + HTTPResponse: rsp, } return response, nil diff --git a/internal/test/issues/issue1799/echo/out.gen.go b/internal/test/issues/issue1799/echo/out.gen.go index 6f2b77f127..2c5d8d5839 100644 --- a/internal/test/issues/issue1799/echo/out.gen.go +++ b/internal/test/issues/issue1799/echo/out.gen.go @@ -25,6 +25,9 @@ type ServerInterface interface { // (POST /post-multibody) PostPostMultibody(ctx echo.Context) error + + // (POST /post-object) + PostPostObject(ctx echo.Context) error } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -59,6 +62,15 @@ func (w *ServerInterfaceWrapper) PostPostMultibody(ctx echo.Context) error { return err } +// PostPostObject converts echo context to params. +func (w *ServerInterfaceWrapper) PostPostObject(ctx echo.Context) error { + var err error + + // Invoke the callback with all the unmarshaled arguments + err = w.Handler.PostPostObject(ctx) + return err +} + // This is a simple interface which specifies echo.Route addition functions which // are present on both echo.Echo and echo.Group, since we want to allow using // either of them for path registration @@ -90,6 +102,7 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL router.GET(baseURL+"/get-multibody", wrapper.GetGetMultibody) router.GET(baseURL+"/object", wrapper.GetObject) router.POST(baseURL+"/post-multibody", wrapper.PostPostMultibody) + router.POST(baseURL+"/post-object", wrapper.PostPostObject) } @@ -143,22 +156,12 @@ type PostPostMultibodyResponseObject interface { VisitPostPostMultibodyResponse(w http.ResponseWriter) error } -type PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string - -func (response PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitPostPostMultibodyResponse(w http.ResponseWriter) error { - w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") - w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) +type PostPostObjectRequestObject struct { + Body *PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody } -type PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string - -func (response PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitPostPostMultibodyResponse(w http.ResponseWriter) error { - w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") - w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) +type PostPostObjectResponseObject interface { + VisitPostPostObjectResponse(w http.ResponseWriter) error } // StrictServerInterface represents all server handlers. @@ -172,6 +175,9 @@ type StrictServerInterface interface { // (POST /post-multibody) PostPostMultibody(ctx context.Context, request PostPostMultibodyRequestObject) (PostPostMultibodyResponseObject, error) + + // (POST /post-object) + PostPostObject(ctx context.Context, request PostPostObjectRequestObject) (PostPostObjectResponseObject, error) } type StrictHandlerFunc = strictecho.StrictEchoHandlerFunc @@ -269,3 +275,32 @@ func (sh *strictHandler) PostPostMultibody(ctx echo.Context) error { } return nil } + +// PostPostObject operation middleware +func (sh *strictHandler) PostPostObject(ctx echo.Context) error { + var request PostPostObjectRequestObject + + var body PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody + if err := ctx.Bind(&body); err != nil { + return err + } + request.Body = &body + + handler := func(ctx echo.Context, request interface{}) (interface{}, error) { + return sh.ssi.PostPostObject(ctx.Request().Context(), request.(PostPostObjectRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "PostPostObject") + } + + response, err := handler(ctx, request) + + if err != nil { + return err + } else if validResponse, ok := response.(PostPostObjectResponseObject); ok { + return validResponse.VisitPostPostObjectResponse(ctx.Response()) + } else if response != nil { + return fmt.Errorf("unexpected response type: %T", response) + } + return nil +} diff --git a/internal/test/issues/issue1799/fiber/out.gen.go b/internal/test/issues/issue1799/fiber/out.gen.go index 97ccdad0d5..6ffa533b84 100644 --- a/internal/test/issues/issue1799/fiber/out.gen.go +++ b/internal/test/issues/issue1799/fiber/out.gen.go @@ -22,6 +22,9 @@ type ServerInterface interface { // (POST /post-multibody) PostPostMultibody(c *fiber.Ctx) error + + // (POST /post-object) + PostPostObject(c *fiber.Ctx) error } // ServerInterfaceWrapper converts contexts to parameters. @@ -49,6 +52,12 @@ func (siw *ServerInterfaceWrapper) PostPostMultibody(c *fiber.Ctx) error { return siw.Handler.PostPostMultibody(c) } +// PostPostObject operation middleware +func (siw *ServerInterfaceWrapper) PostPostObject(c *fiber.Ctx) error { + + return siw.Handler.PostPostObject(c) +} + // FiberServerOptions provides options for the Fiber server. type FiberServerOptions struct { BaseURL string @@ -76,6 +85,8 @@ func RegisterHandlersWithOptions(router fiber.Router, si ServerInterface, option router.Post(options.BaseURL+"/post-multibody", wrapper.PostPostMultibody) + router.Post(options.BaseURL+"/post-object", wrapper.PostPostObject) + } type GetGetMultibodyRequestObject struct { @@ -128,22 +139,12 @@ type PostPostMultibodyResponseObject interface { VisitPostPostMultibodyResponse(ctx *fiber.Ctx) error } -type PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string - -func (response PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitPostPostMultibodyResponse(ctx *fiber.Ctx) error { - ctx.Response().Header.Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") - ctx.Status(200) - - return ctx.JSON(&response) +type PostPostObjectRequestObject struct { + Body *PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody } -type PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string - -func (response PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitPostPostMultibodyResponse(ctx *fiber.Ctx) error { - ctx.Response().Header.Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") - ctx.Status(200) - - return ctx.JSON(&response) +type PostPostObjectResponseObject interface { + VisitPostPostObjectResponse(ctx *fiber.Ctx) error } // StrictServerInterface represents all server handlers. @@ -157,6 +158,9 @@ type StrictServerInterface interface { // (POST /post-multibody) PostPostMultibody(ctx context.Context, request PostPostMultibodyRequestObject) (PostPostMultibodyResponseObject, error) + + // (POST /post-object) + PostPostObject(ctx context.Context, request PostPostObjectRequestObject) (PostPostObjectResponseObject, error) } type StrictHandlerFunc func(ctx *fiber.Ctx, args interface{}) (interface{}, error) @@ -263,3 +267,34 @@ func (sh *strictHandler) PostPostMultibody(ctx *fiber.Ctx) error { } return nil } + +// PostPostObject operation middleware +func (sh *strictHandler) PostPostObject(ctx *fiber.Ctx) error { + var request PostPostObjectRequestObject + + var body PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody + if err := ctx.BodyParser(&body); err != nil { + return fiber.NewError(fiber.StatusBadRequest, err.Error()) + } + request.Body = &body + + handler := func(ctx *fiber.Ctx, request interface{}) (interface{}, error) { + return sh.ssi.PostPostObject(ctx.UserContext(), request.(PostPostObjectRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "PostPostObject") + } + + response, err := handler(ctx, request) + + if err != nil { + return fiber.NewError(fiber.StatusBadRequest, err.Error()) + } else if validResponse, ok := response.(PostPostObjectResponseObject); ok { + if err := validResponse.VisitPostPostObjectResponse(ctx); err != nil { + return fiber.NewError(fiber.StatusBadRequest, err.Error()) + } + } else if response != nil { + return fmt.Errorf("unexpected response type: %T", response) + } + return nil +} diff --git a/internal/test/issues/issue1799/gin/out.gen.go b/internal/test/issues/issue1799/gin/out.gen.go index eb899af985..e8cf2a193e 100644 --- a/internal/test/issues/issue1799/gin/out.gen.go +++ b/internal/test/issues/issue1799/gin/out.gen.go @@ -25,6 +25,9 @@ type ServerInterface interface { // (POST /post-multibody) PostPostMultibody(c *gin.Context) + + // (POST /post-object) + PostPostObject(c *gin.Context) } // ServerInterfaceWrapper converts contexts to parameters. @@ -75,6 +78,19 @@ func (siw *ServerInterfaceWrapper) PostPostMultibody(c *gin.Context) { siw.Handler.PostPostMultibody(c) } +// PostPostObject operation middleware +func (siw *ServerInterfaceWrapper) PostPostObject(c *gin.Context) { + + for _, middleware := range siw.HandlerMiddlewares { + middleware(c) + if c.IsAborted() { + return + } + } + + siw.Handler.PostPostObject(c) +} + // GinServerOptions provides options for the Gin server. type GinServerOptions struct { BaseURL string @@ -105,6 +121,7 @@ func RegisterHandlersWithOptions(router gin.IRouter, si ServerInterface, options router.GET(options.BaseURL+"/get-multibody", wrapper.GetGetMultibody) router.GET(options.BaseURL+"/object", wrapper.GetObject) router.POST(options.BaseURL+"/post-multibody", wrapper.PostPostMultibody) + router.POST(options.BaseURL+"/post-object", wrapper.PostPostObject) } type GetGetMultibodyRequestObject struct { @@ -157,22 +174,12 @@ type PostPostMultibodyResponseObject interface { VisitPostPostMultibodyResponse(w http.ResponseWriter) error } -type PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string - -func (response PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitPostPostMultibodyResponse(w http.ResponseWriter) error { - w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") - w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) +type PostPostObjectRequestObject struct { + Body *PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody } -type PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string - -func (response PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitPostPostMultibodyResponse(w http.ResponseWriter) error { - w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") - w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) +type PostPostObjectResponseObject interface { + VisitPostPostObjectResponse(w http.ResponseWriter) error } // StrictServerInterface represents all server handlers. @@ -186,6 +193,9 @@ type StrictServerInterface interface { // (POST /post-multibody) PostPostMultibody(ctx context.Context, request PostPostMultibodyRequestObject) (PostPostMultibodyResponseObject, error) + + // (POST /post-object) + PostPostObject(ctx context.Context, request PostPostObjectRequestObject) (PostPostObjectResponseObject, error) } type StrictHandlerFunc = strictgin.StrictGinHandlerFunc @@ -295,3 +305,36 @@ func (sh *strictHandler) PostPostMultibody(ctx *gin.Context) { ctx.Error(fmt.Errorf("unexpected response type: %T", response)) } } + +// PostPostObject operation middleware +func (sh *strictHandler) PostPostObject(ctx *gin.Context) { + var request PostPostObjectRequestObject + + var body PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody + if err := ctx.ShouldBindJSON(&body); err != nil { + ctx.Status(http.StatusBadRequest) + ctx.Error(err) + return + } + request.Body = &body + + handler := func(ctx *gin.Context, request interface{}) (interface{}, error) { + return sh.ssi.PostPostObject(ctx, request.(PostPostObjectRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "PostPostObject") + } + + response, err := handler(ctx, request) + + if err != nil { + ctx.Error(err) + ctx.Status(http.StatusInternalServerError) + } else if validResponse, ok := response.(PostPostObjectResponseObject); ok { + if err := validResponse.VisitPostPostObjectResponse(ctx.Writer); err != nil { + ctx.Error(err) + } + } else if response != nil { + ctx.Error(fmt.Errorf("unexpected response type: %T", response)) + } +} diff --git a/internal/test/issues/issue1799/gorilla/out.gen.go b/internal/test/issues/issue1799/gorilla/out.gen.go index 884a757369..ca268f5749 100644 --- a/internal/test/issues/issue1799/gorilla/out.gen.go +++ b/internal/test/issues/issue1799/gorilla/out.gen.go @@ -25,6 +25,9 @@ type ServerInterface interface { // (POST /post-multibody) PostPostMultibody(w http.ResponseWriter, r *http.Request) + + // (POST /post-object) + PostPostObject(w http.ResponseWriter, r *http.Request) } // ServerInterfaceWrapper converts contexts to parameters. @@ -78,6 +81,20 @@ func (siw *ServerInterfaceWrapper) PostPostMultibody(w http.ResponseWriter, r *h handler.ServeHTTP(w, r) } +// PostPostObject operation middleware +func (siw *ServerInterfaceWrapper) PostPostObject(w http.ResponseWriter, r *http.Request) { + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.PostPostObject(w, r) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + type UnescapedCookieParamError struct { ParamName string Err error @@ -197,6 +214,8 @@ func HandlerWithOptions(si ServerInterface, options GorillaServerOptions) http.H r.HandleFunc(options.BaseURL+"/post-multibody", wrapper.PostPostMultibody).Methods("POST") + r.HandleFunc(options.BaseURL+"/post-object", wrapper.PostPostObject).Methods("POST") + return r } @@ -250,22 +269,12 @@ type PostPostMultibodyResponseObject interface { VisitPostPostMultibodyResponse(w http.ResponseWriter) error } -type PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string - -func (response PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitPostPostMultibodyResponse(w http.ResponseWriter) error { - w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") - w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) +type PostPostObjectRequestObject struct { + Body *PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody } -type PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string - -func (response PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitPostPostMultibodyResponse(w http.ResponseWriter) error { - w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") - w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) +type PostPostObjectResponseObject interface { + VisitPostPostObjectResponse(w http.ResponseWriter) error } // StrictServerInterface represents all server handlers. @@ -279,6 +288,9 @@ type StrictServerInterface interface { // (POST /post-multibody) PostPostMultibody(ctx context.Context, request PostPostMultibodyRequestObject) (PostPostMultibodyResponseObject, error) + + // (POST /post-object) + PostPostObject(ctx context.Context, request PostPostObjectRequestObject) (PostPostObjectResponseObject, error) } type StrictHandlerFunc = strictnethttp.StrictHTTPHandlerFunc @@ -400,3 +412,34 @@ func (sh *strictHandler) PostPostMultibody(w http.ResponseWriter, r *http.Reques sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) } } + +// PostPostObject operation middleware +func (sh *strictHandler) PostPostObject(w http.ResponseWriter, r *http.Request) { + var request PostPostObjectRequestObject + + var body PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody + if err := json.NewDecoder(r.Body).Decode(&body); err != nil { + sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) + return + } + request.Body = &body + + handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { + return sh.ssi.PostPostObject(ctx, request.(PostPostObjectRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "PostPostObject") + } + + response, err := handler(r.Context(), w, r, request) + + if err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } else if validResponse, ok := response.(PostPostObjectResponseObject); ok { + if err := validResponse.VisitPostPostObjectResponse(w); err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } + } else if response != nil { + sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) + } +} diff --git a/internal/test/issues/issue1799/iris/out.gen.go b/internal/test/issues/issue1799/iris/out.gen.go index 66e2b1a360..1a375b2720 100644 --- a/internal/test/issues/issue1799/iris/out.gen.go +++ b/internal/test/issues/issue1799/iris/out.gen.go @@ -23,6 +23,9 @@ type ServerInterface interface { // (POST /post-multibody) PostPostMultibody(ctx iris.Context) + + // (POST /post-object) + PostPostObject(ctx iris.Context) } // ServerInterfaceWrapper converts echo contexts to parameters. @@ -53,6 +56,13 @@ func (w *ServerInterfaceWrapper) PostPostMultibody(ctx iris.Context) { w.Handler.PostPostMultibody(ctx) } +// PostPostObject converts iris context to params. +func (w *ServerInterfaceWrapper) PostPostObject(ctx iris.Context) { + + // Invoke the callback with all the unmarshaled arguments + w.Handler.PostPostObject(ctx) +} + // IrisServerOption is the option for iris server type IrisServerOptions struct { BaseURL string @@ -74,6 +84,7 @@ func RegisterHandlersWithOptions(router *iris.Application, si ServerInterface, o router.Get(options.BaseURL+"/get-multibody", wrapper.GetGetMultibody) router.Get(options.BaseURL+"/object", wrapper.GetObject) router.Post(options.BaseURL+"/post-multibody", wrapper.PostPostMultibody) + router.Post(options.BaseURL+"/post-object", wrapper.PostPostObject) router.Build() } @@ -128,22 +139,12 @@ type PostPostMultibodyResponseObject interface { VisitPostPostMultibodyResponse(ctx iris.Context) error } -type PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string - -func (response PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitPostPostMultibodyResponse(ctx iris.Context) error { - ctx.ResponseWriter().Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") - ctx.StatusCode(200) - - return ctx.JSON(&response) +type PostPostObjectRequestObject struct { + Body *PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody } -type PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string - -func (response PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitPostPostMultibodyResponse(ctx iris.Context) error { - ctx.ResponseWriter().Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") - ctx.StatusCode(200) - - return ctx.JSON(&response) +type PostPostObjectResponseObject interface { + VisitPostPostObjectResponse(ctx iris.Context) error } // StrictServerInterface represents all server handlers. @@ -157,6 +158,9 @@ type StrictServerInterface interface { // (POST /post-multibody) PostPostMultibody(ctx context.Context, request PostPostMultibodyRequestObject) (PostPostMultibodyResponseObject, error) + + // (POST /post-object) + PostPostObject(ctx context.Context, request PostPostObjectRequestObject) (PostPostObjectResponseObject, error) } type StrictHandlerFunc = strictiris.StrictIrisHandlerFunc @@ -270,3 +274,37 @@ func (sh *strictHandler) PostPostMultibody(ctx iris.Context) { return } } + +// PostPostObject operation middleware +func (sh *strictHandler) PostPostObject(ctx iris.Context) { + var request PostPostObjectRequestObject + + var body PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody + if err := ctx.ReadJSON(&body); err != nil { + ctx.StopWithError(http.StatusBadRequest, err) + return + } + request.Body = &body + + handler := func(ctx iris.Context, request interface{}) (interface{}, error) { + return sh.ssi.PostPostObject(ctx, request.(PostPostObjectRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "PostPostObject") + } + + response, err := handler(ctx, request) + + if err != nil { + ctx.StopWithError(http.StatusBadRequest, err) + return + } else if validResponse, ok := response.(PostPostObjectResponseObject); ok { + if err := validResponse.VisitPostPostObjectResponse(ctx); err != nil { + ctx.StopWithError(http.StatusBadRequest, err) + return + } + } else if response != nil { + ctx.Writef("Unexpected response type: %T", response) + return + } +} diff --git a/internal/test/issues/issue1799/spec.yaml b/internal/test/issues/issue1799/spec.yaml index 780e9b951c..1174ae0129 100644 --- a/internal/test/issues/issue1799/spec.yaml +++ b/internal/test/issues/issue1799/spec.yaml @@ -14,28 +14,6 @@ paths: "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"": schema: type: string - /post-multibody: - post: - requestBody: - content: - "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"": - schema: - type: string - "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"": - schema: - type: string - - responses: - '200': - description: something - content: - "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"": - schema: - type: string - "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"": - schema: - type: string - /get-multibody: get: responses: @@ -48,3 +26,26 @@ paths: "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"": schema: type: string + /post-object: + post: + requestBody: + content: + "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"": + schema: + type: string + responses: {} + + /post-multibody: + post: + requestBody: + content: + "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"": + schema: + type: string + "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"": + schema: + type: string + + responses: {} + + diff --git a/internal/test/issues/issue1799/std-http/out.gen.go b/internal/test/issues/issue1799/std-http/out.gen.go index 50527066de..9330857a77 100644 --- a/internal/test/issues/issue1799/std-http/out.gen.go +++ b/internal/test/issues/issue1799/std-http/out.gen.go @@ -26,6 +26,9 @@ type ServerInterface interface { // (POST /post-multibody) PostPostMultibody(w http.ResponseWriter, r *http.Request) + + // (POST /post-object) + PostPostObject(w http.ResponseWriter, r *http.Request) } // ServerInterfaceWrapper converts contexts to parameters. @@ -79,6 +82,20 @@ func (siw *ServerInterfaceWrapper) PostPostMultibody(w http.ResponseWriter, r *h handler.ServeHTTP(w, r) } +// PostPostObject operation middleware +func (siw *ServerInterfaceWrapper) PostPostObject(w http.ResponseWriter, r *http.Request) { + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.PostPostObject(w, r) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + type UnescapedCookieParamError struct { ParamName string Err error @@ -202,6 +219,7 @@ func HandlerWithOptions(si ServerInterface, options StdHTTPServerOptions) http.H m.HandleFunc("GET "+options.BaseURL+"/get-multibody", wrapper.GetGetMultibody) m.HandleFunc("GET "+options.BaseURL+"/object", wrapper.GetObject) m.HandleFunc("POST "+options.BaseURL+"/post-multibody", wrapper.PostPostMultibody) + m.HandleFunc("POST "+options.BaseURL+"/post-object", wrapper.PostPostObject) return m } @@ -256,22 +274,12 @@ type PostPostMultibodyResponseObject interface { VisitPostPostMultibodyResponse(w http.ResponseWriter) error } -type PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string - -func (response PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitPostPostMultibodyResponse(w http.ResponseWriter) error { - w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") - w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) +type PostPostObjectRequestObject struct { + Body *PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody } -type PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string - -func (response PostPostMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitPostPostMultibodyResponse(w http.ResponseWriter) error { - w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") - w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) +type PostPostObjectResponseObject interface { + VisitPostPostObjectResponse(w http.ResponseWriter) error } // StrictServerInterface represents all server handlers. @@ -285,6 +293,9 @@ type StrictServerInterface interface { // (POST /post-multibody) PostPostMultibody(ctx context.Context, request PostPostMultibodyRequestObject) (PostPostMultibodyResponseObject, error) + + // (POST /post-object) + PostPostObject(ctx context.Context, request PostPostObjectRequestObject) (PostPostObjectResponseObject, error) } type StrictHandlerFunc = strictnethttp.StrictHTTPHandlerFunc @@ -406,3 +417,34 @@ func (sh *strictHandler) PostPostMultibody(w http.ResponseWriter, r *http.Reques sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) } } + +// PostPostObject operation middleware +func (sh *strictHandler) PostPostObject(w http.ResponseWriter, r *http.Request) { + var request PostPostObjectRequestObject + + var body PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody + if err := json.NewDecoder(r.Body).Decode(&body); err != nil { + sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) + return + } + request.Body = &body + + handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { + return sh.ssi.PostPostObject(ctx, request.(PostPostObjectRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "PostPostObject") + } + + response, err := handler(r.Context(), w, r, request) + + if err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } else if validResponse, ok := response.(PostPostObjectResponseObject); ok { + if err := validResponse.VisitPostPostObjectResponse(w); err != nil { + sh.options.ResponseErrorHandlerFunc(w, r, err) + } + } else if response != nil { + sh.options.ResponseErrorHandlerFunc(w, r, fmt.Errorf("unexpected response type: %T", response)) + } +} From a0fb82d31d4e4c81d506a2fd57a8cd266e0d78dd Mon Sep 17 00:00:00 2001 From: Viktoras Makauskas Date: Sat, 15 Mar 2025 16:50:38 +0200 Subject: [PATCH 5/6] wip --- internal/test/issues/issue1799/chi/out.gen.go | 18 ++++++++++++++++++ .../issues/issue1799/config-chi-server.yaml | 1 + .../issues/issue1799/config-echo-server.yaml | 1 + .../issues/issue1799/config-fiber-server.yaml | 1 + .../issues/issue1799/config-gin-server.yaml | 1 + .../issue1799/config-gorilla-server.yaml | 1 + .../issues/issue1799/config-iris-server.yaml | 1 + .../issue1799/config-std-http-server.yaml | 1 + internal/test/issues/issue1799/echo/out.gen.go | 18 ++++++++++++++++++ .../test/issues/issue1799/fiber/out.gen.go | 18 ++++++++++++++++++ internal/test/issues/issue1799/gin/out.gen.go | 18 ++++++++++++++++++ .../test/issues/issue1799/gorilla/out.gen.go | 18 ++++++++++++++++++ internal/test/issues/issue1799/iris/out.gen.go | 18 ++++++++++++++++++ .../test/issues/issue1799/std-http/out.gen.go | 18 ++++++++++++++++++ 14 files changed, 133 insertions(+) diff --git a/internal/test/issues/issue1799/chi/out.gen.go b/internal/test/issues/issue1799/chi/out.gen.go index f80783ec1e..55722406da 100644 --- a/internal/test/issues/issue1799/chi/out.gen.go +++ b/internal/test/issues/issue1799/chi/out.gen.go @@ -14,6 +14,24 @@ import ( strictnethttp "github.com/oapi-codegen/runtime/strictmiddleware/nethttp" ) +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody defines parameters for PostPostMultibody. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = string + +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body defines parameters for PostPostMultibody. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body = string + +// PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody defines parameters for PostPostObject. +type PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = string + +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody defines body for PostPostMultibody for application/ld+json; profile="https://www.w3.org/ns/activitystreams" ContentType. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody = PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody + +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody defines body for PostPostMultibody for application/ld+json; profile="https://www.w3.org/ns/activitystreams2" ContentType. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody = PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body + +// PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody defines body for PostPostObject for application/ld+json; profile="https://www.w3.org/ns/activitystreams" ContentType. +type PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody = PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody + // ServerInterface represents all server handlers. type ServerInterface interface { diff --git a/internal/test/issues/issue1799/config-chi-server.yaml b/internal/test/issues/issue1799/config-chi-server.yaml index 5975cb9194..481a0e20a9 100644 --- a/internal/test/issues/issue1799/config-chi-server.yaml +++ b/internal/test/issues/issue1799/config-chi-server.yaml @@ -2,6 +2,7 @@ package: chi generate: chi-server: true strict-server: true + models: true output: chi/out.gen.go output-options: skip-prune: true diff --git a/internal/test/issues/issue1799/config-echo-server.yaml b/internal/test/issues/issue1799/config-echo-server.yaml index 8d36795337..a7de2f3447 100644 --- a/internal/test/issues/issue1799/config-echo-server.yaml +++ b/internal/test/issues/issue1799/config-echo-server.yaml @@ -2,6 +2,7 @@ package: echo generate: echo-server: true strict-server: true + models: true output: echo/out.gen.go output-options: skip-prune: true diff --git a/internal/test/issues/issue1799/config-fiber-server.yaml b/internal/test/issues/issue1799/config-fiber-server.yaml index b2bb2b3999..9ffccf199c 100644 --- a/internal/test/issues/issue1799/config-fiber-server.yaml +++ b/internal/test/issues/issue1799/config-fiber-server.yaml @@ -2,6 +2,7 @@ package: fiber generate: fiber-server: true strict-server: true + models: true output: fiber/out.gen.go output-options: skip-prune: true diff --git a/internal/test/issues/issue1799/config-gin-server.yaml b/internal/test/issues/issue1799/config-gin-server.yaml index 6217685765..9b4a9ad231 100644 --- a/internal/test/issues/issue1799/config-gin-server.yaml +++ b/internal/test/issues/issue1799/config-gin-server.yaml @@ -2,6 +2,7 @@ package: gin generate: gin-server: true strict-server: true + models: true output: gin/out.gen.go output-options: skip-prune: true diff --git a/internal/test/issues/issue1799/config-gorilla-server.yaml b/internal/test/issues/issue1799/config-gorilla-server.yaml index 85b6bbef68..544d7d5806 100644 --- a/internal/test/issues/issue1799/config-gorilla-server.yaml +++ b/internal/test/issues/issue1799/config-gorilla-server.yaml @@ -2,6 +2,7 @@ package: gorilla generate: gorilla-server: true strict-server: true + models: true output: gorilla/out.gen.go output-options: skip-prune: true diff --git a/internal/test/issues/issue1799/config-iris-server.yaml b/internal/test/issues/issue1799/config-iris-server.yaml index 320326056c..c46e183bf2 100644 --- a/internal/test/issues/issue1799/config-iris-server.yaml +++ b/internal/test/issues/issue1799/config-iris-server.yaml @@ -2,6 +2,7 @@ package: iris generate: iris-server: true strict-server: true + models: true output: iris/out.gen.go output-options: skip-prune: true diff --git a/internal/test/issues/issue1799/config-std-http-server.yaml b/internal/test/issues/issue1799/config-std-http-server.yaml index 2baf073e24..8ac59593a4 100644 --- a/internal/test/issues/issue1799/config-std-http-server.yaml +++ b/internal/test/issues/issue1799/config-std-http-server.yaml @@ -2,6 +2,7 @@ package: stdhttp generate: std-http-server: true strict-server: true + models: true output: std-http/out.gen.go output-options: skip-prune: true diff --git a/internal/test/issues/issue1799/echo/out.gen.go b/internal/test/issues/issue1799/echo/out.gen.go index 2c5d8d5839..c86cac46bb 100644 --- a/internal/test/issues/issue1799/echo/out.gen.go +++ b/internal/test/issues/issue1799/echo/out.gen.go @@ -14,6 +14,24 @@ import ( strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" ) +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody defines parameters for PostPostMultibody. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = string + +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body defines parameters for PostPostMultibody. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body = string + +// PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody defines parameters for PostPostObject. +type PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = string + +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody defines body for PostPostMultibody for application/ld+json; profile="https://www.w3.org/ns/activitystreams" ContentType. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody = PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody + +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody defines body for PostPostMultibody for application/ld+json; profile="https://www.w3.org/ns/activitystreams2" ContentType. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody = PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body + +// PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody defines body for PostPostObject for application/ld+json; profile="https://www.w3.org/ns/activitystreams" ContentType. +type PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody = PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody + // ServerInterface represents all server handlers. type ServerInterface interface { diff --git a/internal/test/issues/issue1799/fiber/out.gen.go b/internal/test/issues/issue1799/fiber/out.gen.go index 6ffa533b84..ef5c49dfa0 100644 --- a/internal/test/issues/issue1799/fiber/out.gen.go +++ b/internal/test/issues/issue1799/fiber/out.gen.go @@ -11,6 +11,24 @@ import ( "github.com/gofiber/fiber/v2" ) +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody defines parameters for PostPostMultibody. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = string + +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body defines parameters for PostPostMultibody. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body = string + +// PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody defines parameters for PostPostObject. +type PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = string + +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody defines body for PostPostMultibody for application/ld+json; profile="https://www.w3.org/ns/activitystreams" ContentType. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody = PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody + +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody defines body for PostPostMultibody for application/ld+json; profile="https://www.w3.org/ns/activitystreams2" ContentType. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody = PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body + +// PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody defines body for PostPostObject for application/ld+json; profile="https://www.w3.org/ns/activitystreams" ContentType. +type PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody = PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody + // ServerInterface represents all server handlers. type ServerInterface interface { diff --git a/internal/test/issues/issue1799/gin/out.gen.go b/internal/test/issues/issue1799/gin/out.gen.go index e8cf2a193e..148782ee96 100644 --- a/internal/test/issues/issue1799/gin/out.gen.go +++ b/internal/test/issues/issue1799/gin/out.gen.go @@ -14,6 +14,24 @@ import ( strictgin "github.com/oapi-codegen/runtime/strictmiddleware/gin" ) +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody defines parameters for PostPostMultibody. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = string + +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body defines parameters for PostPostMultibody. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body = string + +// PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody defines parameters for PostPostObject. +type PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = string + +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody defines body for PostPostMultibody for application/ld+json; profile="https://www.w3.org/ns/activitystreams" ContentType. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody = PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody + +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody defines body for PostPostMultibody for application/ld+json; profile="https://www.w3.org/ns/activitystreams2" ContentType. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody = PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body + +// PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody defines body for PostPostObject for application/ld+json; profile="https://www.w3.org/ns/activitystreams" ContentType. +type PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody = PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody + // ServerInterface represents all server handlers. type ServerInterface interface { diff --git a/internal/test/issues/issue1799/gorilla/out.gen.go b/internal/test/issues/issue1799/gorilla/out.gen.go index ca268f5749..9e4a85db35 100644 --- a/internal/test/issues/issue1799/gorilla/out.gen.go +++ b/internal/test/issues/issue1799/gorilla/out.gen.go @@ -14,6 +14,24 @@ import ( strictnethttp "github.com/oapi-codegen/runtime/strictmiddleware/nethttp" ) +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody defines parameters for PostPostMultibody. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = string + +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body defines parameters for PostPostMultibody. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body = string + +// PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody defines parameters for PostPostObject. +type PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = string + +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody defines body for PostPostMultibody for application/ld+json; profile="https://www.w3.org/ns/activitystreams" ContentType. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody = PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody + +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody defines body for PostPostMultibody for application/ld+json; profile="https://www.w3.org/ns/activitystreams2" ContentType. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody = PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body + +// PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody defines body for PostPostObject for application/ld+json; profile="https://www.w3.org/ns/activitystreams" ContentType. +type PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody = PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody + // ServerInterface represents all server handlers. type ServerInterface interface { diff --git a/internal/test/issues/issue1799/iris/out.gen.go b/internal/test/issues/issue1799/iris/out.gen.go index 1a375b2720..fe4f4f9058 100644 --- a/internal/test/issues/issue1799/iris/out.gen.go +++ b/internal/test/issues/issue1799/iris/out.gen.go @@ -12,6 +12,24 @@ import ( strictiris "github.com/oapi-codegen/runtime/strictmiddleware/iris" ) +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody defines parameters for PostPostMultibody. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = string + +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body defines parameters for PostPostMultibody. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body = string + +// PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody defines parameters for PostPostObject. +type PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = string + +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody defines body for PostPostMultibody for application/ld+json; profile="https://www.w3.org/ns/activitystreams" ContentType. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody = PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody + +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody defines body for PostPostMultibody for application/ld+json; profile="https://www.w3.org/ns/activitystreams2" ContentType. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody = PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body + +// PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody defines body for PostPostObject for application/ld+json; profile="https://www.w3.org/ns/activitystreams" ContentType. +type PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody = PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody + // ServerInterface represents all server handlers. type ServerInterface interface { diff --git a/internal/test/issues/issue1799/std-http/out.gen.go b/internal/test/issues/issue1799/std-http/out.gen.go index 9330857a77..d871a17bcb 100644 --- a/internal/test/issues/issue1799/std-http/out.gen.go +++ b/internal/test/issues/issue1799/std-http/out.gen.go @@ -15,6 +15,24 @@ import ( strictnethttp "github.com/oapi-codegen/runtime/strictmiddleware/nethttp" ) +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody defines parameters for PostPostMultibody. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = string + +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body defines parameters for PostPostMultibody. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body = string + +// PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody defines parameters for PostPostObject. +type PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = string + +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody defines body for PostPostMultibody for application/ld+json; profile="https://www.w3.org/ns/activitystreams" ContentType. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody = PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody + +// PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody defines body for PostPostMultibody for application/ld+json; profile="https://www.w3.org/ns/activitystreams2" ContentType. +type PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody = PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body + +// PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody defines body for PostPostObject for application/ld+json; profile="https://www.w3.org/ns/activitystreams" ContentType. +type PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody = PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody + // ServerInterface represents all server handlers. type ServerInterface interface { From 5dcf5e272e4744a160f604eca69440c8252392c2 Mon Sep 17 00:00:00 2001 From: Marcin Romaszewicz Date: Mon, 4 May 2026 14:26:22 -0700 Subject: [PATCH 6/6] Regenerate files after rebase --- examples/go.sum | 54 +++++++ internal/test/go.sum | 51 +++++++ internal/test/issues/issue1799/chi/out.gen.go | 62 +++++--- .../test/issues/issue1799/client/out.gen.go | 40 ++++- .../test/issues/issue1799/echo/out.gen.go | 89 ++++++++--- .../test/issues/issue1799/fiber/out.gen.go | 94 ++++++++++-- internal/test/issues/issue1799/gin/out.gen.go | 140 +++++++++++++----- .../test/issues/issue1799/gorilla/out.gen.go | 70 ++++++--- .../test/issues/issue1799/iris/out.gen.go | 34 +++-- .../test/issues/issue1799/std-http/out.gen.go | 75 ++++++---- 10 files changed, 552 insertions(+), 157 deletions(-) diff --git a/examples/go.sum b/examples/go.sum index 37029268a1..619b56272c 100644 --- a/examples/go.sum +++ b/examples/go.sum @@ -20,6 +20,7 @@ github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7D github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/bytedance/gopkg v0.1.4 h1:oZnQwnX82KAIWb7033bEwtxvTqXcYMxDBaQxo5JJHWM= github.com/bytedance/gopkg v0.1.4/go.mod h1:v1zWfPm21Fb+OsyXN2VAHdL6TBb2L88anLQgdyje6R4= @@ -27,6 +28,8 @@ github.com/bytedance/sonic v1.15.1 h1:nJD5PmM0vY7J8CT6MxoqbVAAMhkSmV2HgRAUrrpLoO github.com/bytedance/sonic v1.15.1/go.mod h1:mT2NbXunuaEbnZ+mRIX/vYqKISmgEuHFDI4UzmKx2SA= github.com/bytedance/sonic/loader v0.5.1 h1:Ygpfa9zwRCCKSlrp5bBP/b/Xzc3VxsAW+5NIYXrOOpI= github.com/bytedance/sonic/loader v0.5.1/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -34,17 +37,25 @@ github.com/clipperhouse/uax29/v2 v2.7.0 h1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJ github.com/clipperhouse/uax29/v2 v2.7.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM= github.com/cloudwego/base64x v0.1.7 h1:NppS+Fgzg5ovhn4NkUXaDT3x9jldgH5ToMCqzBSi2zI= github.com/cloudwego/base64x v0.1.7/go.mod h1:Cu1PV9zfrSf7ET2tIbWbbEy7jO7HHJ13q4X2SQ8aWYg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/decred/dcrd/crypto/blake256 v1.1.0/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.1 h1:5RVFMOWjMyRy8cARdy79nAmgYw3hK/4HUq48LQ6Wwqo= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.1/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40= +github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= +github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/djherbis/atime v1.1.0/go.mod h1:28OF6Y8s3NQWwacXc5eZTsEsiMzp7LF8MbXE+XJPdBE= github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960/go.mod h1:9HQzr9D/0PGwMEbC3d5AB7oi67+h4TsQqItC1GVYG58= github.com/dprotaso/go-yit v0.0.0-20220510233725-9ba8df137936 h1:PRxIJD8XjimM5aTknUK9w6DHLDox2r2M3DI4i2pnd3w= github.com/dprotaso/go-yit v0.0.0-20220510233725-9ba8df137936/go.mod h1:ttYvX5qlB+mlV1okblJqcSMtR4c52UKxDiX9GRBS8+Q= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= @@ -65,8 +76,10 @@ github.com/gin-gonic/gin v1.12.0 h1:b3YAbrZtnf8N//yjKeU2+MQsh2mY5htkZidOM7O0wG8= github.com/gin-gonic/gin v1.12.0/go.mod h1:VxccKfsSllpKshkBWgVgRniFFAzFb9csfngsqANjnLc= github.com/go-chi/chi/v5 v5.2.5 h1:Eg4myHZBjyvJmAFjFvWgrqDTXFyOzjj7YIm3L3mu6Ug= github.com/go-chi/chi/v5 v5.2.5/go.mod h1:X7Gx4mteadT3eDOMTsXzmI4/rwUpOwBHLpAfupzFJP0= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/jsonpointer v0.23.1 h1:1HBACs7XIwR2RcmItfdSFlALhGbe6S92p0ry4d1GWg4= github.com/go-openapi/jsonpointer v0.23.1/go.mod h1:iWRmZTrGn7XwYhtPt/fvdSFj1OfNBngqRT2UG3BxSqY= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-openapi/swag/jsonname v0.26.0 h1:gV1NFX9M8avo0YSpmWogqfQISigCmpaiNci8cGECU5w= github.com/go-openapi/swag/jsonname v0.26.0/go.mod h1:urBBR8bZNoDYGr653ynhIx+gTeIz0ARZxHkAPktJK2M= github.com/go-openapi/testify/v2 v2.4.2 h1:tiByHpvE9uHrrKjOszax7ZvKB7QOgizBWGBLuq0ePx4= @@ -84,12 +97,16 @@ github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= +github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.3.2/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= github.com/goccy/go-json v0.10.6 h1:p8HrPJzOakx/mn/bQtjgNjdTcN+/S6FcG2CTtQOrHVU= github.com/goccy/go-json v0.10.6/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/goccy/go-yaml v1.19.2 h1:PmFC1S6h8ljIz6gMRBopkjP1TVT7xuwrButHID66PoM= github.com/goccy/go-yaml v1.19.2/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/gofiber/fiber/v2 v2.52.13 h1:TOKP64iqC9b5P49VrBW5tHhUOvDyrtJ0xePEfzJbCbk= github.com/gofiber/fiber/v2 v2.52.13/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= @@ -119,16 +136,20 @@ github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= +github.com/invopop/yaml v0.2.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= github.com/iris-contrib/httpexpect/v2 v2.15.2 h1:T9THsdP1woyAqKHwjkEsbCnMefsAFvk8iJJKokcJ3Go= github.com/iris-contrib/httpexpect/v2 v2.15.2/go.mod h1:JLDgIqnFy5loDSUv1OA2j0mb6p/rDhiCqigP22Uq9xE= github.com/iris-contrib/schema v0.0.6 h1:CPSBLyx2e91H2yJzPuhGuifVRnZBBJ3pCOMbOvPZaTw= github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= +github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= +github.com/jordanlewis/gcassert v0.0.0-20250430164644-389ef753e22e/go.mod h1:ZybsQk6DWyN5t7An1MuPm1gtSZ1xDaTXS9ZjIOxvQrk= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -140,6 +161,8 @@ github.com/kataras/golog v0.1.11 h1:dGkcCVsIpqiAMWTlebn/ZULHxFvfG4K43LF1cNWSh20= github.com/kataras/golog v0.1.11/go.mod h1:mAkt1vbPowFUuUGvexyQ5NFW6djEgGyxQBIARJ0AH4A= github.com/kataras/iris/v12 v12.2.11 h1:sGgo43rMPfzDft8rjVhPs6L3qDJy3TbBrMD/zGL1pzk= github.com/kataras/iris/v12 v12.2.11/go.mod h1:uMAeX8OqG9vqdhyrIPv8Lajo/wXTtAF43wchP9WHt2w= +github.com/kataras/jwt v0.1.12/go.mod h1:xkimAtDhU/aGlQqjwvgtg+VyuPwMiyZHaY8LJRh0mYo= +github.com/kataras/neffos v0.0.24-0.20240408172741-99c879ba0ede/go.mod h1:i0dtcTbpnw1lqIbojYtGtZlu6gDWPxJ4Xl2eJ6oQ1bE= github.com/kataras/pio v0.0.13 h1:x0rXVX0fviDTXOOLOmr4MUxOabu1InVSTu5itF8CXCM= github.com/kataras/pio v0.0.13/go.mod h1:k3HNuSw+eJ8Pm2lA4lRhg3DiCjVgHlP8hmXApSej3oM= github.com/kataras/sitemap v0.0.6 h1:w71CRMMKYMJh6LR2wTgnk5hSgjVNB9KL60n5e2KHvLY= @@ -179,6 +202,7 @@ github.com/lestrrat-go/jwx/v3 v3.1.0 h1:AyyLtxc0QM75F75JroWgt1phwC7X+wOb3XKhH7XB github.com/lestrrat-go/jwx/v3 v3.1.0/go.mod h1:uw/MN2M/Xiu4FhwcIwH11Zsh9JWx9SWzgALl7/uIEkU= github.com/lestrrat-go/option/v2 v2.0.0 h1:XxrcaJESE1fokHy3FpaQ/cXW8ZsIdWcdFzzLOcID3Ss= github.com/lestrrat-go/option/v2 v2.0.0/go.mod h1:oSySsmzMoR0iRzCDCaUfsCzxQHUEuhOViQObyy7S6Vg= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/mailgun/raymond/v2 v2.0.48 h1:5dmlB680ZkFG2RN/0lvTAghrSxIESeu9/2aeDqACtjw= github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= github.com/mailru/easyjson v0.9.2 h1:dX8U45hQsZpxd80nLvDGihsQ/OxlvTkVUXH2r/8cb2M= @@ -189,6 +213,7 @@ github.com/mattn/go-isatty v0.0.22 h1:j8l17JJ9i6VGPUFUYoTUKPSgKe/83EYU2zBC7YNKMw github.com/mattn/go-isatty v0.0.22/go.mod h1:ZXfXG4SQHsB/w3ZeOYbR0PrPwLy+n6xiMrJlRFqopa4= github.com/mattn/go-runewidth v0.0.23 h1:7ykA0T0jkPpzSvMS5i9uoNn2Xy3R383f9HDx3RybWcw= github.com/mattn/go-runewidth v0.0.23/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= +github.com/mediocregopher/radix/v3 v3.8.1/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= @@ -200,6 +225,9 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/nats-io/nats.go v1.34.1/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8= +github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -235,17 +263,23 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.3.0 h1:k59bC/lIZREW0/iVaQR8nDHxVq8OVlIzYCOJf421CaM= github.com/pelletier/go-toml/v2 v2.3.0/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= +github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/quic-go/qpack v0.6.0 h1:g7W+BMYynC1LbYLSqRt8PBg5Tgwxn214ZZR34VIOjz8= github.com/quic-go/qpack v0.6.0/go.mod h1:lUpLKChi8njB4ty2bFLX2x4gzDqXwUpaO1DP9qMDZII= github.com/quic-go/quic-go v0.59.0 h1:OLJkp1Mlm/aS7dpKgTc6cnpynnD2Xg7C1pwL6vy/SAw= github.com/quic-go/quic-go v0.59.0/go.mod h1:upnsH4Ju1YkqpLXC305eW3yDZ4NfnNbmQRCMWS58IKU= +github.com/redis/go-redis/v9 v9.5.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= @@ -260,6 +294,8 @@ github.com/segmentio/asm v1.2.1 h1:DTNbBqs57ioxAD4PrArqftgypG4/qNpXoJx8TVXxPR0= github.com/segmentio/asm v1.2.1/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shirou/gopsutil/v3 v3.24.3/go.mod h1:JpND7O217xa72ewWz9zN2eIIkPWsDN/3pl0H8Qt0uwg= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w= github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g= @@ -283,6 +319,7 @@ github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/tdewolff/argp v0.0.0-20260424074207-decde4f86440/go.mod h1:t4IfmOfK1WpBPd456pTdSB4f+BuMp6CUGnV7CBzduxk= github.com/tdewolff/minify/v2 v2.24.13 h1:xrcF7gKDnUszseEY9WX9mUlZII2v2Go/QAcAwRASw58= github.com/tdewolff/minify/v2 v2.24.13/go.mod h1:emvwoYeIl8bfAKqRU5ww95LX9Gpggpqv/naal9a8Yq0= github.com/tdewolff/parse/v2 v2.8.12 h1:5BBjfaCv482v3nltlS0u6wH1xJaxjR6ofDrWttNvROg= @@ -290,6 +327,9 @@ github.com/tdewolff/parse/v2 v2.8.12/go.mod h1:Hwlni2tiVNKyzR1o6nUs4FOF07URA+JLB github.com/tdewolff/test v1.0.11/go.mod h1:XPuWBzvdUzhCuxWO1ojpXsyzsA5bFoS3tO/Q3kFuTG8= github.com/tdewolff/test v1.0.12 h1:7F21DqIajswxuche0geHdrUZRCWE4oko4b7bcmkkrxk= github.com/tdewolff/test v1.0.12/go.mod h1:XPuWBzvdUzhCuxWO1ojpXsyzsA5bFoS3tO/Q3kFuTG8= +github.com/tinylib/msgp v1.2.5/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go/codec v1.3.1 h1:waO7eEiFDwidsBN6agj1vJQ4AG7lh2yqXyOXqhgQuyY= @@ -302,6 +342,7 @@ github.com/valyala/fastjson v1.6.10 h1:/yjJg8jaVQdYR3arGxPE2X5z89xrlhS0eGXdv+ADT github.com/valyala/fastjson v1.6.10/go.mod h1:e6FubmQouUNP73jtMLmcbxS6ydWIpOfhz34TSfO3JaE= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= @@ -310,6 +351,9 @@ github.com/vmware-labs/yaml-jsonpath v0.3.2 h1:/5QKeCBGdsInyDCyVNLbXyilb61MXGi9N github.com/vmware-labs/yaml-jsonpath v0.3.2/go.mod h1:U6whw1z03QyqgWdgXxvVnQ90zN1BWz5V+51Ewf8k+rQ= github.com/woodsbury/decimal128 v1.4.0 h1:xJATj7lLu4f2oObouMt2tgGiElE5gO6mSWUjQsBgUlc= github.com/woodsbury/decimal128 v1.4.0/go.mod h1:BP46FUrVjVhdTbKT+XuQh2xfQaGki9LMIRJSFuh6THU= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.2.0/go.mod h1:3dlrS0iBaWKYVt2ZfA4cj48umJZ+cAEbR6/SjLA88I8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= @@ -322,12 +366,16 @@ github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJx github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= github.com/yosssi/ace v0.0.5 h1:tUkIP/BLdKqrlrPwcmH0shwEEhTRHoGnc1wFIWmaBUA= github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE= go.mongodb.org/mongo-driver/v2 v2.6.0 h1:b9sJOYrkmt4l8bY43ZenFBcPlhYIjaOfYHLtbB/5qi8= go.mongodb.org/mongo-driver/v2 v2.6.0/go.mod h1:yOI9kBsufol30iFsl1slpdq1I0eHPzybRWdyYUs8K/0= go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= @@ -385,8 +433,10 @@ golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/telemetry v0.0.0-20260409153401-be6f6cb8b1fa/go.mod h1:kHjTxDEnAu6/Nl9lDkzjWpR+bmKfxeiRuSDlsMb70gE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.42.0/go.mod h1:Dq/D+snpsbazcBG5+F9Q1n2rXV8Ma+71xEjTRufARgY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -402,10 +452,13 @@ golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c= golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI= +golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= +golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated/go.mod h1:RVAQXBGNv1ib0J382/DPCRS/BPnsGebyM1Gj5VSDpG8= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -438,3 +491,4 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= moul.io/http2curl/v2 v2.3.0 h1:9r3JfDzWPcbIklMOs2TnIFzDYvfAZvjeavG6EzP7jYs= moul.io/http2curl/v2 v2.3.0/go.mod h1:RW4hyBjTWSYDOxapodpNEtX0g5Eb16sxklBqmd2RHcE= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/internal/test/go.sum b/internal/test/go.sum index 7f8a1dd512..9a5458f62f 100644 --- a/internal/test/go.sum +++ b/internal/test/go.sum @@ -20,6 +20,7 @@ github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7D github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/bytedance/gopkg v0.1.4 h1:oZnQwnX82KAIWb7033bEwtxvTqXcYMxDBaQxo5JJHWM= github.com/bytedance/gopkg v0.1.4/go.mod h1:v1zWfPm21Fb+OsyXN2VAHdL6TBb2L88anLQgdyje6R4= @@ -27,6 +28,8 @@ github.com/bytedance/sonic v1.15.1 h1:nJD5PmM0vY7J8CT6MxoqbVAAMhkSmV2HgRAUrrpLoO github.com/bytedance/sonic v1.15.1/go.mod h1:mT2NbXunuaEbnZ+mRIX/vYqKISmgEuHFDI4UzmKx2SA= github.com/bytedance/sonic/loader v0.5.1 h1:Ygpfa9zwRCCKSlrp5bBP/b/Xzc3VxsAW+5NIYXrOOpI= github.com/bytedance/sonic/loader v0.5.1/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -34,15 +37,22 @@ github.com/clipperhouse/uax29/v2 v2.7.0 h1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJ github.com/clipperhouse/uax29/v2 v2.7.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM= github.com/cloudwego/base64x v0.1.7 h1:NppS+Fgzg5ovhn4NkUXaDT3x9jldgH5ToMCqzBSi2zI= github.com/cloudwego/base64x v0.1.7/go.mod h1:Cu1PV9zfrSf7ET2tIbWbbEy7jO7HHJ13q4X2SQ8aWYg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= +github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/djherbis/atime v1.1.0/go.mod h1:28OF6Y8s3NQWwacXc5eZTsEsiMzp7LF8MbXE+XJPdBE= github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960/go.mod h1:9HQzr9D/0PGwMEbC3d5AB7oi67+h4TsQqItC1GVYG58= github.com/dprotaso/go-yit v0.0.0-20220510233725-9ba8df137936 h1:PRxIJD8XjimM5aTknUK9w6DHLDox2r2M3DI4i2pnd3w= github.com/dprotaso/go-yit v0.0.0-20220510233725-9ba8df137936/go.mod h1:ttYvX5qlB+mlV1okblJqcSMtR4c52UKxDiX9GRBS8+Q= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= @@ -63,8 +73,10 @@ github.com/gin-gonic/gin v1.12.0 h1:b3YAbrZtnf8N//yjKeU2+MQsh2mY5htkZidOM7O0wG8= github.com/gin-gonic/gin v1.12.0/go.mod h1:VxccKfsSllpKshkBWgVgRniFFAzFb9csfngsqANjnLc= github.com/go-chi/chi/v5 v5.2.5 h1:Eg4myHZBjyvJmAFjFvWgrqDTXFyOzjj7YIm3L3mu6Ug= github.com/go-chi/chi/v5 v5.2.5/go.mod h1:X7Gx4mteadT3eDOMTsXzmI4/rwUpOwBHLpAfupzFJP0= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/jsonpointer v0.23.1 h1:1HBACs7XIwR2RcmItfdSFlALhGbe6S92p0ry4d1GWg4= github.com/go-openapi/jsonpointer v0.23.1/go.mod h1:iWRmZTrGn7XwYhtPt/fvdSFj1OfNBngqRT2UG3BxSqY= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-openapi/swag/jsonname v0.26.0 h1:gV1NFX9M8avo0YSpmWogqfQISigCmpaiNci8cGECU5w= github.com/go-openapi/swag/jsonname v0.26.0/go.mod h1:urBBR8bZNoDYGr653ynhIx+gTeIz0ARZxHkAPktJK2M= github.com/go-openapi/testify/v2 v2.4.2 h1:tiByHpvE9uHrrKjOszax7ZvKB7QOgizBWGBLuq0ePx4= @@ -82,6 +94,9 @@ github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= +github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.3.2/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= github.com/goccy/go-json v0.10.6 h1:p8HrPJzOakx/mn/bQtjgNjdTcN+/S6FcG2CTtQOrHVU= github.com/goccy/go-json v0.10.6/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/goccy/go-yaml v1.19.2 h1:PmFC1S6h8ljIz6gMRBopkjP1TVT7xuwrButHID66PoM= @@ -117,6 +132,7 @@ github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= @@ -127,6 +143,8 @@ github.com/iris-contrib/httpexpect/v2 v2.15.2 h1:T9THsdP1woyAqKHwjkEsbCnMefsAFvk github.com/iris-contrib/httpexpect/v2 v2.15.2/go.mod h1:JLDgIqnFy5loDSUv1OA2j0mb6p/rDhiCqigP22Uq9xE= github.com/iris-contrib/schema v0.0.6 h1:CPSBLyx2e91H2yJzPuhGuifVRnZBBJ3pCOMbOvPZaTw= github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= +github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= +github.com/jordanlewis/gcassert v0.0.0-20250430164644-389ef753e22e/go.mod h1:ZybsQk6DWyN5t7An1MuPm1gtSZ1xDaTXS9ZjIOxvQrk= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -138,6 +156,8 @@ github.com/kataras/golog v0.1.11 h1:dGkcCVsIpqiAMWTlebn/ZULHxFvfG4K43LF1cNWSh20= github.com/kataras/golog v0.1.11/go.mod h1:mAkt1vbPowFUuUGvexyQ5NFW6djEgGyxQBIARJ0AH4A= github.com/kataras/iris/v12 v12.2.11 h1:sGgo43rMPfzDft8rjVhPs6L3qDJy3TbBrMD/zGL1pzk= github.com/kataras/iris/v12 v12.2.11/go.mod h1:uMAeX8OqG9vqdhyrIPv8Lajo/wXTtAF43wchP9WHt2w= +github.com/kataras/jwt v0.1.12/go.mod h1:xkimAtDhU/aGlQqjwvgtg+VyuPwMiyZHaY8LJRh0mYo= +github.com/kataras/neffos v0.0.24-0.20240408172741-99c879ba0ede/go.mod h1:i0dtcTbpnw1lqIbojYtGtZlu6gDWPxJ4Xl2eJ6oQ1bE= github.com/kataras/pio v0.0.13 h1:x0rXVX0fviDTXOOLOmr4MUxOabu1InVSTu5itF8CXCM= github.com/kataras/pio v0.0.13/go.mod h1:k3HNuSw+eJ8Pm2lA4lRhg3DiCjVgHlP8hmXApSej3oM= github.com/kataras/sitemap v0.0.6 h1:w71CRMMKYMJh6LR2wTgnk5hSgjVNB9KL60n5e2KHvLY= @@ -163,6 +183,7 @@ github.com/labstack/gommon v0.5.0 h1:6VSQ2NOzsnEJ5W6+84E0RbcaDDmgB6NIAzWCczTEe6c github.com/labstack/gommon v0.5.0/go.mod h1:Rzlg7HHy1maLfzBYGg9NZcVuz1sA68HHhLjhcEllYE0= github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/mailgun/raymond/v2 v2.0.48 h1:5dmlB680ZkFG2RN/0lvTAghrSxIESeu9/2aeDqACtjw= github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= github.com/mailru/easyjson v0.9.2 h1:dX8U45hQsZpxd80nLvDGihsQ/OxlvTkVUXH2r/8cb2M= @@ -173,6 +194,7 @@ github.com/mattn/go-isatty v0.0.22 h1:j8l17JJ9i6VGPUFUYoTUKPSgKe/83EYU2zBC7YNKMw github.com/mattn/go-isatty v0.0.22/go.mod h1:ZXfXG4SQHsB/w3ZeOYbR0PrPwLy+n6xiMrJlRFqopa4= github.com/mattn/go-runewidth v0.0.23 h1:7ykA0T0jkPpzSvMS5i9uoNn2Xy3R383f9HDx3RybWcw= github.com/mattn/go-runewidth v0.0.23/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= +github.com/mediocregopher/radix/v3 v3.8.1/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= @@ -184,6 +206,9 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/nats-io/nats.go v1.34.1/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8= +github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -211,17 +236,23 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.3.0 h1:k59bC/lIZREW0/iVaQR8nDHxVq8OVlIzYCOJf421CaM= github.com/pelletier/go-toml/v2 v2.3.0/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= +github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/quic-go/qpack v0.6.0 h1:g7W+BMYynC1LbYLSqRt8PBg5Tgwxn214ZZR34VIOjz8= github.com/quic-go/qpack v0.6.0/go.mod h1:lUpLKChi8njB4ty2bFLX2x4gzDqXwUpaO1DP9qMDZII= github.com/quic-go/quic-go v0.59.0 h1:OLJkp1Mlm/aS7dpKgTc6cnpynnD2Xg7C1pwL6vy/SAw= github.com/quic-go/quic-go v0.59.0/go.mod h1:upnsH4Ju1YkqpLXC305eW3yDZ4NfnNbmQRCMWS58IKU= +github.com/redis/go-redis/v9 v9.5.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= @@ -234,6 +265,8 @@ github.com/schollz/closestmatch v2.1.0+incompatible h1:Uel2GXEpJqOWBrlyI+oY9LTiy github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shirou/gopsutil/v3 v3.24.3/go.mod h1:JpND7O217xa72ewWz9zN2eIIkPWsDN/3pl0H8Qt0uwg= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w= github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g= @@ -258,6 +291,7 @@ github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/tdewolff/argp v0.0.0-20260424074207-decde4f86440/go.mod h1:t4IfmOfK1WpBPd456pTdSB4f+BuMp6CUGnV7CBzduxk= github.com/tdewolff/minify/v2 v2.24.13 h1:xrcF7gKDnUszseEY9WX9mUlZII2v2Go/QAcAwRASw58= github.com/tdewolff/minify/v2 v2.24.13/go.mod h1:emvwoYeIl8bfAKqRU5ww95LX9Gpggpqv/naal9a8Yq0= github.com/tdewolff/parse/v2 v2.8.12 h1:5BBjfaCv482v3nltlS0u6wH1xJaxjR6ofDrWttNvROg= @@ -265,6 +299,9 @@ github.com/tdewolff/parse/v2 v2.8.12/go.mod h1:Hwlni2tiVNKyzR1o6nUs4FOF07URA+JLB github.com/tdewolff/test v1.0.11/go.mod h1:XPuWBzvdUzhCuxWO1ojpXsyzsA5bFoS3tO/Q3kFuTG8= github.com/tdewolff/test v1.0.12 h1:7F21DqIajswxuche0geHdrUZRCWE4oko4b7bcmkkrxk= github.com/tdewolff/test v1.0.12/go.mod h1:XPuWBzvdUzhCuxWO1ojpXsyzsA5bFoS3tO/Q3kFuTG8= +github.com/tinylib/msgp v1.2.5/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go/codec v1.3.1 h1:waO7eEiFDwidsBN6agj1vJQ4AG7lh2yqXyOXqhgQuyY= @@ -275,6 +312,7 @@ github.com/valyala/fasthttp v1.70.0 h1:LAhMGcWk13QZWm85+eg8ZBNbrq5mnkWFGbHMUJHId github.com/valyala/fasthttp v1.70.0/go.mod h1:oDZEHHkJ/Buyklg6uURmYs19442zFSnCIfX3j1FY3pE= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= @@ -283,6 +321,9 @@ github.com/vmware-labs/yaml-jsonpath v0.3.2 h1:/5QKeCBGdsInyDCyVNLbXyilb61MXGi9N github.com/vmware-labs/yaml-jsonpath v0.3.2/go.mod h1:U6whw1z03QyqgWdgXxvVnQ90zN1BWz5V+51Ewf8k+rQ= github.com/woodsbury/decimal128 v1.4.0 h1:xJATj7lLu4f2oObouMt2tgGiElE5gO6mSWUjQsBgUlc= github.com/woodsbury/decimal128 v1.4.0/go.mod h1:BP46FUrVjVhdTbKT+XuQh2xfQaGki9LMIRJSFuh6THU= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.2.0/go.mod h1:3dlrS0iBaWKYVt2ZfA4cj48umJZ+cAEbR6/SjLA88I8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= @@ -295,12 +336,16 @@ github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJx github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= github.com/yosssi/ace v0.0.5 h1:tUkIP/BLdKqrlrPwcmH0shwEEhTRHoGnc1wFIWmaBUA= github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE= go.mongodb.org/mongo-driver/v2 v2.6.0 h1:b9sJOYrkmt4l8bY43ZenFBcPlhYIjaOfYHLtbB/5qi8= go.mongodb.org/mongo-driver/v2 v2.6.0/go.mod h1:yOI9kBsufol30iFsl1slpdq1I0eHPzybRWdyYUs8K/0= go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= @@ -355,8 +400,10 @@ golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/telemetry v0.0.0-20260409153401-be6f6cb8b1fa/go.mod h1:kHjTxDEnAu6/Nl9lDkzjWpR+bmKfxeiRuSDlsMb70gE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.42.0/go.mod h1:Dq/D+snpsbazcBG5+F9Q1n2rXV8Ma+71xEjTRufARgY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -371,10 +418,13 @@ golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c= golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI= +golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= +golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated/go.mod h1:RVAQXBGNv1ib0J382/DPCRS/BPnsGebyM1Gj5VSDpG8= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -407,3 +457,4 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= moul.io/http2curl/v2 v2.3.0 h1:9r3JfDzWPcbIklMOs2TnIFzDYvfAZvjeavG6EzP7jYs= moul.io/http2curl/v2 v2.3.0/go.mod h1:RW4hyBjTWSYDOxapodpNEtX0g5Eb16sxklBqmd2RHcE= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/internal/test/issues/issue1799/chi/out.gen.go b/internal/test/issues/issue1799/chi/out.gen.go index 55722406da..29b13ef98f 100644 --- a/internal/test/issues/issue1799/chi/out.gen.go +++ b/internal/test/issues/issue1799/chi/out.gen.go @@ -4,14 +4,16 @@ package chi import ( + "bytes" "context" "encoding/json" + "errors" "fmt" + "io" "net/http" "strings" "github.com/go-chi/chi/v5" - strictnethttp "github.com/oapi-codegen/runtime/strictmiddleware/nethttp" ) // PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody defines parameters for PostPostMultibody. @@ -276,19 +278,29 @@ type GetGetMultibodyResponseObject interface { type GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string func (response GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetGetMultibodyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string func (response GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitGetGetMultibodyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetObjectRequestObject struct { @@ -301,10 +313,15 @@ type GetObjectResponseObject interface { type GetObject200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string func (response GetObject200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetObjectResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostPostMultibodyRequestObject struct { @@ -340,8 +357,8 @@ type StrictServerInterface interface { PostPostObject(ctx context.Context, request PostPostObjectRequestObject) (PostPostObjectResponseObject, error) } -type StrictHandlerFunc = strictnethttp.StrictHTTPHandlerFunc -type StrictMiddlewareFunc = strictnethttp.StrictHTTPMiddlewareFunc +type StrictHandlerFunc func(ctx context.Context, w http.ResponseWriter, r *http.Request, request any) (any, error) +type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc type StrictHTTPServerOptions struct { RequestErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error) @@ -425,19 +442,25 @@ func (sh *strictHandler) PostPostMultibody(w http.ResponseWriter, r *http.Reques var body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody if err := json.NewDecoder(r.Body).Decode(&body); err != nil { - sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) - return + if !errors.Is(err, io.EOF) { + sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) + return + } + } else { + request.ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = &body } - request.ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = &body } if strings.HasPrefix(r.Header.Get("Content-Type"), "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") { var body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody if err := json.NewDecoder(r.Body).Decode(&body); err != nil { - sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) - return + if !errors.Is(err, io.EOF) { + sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) + return + } + } else { + request.ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body = &body } - request.ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body = &body } handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { @@ -466,10 +489,13 @@ func (sh *strictHandler) PostPostObject(w http.ResponseWriter, r *http.Request) var body PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody if err := json.NewDecoder(r.Body).Decode(&body); err != nil { - sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) - return + if !errors.Is(err, io.EOF) { + sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) + return + } + } else { + request.Body = &body } - request.Body = &body handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { return sh.ssi.PostPostObject(ctx, request.(PostPostObjectRequestObject)) diff --git a/internal/test/issues/issue1799/client/out.gen.go b/internal/test/issues/issue1799/client/out.gen.go index 9eaa5f3cd6..4e70c70ddb 100644 --- a/internal/test/issues/issue1799/client/out.gen.go +++ b/internal/test/issues/issue1799/client/out.gen.go @@ -227,7 +227,7 @@ func NewGetGetMultibodyRequest(server string) (*http.Request, error) { return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -254,7 +254,7 @@ func NewGetObjectRequest(server string) (*http.Request, error) { return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, queryURL.String(), nil) if err != nil { return nil, err } @@ -303,7 +303,7 @@ func NewPostPostMultibodyRequestWithBody(server string, contentType string, body return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), body) if err != nil { return nil, err } @@ -343,7 +343,7 @@ func NewPostPostObjectRequestWithBody(server string, contentType string, body io return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest(http.MethodPost, queryURL.String(), body) if err != nil { return nil, err } @@ -438,6 +438,14 @@ func (r GetGetMultibodyResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetGetMultibodyResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type GetObjectResponse struct { Body []byte HTTPResponse *http.Response @@ -460,6 +468,14 @@ func (r GetObjectResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r GetObjectResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostPostMultibodyResponse struct { Body []byte HTTPResponse *http.Response @@ -481,6 +497,14 @@ func (r PostPostMultibodyResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostPostMultibodyResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + type PostPostObjectResponse struct { Body []byte HTTPResponse *http.Response @@ -502,6 +526,14 @@ func (r PostPostObjectResponse) StatusCode() int { return 0 } +// ContentType is a convenience method to retrieve the Content-Type value from the HTTP response headers +func (r PostPostObjectResponse) ContentType() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Header.Get("Content-Type") + } + return "" +} + // GetGetMultibodyWithResponse request returning *GetGetMultibodyResponse func (c *ClientWithResponses) GetGetMultibodyWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetGetMultibodyResponse, error) { rsp, err := c.GetGetMultibody(ctx, reqEditors...) diff --git a/internal/test/issues/issue1799/echo/out.gen.go b/internal/test/issues/issue1799/echo/out.gen.go index c86cac46bb..846e85ae9e 100644 --- a/internal/test/issues/issue1799/echo/out.gen.go +++ b/internal/test/issues/issue1799/echo/out.gen.go @@ -4,14 +4,16 @@ package echo import ( + "bytes" "context" "encoding/json" + "errors" "fmt" + "io" "net/http" "strings" "github.com/labstack/echo/v4" - strictecho "github.com/oapi-codegen/runtime/strictmiddleware/echo" ) // PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody defines parameters for PostPostMultibody. @@ -104,23 +106,42 @@ type EchoRouter interface { TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route } +// RegisterHandlersOptions configures RegisterHandlersWithOptions. +type RegisterHandlersOptions struct { + // BaseURL is prepended to every registered path so the API can be served + // under a prefix. + BaseURL string + // OperationMiddlewares lets the caller attach per-operation middleware at + // registration time. The map key is the OpenAPI `operationId` value as it + // appears in the spec (the raw, un-normalized form). Operations that have + // no entry are registered with no extra middleware. A nil map disables + // per-operation middleware entirely. + OperationMiddlewares map[string][]echo.MiddlewareFunc +} + // RegisterHandlers adds each server route to the EchoRouter. func RegisterHandlers(router EchoRouter, si ServerInterface) { - RegisterHandlersWithBaseURL(router, si, "") + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{}) } -// Registers handlers, and prepends BaseURL to the paths, so that the paths -// can be served under a prefix. +// RegisterHandlersWithBaseURL registers handlers and prepends BaseURL to the +// paths so the API can be served under a prefix. func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL string) { + RegisterHandlersWithOptions(router, si, RegisterHandlersOptions{BaseURL: baseURL}) +} + +// RegisterHandlersWithOptions registers handlers using the supplied options, +// including any per-operation middleware. +func RegisterHandlersWithOptions(router EchoRouter, si ServerInterface, options RegisterHandlersOptions) { wrapper := ServerInterfaceWrapper{ Handler: si, } - router.GET(baseURL+"/get-multibody", wrapper.GetGetMultibody) - router.GET(baseURL+"/object", wrapper.GetObject) - router.POST(baseURL+"/post-multibody", wrapper.PostPostMultibody) - router.POST(baseURL+"/post-object", wrapper.PostPostObject) + router.GET(options.BaseURL+"/get-multibody", wrapper.GetGetMultibody, options.OperationMiddlewares["GetGetMultibody"]...) + router.GET(options.BaseURL+"/object", wrapper.GetObject, options.OperationMiddlewares["GetObject"]...) + router.POST(options.BaseURL+"/post-multibody", wrapper.PostPostMultibody, options.OperationMiddlewares["PostPostMultibody"]...) + router.POST(options.BaseURL+"/post-object", wrapper.PostPostObject, options.OperationMiddlewares["PostPostObject"]...) } @@ -134,19 +155,29 @@ type GetGetMultibodyResponseObject interface { type GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string func (response GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetGetMultibodyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string func (response GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitGetGetMultibodyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetObjectRequestObject struct { @@ -159,10 +190,15 @@ type GetObjectResponseObject interface { type GetObject200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string func (response GetObject200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetObjectResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostPostMultibodyRequestObject struct { @@ -198,8 +234,8 @@ type StrictServerInterface interface { PostPostObject(ctx context.Context, request PostPostObjectRequestObject) (PostPostObjectResponseObject, error) } -type StrictHandlerFunc = strictecho.StrictEchoHandlerFunc -type StrictMiddlewareFunc = strictecho.StrictEchoMiddlewareFunc +type StrictHandlerFunc func(ctx echo.Context, request any) (any, error) +type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { return &strictHandler{ssi: ssi, middlewares: middlewares} @@ -263,16 +299,22 @@ func (sh *strictHandler) PostPostMultibody(ctx echo.Context) error { if strings.HasPrefix(ctx.Request().Header.Get("Content-Type"), "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") { var body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody if err := ctx.Bind(&body); err != nil { - return err + if !errors.Is(err, io.EOF) { + return err + } + } else { + request.ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = &body } - request.ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = &body } if strings.HasPrefix(ctx.Request().Header.Get("Content-Type"), "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") { var body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody if err := ctx.Bind(&body); err != nil { - return err + if !errors.Is(err, io.EOF) { + return err + } + } else { + request.ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body = &body } - request.ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body = &body } handler := func(ctx echo.Context, request interface{}) (interface{}, error) { @@ -300,9 +342,12 @@ func (sh *strictHandler) PostPostObject(ctx echo.Context) error { var body PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody if err := ctx.Bind(&body); err != nil { - return err + if !errors.Is(err, io.EOF) { + return err + } + } else { + request.Body = &body } - request.Body = &body handler := func(ctx echo.Context, request interface{}) (interface{}, error) { return sh.ssi.PostPostObject(ctx.Request().Context(), request.(PostPostObjectRequestObject)) diff --git a/internal/test/issues/issue1799/fiber/out.gen.go b/internal/test/issues/issue1799/fiber/out.gen.go index ef5c49dfa0..d2867215ad 100644 --- a/internal/test/issues/issue1799/fiber/out.gen.go +++ b/internal/test/issues/issue1799/fiber/out.gen.go @@ -5,7 +5,9 @@ package fiber import ( "context" + "errors" "fmt" + "io" "strings" "github.com/gofiber/fiber/v2" @@ -47,39 +49,90 @@ type ServerInterface interface { // ServerInterfaceWrapper converts contexts to parameters. type ServerInterfaceWrapper struct { - Handler ServerInterface + Handler ServerInterface + HandlerMiddlewares []HandlerMiddlewareFunc } type MiddlewareFunc fiber.Handler +type HandlerMiddlewareFunc func(c *fiber.Ctx, next fiber.Handler) error // GetGetMultibody operation middleware func (siw *ServerInterfaceWrapper) GetGetMultibody(c *fiber.Ctx) error { - return siw.Handler.GetGetMultibody(c) + handler := func(c *fiber.Ctx) error { + return siw.Handler.GetGetMultibody(c) + } + + for i := len(siw.HandlerMiddlewares) - 1; i >= 0; i-- { + m := siw.HandlerMiddlewares[i] + next := handler + handler = func(c *fiber.Ctx) error { + return m(c, next) + } + } + + return handler(c) } // GetObject operation middleware func (siw *ServerInterfaceWrapper) GetObject(c *fiber.Ctx) error { - return siw.Handler.GetObject(c) + handler := func(c *fiber.Ctx) error { + return siw.Handler.GetObject(c) + } + + for i := len(siw.HandlerMiddlewares) - 1; i >= 0; i-- { + m := siw.HandlerMiddlewares[i] + next := handler + handler = func(c *fiber.Ctx) error { + return m(c, next) + } + } + + return handler(c) } // PostPostMultibody operation middleware func (siw *ServerInterfaceWrapper) PostPostMultibody(c *fiber.Ctx) error { - return siw.Handler.PostPostMultibody(c) + handler := func(c *fiber.Ctx) error { + return siw.Handler.PostPostMultibody(c) + } + + for i := len(siw.HandlerMiddlewares) - 1; i >= 0; i-- { + m := siw.HandlerMiddlewares[i] + next := handler + handler = func(c *fiber.Ctx) error { + return m(c, next) + } + } + + return handler(c) } // PostPostObject operation middleware func (siw *ServerInterfaceWrapper) PostPostObject(c *fiber.Ctx) error { - return siw.Handler.PostPostObject(c) + handler := func(c *fiber.Ctx) error { + return siw.Handler.PostPostObject(c) + } + + for i := len(siw.HandlerMiddlewares) - 1; i >= 0; i-- { + m := siw.HandlerMiddlewares[i] + next := handler + handler = func(c *fiber.Ctx) error { + return m(c, next) + } + } + + return handler(c) } // FiberServerOptions provides options for the Fiber server. type FiberServerOptions struct { - BaseURL string - Middlewares []MiddlewareFunc + BaseURL string + Middlewares []MiddlewareFunc + HandlerMiddlewares []HandlerMiddlewareFunc } // RegisterHandlers creates http.Handler with routing matching OpenAPI spec. @@ -90,7 +143,8 @@ func RegisterHandlers(router fiber.Router, si ServerInterface) { // RegisterHandlersWithOptions creates http.Handler with additional options func RegisterHandlersWithOptions(router fiber.Router, si ServerInterface, options FiberServerOptions) { wrapper := ServerInterfaceWrapper{ - Handler: si, + Handler: si, + HandlerMiddlewares: options.HandlerMiddlewares, } for _, m := range options.Middlewares { @@ -181,8 +235,7 @@ type StrictServerInterface interface { PostPostObject(ctx context.Context, request PostPostObjectRequestObject) (PostPostObjectResponseObject, error) } -type StrictHandlerFunc func(ctx *fiber.Ctx, args interface{}) (interface{}, error) - +type StrictHandlerFunc func(ctx *fiber.Ctx, args any) (any, error) type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { @@ -252,17 +305,23 @@ func (sh *strictHandler) PostPostMultibody(ctx *fiber.Ctx) error { var body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody if err := ctx.BodyParser(&body); err != nil { - return fiber.NewError(fiber.StatusBadRequest, err.Error()) + if !errors.Is(err, io.EOF) { + return fiber.NewError(fiber.StatusBadRequest, err.Error()) + } + } else { + request.ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = &body } - request.ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = &body } if strings.HasPrefix(string(ctx.Request().Header.ContentType()), "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") { var body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody if err := ctx.BodyParser(&body); err != nil { - return fiber.NewError(fiber.StatusBadRequest, err.Error()) + if !errors.Is(err, io.EOF) { + return fiber.NewError(fiber.StatusBadRequest, err.Error()) + } + } else { + request.ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body = &body } - request.ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body = &body } handler := func(ctx *fiber.Ctx, request interface{}) (interface{}, error) { @@ -292,9 +351,12 @@ func (sh *strictHandler) PostPostObject(ctx *fiber.Ctx) error { var body PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody if err := ctx.BodyParser(&body); err != nil { - return fiber.NewError(fiber.StatusBadRequest, err.Error()) + if !errors.Is(err, io.EOF) { + return fiber.NewError(fiber.StatusBadRequest, err.Error()) + } + } else { + request.Body = &body } - request.Body = &body handler := func(ctx *fiber.Ctx, request interface{}) (interface{}, error) { return sh.ssi.PostPostObject(ctx.UserContext(), request.(PostPostObjectRequestObject)) diff --git a/internal/test/issues/issue1799/gin/out.gen.go b/internal/test/issues/issue1799/gin/out.gen.go index 148782ee96..38c818b9d9 100644 --- a/internal/test/issues/issue1799/gin/out.gen.go +++ b/internal/test/issues/issue1799/gin/out.gen.go @@ -4,14 +4,16 @@ package gin import ( + "bytes" "context" "encoding/json" + "errors" "fmt" + "io" "net/http" "strings" "github.com/gin-gonic/gin" - strictgin "github.com/oapi-codegen/runtime/strictmiddleware/gin" ) // PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody defines parameters for PostPostMultibody. @@ -152,19 +154,29 @@ type GetGetMultibodyResponseObject interface { type GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string func (response GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetGetMultibodyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string func (response GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitGetGetMultibodyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetObjectRequestObject struct { @@ -177,10 +189,15 @@ type GetObjectResponseObject interface { type GetObject200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string func (response GetObject200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetObjectResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostPostMultibodyRequestObject struct { @@ -216,16 +233,61 @@ type StrictServerInterface interface { PostPostObject(ctx context.Context, request PostPostObjectRequestObject) (PostPostObjectResponseObject, error) } -type StrictHandlerFunc = strictgin.StrictGinHandlerFunc -type StrictMiddlewareFunc = strictgin.StrictGinMiddlewareFunc +type StrictHandlerFunc func(ctx *gin.Context, request any) (any, error) +type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc + +type StrictGinServerOptions struct { + // RequestErrorHandlerFunc is called when a request cannot be parsed or + // decoded. It is invoked for JSON bind failures, form parse/bind errors, + // multipart reader errors, media type parse errors, missing multipart + // boundaries, and request body read errors. The default returns 400. + RequestErrorHandlerFunc func(ctx *gin.Context, err error) + // HandlerErrorFunc is called when the application handler (or any + // middleware wrapping it) returns a non-nil error. The default returns 500. + HandlerErrorFunc func(ctx *gin.Context, err error) + // ResponseErrorHandlerFunc is called when the response object fails to + // serialize (Visit*Response returns an error) or when the handler returns + // an unexpected response type. The default returns 500. + ResponseErrorHandlerFunc func(ctx *gin.Context, err error) +} func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { - return &strictHandler{ssi: ssi, middlewares: middlewares} + return &strictHandler{ssi: ssi, middlewares: middlewares, options: StrictGinServerOptions{ + RequestErrorHandlerFunc: func(ctx *gin.Context, err error) { + ctx.JSON(http.StatusBadRequest, gin.H{"msg": err.Error()}) + }, + HandlerErrorFunc: func(ctx *gin.Context, err error) { + ctx.JSON(http.StatusInternalServerError, gin.H{"msg": err.Error()}) + }, + ResponseErrorHandlerFunc: func(ctx *gin.Context, err error) { + ctx.JSON(http.StatusInternalServerError, gin.H{"msg": err.Error()}) + }, + }} +} + +func NewStrictHandlerWithOptions(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc, options StrictGinServerOptions) ServerInterface { + if options.RequestErrorHandlerFunc == nil { + options.RequestErrorHandlerFunc = func(ctx *gin.Context, err error) { + ctx.JSON(http.StatusBadRequest, gin.H{"msg": err.Error()}) + } + } + if options.HandlerErrorFunc == nil { + options.HandlerErrorFunc = func(ctx *gin.Context, err error) { + ctx.JSON(http.StatusInternalServerError, gin.H{"msg": err.Error()}) + } + } + if options.ResponseErrorHandlerFunc == nil { + options.ResponseErrorHandlerFunc = func(ctx *gin.Context, err error) { + ctx.JSON(http.StatusInternalServerError, gin.H{"msg": err.Error()}) + } + } + return &strictHandler{ssi: ssi, middlewares: middlewares, options: options} } type strictHandler struct { ssi StrictServerInterface middlewares []StrictMiddlewareFunc + options StrictGinServerOptions } // GetGetMultibody operation middleware @@ -242,14 +304,13 @@ func (sh *strictHandler) GetGetMultibody(ctx *gin.Context) { response, err := handler(ctx, request) if err != nil { - ctx.Error(err) - ctx.Status(http.StatusInternalServerError) + sh.options.HandlerErrorFunc(ctx, err) } else if validResponse, ok := response.(GetGetMultibodyResponseObject); ok { if err := validResponse.VisitGetGetMultibodyResponse(ctx.Writer); err != nil { - ctx.Error(err) + sh.options.ResponseErrorHandlerFunc(ctx, err) } } else if response != nil { - ctx.Error(fmt.Errorf("unexpected response type: %T", response)) + sh.options.ResponseErrorHandlerFunc(ctx, fmt.Errorf("unexpected response type: %T", response)) } } @@ -267,14 +328,13 @@ func (sh *strictHandler) GetObject(ctx *gin.Context) { response, err := handler(ctx, request) if err != nil { - ctx.Error(err) - ctx.Status(http.StatusInternalServerError) + sh.options.HandlerErrorFunc(ctx, err) } else if validResponse, ok := response.(GetObjectResponseObject); ok { if err := validResponse.VisitGetObjectResponse(ctx.Writer); err != nil { - ctx.Error(err) + sh.options.ResponseErrorHandlerFunc(ctx, err) } } else if response != nil { - ctx.Error(fmt.Errorf("unexpected response type: %T", response)) + sh.options.ResponseErrorHandlerFunc(ctx, fmt.Errorf("unexpected response type: %T", response)) } } @@ -286,21 +346,25 @@ func (sh *strictHandler) PostPostMultibody(ctx *gin.Context) { var body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody if err := ctx.ShouldBindJSON(&body); err != nil { - ctx.Status(http.StatusBadRequest) - ctx.Error(err) - return + if !errors.Is(err, io.EOF) { + sh.options.RequestErrorHandlerFunc(ctx, err) + return + } + } else { + request.ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = &body } - request.ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = &body } if strings.HasPrefix(ctx.GetHeader("Content-Type"), "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") { var body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody if err := ctx.ShouldBindJSON(&body); err != nil { - ctx.Status(http.StatusBadRequest) - ctx.Error(err) - return + if !errors.Is(err, io.EOF) { + sh.options.RequestErrorHandlerFunc(ctx, err) + return + } + } else { + request.ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body = &body } - request.ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body = &body } handler := func(ctx *gin.Context, request interface{}) (interface{}, error) { @@ -313,14 +377,13 @@ func (sh *strictHandler) PostPostMultibody(ctx *gin.Context) { response, err := handler(ctx, request) if err != nil { - ctx.Error(err) - ctx.Status(http.StatusInternalServerError) + sh.options.HandlerErrorFunc(ctx, err) } else if validResponse, ok := response.(PostPostMultibodyResponseObject); ok { if err := validResponse.VisitPostPostMultibodyResponse(ctx.Writer); err != nil { - ctx.Error(err) + sh.options.ResponseErrorHandlerFunc(ctx, err) } } else if response != nil { - ctx.Error(fmt.Errorf("unexpected response type: %T", response)) + sh.options.ResponseErrorHandlerFunc(ctx, fmt.Errorf("unexpected response type: %T", response)) } } @@ -330,11 +393,13 @@ func (sh *strictHandler) PostPostObject(ctx *gin.Context) { var body PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody if err := ctx.ShouldBindJSON(&body); err != nil { - ctx.Status(http.StatusBadRequest) - ctx.Error(err) - return + if !errors.Is(err, io.EOF) { + sh.options.RequestErrorHandlerFunc(ctx, err) + return + } + } else { + request.Body = &body } - request.Body = &body handler := func(ctx *gin.Context, request interface{}) (interface{}, error) { return sh.ssi.PostPostObject(ctx, request.(PostPostObjectRequestObject)) @@ -346,13 +411,12 @@ func (sh *strictHandler) PostPostObject(ctx *gin.Context) { response, err := handler(ctx, request) if err != nil { - ctx.Error(err) - ctx.Status(http.StatusInternalServerError) + sh.options.HandlerErrorFunc(ctx, err) } else if validResponse, ok := response.(PostPostObjectResponseObject); ok { if err := validResponse.VisitPostPostObjectResponse(ctx.Writer); err != nil { - ctx.Error(err) + sh.options.ResponseErrorHandlerFunc(ctx, err) } } else if response != nil { - ctx.Error(fmt.Errorf("unexpected response type: %T", response)) + sh.options.ResponseErrorHandlerFunc(ctx, fmt.Errorf("unexpected response type: %T", response)) } } diff --git a/internal/test/issues/issue1799/gorilla/out.gen.go b/internal/test/issues/issue1799/gorilla/out.gen.go index 9e4a85db35..254b183a01 100644 --- a/internal/test/issues/issue1799/gorilla/out.gen.go +++ b/internal/test/issues/issue1799/gorilla/out.gen.go @@ -4,14 +4,16 @@ package gorilla import ( + "bytes" "context" "encoding/json" + "errors" "fmt" + "io" "net/http" "strings" "github.com/gorilla/mux" - strictnethttp "github.com/oapi-codegen/runtime/strictmiddleware/nethttp" ) // PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody defines parameters for PostPostMultibody. @@ -226,13 +228,13 @@ func HandlerWithOptions(si ServerInterface, options GorillaServerOptions) http.H ErrorHandlerFunc: options.ErrorHandlerFunc, } - r.HandleFunc(options.BaseURL+"/get-multibody", wrapper.GetGetMultibody).Methods("GET") + r.HandleFunc(options.BaseURL+"/get-multibody", wrapper.GetGetMultibody).Methods(http.MethodGet) - r.HandleFunc(options.BaseURL+"/object", wrapper.GetObject).Methods("GET") + r.HandleFunc(options.BaseURL+"/object", wrapper.GetObject).Methods(http.MethodGet) - r.HandleFunc(options.BaseURL+"/post-multibody", wrapper.PostPostMultibody).Methods("POST") + r.HandleFunc(options.BaseURL+"/post-multibody", wrapper.PostPostMultibody).Methods(http.MethodPost) - r.HandleFunc(options.BaseURL+"/post-object", wrapper.PostPostObject).Methods("POST") + r.HandleFunc(options.BaseURL+"/post-object", wrapper.PostPostObject).Methods(http.MethodPost) return r } @@ -247,19 +249,29 @@ type GetGetMultibodyResponseObject interface { type GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string func (response GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetGetMultibodyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string func (response GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitGetGetMultibodyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetObjectRequestObject struct { @@ -272,10 +284,15 @@ type GetObjectResponseObject interface { type GetObject200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string func (response GetObject200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetObjectResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostPostMultibodyRequestObject struct { @@ -311,8 +328,8 @@ type StrictServerInterface interface { PostPostObject(ctx context.Context, request PostPostObjectRequestObject) (PostPostObjectResponseObject, error) } -type StrictHandlerFunc = strictnethttp.StrictHTTPHandlerFunc -type StrictMiddlewareFunc = strictnethttp.StrictHTTPMiddlewareFunc +type StrictHandlerFunc func(ctx context.Context, w http.ResponseWriter, r *http.Request, request any) (any, error) +type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc type StrictHTTPServerOptions struct { RequestErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error) @@ -396,19 +413,25 @@ func (sh *strictHandler) PostPostMultibody(w http.ResponseWriter, r *http.Reques var body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody if err := json.NewDecoder(r.Body).Decode(&body); err != nil { - sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) - return + if !errors.Is(err, io.EOF) { + sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) + return + } + } else { + request.ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = &body } - request.ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = &body } if strings.HasPrefix(r.Header.Get("Content-Type"), "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") { var body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody if err := json.NewDecoder(r.Body).Decode(&body); err != nil { - sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) - return + if !errors.Is(err, io.EOF) { + sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) + return + } + } else { + request.ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body = &body } - request.ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body = &body } handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { @@ -437,10 +460,13 @@ func (sh *strictHandler) PostPostObject(w http.ResponseWriter, r *http.Request) var body PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody if err := json.NewDecoder(r.Body).Decode(&body); err != nil { - sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) - return + if !errors.Is(err, io.EOF) { + sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) + return + } + } else { + request.Body = &body } - request.Body = &body handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { return sh.ssi.PostPostObject(ctx, request.(PostPostObjectRequestObject)) diff --git a/internal/test/issues/issue1799/iris/out.gen.go b/internal/test/issues/issue1799/iris/out.gen.go index fe4f4f9058..d57447cbae 100644 --- a/internal/test/issues/issue1799/iris/out.gen.go +++ b/internal/test/issues/issue1799/iris/out.gen.go @@ -5,11 +5,12 @@ package iris import ( "context" + "errors" + "io" "net/http" "strings" "github.com/kataras/iris/v12" - strictiris "github.com/oapi-codegen/runtime/strictmiddleware/iris" ) // PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody defines parameters for PostPostMultibody. @@ -181,8 +182,8 @@ type StrictServerInterface interface { PostPostObject(ctx context.Context, request PostPostObjectRequestObject) (PostPostObjectResponseObject, error) } -type StrictHandlerFunc = strictiris.StrictIrisHandlerFunc -type StrictMiddlewareFunc = strictiris.StrictIrisMiddlewareFunc +type StrictHandlerFunc func(ctx iris.Context, request any) (any, error) +type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc func NewStrictHandler(ssi StrictServerInterface, middlewares []StrictMiddlewareFunc) ServerInterface { return &strictHandler{ssi: ssi, middlewares: middlewares} @@ -255,19 +256,25 @@ func (sh *strictHandler) PostPostMultibody(ctx iris.Context) { var body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody if err := ctx.ReadJSON(&body); err != nil { - ctx.StopWithError(http.StatusBadRequest, err) - return + if !errors.Is(err, io.EOF) { + ctx.StopWithError(http.StatusBadRequest, err) + return + } + } else { + request.ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = &body } - request.ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = &body } if strings.HasPrefix(ctx.GetHeader("Content-Type"), "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") { var body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody if err := ctx.ReadJSON(&body); err != nil { - ctx.StopWithError(http.StatusBadRequest, err) - return + if !errors.Is(err, io.EOF) { + ctx.StopWithError(http.StatusBadRequest, err) + return + } + } else { + request.ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body = &body } - request.ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body = &body } handler := func(ctx iris.Context, request interface{}) (interface{}, error) { @@ -299,10 +306,13 @@ func (sh *strictHandler) PostPostObject(ctx iris.Context) { var body PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody if err := ctx.ReadJSON(&body); err != nil { - ctx.StopWithError(http.StatusBadRequest, err) - return + if !errors.Is(err, io.EOF) { + ctx.StopWithError(http.StatusBadRequest, err) + return + } + } else { + request.Body = &body } - request.Body = &body handler := func(ctx iris.Context, request interface{}) (interface{}, error) { return sh.ssi.PostPostObject(ctx, request.(PostPostObjectRequestObject)) diff --git a/internal/test/issues/issue1799/std-http/out.gen.go b/internal/test/issues/issue1799/std-http/out.gen.go index d871a17bcb..4fc5ab39c0 100644 --- a/internal/test/issues/issue1799/std-http/out.gen.go +++ b/internal/test/issues/issue1799/std-http/out.gen.go @@ -6,13 +6,14 @@ package stdhttp import ( + "bytes" "context" "encoding/json" + "errors" "fmt" + "io" "net/http" "strings" - - strictnethttp "github.com/oapi-codegen/runtime/strictmiddleware/nethttp" ) // PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody defines parameters for PostPostMultibody. @@ -188,10 +189,10 @@ func Handler(si ServerInterface) http.Handler { return HandlerWithOptions(si, StdHTTPServerOptions{}) } -// ServeMux is an abstraction of http.ServeMux. +// ServeMux is an abstraction of [http.ServeMux]. type ServeMux interface { HandleFunc(pattern string, handler func(http.ResponseWriter, *http.Request)) - ServeHTTP(w http.ResponseWriter, r *http.Request) + http.Handler } type StdHTTPServerOptions struct { @@ -234,10 +235,10 @@ func HandlerWithOptions(si ServerInterface, options StdHTTPServerOptions) http.H ErrorHandlerFunc: options.ErrorHandlerFunc, } - m.HandleFunc("GET "+options.BaseURL+"/get-multibody", wrapper.GetGetMultibody) - m.HandleFunc("GET "+options.BaseURL+"/object", wrapper.GetObject) - m.HandleFunc("POST "+options.BaseURL+"/post-multibody", wrapper.PostPostMultibody) - m.HandleFunc("POST "+options.BaseURL+"/post-object", wrapper.PostPostObject) + m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/get-multibody", wrapper.GetGetMultibody) + m.HandleFunc(http.MethodGet+" "+options.BaseURL+"/object", wrapper.GetObject) + m.HandleFunc(http.MethodPost+" "+options.BaseURL+"/post-multibody", wrapper.PostPostMultibody) + m.HandleFunc(http.MethodPost+" "+options.BaseURL+"/post-object", wrapper.PostPostObject) return m } @@ -252,19 +253,29 @@ type GetGetMultibodyResponseObject interface { type GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string func (response GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetGetMultibodyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response string func (response GetGetMultibody200ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Response) VisitGetGetMultibodyResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type GetObjectRequestObject struct { @@ -277,10 +288,15 @@ type GetObjectResponseObject interface { type GetObject200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse string func (response GetObject200ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsResponse) VisitGetObjectResponse(w http.ResponseWriter) error { + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(response); err != nil { + return err + } w.Header().Set("Content-Type", "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") w.WriteHeader(200) - - return json.NewEncoder(w).Encode(response) + _, err := buf.WriteTo(w) + return err } type PostPostMultibodyRequestObject struct { @@ -316,8 +332,8 @@ type StrictServerInterface interface { PostPostObject(ctx context.Context, request PostPostObjectRequestObject) (PostPostObjectResponseObject, error) } -type StrictHandlerFunc = strictnethttp.StrictHTTPHandlerFunc -type StrictMiddlewareFunc = strictnethttp.StrictHTTPMiddlewareFunc +type StrictHandlerFunc func(ctx context.Context, w http.ResponseWriter, r *http.Request, request any) (any, error) +type StrictMiddlewareFunc func(f StrictHandlerFunc, operationID string) StrictHandlerFunc type StrictHTTPServerOptions struct { RequestErrorHandlerFunc func(w http.ResponseWriter, r *http.Request, err error) @@ -401,19 +417,25 @@ func (sh *strictHandler) PostPostMultibody(w http.ResponseWriter, r *http.Reques var body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody if err := json.NewDecoder(r.Body).Decode(&body); err != nil { - sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) - return + if !errors.Is(err, io.EOF) { + sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) + return + } + } else { + request.ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = &body } - request.ApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsBody = &body } if strings.HasPrefix(r.Header.Get("Content-Type"), "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams2\"") { var body PostPostMultibodyApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2RequestBody if err := json.NewDecoder(r.Body).Decode(&body); err != nil { - sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) - return + if !errors.Is(err, io.EOF) { + sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) + return + } + } else { + request.ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body = &body } - request.ApplicationLdPlusJSONProfilehttpswwwW3Orgnsactivitystreams2Body = &body } handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { @@ -442,10 +464,13 @@ func (sh *strictHandler) PostPostObject(w http.ResponseWriter, r *http.Request) var body PostPostObjectApplicationLdPlusJSONProfilehttpswwwW3OrgnsactivitystreamsRequestBody if err := json.NewDecoder(r.Body).Decode(&body); err != nil { - sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) - return + if !errors.Is(err, io.EOF) { + sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) + return + } + } else { + request.Body = &body } - request.Body = &body handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { return sh.ssi.PostPostObject(ctx, request.(PostPostObjectRequestObject))