diff --git a/internal/httputil/http.go b/internal/httputil/http.go index e2d98623b..7f18b8578 100644 --- a/internal/httputil/http.go +++ b/internal/httputil/http.go @@ -33,15 +33,15 @@ import ( func PostJSON[reqtype, restype any, errtype error]( ctx context.Context, span opentracing.Span, httpClient *http.Client, apiURL string, request *reqtype, response *restype, -) error { +) (*errtype, error) { jsonBytes, err := json.Marshal(request) if err != nil { - return err + return nil, err } parsedAPIURL, err := url.Parse(apiURL) if err != nil { - return err + return nil, err } 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)) if err != nil { - return err + return nil, err } // Mark the span as being an RPC client. @@ -58,7 +58,7 @@ func PostJSON[reqtype, restype any, errtype error]( tracer := opentracing.GlobalTracer() if err = tracer.Inject(span.Context(), opentracing.HTTPHeaders, carrier); err != nil { - return err + return nil, err } req.Header.Set("Content-Type", "application/json") @@ -68,17 +68,17 @@ func PostJSON[reqtype, restype any, errtype error]( defer (func() { err = res.Body.Close() })() } if err != nil { - return err + return nil, err } if res.StatusCode != http.StatusOK { var errorBody errtype if msgerr := json.NewDecoder(res.Body).Decode(&errorBody); msgerr != nil { - return fmt.Errorf("internal API: %d from %s (failed to decode error: %s)", res.StatusCode, apiURL, msgerr) + return nil, fmt.Errorf("internal API: %d from %s", res.StatusCode, apiURL) } - return errorBody + return &errorBody, nil } if err := json.NewDecoder(res.Body).Decode(response); err != nil { - return fmt.Errorf("json.NewDecoder.Decode: %w", err) + return nil, fmt.Errorf("json.NewDecoder.Decode: %w", err) } - return nil + return nil, nil } diff --git a/internal/httputil/internalapi.go b/internal/httputil/internalapi.go index 5dcc596cc..4cdb67567 100644 --- a/internal/httputil/internalapi.go +++ b/internal/httputil/internalapi.go @@ -55,7 +55,15 @@ func CallInternalRPCAPI[req, res any](name, url string, client *http.Client, ctx span, ctx := opentracing.StartSpanFromContext(ctx, name) defer span.Finish() - return PostJSON[req, res, error](ctx, span, client, url, request, response) + remoteErr, localErr := 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) { @@ -63,5 +71,13 @@ func CallInternalProxyAPI[req, res any, errtype error](name, url string, client defer span.Finish() var response res - return response, PostJSON[req, res, errtype](ctx, span, client, url, request, &response) + remoteErr, localErr := 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 + } } diff --git a/roomserver/inthttp/client.go b/roomserver/inthttp/client.go index 5916a0b42..d16f67c69 100644 --- a/roomserver/inthttp/client.go +++ b/roomserver/inthttp/client.go @@ -152,10 +152,12 @@ func (h *httpRoomserverInternalAPI) InputRoomEvents( request *api.InputRoomEventsRequest, response *api.InputRoomEventsResponse, ) error { - response.ErrMsg = httputil.CallInternalRPCAPI( + if err := httputil.CallInternalRPCAPI( "InputRoomEvents", h.roomserverURL+RoomserverInputRoomEventsPath, h.httpClient, ctx, request, response, - ).Error() + ); err != nil { + response.ErrMsg = err.Error() + } return nil }