Skip to content

Commit 7341a02

Browse files
committed
part2
1 parent 2538a53 commit 7341a02

File tree

1 file changed

+39
-29
lines changed

1 file changed

+39
-29
lines changed

handlers/scraper/remote.go

Lines changed: 39 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package handlers
33
import (
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

Comments
 (0)