fix(deps): update module github.com/oapi-codegen/oapi-codegen/v2 to v2.8.0#996
Merged
dimuon merged 2 commits intoJul 18, 2026
Merged
Conversation
Contributor
Author
ℹ Artifact update noticeFile name: go.modIn order to perform the update(s) described in the table above, Renovate ran the
Details:
|
elastic-renovate-prod
Bot
force-pushed
the
renovate/github.com-oapi-codegen-oapi-codegen-v2-2.x
branch
from
May 15, 2026 09:39
3769f67 to
05665f2
Compare
auto-merge was automatically disabled
May 15, 2026 23:01
Pull request was closed
dimuon
enabled auto-merge (squash)
July 16, 2026 08:44
elastic-renovate-prod
Bot
force-pushed
the
renovate/github.com-oapi-codegen-oapi-codegen-v2-2.x
branch
from
July 16, 2026 08:53
71ec260 to
b2836bb
Compare
Contributor
Author
ℹ️ Artifact update noticeFile name: go.modIn order to perform the update(s) described in the table above, Renovate ran the
Details:
|
elastic-renovate-prod
Bot
force-pushed
the
renovate/github.com-oapi-codegen-oapi-codegen-v2-2.x
branch
15 times, most recently
from
July 17, 2026 14:50
944269a to
a047e44
Compare
elastic-renovate-prod
Bot
force-pushed
the
renovate/github.com-oapi-codegen-oapi-codegen-v2-2.x
branch
from
July 17, 2026 14:52
e5ac2a3 to
7c494bb
Compare
dimuon
approved these changes
Jul 18, 2026
elastic-renovate-prod
Bot
force-pushed
the
renovate/github.com-oapi-codegen-oapi-codegen-v2-2.x
branch
from
July 18, 2026 20:23
367ed3b to
a2aaba6
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
v2.6.0→v2.8.0Release Notes
oapi-codegen/oapi-codegen (github.com/oapi-codegen/oapi-codegen/v2)
v2.8.0: : OpenAPI 3.1, fewer assumptions, and a giant bug huntCompare Source
OpenAPI 3.1, webhooks, callbacks, and a lot of polish
This is a big one. After a long stretch of internal refactoring across the last couple of releases, we've been able to land some features that have been on the wishlist for years, most notably initial OpenAPI 3.1 support. As always, the full, automatically-generated changelog is at the bottom, and the sections below call out the things you'll actually want to read before upgrading.
When this project was originally released, it supported a narrow set of OpenAPI features, and over time, it has grown from generating code for hand crafted, structurally tight specifications, to very complex, and often messy specifications. I don't think we can ever handle every specification, however, over time, we're going to give users control over as many behaviors as possible, so that our assumptions, which can't be right for everyone, are configurable. More changes of this form will continue to come in the upcoming releases.
Before you upgrade
A couple of housekeeping notes up front:
runtimev1.6.0 or newer. Several features in this release (the newDurationtype, escaped-path-parameter handling, typed response headers) rely on functionality that landed in the runtime, so make sure you're ongithub.com/oapi-codegen/runtimev1.6.0+ when you regenerate.☢️ Breaking changes
We try hard to avoid breaking changes, and when we can't, to make them narrow or configurable.
Trailing-slash routes on the
net/httpserver no longer act as catch-alls (#2460)This one only affects the standard-library
net/httpserver (the one built onServeMux). It's a correctness fix, which is why we decided to just do it rather than hide it behind a flag.Here's the problem: a
ServeMuxpattern ending in/matches the entire subtree beneath it, but an OpenAPI path ending in/means exactly that path and nothing deeper. So we were both mismatching the spec's semantics and, worse, panicking at registration time when two such patterns overlapped ambiguously. We now anchor any trailing-slash path with{$}so it matches only what the spec says it should.The result: if your spec has trailing-slash paths, requests to deeper URLs that used to get swallowed by the catch-all will now correctly return
404. (ServeMuxstill issues its usual307redirect from the un-slashed path to the canonical one.) If you were relying on the old subtree behavior, that was never what your spec actually declared.Security scopes are no longer emitted by default (#2440)
Generated servers used to emit per-scheme context key types (
bearerAuthContextKeyand friends), scope constants (BearerAuthScopes), and per-operation context stores that flattened your spec'ssecurityrequirements into the request context. We've stopped emitting these by default.The reason is that this machinery is fundamentally broken: it can't represent alternative (OR), combined (AND), or anonymous (
{}) security requirements, so it quietly encourages people to build authorization logic on top of a representation that doesn't actually capture what the spec says. Authentication and authorization belong in the request validation middleware, which evaluates the real security requirements directly.If you genuinely need the old emission back, there's an opt-in flag:
We'd encourage you to migrate to the validation middleware instead, but the flag is there if you need a bridge.
🎉 Notable changes
OpenAPI 3.1 support (#2336)
Finally, after several years of requests, we've been able to close #373, adding OpenAPI 3.1 support. We've added support for callbacks and webhooks, and we support several OpenAPI 3.1 idioms, such as flexible enums via oneOf, as well as
type: [T, "null"]-style nullability. This is initial support, so we'd love to hear about the specs it doesn't yet handle well.While
oapi-codegenwould love to see an increase in sponsorship to make the project more sustainable, if we had to choose, we'd prefer to see that money go upstream to kin-openapi, which is the OpenAPI library that powers us and a large part of the Go ecosystem.We're working to sponsor Pierre, the solo kin-openapi maintainer, with a significant portion of our own funds, and really hope that y'all consider sponsorship to support the important work that he does.
The OpenAPI 3.1 support in kin-openapi wouldn't have been possible without Pierre's maintainership, and a number of external contributors.
Optionally hoist anonymous schemas into named types (#2366)
You can now opt in to having every anonymous, inline schema hoisted into a top-level named type, with a name derived from its location (path) in the spec. If you've ever wanted a real, referenceable Go type for some deeply-nested inline object instead of an anonymous struct, this is for you.
We now validate the spec before generating (#2435)
oapi-codegenhas always been extremely permissive about the specs it accepts, which is great until a malformed spec leads to non-compiling generated code and a confusing debugging session. We now run a validation pass over the spec before code generation, which lets us catch a class of errors that are hard to detect during codegen and abort early with a meaningful error message instead of emitting broken Go. As a bonus, this makes us considerably more resilient to malicious or garbage input.Handlers are now registered in spec order (#2465, #2477)
Some routers make matching decisions based on the order in which handlers are registered. To make behavior predictable and match your intent, we now emit route registrations in the same order the paths appear in your spec, so you have control of the order by controlling the order in which you declare them. To go back to the previous behavior, add this to your configuration:
format: durationnow maps to a realDurationtype (#2458)A
type: string, format: durationschema used to fall through to a plain Gostring, leaving all the parsing and validation up to you. The runtime now ships an RFC 3339Durationtype (added in runtime v1.5.0), and the default type mapping resolvesformat: durationto it, right alongside the other formats likedate,uuid,email, andbinary.This does change the generated type for specs already using
format: duration. If you'd rather keep the old plain-stringbehavior, map the format back explicitly in your config:The rest of the notables and new features
A quick rundown of the other behavior-affecting changes worth knowing about:
{}entry in asecuritylist (i.e. "auth optional here") is now handled correctly.deprecatedGodoc is emitted correctly (#2405, thanks @jamietanna) — deprecation markers now land on the right declarations so your tooling actually flags them.There's a great deal more in the way of bug fixes below — this release fixes a large batch of long-standing issues in the aggregate-type (
allOf/anyOf/oneOf), discriminator, and external-$refcode paths. Thank you to everyone who reported issues and sent PRs.☢️ Breaking changes
🎉 Notable changes
🚀 New features and improvements
🐛 Bug fixes
📝 Documentation updates
👻 Maintenance
golangci-lint's install script onmain(#2376) @jamietannamake tidy(#2374) @jamietanna📦 Dependency updates
33 changes
Sponsors
We would like to thank our sponsors for their support during this release.
We'd also like to thank Greptile for allowing our project to use their code review system.
v2.7.2: More fixes for code injection issuesCompare Source
String escaping fixes due to more code injection issues
We've had two more code injection issues reported in
oapi-codegen, thanks @Gal3M, @mrostamipoor for these findings.These specific issues are now patches in the main branch and in this v2.7.2 release.
You shouldn't blindly trust OpenAPI specs
This code wasn't originally written assuming code generation from random specs from the internet, and it never took any measures to protect itself from malicious specifications, the assumption being that you control your specification, and that you actually look over generated code.
For example, all these RCE exploits rely on using the package
init()function in the generated code to run some malicious code at package startup. A way to test for this is to see whether aninit()function is emitted, which we currently don't do.When working with OpenAPI specifications, especially specs you find on remote servers, you should download the spec locally, run some kind of spec validator on it, like openapi-spec-validator, and only then feed it into oapi-codegen. We're very permissive in accepting broken specifications, intentionally, since people feed a lot of garbage input, but this flexibility also makes us weak to these kinds of attacks. There are hundreds of injection sites in
oapi-codegenbased on my survey.For the next minor release,
v2.8.0, we're going to validate the spec before code generation (#2435), however, since this introduces a new set of failure modes, I don't want to include it in a maintenance release version. The future release is resilient against many forms of injection, and the spec validation has the added benefit that it can generate meaningful error messages for garbage input, where currently, we generate non-compiling code.Until then, please do sanity checks on your input specifications, on the generated output, and don't fetch specs from the internet in your build, commit both the spec locally into your source control, and go through code review. In our repo, we've hooked up Greptile to catch issues like this, and you should also use some code quality tool. We can't possibly protect against every kind of attack with simple heuristics.
Sponsors
We would like to thank our sponsors for their support during this release.
We'd also like to thank Greptile for allowing our project to use their code review system.
v2.7.1: Security fix for Go code injectionCompare Source
This is a security fix for a code injection vulnerability in v2.7.0, please see:
GHSA-rjwr-m7qx-3fjr
We're more strict about escaping strings passed into the OpenAPI specification, so that people can't inject Go code into generated code.
The problem was that it was possible to craft a description for server URL's which would emit arbitrary Go code, so if an attacker controlled your specification, they could inject Go code into your generated code which could do something malicious.
v2.7.0: : Squashing bugs, many bugs (and adding some features)Compare Source
Many improvements and even more bug fixes
This
v2.7.0release ofoapi-codegencontains quite a bit of internal refactoring, focused on our most historically fragile code paths, which relate to the aggregate types (allOf/anyOf/oneOf),$refto external specs, enums, and the spec traversal logic missing quite a few leaf nodes where models should have been generated, but were skipped.The biggest changes are explicitly described in the sections below, and the full list of commits is at the bottom.
Thank you to all contributors, we've been going through all past PR's and updating them and merging where we can, and thanks to all our users for reporting issues that you hit.
I've (@mromaszewicz) used a lot of LLM help here to scrub through old issues and do some deep internal refactoring to address common problem areas. I intend to continue doing this, since the conditional generation logic is getting quite complicated. When I originally released
oapi-codegen, the use case was much simpler, all the models were under#/components/schemas, and all the references to them were in the requests, responses, etc. I never imagine how many things would be external references or unions, and how many complex OpenAPI specifications people would be generating code for. The initial design was never flexible enough to handle that, so ongoing bug fixes are getting increasingly complex due to edge cases. This version has a lot of internal changes you won't see as a user, but the way we handle type generation internally is unifying lots of copy/paste re-implementations into reusable code for consistency. Most of these changes can be done transparently, but some can't, so, onto the changes:Code generation changes which might require some changes on your end
This release contains three changes, all very narrow in scope, which will require some manual adjustment of your own code. We've decided that these are small enough and uncommon enough not to require opt-in, which causes internal complexity. It's always a judgment call with these. If we got it wrong, we're happy to revisit it in a maintenance release.
Strict-server external response refs require strict-server generation in both packages (#2357)
If your strict-server spec uses an external
$refto acomponents/responses/...defined in another spec, that otherspec must also be generated with
strict-server: true. Add it to the source spec's config and regenerate:This restores the v2.0.0 behavior that lets you cast response models across package boundaries — the standard pattern
for sharing error models (e.g. a common
400) across services. PR #1387 had silently changed the embedded type fromN400JSONResponseto the bareexternalRef0.N400, so the local and external response structs no longer hadmatching types and casts stopped compiling.
Many more anonymous inner schemas are now hoisted into top level schemas
Inline
oneOf,anyOf, andadditionalPropertiesschemas embedded directly under an operation's request or responsebody now flow through the same boilerplate-emission pipeline as
components/schemas, so they get theAs*/From*/Merge*accessor methods they were previously missing. As part of that change, two older naming patternsare replaced with one pattern, shared with all components:
In practice, we think this shouldn't break anyone, because this change addresses a bug which produced pointless types
with no benefit, and you never interact with these directly, but rather you'd call an accessor on a field of a model.
Strict middleware typedefs are now inlined (#2271)
StrictHandlerFuncandStrictMiddlewareFuncin generated strict-server code are now inline type definitions insteadof aliases to
github.com/oapi-codegen/runtime/strictmiddleware/<framework>. Generated servers no longer import that package.Before (Echo example):
After:
If your code referenced the per-framework names directly —
strictecho.StrictEchoHandlerFunc,strictgin.StrictGinHandlerFunc,strictnethttp.StrictHTTPHandlerFunc,strictiris.StrictIrisHandlerFunc,strictecho5.StrictEcho5HandlerFunc— switch to the localStrictHandlerFunc/StrictMiddlewareFuncexposed by the generated server package, or importruntime/strictmiddleware/<framework>yourself if you really want those names. The underlying signatures are unchanged, so any value satisfying the old type still satisfies the new one.🎉 Notable changes
Go 1.24 required (#2264)
oapi-codegenitself now requires Go 1.24.4+ to build and run. The toolchain in your project'sgo.mod(the one used to invoke the codegen) must be ≥ 1.24.4. The code generated will still likely work on older versions. We had to update to Go 1.24 in order to update some dependencies to address vulnerabilities. Go 1.24 is no longer supported, so our next release will update to Go 1.25,and the plan is to stay on supported Go versions. I'm not sure if 1.25 will come in v2.8.0 or v2.7.1 yet, but it's imminent. We
have a number of submodules in this repo which exist only to test Go 1.25 routers in a 1.24 module, and it allows us to
simplify.
Unfortunately, some of our transitive dependencies result in a broken build, by default, so you might have to pin these
packages to specific versions:
Multi-pass type name resolution (#2213)
Set
output-options.resolve-type-name-collisions: trueto make the codegen detect identifier collisions across schemas, parameters, request bodies, response components, and operation-derived types — and resolve them deterministically by suffixing the loser. Specs that previously failed to generate because two definitions wanted the same Go name now succeed.Trivial example. With this spec:
output-options.resolve-type-name-collisions: trueproduces:Collision resolution is opt-in. Generated identifier names depend on the current set of collisions in the spec;
adding a new schema or parameter later that collides with an existing one will rename the existing one to break the new collision.
That can silently break user code that imports the previously-stable name as the spec drifts. However, despite the drift,
more specs can now correctly generate boilerplate.
Parameter binding matrix (#2307)
The OpenAPI parameter
style×explode×typematrix is now fully supported and round-trips consistently acrossevery server backend. Path/query/header/cookie parameters across primitive, array, and object types — including
style: form / spaceDelimited / pipeDelimited / deepObject×explode: true/false, andstyle: simplefor headers —generate the same binding logic on every server, and the client-side encoding is symmetric. The internal parameter test suite (
internal/test/parameters/) now exercises every combination through a server round-trip per backend.If you previously hit an
unsupported styleerror, or saw a parameter serialization work under one backend but not another,regenerate and the issue should be gone.
You will need to use version
v1.4.0or higher ofgithub.com/oapi-codegen/runtime.Optional / nullable response headers (#2301)
For strict-server responses, optional and nullable headers now generate as pointer fields (or
nullable.Nullable[T]when the
nullable-typesoutput option is set). The generated server only callsw.Header().Set(...)when the fieldis non-nil, so callers can omit optional headers cleanly.
Spec:
Before:
After:
To opt out of this change, set
compatibility.headers-implicitly-required: trueto restore the previous always-required behavior. This change breaks enough code that we flagified it.🚀 New features
Echo v5 server support (#2188)
Echo v5 (the upcoming major version) is now a supported server framework. Generate with
generate.echo5-server: true. Echo v4 is unchanged and remains the target ofgenerate.echo-server.Per-handler middleware in Fiber (#2302)
Fiber generated servers now accept a
HandlerMiddlewares []HandlerMiddlewareFuncslice inFiberServerOptions, applied around every operation handler. The middleware signature isfunc(c *fiber.Ctx, next fiber.Handler) error, matching Fiber's native middleware pattern. Useful for cross-cutting concerns (auth, logging, metrics) that should run after path-level routing but inside the generated-handler boundary.Per-operation middleware in Echo (#2353)
Echo's
RegisterHandlersWithOptionsnow accepts anOperationMiddlewares map[string][]echo.MiddlewareFunckeyed byoperationId, attaching middleware to specific operations at registration time:Operations with no entry in the map (or a
nilmap) are registered with no extra middleware. Available for both Echo v4 and Echo v5 generated servers.Strict-gin error handlers (#1600)
The Gin strict server now exposes
RequestErrorHandlerFuncandResponseErrorHandlerFunconStrictServerOptions, matching the pattern already available for the Echo strict server. Bind errors and response-write errors flow through your custom handler instead of using gin's default abort behaviour. Defaults are preserved if you don't set them.☢️ Breaking changes
🎉 Notable changes
🚀 New features and improvements
🐛 Bug fixes
Configuration
📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 Automerge: Enabled.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR has been generated by Renovate Bot.