MCPcopy
hub / github.com/txthinking/brook / UDPHandle

Method UDPHandle

relay.go:163–228  ·  view source on GitHub ↗
(addr *net.UDPAddr, b []byte, l1 *net.UDPConn)

Source from the content-addressed store, hash-verified

161}
162
163func (s *Relay) UDPHandle(addr *net.UDPAddr, b []byte, l1 *net.UDPConn) error {
164 if s.IsDNS {
165 m := &dns.Msg{}
166 if err := m.Unpack(b); err != nil {
167 return err
168 }
169 if len(m.Question) == 0 {
170 return errors.New("no question")
171 }
172 done, err := DNSGate(addr, m, l1)
173 if err != nil {
174 return err
175 }
176 if done {
177 return nil
178 }
179 }
180 c, err := s.Pcf.Handle(addr, s.Dstb, b, func(b []byte) (int, error) {
181 return l1.WriteToUDP(b, addr)
182 }, s.UDPTimeout)
183 if err != nil {
184 return err
185 }
186 if c == nil {
187 return nil
188 }
189 defer c.Close()
190 rc, err := NATDial("udp", addr.String(), s.To, s.To)
191 if err != nil {
192 return err
193 }
194 defer rc.Close()
195 go func() {
196 var bf [65507]byte
197 for {
198 if s.UDPTimeout != 0 {
199 if err := rc.SetDeadline(time.Now().Add(time.Duration(s.UDPTimeout) * time.Second)); err != nil {
200 return
201 }
202 }
203 i, err := rc.Read(bf[:])
204 if err != nil {
205 return
206 }
207 if _, err := c.Write(bf[0:i]); err != nil {
208 return
209 }
210 }
211 }()
212 var bf [65507]byte
213 for {
214 if s.UDPTimeout != 0 {
215 if err := c.SetDeadline(time.Now().Add(time.Duration(s.UDPTimeout) * time.Second)); err != nil {
216 return nil
217 }
218 }
219 i, err := c.Read(bf[:])
220 if err != nil {

Callers 1

ListenAndServeMethod · 0.95

Calls 5

HandleMethod · 0.65
CloseMethod · 0.45
SetDeadlineMethod · 0.45
ReadMethod · 0.45
WriteMethod · 0.45

Tested by

no test coverage detected