diff --git a/knotserver/xrpc/list_keys.go b/knotserver/xrpc/list_keys.go --- a/knotserver/xrpc/list_keys.go +++ b/knotserver/xrpc/list_keys.go @@ -1,7 +1,6 @@ package xrpc import ( - "encoding/json" "net/http" "strconv" @@ -46,13 +45,5 @@ if nextCursor != "" { response.Cursor = &nextCursor } - w.Header().Set("Content-Type", "application/json") - if err := json.NewEncoder(w).Encode(response); err != nil { - x.Logger.Error("failed to encode response", "error", err) - writeError(w, xrpcerr.NewXrpcError( - xrpcerr.WithTag("InternalServerError"), - xrpcerr.WithMessage("failed to encode response"), - ), http.StatusInternalServerError) - return - } + writeJson(w, response) } diff --git a/knotserver/xrpc/owner.go b/knotserver/xrpc/owner.go --- a/knotserver/xrpc/owner.go +++ b/knotserver/xrpc/owner.go @@ -1,7 +1,6 @@ package xrpc import ( - "encoding/json" "net/http" "tangled.sh/tangled.sh/core/api/tangled" @@ -19,13 +18,5 @@ response := tangled.Owner_Output{ Owner: owner, } - w.Header().Set("Content-Type", "application/json") - if err := json.NewEncoder(w).Encode(response); err != nil { - x.Logger.Error("failed to encode response", "error", err) - writeError(w, xrpcerr.NewXrpcError( - xrpcerr.WithTag("InternalServerError"), - xrpcerr.WithMessage("failed to encode response"), - ), http.StatusInternalServerError) - return - } + writeJson(w, response) } diff --git a/knotserver/xrpc/repo_blob.go b/knotserver/xrpc/repo_blob.go --- a/knotserver/xrpc/repo_blob.go +++ b/knotserver/xrpc/repo_blob.go @@ -3,7 +3,6 @@ import ( "crypto/sha256" "encoding/base64" - "encoding/json" "fmt" "net/http" "path/filepath" @@ -124,15 +123,7 @@ if mimeType != "" { response.MimeType = &mimeType } - w.Header().Set("Content-Type", "application/json") - if err := json.NewEncoder(w).Encode(response); err != nil { - x.Logger.Error("failed to encode response", "error", err) - writeError(w, xrpcerr.NewXrpcError( - xrpcerr.WithTag("InternalServerError"), - xrpcerr.WithMessage("failed to encode response"), - ), http.StatusInternalServerError) - return - } + writeJson(w, response) } // isTextualMimeType returns true if the MIME type represents textual content diff --git a/knotserver/xrpc/repo_branch.go b/knotserver/xrpc/repo_branch.go --- a/knotserver/xrpc/repo_branch.go +++ b/knotserver/xrpc/repo_branch.go @@ -1,7 +1,6 @@ package xrpc import ( - "encoding/json" "net/http" "net/url" "time" @@ -82,13 +81,5 @@ Email: commit.Author.Email, When: commit.Author.When.Format(time.RFC3339), } - w.Header().Set("Content-Type", "application/json") - if err := json.NewEncoder(w).Encode(response); err != nil { - x.Logger.Error("failed to encode response", "error", err) - writeError(w, xrpcerr.NewXrpcError( - xrpcerr.WithTag("InternalServerError"), - xrpcerr.WithMessage("failed to encode response"), - ), http.StatusInternalServerError) - return - } + writeJson(w, response) } diff --git a/knotserver/xrpc/repo_branches.go b/knotserver/xrpc/repo_branches.go --- a/knotserver/xrpc/repo_branches.go +++ b/knotserver/xrpc/repo_branches.go @@ -1,7 +1,6 @@ package xrpc import ( - "encoding/json" "net/http" "strconv" @@ -53,14 +52,5 @@ response := types.RepoBranchesResponse{ Branches: paginatedBranches, } - // Write JSON response directly - w.Header().Set("Content-Type", "application/json") - if err := json.NewEncoder(w).Encode(response); err != nil { - x.Logger.Error("failed to encode response", "error", err) - writeError(w, xrpcerr.NewXrpcError( - xrpcerr.WithTag("InternalServerError"), - xrpcerr.WithMessage("failed to encode response"), - ), http.StatusInternalServerError) - return - } + writeJson(w, response) } diff --git a/knotserver/xrpc/repo_compare.go b/knotserver/xrpc/repo_compare.go --- a/knotserver/xrpc/repo_compare.go +++ b/knotserver/xrpc/repo_compare.go @@ -1,7 +1,6 @@ package xrpc import ( - "encoding/json" "fmt" "net/http" @@ -72,20 +71,12 @@ ), http.StatusBadRequest) return } - resp := types.RepoFormatPatchResponse{ + response := types.RepoFormatPatchResponse{ Rev1: commit1.Hash.String(), Rev2: commit2.Hash.String(), FormatPatch: formatPatch, Patch: rawPatch, } - w.Header().Set("Content-Type", "application/json") - if err := json.NewEncoder(w).Encode(resp); err != nil { - x.Logger.Error("failed to encode response", "error", err) - writeError(w, xrpcerr.NewXrpcError( - xrpcerr.WithTag("InternalServerError"), - xrpcerr.WithMessage("failed to encode response"), - ), http.StatusInternalServerError) - return - } + writeJson(w, response) } diff --git a/knotserver/xrpc/repo_diff.go b/knotserver/xrpc/repo_diff.go --- a/knotserver/xrpc/repo_diff.go +++ b/knotserver/xrpc/repo_diff.go @@ -1,7 +1,6 @@ package xrpc import ( - "encoding/json" "net/http" "tangled.sh/tangled.sh/core/knotserver/git" @@ -33,18 +32,10 @@ writeError(w, xrpcerr.RefNotFoundError, http.StatusInternalServerError) return } - resp := types.RepoCommitResponse{ + response := types.RepoCommitResponse{ Ref: ref, Diff: diff, } - w.Header().Set("Content-Type", "application/json") - if err := json.NewEncoder(w).Encode(resp); err != nil { - x.Logger.Error("failed to encode response", "error", err) - writeError(w, xrpcerr.NewXrpcError( - xrpcerr.WithTag("InternalServerError"), - xrpcerr.WithMessage("failed to encode response"), - ), http.StatusInternalServerError) - return - } + writeJson(w, response) } diff --git a/knotserver/xrpc/repo_get_default_branch.go b/knotserver/xrpc/repo_get_default_branch.go --- a/knotserver/xrpc/repo_get_default_branch.go +++ b/knotserver/xrpc/repo_get_default_branch.go @@ -1,7 +1,6 @@ package xrpc import ( - "encoding/json" "net/http" "time" @@ -36,13 +35,5 @@ Hash: "", When: time.UnixMicro(0).Format(time.RFC3339), } - w.Header().Set("Content-Type", "application/json") - if err := json.NewEncoder(w).Encode(response); err != nil { - x.Logger.Error("failed to encode response", "error", err) - writeError(w, xrpcerr.NewXrpcError( - xrpcerr.WithTag("InternalServerError"), - xrpcerr.WithMessage("failed to encode response"), - ), http.StatusInternalServerError) - return - } + writeJson(w, response) } diff --git a/knotserver/xrpc/repo_languages.go b/knotserver/xrpc/repo_languages.go --- a/knotserver/xrpc/repo_languages.go +++ b/knotserver/xrpc/repo_languages.go @@ -2,7 +2,6 @@ package xrpc import ( "context" - "encoding/json" "math" "net/http" "time" @@ -73,13 +72,5 @@ totalFiles := int64(len(sizes)) response.TotalFiles = &totalFiles } - w.Header().Set("Content-Type", "application/json") - if err := json.NewEncoder(w).Encode(response); err != nil { - x.Logger.Error("failed to encode response", "error", err) - writeError(w, xrpcerr.NewXrpcError( - xrpcerr.WithTag("InternalServerError"), - xrpcerr.WithMessage("failed to encode response"), - ), http.StatusInternalServerError) - return - } + writeJson(w, response) } diff --git a/knotserver/xrpc/repo_log.go b/knotserver/xrpc/repo_log.go --- a/knotserver/xrpc/repo_log.go +++ b/knotserver/xrpc/repo_log.go @@ -1,7 +1,6 @@ package xrpc import ( - "encoding/json" "net/http" "strconv" @@ -78,14 +77,5 @@ } response.Log = true - // Write JSON response directly - w.Header().Set("Content-Type", "application/json") - if err := json.NewEncoder(w).Encode(response); err != nil { - x.Logger.Error("failed to encode response", "error", err) - writeError(w, xrpcerr.NewXrpcError( - xrpcerr.WithTag("InternalServerError"), - xrpcerr.WithMessage("failed to encode response"), - ), http.StatusInternalServerError) - return - } + writeJson(w, response) } diff --git a/knotserver/xrpc/repo_tags.go b/knotserver/xrpc/repo_tags.go --- a/knotserver/xrpc/repo_tags.go +++ b/knotserver/xrpc/repo_tags.go @@ -1,7 +1,6 @@ package xrpc import ( - "encoding/json" "net/http" "strconv" @@ -83,14 +82,5 @@ response := types.RepoTagsResponse{ Tags: paginatedTags, } - // Write JSON response directly - w.Header().Set("Content-Type", "application/json") - if err := json.NewEncoder(w).Encode(response); err != nil { - x.Logger.Error("failed to encode response", "error", err) - writeError(w, xrpcerr.NewXrpcError( - xrpcerr.WithTag("InternalServerError"), - xrpcerr.WithMessage("failed to encode response"), - ), http.StatusInternalServerError) - return - } + writeJson(w, response) } diff --git a/knotserver/xrpc/repo_tree.go b/knotserver/xrpc/repo_tree.go --- a/knotserver/xrpc/repo_tree.go +++ b/knotserver/xrpc/repo_tree.go @@ -1,7 +1,6 @@ package xrpc import ( - "encoding/json" "net/http" "path/filepath" "time" @@ -86,13 +85,5 @@ Dotdot: dotdotPtr, Files: treeEntries, } - w.Header().Set("Content-Type", "application/json") - if err := json.NewEncoder(w).Encode(response); err != nil { - x.Logger.Error("failed to encode response", "error", err) - writeError(w, xrpcerr.NewXrpcError( - xrpcerr.WithTag("InternalServerError"), - xrpcerr.WithMessage("failed to encode response"), - ), http.StatusInternalServerError) - return - } + writeJson(w, response) } diff --git a/knotserver/xrpc/version.go b/knotserver/xrpc/version.go --- a/knotserver/xrpc/version.go +++ b/knotserver/xrpc/version.go @@ -1,13 +1,11 @@ package xrpc import ( - "encoding/json" "fmt" "net/http" "runtime/debug" "tangled.sh/tangled.sh/core/api/tangled" - xrpcerr "tangled.sh/tangled.sh/core/xrpc/errors" ) // version is set during build time. @@ -58,13 +56,5 @@ response := tangled.KnotVersion_Output{ Version: version, } - w.Header().Set("Content-Type", "application/json") - if err := json.NewEncoder(w).Encode(response); err != nil { - x.Logger.Error("failed to encode response", "error", err) - writeError(w, xrpcerr.NewXrpcError( - xrpcerr.WithTag("InternalServerError"), - xrpcerr.WithMessage("failed to encode response"), - ), http.StatusInternalServerError) - return - } + writeJson(w, response) } diff --git a/knotserver/xrpc/xrpc.go b/knotserver/xrpc/xrpc.go --- a/knotserver/xrpc/xrpc.go +++ b/knotserver/xrpc/xrpc.go @@ -117,3 +117,11 @@ w.Header().Set("Content-Type", "application/json") w.WriteHeader(status) json.NewEncoder(w).Encode(e) } + +func writeJson(w http.ResponseWriter, response any) { + w.Header().Set("Content-Type", "application/json") + if err := json.NewEncoder(w).Encode(response); err != nil { + writeError(w, xrpcerr.GenericError(err), http.StatusInternalServerError) + return + } +}