11package daemon
22
33import (
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
168170func (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
202230func (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
225297func NewDaemonMgr (
0 commit comments