@@ -3,6 +3,7 @@ package handlers
33import (
44 "bytes"
55 "errors"
6+ "io"
67 "log/slog"
78 "net"
89 "sync/atomic"
@@ -24,7 +25,7 @@ func InitRemoteScraper(listenAddr *net.TCPAddr, authCode []byte) error {
2425 return errors .New ("auth code max length is 8 bytes" )
2526 }
2627
27- inChan = make (chan remoteResult )
28+ inChan = make (chan remoteResult , 1000 )
2829
2930 ln , err := net .ListenTCP ("tcp" , listenAddr )
3031 if err != nil {
@@ -63,39 +64,48 @@ func handleConnection(conn net.Conn) {
6364 }()
6465 sessCount .Add (1 )
6566
66- for rm := range inChan {
67- if err := conn .SetDeadline (time .Now ().Add (5 * time .Second )); err != nil {
68- slog .Error ("failed to set deadline" , "err" , err )
69- rm .outChan <- err
70- return
71- }
67+ for {
68+ select {
69+ case rm := <- inChan :
70+ if err := conn .SetWriteDeadline (time .Now ().Add (500 * time .Millisecond )); err != nil {
71+ slog .Error ("failed to set deadline" , "err" , err )
72+ rm .outChan <- err
73+ return
74+ }
7275
73- buf := []byte (rm .instaData .PostID )
74- if _ , err := conn .Write (buf ); err != nil {
75- slog .Error ("failed to write to stream" , "err" , err )
76- rm .outChan <- err
77- return
78- }
76+ buf := []byte (rm .instaData .PostID )
77+ _ , err := conn .Write (buf )
78+ if err != nil {
79+ if opErr , ok := err .(* net.OpError ); ok && opErr .Timeout () {
80+ rm .outChan <- err
81+ continue
82+ } else if err != io .EOF {
83+ rm .outChan <- err
84+ slog .Error ("write error" , "err" , err )
85+ return
86+ }
87+ }
7988
80- outBuf := make ([]byte , 1024 * 1024 )
81- n , err := conn .Read (outBuf )
82- if err != nil {
83- slog .Error ("failed to read from stream" , "err" , err )
84- rm .outChan <- err
85- return
86- }
89+ outBuf := make ([]byte , 1024 * 1024 )
90+ n , err := conn .Read (outBuf )
91+ if err != nil {
92+ slog .Error ("failed to read from stream" , "err" , err )
93+ rm .outChan <- err
94+ return
95+ }
8796
88- if err := binary .Unmarshal (outBuf [:n ], rm .instaData ); err != nil {
89- slog .Error ("failed to unmarshal data" , "err" , err )
90- rm .outChan <- err
91- continue
92- }
97+ if err := binary .Unmarshal (outBuf [:n ], rm .instaData ); err != nil {
98+ slog .Error ("failed to unmarshal data" , "err" , err )
99+ rm .outChan <- err
100+ continue
101+ }
93102
94- if rm .instaData .Username == "" {
95- rm .outChan <- errors .New ("remote scraper returns empty data" )
96- continue
103+ if rm .instaData .Username == "" {
104+ rm .outChan <- errors .New ("remote scraper returns empty data" )
105+ continue
106+ }
107+ rm .outChan <- nil
97108 }
98- rm .outChan <- nil
99109 }
100110}
101111
0 commit comments