mirror of
https://github.com/v2fly/v2ray-core.git
synced 2026-05-13 16:09:08 -04:00
dns outbound proxy
This commit is contained in:
9
common/protocol/dns/errors.generated.go
Normal file
9
common/protocol/dns/errors.generated.go
Normal file
@@ -0,0 +1,9 @@
|
||||
package dns
|
||||
|
||||
import "v2ray.com/core/common/errors"
|
||||
|
||||
type errPathObjHolder struct{}
|
||||
|
||||
func newError(values ...interface{}) *errors.Error {
|
||||
return errors.New(values...).WithPathObj(errPathObjHolder{})
|
||||
}
|
||||
@@ -1,11 +1,13 @@
|
||||
package dns
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"sync"
|
||||
|
||||
"golang.org/x/net/dns/dnsmessage"
|
||||
"v2ray.com/core/common"
|
||||
"v2ray.com/core/common/buf"
|
||||
"v2ray.com/core/common/serial"
|
||||
)
|
||||
|
||||
func PackMessage(msg *dnsmessage.Message) (*buf.Buffer, error) {
|
||||
@@ -75,3 +77,67 @@ func (r *UDPReader) Close() error {
|
||||
|
||||
return common.Close(r.Reader)
|
||||
}
|
||||
|
||||
type TCPReader struct {
|
||||
reader *buf.BufferedReader
|
||||
}
|
||||
|
||||
func NewTCPReader(reader buf.Reader) *TCPReader {
|
||||
return &TCPReader{
|
||||
reader: &buf.BufferedReader{
|
||||
Reader: reader,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (r *TCPReader) ReadMessage() (*buf.Buffer, error) {
|
||||
size, err := serial.ReadUint16(r.reader)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if size > buf.Size {
|
||||
return nil, newError("message size too large: ", size)
|
||||
}
|
||||
b := buf.New()
|
||||
if _, err := b.ReadFullFrom(r.reader, int32(size)); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return b, nil
|
||||
}
|
||||
|
||||
func (r *TCPReader) Interrupt() {
|
||||
common.Interrupt(r.reader)
|
||||
}
|
||||
|
||||
func (r *TCPReader) Close() error {
|
||||
return common.Close(r.reader)
|
||||
}
|
||||
|
||||
type MessageWriter interface {
|
||||
WriteMessage(msg *buf.Buffer) error
|
||||
}
|
||||
|
||||
type UDPWriter struct {
|
||||
buf.Writer
|
||||
}
|
||||
|
||||
func (w *UDPWriter) WriteMessage(b *buf.Buffer) error {
|
||||
return w.WriteMultiBuffer(buf.MultiBuffer{b})
|
||||
}
|
||||
|
||||
type TCPWriter struct {
|
||||
buf.Writer
|
||||
}
|
||||
|
||||
func (w *TCPWriter) WriteMessage(b *buf.Buffer) error {
|
||||
if b.IsEmpty() {
|
||||
return nil
|
||||
}
|
||||
|
||||
mb := make(buf.MultiBuffer, 0, 2)
|
||||
|
||||
size := buf.New()
|
||||
binary.BigEndian.PutUint16(size.Extend(2), uint16(b.Len()))
|
||||
mb = append(mb, size, b)
|
||||
return w.WriteMultiBuffer(mb)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user