From: Jeff Halter Date: Mon, 10 Jun 2024 16:00:13 +0000 (-0700) Subject: Read banner once at startup X-Git-Url: https://git.r.bdr.sh/rbdr/mobius/commitdiff_plain/5cc444c89968dda9060d4e2f458b1babb9b603cd?ds=sidebyside Read banner once at startup --- diff --git a/hotline/server.go b/hotline/server.go index dde469d..b5bb0d5 100644 --- a/hotline/server.go +++ b/hotline/server.go @@ -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 diff --git a/hotline/transaction_handlers_test.go b/hotline/transaction_handlers_test.go index ca1722f..81ba6e0 100644 --- a/hotline/transaction_handlers_test.go +++ b/hotline/transaction_handlers_test.go @@ -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 diff --git a/hotline/transfer.go b/hotline/transfer.go index 543b00c..1257f8a 100644 --- a/hotline/transfer.go +++ b/hotline/transfer.go @@ -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 -}