Skip to content

Commit

Permalink
Merge branch 'master' into dave/eng-5665-automate-go-tools-upgrade-pr…
Browse files Browse the repository at this point in the history
…ocess
  • Loading branch information
df-wg authored Nov 4, 2024
2 parents fcc5194 + 228e1b1 commit 102c711
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 21 deletions.
76 changes: 60 additions & 16 deletions v2/pkg/engine/resolve/loader.go
Original file line number Diff line number Diff line change
Expand Up @@ -468,7 +468,7 @@ func (l *Loader) mergeResult(fetchItem *FetchItem, res *result, items []*astjson
if res.out.Len() == 0 {
return l.renderErrorsFailedToFetch(fetchItem, res, emptyGraphQLResponse)
}
value, err := l.resolvable.parseJSON(res.out.Bytes())
value, err := l.resolvable.parseJSONBytes(res.out.Bytes())
if err != nil {
return l.renderErrorsFailedToFetch(fetchItem, res, invalidGraphQLResponse)
}
Expand Down Expand Up @@ -516,7 +516,7 @@ func (l *Loader) mergeResult(fetchItem *FetchItem, res *result, items []*astjson
if err != nil {
return errors.WithStack(err)
}
value, err = l.resolvable.parseJSON(postProcessed.Bytes())
value, err = l.resolvable.parseJSONBytes(postProcessed.Bytes())
if err != nil {
return errors.WithStack(err)
}
Expand Down Expand Up @@ -569,7 +569,11 @@ func (l *Loader) mergeResult(fetchItem *FetchItem, res *result, items []*astjson
if err != nil {
return errors.WithStack(err)
}
nodeProcessed := astjson.MustParseBytes(postProcessed.Bytes())
nodeProcessed, err := l.resolvable.parseJSONBytes(postProcessed.Bytes())
if err != nil {
return err
}

astjson.MergeValuesWithPath(items[i], nodeProcessed, res.postProcessing.MergePath...)
}
} else {
Expand Down Expand Up @@ -710,8 +714,11 @@ func (l *Loader) mergeErrors(res *result, fetchItem *FetchItem, value *astjson.V
}

// Wrap mode (default)
errorObject, err := l.resolvable.parseJSONString(l.renderSubgraphBaseError(res.ds, fetchItem.ResponsePath, failedToFetchNoReason))
if err != nil {
return err
}

errorObject := astjson.MustParse(l.renderSubgraphBaseError(res.ds, fetchItem.ResponsePath, failedToFetchNoReason))
if l.propagateSubgraphErrors {
// Attach all errors to the root array in the "errors" extension field
astjson.SetValue(errorObject, value, "extensions", "errors")
Expand Down Expand Up @@ -886,7 +893,11 @@ func (l *Loader) optionallyRewriteErrorPaths(fetchItem *FetchItem, values []*ast
newPath = append(newPath, unsafebytes.BytesToString(pathItems[j].GetStringBytes()))
}
newPathJSON, _ := json.Marshal(newPath)
value.Set("path", astjson.MustParseBytes(newPathJSON))
pathBytes, err := l.resolvable.parseJSONBytes(newPathJSON)
if err != nil {
continue
}
value.Set("path", pathBytes)
break
}
}
Expand All @@ -908,9 +919,17 @@ func (l *Loader) setSubgraphStatusCode(values []*astjson.Value, statusCode int)
if extensions.Type() != astjson.TypeObject {
continue
}
extensions.Set("statusCode", astjson.MustParse(strconv.Itoa(statusCode)))
v, err := l.resolvable.parseJSONString(strconv.Itoa(statusCode))
if err != nil {
continue
}
extensions.Set("statusCode", v)
} else {
value.Set("extensions", astjson.MustParse(`{"statusCode":`+strconv.Itoa(statusCode)+`}`))
v, err := l.resolvable.parseJSONString(`{"statusCode":` + strconv.Itoa(statusCode) + `}`)
if err != nil {
continue
}
value.Set("extensions", v)
}
}
}
Expand All @@ -931,7 +950,7 @@ func (l *Loader) renderAtPathErrorPart(path string) string {

func (l *Loader) renderErrorsFailedToFetch(fetchItem *FetchItem, res *result, reason string) error {
l.ctx.appendSubgraphError(goerrors.Join(res.err, NewSubgraphError(res.ds, fetchItem.ResponsePath, reason, res.statusCode)))
errorObject, err := astjson.Parse(l.renderSubgraphBaseError(res.ds, fetchItem.ResponsePath, reason))
errorObject, err := l.resolvable.parseJSONString(l.renderSubgraphBaseError(res.ds, fetchItem.ResponsePath, reason))
if err != nil {
return err
}
Expand Down Expand Up @@ -962,20 +981,32 @@ func (l *Loader) renderAuthorizationRejectedErrors(fetchItem *FetchItem, res *re
if res.ds.Name == "" {
for _, reason := range res.authorizationRejectedReasons {
if reason == "" {
errorObject := astjson.MustParse(fmt.Sprintf(`{"message":"Unauthorized Subgraph request%s."}`, pathPart))
errorObject, err := l.resolvable.parseJSONString(fmt.Sprintf(`{"message":"Unauthorized Subgraph request%s."}`, pathPart))
if err != nil {
continue
}
astjson.AppendToArray(l.resolvable.errors, errorObject)
} else {
errorObject := astjson.MustParse(fmt.Sprintf(`{"message":"Unauthorized Subgraph request%s, Reason: %s."}`, pathPart, reason))
errorObject, err := l.resolvable.parseJSONString(fmt.Sprintf(`{"message":"Unauthorized Subgraph request%s, Reason: %s."}`, pathPart, reason))
if err != nil {
continue
}
astjson.AppendToArray(l.resolvable.errors, errorObject)
}
}
} else {
for _, reason := range res.authorizationRejectedReasons {
if reason == "" {
errorObject := astjson.MustParse(fmt.Sprintf(`{"message":"Unauthorized request to Subgraph '%s'%s."}`, res.ds.Name, pathPart))
errorObject, err := l.resolvable.parseJSONString(fmt.Sprintf(`{"message":"Unauthorized request to Subgraph '%s'%s."}`, res.ds.Name, pathPart))
if err != nil {
continue
}
astjson.AppendToArray(l.resolvable.errors, errorObject)
} else {
errorObject := astjson.MustParse(fmt.Sprintf(`{"message":"Unauthorized request to Subgraph '%s'%s, Reason: %s."}`, res.ds.Name, pathPart, reason))
errorObject, err := l.resolvable.parseJSONString(fmt.Sprintf(`{"message":"Unauthorized request to Subgraph '%s'%s, Reason: %s."}`, res.ds.Name, pathPart, reason))
if err != nil {
continue
}
astjson.AppendToArray(l.resolvable.errors, errorObject)
}
}
Expand All @@ -988,18 +1019,30 @@ func (l *Loader) renderRateLimitRejectedErrors(fetchItem *FetchItem, res *result
pathPart := l.renderAtPathErrorPart(fetchItem.ResponsePath)
if res.ds.Name == "" {
if res.rateLimitRejectedReason == "" {
errorObject := astjson.MustParse(fmt.Sprintf(`{"message":"Rate limit exceeded for Subgraph request%s."}`, pathPart))
errorObject, err := l.resolvable.parseJSONString(fmt.Sprintf(`{"message":"Rate limit exceeded for Subgraph request%s."}`, pathPart))
if err != nil {
return err
}
astjson.AppendToArray(l.resolvable.errors, errorObject)
} else {
errorObject := astjson.MustParse(fmt.Sprintf(`{"message":"Rate limit exceeded for Subgraph request%s, Reason: %s."}`, pathPart, res.rateLimitRejectedReason))
errorObject, err := l.resolvable.parseJSONString(fmt.Sprintf(`{"message":"Rate limit exceeded for Subgraph request%s, Reason: %s."}`, pathPart, res.rateLimitRejectedReason))
if err != nil {
return err
}
astjson.AppendToArray(l.resolvable.errors, errorObject)
}
} else {
if res.rateLimitRejectedReason == "" {
errorObject := astjson.MustParse(fmt.Sprintf(`{"message":"Rate limit exceeded for Subgraph '%s'%s."}`, res.ds.Name, pathPart))
errorObject, err := l.resolvable.parseJSONString(fmt.Sprintf(`{"message":"Rate limit exceeded for Subgraph '%s'%s."}`, res.ds.Name, pathPart))
if err != nil {
return err
}
astjson.AppendToArray(l.resolvable.errors, errorObject)
} else {
errorObject := astjson.MustParse(fmt.Sprintf(`{"message":"Rate limit exceeded for Subgraph '%s'%s, Reason: %s."}`, res.ds.Name, pathPart, res.rateLimitRejectedReason))
errorObject, err := l.resolvable.parseJSONString(fmt.Sprintf(`{"message":"Rate limit exceeded for Subgraph '%s'%s, Reason: %s."}`, res.ds.Name, pathPart, res.rateLimitRejectedReason))
if err != nil {
return err
}
astjson.AppendToArray(l.resolvable.errors, errorObject)
}
}
Expand Down Expand Up @@ -1112,6 +1155,7 @@ func (l *Loader) loadSingleFetch(ctx context.Context, fetch *SingleFetch, fetchI
return l.renderErrorsInvalidInput(fetchItem, res.out)
}
fetchInput := buf.preparedInput.Bytes()

allowed, err := l.validatePreFetch(fetchInput, fetch.Info, res)
if err != nil {
return err
Expand Down
20 changes: 15 additions & 5 deletions v2/pkg/engine/resolve/resolvable.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,12 +77,18 @@ var (
parsers = &astjson.ParserPool{}
)

func (r *Resolvable) parseJSON(data []byte) (*astjson.Value, error) {
func (r *Resolvable) parseJSONBytes(data []byte) (*astjson.Value, error) {
parser := parsers.Get()
r.parsers = append(r.parsers, parser)
return parser.ParseBytes(data)
}

func (r *Resolvable) parseJSONString(data string) (*astjson.Value, error) {
parser := parsers.Get()
r.parsers = append(r.parsers, parser)
return parser.Parse(data)
}

func (r *Resolvable) Reset(maxRecyclableParserSize int) {
for i := range r.parsers {
parsers.PutIfSizeLessThan(r.parsers[i], maxRecyclableParserSize)
Expand Down Expand Up @@ -122,13 +128,13 @@ func (r *Resolvable) Init(ctx *Context, initialData []byte, operationType ast.Op
r.data = r.astjsonArena.NewObject()
r.errors = r.astjsonArena.NewArray()
if len(ctx.Variables) != 0 {
r.variables, err = astjson.ParseBytes(ctx.Variables)
r.variables, err = r.parseJSONBytes(ctx.Variables)
if err != nil {
return err
}
}
if initialData != nil {
initialValue, err := astjson.ParseBytes(initialData)
initialValue, err := r.parseJSONBytes(initialData)
if err != nil {
return err
}
Expand All @@ -142,10 +148,14 @@ func (r *Resolvable) InitSubscription(ctx *Context, initialData []byte, postProc
r.operationType = ast.OperationTypeSubscription
r.renameTypeNames = ctx.RenameTypeNames
if len(ctx.Variables) != 0 {
r.variables = astjson.MustParseBytes(ctx.Variables)
variablesBytes, err := r.parseJSONBytes(ctx.Variables)
if err != nil {
return err
}
r.variables = variablesBytes
}
if initialData != nil {
initialValue, err := astjson.ParseBytes(initialData)
initialValue, err := r.parseJSONBytes(initialData)
if err != nil {
return err
}
Expand Down

0 comments on commit 102c711

Please sign in to comment.