]> git.r.bdr.sh - rbdr/mobius/commitdiff
Read banner once at startup
authorJeff Halter <redacted>
Mon, 10 Jun 2024 16:00:13 +0000 (09:00 -0700)
committerJeff Halter <redacted>
Mon, 10 Jun 2024 16:01:14 +0000 (09:01 -0700)
hotline/server.go
hotline/transaction_handlers_test.go
hotline/transfer.go

index dde469d8b63555d9c4ddaee664bedccf680b1ceb..b5bb0d515cde11cf2bc6cb013bbc6a04b7ba3aa1 100644 (file)
@@ -2,6 +2,7 @@ package hotline
 
 import (
        "bufio"
+       "bytes"
        "context"
        "encoding/binary"
        "errors"
@@ -48,6 +49,7 @@ type Server struct {
        Config    *Config
        ConfigDir string
        Logger    *zap.SugaredLogger
+       banner    []byte
 
        PrivateChatsMu sync.Mutex
        PrivateChats   map[uint32]*PrivateChat
@@ -270,6 +272,11 @@ func NewServer(configDir, netInterface string, netPort int, logger *zap.SugaredL
                server.Config.FileRoot = filepath.Join(configDir, server.Config.FileRoot)
        }
 
+       server.banner, err = os.ReadFile(filepath.Join(server.ConfigDir, server.Config.BannerFile))
+       if err != nil {
+               return nil, fmt.Errorf("error opening banner: %w", err)
+       }
+
        *server.NextGuestID = 1
 
        if server.Config.EnableTrackerRegistration {
@@ -840,8 +847,8 @@ func (s *Server) handleFileTransfer(ctx context.Context, rwc io.ReadWriter) erro
 
        switch fileTransfer.Type {
        case bannerDownload:
-               if err := s.bannerDownload(rwc); err != nil {
-                       return err
+               if _, err := io.Copy(rwc, bytes.NewBuffer(s.banner)); err != nil {
+                       return fmt.Errorf("error sending banner: %w", err)
                }
        case FileDownload:
                s.Stats.DownloadCounter += 1
index ca1722faa10342ed976806687261b476d9d1667a..81ba6e0f5b81afca2cba93a678d54b8cfceaabc1 100644 (file)
@@ -3338,72 +3338,6 @@ func TestHandleDelNewsItem(t *testing.T) {
        }
 }
 
-func TestHandleDownloadBanner(t *testing.T) {
-       type args struct {
-               cc *ClientConn
-               t  *Transaction
-       }
-       tests := []struct {
-               name    string
-               args    args
-               wantRes []Transaction
-               wantErr assert.ErrorAssertionFunc
-       }{
-               {
-                       name: "returns expected response",
-                       args: args{
-                               cc: &ClientConn{
-                                       ID: &[]byte{0, 1},
-                                       transfers: map[int]map[[4]byte]*FileTransfer{
-                                               bannerDownload: {},
-                                       },
-                                       Server: &Server{
-                                               ConfigDir: "/config",
-                                               Config: &Config{
-                                                       BannerFile: "banner.jpg",
-                                               },
-                                               fileTransfers: map[[4]byte]*FileTransfer{},
-                                               FS: func() *MockFileStore {
-                                                       mfi := &MockFileInfo{}
-                                                       mfi.On("Size").Return(int64(100))
-
-                                                       mfs := &MockFileStore{}
-                                                       mfs.On("Stat", "/config/banner.jpg").Return(mfi, nil)
-                                                       return mfs
-                                               }(),
-                                       },
-                               },
-                               t: NewTransaction(TranDownloadBanner, nil),
-                       },
-                       wantRes: []Transaction{
-                               {
-                                       clientID:  &[]byte{0, 1},
-                                       Flags:     0x00,
-                                       IsReply:   0x01,
-                                       Type:      []byte{0, 0},
-                                       ID:        []byte{0, 0, 0, 0},
-                                       ErrorCode: []byte{0, 0, 0, 0},
-                                       Fields: []Field{
-                                               NewField(FieldRefNum, []byte{1, 2, 3, 4}),
-                                               NewField(FieldTransferSize, []byte{0, 0, 0, 0x64}),
-                                       },
-                               },
-                       },
-                       wantErr: assert.NoError,
-               },
-       }
-       for _, tt := range tests {
-               t.Run(tt.name, func(t *testing.T) {
-                       gotRes, err := HandleDownloadBanner(tt.args.cc, tt.args.t)
-                       if !tt.wantErr(t, err, fmt.Sprintf("HandleDownloadBanner(%v, %v)", tt.args.cc, tt.args.t)) {
-                               return
-                       }
-
-                       tranAssertEqual(t, tt.wantRes, gotRes)
-               })
-       }
-}
-
 func TestHandleTranOldPostNews(t *testing.T) {
        type args struct {
                cc *ClientConn
index 543b00c727240ea1e43890e95d2093f23f36263c..1257f8a33825285d2501373e4b44f870c21fa416 100644 (file)
@@ -5,8 +5,6 @@ import (
        "encoding/binary"
        "errors"
        "io"
-       "os"
-       "path/filepath"
 )
 
 type transfer struct {
@@ -57,14 +55,3 @@ func receiveFile(r io.Reader, targetFile, resForkFile, infoFork, counterWriter i
        }
        return nil
 }
-
-// TODO: read the banner once on startup instead of once per banner fetch
-func (s *Server) bannerDownload(w io.Writer) error {
-       bannerBytes, err := os.ReadFile(filepath.Join(s.ConfigDir, s.Config.BannerFile))
-       if err != nil {
-               return err
-       }
-       _, err = w.Write(bannerBytes)
-
-       return err
-}