Parcourir la source

:recycle: 内核中的 HTTP 客户端拆分项目 https://github.com/siyuan-note/siyuan/issues/5269

Liang Ding il y a 3 ans
Parent
commit
779e4fc4ae

+ 3 - 2
kernel/bazaar/icon.go

@@ -25,6 +25,7 @@ import (
 
 
 	"github.com/dustin/go-humanize"
 	"github.com/dustin/go-humanize"
 	ants "github.com/panjf2000/ants/v2"
 	ants "github.com/panjf2000/ants/v2"
+	"github.com/siyuan-note/httpclient"
 	"github.com/siyuan-note/siyuan/kernel/util"
 	"github.com/siyuan-note/siyuan/kernel/util"
 )
 )
 
 
@@ -63,7 +64,7 @@ func Icons(proxyURL string) (icons []*Icon) {
 	bazaarIndex := getBazaarIndex(proxyURL)
 	bazaarIndex := getBazaarIndex(proxyURL)
 	bazaarHash := result["bazaar"].(string)
 	bazaarHash := result["bazaar"].(string)
 	result = map[string]interface{}{}
 	result = map[string]interface{}{}
-	request := util.NewBrowserRequest(proxyURL)
+	request := httpclient.NewBrowserRequest(proxyURL)
 	u := util.BazaarOSSServer + "/bazaar@" + bazaarHash + "/stage/icons.json"
 	u := util.BazaarOSSServer + "/bazaar@" + bazaarHash + "/stage/icons.json"
 	resp, err := request.SetResult(&result).Get(u)
 	resp, err := request.SetResult(&result).Get(u)
 	if nil != err {
 	if nil != err {
@@ -85,7 +86,7 @@ func Icons(proxyURL string) (icons []*Icon) {
 
 
 		icon := &Icon{}
 		icon := &Icon{}
 		innerU := util.BazaarOSSServer + "/package/" + repoURL + "/icon.json"
 		innerU := util.BazaarOSSServer + "/package/" + repoURL + "/icon.json"
-		innerResp, innerErr := util.NewBrowserRequest(proxyURL).SetResult(icon).Get(innerU)
+		innerResp, innerErr := httpclient.NewBrowserRequest(proxyURL).SetResult(icon).Get(innerU)
 		if nil != innerErr {
 		if nil != innerErr {
 			util.LogErrorf("get bazaar package [%s] failed: %s", repoURL, innerErr)
 			util.LogErrorf("get bazaar package [%s] failed: %s", repoURL, innerErr)
 			return
 			return

+ 5 - 4
kernel/bazaar/package.go

@@ -30,6 +30,7 @@ import (
 	"github.com/PuerkitoBio/goquery"
 	"github.com/PuerkitoBio/goquery"
 	"github.com/araddon/dateparse"
 	"github.com/araddon/dateparse"
 	"github.com/imroc/req/v3"
 	"github.com/imroc/req/v3"
+	"github.com/siyuan-note/httpclient"
 	"github.com/siyuan-note/siyuan/kernel/util"
 	"github.com/siyuan-note/siyuan/kernel/util"
 	textUnicode "golang.org/x/text/encoding/unicode"
 	textUnicode "golang.org/x/text/encoding/unicode"
 	"golang.org/x/text/transform"
 	"golang.org/x/text/transform"
@@ -82,14 +83,14 @@ func downloadPackage(repoURLHash, proxyURL string, chinaCDN, pushProgress bool,
 		u = util.BazaarOSSServer + "/package/" + repoURLHash
 		u = util.BazaarOSSServer + "/package/" + repoURLHash
 	}
 	}
 	buf := &bytes.Buffer{}
 	buf := &bytes.Buffer{}
-	resp, err := util.NewBrowserDownloadRequest(proxyURL).SetOutput(buf).SetDownloadCallback(func(info req.DownloadInfo) {
+	resp, err := httpclient.NewBrowserDownloadRequest(proxyURL).SetOutput(buf).SetDownloadCallback(func(info req.DownloadInfo) {
 		if pushProgress {
 		if pushProgress {
 			util.PushDownloadProgress(pushID, float32(info.DownloadedSize)/float32(info.Response.ContentLength))
 			util.PushDownloadProgress(pushID, float32(info.DownloadedSize)/float32(info.Response.ContentLength))
 		}
 		}
 	}).Get(u)
 	}).Get(u)
 	if nil != err {
 	if nil != err {
 		u = util.BazaarOSSServer + "/package/" + repoURLHash
 		u = util.BazaarOSSServer + "/package/" + repoURLHash
-		resp, err = util.NewBrowserDownloadRequest(proxyURL).SetOutput(buf).SetDownloadCallback(func(info req.DownloadInfo) {
+		resp, err = httpclient.NewBrowserDownloadRequest(proxyURL).SetOutput(buf).SetDownloadCallback(func(info req.DownloadInfo) {
 			if pushProgress {
 			if pushProgress {
 				util.PushDownloadProgress(pushID, float32(info.DownloadedSize)/float32(info.Response.ContentLength))
 				util.PushDownloadProgress(pushID, float32(info.DownloadedSize)/float32(info.Response.ContentLength))
 			}
 			}
@@ -116,7 +117,7 @@ func incPackageDownloads(repoURLHash, proxyURL, systemID string) {
 
 
 	repo := strings.Split(repoURLHash, "@")[0]
 	repo := strings.Split(repoURLHash, "@")[0]
 	u := util.AliyunServer + "/apis/siyuan/bazaar/addBazaarPackageDownloadCount"
 	u := util.AliyunServer + "/apis/siyuan/bazaar/addBazaarPackageDownloadCount"
-	util.NewCloudRequest(proxyURL).SetBody(
+	httpclient.NewCloudRequest(proxyURL).SetBody(
 		map[string]interface{}{
 		map[string]interface{}{
 			"systemID": systemID,
 			"systemID": systemID,
 			"repo":     repo,
 			"repo":     repo,
@@ -190,7 +191,7 @@ func getBazaarIndex(proxyURL string) map[string]*bazaarPackage {
 		return cachedBazaarIndex
 		return cachedBazaarIndex
 	}
 	}
 
 
-	request := util.NewBrowserRequest(proxyURL)
+	request := httpclient.NewBrowserRequest(proxyURL)
 	u := util.BazaarStatServer + "/bazaar/index.json"
 	u := util.BazaarStatServer + "/bazaar/index.json"
 	resp, reqErr := request.SetResult(&cachedBazaarIndex).Get(u)
 	resp, reqErr := request.SetResult(&cachedBazaarIndex).Get(u)
 	if nil != reqErr {
 	if nil != reqErr {

+ 3 - 2
kernel/bazaar/template.go

@@ -26,6 +26,7 @@ import (
 
 
 	"github.com/dustin/go-humanize"
 	"github.com/dustin/go-humanize"
 	"github.com/panjf2000/ants/v2"
 	"github.com/panjf2000/ants/v2"
+	"github.com/siyuan-note/httpclient"
 	"github.com/siyuan-note/siyuan/kernel/util"
 	"github.com/siyuan-note/siyuan/kernel/util"
 )
 )
 
 
@@ -63,7 +64,7 @@ func Templates(proxyURL string) (templates []*Template) {
 	bazaarIndex := getBazaarIndex(proxyURL)
 	bazaarIndex := getBazaarIndex(proxyURL)
 	bazaarHash := result["bazaar"].(string)
 	bazaarHash := result["bazaar"].(string)
 	result = map[string]interface{}{}
 	result = map[string]interface{}{}
-	request := util.NewBrowserRequest(proxyURL)
+	request := httpclient.NewBrowserRequest(proxyURL)
 	u := util.BazaarOSSServer + "/bazaar@" + bazaarHash + "/stage/templates.json"
 	u := util.BazaarOSSServer + "/bazaar@" + bazaarHash + "/stage/templates.json"
 	resp, reqErr := request.SetResult(&result).Get(u)
 	resp, reqErr := request.SetResult(&result).Get(u)
 	if nil != reqErr {
 	if nil != reqErr {
@@ -86,7 +87,7 @@ func Templates(proxyURL string) (templates []*Template) {
 
 
 		template := &Template{}
 		template := &Template{}
 		innerU := util.BazaarOSSServer + "/package/" + repoURL + "/template.json"
 		innerU := util.BazaarOSSServer + "/package/" + repoURL + "/template.json"
-		innerResp, innerErr := util.NewBrowserRequest(proxyURL).SetResult(template).Get(innerU)
+		innerResp, innerErr := httpclient.NewBrowserRequest(proxyURL).SetResult(template).Get(innerU)
 		if nil != innerErr {
 		if nil != innerErr {
 			util.LogErrorf("get community template [%s] failed: %s", repoURL, innerErr)
 			util.LogErrorf("get community template [%s] failed: %s", repoURL, innerErr)
 			return
 			return

+ 3 - 2
kernel/bazaar/theme.go

@@ -25,6 +25,7 @@ import (
 
 
 	"github.com/dustin/go-humanize"
 	"github.com/dustin/go-humanize"
 	ants "github.com/panjf2000/ants/v2"
 	ants "github.com/panjf2000/ants/v2"
+	"github.com/siyuan-note/httpclient"
 	"github.com/siyuan-note/siyuan/kernel/util"
 	"github.com/siyuan-note/siyuan/kernel/util"
 )
 )
 
 
@@ -64,7 +65,7 @@ func Themes(proxyURL string) (ret []*Theme) {
 	bazaarIndex := getBazaarIndex(proxyURL)
 	bazaarIndex := getBazaarIndex(proxyURL)
 	bazaarHash := result["bazaar"].(string)
 	bazaarHash := result["bazaar"].(string)
 	result = map[string]interface{}{}
 	result = map[string]interface{}{}
-	request := util.NewBrowserRequest(proxyURL)
+	request := httpclient.NewBrowserRequest(proxyURL)
 	u := util.BazaarOSSServer + "/bazaar@" + bazaarHash + "/stage/themes.json"
 	u := util.BazaarOSSServer + "/bazaar@" + bazaarHash + "/stage/themes.json"
 	resp, reqErr := request.SetResult(&result).Get(u)
 	resp, reqErr := request.SetResult(&result).Get(u)
 	if nil != reqErr {
 	if nil != reqErr {
@@ -87,7 +88,7 @@ func Themes(proxyURL string) (ret []*Theme) {
 
 
 		theme := &Theme{}
 		theme := &Theme{}
 		innerU := util.BazaarOSSServer + "/package/" + repoURL + "/theme.json"
 		innerU := util.BazaarOSSServer + "/package/" + repoURL + "/theme.json"
-		innerResp, innerErr := util.NewBrowserRequest(proxyURL).SetResult(theme).Get(innerU)
+		innerResp, innerErr := httpclient.NewBrowserRequest(proxyURL).SetResult(theme).Get(innerU)
 		if nil != innerErr {
 		if nil != innerErr {
 			util.LogErrorf("get bazaar package [%s] failed: %s", innerU, innerErr)
 			util.LogErrorf("get bazaar package [%s] failed: %s", innerU, innerErr)
 			return
 			return

+ 3 - 2
kernel/bazaar/widget.go

@@ -25,6 +25,7 @@ import (
 
 
 	"github.com/dustin/go-humanize"
 	"github.com/dustin/go-humanize"
 	ants "github.com/panjf2000/ants/v2"
 	ants "github.com/panjf2000/ants/v2"
+	"github.com/siyuan-note/httpclient"
 	"github.com/siyuan-note/siyuan/kernel/util"
 	"github.com/siyuan-note/siyuan/kernel/util"
 )
 )
 
 
@@ -63,7 +64,7 @@ func Widgets(proxyURL string) (widgets []*Widget) {
 	bazaarIndex := getBazaarIndex(proxyURL)
 	bazaarIndex := getBazaarIndex(proxyURL)
 	bazaarHash := result["bazaar"].(string)
 	bazaarHash := result["bazaar"].(string)
 	result = map[string]interface{}{}
 	result = map[string]interface{}{}
-	request := util.NewBrowserRequest(proxyURL)
+	request := httpclient.NewBrowserRequest(proxyURL)
 	u := util.BazaarOSSServer + "/bazaar@" + bazaarHash + "/stage/widgets.json"
 	u := util.BazaarOSSServer + "/bazaar@" + bazaarHash + "/stage/widgets.json"
 	resp, err := request.SetResult(&result).Get(u)
 	resp, err := request.SetResult(&result).Get(u)
 	if nil != err {
 	if nil != err {
@@ -86,7 +87,7 @@ func Widgets(proxyURL string) (widgets []*Widget) {
 
 
 		widget := &Widget{}
 		widget := &Widget{}
 		innerU := util.BazaarOSSServer + "/package/" + repoURL + "/widget.json"
 		innerU := util.BazaarOSSServer + "/package/" + repoURL + "/widget.json"
-		innerResp, innerErr := util.NewBrowserRequest(proxyURL).SetResult(widget).Get(innerU)
+		innerResp, innerErr := httpclient.NewBrowserRequest(proxyURL).SetResult(widget).Get(innerU)
 		if nil != innerErr {
 		if nil != innerErr {
 			util.LogErrorf("get bazaar package [%s] failed: %s", repoURL, innerErr)
 			util.LogErrorf("get bazaar package [%s] failed: %s", repoURL, innerErr)
 			return
 			return

+ 2 - 1
kernel/go.mod

@@ -43,6 +43,7 @@ require (
 	github.com/siyuan-note/dejavu v0.0.0-20220620134708-bcbbf7f6478e
 	github.com/siyuan-note/dejavu v0.0.0-20220620134708-bcbbf7f6478e
 	github.com/siyuan-note/encryption v0.0.0-20220612074546-f1dd94fe8676
 	github.com/siyuan-note/encryption v0.0.0-20220612074546-f1dd94fe8676
 	github.com/siyuan-note/filelock v0.0.0-20220616063212-74cfba0754ee
 	github.com/siyuan-note/filelock v0.0.0-20220616063212-74cfba0754ee
+	github.com/siyuan-note/httpclient v0.0.0-20220622170705-004622a8138d
 	github.com/vmihailenco/msgpack/v5 v5.3.5
 	github.com/vmihailenco/msgpack/v5 v5.3.5
 	github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673
 	github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673
 	golang.org/x/image v0.0.0-20220601225756-64ec528b34cd
 	golang.org/x/image v0.0.0-20220601225756-64ec528b34cd
@@ -98,7 +99,7 @@ require (
 	go.uber.org/multierr v1.8.0 // indirect
 	go.uber.org/multierr v1.8.0 // indirect
 	golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect
 	golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect
 	golang.org/x/mod v0.5.1 // indirect
 	golang.org/x/mod v0.5.1 // indirect
-	golang.org/x/net v0.0.0-20220607020251-c690dde0001d // indirect
+	golang.org/x/net v0.0.0-20220621193019-9d032be2e588 // indirect
 	golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f // indirect
 	golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f // indirect
 	golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c // indirect
 	golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c // indirect
 	golang.org/x/tools v0.1.8 // indirect
 	golang.org/x/tools v0.1.8 // indirect

+ 4 - 2
kernel/go.sum

@@ -425,6 +425,8 @@ github.com/siyuan-note/encryption v0.0.0-20220612074546-f1dd94fe8676 h1:QB9TjJQF
 github.com/siyuan-note/encryption v0.0.0-20220612074546-f1dd94fe8676/go.mod h1:H8fyqqAbp9XreANjeSbc72zEdFfKTXYN34tc1TjZwtw=
 github.com/siyuan-note/encryption v0.0.0-20220612074546-f1dd94fe8676/go.mod h1:H8fyqqAbp9XreANjeSbc72zEdFfKTXYN34tc1TjZwtw=
 github.com/siyuan-note/filelock v0.0.0-20220616063212-74cfba0754ee h1:8nBBJKHbXuMF2dWKUKsrnnFblgeNBfPjLgVm0aDas/s=
 github.com/siyuan-note/filelock v0.0.0-20220616063212-74cfba0754ee h1:8nBBJKHbXuMF2dWKUKsrnnFblgeNBfPjLgVm0aDas/s=
 github.com/siyuan-note/filelock v0.0.0-20220616063212-74cfba0754ee/go.mod h1:c4vwvWRrnfa75OXiO21K/76BFRJ4cFITKNoVs5lFdwc=
 github.com/siyuan-note/filelock v0.0.0-20220616063212-74cfba0754ee/go.mod h1:c4vwvWRrnfa75OXiO21K/76BFRJ4cFITKNoVs5lFdwc=
+github.com/siyuan-note/httpclient v0.0.0-20220622170705-004622a8138d h1:zMkahXrTDPhBUg9W7HkGlYP6WY5AkQoJqj7Cmk++qoU=
+github.com/siyuan-note/httpclient v0.0.0-20220622170705-004622a8138d/go.mod h1:W/5hysNTpI8a52hSMzNHvf29tbM+VmD/l+c2wvkqlL8=
 github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
 github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
 github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
 github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
 github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
 github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
@@ -577,8 +579,8 @@ golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qx
 golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20220111093109-d55c255bac03/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20220111093109-d55c255bac03/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20220607020251-c690dde0001d h1:4SFsTMi4UahlKoloni7L4eYzhFRifURQLw+yv0QDCx8=
-golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.0.0-20220621193019-9d032be2e588 h1:9ubFuySsnAJYGyJrZ3koiEv8FyqofCBdz3G9Mbf2YFc=
+golang.org/x/net v0.0.0-20220621193019-9d032be2e588/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=

+ 3 - 2
kernel/model/assets.go

@@ -36,6 +36,7 @@ import (
 	"github.com/88250/lute/parse"
 	"github.com/88250/lute/parse"
 	"github.com/gabriel-vasile/mimetype"
 	"github.com/gabriel-vasile/mimetype"
 	"github.com/siyuan-note/filelock"
 	"github.com/siyuan-note/filelock"
+	"github.com/siyuan-note/httpclient"
 	"github.com/siyuan-note/siyuan/kernel/search"
 	"github.com/siyuan-note/siyuan/kernel/search"
 	"github.com/siyuan-note/siyuan/kernel/sql"
 	"github.com/siyuan-note/siyuan/kernel/sql"
 	"github.com/siyuan-note/siyuan/kernel/treenode"
 	"github.com/siyuan-note/siyuan/kernel/treenode"
@@ -91,7 +92,7 @@ func NetImg2LocalAssets(rootID string) (err error) {
 					}
 					}
 				}
 				}
 				util.PushUpdateMsg(msgId, fmt.Sprintf(Conf.Language(119), u), 15000)
 				util.PushUpdateMsg(msgId, fmt.Sprintf(Conf.Language(119), u), 15000)
-				request := util.NewBrowserRequest(Conf.System.NetworkProxy.String())
+				request := httpclient.NewBrowserRequest(Conf.System.NetworkProxy.String())
 				resp, reqErr := request.Get(u)
 				resp, reqErr := request.Get(u)
 				if nil != reqErr {
 				if nil != reqErr {
 					util.LogErrorf("download net img [%s] failed: %s", u, reqErr)
 					util.LogErrorf("download net img [%s] failed: %s", u, reqErr)
@@ -285,7 +286,7 @@ func uploadCloud(sqlAssets []*sql.Asset) (err error) {
 		}
 		}
 
 
 		requestResult := gulu.Ret.NewResult()
 		requestResult := gulu.Ret.NewResult()
-		request := util.NewCloudFileRequest2m(Conf.System.NetworkProxy.String())
+		request := httpclient.NewCloudFileRequest2m(Conf.System.NetworkProxy.String())
 		resp, reqErr := request.
 		resp, reqErr := request.
 			SetResult(requestResult).
 			SetResult(requestResult).
 			SetFile("file[]", absAsset).
 			SetFile("file[]", absAsset).

+ 12 - 11
kernel/model/liandi.go

@@ -25,6 +25,7 @@ import (
 	"time"
 	"time"
 
 
 	"github.com/88250/gulu"
 	"github.com/88250/gulu"
+	"github.com/siyuan-note/httpclient"
 	"github.com/siyuan-note/siyuan/kernel/conf"
 	"github.com/siyuan-note/siyuan/kernel/conf"
 	"github.com/siyuan-note/siyuan/kernel/util"
 	"github.com/siyuan-note/siyuan/kernel/util"
 )
 )
@@ -37,7 +38,7 @@ func StartFreeTrial() (err error) {
 	}
 	}
 
 
 	requestResult := gulu.Ret.NewResult()
 	requestResult := gulu.Ret.NewResult()
-	request := util.NewCloudRequest(Conf.System.NetworkProxy.String())
+	request := httpclient.NewCloudRequest(Conf.System.NetworkProxy.String())
 	_, err = request.
 	_, err = request.
 		SetResult(requestResult).
 		SetResult(requestResult).
 		SetCookies(&http.Cookie{Name: "symphony", Value: Conf.User.UserToken}).
 		SetCookies(&http.Cookie{Name: "symphony", Value: Conf.User.UserToken}).
@@ -54,7 +55,7 @@ func StartFreeTrial() (err error) {
 
 
 func DeactivateUser() (err error) {
 func DeactivateUser() (err error) {
 	requestResult := gulu.Ret.NewResult()
 	requestResult := gulu.Ret.NewResult()
-	request := util.NewCloudRequest(Conf.System.NetworkProxy.String())
+	request := httpclient.NewCloudRequest(Conf.System.NetworkProxy.String())
 	resp, err := request.
 	resp, err := request.
 		SetResult(requestResult).
 		SetResult(requestResult).
 		SetCookies(&http.Cookie{Name: "symphony", Value: Conf.User.UserToken}).
 		SetCookies(&http.Cookie{Name: "symphony", Value: Conf.User.UserToken}).
@@ -79,7 +80,7 @@ func DeactivateUser() (err error) {
 func SetCloudBlockReminder(id, data string, timed int64) (err error) {
 func SetCloudBlockReminder(id, data string, timed int64) (err error) {
 	requestResult := gulu.Ret.NewResult()
 	requestResult := gulu.Ret.NewResult()
 	payload := map[string]interface{}{"dataId": id, "data": data, "timed": timed}
 	payload := map[string]interface{}{"dataId": id, "data": data, "timed": timed}
-	request := util.NewCloudRequest(Conf.System.NetworkProxy.String())
+	request := httpclient.NewCloudRequest(Conf.System.NetworkProxy.String())
 	resp, err := request.
 	resp, err := request.
 		SetResult(requestResult).
 		SetResult(requestResult).
 		SetBody(payload).
 		SetBody(payload).
@@ -112,7 +113,7 @@ func LoadUploadToken() (err error) {
 	}
 	}
 
 
 	requestResult := gulu.Ret.NewResult()
 	requestResult := gulu.Ret.NewResult()
-	request := util.NewCloudRequest(Conf.System.NetworkProxy.String())
+	request := httpclient.NewCloudRequest(Conf.System.NetworkProxy.String())
 	resp, err := request.
 	resp, err := request.
 		SetResult(requestResult).
 		SetResult(requestResult).
 		SetCookies(&http.Cookie{Name: "symphony", Value: Conf.User.UserToken}).
 		SetCookies(&http.Cookie{Name: "symphony", Value: Conf.User.UserToken}).
@@ -251,7 +252,7 @@ func loadUserFromConf() *conf.User {
 
 
 func RemoveCloudShorthands(ids []string) (err error) {
 func RemoveCloudShorthands(ids []string) (err error) {
 	result := map[string]interface{}{}
 	result := map[string]interface{}{}
-	request := util.NewCloudRequest(Conf.System.NetworkProxy.String())
+	request := httpclient.NewCloudRequest(Conf.System.NetworkProxy.String())
 	body := map[string]interface{}{
 	body := map[string]interface{}{
 		"ids": ids,
 		"ids": ids,
 	}
 	}
@@ -282,7 +283,7 @@ func RemoveCloudShorthands(ids []string) (err error) {
 
 
 func GetCloudShorthands(page int) (result map[string]interface{}, err error) {
 func GetCloudShorthands(page int) (result map[string]interface{}, err error) {
 	result = map[string]interface{}{}
 	result = map[string]interface{}{}
-	request := util.NewCloudRequest(Conf.System.NetworkProxy.String())
+	request := httpclient.NewCloudRequest(Conf.System.NetworkProxy.String())
 	resp, err := request.
 	resp, err := request.
 		SetResult(&result).
 		SetResult(&result).
 		SetCookies(&http.Cookie{Name: "symphony", Value: Conf.User.UserToken}).
 		SetCookies(&http.Cookie{Name: "symphony", Value: Conf.User.UserToken}).
@@ -319,7 +320,7 @@ var errInvalidUser = errors.New("invalid user")
 
 
 func getUser(token string) (*conf.User, error) {
 func getUser(token string) (*conf.User, error) {
 	result := map[string]interface{}{}
 	result := map[string]interface{}{}
-	request := util.NewCloudRequest(Conf.System.NetworkProxy.String())
+	request := httpclient.NewCloudRequest(Conf.System.NetworkProxy.String())
 	_, err := request.
 	_, err := request.
 		SetResult(&result).
 		SetResult(&result).
 		SetBody(map[string]string{"token": token}).
 		SetBody(map[string]string{"token": token}).
@@ -350,7 +351,7 @@ func getUser(token string) (*conf.User, error) {
 
 
 func UseActivationcode(code string) (err error) {
 func UseActivationcode(code string) (err error) {
 	requestResult := gulu.Ret.NewResult()
 	requestResult := gulu.Ret.NewResult()
-	request := util.NewCloudRequest(Conf.System.NetworkProxy.String())
+	request := httpclient.NewCloudRequest(Conf.System.NetworkProxy.String())
 	_, err = request.
 	_, err = request.
 		SetResult(requestResult).
 		SetResult(requestResult).
 		SetBody(map[string]string{"data": code}).
 		SetBody(map[string]string{"data": code}).
@@ -369,7 +370,7 @@ func UseActivationcode(code string) (err error) {
 func CheckActivationcode(code string) (retCode int, msg string) {
 func CheckActivationcode(code string) (retCode int, msg string) {
 	retCode = 1
 	retCode = 1
 	requestResult := gulu.Ret.NewResult()
 	requestResult := gulu.Ret.NewResult()
-	request := util.NewCloudRequest(Conf.System.NetworkProxy.String())
+	request := httpclient.NewCloudRequest(Conf.System.NetworkProxy.String())
 	_, err := request.
 	_, err := request.
 		SetResult(requestResult).
 		SetResult(requestResult).
 		SetBody(map[string]string{"data": code}).
 		SetBody(map[string]string{"data": code}).
@@ -389,7 +390,7 @@ func CheckActivationcode(code string) (retCode int, msg string) {
 
 
 func Login(userName, password, captcha string) (ret *gulu.Result, err error) {
 func Login(userName, password, captcha string) (ret *gulu.Result, err error) {
 	result := map[string]interface{}{}
 	result := map[string]interface{}{}
-	request := util.NewCloudRequest(Conf.System.NetworkProxy.String())
+	request := httpclient.NewCloudRequest(Conf.System.NetworkProxy.String())
 	_, err = request.
 	_, err = request.
 		SetResult(&result).
 		SetResult(&result).
 		SetBody(map[string]string{"userName": userName, "userPassword": password, "captcha": captcha}).
 		SetBody(map[string]string{"userName": userName, "userPassword": password, "captcha": captcha}).
@@ -415,7 +416,7 @@ func Login(userName, password, captcha string) (ret *gulu.Result, err error) {
 
 
 func Login2fa(token, code string) (map[string]interface{}, error) {
 func Login2fa(token, code string) (map[string]interface{}, error) {
 	result := map[string]interface{}{}
 	result := map[string]interface{}{}
-	request := util.NewCloudRequest(Conf.System.NetworkProxy.String())
+	request := httpclient.NewCloudRequest(Conf.System.NetworkProxy.String())
 	_, err := request.
 	_, err := request.
 		SetResult(&result).
 		SetResult(&result).
 		SetBody(map[string]string{"twofactorAuthCode": code}).
 		SetBody(map[string]string{"twofactorAuthCode": code}).

+ 14 - 13
kernel/model/osssync.go

@@ -34,12 +34,13 @@ import (
 	"github.com/88250/gulu"
 	"github.com/88250/gulu"
 	"github.com/panjf2000/ants/v2"
 	"github.com/panjf2000/ants/v2"
 	"github.com/qiniu/go-sdk/v7/storage"
 	"github.com/qiniu/go-sdk/v7/storage"
+	"github.com/siyuan-note/httpclient"
 	"github.com/siyuan-note/siyuan/kernel/util"
 	"github.com/siyuan-note/siyuan/kernel/util"
 )
 )
 
 
 func getCloudSpaceOSS() (sync, backup map[string]interface{}, assetSize int64, err error) {
 func getCloudSpaceOSS() (sync, backup map[string]interface{}, assetSize int64, err error) {
 	result := map[string]interface{}{}
 	result := map[string]interface{}{}
-	request := util.NewCloudRequest(Conf.System.NetworkProxy.String())
+	request := httpclient.NewCloudRequest(Conf.System.NetworkProxy.String())
 	resp, err := request.
 	resp, err := request.
 		SetResult(&result).
 		SetResult(&result).
 		SetBody(map[string]string{"token": Conf.User.UserToken}).
 		SetBody(map[string]string{"token": Conf.User.UserToken}).
@@ -69,7 +70,7 @@ func getCloudSpaceOSS() (sync, backup map[string]interface{}, assetSize int64, e
 
 
 func removeCloudDirPath(dirPath string) (err error) {
 func removeCloudDirPath(dirPath string) (err error) {
 	result := map[string]interface{}{}
 	result := map[string]interface{}{}
-	request := util.NewCloudRequest(Conf.System.NetworkProxy.String())
+	request := httpclient.NewCloudRequest(Conf.System.NetworkProxy.String())
 	resp, err := request.
 	resp, err := request.
 		SetResult(&result).
 		SetResult(&result).
 		SetBody(map[string]string{"dirPath": dirPath, "token": Conf.User.UserToken}).
 		SetBody(map[string]string{"dirPath": dirPath, "token": Conf.User.UserToken}).
@@ -94,7 +95,7 @@ func removeCloudDirPath(dirPath string) (err error) {
 
 
 func createCloudSyncDirOSS(name string) (err error) {
 func createCloudSyncDirOSS(name string) (err error) {
 	result := map[string]interface{}{}
 	result := map[string]interface{}{}
-	request := util.NewCloudRequest(Conf.System.NetworkProxy.String())
+	request := httpclient.NewCloudRequest(Conf.System.NetworkProxy.String())
 	resp, err := request.
 	resp, err := request.
 		SetResult(&result).
 		SetResult(&result).
 		SetBody(map[string]string{"name": name, "token": Conf.User.UserToken}).
 		SetBody(map[string]string{"name": name, "token": Conf.User.UserToken}).
@@ -125,7 +126,7 @@ func createCloudSyncDirOSS(name string) (err error) {
 
 
 func listCloudSyncDirOSS() (dirs []map[string]interface{}, size int64, err error) {
 func listCloudSyncDirOSS() (dirs []map[string]interface{}, size int64, err error) {
 	result := map[string]interface{}{}
 	result := map[string]interface{}{}
-	request := util.NewCloudRequest(Conf.System.NetworkProxy.String())
+	request := httpclient.NewCloudRequest(Conf.System.NetworkProxy.String())
 	resp, err := request.
 	resp, err := request.
 		SetBody(map[string]interface{}{"token": Conf.User.UserToken}).
 		SetBody(map[string]interface{}{"token": Conf.User.UserToken}).
 		SetResult(&result).
 		SetResult(&result).
@@ -277,7 +278,7 @@ func ossDownload0(localDirPath, cloudDirPath, fetch string, fetchedFiles *int, t
 	localFilePath := filepath.Join(localDirPath, fetch)
 	localFilePath := filepath.Join(localDirPath, fetch)
 	remoteFileURL := path.Join(cloudDirPath, fetch)
 	remoteFileURL := path.Join(cloudDirPath, fetch)
 	var result map[string]interface{}
 	var result map[string]interface{}
-	resp, err := util.NewCloudRequest(Conf.System.NetworkProxy.String()).
+	resp, err := httpclient.NewCloudRequest(Conf.System.NetworkProxy.String()).
 		SetResult(&result).
 		SetResult(&result).
 		SetBody(map[string]interface{}{"token": Conf.User.UserToken, "path": remoteFileURL}).
 		SetBody(map[string]interface{}{"token": Conf.User.UserToken, "path": remoteFileURL}).
 		Post(util.AliyunServer + "/apis/siyuan/data/getSiYuanFile?uid=" + Conf.User.UserId)
 		Post(util.AliyunServer + "/apis/siyuan/data/getSiYuanFile?uid=" + Conf.User.UserId)
@@ -312,9 +313,9 @@ func ossDownload0(localDirPath, cloudDirPath, fetch string, fetchedFiles *int, t
 	os.Remove(localFilePath)
 	os.Remove(localFilePath)
 
 
 	if bootORExit {
 	if bootORExit {
-		resp, err = util.NewCloudFileRequest15s(Conf.System.NetworkProxy.String()).Get(downloadURL)
+		resp, err = httpclient.NewCloudFileRequest15s(Conf.System.NetworkProxy.String()).Get(downloadURL)
 	} else {
 	} else {
-		resp, err = util.NewCloudFileRequest2m(Conf.System.NetworkProxy.String()).Get(downloadURL)
+		resp, err = httpclient.NewCloudFileRequest2m(Conf.System.NetworkProxy.String()).Get(downloadURL)
 	}
 	}
 	if nil != err {
 	if nil != err {
 		util.LogErrorf("download request [%s] failed: %s", downloadURL, err)
 		util.LogErrorf("download request [%s] failed: %s", downloadURL, err)
@@ -457,7 +458,7 @@ func ossRemove0(cloudDirPath string, removes []string) (err error) {
 		return
 		return
 	}
 	}
 
 
-	request := util.NewCloudRequest(Conf.System.NetworkProxy.String())
+	request := httpclient.NewCloudRequest(Conf.System.NetworkProxy.String())
 	resp, err := request.
 	resp, err := request.
 		SetBody(map[string]interface{}{"token": Conf.User.UserToken, "dirPath": cloudDirPath, "paths": removes}).
 		SetBody(map[string]interface{}{"token": Conf.User.UserToken, "dirPath": cloudDirPath, "paths": removes}).
 		Post(util.AliyunServer + "/apis/siyuan/data/removeSiYuanFile?uid=" + Conf.User.UserId)
 		Post(util.AliyunServer + "/apis/siyuan/data/removeSiYuanFile?uid=" + Conf.User.UserId)
@@ -511,7 +512,7 @@ func getOssUploadToken(filename, cloudDirPath string, length int64) (ret string,
 	// 因为需要指定 key,所以每次上传文件都必须在云端生成 Token,否则有安全隐患
 	// 因为需要指定 key,所以每次上传文件都必须在云端生成 Token,否则有安全隐患
 
 
 	var result map[string]interface{}
 	var result map[string]interface{}
-	req := util.NewCloudRequest(Conf.System.NetworkProxy.String()).
+	req := httpclient.NewCloudRequest(Conf.System.NetworkProxy.String()).
 		SetResult(&result)
 		SetResult(&result)
 	req.SetBody(map[string]interface{}{
 	req.SetBody(map[string]interface{}{
 		"token":   Conf.User.UserToken,
 		"token":   Conf.User.UserToken,
@@ -551,7 +552,7 @@ func getOssUploadToken(filename, cloudDirPath string, length int64) (ret string,
 func getCloudSyncVer(cloudDir string) (cloudSyncVer int64, err error) {
 func getCloudSyncVer(cloudDir string) (cloudSyncVer int64, err error) {
 	start := time.Now()
 	start := time.Now()
 	result := map[string]interface{}{}
 	result := map[string]interface{}{}
-	request := util.NewCloudRequest(Conf.System.NetworkProxy.String())
+	request := httpclient.NewCloudRequest(Conf.System.NetworkProxy.String())
 	resp, err := request.
 	resp, err := request.
 		SetResult(&result).
 		SetResult(&result).
 		SetBody(map[string]string{"syncDir": cloudDir, "token": Conf.User.UserToken}).
 		SetBody(map[string]string{"syncDir": cloudDir, "token": Conf.User.UserToken}).
@@ -591,7 +592,7 @@ func getCloudSyncVer(cloudDir string) (cloudSyncVer int64, err error) {
 func getCloudSync(cloudDir string) (assetSize, backupSize int64, device string, err error) {
 func getCloudSync(cloudDir string) (assetSize, backupSize int64, device string, err error) {
 	start := time.Now()
 	start := time.Now()
 	result := map[string]interface{}{}
 	result := map[string]interface{}{}
-	request := util.NewCloudRequest(Conf.System.NetworkProxy.String())
+	request := httpclient.NewCloudRequest(Conf.System.NetworkProxy.String())
 	resp, err := request.
 	resp, err := request.
 		SetResult(&result).
 		SetResult(&result).
 		SetBody(map[string]string{"syncDir": cloudDir, "token": Conf.User.UserToken}).
 		SetBody(map[string]string{"syncDir": cloudDir, "token": Conf.User.UserToken}).
@@ -656,7 +657,7 @@ func getLocalFileListOSS(isBackup bool) (ret map[string]*CloudIndex, err error)
 
 
 func getCloudFileListOSS(cloudDirPath string) (ret map[string]*CloudIndex, err error) {
 func getCloudFileListOSS(cloudDirPath string) (ret map[string]*CloudIndex, err error) {
 	result := map[string]interface{}{}
 	result := map[string]interface{}{}
-	request := util.NewCloudRequest(Conf.System.NetworkProxy.String())
+	request := httpclient.NewCloudRequest(Conf.System.NetworkProxy.String())
 	resp, err := request.
 	resp, err := request.
 		SetResult(&result).
 		SetResult(&result).
 		SetBody(map[string]string{"dirPath": cloudDirPath, "token": Conf.User.UserToken}).
 		SetBody(map[string]string{"dirPath": cloudDirPath, "token": Conf.User.UserToken}).
@@ -681,7 +682,7 @@ func getCloudFileListOSS(cloudDirPath string) (ret map[string]*CloudIndex, err e
 
 
 	retData := result["data"].(map[string]interface{})
 	retData := result["data"].(map[string]interface{})
 	downloadURL := retData["url"].(string)
 	downloadURL := retData["url"].(string)
-	resp, err = util.NewCloudFileRequest15s(Conf.System.NetworkProxy.String()).Get(downloadURL)
+	resp, err = httpclient.NewCloudFileRequest15s(Conf.System.NetworkProxy.String()).Get(downloadURL)
 	if nil != err {
 	if nil != err {
 		util.LogErrorf("download request [%s] failed: %s", downloadURL, err)
 		util.LogErrorf("download request [%s] failed: %s", downloadURL, err)
 		return
 		return

+ 2 - 108
kernel/util/rhy.go

@@ -17,11 +17,10 @@
 package util
 package util
 
 
 import (
 import (
-	"net/http"
 	"sync"
 	"sync"
 	"time"
 	"time"
 
 
-	"github.com/imroc/req/v3"
+	"github.com/siyuan-note/httpclient"
 )
 )
 
 
 var cachedRhyResult = map[string]interface{}{}
 var cachedRhyResult = map[string]interface{}{}
@@ -37,7 +36,7 @@ func GetRhyResult(force bool, proxyURL string) (map[string]interface{}, error) {
 		return cachedRhyResult, nil
 		return cachedRhyResult, nil
 	}
 	}
 
 
-	request := NewCloudRequest(proxyURL)
+	request := httpclient.NewCloudRequest(proxyURL)
 	_, err := request.SetResult(&cachedRhyResult).Get(AliyunServer + "/apis/siyuan/version?ver=" + Ver)
 	_, err := request.SetResult(&cachedRhyResult).Get(AliyunServer + "/apis/siyuan/version?ver=" + Ver)
 	if nil != err {
 	if nil != err {
 		LogErrorf("get version meta info failed: %s", err)
 		LogErrorf("get version meta info failed: %s", err)
@@ -46,108 +45,3 @@ func GetRhyResult(force bool, proxyURL string) (map[string]interface{}, error) {
 	rhyResultCacheTime = now
 	rhyResultCacheTime = now
 	return cachedRhyResult, nil
 	return cachedRhyResult, nil
 }
 }
-
-var (
-	browserClient, browserDownloadClient, cloudAPIClient, cloudFileClientTimeout2Min, cloudFileClientTimeout15s *req.Client
-
-	browserUserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36"
-)
-
-func NewBrowserRequest(proxyURL string) (ret *req.Request) {
-	if nil == browserClient {
-		browserClient = req.C().
-			SetUserAgent(browserUserAgent).
-			SetTimeout(7 * time.Second).
-			DisableInsecureSkipVerify()
-	}
-	if "" != proxyURL {
-		browserClient.SetProxyURL(proxyURL)
-	}
-	ret = browserClient.R()
-	ret.SetRetryCount(1).SetRetryFixedInterval(3 * time.Second)
-	return
-}
-
-func NewBrowserDownloadRequest(proxyURL string) *req.Request {
-	if nil == browserDownloadClient {
-		browserDownloadClient = req.C().
-			SetUserAgent(browserUserAgent).
-			SetTimeout(2 * time.Minute).
-			SetCommonRetryCount(1).
-			SetCommonRetryFixedInterval(3 * time.Second).
-			SetCommonRetryCondition(retryCondition).
-			DisableInsecureSkipVerify()
-	}
-	if "" != proxyURL {
-		browserDownloadClient.SetProxyURL(proxyURL)
-	}
-	return browserDownloadClient.R()
-}
-
-func NewCloudRequest(proxyURL string) *req.Request {
-	if nil == cloudAPIClient {
-		cloudAPIClient = req.C().
-			SetUserAgent(UserAgent).
-			SetTimeout(7 * time.Second).
-			SetCommonRetryCount(1).
-			SetCommonRetryFixedInterval(3 * time.Second).
-			SetCommonRetryCondition(retryCondition).
-			DisableInsecureSkipVerify()
-	}
-	if "" != proxyURL {
-		cloudAPIClient.SetProxyURL(proxyURL)
-	}
-	return cloudAPIClient.R()
-}
-
-func NewCloudFileRequest2m(proxyURL string) *req.Request {
-	if nil == cloudFileClientTimeout2Min {
-		cloudFileClientTimeout2Min = req.C().
-			SetUserAgent(UserAgent).
-			SetTimeout(2 * time.Minute).
-			SetCommonRetryCount(1).
-			SetCommonRetryFixedInterval(3 * time.Second).
-			SetCommonRetryCondition(retryCondition).
-			DisableInsecureSkipVerify()
-		setTransport(cloudFileClientTimeout2Min.GetClient())
-	}
-	if "" != proxyURL {
-		cloudFileClientTimeout2Min.SetProxyURL(proxyURL)
-	}
-	return cloudFileClientTimeout2Min.R()
-}
-
-func NewCloudFileRequest15s(proxyURL string) *req.Request {
-	if nil == cloudFileClientTimeout15s {
-		cloudFileClientTimeout15s = req.C().
-			SetUserAgent(UserAgent).
-			SetTimeout(15 * time.Second).
-			SetCommonRetryCount(1).
-			SetCommonRetryFixedInterval(3 * time.Second).
-			SetCommonRetryCondition(retryCondition).
-			DisableInsecureSkipVerify()
-		setTransport(cloudFileClientTimeout15s.GetClient())
-	}
-	if "" != proxyURL {
-		cloudFileClientTimeout15s.SetProxyURL(proxyURL)
-	}
-	return cloudFileClientTimeout15s.R()
-}
-
-func retryCondition(resp *req.Response, err error) bool {
-	if nil != err {
-		return true
-	}
-	if 503 == resp.StatusCode { // 负载均衡会返回 503,需要重试
-		return true
-	}
-	return false
-}
-
-func setTransport(client *http.Client) {
-	// 改进同步下载数据稳定性 https://github.com/siyuan-note/siyuan/issues/4994
-	transport := client.Transport.(*req.Transport)
-	transport.MaxIdleConns = 10
-	transport.MaxIdleConnsPerHost = 2
-	transport.MaxConnsPerHost = 2
-}

+ 3 - 1
kernel/util/working.go

@@ -32,6 +32,7 @@ import (
 	"github.com/88250/gulu"
 	"github.com/88250/gulu"
 	figure "github.com/common-nighthawk/go-figure"
 	figure "github.com/common-nighthawk/go-figure"
 	goPS "github.com/mitchellh/go-ps"
 	goPS "github.com/mitchellh/go-ps"
+	"github.com/siyuan-note/httpclient"
 )
 )
 
 
 //var Mode = "dev"
 //var Mode = "dev"
@@ -53,6 +54,7 @@ func Boot() {
 	IncBootProgress(3, "Booting...")
 	IncBootProgress(3, "Booting...")
 	rand.Seed(time.Now().UTC().UnixNano())
 	rand.Seed(time.Now().UTC().UnixNano())
 	initMime()
 	initMime()
+	httpclient.SetUserAgent(UserAgent)
 
 
 	workspacePath := flag.String("workspace", "", "dir path of the workspace, default to ~/Documents/SiYuan/")
 	workspacePath := flag.String("workspace", "", "dir path of the workspace, default to ~/Documents/SiYuan/")
 	wdPath := flag.String("wd", WorkingDir, "working directory of SiYuan")
 	wdPath := flag.String("wd", WorkingDir, "working directory of SiYuan")
@@ -323,7 +325,7 @@ func checkPort() {
 
 
 	LogInfof("port [%s] is opened, try to check version of running kernel", ServerPort)
 	LogInfof("port [%s] is opened, try to check version of running kernel", ServerPort)
 	result := NewResult()
 	result := NewResult()
-	_, err := NewBrowserRequest("").
+	_, err := httpclient.NewBrowserRequest("").
 		SetResult(result).
 		SetResult(result).
 		SetHeader("User-Agent", UserAgent).
 		SetHeader("User-Agent", UserAgent).
 		Get("http://127.0.0.1:" + ServerPort + "/api/system/version")
 		Get("http://127.0.0.1:" + ServerPort + "/api/system/version")

+ 2 - 0
kernel/util/working_mobile.go

@@ -23,12 +23,14 @@ import (
 	"time"
 	"time"
 
 
 	figure "github.com/common-nighthawk/go-figure"
 	figure "github.com/common-nighthawk/go-figure"
+	"github.com/siyuan-note/httpclient"
 )
 )
 
 
 func BootMobile(container, appDir, workspaceDir, nativeLibDir, privateDataDir, lang string) {
 func BootMobile(container, appDir, workspaceDir, nativeLibDir, privateDataDir, lang string) {
 	IncBootProgress(3, "Booting...")
 	IncBootProgress(3, "Booting...")
 	rand.Seed(time.Now().UTC().UnixNano())
 	rand.Seed(time.Now().UTC().UnixNano())
 	initMime()
 	initMime()
+	httpclient.SetUserAgent(UserAgent)
 
 
 	HomeDir = filepath.Join(workspaceDir, "home")
 	HomeDir = filepath.Join(workspaceDir, "home")
 	WorkingDir = filepath.Join(appDir, "app")
 	WorkingDir = filepath.Join(appDir, "app")