Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
5014 commits
Select commit Hold shift + click to select a range
0e934f5
build(deps): bump gofr.dev in /pkg/gofr/datasource/file/sftp (#3032)
dependabot[bot] Feb 24, 2026
0bb40f5
build(deps): bump gofr.dev in /pkg/gofr/datasource/file/ftp (#3028)
dependabot[bot] Feb 24, 2026
ccc7ee6
build(deps): bump google.golang.org/api in /pkg/gofr/datasource/file/…
dependabot[bot] Feb 24, 2026
4025947
build(deps): bump gofr.dev in /pkg/gofr/datasource/file/s3 (#3031)
dependabot[bot] Feb 24, 2026
1d58120
build(deps): bump gofr.dev in /pkg/gofr/datasource/pubsub/eventhub (#…
dependabot[bot] Feb 24, 2026
fcc4470
Fix/config parsing. (#2963)
MOHITKOURAV01 Feb 24, 2026
e638311
build(deps): bump github.com/nats-io/nats-server/v2 (#3037)
dependabot[bot] Feb 25, 2026
ca463e6
fix: resolve data race in kafka Subscribe method (#2959)
sreenivasivbieb Feb 27, 2026
6cf0065
fix: append path separator in isRestrictedFile to prevent sibling dir…
coolwednesday Feb 27, 2026
4c0717c
feat(sqs): add span links for pub/sub tracing (#3018)
rohansood10 Feb 27, 2026
33c1816
feat(migration): add Oracle migration locks management (#3004)
QUBITABHAY Feb 27, 2026
38a609c
feat(google): add span links for pub/sub tracing (#3019)
rohansood10 Feb 27, 2026
1d5232d
build(deps): bump go.opentelemetry.io/otel/trace (#3097)
dependabot[bot] Mar 3, 2026
d8c94eb
build(deps): bump go.opentelemetry.io/otel/trace (#3093)
dependabot[bot] Mar 3, 2026
f2af4a2
build(deps): bump go.opentelemetry.io/otel/trace (#3094)
dependabot[bot] Mar 3, 2026
5aa70b0
build(deps): bump go.opentelemetry.io/otel/trace (#3091)
dependabot[bot] Mar 3, 2026
9c031d9
build(deps): bump go.opentelemetry.io/otel/trace (#3088)
dependabot[bot] Mar 3, 2026
7be2eb1
build(deps): bump go.opentelemetry.io/otel/trace (#3087)
dependabot[bot] Mar 3, 2026
35cc60a
build(deps): bump go.opentelemetry.io/otel (#3085)
dependabot[bot] Mar 3, 2026
8648e0b
build(deps): bump go.opentelemetry.io/otel in /pkg/gofr/datasource/so…
dependabot[bot] Mar 3, 2026
8afabe6
build(deps): bump go.opentelemetry.io/otel (#3080)
dependabot[bot] Mar 3, 2026
0f84aad
build(deps): bump go.opentelemetry.io/otel (#3077)
dependabot[bot] Mar 3, 2026
674f986
build(deps): bump go.opentelemetry.io/otel (#3076)
dependabot[bot] Mar 3, 2026
3d293e7
build(deps): bump go.opentelemetry.io/contrib/instrumentation/net/htt…
dependabot[bot] Mar 3, 2026
2c51dac
build(deps): bump go.opentelemetry.io/otel in /pkg/gofr/datasource/mo…
dependabot[bot] Mar 3, 2026
5e891f0
build(deps): bump go.opentelemetry.io/contrib/instrumentation/net/htt…
dependabot[bot] Mar 3, 2026
8194510
build(deps): bump actions/upload-artifact from 6 to 7 (#3053)
dependabot[bot] Mar 5, 2026
623d042
build(deps): bump go.opentelemetry.io/otel (#3072)
dependabot[bot] Mar 5, 2026
22c5d6f
build(deps): bump go.opentelemetry.io/otel (#3070)
dependabot[bot] Mar 5, 2026
bcbfb34
build(deps): bump go.opentelemetry.io/otel (#3068)
dependabot[bot] Mar 5, 2026
9d5f9f2
build(deps): bump go.opentelemetry.io/otel (#3062)
dependabot[bot] Mar 5, 2026
f3d5e95
build(deps): bump go.opentelemetry.io/otel (#3067)
dependabot[bot] Mar 5, 2026
fc828e4
build(deps): bump go.opentelemetry.io/otel (#3065)
dependabot[bot] Mar 5, 2026
e39ca58
build(deps): bump go.opentelemetry.io/otel/exporters/prometheus (#3056)
dependabot[bot] Mar 5, 2026
7b49d55
build(deps): bump go.opentelemetry.io/otel (#3060)
dependabot[bot] Mar 5, 2026
ddc6692
build(deps): bump github.com/alicebob/miniredis/v2 from 2.36.1 to 2.3…
dependabot[bot] Mar 5, 2026
84dbe08
build(deps): bump go.opentelemetry.io/otel (#3059)
dependabot[bot] Mar 5, 2026
1f62d28
build(deps): bump actions/download-artifact from 7 to 8 (#3051)
dependabot[bot] Mar 5, 2026
c90bfab
build(deps): bump crate-ci/typos from 1.43.5 to 1.44.0 in the actions…
dependabot[bot] Mar 5, 2026
1c2b043
fix: resolve PubSub migration conflict by decoupling from version cha…
coolwednesday Mar 6, 2026
078ed61
build(deps): bump go.opentelemetry.io/otel/sdk (#3139)
dependabot[bot] Mar 10, 2026
4d4d307
build(deps): bump go.opentelemetry.io/otel/trace (#3137)
dependabot[bot] Mar 10, 2026
64f58a3
build(deps): bump google.golang.org/api in /pkg/gofr/datasource/file/…
dependabot[bot] Mar 10, 2026
f63d0f2
build(deps): bump go.opentelemetry.io/otel/trace (#3133)
dependabot[bot] Mar 10, 2026
c6b1d68
build(deps): bump go.opentelemetry.io/otel/trace (#3130)
dependabot[bot] Mar 10, 2026
61ad47e
build(deps): bump go.opentelemetry.io/otel/trace (#3129)
dependabot[bot] Mar 10, 2026
6108619
build(deps): bump go.opentelemetry.io/otel/trace (#3128)
dependabot[bot] Mar 10, 2026
1a02c86
build(deps): bump go.opentelemetry.io/otel/trace (#3134)
dependabot[bot] Mar 10, 2026
2e466c1
build(deps): bump go.opentelemetry.io/otel/trace (#3127)
dependabot[bot] Mar 10, 2026
86b4e10
build(deps): bump go.opentelemetry.io/otel/trace (#3131)
dependabot[bot] Mar 10, 2026
423ef04
build(deps): bump go.opentelemetry.io/otel/trace (#3125)
dependabot[bot] Mar 10, 2026
9cf5a95
build(deps): bump go.opentelemetry.io/otel/trace (#3126)
dependabot[bot] Mar 10, 2026
0279052
build(deps): bump go.opentelemetry.io/otel/trace (#3124)
dependabot[bot] Mar 10, 2026
816a144
build(deps): bump go.opentelemetry.io/otel/exporters/zipkin (#3106)
dependabot[bot] Mar 10, 2026
a1395d5
build(deps): bump go.opentelemetry.io/otel/trace (#3123)
dependabot[bot] Mar 10, 2026
c96630e
build(deps): bump go.opentelemetry.io/otel/trace (#3135)
dependabot[bot] Mar 10, 2026
9d86bf7
build(deps): bump go.opentelemetry.io/otel/trace (#3122)
dependabot[bot] Mar 10, 2026
7842518
build(deps): bump go.opentelemetry.io/otel/trace (#3121)
dependabot[bot] Mar 10, 2026
45d3959
build(deps): bump go.opentelemetry.io/otel/trace (#3120)
dependabot[bot] Mar 10, 2026
0a6614b
build(deps): bump go.opentelemetry.io/otel/trace (#3136)
dependabot[bot] Mar 10, 2026
f89c0e0
build(deps): bump golang.org/x/time from 0.14.0 to 0.15.0 (#3116)
dependabot[bot] Mar 10, 2026
8188b5c
build(deps): bump docker/build-push-action from 6 to 7 (#3109)
dependabot[bot] Mar 10, 2026
cc50ea3
build(deps): bump go.opentelemetry.io/otel/exporters/otlp/otlptrace/o…
dependabot[bot] Mar 10, 2026
e5cba8d
build(deps): bump golang.org/x/sync from 0.19.0 to 0.20.0 (#3117)
dependabot[bot] Mar 10, 2026
511b34d
chore(deps): consolidate dependabot updates 2026-03-11 (#3143)
Umang01-hash Mar 11, 2026
6470e3e
chore(deps): major version bumps 2026-03-11 (#3144)
Umang01-hash Mar 11, 2026
ca66e67
fix: add actionable deprecation warning for zipkin trace exporter (#3…
coolwednesday Mar 11, 2026
19e97e7
fix: re-fetch lastMigration under lock to prevent migration race cond…
coolwednesday Mar 11, 2026
3d9561b
feat(file/gcs): add metadata upload and signed URL generation support…
Umang01-hash Mar 12, 2026
4571720
feat(rpc): Implement GRPC rate limiter (#3042)
0xEbrahim Mar 13, 2026
54a0c91
feat(pubsub): add span links in NATS (#3103)
adityakrmishra Mar 13, 2026
ad32940
Add GraphQL Support (#2901)
coolwednesday Mar 13, 2026
28e621d
improve heatmap readability by capping y-axis at 100ms
IronwallxR5 Mar 14, 2026
98cd912
fix: correct typos and enforce American English conventions
Bortlesboat Mar 15, 2026
a8f9bf3
chore(deps): consolidate dependabot updates 2026-03-17
Umang01-hash Mar 17, 2026
0df3683
fix: improve heatmap readability by capping y-axis at 100ms (#3150)
Umang01-hash Mar 17, 2026
d585136
Merge branch 'development' into chore/dependabot-consolidation-2026-0…
Umang01-hash Mar 17, 2026
ba15138
Merge branch 'development' into fix/typo-corrections
Umang01-hash Mar 17, 2026
9a9b316
Merge pull request #3174 from gofr-dev/chore/dependabot-consolidation…
coolwednesday Mar 17, 2026
5ef367d
Merge branch 'development' into fix/typo-corrections
coolwednesday Mar 17, 2026
588d5c5
fix a bug for pubsub doc becuase of which sqs was not appearing
Umang01-hash Mar 18, 2026
05a96db
feat: implement MongoDB lock and unlock functionality with error hand…
QUBITABHAY Mar 18, 2026
80d587b
build(deps): bump the go_modules group across 7 directories with 1 up…
dependabot[bot] Mar 19, 2026
9f54f6f
Merge pull request #3184 from gofr-dev/dependabot/go_modules/pkg/gofr…
Umang01-hash Mar 20, 2026
5884b69
Merge branch 'development' into development
Umang01-hash Mar 20, 2026
bb97383
Merge branch 'development' into en/amazon_sqs_doc
Umang01-hash Mar 20, 2026
a8f71fa
fix: extract base URL from JWKS endpoint for correct OAuth health check
coolwednesday Mar 20, 2026
3827c36
test: add test to verify OAuth health check hits correct endpoint
coolwednesday Mar 20, 2026
b7ee1af
fix: strip leading slash from JWKS path to prevent double-slash in URL
coolwednesday Mar 20, 2026
9d5016f
fix: validate JWKS endpoint URL scheme and host after parsing
coolwednesday Mar 20, 2026
480f17f
Merge pull request #3177 from gofr-dev/en/amazon_sqs_doc
vikash Mar 20, 2026
841f382
Merge pull request #3151 from Bortlesboat/fix/typo-corrections
vikash Mar 20, 2026
044dcc3
Merge branch 'gofr-dev:development' into development
QUBITABHAY Mar 20, 2026
ab7d1b3
fix: detect stolen MongoDB lock in startRefresh via ModifiedCount check
QUBITABHAY Mar 20, 2026
42dce90
test: refactor mongo refresh lint fixes
QUBITABHAY Mar 20, 2026
a231bb2
Format UpdateOne call for better readability
QUBITABHAY Mar 20, 2026
c97ae13
build(deps): bump nick-fields/retry from 3 to 4
dependabot[bot] Mar 23, 2026
ccfd5c7
chore(deps): consolidate dependabot updates 2026-03-24 (#3206)
Umang01-hash Mar 24, 2026
a82c3a6
Merge branch 'development' into dependabot/github_actions/nick-fields…
coolwednesday Mar 24, 2026
01a7e62
Merge pull request #3191 from gofr-dev/dependabot/github_actions/nick…
Umang01-hash Mar 24, 2026
724bc99
Merge branch 'development' into fix/oauth-health-check-3179-clean
Umang01-hash Mar 24, 2026
a6f8a9d
Merge pull request #3185 from coolwednesday/fix/oauth-health-check-31…
Umang01-hash Mar 24, 2026
56c14ec
Merge branch 'development' into development
Umang01-hash Mar 24, 2026
1e21b6b
Add testInterval to mongoMigrator and enhance migration error handling
QUBITABHAY Mar 24, 2026
44192e9
feat: support ACCESS_CONTROL_ALLOW_METHODS config override
aryanmehrotra Mar 24, 2026
9b91496
build(deps): bump github.com/nats-io/nats-server/v2
dependabot[bot] Mar 24, 2026
92e49bb
add defer rows.close() in SQL SELECT and fix wrong err var in SQL SEL…
Umang01-hash Mar 24, 2026
eeaba95
Merge pull request #3209 from gofr-dev/dependabot/go_modules/pkg/gofr…
Umang01-hash Mar 25, 2026
cbae0fc
Merge branch 'development' into fix/sql_bug
Umang01-hash Mar 25, 2026
b4dff34
Merge branch 'development' into development
Umang01-hash Mar 25, 2026
f4c46e1
Merge branch 'development' into fix/cors-allow-methods-config-v2
Umang01-hash Mar 26, 2026
2bd812a
Merge pull request #3210 from gofr-dev/fix/sql_bug
Umang01-hash Mar 26, 2026
fab4924
Merge branch 'development' into fix/cors-allow-methods-config-v2
Umang01-hash Mar 26, 2026
60e760b
Merge branch 'development' into development
Umang01-hash Mar 26, 2026
c2bbcce
Merge pull request #3208 from gofr-dev/fix/cors-allow-methods-config-v2
Umang01-hash Mar 26, 2026
462c51e
Merge branch 'development' into development
Umang01-hash Mar 26, 2026
d7bea67
Merge pull request #3178 from QUBITABHAY/development
Umang01-hash Mar 26, 2026
5ef1f7a
fix: add nil check for WebSocket connection in WriteMessageToSocket
NitinKumar004 Mar 27, 2026
7c10482
fix: close file logger to prevent fd leak in CMD apps
tharunn0 Mar 27, 2026
cec687b
test: add unit tests for crud_helpers (toSnakeCase, parseSQLTag, hasA…
NitinKumar004 Mar 27, 2026
20a401d
fix: revert UpdateOne breaking change, use UpdateMany for migration l…
Umang01-hash Mar 30, 2026
214e84c
Merge branch 'development' into fix/nil-pointer-write-message-to-socket
Umang01-hash Mar 30, 2026
f6f7a8d
docs: fix grammar in README
singhankit001 Mar 30, 2026
8ec5abf
test: add missing unit tests for HTTP request (HostName, PathParam, b…
NitinKumar004 Mar 30, 2026
157ef50
Merge branch 'development' into test/crud-helpers-coverage
aryanmehrotra Mar 30, 2026
3366ca8
chore(deps): consolidate dependabot updates 2026-04-01 (#3246)
Umang01-hash Apr 2, 2026
e81f6a5
build(deps): bump github.com/go-jose/go-jose/v4
dependabot[bot] Apr 3, 2026
54b7cb4
Merge pull request #3248 from gofr-dev/dependabot/go_modules/pkg/gofr…
Umang01-hash Apr 3, 2026
93c817a
Merge branch 'development' into test/crud-helpers-coverage
Umang01-hash Apr 3, 2026
250e19e
Merge pull request #3220 from NitinKumar004/test/crud-helpers-coverage
Umang01-hash Apr 3, 2026
d205810
Merge branch 'development' into fix/close-file-logger-fd-leak
Umang01-hash Apr 3, 2026
2e97791
fix: close file logger on shutdown and add verification test
tharunn0 Apr 3, 2026
6ee34c3
Merge pull request #3219 from tharunn0/fix/close-file-logger-fd-leak
Umang01-hash Apr 3, 2026
ef4be56
Support multiple allowed origins in CORS middleware
akshat-kumar-singhal Apr 3, 2026
10975e5
Address review: add Vary header assertions and multi-origin middlewar…
akshat-kumar-singhal Apr 3, 2026
f0bd20e
Merge pull request #3249 from akshat-kumar-singhal/feature/cors-multi…
Umang01-hash Apr 3, 2026
791c928
docs: add CORS multiple origins documentation and config reference
Umang01-hash Apr 3, 2026
60bcd49
fix: only record migration in databases actually used by the UP function
aryanmehrotra Apr 6, 2026
e81c79f
Merge branch 'development' into docs/fix-readme-grammar
Umang01-hash Apr 6, 2026
bf64beb
fix: use time.Duration for cron job log to avoid format verb mismatch
aryanmehrotra Apr 6, 2026
3fc4d7c
Merge pull request #3256 from gofr-dev/fix/cron-job-duration-log-format
Umang01-hash Apr 6, 2026
cb23389
Merge branch 'development' into fix/nil-pointer-write-message-to-socket
Umang01-hash Apr 7, 2026
c84d563
Merge branch 'development' into fix/migration-selective-commit
Umang01-hash Apr 7, 2026
467f8e9
chore(deps): consolidate minor dependency updates (#3290)
Umang01-hash Apr 7, 2026
525b696
Merge pull request #3225 from singhankit001/docs/fix-readme-grammar
vikash Apr 7, 2026
083f3ba
Merge pull request #3250 from gofr-dev/docs/cors-multiple-origins
vikash Apr 7, 2026
8cbdf9d
Merge branch 'development' into fix/migration-selective-commit
Umang01-hash Apr 7, 2026
77410a8
Merge pull request #3254 from gofr-dev/fix/migration-selective-commit
Umang01-hash Apr 7, 2026
9248602
Merge branch 'development' into fix/nil-pointer-write-message-to-socket
Umang01-hash Apr 7, 2026
e735fea
Merge pull request #3216 from NitinKumar004/fix/nil-pointer-write-mes…
Umang01-hash Apr 7, 2026
6ab4c16
fix: prevent goroutine leak in crontab scheduling
tharunn0 Apr 7, 2026
0b9b669
fix: resolve busy-spin, goroutine leak, and deadlock in Redis stream …
aryanmehrotra Apr 9, 2026
fc526bf
fix: also fix resubscribeAll for streams — was silently broken
aryanmehrotra Apr 9, 2026
a420bc4
test: add integration tests validating fixes against real Redis
aryanmehrotra Apr 9, 2026
1fe28cb
fix: preserve consumer name across resubscribes to prevent PEL data loss
aryanmehrotra Apr 9, 2026
57172c8
Merge branch 'development' into fix/pubsub-stream-busy-spin
aryanmehrotra Apr 9, 2026
b70d033
Merge pull request #3294 from gofr-dev/fix/pubsub-stream-busy-spin
Umang01-hash Apr 9, 2026
e21a932
Merge branch 'development' into fix/crontab-goroutine-leak
Umang01-hash Apr 10, 2026
82a2585
fix: use RLock in circuitBreaker.isOpen for read-only
haidargit Apr 6, 2026
c7c37e2
fix: release lock during circuit breaker health check
haidargit Apr 10, 2026
2b7bab2
refactor: ensure safe cron shutdown using sync.Once and reorder appli…
tharunn0 Apr 10, 2026
c9ef6cc
prevent blocking by unlocking before health checks
haidargit Apr 11, 2026
bf9c004
refactor(arangodb): introduce instrumentOp for accurate op timing
akshat-kumar-singhal Apr 14, 2026
ee7275f
refactor(mongo): introduce instrumentOp for accurate op timing
akshat-kumar-singhal Apr 14, 2026
9888d06
refactor(gofr): duck-typed AddXxx wiring, deprecate *Provider interfaces
akshat-kumar-singhal Apr 14, 2026
0cd06df
fix(gofr): satisfy gocyclo and wsl_v5 in external_db
akshat-kumar-singhal Apr 14, 2026
49fbbc4
fix(gofr): add missing wsl_v5 blank lines in external_db tests
akshat-kumar-singhal Apr 14, 2026
774a7dd
fix(datasource): name instrumentOp return values
akshat-kumar-singhal Apr 14, 2026
b22ed3e
chore(deps): consolidate minor/patch dependency updates
Umang01-hash Apr 14, 2026
886ba6d
Merge pull request #3319 from gofr-dev/deps/minor-updates-2026-04-14
Umang01-hash Apr 15, 2026
cdf7406
Merge pull request #3296 from NitinKumar004/test/improve-core-coverage
NitinKumar004 Apr 20, 2026
4b97b20
chore(deps): consolidate minor/patch dependency updates (#3341)
Umang01-hash Apr 21, 2026
9ffdc62
feat(pubsub): make consumer span a child of producer trace (#3324)
aryanmehrotra Apr 21, 2026
a37eed5
Merge pull request #3343 from gofr-dev/fix/pubsub-docs-unclosed-code-…
Umang01-hash Apr 21, 2026
651e0e9
Merge branch 'development' into development
akshat-kumar-singhal Apr 22, 2026
5f1ced1
chore(deps): consolidate minor dependency updates (2026-04-28) (#3365)
Umang01-hash Apr 28, 2026
afd482d
Merge branch 'development' into development
aryanmehrotra Apr 28, 2026
83a02b8
Merge branch 'development' into fix/circuit-breaker-isopen-read-lock
aryanmehrotra Apr 29, 2026
ab62169
Fix: Index out of bounds panic in SwaggerUIHandler for files without …
NitinKumar004 Apr 29, 2026
f2a16fa
fix(kafka): reconnect stale admin conn instead of failing forever (#3…
aryanmehrotra Apr 29, 2026
7cef101
Merge branch 'development' into development
akshat-kumar-singhal Apr 30, 2026
b13517d
fix(gofr): wire dbresolver tracing, warn on missing tracerName, guard…
akshat-kumar-singhal Apr 30, 2026
e0be459
style(gofr): fix gci alignment and wsl_v5 blank-line in external_db_test
akshat-kumar-singhal Apr 30, 2026
d58f06e
fix(submodules): wrap arangodb lll lines; drop premature observabilit…
akshat-kumar-singhal Apr 30, 2026
80a3c23
fix(grpc): nil-check server in Shutdown force-close path
NitinKumar004 Apr 30, 2026
6e0d51a
docs + ci: fix broken cross-links, stage/prod symmetric inline-refres…
aryanmehrotra May 4, 2026
b6d33a8
chore(deps): consolidate minor dependency updates (2026-05-05)
Umang01-hash May 5, 2026
3ce4fc0
chore(deps): regenerate Redis mock for go-redis v9.19.0
Umang01-hash May 5, 2026
cb8c67b
chore(deps): regenerate arangodb Client mock for go-driver/v2 v2.3.0
Umang01-hash May 5, 2026
2b22983
Merge branch 'development' into fix/grpc-shutdown-nil-panic
aryanmehrotra May 5, 2026
c8b1f70
Merge pull request #3393 from gofr-dev/deps/minor-updates-2026-05-05
Umang01-hash May 5, 2026
6b0d44a
Merge branch 'development' into fix/grpc-shutdown-nil-panic
NitinKumar004 May 5, 2026
5f14428
docs: cross-link audit + staging-review fixes (#3395)
aryanmehrotra May 5, 2026
3bbf44b
ci(website): build source-bundle to --target builder (#3397)
aryanmehrotra May 5, 2026
f7aa5f9
Merge branch 'development' into fix/grpc-shutdown-nil-panic
Umang01-hash May 6, 2026
370227d
Merge pull request #3368 from NitinKumar004/fix/grpc-shutdown-nil-panic
Umang01-hash May 6, 2026
2df99ea
Merge branch 'development' into fix/crontab-goroutine-leak
tharunn0 May 6, 2026
20066ae
fix: add missing closing brace in cron tests
tharunn0 May 6, 2026
a9f15bf
Merge branch 'development' into development
Umang01-hash May 7, 2026
a972528
Merge pull request #3102 from akshat-kumar-singhal/development
Umang01-hash May 7, 2026
396c6d9
chore(deps): consolidate minor dependency updates (2026-05-12) (#3423)
Umang01-hash May 12, 2026
66985f2
Merge branch 'development' into fix/crontab-goroutine-leak
tharunn0 May 13, 2026
47e4dd4
fix(subscriber): emit error on handler panic recover to prevent commi…
pricelessrabbit May 13, 2026
274559d
Merge branch 'development' into fix/crontab-goroutine-leak
tharunn0 May 13, 2026
3f37fa9
chore: bump Go to 1.26 across all modules (#3426)
aryanmehrotra May 13, 2026
a9a1b0b
Merge branch 'development' into fix/crontab-goroutine-leak
Umang01-hash May 14, 2026
ed99379
Merge pull request #3292 from tharunn0/fix/crontab-goroutine-leak
Umang01-hash May 14, 2026
766a152
Merge branch 'development' into fix/circuit-breaker-isopen-read-lock
Umang01-hash May 14, 2026
fab49bd
Merge pull request #3255 from haidargit/fix/circuit-breaker-isopen-re…
Umang01-hash May 14, 2026
342b57b
test: regression guard for non-blocking circuit-breaker recovery (#3427)
Umang01-hash May 15, 2026
32ac55b
chore(deps): consolidate minor dependency updates
Umang01-hash May 20, 2026
36bbe8a
chore(deps): regenerate JetStream mock for nats.go v1.52.0
Umang01-hash May 20, 2026
c30074e
Merge pull request #3458 from gofr-dev/deps/minor-updates-2026-05-20
Umang01-hash May 21, 2026
8e1308a
perf: HTTP hot-path optimizations — alloc/CPU reductions in middlewar…
aryanmehrotra May 21, 2026
5901021
chore(deps): consolidate minor dependency updates (#3491)
Umang01-hash May 26, 2026
b510597
chore(deps): consolidate minor dependency updates (#3524)
Umang01-hash Jun 5, 2026
1425dc0
feat: add auth package with file-based token support for K8s projecte…
akshat-kumar-singhal Jun 18, 2026
ec39727
Merge pull request #3597 from gofr-dev/deps/minor-updates-2026-06-17
Umang01-hash Jun 18, 2026
48277ce
feat(clickhouse): support connection-pool and dial configuration (#3570)
NitinKumar004 Jun 18, 2026
81f2056
fix(metrics): extend datasource latency histogram buckets to 3 minute…
aryanmehrotra Jun 19, 2026
cb477c6
feat(cloudsql): Cloud SQL datasource with IAM auth + pluggable AddSQL…
akshat-kumar-singhal Jun 24, 2026
c091a1d
chore(deps): bump actions/checkout from v6 to v7 (NEEDS REVIEW) (#3641)
Umang01-hash Jun 24, 2026
925619a
chore(deps): consolidate minor dependency updates (#3640)
Umang01-hash Jun 24, 2026
cd6b35c
gRPC example histogram buckets cap at 10ms — quantiles peg at ceiling…
Ujjwal-Singh-20 Jun 24, 2026
cd96bef
test(http/response): add unit tests for response package (#3602)
NitinKumar004 Jun 24, 2026
48906e8
Merge pull request #3678 from gofr-dev/deps/minor-updates-2026-07-02
Umang01-hash Jul 3, 2026
ac55551
chore(datasource): sync submodules to gofr.dev v1.57.0 and fix standa…
Umang01-hash Jul 3, 2026
b6f8173
chore(deps): consolidate minor/patch dependency updates (2026-07-07) …
Umang01-hash Jul 7, 2026
1b57cd3
fix(subscriber): propagate handler error to engage startSubscriber ba…
NitinKumar004 Jul 7, 2026
f5113bc
chore(deps): consolidate minor/patch dependency updates (2026-07-15) …
Umang01-hash Jul 15, 2026
f7a8703
feat(s3): add signed URL support with S3-compatible provider flavors …
akshat-kumar-singhal Jul 16, 2026
5c6458c
Adds support for making observable LLM chat and tool calls (#3722)
aryanmehrotra Jul 21, 2026
becc1d2
chore(deps): major dependency updates — NEEDS REVIEW (2026-07-21) (#3…
Umang01-hash Jul 21, 2026
ccb196e
chore(deps): consolidate minor/patch dependency updates (2026-07-21) …
Umang01-hash Jul 21, 2026
3e1265c
fix(surrealDB): handle gofr lastMigration / table creation (#3726)
im-ng Jul 21, 2026
3493b22
fix(eventhub,s3): stabilize publish test and optimize S3 ReadDir one-…
Manidwiptam Jul 23, 2026
1a09aec
feat: add HTTP QUERY method support (RFC 10008)
thzgajendra Jul 24, 2026
f64b160
test: add QUERY circuit-breaker integration tests
thzgajendra Jul 24, 2026
6496be2
feat: expose QUERY handlers as MCP agent tools
thzgajendra Jul 24, 2026
3c0c278
test: fix flaky TestCronTab_AddJob metrics panic
thzgajendra Jul 24, 2026
606d975
Merge pull request #3758 from gofr-dev/perf/logging-http-allocations
aryanmehrotra Jul 24, 2026
263eac1
Merge branch 'development' into feat/http-query-method
thzgajendra Jul 27, 2026
9551e52
feat(metrics): add push-based OTLP metrics export (#3366) (#3761)
akshat-kumar-singhal Jul 28, 2026
654b5ec
Merge branch 'development' into feat/http-query-method
Umang01-hash Jul 29, 2026
2419829
fix: data race on server shutdown + de-flake cron/file-token unit tes…
akshat-kumar-singhal Jul 29, 2026
fc44c22
test(cron): preserve both branches' AnyTimes metric expectations + de…
thzgajendra Jul 30, 2026
81ebc5e
Merge branch 'development' of https://github.com/gofr-dev/gofr into f…
thzgajendra Jul 30, 2026
492af82
Merge upstream/development into feat/http-query-method
thzgajendra Aug 21, 2026
5307036
fix(merge): restore upstream's router_test.go verbatim
thzgajendra Aug 21, 2026
b57dcf5
fix(lint): drop double blank lines flagged by gci
thzgajendra Aug 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion docs/advanced-guide/http-communication/page.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ GoFr promotes microservice architecture and to facilitate the same, it provides
at application level using `AddHTTPService()` method.

Support for inter-service HTTP calls provide the following benefits:
1. Access to the methods from container - GET, PUT, POST, PATCH, DELETE.
1. Access to the methods from container - GET, PUT, POST, PATCH, DELETE, QUERY.
2. Logs and traces for the request.
3. {% new-tab-link newtab=false title="Circuit breaking" href="/docs/advanced-guide/circuit-breaker" /%} for enhanced resilience and fault tolerance.
4. {% new-tab-link newtab=false title="Custom Health Check" href="/docs/advanced-guide/monitoring-service-health" /%} Endpoints
Expand Down Expand Up @@ -83,6 +83,9 @@ The HTTP service client provides methods for making requests to downstream servi

- `Delete(ctx, path, body)`

- `Query(ctx, path, queryParams, body)`


**For scenarios requiring custom header propagation (authentication, multi-tenancy, user identity propagation), use the `WithHeaders` variants:**

- `GetWithHeaders(ctx, path, queryParams, headers)`
Expand All @@ -95,6 +98,13 @@ The HTTP service client provides methods for making requests to downstream servi

- `DeleteWithHeaders(ctx, path, body, headers)`

- `QueryWithHeaders(ctx, path, queryParams, body, headers)`

> **QUERY** (RFC 10008) is a safe, idempotent method that carries the query in the
> request body — bridging the gap between GET (no body) and POST (not safe/idempotent).
> Like GET, QUERY calls are wrapped by the circuit-breaker and retry options when configured.


```go
func Customer(ctx *gofr.Context) (any, error) {
// Get the payment service client
Expand Down
18 changes: 18 additions & 0 deletions examples/http-server/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ func main() {
a.GET("/trace", TraceHandler)
a.GET("/mysql", MysqlHandler)

// QUERY (RFC 10008): a safe, idempotent method that carries the query in the
// request body. Read the body via ctx.Bind, the same as a POST.
a.QUERY("/search", SearchHandler)

// Run the application
a.Run()
}
Expand All @@ -46,6 +50,20 @@ func ErrorHandler(c *gofr.Context) (any, error) {
return nil, errors.New("some error occurred")
}

// SearchHandler demonstrates the HTTP QUERY method: the search criteria arrive in
// the request body and are echoed back as the query result.
func SearchHandler(c *gofr.Context) (any, error) {
criteria := struct {
Filter string `json:"filter"`
}{}

if err := c.Bind(&criteria); err != nil {
return nil, err
}

return map[string]string{"matched": criteria.Filter}, nil
}

func RedisHandler(c *gofr.Context) (any, error) {
val, err := c.Redis.Get(c, "test").Result()
if err != nil && err != redis.Nil { // If key is not found, we are not considering this an error and returning "".
Expand Down
35 changes: 35 additions & 0 deletions examples/http-server/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import (
"strconv"
"strings"
"testing"
"time"

"github.com/go-redis/redismock/v9"
"github.com/stretchr/testify/assert"
Expand Down Expand Up @@ -95,6 +96,39 @@ func TestIntegration_SimpleAPIServer(t *testing.T) {
}
}

func TestIntegration_QueryHandler(t *testing.T) {
httpPort := testutil.GetFreePort(t)
port := testutil.GetFreePort(t)

t.Setenv("HTTP_PORT", strconv.Itoa(httpPort))
t.Setenv("METRICS_PORT", strconv.Itoa(port))

host := fmt.Sprintf("http://localhost:%d", httpPort)

go main()
time.Sleep(100 * time.Millisecond) // Giving some time to start the server

req, _ := http.NewRequest("QUERY", host+"/search", strings.NewReader(`{"filter":"golang"}`))
req.Header.Set("content-type", "application/json")

resp, err := http.DefaultClient.Do(req)
require.NoError(t, err)

defer resp.Body.Close()

assert.Equal(t, http.StatusOK, resp.StatusCode)

b, err := io.ReadAll(resp.Body)
require.NoError(t, err)

data := struct {
Data map[string]string `json:"data"`
}{}
require.NoError(t, json.Unmarshal(b, &data))
assert.Equal(t, "golang", data.Data["matched"])
}


func TestIntegration_SimpleAPIServer_Errors(t *testing.T) {
httpPort := testutil.GetFreePort(t)
port := testutil.GetFreePort(t)
Expand Down Expand Up @@ -347,6 +381,7 @@ func TestTraceHandler(t *testing.T) {

ctx := createTestContext(http.MethodGet, "/trace", mockContainer)


// HTTP service mock - use mocks.HTTPServices["serviceName"] to access the specific service
// Important: Use the map keyed by service name, not mocks.HTTPService (singular)
mockResp := &http.Response{
Expand Down
53 changes: 53 additions & 0 deletions pkg/gofr/gofr_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"os"
"path/filepath"
"strconv"
"strings"
"sync"
"testing"
"time"
Expand Down Expand Up @@ -1935,3 +1936,55 @@ func Test_HTTPMethods(t *testing.T) {
})
}
}

// Test_QUERY_Registration verifies that app.QUERY registers a route for the HTTP
// QUERY method (RFC 10008) and that the handler can read the request body via Bind.
func Test_QUERY_Registration(t *testing.T) {
port := testutil.GetFreePort(t)

c := container.NewContainer(config.NewMockConfig(nil))

app := &App{
httpServer: &httpServer{
router: gofrHTTP.NewRouter(),
port: port,
},
container: c,
Config: config.NewMockConfig(map[string]string{
"REQUEST_TIMEOUT": "5",
"SHUTDOWN_GRACE_PERIOD": "1s",
}),
}

app.QUERY("/search", func(ctx *Context) (any, error) {
body := struct {
Filter string `json:"filter"`
}{}
if err := ctx.Bind(&body); err != nil {
return nil, err
}

return map[string]string{"filter": body.Filter}, nil
})

go app.Run()

time.Sleep(100 * time.Millisecond)

netClient := &http.Client{Timeout: 500 * time.Millisecond}

req, _ := http.NewRequestWithContext(t.Context(), "QUERY",
fmt.Sprintf("http://localhost:%d/search", port), strings.NewReader(`{"filter":"title"}`))
req.Header.Set("Content-Type", "application/json")

resp, err := netClient.Do(req)
require.NoError(t, err)

defer resp.Body.Close()

assert.Equal(t, http.StatusOK, resp.StatusCode)

respBody, err := io.ReadAll(resp.Body)
require.NoError(t, err)
assert.Contains(t, string(respBody), `"filter":"title"`)
}
10 changes: 6 additions & 4 deletions pkg/gofr/mcp.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,12 @@ func WithExcludedRoutes(paths ...string) MCPOption {
}
}

// EnableMCP exposes the app's read-only HTTP handlers (GET/HEAD/OPTIONS) as agent-callable tools over
// an MCP server on its own port (MCP_PORT, default 8200; MCP_PORT=0 disables the server). Write
// handlers are never exposed, so an agent cannot mutate state through this surface. The tools are also
// reachable in handlers via ctx.LLM().Tools() regardless of whether the server is enabled.
// EnableMCP exposes the app's safe HTTP handlers — read-only methods (GET/HEAD/OPTIONS) and QUERY
// (RFC 10008, safe and idempotent, whose query payload is passed as a "body" tool argument) — as
// agent-callable tools over an MCP server on its own port (MCP_PORT, default 8200; MCP_PORT=0 disables
// the server). Write handlers (POST/PUT/PATCH/DELETE) are never exposed, so an agent cannot mutate
// state through this surface. The tools are also reachable in handlers via ctx.LLM().Tools() regardless
// of whether the server is enabled.
func (a *App) EnableMCP(opts ...MCPOption) {
cfg := &mcpConfig{exclude: make(map[string]bool)}
for _, o := range opts {
Expand Down
69 changes: 69 additions & 0 deletions pkg/gofr/mcp_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -328,3 +328,72 @@ func TestHelpers(t *testing.T) {
assert.Equal(t, "42", scalar(json.RawMessage(`"42"`)))
assert.Equal(t, "true", scalar(json.RawMessage(`true`)))
}

func TestRouterTools_List_ExposesQuery(t *testing.T) {
app, rt := testRouterTools(t)
app.QUERY("/search", func(*Context) (any, error) { return nil, nil })
app.POST("/write", func(*Context) (any, error) { return nil, nil })

specs := rt.List()
names := toolNames(specs)

assert.Contains(t, names, "query_search", "QUERY handlers are exposed (safe + idempotent)")
assert.NotContains(t, names, "post_write", "write handlers remain unexposed")

// The QUERY tool must advertise a required "body" argument for the query payload.
var querySpec ai.ToolSpec

for _, s := range specs {
if s.Name == "query_search" {
querySpec = s
}
}

require.NotEmpty(t, querySpec.Name)
assert.Equal(t, ai.ReadOnly, querySpec.Access, "QUERY is safe, so it is ReadOnly")

schema := map[string]any{}
require.NoError(t, json.Unmarshal(querySpec.InputSchema, &schema))

props, _ := schema["properties"].(map[string]any)
assert.Contains(t, props, "body", "QUERY tool schema must include a body property")
assert.Contains(t, schema["required"], "body", "body must be required")
}

func TestRouterTools_Call_QueryForwardsBody(t *testing.T) {
app, rt := testRouterTools(t)
app.QUERY("/search", func(c *Context) (any, error) {
payload := map[string]any{}
if err := c.Bind(&payload); err != nil {
return nil, err
}

return payload, nil
})

res, err := rt.Call(t.Context(), "query_search", json.RawMessage(`{"body":{"filter":"title"}}`))
require.NoError(t, err)

body, err := res.JSON()
require.NoError(t, err)
assert.Contains(t, string(body), `"filter":"title"`, "the QUERY body must reach the handler")
}

func TestRouterTools_Call_QueryWithPathParamAndBody(t *testing.T) {
app, rt := testRouterTools(t)
app.QUERY("/index/{name}/search", func(c *Context) (any, error) {
payload := map[string]any{}
_ = c.Bind(&payload)
payload["index"] = c.PathParam("name")

return payload, nil
})

res, err := rt.Call(t.Context(), "query_index_name_search",
json.RawMessage(`{"name":"books","body":{"q":"go"}}`))
require.NoError(t, err)

body, _ := res.JSON()
assert.Contains(t, string(body), `"index":"books"`)
assert.Contains(t, string(body), `"q":"go"`)
}
10 changes: 10 additions & 0 deletions pkg/gofr/rest.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,16 @@ func (a *App) PATCH(pattern string, handler Handler) {
a.add("PATCH", pattern, handler)
}

// QUERY adds a Handler for the HTTP QUERY method (RFC 10008) for a route pattern.
// QUERY is a safe, idempotent method that carries a request body describing the
// query; read it in the handler via ctx.Bind, the same way as a POST body.
// Per RFC 10008 a server should reject a QUERY with a missing/invalid Content-Type
// with 400; gofr does not enforce this automatically, so validate it in the handler
// when required.
func (a *App) QUERY(pattern string, handler Handler) {
a.add(methodQuery, pattern, handler)
}

func (a *App) add(method, pattern string, h Handler) {
if !a.httpRegistered && !isPortAvailable(a.httpServer.port) {
a.container.Logger.Fatalf("http port %d is blocked or unreachable", a.httpServer.port)
Expand Down
15 changes: 15 additions & 0 deletions pkg/gofr/service/auth.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,3 +82,18 @@ func (a *authProvider) DeleteWithHeaders(ctx context.Context, path string, body

return a.HTTP.DeleteWithHeaders(ctx, path, body, headers)
}

func (a *authProvider) Query(ctx context.Context, path string, queryParams map[string]any,
body []byte) (*http.Response, error) {
return a.QueryWithHeaders(ctx, path, queryParams, body, nil)
}

func (a *authProvider) QueryWithHeaders(ctx context.Context, path string, queryParams map[string]any,
body []byte, headers map[string]string) (*http.Response, error) {
headers, err := a.auth(ctx, headers)
if err != nil {
return nil, err
}

return a.HTTP.QueryWithHeaders(ctx, path, queryParams, body, headers)
}
6 changes: 5 additions & 1 deletion pkg/gofr/service/auth_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ func TestAuthProvider(t *testing.T) {
{authOption: validOAuthConfig, headers: map[string]string{AuthHeader: "auth-string"}, err: authHeaderExistsErr},
}

httpMethods := []string{http.MethodGet, http.MethodPost, http.MethodPut, http.MethodPatch, http.MethodDelete}
httpMethods := []string{http.MethodGet, http.MethodPost, http.MethodPut, http.MethodPatch, http.MethodDelete, methodQuery}

for i, tc := range testCases {
t.Run(fmt.Sprintf("Test Case #%d", i), func(t *testing.T) {
Expand Down Expand Up @@ -143,6 +143,8 @@ func callHTTPServiceWithHeaders(ctx context.Context, service HTTP, method string
return service.PatchWithHeaders(ctx, path, queryParams, body, headers)
case http.MethodDelete:
return service.DeleteWithHeaders(ctx, path, body, headers)
case methodQuery:
return service.QueryWithHeaders(ctx, path, queryParams, body, headers)
default:
return nil, AuthErr{Message: "unknown method"}
}
Expand All @@ -164,6 +166,8 @@ func callHTTPServiceWithoutHeaders(ctx context.Context, service HTTP, method str
return service.Patch(ctx, path, queryParams, body)
case http.MethodDelete:
return service.Delete(ctx, path, body)
case methodQuery:
return service.Query(ctx, path, queryParams, body)
default:
return nil, AuthErr{Message: "unknown method"}
}
Expand Down
21 changes: 21 additions & 0 deletions pkg/gofr/service/circuit_breaker.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package service
import (
"context"
"errors"
"fmt"
"net/http"
"sync"
"time"
Expand All @@ -18,6 +19,8 @@ var (
// ErrCircuitOpen indicates that the circuit breaker is open.
ErrCircuitOpen = errors.New("unable to connect to server at host")
ErrUnexpectedCircuitBreakerResultType = errors.New("unexpected result type from circuit breaker")
// ErrUnsupportedMethod indicates that the circuit breaker was asked to route an HTTP method it does not handle.
ErrUnsupportedMethod = errors.New("unsupported HTTP method for circuit breaker")
)

// CircuitBreakerConfig holds the configuration for the circuitBreaker.
Expand Down Expand Up @@ -255,6 +258,12 @@ func (cb *circuitBreaker) doRequest(ctx context.Context, method, path string, qu
result, err = cb.executeWithCircuitBreaker(ctx, func(ctx context.Context) (*http.Response, error) {
return cb.HTTP.DeleteWithHeaders(ctx, path, body, headers)
})
case methodQuery:
result, err = cb.executeWithCircuitBreaker(ctx, func(ctx context.Context) (*http.Response, error) {
return cb.HTTP.QueryWithHeaders(ctx, path, queryParams, body, headers)
})
default:
return nil, fmt.Errorf("%w: %q", ErrUnsupportedMethod, method)
}

resp, err := cb.handleCircuitBreakerResult(result, err)
Expand Down Expand Up @@ -321,3 +330,15 @@ func (cb *circuitBreaker) Delete(ctx context.Context, path string, body []byte)
*http.Response, error) {
return cb.doRequest(ctx, http.MethodDelete, path, nil, body, nil)
}

// QueryWithHeaders is a wrapper for doRequest with the QUERY method and headers.
func (cb *circuitBreaker) QueryWithHeaders(ctx context.Context, path string, queryParams map[string]any,
body []byte, headers map[string]string) (*http.Response, error) {
return cb.doRequest(ctx, methodQuery, path, queryParams, body, headers)
}

// Query is a wrapper for doRequest with the QUERY method.
func (cb *circuitBreaker) Query(ctx context.Context, path string, queryParams map[string]any,
body []byte) (*http.Response, error) {
return cb.doRequest(ctx, methodQuery, path, queryParams, body, nil)
}
Loading
Loading