Update error behaviour

This commit is contained in:
Neil Alexander 2022-08-09 12:31:13 +01:00
parent 3716f207bb
commit fb0c38fbd2
No known key found for this signature in database
GPG key ID: A02A2019A2BB0944
2 changed files with 12 additions and 28 deletions

View file

@ -33,15 +33,15 @@ import (
func PostJSON[reqtype, restype any, errtype error]( func PostJSON[reqtype, restype any, errtype error](
ctx context.Context, span opentracing.Span, httpClient *http.Client, ctx context.Context, span opentracing.Span, httpClient *http.Client,
apiURL string, request *reqtype, response *restype, apiURL string, request *reqtype, response *restype,
) (*errtype, error) { ) error {
jsonBytes, err := json.Marshal(request) jsonBytes, err := json.Marshal(request)
if err != nil { if err != nil {
return nil, err return err
} }
parsedAPIURL, err := url.Parse(apiURL) parsedAPIURL, err := url.Parse(apiURL)
if err != nil { if err != nil {
return nil, err return err
} }
parsedAPIURL.Path = InternalPathPrefix + strings.TrimLeft(parsedAPIURL.Path, "/") parsedAPIURL.Path = InternalPathPrefix + strings.TrimLeft(parsedAPIURL.Path, "/")
@ -49,7 +49,7 @@ func PostJSON[reqtype, restype any, errtype error](
req, err := http.NewRequest(http.MethodPost, apiURL, bytes.NewReader(jsonBytes)) req, err := http.NewRequest(http.MethodPost, apiURL, bytes.NewReader(jsonBytes))
if err != nil { if err != nil {
return nil, err return err
} }
// Mark the span as being an RPC client. // Mark the span as being an RPC client.
@ -58,7 +58,7 @@ func PostJSON[reqtype, restype any, errtype error](
tracer := opentracing.GlobalTracer() tracer := opentracing.GlobalTracer()
if err = tracer.Inject(span.Context(), opentracing.HTTPHeaders, carrier); err != nil { if err = tracer.Inject(span.Context(), opentracing.HTTPHeaders, carrier); err != nil {
return nil, err return err
} }
req.Header.Set("Content-Type", "application/json") req.Header.Set("Content-Type", "application/json")
@ -68,17 +68,17 @@ func PostJSON[reqtype, restype any, errtype error](
defer (func() { err = res.Body.Close() })() defer (func() { err = res.Body.Close() })()
} }
if err != nil { if err != nil {
return nil, err return err
} }
if res.StatusCode != http.StatusOK { if res.StatusCode != http.StatusOK {
var errorBody errtype var errorBody errtype
if msgerr := json.NewDecoder(res.Body).Decode(&errorBody); msgerr != nil { if msgerr := json.NewDecoder(res.Body).Decode(&errorBody); msgerr != nil {
return nil, fmt.Errorf("internal API: %d from %s", res.StatusCode, apiURL) return fmt.Errorf("internal API: %d from %s", res.StatusCode, apiURL)
} }
return &errorBody, nil return errorBody
} }
if err := json.NewDecoder(res.Body).Decode(response); err != nil { if err := json.NewDecoder(res.Body).Decode(response); err != nil {
return nil, fmt.Errorf("json.NewDecoder.Decode: %w", err) return fmt.Errorf("json.NewDecoder.Decode: %w", err)
} }
return nil, nil return nil
} }

View file

@ -55,15 +55,7 @@ func CallInternalRPCAPI[req, res any](name, url string, client *http.Client, ctx
span, ctx := opentracing.StartSpanFromContext(ctx, name) span, ctx := opentracing.StartSpanFromContext(ctx, name)
defer span.Finish() defer span.Finish()
remoteErr, localErr := PostJSON[req, res, error](ctx, span, client, url, request, response) return PostJSON[req, res, error](ctx, span, client, url, request, response)
switch {
case localErr != nil:
return localErr
case remoteErr != nil:
return *remoteErr
default:
return nil
}
} }
func CallInternalProxyAPI[req, res any, errtype error](name, url string, client *http.Client, ctx context.Context, request *req) (res, error) { func CallInternalProxyAPI[req, res any, errtype error](name, url string, client *http.Client, ctx context.Context, request *req) (res, error) {
@ -71,13 +63,5 @@ func CallInternalProxyAPI[req, res any, errtype error](name, url string, client
defer span.Finish() defer span.Finish()
var response res var response res
remoteErr, localErr := PostJSON[req, res, errtype](ctx, span, client, url, request, &response) return response, PostJSON[req, res, errtype](ctx, span, client, url, request, &response)
switch {
case localErr != nil:
return response, localErr
case remoteErr != nil:
return response, *remoteErr
default:
return response, nil
}
} }