getValue records skipped wildcard siblings whenever it prefers a static
branch, but two dead ends inside the param case returned "not found"
without consulting that stack:
- more path remains but the param node has no child to descend into
- the param node consumed the whole path but has no handler registered
Example: with routes /:p0/:p1 and /bc/:p1/a registered, a request for
/bc/bc returned 404 instead of matching /:p0/:p1.
Both dead ends now roll back to the last valid skippedNode, consistent
with the existing fallback at the other dead ends. The rollback loop,
previously duplicated inline at three call sites, is extracted into
rollbackToSkippedNode and reused at all five.
* fix(tree): panic in findCaseInsensitivePathRec with RedirectFixedPath enabled
When RedirectFixedPath is enabled and a request doesn't match any route,
findCaseInsensitivePathRec panics with "invalid node type". This happens
because it accesses children[0] to find the wildcard child, but addChild()
keeps the wildcard child at the end of the array (not the beginning).
When a node has both static and wildcard children, children[0] is a static
node, so the switch on nType falls through to the default panic case.
The fix mirrors what getValue() already does correctly (line 483):
use children[len(children)-1] to access the wildcard child.
Fixes#2959
* Address review feedback: improve test assertions and prefer static routes in case-insensitive lookup
- Assert found=false for non-matching paths instead of only checking for panics
- Fix expected casing for case-insensitive static route match (/PREFIX/XXX -> /prefix/xxx)
- Update findCaseInsensitivePathRec to try static children before falling back to
wildcard child, ensuring static routes win over param routes in case-insensitive matching
---------
Co-authored-by: Bo-Yi Wu <appleboy.tw@gmail.com>
- Update linting configuration to exclude G115 gosec check instead of including specific checks
- Add the safeInt8 helper for safer type conversions and use it to prevent int8 overflow in middleware handler execution
- Group related constants and variables together for better organization in gin.go
- Refactor HTTP server instantiation to use a dedicated http.Server object for all Run methods
- Add the safeUint16 helper and use it to safely handle conversions in tree node functions to prevent uint16 overflow
Signed-off-by: appleboy <appleboy.tw@gmail.com>
* fix: catch-all conflicting wildcard
* add: test cases
* chore: update GitHub Actions configuration (#3792)
- Change the cron schedule from `'0 17 * * 5'` to `"0 17 * * 5"` in the file `.github/workflows/codeql.yml`
- Change the value of `language` from `['go']` to `["go"]` in the file `.github/workflows/codeql.yml`
- Change the value of `go-version` from `'^1.18'` to `"^1.18"` in the file `.github/workflows/gin.yml`
- Add `1.21` to the list of `go` versions and change the value of `test-tags` in the file `.github/workflows/gin.yml`
- Change the value of `if` condition from `matrix.go-version == '1.20.x'` to `matrix.go-version == '1.21.x'` in the file `.github/workflows/gin.yml`
- Change the value of `on` from `'*'` to `"*"` in the file `.github/workflows/goreleaser.yml`
- Change the name of the job from `name: Checkout` to `name: Checkout` in the file `.github/workflows/goreleaser.yml`
- Change the name of the job from `name: Set up Go` to `name: Set up Go` in the file `.github/workflows/goreleaser.yml`
- Change the value of `go-version` from `1.20` to `"^1"` in
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
* chore(deps): bump github/codeql-action from 2 to 3 (#3806)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2 to 3.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/v2...v3)
---
updated-dependencies:
- dependency-name: github/codeql-action
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* fix(sec): upgrade golang.org/x/crypto to 0.17.0 (#3832)
* ci(lint): update tooling and workflows for consistency (#3834)
* chore: update tooling and workflows for consistency
- Update the version of a tool in the GitHub workflow from `v1.52.2` to `v1.55.2`
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
* chore: refactor linter configuration in CI
- Remove the `depguard` linter from the `.golangci.yml` configuration
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
* ci: refine CI workflow and test configurations
- Disable caching in the GitHub Actions workflow for `gin.yml`
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
* refactor: refactor return logic in tree operations
- Modify multiple return statements in `tree.go` to return a specific value instead of nothing
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
---------
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
* chore(deps): update dependencies to latest versions (#3835)
* chore: update dependencies to latest versions
- Update `sonic` library from `v1.9.1` to `v1.10.2`
- Update `validator` library from `v10.16.0` to `v10.17.0`
- Update `go-isatty` library from `v0.0.19` to `v0.0.20`
- Update `go/codec`, `x/net`, and `protobuf` libraries to newer versions
- Update `base64x` to a newer commit and add `iasm` library as an indirect dependency
- Update `mimetype`, `cpuid`, `go-urn`, `x/arch`, `x/crypto`, and `x/sys` libraries to newer versions
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
* ci: refactor CI workflows and improve robustness
- Update GitHub Actions cache from v3 to v4 in the workflow configuration
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
---------
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
* wip: fix tests
* wip: fix tests
---------
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Bo-Yi Wu <appleboy.tw@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: caption <101684156+chncaption@users.noreply.github.com>
* chore: update tooling and workflows for consistency
- Update the version of a tool in the GitHub workflow from `v1.52.2` to `v1.55.2`
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
* chore: refactor linter configuration in CI
- Remove the `depguard` linter from the `.golangci.yml` configuration
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
* ci: refine CI workflow and test configurations
- Disable caching in the GitHub Actions workflow for `gin.yml`
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
* refactor: refactor return logic in tree operations
- Modify multiple return statements in `tree.go` to return a specific value instead of nothing
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
---------
Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com>
* Fix conflict between param and exact path
Signed-off-by: Yue Yang <g1enyy0ung@gmail.com>
* Add test
Signed-off-by: Yue Yang <g1enyy0ung@gmail.com>
* Fix prefix conflict in exact paths
Signed-off-by: Yue Yang <g1enyy0ung@gmail.com>
* Use backtracking
Signed-off-by: Yue Yang <g1enyy0ung@gmail.com>
* Fix panic
Signed-off-by: Yue Yang <g1enyy0ung@gmail.com>
* fix(tree): assign fullpath to current node by fullpath of new node if current node the same new node
* test(router-test): reverse the order when register router when test func GetFullPath
* chg(tree-test): update test case with register new route in TestRouteContextHoldsFullPath
Co-authored-by: vinhha <vinhha@vng.com.vn>
Co-authored-by: Bo-Yi Wu <appleboy.tw@gmail.com>