agent_patch
runs/2026-02-21__03-36-16__gpt-5-1-codex-mini/flux-pr-1001/flux-pr-1001.1-of-1.2026-02-21__03-36-16__gpt-5-1-codex-mini/agent-logs/agent.patch
10865 bytes
diff --git a/tmp/agent-patch-flux-pr-1001.1-of-1.2026-02-21__03-36-16__gpt-5-1-codex-mini/app/v2/pkg/engine/datasource/httpclient/nethttpclient.go b/app/v2/pkg/engine/datasource/httpclient/nethttpclient.go
index 3d7adb6..1e8d032 100644
--- a/tmp/agent-patch-flux-pr-1001.1-of-1.2026-02-21__03-36-16__gpt-5-1-codex-mini/app/v2/pkg/engine/datasource/httpclient/nethttpclient.go
+++ b/app/v2/pkg/engine/datasource/httpclient/nethttpclient.go
@@ -68,8 +68,23 @@ type TraceHTTPResponse struct {
type responseContextKey struct{}
+type HTTPRequest struct {
+ Method string `json:"method"`
+ URL string `json:"url"`
+ Headers http.Header `json:"headers"`
+}
+
+type HTTPResponse struct {
+ StatusCode int `json:"status_code"`
+ Status string `json:"status"`
+ Headers http.Header `json:"headers"`
+ BodySize int `json:"body_size"`
+}
+
type ResponseContext struct {
StatusCode int
+ Request *HTTPRequest
+ Response *HTTPResponse
}
func InjectResponseContext(ctx context.Context) (context.Context, *ResponseContext) {
@@ -77,9 +92,23 @@ func InjectResponseContext(ctx context.Context) (context.Context, *ResponseConte
return context.WithValue(ctx, responseContextKey{}, value), value
}
-func setResponseStatusCode(ctx context.Context, statusCode int) {
+func getResponseContext(ctx context.Context) *ResponseContext {
if value, ok := ctx.Value(responseContextKey{}).(*ResponseContext); ok {
- value.StatusCode = statusCode
+ return value
+ }
+ return nil
+}
+
+func setResponseRequest(ctx context.Context, request *HTTPRequest) {
+ if value := getResponseContext(ctx); value != nil {
+ value.Request = request
+ }
+}
+
+func setResponseInfo(ctx context.Context, response *HTTPResponse) {
+ if value := getResponseContext(ctx); value != nil {
+ value.Response = response
+ value.StatusCode = response.StatusCode
}
}
@@ -185,13 +214,25 @@ func makeHTTPRequest(client *http.Client, ctx context.Context, url, method, head
request.Header.Set(AcceptEncodingHeader, EncodingGzip)
request.Header.Add(AcceptEncodingHeader, EncodingDeflate)
+ redactedRequestHeaders := redactHeaders(request.Header)
+ setResponseRequest(ctx, &HTTPRequest{
+ Method: request.Method,
+ URL: request.URL.String(),
+ Headers: redactedRequestHeaders,
+ })
+
response, err := client.Do(request)
if err != nil {
return err
}
defer response.Body.Close()
- setResponseStatusCode(ctx, response.StatusCode)
+ redactedResponseHeaders := redactHeaders(response.Header)
+ httpResponse := &HTTPResponse{
+ StatusCode: response.StatusCode,
+ Status: response.Status,
+ Headers: redactedResponseHeaders,
+ }
respReader, err := respBodyReader(response)
if err != nil {
@@ -204,7 +245,13 @@ func makeHTTPRequest(client *http.Client, ctx context.Context, url, method, head
} else {
out.Grow(1024 * 4)
}
+ startLen := out.Len()
_, err = out.ReadFrom(respReader)
+ if err != nil {
+ return err
+ }
+ httpResponse.BodySize = out.Len() - startLen
+ setResponseInfo(ctx, httpResponse)
return
}
@@ -212,16 +259,19 @@ func makeHTTPRequest(client *http.Client, ctx context.Context, url, method, head
if err != nil {
return err
}
+ httpResponse.BodySize = len(data)
+ setResponseInfo(ctx, httpResponse)
+
responseTrace := TraceHTTP{
Request: TraceHTTPRequest{
Method: request.Method,
URL: request.URL.String(),
- Headers: redactHeaders(request.Header),
+ Headers: redactedRequestHeaders,
},
Response: TraceHTTPResponse{
StatusCode: response.StatusCode,
Status: response.Status,
- Headers: redactHeaders(response.Header),
+ Headers: redactedResponseHeaders,
BodySize: len(data),
},
}
diff --git a/tmp/agent-patch-flux-pr-1001.1-of-1.2026-02-21__03-36-16__gpt-5-1-codex-mini/app/v2/pkg/engine/resolve/loader.go b/app/v2/pkg/engine/resolve/loader.go
index 18788ee..553ba26 100644
--- a/tmp/agent-patch-flux-pr-1001.1-of-1.2026-02-21__03-36-16__gpt-5-1-codex-mini/app/v2/pkg/engine/resolve/loader.go
+++ b/app/v2/pkg/engine/resolve/loader.go
@@ -37,7 +37,7 @@ type LoaderHooks interface {
// OnLoad is called before the fetch is executed
OnLoad(ctx context.Context, ds DataSourceInfo) context.Context
// OnFinished is called after the fetch has been executed and the response has been processed and merged
- OnFinished(ctx context.Context, statusCode int, ds DataSourceInfo, err error)
+ OnFinished(ctx context.Context, statusCode int, ds DataSourceInfo, responseContext *httpclient.ResponseContext, err error)
}
func IsIntrospectionDataSource(dataSourceID string) bool {
@@ -118,7 +118,7 @@ func (l *Loader) resolveParallel(nodes []*FetchTreeNode) error {
for j := range results[i].nestedMergeItems {
err = l.mergeResult(nodes[i].Item, results[i].nestedMergeItems[j], itemsItems[i][j:j+1])
if l.ctx.LoaderHooks != nil && results[i].nestedMergeItems[j].loaderHookContext != nil {
- l.ctx.LoaderHooks.OnFinished(results[i].nestedMergeItems[j].loaderHookContext, results[i].nestedMergeItems[j].statusCode, results[i].nestedMergeItems[j].ds, goerrors.Join(results[i].nestedMergeItems[j].err, l.ctx.subgraphErrors))
+ l.ctx.LoaderHooks.OnFinished(results[i].nestedMergeItems[j].loaderHookContext, results[i].nestedMergeItems[j].statusCode, results[i].nestedMergeItems[j].ds, results[i].nestedMergeItems[j].responseContext, goerrors.Join(results[i].nestedMergeItems[j].err, l.ctx.subgraphErrors))
}
if err != nil {
return errors.WithStack(err)
@@ -127,7 +127,7 @@ func (l *Loader) resolveParallel(nodes []*FetchTreeNode) error {
} else {
err = l.mergeResult(nodes[i].Item, results[i], itemsItems[i])
if l.ctx.LoaderHooks != nil && results[i].loaderHookContext != nil {
- l.ctx.LoaderHooks.OnFinished(results[i].loaderHookContext, results[i].statusCode, results[i].ds, goerrors.Join(results[i].err, l.ctx.subgraphErrors))
+ l.ctx.LoaderHooks.OnFinished(results[i].loaderHookContext, results[i].statusCode, results[i].ds, results[i].responseContext, goerrors.Join(results[i].err, l.ctx.subgraphErrors))
}
if err != nil {
return errors.WithStack(err)
@@ -163,7 +163,7 @@ func (l *Loader) resolveSingle(item *FetchItem) error {
}
err = l.mergeResult(item, res, items)
if l.ctx.LoaderHooks != nil && res.loaderHookContext != nil {
- l.ctx.LoaderHooks.OnFinished(res.loaderHookContext, res.statusCode, res.ds, goerrors.Join(res.err, l.ctx.subgraphErrors))
+ l.ctx.LoaderHooks.OnFinished(res.loaderHookContext, res.statusCode, res.ds, res.responseContext, goerrors.Join(res.err, l.ctx.subgraphErrors))
}
return err
case *BatchEntityFetch:
@@ -176,7 +176,7 @@ func (l *Loader) resolveSingle(item *FetchItem) error {
}
err = l.mergeResult(item, res, items)
if l.ctx.LoaderHooks != nil && res.loaderHookContext != nil {
- l.ctx.LoaderHooks.OnFinished(res.loaderHookContext, res.statusCode, res.ds, goerrors.Join(res.err, l.ctx.subgraphErrors))
+ l.ctx.LoaderHooks.OnFinished(res.loaderHookContext, res.statusCode, res.ds, res.responseContext, goerrors.Join(res.err, l.ctx.subgraphErrors))
}
return err
case *EntityFetch:
@@ -189,7 +189,7 @@ func (l *Loader) resolveSingle(item *FetchItem) error {
}
err = l.mergeResult(item, res, items)
if l.ctx.LoaderHooks != nil && res.loaderHookContext != nil {
- l.ctx.LoaderHooks.OnFinished(res.loaderHookContext, res.statusCode, res.ds, goerrors.Join(res.err, l.ctx.subgraphErrors))
+ l.ctx.LoaderHooks.OnFinished(res.loaderHookContext, res.statusCode, res.ds, res.responseContext, goerrors.Join(res.err, l.ctx.subgraphErrors))
}
return err
case *ParallelListItemFetch:
@@ -222,7 +222,7 @@ func (l *Loader) resolveSingle(item *FetchItem) error {
for i := range results {
err = l.mergeResult(item, results[i], items[i:i+1])
if l.ctx.LoaderHooks != nil && results[i].loaderHookContext != nil {
- l.ctx.LoaderHooks.OnFinished(results[i].loaderHookContext, results[i].statusCode, results[i].ds, goerrors.Join(results[i].err, l.ctx.subgraphErrors))
+ l.ctx.LoaderHooks.OnFinished(results[i].loaderHookContext, results[i].statusCode, results[i].ds, results[i].responseContext, goerrors.Join(results[i].err, l.ctx.subgraphErrors))
}
if err != nil {
return errors.WithStack(err)
@@ -539,9 +539,10 @@ type result struct {
fetchSkipped bool
nestedMergeItems []*result
- statusCode int
- err error
- ds DataSourceInfo
+ statusCode int
+ err error
+ ds DataSourceInfo
+ responseContext *httpclient.ResponseContext
authorizationRejected bool
authorizationRejectedReasons []string
@@ -1533,6 +1534,7 @@ func (l *Loader) executeSourceLoad(ctx context.Context, fetchItem *FetchItem, so
}
res.statusCode = responseContext.StatusCode
+ res.responseContext = responseContext
if l.ctx.TracingOptions.Enable {
stats := GetSingleFlightStats(ctx)
diff --git a/tmp/agent-patch-flux-pr-1001.1-of-1.2026-02-21__03-36-16__gpt-5-1-codex-mini/app/v2/pkg/engine/resolve/loader_hooks_test.go b/app/v2/pkg/engine/resolve/loader_hooks_test.go
index d77c614..7f84401 100644
--- a/tmp/agent-patch-flux-pr-1001.1-of-1.2026-02-21__03-36-16__gpt-5-1-codex-mini/app/v2/pkg/engine/resolve/loader_hooks_test.go
+++ b/app/v2/pkg/engine/resolve/loader_hooks_test.go
@@ -11,13 +11,15 @@ import (
"github.com/golang/mock/gomock"
"github.com/stretchr/testify/assert"
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
+ "github.com/wundergraph/graphql-go-tools/v2/pkg/engine/datasource/httpclient"
)
type TestLoaderHooks struct {
- preFetchCalls atomic.Int64
- postFetchCalls atomic.Int64
- errors []error
- mu sync.Mutex
+ preFetchCalls atomic.Int64
+ postFetchCalls atomic.Int64
+ errors []error
+ responseContexts []*httpclient.ResponseContext
+ mu sync.Mutex
}
func NewTestLoaderHooks() LoaderHooks {
@@ -35,13 +37,14 @@ func (f *TestLoaderHooks) OnLoad(ctx context.Context, ds DataSourceInfo) context
return ctx
}
-func (f *TestLoaderHooks) OnFinished(ctx context.Context, statusCode int, ds DataSourceInfo, err error) {
+func (f *TestLoaderHooks) OnFinished(ctx context.Context, statusCode int, ds DataSourceInfo, responseContext *httpclient.ResponseContext, err error) {
f.postFetchCalls.Add(1)
f.mu.Lock()
defer f.mu.Unlock()
f.errors = append(f.errors, err)
+ f.responseContexts = append(f.responseContexts, responseContext)
}
func TestLoaderHooks_FetchPipeline(t *testing.T) {
@@ -106,6 +109,9 @@ func TestLoaderHooks_FetchPipeline(t *testing.T) {
assert.Nil(t, subgraphError.DownstreamErrors[0].Extensions)
assert.NotNil(t, resolveCtx.SubgraphErrors())
+
+ assert.Len(t, loaderHooks.responseContexts, 1)
+ assert.NotNil(t, loaderHooks.responseContexts[0])
}
}))