Skip to content

Commit a8bf2d0

Browse files
committed
large packet based data transfer issue fixed
1 parent 94147e0 commit a8bf2d0

4 files changed

Lines changed: 126 additions & 21 deletions

File tree

daemon/daemon.go

Lines changed: 88 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package daemon
22

33
import (
4+
"bufio"
45
"context"
6+
"encoding/binary"
57
"fmt"
8+
"io"
69
"log"
710
"net"
811
"os"
@@ -164,7 +167,6 @@ func (ps *daemonMgr) StatusDaemon(ctx context.Context) error {
164167
return nil
165168
}
166169

167-
// Send commands to the daemon
168170
func (ps *daemonMgr) SendCommandToDaemon(ctx context.Context, packet models.Packet) error {
169171
// Ensure the daemon is running
170172
if !ps.IsDaemonRunning(ctx) {
@@ -178,48 +180,118 @@ func (ps *daemonMgr) SendCommandToDaemon(ctx context.Context, packet models.Pack
178180
defer conn.Close()
179181

180182
data := packet.ToByte()
183+
packetSize := uint32(len(data))
181184

182-
// Send request to daemon
183-
_, err = conn.Write(data)
185+
// Send the size header (4 bytes)
186+
sizeHeader := make([]byte, 4)
187+
binary.BigEndian.PutUint32(sizeHeader, packetSize)
188+
_, err = conn.Write(sizeHeader)
184189
if err != nil {
185-
return fmt.Errorf("failed to send command: %v", err)
190+
return fmt.Errorf("failed to send size header: %v", err)
186191
}
187192

188-
// Read the response from the daemon
189-
buf := make([]byte, 1024)
190-
n, err := conn.Read(buf)
193+
// Send the data in chunks
194+
const chunkSize = 4096
195+
for start := 0; start < len(data); start += chunkSize {
196+
end := start + chunkSize
197+
if end > len(data) {
198+
end = len(data)
199+
}
200+
_, err = conn.Write(data[start:end])
201+
if err != nil {
202+
return fmt.Errorf("failed to send data chunk: %v", err)
203+
}
204+
}
205+
206+
// Read the response size header (4 bytes)
207+
responseSizeHeader := make([]byte, 4)
208+
_, err = io.ReadFull(conn, responseSizeHeader)
191209
if err != nil {
192-
return fmt.Errorf("failed to read response: %v", err)
210+
return fmt.Errorf("failed to read response size header: %v", err)
193211
}
194-
result, err := utils.ToPacket(buf[:n])
212+
responseSize := binary.BigEndian.Uint32(responseSizeHeader)
213+
214+
// Read the full response data in chunks
215+
fullResponse := make([]byte, responseSize)
216+
_, err = io.ReadFull(conn, fullResponse)
217+
if err != nil {
218+
return fmt.Errorf("failed to read full response: %v", err)
219+
}
220+
221+
// Decode the response
222+
result, err := utils.ToPacket(fullResponse)
195223
if err != nil {
196224
return fmt.Errorf("failed to decode response: %v", err)
197225
}
198-
fmt.Printf(string(result.Data))
226+
fmt.Println(string(result.Data))
199227
return nil
200228
}
201229

202230
func (ps *daemonMgr) handleClient(ctx context.Context, conn net.Conn) {
203231
defer conn.Close()
204232

205-
buf := make([]byte, 1024)
206-
n, err := conn.Read(buf)
233+
// Use a buffered reader for handling fragmented data
234+
reader := bufio.NewReader(conn)
235+
236+
// Read the size header (4 bytes)
237+
header := make([]byte, 4)
238+
_, err := io.ReadFull(reader, header)
239+
if err != nil {
240+
log.Printf("Error reading size header: %v", err)
241+
return
242+
}
243+
244+
packetSize := binary.BigEndian.Uint32(header)
245+
log.Printf("Expected packet size: %d", packetSize)
246+
247+
// Read the full packet based on the size
248+
packetData := make([]byte, packetSize)
249+
_, err = io.ReadFull(reader, packetData)
207250
if err != nil {
208-
log.Printf("Error reading command: %v", err)
251+
log.Printf("Error reading packet data: %v", err)
209252
return
210253
}
211254

212-
packet, err := utils.ToPacket(buf[:n])
255+
// Decode the packet
256+
packet, err := utils.ToPacket(packetData)
213257
if err != nil {
214258
log.Printf("Error decoding packet: %v", err)
215259
return
216260
}
217261

262+
// Process the packet
218263
result, err := ps.handler.Handle(ctx, packet)
219264
if err != nil {
220-
log.Printf("Error executing command: %v\n", err)
265+
log.Printf("Error executing command: %v", err)
266+
return
267+
}
268+
269+
// Prepare the response
270+
responseData := result.ToByte()
271+
responseSize := uint32(len(responseData))
272+
273+
// Send the size header (4 bytes)
274+
sizeHeader := make([]byte, 4)
275+
binary.BigEndian.PutUint32(sizeHeader, responseSize)
276+
_, err = conn.Write(sizeHeader)
277+
if err != nil {
278+
log.Printf("Error sending response size header: %v", err)
279+
return
280+
}
281+
282+
// Send the response in chunks
283+
const chunkSize = 4096
284+
for start := 0; start < len(responseData); start += chunkSize {
285+
end := start + chunkSize
286+
if end > len(responseData) {
287+
end = len(responseData)
288+
}
289+
_, err = conn.Write(responseData[start:end])
290+
if err != nil {
291+
log.Printf("Error sending response data: %v", err)
292+
return
293+
}
221294
}
222-
conn.Write(result.ToByte())
223295
}
224296

225297
func NewDaemonMgr(

handler/credientialHandler.go

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,17 @@ func (h *handler) removeCrediential(packet models.Packet) (models.Packet, error)
4444
result.Data = []byte("Uanble to decode crediential\n")
4545
return result, err
4646
}
47+
48+
if len(doc.Name) == 0 {
49+
result.Data = []byte("Crediential name is required\n")
50+
return result, nil
51+
}
52+
4753
err = h.configRepo.RemoveCrediential(doc.Name)
4854
if err != nil {
4955
log.Println("failed to remove crediential.", err)
5056
}
5157
result.Data = []byte("crediential removed\n")
52-
log.Println("Crediential removed.")
5358
return result, nil
5459
}
5560

@@ -78,7 +83,6 @@ func (h *handler) listCrediential(_ models.Packet) (models.Packet, error) {
7883
table.Render()
7984

8085
result.Data = buf.Bytes()
81-
log.Println("Crediential removed.")
8286
return result, nil
8387
}
8488

@@ -95,6 +99,11 @@ func (h *handler) detailCrediential(packet models.Packet) (models.Packet, error)
9599
return result, err
96100
}
97101

102+
if len(cred.Name) == 0 {
103+
result.Data = []byte("Crediential name is required\n")
104+
return result, nil
105+
}
106+
98107
cred, err = h.configRepo.DetailCrediential(cred.Name)
99108
if err != nil {
100109
log.Println("failed to read crediential.", err)
@@ -106,8 +115,11 @@ func (h *handler) detailCrediential(packet models.Packet) (models.Packet, error)
106115

107116
table.Append([]string{"Name:", cred.Name})
108117
table.Append([]string{"Type:", cred.Type})
109-
table.Append([]string{"Password:", cred.Password})
110-
table.Append([]string{"Key File:", cred.KeyFile})
118+
if cred.Type == constants.CREDIENTIAL_PASS {
119+
table.Append([]string{"Password:", cred.Password})
120+
} else {
121+
table.Append([]string{"Key File:", cred.KeyFile})
122+
}
111123

112124
table.SetBorder(true) // Enable/Disable borders
113125
table.SetAlignment(tablewriter.ALIGN_LEFT)

handler/hostHanler.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,12 @@ func (h *handler) removeHost(packet models.Packet) (models.Packet, error) {
4545
result.Data = []byte("Uanble to decode host\n")
4646
return result, err
4747
}
48+
49+
if len(doc.Name) == 0 {
50+
result.Data = []byte("Host name is required\n")
51+
return result, nil
52+
}
53+
4854
err = h.configRepo.RemoveHost(doc.Name)
4955
if err != nil {
5056
log.Println("failed to remove host.", err)
@@ -79,7 +85,6 @@ func (h *handler) listHost(_ models.Packet) (models.Packet, error) {
7985
table.Render()
8086

8187
result.Data = buf.Bytes()
82-
log.Println("Crediential removed.")
8388
return result, nil
8489
}
8590

@@ -96,6 +101,11 @@ func (h *handler) detailHost(packet models.Packet) (models.Packet, error) {
96101
return result, err
97102
}
98103

104+
if len(doc.Name) == 0 {
105+
result.Data = []byte("Host name is required\n")
106+
return result, nil
107+
}
108+
99109
doc, err = h.configRepo.DetailHost(doc.Name)
100110
if err != nil {
101111
log.Println("failed to read host.", err)

handler/tunnelHandler.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,12 @@ func (h *handler) removeTunnel(packet models.Packet) (models.Packet, error) {
4646
result.Data = []byte("Uanble to decode tunnel\n")
4747
return result, err
4848
}
49+
50+
if len(doc.Name) == 0 {
51+
result.Data = []byte("Tunnel name is required\n")
52+
return result, nil
53+
}
54+
4955
err = h.configRepo.RemoveTunnel(doc.Name)
5056
if err != nil {
5157
log.Println("failed to remove tunnel.", err)
@@ -106,6 +112,11 @@ func (h *handler) detailTunnel(packet models.Packet) (models.Packet, error) {
106112
return result, err
107113
}
108114

115+
if len(doc.Name) == 0 {
116+
result.Data = []byte("Tunnel name is required\n")
117+
return result, nil
118+
}
119+
109120
doc, err = h.configRepo.DetailTunnel(doc.Name)
110121
if err != nil {
111122
log.Println("failed to read tunnel.", err)

0 commit comments

Comments
 (0)