mirror of
https://github.com/shtorm-7/sing-box-extended.git
synced 2026-11-06 02:07:12 +00:00
refactor: Async DNS
This commit is contained in:
+38
-40
@@ -40,28 +40,30 @@ func HandleStreamDNSRequest(ctx context.Context, router adapter.DNSRouter, conn
|
||||
return err
|
||||
}
|
||||
metadataInQuery := metadata
|
||||
go func() error {
|
||||
response, err := router.Exchange(adapter.WithContext(ctx, &metadataInQuery), &message, adapter.DNSQueryOptions{})
|
||||
router.ExchangeAsync(adapter.WithContext(ctx, &metadataInQuery), &message, adapter.DNSQueryOptions{}, func(response *mDNS.Msg, err error) {
|
||||
if err != nil {
|
||||
conn.Close()
|
||||
return err
|
||||
return
|
||||
}
|
||||
responseLength := response.Len()
|
||||
responseBuffer := buf.NewSize(3 + responseLength)
|
||||
defer responseBuffer.Release()
|
||||
responseBuffer.Resize(2, 0)
|
||||
n, err := response.PackBuffer(responseBuffer.FreeBytes())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
responseBuffer.Truncate(len(n))
|
||||
binary.BigEndian.PutUint16(responseBuffer.ExtendHeader(2), uint16(len(n)))
|
||||
_, err = conn.Write(responseBuffer.Bytes())
|
||||
return err
|
||||
}()
|
||||
go writeStreamResponse(conn, response)
|
||||
})
|
||||
return nil
|
||||
}
|
||||
|
||||
func writeStreamResponse(conn net.Conn, response *mDNS.Msg) {
|
||||
responseLength := response.Len()
|
||||
responseBuffer := buf.NewSize(3 + responseLength)
|
||||
defer responseBuffer.Release()
|
||||
responseBuffer.Resize(2, 0)
|
||||
n, err := response.PackBuffer(responseBuffer.FreeBytes())
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
responseBuffer.Truncate(len(n))
|
||||
binary.BigEndian.PutUint16(responseBuffer.ExtendHeader(2), uint16(len(n)))
|
||||
conn.Write(responseBuffer.Bytes())
|
||||
}
|
||||
|
||||
func NewDNSPacketConnection(ctx context.Context, router adapter.DNSRouter, conn N.PacketConn, cachedPackets []*N.PacketBuffer, metadata adapter.InboundContext) error {
|
||||
metadata.Destination = M.Socksaddr{}
|
||||
var reader N.PacketReader = conn
|
||||
@@ -123,24 +125,22 @@ func NewDNSPacketConnection(ctx context.Context, router adapter.DNSRouter, conn
|
||||
timeout.Update()
|
||||
}
|
||||
metadataInQuery := metadata
|
||||
go func() error {
|
||||
response, err := router.Exchange(adapter.WithContext(ctx, &metadataInQuery), &message, adapter.DNSQueryOptions{})
|
||||
router.ExchangeAsync(adapter.WithContext(ctx, &metadataInQuery), &message, adapter.DNSQueryOptions{}, func(response *mDNS.Msg, err error) {
|
||||
if err != nil {
|
||||
cancel(err)
|
||||
return err
|
||||
return
|
||||
}
|
||||
timeout.Update()
|
||||
responseBuffer, err := dns.TruncateDNSMessage(&message, response, 1024)
|
||||
if err != nil {
|
||||
cancel(err)
|
||||
return err
|
||||
responseBuffer, truncateErr := dns.TruncateDNSMessage(&message, response, 1024)
|
||||
if truncateErr != nil {
|
||||
cancel(truncateErr)
|
||||
return
|
||||
}
|
||||
err = conn.WritePacket(responseBuffer, destination)
|
||||
if err != nil {
|
||||
cancel(err)
|
||||
writeErr := conn.WritePacket(responseBuffer, destination)
|
||||
if writeErr != nil {
|
||||
cancel(writeErr)
|
||||
}
|
||||
return err
|
||||
}()
|
||||
})
|
||||
}
|
||||
})
|
||||
group.Cleanup(func() {
|
||||
@@ -193,24 +193,22 @@ func newDNSPacketConnection(ctx context.Context, router adapter.DNSRouter, conn
|
||||
timeout.Update()
|
||||
}
|
||||
metadataInQuery := metadata
|
||||
go func() error {
|
||||
response, err := router.Exchange(adapter.WithContext(ctx, &metadataInQuery), &message, adapter.DNSQueryOptions{})
|
||||
router.ExchangeAsync(adapter.WithContext(ctx, &metadataInQuery), &message, adapter.DNSQueryOptions{}, func(response *mDNS.Msg, err error) {
|
||||
if err != nil {
|
||||
cancel(err)
|
||||
return err
|
||||
return
|
||||
}
|
||||
timeout.Update()
|
||||
responseBuffer, err := dns.TruncateDNSMessage(&message, response, 1024)
|
||||
if err != nil {
|
||||
cancel(err)
|
||||
return err
|
||||
responseBuffer, truncateErr := dns.TruncateDNSMessage(&message, response, 1024)
|
||||
if truncateErr != nil {
|
||||
cancel(truncateErr)
|
||||
return
|
||||
}
|
||||
err = conn.WritePacket(responseBuffer, destination)
|
||||
if err != nil {
|
||||
cancel(err)
|
||||
writeErr := conn.WritePacket(responseBuffer, destination)
|
||||
if writeErr != nil {
|
||||
cancel(writeErr)
|
||||
}
|
||||
return err
|
||||
}()
|
||||
})
|
||||
}
|
||||
})
|
||||
group.Cleanup(func() {
|
||||
|
||||
Reference in New Issue
Block a user