Add intercept response filter

This commit is contained in:
David Stotijn
2022-03-21 10:33:11 +01:00
parent cf55456c42
commit 89141afd3b
15 changed files with 556 additions and 113 deletions

View File

@ -119,8 +119,10 @@ type ComplexityRoot struct {
}
InterceptSettings struct {
Enabled func(childComplexity int) int
RequestFilter func(childComplexity int) int
RequestFilter func(childComplexity int) int
RequestsEnabled func(childComplexity int) int
ResponseFilter func(childComplexity int) int
ResponsesEnabled func(childComplexity int) int
}
ModifyRequestResult struct {
@ -510,13 +512,6 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in
return e.complexity.HTTPResponseLog.StatusReason(childComplexity), true
case "InterceptSettings.enabled":
if e.complexity.InterceptSettings.Enabled == nil {
break
}
return e.complexity.InterceptSettings.Enabled(childComplexity), true
case "InterceptSettings.requestFilter":
if e.complexity.InterceptSettings.RequestFilter == nil {
break
@ -524,6 +519,27 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in
return e.complexity.InterceptSettings.RequestFilter(childComplexity), true
case "InterceptSettings.requestsEnabled":
if e.complexity.InterceptSettings.RequestsEnabled == nil {
break
}
return e.complexity.InterceptSettings.RequestsEnabled(childComplexity), true
case "InterceptSettings.responseFilter":
if e.complexity.InterceptSettings.ResponseFilter == nil {
break
}
return e.complexity.InterceptSettings.ResponseFilter(childComplexity), true
case "InterceptSettings.responsesEnabled":
if e.complexity.InterceptSettings.ResponsesEnabled == nil {
break
}
return e.complexity.InterceptSettings.ResponsesEnabled(childComplexity), true
case "ModifyRequestResult.success":
if e.complexity.ModifyRequestResult.Success == nil {
break
@ -1204,13 +1220,17 @@ type CancelResponseResult {
}
input UpdateInterceptSettingsInput {
enabled: Boolean!
requestsEnabled: Boolean!
responsesEnabled: Boolean!
requestFilter: String
responseFilter: String
}
type InterceptSettings {
enabled: Boolean!
requestsEnabled: Boolean!
responsesEnabled: Boolean!
requestFilter: String
responseFilter: String
}
type Query {
@ -2861,7 +2881,7 @@ func (ec *executionContext) _HttpResponseLog_headers(ctx context.Context, field
return ec.marshalNHttpHeader2ᚕgithubᚗcomᚋdstotijnᚋhettyᚋpkgᚋapiᚐHTTPHeaderᚄ(ctx, field.Selections, res)
}
func (ec *executionContext) _InterceptSettings_enabled(ctx context.Context, field graphql.CollectedField, obj *InterceptSettings) (ret graphql.Marshaler) {
func (ec *executionContext) _InterceptSettings_requestsEnabled(ctx context.Context, field graphql.CollectedField, obj *InterceptSettings) (ret graphql.Marshaler) {
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
@ -2879,7 +2899,42 @@ func (ec *executionContext) _InterceptSettings_enabled(ctx context.Context, fiel
ctx = graphql.WithFieldContext(ctx, fc)
resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) {
ctx = rctx // use context from middleware stack in children
return obj.Enabled, nil
return obj.RequestsEnabled, nil
})
if err != nil {
ec.Error(ctx, err)
return graphql.Null
}
if resTmp == nil {
if !graphql.HasFieldError(ctx, fc) {
ec.Errorf(ctx, "must not be null")
}
return graphql.Null
}
res := resTmp.(bool)
fc.Result = res
return ec.marshalNBoolean2bool(ctx, field.Selections, res)
}
func (ec *executionContext) _InterceptSettings_responsesEnabled(ctx context.Context, field graphql.CollectedField, obj *InterceptSettings) (ret graphql.Marshaler) {
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
ret = graphql.Null
}
}()
fc := &graphql.FieldContext{
Object: "InterceptSettings",
Field: field,
Args: nil,
IsMethod: false,
IsResolver: false,
}
ctx = graphql.WithFieldContext(ctx, fc)
resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) {
ctx = rctx // use context from middleware stack in children
return obj.ResponsesEnabled, nil
})
if err != nil {
ec.Error(ctx, err)
@ -2928,6 +2983,38 @@ func (ec *executionContext) _InterceptSettings_requestFilter(ctx context.Context
return ec.marshalOString2ᚖstring(ctx, field.Selections, res)
}
func (ec *executionContext) _InterceptSettings_responseFilter(ctx context.Context, field graphql.CollectedField, obj *InterceptSettings) (ret graphql.Marshaler) {
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
ret = graphql.Null
}
}()
fc := &graphql.FieldContext{
Object: "InterceptSettings",
Field: field,
Args: nil,
IsMethod: false,
IsResolver: false,
}
ctx = graphql.WithFieldContext(ctx, fc)
resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) {
ctx = rctx // use context from middleware stack in children
return obj.ResponseFilter, nil
})
if err != nil {
ec.Error(ctx, err)
return graphql.Null
}
if resTmp == nil {
return graphql.Null
}
res := resTmp.(*string)
fc.Result = res
return ec.marshalOString2ᚖstring(ctx, field.Selections, res)
}
func (ec *executionContext) _ModifyRequestResult_success(ctx context.Context, field graphql.CollectedField, obj *ModifyRequestResult) (ret graphql.Marshaler) {
defer func() {
if r := recover(); r != nil {
@ -6302,11 +6389,19 @@ func (ec *executionContext) unmarshalInputUpdateInterceptSettingsInput(ctx conte
for k, v := range asMap {
switch k {
case "enabled":
case "requestsEnabled":
var err error
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("enabled"))
it.Enabled, err = ec.unmarshalNBoolean2bool(ctx, v)
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("requestsEnabled"))
it.RequestsEnabled, err = ec.unmarshalNBoolean2bool(ctx, v)
if err != nil {
return it, err
}
case "responsesEnabled":
var err error
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("responsesEnabled"))
it.ResponsesEnabled, err = ec.unmarshalNBoolean2bool(ctx, v)
if err != nil {
return it, err
}
@ -6318,6 +6413,14 @@ func (ec *executionContext) unmarshalInputUpdateInterceptSettingsInput(ctx conte
if err != nil {
return it, err
}
case "responseFilter":
var err error
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("responseFilter"))
it.ResponseFilter, err = ec.unmarshalOString2ᚖstring(ctx, v)
if err != nil {
return it, err
}
}
}
@ -6771,13 +6874,20 @@ func (ec *executionContext) _InterceptSettings(ctx context.Context, sel ast.Sele
switch field.Name {
case "__typename":
out.Values[i] = graphql.MarshalString("InterceptSettings")
case "enabled":
out.Values[i] = ec._InterceptSettings_enabled(ctx, field, obj)
case "requestsEnabled":
out.Values[i] = ec._InterceptSettings_requestsEnabled(ctx, field, obj)
if out.Values[i] == graphql.Null {
invalids++
}
case "responsesEnabled":
out.Values[i] = ec._InterceptSettings_responsesEnabled(ctx, field, obj)
if out.Values[i] == graphql.Null {
invalids++
}
case "requestFilter":
out.Values[i] = ec._InterceptSettings_requestFilter(ctx, field, obj)
case "responseFilter":
out.Values[i] = ec._InterceptSettings_responseFilter(ctx, field, obj)
default:
panic("unknown field " + strconv.Quote(field.Name))
}

View File

@ -98,8 +98,10 @@ type HTTPResponseLog struct {
}
type InterceptSettings struct {
Enabled bool `json:"enabled"`
RequestFilter *string `json:"requestFilter"`
RequestsEnabled bool `json:"requestsEnabled"`
ResponsesEnabled bool `json:"responsesEnabled"`
RequestFilter *string `json:"requestFilter"`
ResponseFilter *string `json:"responseFilter"`
}
type ModifyRequestInput struct {
@ -194,8 +196,10 @@ type SenderRequestInput struct {
}
type UpdateInterceptSettingsInput struct {
Enabled bool `json:"enabled"`
RequestFilter *string `json:"requestFilter"`
RequestsEnabled bool `json:"requestsEnabled"`
ResponsesEnabled bool `json:"responsesEnabled"`
RequestFilter *string `json:"requestFilter"`
ResponseFilter *string `json:"responseFilter"`
}
type HTTPMethod string

View File

@ -596,10 +596,13 @@ func (r *mutationResolver) ModifyResponse(
return nil, fmt.Errorf("malformed HTTP version: %q", res.Proto)
}
var body string
if input.Body != nil {
res.Body = io.NopCloser(strings.NewReader(*input.Body))
body = *input.Body
}
res.Body = io.NopCloser(strings.NewReader(body))
for _, header := range input.Headers {
res.Header.Add(header.Key, header.Value)
}
@ -626,18 +629,28 @@ func (r *mutationResolver) UpdateInterceptSettings(
input UpdateInterceptSettingsInput,
) (*InterceptSettings, error) {
settings := intercept.Settings{
Enabled: input.Enabled,
RequestsEnabled: input.RequestsEnabled,
ResponsesEnabled: input.ResponsesEnabled,
}
if input.RequestFilter != nil && *input.RequestFilter != "" {
expr, err := search.ParseQuery(*input.RequestFilter)
if err != nil {
return nil, fmt.Errorf("could not parse search query: %w", err)
return nil, fmt.Errorf("could not parse request filter: %w", err)
}
settings.RequestFilter = expr
}
if input.ResponseFilter != nil && *input.ResponseFilter != "" {
expr, err := search.ParseQuery(*input.ResponseFilter)
if err != nil {
return nil, fmt.Errorf("could not parse response filter: %w", err)
}
settings.ResponseFilter = expr
}
err := r.ProjectService.UpdateInterceptSettings(ctx, settings)
if errors.Is(err, proj.ErrNoProject) {
return nil, noActiveProjectErr(ctx)
@ -646,7 +659,8 @@ func (r *mutationResolver) UpdateInterceptSettings(
}
updated := &InterceptSettings{
Enabled: settings.Enabled,
RequestsEnabled: settings.RequestsEnabled,
ResponsesEnabled: settings.ResponsesEnabled,
}
if settings.RequestFilter != nil {
@ -654,6 +668,11 @@ func (r *mutationResolver) UpdateInterceptSettings(
updated.RequestFilter = &reqFilter
}
if settings.ResponseFilter != nil {
resFilter := settings.ResponseFilter.String()
updated.ResponseFilter = &resFilter
}
return updated, nil
}
@ -842,7 +861,8 @@ func parseProject(projSvc proj.Service, p proj.Project) Project {
IsActive: projSvc.IsProjectActive(p.ID),
Settings: &ProjectSettings{
Intercept: &InterceptSettings{
Enabled: p.Settings.InterceptEnabled,
RequestsEnabled: p.Settings.InterceptRequests,
ResponsesEnabled: p.Settings.InterceptResponses,
},
},
}
@ -852,6 +872,11 @@ func parseProject(projSvc proj.Service, p proj.Project) Project {
project.Settings.Intercept.RequestFilter = &interceptReqFilter
}
if p.Settings.InterceptResponseFilter != nil {
interceptResFilter := p.Settings.InterceptResponseFilter.String()
project.Settings.Intercept.ResponseFilter = &interceptResFilter
}
return project
}

View File

@ -179,13 +179,17 @@ type CancelResponseResult {
}
input UpdateInterceptSettingsInput {
enabled: Boolean!
requestsEnabled: Boolean!
responsesEnabled: Boolean!
requestFilter: String
responseFilter: String
}
type InterceptSettings {
enabled: Boolean!
requestsEnabled: Boolean!
responsesEnabled: Boolean!
requestFilter: String
responseFilter: String
}
type Query {