From f0e15250b9e322cc7731ba026d12387c2b549a42 Mon Sep 17 00:00:00 2001 From: zeripath Date: Mon, 1 Mar 2021 21:08:10 +0000 Subject: [PATCH] Migrate to use jsoniter instead of encoding/json (#14841) * Migrate to use jsoniter * fix tests * update gitea.com/go-chi/binding Signed-off-by: Andrew Thornton Co-authored-by: 6543 <6543@obermui.de> --- build/generate-emoji.go | 5 ++++- cmd/dump.go | 3 ++- cmd/serv.go | 3 ++- go.mod | 3 ++- go.sum | 4 ++-- integrations/api_admin_test.go | 3 ++- integrations/api_helper_for_declarative_test.go | 4 +++- integrations/create_no_session_test.go | 4 +++- integrations/integration_test.go | 6 +++++- integrations/oauth_test.go | 10 +++++++++- integrations/repo_commits_test.go | 3 ++- integrations/testlogger.go | 3 ++- models/issue_comment.go | 5 ++++- models/login_source.go | 12 +++++++++++- models/migrations/v130.go | 4 ++-- models/repo_unit.go | 12 +++++++++++- models/task.go | 4 +++- models/user_heatmap_test.go | 3 ++- models/webhook.go | 7 ++++++- models/webhook_test.go | 3 ++- modules/context/context.go | 3 ++- modules/eventsource/event.go | 4 +++- modules/httplib/httplib.go | 4 +++- modules/indexer/code/elastic_search.go | 3 ++- modules/lfs/locks.go | 4 +++- modules/lfs/server.go | 7 ++++++- modules/log/conn.go | 7 +++++-- modules/log/conn_test.go | 3 ++- modules/log/console.go | 7 +++++-- modules/log/console_test.go | 3 ++- modules/log/file.go | 5 +++-- modules/log/level.go | 4 +++- modules/log/level_test.go | 3 ++- modules/log/smtp.go | 7 +++++-- modules/notification/action/action.go | 4 +++- modules/private/hook.go | 4 +++- modules/private/internal.go | 3 ++- modules/private/mail.go | 3 ++- modules/private/manager.go | 4 +++- modules/private/serv.go | 4 +++- modules/queue/helper.go | 5 ++++- modules/queue/manager.go | 3 ++- modules/queue/queue_bytefifo.go | 4 +++- modules/queue/queue_test.go | 3 ++- modules/queue/setting.go | 3 ++- modules/recaptcha/recaptcha.go | 3 ++- modules/session/virtual.go | 3 ++- modules/setting/log.go | 3 ++- modules/setting/session.go | 3 ++- modules/setting/setting.go | 3 ++- modules/setting/setting_test.go | 3 ++- modules/storage/helper.go | 4 +++- modules/structs/hook.go | 14 +++++++++++++- modules/structs/user.go | 4 +++- modules/task/task.go | 3 ++- modules/templates/helper.go | 6 +++++- routers/admin/admin.go | 3 ++- routers/api/v1/utils/hook.go | 4 +++- routers/events/events.go | 3 ++- routers/private/mail.go | 3 ++- routers/private/manager.go | 3 ++- routers/repo/editor.go | 3 ++- routers/repo/webhook.go | 10 +++++++++- routers/user/home.go | 3 ++- services/gitdiff/gitdiff_test.go | 5 +++-- services/pull/pull.go | 3 ++- services/webhook/dingtalk.go | 3 ++- services/webhook/discord.go | 5 ++++- services/webhook/feishu.go | 3 ++- services/webhook/matrix.go | 6 +++++- services/webhook/msteams.go | 3 ++- services/webhook/slack.go | 5 ++++- services/webhook/telegram.go | 4 +++- vendor/gitea.com/go-chi/binding/binding.go | 4 +++- vendor/gitea.com/go-chi/binding/go.mod | 1 + vendor/gitea.com/go-chi/binding/go.sum | 15 +++++++++++++++ vendor/modules.txt | 3 ++- 77 files changed, 264 insertions(+), 82 deletions(-) diff --git a/build/generate-emoji.go b/build/generate-emoji.go index c544fd0af9..53c5285b23 100644 --- a/build/generate-emoji.go +++ b/build/generate-emoji.go @@ -8,7 +8,6 @@ package main import ( - "encoding/json" "flag" "fmt" "go/format" @@ -20,6 +19,8 @@ import ( "strconv" "strings" "unicode/utf8" + + jsoniter "github.com/json-iterator/go" ) const ( @@ -50,6 +51,7 @@ func (e Emoji) MarshalJSON() ([]byte, error) { x.UnicodeVersion = "" x.Description = "" x.SkinTones = false + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.Marshal(x) } @@ -101,6 +103,7 @@ func generate() ([]byte, error) { // unmarshal var data Gemoji + json := jsoniter.ConfigCompatibleWithStandardLibrary err = json.Unmarshal(body, &data) if err != nil { return nil, err diff --git a/cmd/dump.go b/cmd/dump.go index 1acc69f1c8..43997c8da8 100644 --- a/cmd/dump.go +++ b/cmd/dump.go @@ -6,7 +6,6 @@ package cmd import ( - "encoding/json" "fmt" "io/ioutil" "os" @@ -22,6 +21,7 @@ import ( "code.gitea.io/gitea/modules/util" "gitea.com/go-chi/session" + jsoniter "github.com/json-iterator/go" archiver "github.com/mholt/archiver/v3" "github.com/urfave/cli" ) @@ -296,6 +296,7 @@ func runDump(ctx *cli.Context) error { var excludes []string if setting.Cfg.Section("session").Key("PROVIDER").Value() == "file" { var opts session.Options + json := jsoniter.ConfigCompatibleWithStandardLibrary if err = json.Unmarshal([]byte(setting.SessionConfig.ProviderConfig), &opts); err != nil { return err } diff --git a/cmd/serv.go b/cmd/serv.go index 1e66cb5111..a8db623e16 100644 --- a/cmd/serv.go +++ b/cmd/serv.go @@ -6,7 +6,6 @@ package cmd import ( - "encoding/json" "fmt" "net/http" "net/url" @@ -25,6 +24,7 @@ import ( "code.gitea.io/gitea/modules/setting" "github.com/dgrijalva/jwt-go" + jsoniter "github.com/json-iterator/go" "github.com/kballard/go-shellquote" "github.com/urfave/cli" ) @@ -255,6 +255,7 @@ func runServ(c *cli.Context) error { } tokenAuthentication.Header["Authorization"] = fmt.Sprintf("Bearer %s", tokenString) + json := jsoniter.ConfigCompatibleWithStandardLibrary enc := json.NewEncoder(os.Stdout) err = enc.Encode(tokenAuthentication) if err != nil { diff --git a/go.mod b/go.mod index 6ee34ad594..82e3b3b94c 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( cloud.google.com/go v0.78.0 // indirect code.gitea.io/gitea-vet v0.2.1 code.gitea.io/sdk/gitea v0.13.2 - gitea.com/go-chi/binding v0.0.0-20210113025129-03f1d313373c + gitea.com/go-chi/binding v0.0.0-20210301195521-1fe1c9a555e7 gitea.com/go-chi/cache v0.0.0-20210110083709-82c4c9ce2d5e gitea.com/go-chi/captcha v0.0.0-20210110083842-e7696c336a1e gitea.com/go-chi/session v0.0.0-20210108030337-0cb48c5ba8ee @@ -66,6 +66,7 @@ require ( github.com/issue9/assert v1.3.2 // indirect github.com/issue9/identicon v1.0.1 github.com/jaytaylor/html2text v0.0.0-20200412013138-3577fbdbcff7 + github.com/json-iterator/go v1.1.10 github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect github.com/keybase/go-crypto v0.0.0-20200123153347-de78d2cb44f4 diff --git a/go.sum b/go.sum index 74c1be2489..7d956962dd 100644 --- a/go.sum +++ b/go.sum @@ -41,8 +41,8 @@ code.gitea.io/gitea-vet v0.2.1/go.mod h1:zcNbT/aJEmivCAhfmkHOlT645KNOf9W2KnkLgFj code.gitea.io/sdk/gitea v0.13.2 h1:wAnT/J7Z62q3fJXbgnecoaOBh8CM1Qq0/DakWxiv4yA= code.gitea.io/sdk/gitea v0.13.2/go.mod h1:lee2y8LeV3kQb2iK+hHlMqoadL4bp27QOkOV/hawLKg= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -gitea.com/go-chi/binding v0.0.0-20210113025129-03f1d313373c h1:NTtrGYjR40WUdkCdn26Y5LGFT52rIkFPkjmtgCAyiTs= -gitea.com/go-chi/binding v0.0.0-20210113025129-03f1d313373c/go.mod h1:9bGA9dIsrz+wVQKH1DzvxuAvrudHaQ8Wx8hLme/GVGQ= +gitea.com/go-chi/binding v0.0.0-20210301195521-1fe1c9a555e7 h1:xCVJPY823C8RWpgMabTw2kOglDrg0iS3GcQU6wdwHkU= +gitea.com/go-chi/binding v0.0.0-20210301195521-1fe1c9a555e7/go.mod h1:AyfTrwtfYN54R/HmVvMYPnSTenH5bVoyh8x6tBluxEA= gitea.com/go-chi/cache v0.0.0-20210110083709-82c4c9ce2d5e h1:zgPGaf3kXP0cVm9J0l8ZA2+XDzILYATg0CXbihR6N+o= gitea.com/go-chi/cache v0.0.0-20210110083709-82c4c9ce2d5e/go.mod h1:k2V/gPDEtXGjjMGuBJiapffAXTv76H4snSmlJRLUhH0= gitea.com/go-chi/captcha v0.0.0-20210110083842-e7696c336a1e h1:YjaQU6XFicdhPN+MlGolcXO8seYY2+EY5g7vZPB17CQ= diff --git a/integrations/api_admin_test.go b/integrations/api_admin_test.go index fdcfc40789..b3a0de36d3 100644 --- a/integrations/api_admin_test.go +++ b/integrations/api_admin_test.go @@ -5,7 +5,6 @@ package integrations import ( - "encoding/json" "fmt" "net/http" "testing" @@ -13,6 +12,7 @@ import ( "code.gitea.io/gitea/models" api "code.gitea.io/gitea/modules/structs" + jsoniter "github.com/json-iterator/go" "github.com/stretchr/testify/assert" ) @@ -190,6 +190,7 @@ func TestAPIEditUser(t *testing.T) { resp := session.MakeRequest(t, req, http.StatusUnprocessableEntity) errMap := make(map[string]interface{}) + json := jsoniter.ConfigCompatibleWithStandardLibrary json.Unmarshal(resp.Body.Bytes(), &errMap) assert.EqualValues(t, "email is not allowed to be empty string", errMap["message"].(string)) diff --git a/integrations/api_helper_for_declarative_test.go b/integrations/api_helper_for_declarative_test.go index 551a9bb751..f1d57e717c 100644 --- a/integrations/api_helper_for_declarative_test.go +++ b/integrations/api_helper_for_declarative_test.go @@ -6,7 +6,6 @@ package integrations import ( "context" - "encoding/json" "fmt" "io/ioutil" "net/http" @@ -18,6 +17,7 @@ import ( "code.gitea.io/gitea/modules/queue" api "code.gitea.io/gitea/modules/structs" + jsoniter "github.com/json-iterator/go" "github.com/stretchr/testify/assert" ) @@ -212,6 +212,8 @@ func doAPICreatePullRequest(ctx APITestContext, owner, repo, baseBranch, headBra expected = ctx.ExpectedCode } resp := ctx.Session.MakeRequest(t, req, expected) + + json := jsoniter.ConfigCompatibleWithStandardLibrary decoder := json.NewDecoder(resp.Body) pr := api.PullRequest{} err := decoder.Decode(&pr) diff --git a/integrations/create_no_session_test.go b/integrations/create_no_session_test.go index 89682e95cf..c864b9c7ae 100644 --- a/integrations/create_no_session_test.go +++ b/integrations/create_no_session_test.go @@ -5,7 +5,6 @@ package integrations import ( - "encoding/json" "io/ioutil" "net/http" "net/http/httptest" @@ -18,6 +17,7 @@ import ( "code.gitea.io/gitea/routers/routes" "gitea.com/go-chi/session" + jsoniter "github.com/json-iterator/go" "github.com/stretchr/testify/assert" ) @@ -62,6 +62,8 @@ func TestSessionFileCreation(t *testing.T) { }() var config session.Options + + json := jsoniter.ConfigCompatibleWithStandardLibrary err := json.Unmarshal([]byte(oldSessionConfig), &config) assert.NoError(t, err) diff --git a/integrations/integration_test.go b/integrations/integration_test.go index ee005c087d..10331a1560 100644 --- a/integrations/integration_test.go +++ b/integrations/integration_test.go @@ -8,7 +8,6 @@ import ( "bytes" "context" "database/sql" - "encoding/json" "fmt" "io" "net/http" @@ -36,6 +35,7 @@ import ( "code.gitea.io/gitea/routers/routes" "github.com/PuerkitoBio/goquery" + jsoniter "github.com/json-iterator/go" "github.com/stretchr/testify/assert" ) @@ -376,6 +376,8 @@ func NewRequestWithValues(t testing.TB, method, urlStr string, values map[string func NewRequestWithJSON(t testing.TB, method, urlStr string, v interface{}) *http.Request { t.Helper() + + json := jsoniter.ConfigCompatibleWithStandardLibrary jsonBytes, err := json.Marshal(v) assert.NoError(t, err) req := NewRequestWithBody(t, method, urlStr, bytes.NewBuffer(jsonBytes)) @@ -453,6 +455,8 @@ func logUnexpectedResponse(t testing.TB, recorder *httptest.ResponseRecorder) { func DecodeJSON(t testing.TB, resp *httptest.ResponseRecorder, v interface{}) { t.Helper() + + json := jsoniter.ConfigCompatibleWithStandardLibrary decoder := json.NewDecoder(resp.Body) assert.NoError(t, decoder.Decode(v)) } diff --git a/integrations/oauth_test.go b/integrations/oauth_test.go index e74ff28cad..2da182d0c8 100644 --- a/integrations/oauth_test.go +++ b/integrations/oauth_test.go @@ -6,12 +6,12 @@ package integrations import ( "bytes" - "encoding/json" "io/ioutil" "testing" "code.gitea.io/gitea/modules/setting" + jsoniter "github.com/json-iterator/go" "github.com/stretchr/testify/assert" ) @@ -70,6 +70,8 @@ func TestAccessTokenExchange(t *testing.T) { RefreshToken string `json:"refresh_token"` } parsed := new(response) + + json := jsoniter.ConfigCompatibleWithStandardLibrary assert.NoError(t, json.Unmarshal(resp.Body.Bytes(), parsed)) assert.True(t, len(parsed.AccessToken) > 10) assert.True(t, len(parsed.RefreshToken) > 10) @@ -93,6 +95,8 @@ func TestAccessTokenExchangeWithoutPKCE(t *testing.T) { RefreshToken string `json:"refresh_token"` } parsed := new(response) + + json := jsoniter.ConfigCompatibleWithStandardLibrary assert.NoError(t, json.Unmarshal(resp.Body.Bytes(), parsed)) assert.True(t, len(parsed.AccessToken) > 10) assert.True(t, len(parsed.RefreshToken) > 10) @@ -181,6 +185,8 @@ func TestAccessTokenExchangeWithBasicAuth(t *testing.T) { RefreshToken string `json:"refresh_token"` } parsed := new(response) + + json := jsoniter.ConfigCompatibleWithStandardLibrary assert.NoError(t, json.Unmarshal(resp.Body.Bytes(), parsed)) assert.True(t, len(parsed.AccessToken) > 10) assert.True(t, len(parsed.RefreshToken) > 10) @@ -223,6 +229,8 @@ func TestRefreshTokenInvalidation(t *testing.T) { RefreshToken string `json:"refresh_token"` } parsed := new(response) + + json := jsoniter.ConfigCompatibleWithStandardLibrary assert.NoError(t, json.Unmarshal(resp.Body.Bytes(), parsed)) // test without invalidation diff --git a/integrations/repo_commits_test.go b/integrations/repo_commits_test.go index f26960271a..042849db7c 100644 --- a/integrations/repo_commits_test.go +++ b/integrations/repo_commits_test.go @@ -5,7 +5,6 @@ package integrations import ( - "encoding/json" "net/http" "net/http/httptest" "path" @@ -14,6 +13,7 @@ import ( "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" + jsoniter "github.com/json-iterator/go" "github.com/stretchr/testify/assert" ) @@ -82,6 +82,7 @@ func doTestRepoCommitWithStatus(t *testing.T, state string, classes ...string) { } func testRepoCommitsWithStatus(t *testing.T, resp *httptest.ResponseRecorder, state string) { + json := jsoniter.ConfigCompatibleWithStandardLibrary decoder := json.NewDecoder(resp.Body) statuses := []*api.CommitStatus{} assert.NoError(t, decoder.Decode(&statuses)) diff --git a/integrations/testlogger.go b/integrations/testlogger.go index f84ed47e4f..9ea357ba27 100644 --- a/integrations/testlogger.go +++ b/integrations/testlogger.go @@ -6,7 +6,6 @@ package integrations import ( "context" - "encoding/json" "fmt" "os" "runtime" @@ -17,6 +16,7 @@ import ( "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/queue" + jsoniter "github.com/json-iterator/go" ) var ( @@ -158,6 +158,7 @@ func NewTestLogger() log.LoggerProvider { // Init inits connection writer with json config. // json config only need key "level". func (log *TestLogger) Init(config string) error { + json := jsoniter.ConfigCompatibleWithStandardLibrary err := json.Unmarshal([]byte(config), log) if err != nil { return err diff --git a/models/issue_comment.go b/models/issue_comment.go index 6cc03ba0e8..724cf921ea 100644 --- a/models/issue_comment.go +++ b/models/issue_comment.go @@ -8,7 +8,6 @@ package models import ( "container/list" - "encoding/json" "fmt" "regexp" "strconv" @@ -21,6 +20,7 @@ import ( "code.gitea.io/gitea/modules/references" "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/timeutil" + jsoniter "github.com/json-iterator/go" "xorm.io/builder" "xorm.io/xorm" @@ -655,6 +655,7 @@ func (c *Comment) LoadPushCommits() (err error) { var data PushActionContent + json := jsoniter.ConfigCompatibleWithStandardLibrary err = json.Unmarshal([]byte(c.Content), &data) if err != nil { return @@ -1241,6 +1242,8 @@ func CreatePushPullComment(pusher *User, pr *PullRequest, oldCommitID, newCommit } ops.Issue = pr.Issue + + json := jsoniter.ConfigCompatibleWithStandardLibrary dataJSON, err := json.Marshal(data) if err != nil { return nil, err diff --git a/models/login_source.go b/models/login_source.go index d351f12861..37bbdc4597 100644 --- a/models/login_source.go +++ b/models/login_source.go @@ -7,7 +7,6 @@ package models import ( "crypto/tls" - "encoding/json" "errors" "fmt" "net/smtp" @@ -22,6 +21,7 @@ import ( "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/timeutil" "code.gitea.io/gitea/modules/util" + jsoniter "github.com/json-iterator/go" "xorm.io/xorm" "xorm.io/xorm/convert" @@ -75,11 +75,13 @@ type LDAPConfig struct { // FromDB fills up a LDAPConfig from serialized format. func (cfg *LDAPConfig) FromDB(bs []byte) error { + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.Unmarshal(bs, &cfg) } // ToDB exports a LDAPConfig to a serialized format. func (cfg *LDAPConfig) ToDB() ([]byte, error) { + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.Marshal(cfg) } @@ -101,11 +103,13 @@ type SMTPConfig struct { // FromDB fills up an SMTPConfig from serialized format. func (cfg *SMTPConfig) FromDB(bs []byte) error { + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.Unmarshal(bs, cfg) } // ToDB exports an SMTPConfig to a serialized format. func (cfg *SMTPConfig) ToDB() ([]byte, error) { + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.Marshal(cfg) } @@ -116,11 +120,13 @@ type PAMConfig struct { // FromDB fills up a PAMConfig from serialized format. func (cfg *PAMConfig) FromDB(bs []byte) error { + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.Unmarshal(bs, &cfg) } // ToDB exports a PAMConfig to a serialized format. func (cfg *PAMConfig) ToDB() ([]byte, error) { + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.Marshal(cfg) } @@ -136,11 +142,13 @@ type OAuth2Config struct { // FromDB fills up an OAuth2Config from serialized format. func (cfg *OAuth2Config) FromDB(bs []byte) error { + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.Unmarshal(bs, cfg) } // ToDB exports an SMTPConfig to a serialized format. func (cfg *OAuth2Config) ToDB() ([]byte, error) { + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.Marshal(cfg) } @@ -155,11 +163,13 @@ type SSPIConfig struct { // FromDB fills up an SSPIConfig from serialized format. func (cfg *SSPIConfig) FromDB(bs []byte) error { + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.Unmarshal(bs, cfg) } // ToDB exports an SSPIConfig to a serialized format. func (cfg *SSPIConfig) ToDB() ([]byte, error) { + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.Marshal(cfg) } diff --git a/models/migrations/v130.go b/models/migrations/v130.go index f7be11c400..4f044e26ab 100644 --- a/models/migrations/v130.go +++ b/models/migrations/v130.go @@ -5,9 +5,8 @@ package migrations import ( - "encoding/json" - "code.gitea.io/gitea/modules/setting" + jsoniter "github.com/json-iterator/go" "xorm.io/xorm" ) @@ -72,6 +71,7 @@ func expandWebhooks(x *xorm.Engine) error { for _, res := range results { var events HookEvent + json := jsoniter.ConfigCompatibleWithStandardLibrary if err = json.Unmarshal([]byte(res.Events), &events); err != nil { return err } diff --git a/models/repo_unit.go b/models/repo_unit.go index 8c2d458758..3ef3904833 100644 --- a/models/repo_unit.go +++ b/models/repo_unit.go @@ -5,11 +5,11 @@ package models import ( - "encoding/json" "fmt" "code.gitea.io/gitea/modules/timeutil" + jsoniter "github.com/json-iterator/go" "xorm.io/xorm" "xorm.io/xorm/convert" ) @@ -29,11 +29,13 @@ type UnitConfig struct { // FromDB fills up a UnitConfig from serialized format. func (cfg *UnitConfig) FromDB(bs []byte) error { + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.Unmarshal(bs, &cfg) } // ToDB exports a UnitConfig to a serialized format. func (cfg *UnitConfig) ToDB() ([]byte, error) { + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.Marshal(cfg) } @@ -44,11 +46,13 @@ type ExternalWikiConfig struct { // FromDB fills up a ExternalWikiConfig from serialized format. func (cfg *ExternalWikiConfig) FromDB(bs []byte) error { + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.Unmarshal(bs, &cfg) } // ToDB exports a ExternalWikiConfig to a serialized format. func (cfg *ExternalWikiConfig) ToDB() ([]byte, error) { + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.Marshal(cfg) } @@ -61,11 +65,13 @@ type ExternalTrackerConfig struct { // FromDB fills up a ExternalTrackerConfig from serialized format. func (cfg *ExternalTrackerConfig) FromDB(bs []byte) error { + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.Unmarshal(bs, &cfg) } // ToDB exports a ExternalTrackerConfig to a serialized format. func (cfg *ExternalTrackerConfig) ToDB() ([]byte, error) { + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.Marshal(cfg) } @@ -78,11 +84,13 @@ type IssuesConfig struct { // FromDB fills up a IssuesConfig from serialized format. func (cfg *IssuesConfig) FromDB(bs []byte) error { + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.Unmarshal(bs, &cfg) } // ToDB exports a IssuesConfig to a serialized format. func (cfg *IssuesConfig) ToDB() ([]byte, error) { + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.Marshal(cfg) } @@ -97,11 +105,13 @@ type PullRequestsConfig struct { // FromDB fills up a PullRequestsConfig from serialized format. func (cfg *PullRequestsConfig) FromDB(bs []byte) error { + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.Unmarshal(bs, &cfg) } // ToDB exports a PullRequestsConfig to a serialized format. func (cfg *PullRequestsConfig) ToDB() ([]byte, error) { + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.Marshal(cfg) } diff --git a/models/task.go b/models/task.go index b729bb8632..35b77a878f 100644 --- a/models/task.go +++ b/models/task.go @@ -5,12 +5,12 @@ package models import ( - "encoding/json" "fmt" migration "code.gitea.io/gitea/modules/migrations/base" "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/timeutil" + jsoniter "github.com/json-iterator/go" "xorm.io/builder" ) @@ -105,6 +105,7 @@ func (task *Task) UpdateCols(cols ...string) error { func (task *Task) MigrateConfig() (*migration.MigrateOptions, error) { if task.Type == structs.TaskTypeMigrateRepo { var opts migration.MigrateOptions + json := jsoniter.ConfigCompatibleWithStandardLibrary err := json.Unmarshal([]byte(task.PayloadContent), &opts) if err != nil { return nil, err @@ -162,6 +163,7 @@ func GetMigratingTaskByID(id, doerID int64) (*Task, *migration.MigrateOptions, e } var opts migration.MigrateOptions + json := jsoniter.ConfigCompatibleWithStandardLibrary if err := json.Unmarshal([]byte(task.PayloadContent), &opts); err != nil { return nil, nil, err } diff --git a/models/user_heatmap_test.go b/models/user_heatmap_test.go index d98c4c63e4..6ec8a1a479 100644 --- a/models/user_heatmap_test.go +++ b/models/user_heatmap_test.go @@ -5,10 +5,10 @@ package models import ( - "encoding/json" "fmt" "testing" + jsoniter "github.com/json-iterator/go" "github.com/stretchr/testify/assert" ) @@ -56,6 +56,7 @@ func TestGetUserHeatmapDataByUser(t *testing.T) { assert.Equal(t, tc.CountResult, len(heatmap), fmt.Sprintf("testcase %d", i)) //Test JSON rendering + json := jsoniter.ConfigCompatibleWithStandardLibrary jsonData, err := json.Marshal(heatmap) assert.NoError(t, err) assert.Equal(t, tc.JSONResult, string(jsonData)) diff --git a/models/webhook.go b/models/webhook.go index c7fcfba49e..9ad01f1b9d 100644 --- a/models/webhook.go +++ b/models/webhook.go @@ -7,7 +7,6 @@ package models import ( "context" - "encoding/json" "fmt" "strings" "time" @@ -18,6 +17,7 @@ import ( "code.gitea.io/gitea/modules/timeutil" gouuid "github.com/google/uuid" + jsoniter "github.com/json-iterator/go" ) // HookContentType is the content type of a web hook @@ -145,6 +145,8 @@ type Webhook struct { // AfterLoad updates the webhook object upon setting a column func (w *Webhook) AfterLoad() { w.HookEvent = &HookEvent{} + + json := jsoniter.ConfigCompatibleWithStandardLibrary if err := json.Unmarshal([]byte(w.Events), w.HookEvent); err != nil { log.Error("Unmarshal[%d]: %v", w.ID, err) } @@ -157,6 +159,7 @@ func (w *Webhook) History(page int) ([]*HookTask, error) { // UpdateEvent handles conversion from HookEvent to Events. func (w *Webhook) UpdateEvent() error { + json := jsoniter.ConfigCompatibleWithStandardLibrary data, err := json.Marshal(w.HookEvent) w.Events = string(data) return err @@ -689,6 +692,7 @@ func (t *HookTask) AfterLoad() { } t.RequestInfo = &HookRequest{} + json := jsoniter.ConfigCompatibleWithStandardLibrary if err := json.Unmarshal([]byte(t.RequestContent), t.RequestInfo); err != nil { log.Error("Unmarshal RequestContent[%d]: %v", t.ID, err) } @@ -702,6 +706,7 @@ func (t *HookTask) AfterLoad() { } func (t *HookTask) simpleMarshalJSON(v interface{}) string { + json := jsoniter.ConfigCompatibleWithStandardLibrary p, err := json.Marshal(v) if err != nil { log.Error("Marshal [%d]: %v", t.ID, err) diff --git a/models/webhook_test.go b/models/webhook_test.go index 1baf6ef44b..31cc29d0a4 100644 --- a/models/webhook_test.go +++ b/models/webhook_test.go @@ -6,12 +6,12 @@ package models import ( "context" - "encoding/json" "testing" "time" api "code.gitea.io/gitea/modules/structs" + jsoniter "github.com/json-iterator/go" "github.com/stretchr/testify/assert" ) @@ -58,6 +58,7 @@ func TestWebhook_UpdateEvent(t *testing.T) { assert.NoError(t, webhook.UpdateEvent()) assert.NotEmpty(t, webhook.Events) actualHookEvent := &HookEvent{} + json := jsoniter.ConfigCompatibleWithStandardLibrary assert.NoError(t, json.Unmarshal([]byte(webhook.Events), actualHookEvent)) assert.Equal(t, *hookEvent, *actualHookEvent) } diff --git a/modules/context/context.go b/modules/context/context.go index 899f61d686..c06784c116 100644 --- a/modules/context/context.go +++ b/modules/context/context.go @@ -9,7 +9,6 @@ import ( "context" "crypto/sha256" "encoding/hex" - "encoding/json" "fmt" "html" "html/template" @@ -34,6 +33,7 @@ import ( "gitea.com/go-chi/cache" "gitea.com/go-chi/session" "github.com/go-chi/chi" + jsoniter "github.com/json-iterator/go" "github.com/unknwon/com" "github.com/unknwon/i18n" "github.com/unrolled/render" @@ -370,6 +370,7 @@ func (ctx *Context) Error(status int, contents ...string) { func (ctx *Context) JSON(status int, content interface{}) { ctx.Resp.Header().Set("Content-Type", "application/json;charset=utf-8") ctx.Resp.WriteHeader(status) + json := jsoniter.ConfigCompatibleWithStandardLibrary if err := json.NewEncoder(ctx.Resp).Encode(content); err != nil { ctx.ServerError("Render JSON failed", err) } diff --git a/modules/eventsource/event.go b/modules/eventsource/event.go index fd418c6f07..a3407a94d2 100644 --- a/modules/eventsource/event.go +++ b/modules/eventsource/event.go @@ -6,11 +6,12 @@ package eventsource import ( "bytes" - "encoding/json" "fmt" "io" "strings" "time" + + jsoniter "github.com/json-iterator/go" ) func wrapNewlines(w io.Writer, prefix []byte, value []byte) (sum int64, err error) { @@ -79,6 +80,7 @@ func (e *Event) WriteTo(w io.Writer) (int64, error) { data = []byte(v) default: var err error + json := jsoniter.ConfigCompatibleWithStandardLibrary data, err = json.Marshal(e.Data) if err != nil { return sum, err diff --git a/modules/httplib/httplib.go b/modules/httplib/httplib.go index 90bbe8f12a..62f284d2e1 100644 --- a/modules/httplib/httplib.go +++ b/modules/httplib/httplib.go @@ -8,7 +8,6 @@ package httplib import ( "bytes" "crypto/tls" - "encoding/json" "encoding/xml" "io" "io/ioutil" @@ -23,6 +22,8 @@ import ( "strings" "sync" "time" + + jsoniter "github.com/json-iterator/go" ) var defaultSetting = Settings{false, "GiteaServer", 60 * time.Second, 60 * time.Second, nil, nil, nil, false} @@ -434,6 +435,7 @@ func (r *Request) ToJSON(v interface{}) error { if err != nil { return err } + json := jsoniter.ConfigCompatibleWithStandardLibrary err = json.Unmarshal(data, v) return err } diff --git a/modules/indexer/code/elastic_search.go b/modules/indexer/code/elastic_search.go index c9d604b694..130cd1430a 100644 --- a/modules/indexer/code/elastic_search.go +++ b/modules/indexer/code/elastic_search.go @@ -6,7 +6,6 @@ package code import ( "context" - "encoding/json" "fmt" "strconv" "strings" @@ -22,6 +21,7 @@ import ( "code.gitea.io/gitea/modules/timeutil" "github.com/go-enry/go-enry/v2" + jsoniter "github.com/json-iterator/go" "github.com/olivere/elastic/v7" ) @@ -300,6 +300,7 @@ func convertResult(searchResult *elastic.SearchResult, kw string, pageSize int) repoID, fileName := parseIndexerID(hit.Id) var res = make(map[string]interface{}) + json := jsoniter.ConfigCompatibleWithStandardLibrary if err := json.Unmarshal(hit.Source, &res); err != nil { return 0, nil, nil, err } diff --git a/modules/lfs/locks.go b/modules/lfs/locks.go index cf62492c7e..f2688c3260 100644 --- a/modules/lfs/locks.go +++ b/modules/lfs/locks.go @@ -5,7 +5,6 @@ package lfs import ( - "encoding/json" "strconv" "strings" @@ -15,6 +14,7 @@ import ( "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" + jsoniter "github.com/json-iterator/go" ) //checkIsValidRequest check if it a valid request in case of bad request it write the response to ctx. @@ -184,6 +184,7 @@ func PostLockHandler(ctx *context.Context) { var req api.LFSLockRequest bodyReader := ctx.Req.Body defer bodyReader.Close() + json := jsoniter.ConfigCompatibleWithStandardLibrary dec := json.NewDecoder(bodyReader) if err := dec.Decode(&req); err != nil { log.Warn("Failed to decode lock request as json. Error: %v", err) @@ -319,6 +320,7 @@ func UnLockHandler(ctx *context.Context) { var req api.LFSLockDeleteRequest bodyReader := ctx.Req.Body defer bodyReader.Close() + json := jsoniter.ConfigCompatibleWithStandardLibrary dec := json.NewDecoder(bodyReader) if err := dec.Decode(&req); err != nil { log.Warn("Failed to decode lock request as json. Error: %v", err) diff --git a/modules/lfs/server.go b/modules/lfs/server.go index be21a4de82..45cba9d9b7 100644 --- a/modules/lfs/server.go +++ b/modules/lfs/server.go @@ -6,7 +6,6 @@ package lfs import ( "encoding/base64" - "encoding/json" "fmt" "io" "net/http" @@ -23,6 +22,7 @@ import ( "code.gitea.io/gitea/modules/storage" "github.com/dgrijalva/jwt-go" + jsoniter "github.com/json-iterator/go" ) const ( @@ -233,6 +233,7 @@ func getMetaHandler(ctx *context.Context) { ctx.Resp.Header().Set("Content-Type", metaMediaType) if ctx.Req.Method == "GET" { + json := jsoniter.ConfigCompatibleWithStandardLibrary enc := json.NewEncoder(ctx.Resp) if err := enc.Encode(Represent(rv, meta, true, false)); err != nil { log.Error("Failed to encode representation as json. Error: %v", err) @@ -304,6 +305,7 @@ func PostHandler(ctx *context.Context) { } ctx.Resp.WriteHeader(sentStatus) + json := jsoniter.ConfigCompatibleWithStandardLibrary enc := json.NewEncoder(ctx.Resp) if err := enc.Encode(Represent(rv, meta, meta.Existing, true)); err != nil { log.Error("Failed to encode representation as json. Error: %v", err) @@ -394,6 +396,7 @@ func BatchHandler(ctx *context.Context) { respobj := &BatchResponse{Objects: responseObjects} + json := jsoniter.ConfigCompatibleWithStandardLibrary enc := json.NewEncoder(ctx.Resp) if err := enc.Encode(respobj); err != nil { log.Error("Failed to encode representation as json. Error: %v", err) @@ -531,6 +534,7 @@ func unpack(ctx *context.Context) *RequestVars { var p RequestVars bodyReader := r.Body defer bodyReader.Close() + json := jsoniter.ConfigCompatibleWithStandardLibrary dec := json.NewDecoder(bodyReader) err := dec.Decode(&p) if err != nil { @@ -554,6 +558,7 @@ func unpackbatch(ctx *context.Context) *BatchVars { bodyReader := r.Body defer bodyReader.Close() + json := jsoniter.ConfigCompatibleWithStandardLibrary dec := json.NewDecoder(bodyReader) err := dec.Decode(&bv) if err != nil { diff --git a/modules/log/conn.go b/modules/log/conn.go index 1abe44c1d4..ad3d7f74e0 100644 --- a/modules/log/conn.go +++ b/modules/log/conn.go @@ -6,9 +6,11 @@ package log import ( - "encoding/json" + "fmt" "io" "net" + + jsoniter "github.com/json-iterator/go" ) type connWriter struct { @@ -104,9 +106,10 @@ func NewConn() LoggerProvider { // Init inits connection writer with json config. // json config only need key "level". func (log *ConnLogger) Init(jsonconfig string) error { + json := jsoniter.ConfigCompatibleWithStandardLibrary err := json.Unmarshal([]byte(jsonconfig), log) if err != nil { - return err + return fmt.Errorf("Unable to parse JSON: %v", err) } log.NewWriterLogger(&connWriter{ ReconnectOnMsg: log.ReconnectOnMsg, diff --git a/modules/log/conn_test.go b/modules/log/conn_test.go index 0f35f02a2d..dc5de732f4 100644 --- a/modules/log/conn_test.go +++ b/modules/log/conn_test.go @@ -98,7 +98,8 @@ func TestConnLoggerBadConfig(t *testing.T) { logger := NewConn() err := logger.Init("{") - assert.Equal(t, "unexpected end of JSON input", err.Error()) + assert.Error(t, err) + assert.Contains(t, err.Error(), "Unable to parse JSON") logger.Close() } diff --git a/modules/log/console.go b/modules/log/console.go index a805021f0b..339b9ef3a4 100644 --- a/modules/log/console.go +++ b/modules/log/console.go @@ -6,9 +6,11 @@ package log import ( - "encoding/json" + "fmt" "io" "os" + + jsoniter "github.com/json-iterator/go" ) // CanColorStdout reports if we can color the Stdout @@ -50,9 +52,10 @@ func NewConsoleLogger() LoggerProvider { // Init inits connection writer with json config. // json config only need key "level". func (log *ConsoleLogger) Init(config string) error { + json := jsoniter.ConfigCompatibleWithStandardLibrary err := json.Unmarshal([]byte(config), log) if err != nil { - return err + return fmt.Errorf("Unable to parse JSON: %v", err) } if log.Stderr { log.NewWriterLogger(&nopWriteCloser{ diff --git a/modules/log/console_test.go b/modules/log/console_test.go index a028b5b875..e7ed07123b 100644 --- a/modules/log/console_test.go +++ b/modules/log/console_test.go @@ -17,7 +17,8 @@ func TestConsoleLoggerBadConfig(t *testing.T) { logger := NewConsoleLogger() err := logger.Init("{") - assert.Equal(t, "unexpected end of JSON input", err.Error()) + assert.Error(t, err) + assert.Contains(t, err.Error(), "Unable to parse JSON") logger.Close() } diff --git a/modules/log/file.go b/modules/log/file.go index c9b5d47c0b..d5b38d4e01 100644 --- a/modules/log/file.go +++ b/modules/log/file.go @@ -7,7 +7,6 @@ package log import ( "bufio" "compress/gzip" - "encoding/json" "errors" "fmt" "os" @@ -17,6 +16,7 @@ import ( "time" "code.gitea.io/gitea/modules/util" + jsoniter "github.com/json-iterator/go" ) // FileLogger implements LoggerProvider. @@ -101,8 +101,9 @@ func NewFileLogger() LoggerProvider { // "rotate":true // } func (log *FileLogger) Init(config string) error { + json := jsoniter.ConfigCompatibleWithStandardLibrary if err := json.Unmarshal([]byte(config), log); err != nil { - return err + return fmt.Errorf("Unable to parse JSON: %v", err) } if len(log.Filename) == 0 { return errors.New("config must have filename") diff --git a/modules/log/level.go b/modules/log/level.go index ab231bd1bd..4b2d4ced41 100644 --- a/modules/log/level.go +++ b/modules/log/level.go @@ -6,10 +6,11 @@ package log import ( "bytes" - "encoding/json" "fmt" "os" "strings" + + jsoniter "github.com/json-iterator/go" ) // Level is the level of the logger @@ -103,6 +104,7 @@ func FromString(level string) Level { // UnmarshalJSON takes text and turns it into a Level func (l *Level) UnmarshalJSON(b []byte) error { var tmp interface{} + json := jsoniter.ConfigCompatibleWithStandardLibrary err := json.Unmarshal(b, &tmp) if err != nil { fmt.Fprintf(os.Stderr, "Err: %v", err) diff --git a/modules/log/level_test.go b/modules/log/level_test.go index 40f6310bfd..2f37e407a1 100644 --- a/modules/log/level_test.go +++ b/modules/log/level_test.go @@ -5,10 +5,10 @@ package log import ( - "encoding/json" "fmt" "testing" + jsoniter "github.com/json-iterator/go" "github.com/stretchr/testify/assert" ) @@ -17,6 +17,7 @@ type testLevel struct { } func TestLevelMarshalUnmarshalJSON(t *testing.T) { + json := jsoniter.ConfigCompatibleWithStandardLibrary levelBytes, err := json.Marshal(testLevel{ Level: INFO, }) diff --git a/modules/log/smtp.go b/modules/log/smtp.go index edf4943619..3f27b2c658 100644 --- a/modules/log/smtp.go +++ b/modules/log/smtp.go @@ -6,9 +6,11 @@ package log import ( - "encoding/json" + "fmt" "net/smtp" "strings" + + jsoniter "github.com/json-iterator/go" ) type smtpWriter struct { @@ -55,9 +57,10 @@ func NewSMTPLogger() LoggerProvider { // "level":LevelError // } func (log *SMTPLogger) Init(jsonconfig string) error { + json := jsoniter.ConfigCompatibleWithStandardLibrary err := json.Unmarshal([]byte(jsonconfig), log) if err != nil { - return err + return fmt.Errorf("Unable to parse JSON: %v", err) } log.NewWriterLogger(&smtpWriter{ owner: log, diff --git a/modules/notification/action/action.go b/modules/notification/action/action.go index 836cb51b3e..3530e48b1c 100644 --- a/modules/notification/action/action.go +++ b/modules/notification/action/action.go @@ -5,7 +5,6 @@ package action import ( - "encoding/json" "fmt" "path" "strings" @@ -14,6 +13,7 @@ import ( "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/notification/base" "code.gitea.io/gitea/modules/repository" + jsoniter "github.com/json-iterator/go" ) type actionNotifier struct { @@ -296,6 +296,7 @@ func (*actionNotifier) NotifyPullRevieweDismiss(doer *models.User, review *model } func (a *actionNotifier) NotifyPushCommits(pusher *models.User, repo *models.Repository, opts *repository.PushUpdateOptions, commits *repository.PushCommits) { + json := jsoniter.ConfigCompatibleWithStandardLibrary data, err := json.Marshal(commits) if err != nil { log.Error("Marshal: %v", err) @@ -365,6 +366,7 @@ func (a *actionNotifier) NotifyDeleteRef(doer *models.User, repo *models.Reposit } func (a *actionNotifier) NotifySyncPushCommits(pusher *models.User, repo *models.Repository, opts *repository.PushUpdateOptions, commits *repository.PushCommits) { + json := jsoniter.ConfigCompatibleWithStandardLibrary data, err := json.Marshal(commits) if err != nil { log.Error("json.Marshal: %v", err) diff --git a/modules/private/hook.go b/modules/private/hook.go index 84d66943ba..178500f736 100644 --- a/modules/private/hook.go +++ b/modules/private/hook.go @@ -5,7 +5,6 @@ package private import ( - "encoding/json" "fmt" "net/http" "net/url" @@ -13,6 +12,7 @@ import ( "time" "code.gitea.io/gitea/modules/setting" + jsoniter "github.com/json-iterator/go" ) // Git environment variables @@ -80,6 +80,7 @@ func HookPreReceive(ownerName, repoName string, opts HookOptions) (int, string) ) req := newInternalRequest(reqURL, "POST") req = req.Header("Content-Type", "application/json") + json := jsoniter.ConfigCompatibleWithStandardLibrary jsonBytes, _ := json.Marshal(opts) req.Body(jsonBytes) req.SetTimeout(60*time.Second, time.Duration(60+len(opts.OldCommitIDs))*time.Second) @@ -106,6 +107,7 @@ func HookPostReceive(ownerName, repoName string, opts HookOptions) (*HookPostRec req := newInternalRequest(reqURL, "POST") req = req.Header("Content-Type", "application/json") req.SetTimeout(60*time.Second, time.Duration(60+len(opts.OldCommitIDs))*time.Second) + json := jsoniter.ConfigCompatibleWithStandardLibrary jsonBytes, _ := json.Marshal(opts) req.Body(jsonBytes) resp, err := req.Response() diff --git a/modules/private/internal.go b/modules/private/internal.go index b4fee2680f..360fae47b6 100644 --- a/modules/private/internal.go +++ b/modules/private/internal.go @@ -6,13 +6,13 @@ package private import ( "crypto/tls" - "encoding/json" "fmt" "net" "net/http" "code.gitea.io/gitea/modules/httplib" "code.gitea.io/gitea/modules/setting" + jsoniter "github.com/json-iterator/go" ) func newRequest(url, method string) *httplib.Request { @@ -27,6 +27,7 @@ type Response struct { func decodeJSONError(resp *http.Response) *Response { var res Response + json := jsoniter.ConfigCompatibleWithStandardLibrary err := json.NewDecoder(resp.Body).Decode(&res) if err != nil { res.Err = err.Error() diff --git a/modules/private/mail.go b/modules/private/mail.go index 675dec8f11..9c0912a6e3 100644 --- a/modules/private/mail.go +++ b/modules/private/mail.go @@ -5,12 +5,12 @@ package private import ( - "encoding/json" "fmt" "io/ioutil" "net/http" "code.gitea.io/gitea/modules/setting" + jsoniter "github.com/json-iterator/go" ) // Email structure holds a data for sending general emails @@ -32,6 +32,7 @@ func SendEmail(subject, message string, to []string) (int, string) { req := newInternalRequest(reqURL, "POST") req = req.Header("Content-Type", "application/json") + json := jsoniter.ConfigCompatibleWithStandardLibrary jsonBytes, _ := json.Marshal(Email{ Subject: subject, Message: message, diff --git a/modules/private/manager.go b/modules/private/manager.go index 6c9ec920bb..2bc6cec3b9 100644 --- a/modules/private/manager.go +++ b/modules/private/manager.go @@ -5,13 +5,13 @@ package private import ( - "encoding/json" "fmt" "net/http" "net/url" "time" "code.gitea.io/gitea/modules/setting" + jsoniter "github.com/json-iterator/go" ) // Shutdown calls the internal shutdown function @@ -65,6 +65,7 @@ func FlushQueues(timeout time.Duration, nonBlocking bool) (int, string) { req.SetTimeout(timeout+10*time.Second, timeout+10*time.Second) } req = req.Header("Content-Type", "application/json") + json := jsoniter.ConfigCompatibleWithStandardLibrary jsonBytes, _ := json.Marshal(FlushOptions{ Timeout: timeout, NonBlocking: nonBlocking, @@ -151,6 +152,7 @@ func AddLogger(group, name, mode string, config map[string]interface{}) (int, st req := newInternalRequest(reqURL, "POST") req = req.Header("Content-Type", "application/json") + json := jsoniter.ConfigCompatibleWithStandardLibrary jsonBytes, _ := json.Marshal(LoggerOptions{ Group: group, Name: name, diff --git a/modules/private/serv.go b/modules/private/serv.go index 235d99a2b9..e077b00ccc 100644 --- a/modules/private/serv.go +++ b/modules/private/serv.go @@ -5,13 +5,13 @@ package private import ( - "encoding/json" "fmt" "net/http" "net/url" "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/setting" + jsoniter "github.com/json-iterator/go" ) // KeyAndOwner is the response from ServNoCommand @@ -34,6 +34,7 @@ func ServNoCommand(keyID int64) (*models.PublicKey, *models.User, error) { } var keyAndOwner KeyAndOwner + json := jsoniter.ConfigCompatibleWithStandardLibrary if err := json.NewDecoder(resp.Body).Decode(&keyAndOwner); err != nil { return nil, nil, err } @@ -90,6 +91,7 @@ func ServCommand(keyID int64, ownerName, repoName string, mode models.AccessMode return nil, err } defer resp.Body.Close() + json := jsoniter.ConfigCompatibleWithStandardLibrary if resp.StatusCode != http.StatusOK { var errServCommand ErrServCommand if err := json.NewDecoder(resp.Body).Decode(&errServCommand); err != nil { diff --git a/modules/queue/helper.go b/modules/queue/helper.go index 751e0cfadc..161c2fe8e7 100644 --- a/modules/queue/helper.go +++ b/modules/queue/helper.go @@ -5,8 +5,9 @@ package queue import ( - "encoding/json" "reflect" + + jsoniter "github.com/json-iterator/go" ) // Mappable represents an interface that can MapTo another interface @@ -19,6 +20,7 @@ type Mappable interface { // It will tolerate the cfg being passed as a []byte or string of a json representation of the // exemplar or the correct type of the exemplar itself func toConfig(exemplar, cfg interface{}) (interface{}, error) { + json := jsoniter.ConfigCompatibleWithStandardLibrary // First of all check if we've got the same type as the exemplar - if so it's all fine. if reflect.TypeOf(cfg).AssignableTo(reflect.TypeOf(exemplar)) { @@ -66,6 +68,7 @@ func toConfig(exemplar, cfg interface{}) (interface{}, error) { // unmarshalAs will attempt to unmarshal provided bytes as the provided exemplar func unmarshalAs(bs []byte, exemplar interface{}) (data Data, err error) { + json := jsoniter.ConfigCompatibleWithStandardLibrary if exemplar != nil { t := reflect.TypeOf(exemplar) n := reflect.New(t) diff --git a/modules/queue/manager.go b/modules/queue/manager.go index 3e9f8fc8db..d44007a0f0 100644 --- a/modules/queue/manager.go +++ b/modules/queue/manager.go @@ -6,7 +6,6 @@ package queue import ( "context" - "encoding/json" "fmt" "reflect" "sort" @@ -14,6 +13,7 @@ import ( "time" "code.gitea.io/gitea/modules/log" + jsoniter "github.com/json-iterator/go" ) var manager *Manager @@ -110,6 +110,7 @@ func (m *Manager) Add(managed interface{}, configuration, exemplar interface{}) int64 { + json := jsoniter.ConfigCompatibleWithStandardLibrary cfg, _ := json.Marshal(configuration) mq := &ManagedQueue{ Type: t, diff --git a/modules/queue/queue_bytefifo.go b/modules/queue/queue_bytefifo.go index 4bb7bbf2b1..fe5178ff2d 100644 --- a/modules/queue/queue_bytefifo.go +++ b/modules/queue/queue_bytefifo.go @@ -6,12 +6,12 @@ package queue import ( "context" - "encoding/json" "fmt" "sync" "time" "code.gitea.io/gitea/modules/log" + jsoniter "github.com/json-iterator/go" ) // ByteFIFOQueueConfiguration is the configuration for a ByteFIFOQueue @@ -71,6 +71,7 @@ func (q *ByteFIFOQueue) PushFunc(data Data, fn func() error) error { if !assignableTo(data, q.exemplar) { return fmt.Errorf("Unable to assign data: %v to same type as exemplar: %v in %s", data, q.exemplar, q.name) } + json := jsoniter.ConfigCompatibleWithStandardLibrary bs, err := json.Marshal(data) if err != nil { return err @@ -229,6 +230,7 @@ func (q *ByteFIFOUniqueQueue) Has(data Data) (bool, error) { if !assignableTo(data, q.exemplar) { return false, fmt.Errorf("Unable to assign data: %v to same type as exemplar: %v in %s", data, q.exemplar, q.name) } + json := jsoniter.ConfigCompatibleWithStandardLibrary bs, err := json.Marshal(data) if err != nil { return false, err diff --git a/modules/queue/queue_test.go b/modules/queue/queue_test.go index 3608f68d3d..89ce23ac4c 100644 --- a/modules/queue/queue_test.go +++ b/modules/queue/queue_test.go @@ -5,9 +5,9 @@ package queue import ( - "encoding/json" "testing" + jsoniter "github.com/json-iterator/go" "github.com/stretchr/testify/assert" ) @@ -30,6 +30,7 @@ func TestToConfig(t *testing.T) { assert.NotEqual(t, cfg2, exemplar) assert.Equal(t, &cfg, &cfg2) + json := jsoniter.ConfigCompatibleWithStandardLibrary cfgString, err := json.Marshal(cfg) assert.NoError(t, err) diff --git a/modules/queue/setting.go b/modules/queue/setting.go index 9ee1af8c7d..9b2c31b783 100644 --- a/modules/queue/setting.go +++ b/modules/queue/setting.go @@ -5,12 +5,12 @@ package queue import ( - "encoding/json" "fmt" "strings" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" + jsoniter "github.com/json-iterator/go" ) func validType(t string) (Type, error) { @@ -28,6 +28,7 @@ func validType(t string) (Type, error) { func getQueueSettings(name string) (setting.QueueSettings, []byte) { q := setting.GetQueueSettings(name) + json := jsoniter.ConfigCompatibleWithStandardLibrary cfg, err := json.Marshal(q) if err != nil { log.Error("Unable to marshall generic options: %v Error: %v", q, err) diff --git a/modules/recaptcha/recaptcha.go b/modules/recaptcha/recaptcha.go index 54ea1dc0b3..f5f4c7ef9c 100644 --- a/modules/recaptcha/recaptcha.go +++ b/modules/recaptcha/recaptcha.go @@ -6,7 +6,6 @@ package recaptcha import ( "context" - "encoding/json" "fmt" "io/ioutil" "net/http" @@ -15,6 +14,7 @@ import ( "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/util" + jsoniter "github.com/json-iterator/go" ) // Response is the structure of JSON returned from API @@ -51,6 +51,7 @@ func Verify(ctx context.Context, response string) (bool, error) { return false, fmt.Errorf("Failed to read CAPTCHA response: %s", err) } var jsonResponse Response + json := jsoniter.ConfigCompatibleWithStandardLibrary err = json.Unmarshal(body, &jsonResponse) if err != nil { return false, fmt.Errorf("Failed to parse CAPTCHA response: %s", err) diff --git a/modules/session/virtual.go b/modules/session/virtual.go index 8402d49a77..8f5c4a7e89 100644 --- a/modules/session/virtual.go +++ b/modules/session/virtual.go @@ -5,7 +5,6 @@ package session import ( - "encoding/json" "fmt" "sync" @@ -14,6 +13,7 @@ import ( memcache "gitea.com/go-chi/session/memcache" mysql "gitea.com/go-chi/session/mysql" postgres "gitea.com/go-chi/session/postgres" + jsoniter "github.com/json-iterator/go" ) // VirtualSessionProvider represents a shadowed session provider implementation. @@ -25,6 +25,7 @@ type VirtualSessionProvider struct { // Init initializes the cookie session provider with given root path. func (o *VirtualSessionProvider) Init(gclifetime int64, config string) error { var opts session.Options + json := jsoniter.ConfigCompatibleWithStandardLibrary if err := json.Unmarshal([]byte(config), &opts); err != nil { return err } diff --git a/modules/setting/log.go b/modules/setting/log.go index 9fe2d5bda3..9bbeee27a2 100644 --- a/modules/setting/log.go +++ b/modules/setting/log.go @@ -5,7 +5,6 @@ package setting import ( - "encoding/json" "fmt" golog "log" "os" @@ -15,6 +14,7 @@ import ( "sync" "code.gitea.io/gitea/modules/log" + jsoniter "github.com/json-iterator/go" ini "gopkg.in/ini.v1" ) @@ -205,6 +205,7 @@ func generateLogConfig(sec *ini.Section, name string, defaults defaultLogOptions logConfig["colorize"] = sec.Key("COLORIZE").MustBool(false) + json := jsoniter.ConfigCompatibleWithStandardLibrary byteConfig, err := json.Marshal(logConfig) if err != nil { log.Error("Failed to marshal log configuration: %v %v", logConfig, err) diff --git a/modules/setting/session.go b/modules/setting/session.go index 31f876132d..eb5e1a1875 100644 --- a/modules/setting/session.go +++ b/modules/setting/session.go @@ -5,12 +5,12 @@ package setting import ( - "encoding/json" "path" "path/filepath" "strings" "code.gitea.io/gitea/modules/log" + jsoniter "github.com/json-iterator/go" ) var ( @@ -53,6 +53,7 @@ func newSessionService() { SessionConfig.Maxlifetime = sec.Key("SESSION_LIFE_TIME").MustInt64(86400) SessionConfig.Domain = sec.Key("DOMAIN").String() + json := jsoniter.ConfigCompatibleWithStandardLibrary shadowConfig, err := json.Marshal(SessionConfig) if err != nil { log.Fatal("Can't shadow session config: %v", err) diff --git a/modules/setting/setting.go b/modules/setting/setting.go index cca7f46f14..4976c0007c 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -7,7 +7,6 @@ package setting import ( "encoding/base64" - "encoding/json" "fmt" "io" "io/ioutil" @@ -28,6 +27,7 @@ import ( "code.gitea.io/gitea/modules/user" "code.gitea.io/gitea/modules/util" + jsoniter "github.com/json-iterator/go" shellquote "github.com/kballard/go-shellquote" "github.com/unknwon/com" gossh "golang.org/x/crypto/ssh" @@ -1111,6 +1111,7 @@ func MakeManifestData(appName string, appURL string, absoluteAssetURL string) [] Icons []manifestIcon `json:"icons"` } + json := jsoniter.ConfigCompatibleWithStandardLibrary bytes, err := json.Marshal(&manifestJSON{ Name: appName, ShortName: appName, diff --git a/modules/setting/setting_test.go b/modules/setting/setting_test.go index 7dd3d3bba9..9bc77ab0bb 100644 --- a/modules/setting/setting_test.go +++ b/modules/setting/setting_test.go @@ -5,9 +5,9 @@ package setting import ( - "encoding/json" "testing" + jsoniter "github.com/json-iterator/go" "github.com/stretchr/testify/assert" ) @@ -28,5 +28,6 @@ func TestMakeAbsoluteAssetURL(t *testing.T) { func TestMakeManifestData(t *testing.T) { jsonBytes := MakeManifestData(`Example App '\"`, "https://example.com", "https://example.com/foo/bar") + json := jsoniter.ConfigCompatibleWithStandardLibrary assert.True(t, json.Valid(jsonBytes)) } diff --git a/modules/storage/helper.go b/modules/storage/helper.go index 93f22734e5..46ab82aed6 100644 --- a/modules/storage/helper.go +++ b/modules/storage/helper.go @@ -5,8 +5,9 @@ package storage import ( - "encoding/json" "reflect" + + jsoniter "github.com/json-iterator/go" ) // Mappable represents an interface that can MapTo another interface @@ -19,6 +20,7 @@ type Mappable interface { // It will tolerate the cfg being passed as a []byte or string of a json representation of the // exemplar or the correct type of the exemplar itself func toConfig(exemplar, cfg interface{}) (interface{}, error) { + json := jsoniter.ConfigCompatibleWithStandardLibrary // First of all check if we've got the same type as the exemplar - if so it's all fine. if reflect.TypeOf(cfg).AssignableTo(reflect.TypeOf(exemplar)) { diff --git a/modules/structs/hook.go b/modules/structs/hook.go index 45ae94f985..693820b57d 100644 --- a/modules/structs/hook.go +++ b/modules/structs/hook.go @@ -6,10 +6,11 @@ package structs import ( - "encoding/json" "errors" "strings" "time" + + jsoniter "github.com/json-iterator/go" ) var ( @@ -138,12 +139,14 @@ func (p *CreatePayload) SetSecret(secret string) { // JSONPayload return payload information func (p *CreatePayload) JSONPayload() ([]byte, error) { + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.MarshalIndent(p, "", " ") } // ParseCreateHook parses create event hook content. func ParseCreateHook(raw []byte) (*CreatePayload, error) { hook := new(CreatePayload) + json := jsoniter.ConfigCompatibleWithStandardLibrary if err := json.Unmarshal(raw, hook); err != nil { return nil, err } @@ -193,6 +196,7 @@ func (p *DeletePayload) SetSecret(secret string) { // JSONPayload implements Payload func (p *DeletePayload) JSONPayload() ([]byte, error) { + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.MarshalIndent(p, "", " ") } @@ -218,6 +222,7 @@ func (p *ForkPayload) SetSecret(secret string) { // JSONPayload implements Payload func (p *ForkPayload) JSONPayload() ([]byte, error) { + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.MarshalIndent(p, "", " ") } @@ -250,6 +255,7 @@ func (p *IssueCommentPayload) SetSecret(secret string) { // JSONPayload implements Payload func (p *IssueCommentPayload) JSONPayload() ([]byte, error) { + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.MarshalIndent(p, "", " ") } @@ -286,6 +292,7 @@ func (p *ReleasePayload) SetSecret(secret string) { // JSONPayload implements Payload func (p *ReleasePayload) JSONPayload() ([]byte, error) { + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.MarshalIndent(p, "", " ") } @@ -317,12 +324,14 @@ func (p *PushPayload) SetSecret(secret string) { // JSONPayload FIXME func (p *PushPayload) JSONPayload() ([]byte, error) { + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.MarshalIndent(p, "", " ") } // ParsePushHook parses push event hook content. func ParsePushHook(raw []byte) (*PushPayload, error) { hook := new(PushPayload) + json := jsoniter.ConfigCompatibleWithStandardLibrary if err := json.Unmarshal(raw, hook); err != nil { return nil, err } @@ -396,6 +405,7 @@ func (p *IssuePayload) SetSecret(secret string) { // JSONPayload encodes the IssuePayload to JSON, with an indentation of two spaces. func (p *IssuePayload) JSONPayload() ([]byte, error) { + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.MarshalIndent(p, "", " ") } @@ -437,6 +447,7 @@ func (p *PullRequestPayload) SetSecret(secret string) { // JSONPayload FIXME func (p *PullRequestPayload) JSONPayload() ([]byte, error) { + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.MarshalIndent(p, "", " ") } @@ -479,5 +490,6 @@ func (p *RepositoryPayload) SetSecret(secret string) { // JSONPayload JSON representation of the payload func (p *RepositoryPayload) JSONPayload() ([]byte, error) { + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.MarshalIndent(p, "", " ") } diff --git a/modules/structs/user.go b/modules/structs/user.go index 511e4c56ce..9e021e40fe 100644 --- a/modules/structs/user.go +++ b/modules/structs/user.go @@ -5,8 +5,9 @@ package structs import ( - "encoding/json" "time" + + jsoniter "github.com/json-iterator/go" ) // User represents a user @@ -38,6 +39,7 @@ type User struct { func (u User) MarshalJSON() ([]byte, error) { // Re-declaring User to avoid recursion type shadow User + json := jsoniter.ConfigCompatibleWithStandardLibrary return json.Marshal(struct { shadow CompatUserName string `json:"username"` diff --git a/modules/task/task.go b/modules/task/task.go index 72f111ecc7..0443517c01 100644 --- a/modules/task/task.go +++ b/modules/task/task.go @@ -5,7 +5,6 @@ package task import ( - "encoding/json" "fmt" "code.gitea.io/gitea/models" @@ -16,6 +15,7 @@ import ( repo_module "code.gitea.io/gitea/modules/repository" "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/timeutil" + jsoniter "github.com/json-iterator/go" ) // taskQueue is a global queue of tasks @@ -65,6 +65,7 @@ func MigrateRepository(doer, u *models.User, opts base.MigrateOptions) error { // CreateMigrateTask creates a migrate task func CreateMigrateTask(doer, u *models.User, opts base.MigrateOptions) (*models.Task, error) { + json := jsoniter.ConfigCompatibleWithStandardLibrary bs, err := json.Marshal(&opts) if err != nil { return nil, err diff --git a/modules/templates/helper.go b/modules/templates/helper.go index 4b9b648b2f..d3f6b8e06f 100644 --- a/modules/templates/helper.go +++ b/modules/templates/helper.go @@ -38,6 +38,7 @@ import ( mirror_service "code.gitea.io/gitea/services/mirror" "github.com/editorconfig/editorconfig-core-go/v2" + jsoniter "github.com/json-iterator/go" ) // Used from static.go && dynamic.go @@ -45,6 +46,7 @@ var mailSubjectSplit = regexp.MustCompile(`(?m)^-{3,}[\s]*$`) // NewFuncMap returns functions for injecting to templates func NewFuncMap() []template.FuncMap { + jsonED := jsoniter.ConfigCompatibleWithStandardLibrary return []template.FuncMap{map[string]interface{}{ "GoVer": func() string { return strings.Title(runtime.Version()) @@ -215,7 +217,7 @@ func NewFuncMap() []template.FuncMap { return fmt.Sprintf("%f", float64(adds)/(float64(adds)+float64(dels))*100) }, "Json": func(in interface{}) string { - out, err := json.Marshal(in) + out, err := jsonED.Marshal(in) if err != nil { return "" } @@ -814,6 +816,8 @@ func ActionIcon(opType models.ActionType) string { // ActionContent2Commits converts action content to push commits func ActionContent2Commits(act Actioner) *repository.PushCommits { push := repository.NewPushCommits() + + json := jsoniter.ConfigCompatibleWithStandardLibrary if err := json.Unmarshal([]byte(act.GetContent()), push); err != nil { log.Error("json.Unmarshal:\n%s\nERROR: %v", act.GetContent(), err) } diff --git a/routers/admin/admin.go b/routers/admin/admin.go index 2b2328a93a..49f6a394a6 100644 --- a/routers/admin/admin.go +++ b/routers/admin/admin.go @@ -6,7 +6,6 @@ package admin import ( - "encoding/json" "fmt" "net/url" "os" @@ -28,6 +27,7 @@ import ( "code.gitea.io/gitea/modules/timeutil" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/services/mailer" + jsoniter "github.com/json-iterator/go" "gitea.com/go-chi/session" ) @@ -274,6 +274,7 @@ func Config(ctx *context.Context) { sessionCfg := setting.SessionConfig if sessionCfg.Provider == "VirtualSession" { var realSession session.Options + json := jsoniter.ConfigCompatibleWithStandardLibrary if err := json.Unmarshal([]byte(sessionCfg.ProviderConfig), &realSession); err != nil { log.Error("Unable to unmarshall session config for virtualed provider config: %s\nError: %v", sessionCfg.ProviderConfig, err) } diff --git a/routers/api/v1/utils/hook.go b/routers/api/v1/utils/hook.go index b0ce40b9fb..c7af40dcf0 100644 --- a/routers/api/v1/utils/hook.go +++ b/routers/api/v1/utils/hook.go @@ -5,7 +5,6 @@ package utils import ( - "encoding/json" "fmt" "net/http" "strings" @@ -17,6 +16,7 @@ import ( "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/routers/utils" "code.gitea.io/gitea/services/webhook" + jsoniter "github.com/json-iterator/go" ) // GetOrgHook get an organization's webhook. If there is an error, write to @@ -147,6 +147,7 @@ func addHook(ctx *context.APIContext, form *api.CreateHookOption, orgID, repoID return nil, false } + json := jsoniter.ConfigCompatibleWithStandardLibrary meta, err := json.Marshal(&webhook.SlackMeta{ Channel: strings.TrimSpace(channel), Username: form.Config["username"], @@ -221,6 +222,7 @@ func editHook(ctx *context.APIContext, form *api.EditHookOption, w *models.Webho if w.Type == models.SLACK { if channel, ok := form.Config["channel"]; ok { + json := jsoniter.ConfigCompatibleWithStandardLibrary meta, err := json.Marshal(&webhook.SlackMeta{ Channel: channel, Username: form.Config["username"], diff --git a/routers/events/events.go b/routers/events/events.go index 2b78d8603b..27dbb08fc8 100644 --- a/routers/events/events.go +++ b/routers/events/events.go @@ -5,7 +5,6 @@ package events import ( - "encoding/json" "net/http" "time" @@ -17,6 +16,7 @@ import ( "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/routers/user" + jsoniter "github.com/json-iterator/go" ) // Events listens for events @@ -92,6 +92,7 @@ loop: log.Error("Unable to APIFormat stopwatches: %v", err) continue } + json := jsoniter.ConfigCompatibleWithStandardLibrary dataBs, err := json.Marshal(apiSWs) if err != nil { log.Error("Unable to marshal stopwatches: %v", err) diff --git a/routers/private/mail.go b/routers/private/mail.go index 330de14c46..cda442ea04 100644 --- a/routers/private/mail.go +++ b/routers/private/mail.go @@ -5,7 +5,6 @@ package private import ( - "encoding/json" "fmt" "net/http" "strconv" @@ -16,6 +15,7 @@ import ( "code.gitea.io/gitea/modules/private" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/services/mailer" + jsoniter "github.com/json-iterator/go" ) // SendEmail pushes messages to mail queue @@ -32,6 +32,7 @@ func SendEmail(ctx *context.PrivateContext) { var mail private.Email rd := ctx.Req.Body defer rd.Close() + json := jsoniter.ConfigCompatibleWithStandardLibrary if err := json.NewDecoder(rd).Decode(&mail); err != nil { log.Error("%v", err) ctx.JSON(http.StatusInternalServerError, map[string]interface{}{ diff --git a/routers/private/manager.go b/routers/private/manager.go index e5b4583fd1..192c4947e7 100644 --- a/routers/private/manager.go +++ b/routers/private/manager.go @@ -5,7 +5,6 @@ package private import ( - "encoding/json" "fmt" "net/http" @@ -16,6 +15,7 @@ import ( "code.gitea.io/gitea/modules/queue" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/web" + jsoniter "github.com/json-iterator/go" ) // FlushQueues flushes all the Queues @@ -130,6 +130,7 @@ func AddLogger(ctx *context.PrivateContext) { } bufferLen := setting.Cfg.Section("log").Key("BUFFER_LEN").MustInt64(10000) + json := jsoniter.ConfigCompatibleWithStandardLibrary byteConfig, err := json.Marshal(opts.Config) if err != nil { log.Error("Failed to marshal log configuration: %v %v", opts.Config, err) diff --git a/routers/repo/editor.go b/routers/repo/editor.go index 344174828e..14a75556d2 100644 --- a/routers/repo/editor.go +++ b/routers/repo/editor.go @@ -5,7 +5,6 @@ package repo import ( - "encoding/json" "fmt" "io/ioutil" "path" @@ -25,6 +24,7 @@ import ( "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/routers/utils" + jsoniter "github.com/json-iterator/go" ) const ( @@ -158,6 +158,7 @@ func GetEditorConfig(ctx *context.Context, treePath string) string { if err == nil { def, err := ec.GetDefinitionForFilename(treePath) if err == nil { + json := jsoniter.ConfigCompatibleWithStandardLibrary jsonStr, _ := json.Marshal(def) return string(jsonStr) } diff --git a/routers/repo/webhook.go b/routers/repo/webhook.go index 01d142843f..d1d4dc0208 100644 --- a/routers/repo/webhook.go +++ b/routers/repo/webhook.go @@ -6,7 +6,6 @@ package repo import ( - "encoding/json" "errors" "fmt" "path" @@ -23,6 +22,7 @@ import ( "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/web" "code.gitea.io/gitea/services/webhook" + jsoniter "github.com/json-iterator/go" ) const ( @@ -305,6 +305,7 @@ func DiscordHooksNewPost(ctx *context.Context) { return } + json := jsoniter.ConfigCompatibleWithStandardLibrary meta, err := json.Marshal(&webhook.DiscordMeta{ Username: form.Username, IconURL: form.IconURL, @@ -400,6 +401,7 @@ func TelegramHooksNewPost(ctx *context.Context) { return } + json := jsoniter.ConfigCompatibleWithStandardLibrary meta, err := json.Marshal(&webhook.TelegramMeta{ BotToken: form.BotToken, ChatID: form.ChatID, @@ -452,6 +454,7 @@ func MatrixHooksNewPost(ctx *context.Context) { return } + json := jsoniter.ConfigCompatibleWithStandardLibrary meta, err := json.Marshal(&webhook.MatrixMeta{ HomeserverURL: form.HomeserverURL, Room: form.RoomID, @@ -556,6 +559,7 @@ func SlackHooksNewPost(ctx *context.Context) { return } + json := jsoniter.ConfigCompatibleWithStandardLibrary meta, err := json.Marshal(&webhook.SlackMeta{ Channel: strings.TrimSpace(form.Channel), Username: form.Username, @@ -799,6 +803,7 @@ func SlackHooksEditPost(ctx *context.Context) { return } + json := jsoniter.ConfigCompatibleWithStandardLibrary meta, err := json.Marshal(&webhook.SlackMeta{ Channel: strings.TrimSpace(form.Channel), Username: form.Username, @@ -844,6 +849,7 @@ func DiscordHooksEditPost(ctx *context.Context) { return } + json := jsoniter.ConfigCompatibleWithStandardLibrary meta, err := json.Marshal(&webhook.DiscordMeta{ Username: form.Username, IconURL: form.IconURL, @@ -919,6 +925,7 @@ func TelegramHooksEditPost(ctx *context.Context) { ctx.HTML(200, orCtx.NewTemplate) return } + json := jsoniter.ConfigCompatibleWithStandardLibrary meta, err := json.Marshal(&webhook.TelegramMeta{ BotToken: form.BotToken, ChatID: form.ChatID, @@ -960,6 +967,7 @@ func MatrixHooksEditPost(ctx *context.Context) { ctx.HTML(200, orCtx.NewTemplate) return } + json := jsoniter.ConfigCompatibleWithStandardLibrary meta, err := json.Marshal(&webhook.MatrixMeta{ HomeserverURL: form.HomeserverURL, Room: form.RoomID, diff --git a/routers/user/home.go b/routers/user/home.go index a8020b64e0..9957ec6b02 100644 --- a/routers/user/home.go +++ b/routers/user/home.go @@ -7,7 +7,6 @@ package user import ( "bytes" - "encoding/json" "fmt" "regexp" "sort" @@ -25,6 +24,7 @@ import ( issue_service "code.gitea.io/gitea/services/issue" pull_service "code.gitea.io/gitea/services/pull" + jsoniter "github.com/json-iterator/go" "github.com/keybase/go-crypto/openpgp" "github.com/keybase/go-crypto/openpgp/armor" "xorm.io/builder" @@ -691,6 +691,7 @@ func buildIssueOverview(ctx *context.Context, unitType models.UnitType) { } // Convert []int64 to string + json := jsoniter.ConfigCompatibleWithStandardLibrary reposParam, _ := json.Marshal(repoIDs) ctx.Data["ReposParam"] = string(reposParam) diff --git a/services/gitdiff/gitdiff_test.go b/services/gitdiff/gitdiff_test.go index 2f92a01694..f8c25a3912 100644 --- a/services/gitdiff/gitdiff_test.go +++ b/services/gitdiff/gitdiff_test.go @@ -6,7 +6,6 @@ package gitdiff import ( - "encoding/json" "fmt" "html/template" "strconv" @@ -17,6 +16,7 @@ import ( "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/highlight" "code.gitea.io/gitea/modules/setting" + jsoniter "github.com/json-iterator/go" dmp "github.com/sergi/go-diff/diffmatchpatch" "github.com/stretchr/testify/assert" "gopkg.in/ini.v1" @@ -298,7 +298,8 @@ index 6961180..9ba1a00 100644 t.Errorf("ParsePatch(%q) error = %v, wantErr %v", testcase.name, err, testcase.wantErr) return } - gotMarshaled, _ := json.MarshalIndent(got, " ", " ") + json := jsoniter.ConfigCompatibleWithStandardLibrary + gotMarshaled, _ := json.MarshalIndent(got, "", " ") if got.NumFiles != 1 { t.Errorf("ParsePath(%q) did not receive 1 file:\n%s", testcase.name, string(gotMarshaled)) return diff --git a/services/pull/pull.go b/services/pull/pull.go index cadb317472..331ef46d3d 100644 --- a/services/pull/pull.go +++ b/services/pull/pull.go @@ -8,7 +8,6 @@ import ( "bufio" "bytes" "context" - "encoding/json" "errors" "fmt" "strings" @@ -21,6 +20,7 @@ import ( "code.gitea.io/gitea/modules/notification" "code.gitea.io/gitea/modules/setting" issue_service "code.gitea.io/gitea/services/issue" + jsoniter "github.com/json-iterator/go" ) // NewPullRequest creates new pull request with labels for repository. @@ -86,6 +86,7 @@ func NewPullRequest(repo *models.Repository, pull *models.Issue, labelIDs []int6 data.CommitIDs = append(data.CommitIDs, e.Value.(*git.Commit).ID.String()) } + json := jsoniter.ConfigCompatibleWithStandardLibrary dataJSON, err := json.Marshal(data) if err != nil { return err diff --git a/services/webhook/dingtalk.go b/services/webhook/dingtalk.go index a9032db046..0401464a44 100644 --- a/services/webhook/dingtalk.go +++ b/services/webhook/dingtalk.go @@ -5,7 +5,6 @@ package webhook import ( - "encoding/json" "fmt" "strings" @@ -13,6 +12,7 @@ import ( "code.gitea.io/gitea/modules/git" api "code.gitea.io/gitea/modules/structs" + jsoniter "github.com/json-iterator/go" dingtalk "github.com/lunny/dingtalk_webhook" ) @@ -30,6 +30,7 @@ func (d *DingtalkPayload) SetSecret(_ string) {} // JSONPayload Marshals the DingtalkPayload to json func (d *DingtalkPayload) JSONPayload() ([]byte, error) { + json := jsoniter.ConfigCompatibleWithStandardLibrary data, err := json.MarshalIndent(d, "", " ") if err != nil { return []byte{}, err diff --git a/services/webhook/discord.go b/services/webhook/discord.go index 530e7adbda..d28904715f 100644 --- a/services/webhook/discord.go +++ b/services/webhook/discord.go @@ -5,7 +5,6 @@ package webhook import ( - "encoding/json" "errors" "fmt" "strconv" @@ -16,6 +15,7 @@ import ( "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" + jsoniter "github.com/json-iterator/go" ) type ( @@ -68,6 +68,7 @@ type ( // GetDiscordHook returns discord metadata func GetDiscordHook(w *models.Webhook) *DiscordMeta { s := &DiscordMeta{} + json := jsoniter.ConfigCompatibleWithStandardLibrary if err := json.Unmarshal([]byte(w.Meta), s); err != nil { log.Error("webhook.GetDiscordHook(%d): %v", w.ID, err) } @@ -101,6 +102,7 @@ func (d *DiscordPayload) SetSecret(_ string) {} // JSONPayload Marshals the DiscordPayload to json func (d *DiscordPayload) JSONPayload() ([]byte, error) { + json := jsoniter.ConfigCompatibleWithStandardLibrary data, err := json.MarshalIndent(d, "", " ") if err != nil { return []byte{}, err @@ -407,6 +409,7 @@ func GetDiscordPayload(p api.Payloader, event models.HookEventType, meta string) s := new(DiscordPayload) discord := &DiscordMeta{} + json := jsoniter.ConfigCompatibleWithStandardLibrary if err := json.Unmarshal([]byte(meta), &discord); err != nil { return s, errors.New("GetDiscordPayload meta json:" + err.Error()) } diff --git a/services/webhook/feishu.go b/services/webhook/feishu.go index 3d789e6c1f..847a991f36 100644 --- a/services/webhook/feishu.go +++ b/services/webhook/feishu.go @@ -5,13 +5,13 @@ package webhook import ( - "encoding/json" "fmt" "strings" "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/git" api "code.gitea.io/gitea/modules/structs" + jsoniter "github.com/json-iterator/go" ) type ( @@ -40,6 +40,7 @@ func (f *FeishuPayload) SetSecret(_ string) {} // JSONPayload Marshals the FeishuPayload to json func (f *FeishuPayload) JSONPayload() ([]byte, error) { + json := jsoniter.ConfigCompatibleWithStandardLibrary data, err := json.MarshalIndent(f, "", " ") if err != nil { return []byte{}, err diff --git a/services/webhook/matrix.go b/services/webhook/matrix.go index 063147198a..1658dd4b44 100644 --- a/services/webhook/matrix.go +++ b/services/webhook/matrix.go @@ -6,7 +6,6 @@ package webhook import ( "crypto/sha1" - "encoding/json" "errors" "fmt" "html" @@ -19,6 +18,7 @@ import ( "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" + jsoniter "github.com/json-iterator/go" ) const matrixPayloadSizeLimit = 1024 * 64 @@ -39,6 +39,7 @@ var messageTypeText = map[int]string{ // GetMatrixHook returns Matrix metadata func GetMatrixHook(w *models.Webhook) *MatrixMeta { s := &MatrixMeta{} + json := jsoniter.ConfigCompatibleWithStandardLibrary if err := json.Unmarshal([]byte(w.Meta), s); err != nil { log.Error("webhook.GetMatrixHook(%d): %v", w.ID, err) } @@ -80,6 +81,7 @@ func (m *MatrixPayloadUnsafe) SetSecret(_ string) {} // JSONPayload Marshals the MatrixPayloadUnsafe to json func (m *MatrixPayloadUnsafe) JSONPayload() ([]byte, error) { + json := jsoniter.ConfigCompatibleWithStandardLibrary data, err := json.MarshalIndent(m, "", " ") if err != nil { return []byte{}, err @@ -229,6 +231,7 @@ func GetMatrixPayload(p api.Payloader, event models.HookEventType, meta string) s := new(MatrixPayloadUnsafe) matrix := &MatrixMeta{} + json := jsoniter.ConfigCompatibleWithStandardLibrary if err := json.Unmarshal([]byte(meta), &matrix); err != nil { return s, errors.New("GetMatrixPayload meta json:" + err.Error()) } @@ -262,6 +265,7 @@ func getMessageBody(htmlText string) string { // The access_token is removed from t.PayloadContent func getMatrixHookRequest(t *models.HookTask) (*http.Request, error) { payloadunsafe := MatrixPayloadUnsafe{} + json := jsoniter.ConfigCompatibleWithStandardLibrary if err := json.Unmarshal([]byte(t.PayloadContent), &payloadunsafe); err != nil { log.Error("Matrix Hook delivery failed: %v", err) return nil, err diff --git a/services/webhook/msteams.go b/services/webhook/msteams.go index a68c97ea37..dc83a47c8d 100644 --- a/services/webhook/msteams.go +++ b/services/webhook/msteams.go @@ -5,13 +5,13 @@ package webhook import ( - "encoding/json" "fmt" "strings" "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/git" api "code.gitea.io/gitea/modules/structs" + jsoniter "github.com/json-iterator/go" ) type ( @@ -60,6 +60,7 @@ func (m *MSTeamsPayload) SetSecret(_ string) {} // JSONPayload Marshals the MSTeamsPayload to json func (m *MSTeamsPayload) JSONPayload() ([]byte, error) { + json := jsoniter.ConfigCompatibleWithStandardLibrary data, err := json.MarshalIndent(m, "", " ") if err != nil { return []byte{}, err diff --git a/services/webhook/slack.go b/services/webhook/slack.go index aaecad6c67..f5c857f2a9 100644 --- a/services/webhook/slack.go +++ b/services/webhook/slack.go @@ -5,7 +5,6 @@ package webhook import ( - "encoding/json" "errors" "fmt" "strings" @@ -15,6 +14,7 @@ import ( "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" + jsoniter "github.com/json-iterator/go" ) // SlackMeta contains the slack metadata @@ -28,6 +28,7 @@ type SlackMeta struct { // GetSlackHook returns slack metadata func GetSlackHook(w *models.Webhook) *SlackMeta { s := &SlackMeta{} + json := jsoniter.ConfigCompatibleWithStandardLibrary if err := json.Unmarshal([]byte(w.Meta), s); err != nil { log.Error("webhook.GetSlackHook(%d): %v", w.ID, err) } @@ -60,6 +61,7 @@ func (s *SlackPayload) SetSecret(_ string) {} // JSONPayload Marshals the SlackPayload to json func (s *SlackPayload) JSONPayload() ([]byte, error) { + json := jsoniter.ConfigCompatibleWithStandardLibrary data, err := json.MarshalIndent(s, "", " ") if err != nil { return []byte{}, err @@ -320,6 +322,7 @@ func GetSlackPayload(p api.Payloader, event models.HookEventType, meta string) ( s := new(SlackPayload) slack := &SlackMeta{} + json := jsoniter.ConfigCompatibleWithStandardLibrary if err := json.Unmarshal([]byte(meta), &slack); err != nil { return s, errors.New("GetSlackPayload meta json:" + err.Error()) } diff --git a/services/webhook/telegram.go b/services/webhook/telegram.go index 84fc210042..5b78b46f8e 100644 --- a/services/webhook/telegram.go +++ b/services/webhook/telegram.go @@ -5,7 +5,6 @@ package webhook import ( - "encoding/json" "fmt" "strings" @@ -14,6 +13,7 @@ import ( "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/markup" api "code.gitea.io/gitea/modules/structs" + jsoniter "github.com/json-iterator/go" ) type ( @@ -34,6 +34,7 @@ type ( // GetTelegramHook returns telegram metadata func GetTelegramHook(w *models.Webhook) *TelegramMeta { s := &TelegramMeta{} + json := jsoniter.ConfigCompatibleWithStandardLibrary if err := json.Unmarshal([]byte(w.Meta), s); err != nil { log.Error("webhook.GetTelegramHook(%d): %v", w.ID, err) } @@ -52,6 +53,7 @@ func (t *TelegramPayload) JSONPayload() ([]byte, error) { t.ParseMode = "HTML" t.DisableWebPreview = true t.Message = markup.Sanitize(t.Message) + json := jsoniter.ConfigCompatibleWithStandardLibrary data, err := json.MarshalIndent(t, "", " ") if err != nil { return []byte{}, err diff --git a/vendor/gitea.com/go-chi/binding/binding.go b/vendor/gitea.com/go-chi/binding/binding.go index acd2a7e171..455b9b8832 100644 --- a/vendor/gitea.com/go-chi/binding/binding.go +++ b/vendor/gitea.com/go-chi/binding/binding.go @@ -18,7 +18,6 @@ package binding import ( - "encoding/json" "fmt" "io" "mime/multipart" @@ -30,6 +29,7 @@ import ( "strings" "unicode/utf8" + jsoniter "github.com/json-iterator/go" "github.com/unknwon/com" ) @@ -89,6 +89,7 @@ func errorHandler(errs Errors, rw http.ResponseWriter) { } else { rw.WriteHeader(STATUS_UNPROCESSABLE_ENTITY) } + json := jsoniter.ConfigCompatibleWithStandardLibrary errOutput, _ := json.Marshal(errs) rw.Write(errOutput) return @@ -171,6 +172,7 @@ func JSON(req *http.Request, jsonStruct interface{}) Errors { if req.Body != nil { defer req.Body.Close() + json := jsoniter.ConfigCompatibleWithStandardLibrary err := json.NewDecoder(req.Body).Decode(jsonStruct) if err != nil && err != io.EOF { errors.Add([]string{}, ERR_DESERIALIZATION, err.Error()) diff --git a/vendor/gitea.com/go-chi/binding/go.mod b/vendor/gitea.com/go-chi/binding/go.mod index 68e7cc5c7e..ada4467523 100644 --- a/vendor/gitea.com/go-chi/binding/go.mod +++ b/vendor/gitea.com/go-chi/binding/go.mod @@ -4,6 +4,7 @@ go 1.13 require ( github.com/go-chi/chi v1.5.1 + github.com/json-iterator/go v1.1.10 github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 github.com/unknwon/com v0.0.0-20190804042917-757f69c95f3e ) diff --git a/vendor/gitea.com/go-chi/binding/go.sum b/vendor/gitea.com/go-chi/binding/go.sum index 158860f7c2..af9a07b2e8 100644 --- a/vendor/gitea.com/go-chi/binding/go.sum +++ b/vendor/gitea.com/go-chi/binding/go.sum @@ -1,17 +1,32 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-chi/chi v1.5.1 h1:kfTK3Cxd/dkMu/rKs5ZceWYp+t5CtiE7vmaTv3LjC6w= github.com/go-chi/chi v1.5.1/go.mod h1:REp24E+25iKvxgeTfHmdUoL5x15kBiDBlnIl5bCwe2k= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e h1:JKmoR8x90Iww1ks85zJ1lfDGgIiMDuIptTOhJq+zKyg= github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304 h1:Jpy1PXuP99tXNrhbq2BaPz9B+jNAvH1JPQQpG/9GCXY= github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 h1:WN9BUFbdyOsSH/XohnWpXOlq9NBD5sGAB2FciQMUEe8= github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/unknwon/com v0.0.0-20190804042917-757f69c95f3e h1:GSGeB9EAKY2spCABz6xOX5DbxZEXolK+nBSvmsQwRjM= github.com/unknwon/com v0.0.0-20190804042917-757f69c95f3e/go.mod h1:tOOxU81rwgoCLoOVVPHb6T/wt8HZygqH5id+GNnlCXM= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= diff --git a/vendor/modules.txt b/vendor/modules.txt index dc05ee912a..66779fc23a 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -8,7 +8,7 @@ code.gitea.io/gitea-vet/checks # code.gitea.io/sdk/gitea v0.13.2 ## explicit code.gitea.io/sdk/gitea -# gitea.com/go-chi/binding v0.0.0-20210113025129-03f1d313373c +# gitea.com/go-chi/binding v0.0.0-20210301195521-1fe1c9a555e7 ## explicit gitea.com/go-chi/binding # gitea.com/go-chi/cache v0.0.0-20210110083709-82c4c9ce2d5e @@ -483,6 +483,7 @@ github.com/jessevdk/go-flags # github.com/josharian/intern v1.0.0 github.com/josharian/intern # github.com/json-iterator/go v1.1.10 +## explicit github.com/json-iterator/go # github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 ## explicit