aboutsummaryrefslogtreecommitdiff
path: root/hotline
diff options
context:
space:
mode:
authorJeff Halter <868228+jhalter@users.noreply.github.com>2024-06-10 09:00:13 -0700
committerJeff Halter <868228+jhalter@users.noreply.github.com>2024-06-10 09:01:14 -0700
commit5cc444c89968dda9060d4e2f458b1babb9b603cd (patch)
tree3ee4a40710a18996d3673ac5f260df7c5ccd1a12 /hotline
parentc29db3dbd0491119755db5d99443dac423b2681b (diff)
Read banner once at startup
Diffstat (limited to 'hotline')
-rw-r--r--hotline/server.go11
-rw-r--r--hotline/transaction_handlers_test.go66
-rw-r--r--hotline/transfer.go13
3 files changed, 9 insertions, 81 deletions
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
-}