working commit

This commit is contained in:
2026-02-02 17:27:16 +02:00
parent 0dac88fde8
commit 41e1b253f7
6 changed files with 160 additions and 67 deletions
+3
View File
@@ -1,6 +1,8 @@
package handler package handler
import ( import (
"net/http"
"mstore/app/operator" "mstore/app/operator"
"mstore/app/router" "mstore/app/router"
) )
@@ -10,5 +12,6 @@ func (hand *Handler) SendHello(rctx *router.Context) {
params := &operator.SendHelloParams{} params := &operator.SendHelloParams{}
res, _ := hand.oper.SendHello(params) res, _ := hand.oper.SendHello(params)
rctx.SetStatus(http.StatusOK)
hand.SendResult(rctx, res) hand.SendResult(rctx, res)
} }
+5
View File
@@ -55,6 +55,11 @@ func (svc *Service) Build() error {
svc.logg.Infof("Service build ") svc.logg.Infof("Service build ")
svc.rout = router.NewRouter() svc.rout = router.NewRouter()
svc.rout.Use(router.NewRecoveryMiddleware(svc.logg.Errorf))
svc.rout.Use(router.NewLoggingMiddleware(svc.logg.Infof))
svc.rout.Use(router.NewCorsMiddleware())
svc.rout.Get("/v3/api/service/hello", svc.hand.SendHello) svc.rout.Get("/v3/api/service/hello", svc.hand.SendHello)
svc.rout.Head("/v3/api/file/{filepath}", svc.hand.FileExists) svc.rout.Head("/v3/api/file/{filepath}", svc.hand.FileExists)
+28 -6
View File
@@ -7,15 +7,18 @@ import (
"strings" "strings"
) )
const fileAPI = "/v3/api/file/" const (
const serviceAPI = "/v3/api/service/" serviceAPI = "/v3/api/service/"
fileAPI = "/v3/api/file/"
filesAPI = "/v3/api/files/"
)
func createBasicAuthPair(username, password string) string { func encodeBasicAuth(username, password string) string {
auth := username + ":" + password auth := username + ":" + password
return "Basic " + base64.StdEncoding.EncodeToString([]byte(auth)) return "Basic " + base64.StdEncoding.EncodeToString([]byte(auth))
} }
func convertFileLink(ref string) (string, error) { func convertServiceRefer(ref string) (string, error) {
var err error var err error
var res string var res string
if !strings.Contains(ref, "://") { if !strings.Contains(ref, "://") {
@@ -25,13 +28,31 @@ func convertFileLink(ref string) (string, error) {
if err != nil { if err != nil {
return res, err return res, err
} }
url.Path = path.Clean(url.Path)
url.Path = path.Join(serviceAPI, url.Path)
url.User = nil
res = url.String()
return res, err
}
func convertFileRefer(ref string) (string, error) {
var err error
var res string
if !strings.Contains(ref, "://") {
ref = "https://" + ref
}
url, err := url.Parse(ref)
if err != nil {
return res, err
}
url.Path = path.Clean(url.Path)
url.Path = path.Join(fileAPI, url.Path) url.Path = path.Join(fileAPI, url.Path)
url.User = nil url.User = nil
res = url.String() res = url.String()
return res, err return res, err
} }
func convertServiceLink(ref string) (string, error) { func convertFilesRefer(ref string) (string, error) {
var err error var err error
var res string var res string
if !strings.Contains(ref, "://") { if !strings.Contains(ref, "://") {
@@ -41,7 +62,8 @@ func convertServiceLink(ref string) (string, error) {
if err != nil { if err != nil {
return res, err return res, err
} }
url.Path = path.Join(serviceAPI, url.Path) url.Path = path.Clean(url.Path)
url.Path = path.Join(filesAPI, url.Path)
url.User = nil url.User = nil
res = url.String() res = url.String()
return res, err return res, err
+80 -51
View File
@@ -11,17 +11,27 @@ import (
"strconv" "strconv"
) )
type Client struct{} type Client struct {
username string
password string
}
func NewClient() *Client { func NewClient() *Client {
return &Client{} return &Client{}
} }
func NewClientWithAuth(username, password string) *Client {
return &Client{
username: username,
password: password,
}
}
func (cli *Client) ServiceHello(ctx context.Context, ref string) (bool, error) { func (cli *Client) ServiceHello(ctx context.Context, ref string) (bool, error) {
var res bool var res bool
var err error var err error
ref, err = convertServiceLink(ref) ref, err = convertServiceRefer(ref)
if err != nil { if err != nil {
return res, err return res, err
} }
@@ -53,7 +63,7 @@ func (cli *Client) FileExists(ctx context.Context, ref string) (bool, error) {
var res bool var res bool
var err error var err error
ref, err = convertFileLink(ref) ref, err = convertFileRefer(ref)
if err != nil { if err != nil {
return res, err return res, err
} }
@@ -62,6 +72,10 @@ func (cli *Client) FileExists(ctx context.Context, ref string) (bool, error) {
return res, err return res, err
} }
if cli.username != "" && cli.password != "" {
req.Header.Add("Authorization", encodeBasicAuth(cli.username, cli.password))
}
transport := &http.Transport{ transport := &http.Transport{
TLSClientConfig: &tls.Config{ TLSClientConfig: &tls.Config{
InsecureSkipVerify: true, InsecureSkipVerify: true,
@@ -81,10 +95,61 @@ func (cli *Client) FileExists(ctx context.Context, ref string) (bool, error) {
return res, err return res, err
} }
func (cli *Client) PutFile(ctx context.Context, filename, ref string) error {
var err error
ref, err = convertFileRefer(ref)
if err != nil {
return err
}
file, err := os.Open(filename)
if err != nil {
return err
}
defer file.Close()
req, err := http.NewRequestWithContext(ctx, http.MethodPut, ref, file)
if err != nil {
return err
}
if cli.username != "" && cli.password != "" {
req.Header.Add("Authorization", encodeBasicAuth(cli.username, cli.password))
}
transport := &http.Transport{
TLSClientConfig: &tls.Config{
InsecureSkipVerify: true,
},
}
client := &http.Client{
Transport: transport,
}
fileinfo, err := os.Stat(filename)
if err != nil {
return err
}
filesize := fileinfo.Size()
req.ContentLength = filesize
req.Header.Set("Content-Type", "application/octet-stream")
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
err := fmt.Errorf("Received wrong status code: %s", resp.Status)
return err
}
return err
}
func (cli *Client) GetFile(ctx context.Context, ref, filename string) (int64, error) { func (cli *Client) GetFile(ctx context.Context, ref, filename string) (int64, error) {
var err error var err error
var size int64 var size int64
ref, err = convertFileLink(ref) ref, err = convertFileRefer(ref)
if err != nil { if err != nil {
return size, err return size, err
} }
@@ -93,6 +158,11 @@ func (cli *Client) GetFile(ctx context.Context, ref, filename string) (int64, er
if err != nil { if err != nil {
return size, err return size, err
} }
if cli.username != "" && cli.password != "" {
req.Header.Add("Authorization", encodeBasicAuth(cli.username, cli.password))
}
transport := &http.Transport{ transport := &http.Transport{
TLSClientConfig: &tls.Config{ TLSClientConfig: &tls.Config{
InsecureSkipVerify: true, InsecureSkipVerify: true,
@@ -141,55 +211,9 @@ func (cli *Client) GetFile(ctx context.Context, ref, filename string) (int64, er
return size, err return size, err
} }
func (cli *Client) PutFile(ctx context.Context, filename, ref string) error {
var err error
ref, err = convertFileLink(ref)
if err != nil {
return err
}
file, err := os.Open(filename)
if err != nil {
return err
}
defer file.Close()
req, err := http.NewRequestWithContext(ctx, http.MethodPut, ref, file)
if err != nil {
return err
}
transport := &http.Transport{
TLSClientConfig: &tls.Config{
InsecureSkipVerify: true,
},
}
client := &http.Client{
Transport: transport,
}
fileinfo, err := os.Stat(filename)
if err != nil {
return err
}
filesize := fileinfo.Size()
req.ContentLength = filesize
req.Header.Set("Content-Type", "application/octet-stream")
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
err := fmt.Errorf("Received wrong status code: %s", resp.Status)
return err
}
return err
}
func (cli *Client) DeleteFile(ctx context.Context, ref, filename string) error { func (cli *Client) DeleteFile(ctx context.Context, ref, filename string) error {
var err error var err error
ref, err = convertFileLink(ref) ref, err = convertFileRefer(ref)
if err != nil { if err != nil {
return err return err
} }
@@ -197,6 +221,11 @@ func (cli *Client) DeleteFile(ctx context.Context, ref, filename string) error {
if err != nil { if err != nil {
return err return err
} }
if cli.username != "" && cli.password != "" {
req.Header.Add("Authorization", encodeBasicAuth(cli.username, cli.password))
}
transport := &http.Transport{ transport := &http.Transport{
TLSClientConfig: &tls.Config{ TLSClientConfig: &tls.Config{
InsecureSkipVerify: true, InsecureSkipVerify: true,
+38 -4
View File
@@ -10,7 +10,6 @@ import (
"testing" "testing"
"time" "time"
//"mstore/pkg/client"
"mstore/app/server" "mstore/app/server"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
@@ -67,12 +66,13 @@ func TestService(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
require.True(t, helloRes) require.True(t, helloRes)
} }
filesize := 32
{ {
// PutFile // PutFile
tmpdir := t.TempDir() tmpdir := t.TempDir()
tmpfile := filepath.Join(tmpdir, "foo.bin") tmpfile := filepath.Join(tmpdir, "foo.bin")
filedata := make([]byte, 32) filedata := make([]byte, filesize)
_, err = rand.Read(filedata) _, err = rand.Read(filedata)
require.NoError(t, err) require.NoError(t, err)
@@ -86,11 +86,21 @@ func TestService(t *testing.T) {
err = cli.PutFile(ctx, tmpfile, srvaddr+"/foo.bin") err = cli.PutFile(ctx, tmpfile, srvaddr+"/foo.bin")
require.NoError(t, err) require.NoError(t, err)
}
{
// FileExists
fmt.Printf("=== FileExists ===\n")
cli := NewClient()
ctx := context.Background()
ctx, _ = context.WithTimeout(ctx, 1*time.Second)
exists, err := cli.FileExists(ctx, srvaddr+"/foo.bin")
require.NoError(t, err)
require.True(t, exists)
} }
{ {
// GetFile // GetFile
fmt.Printf("=== GetFil ===\n") fmt.Printf("=== GetFile ===\n")
cli := NewClient() cli := NewClient()
ctx := context.Background() ctx := context.Background()
ctx, _ = context.WithTimeout(ctx, 1*time.Second) ctx, _ = context.WithTimeout(ctx, 1*time.Second)
@@ -98,9 +108,33 @@ func TestService(t *testing.T) {
tmpdir := t.TempDir() tmpdir := t.TempDir()
tmpfile := filepath.Join(tmpdir, "foo.bin") tmpfile := filepath.Join(tmpdir, "foo.bin")
_, err = cli.GetFile(ctx, srvaddr+"/foo.bin", tmpfile) recsize, err := cli.GetFile(ctx, srvaddr+"/foo.bin", tmpfile)
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, recsize, int64(filesize))
}
{
// DeleteFile
fmt.Printf("=== DeleteFile ===\n")
cli := NewClient()
ctx := context.Background()
ctx, _ = context.WithTimeout(ctx, 1*time.Second)
tmpdir := t.TempDir()
tmpfile := filepath.Join(tmpdir, "foo.bin")
err = cli.DeleteFile(ctx, srvaddr+"/foo.bin", tmpfile)
require.NoError(t, err)
}
{
// !FileExists
fmt.Printf("=== FileExists ===\n")
cli := NewClient()
ctx := context.Background()
ctx, _ = context.WithTimeout(ctx, 1*time.Second)
exists, err := cli.FileExists(ctx, srvaddr+"/foo.bin")
require.NoError(t, err)
require.False(t, exists)
} }
} }