@@ -72,22 +72,21 @@ func (handler localDoHHandler) ServeHTTP(writer http.ResponseWriter, request *ht
7272 writer .WriteHeader (500 )
7373 return
7474 }
75- msg := dns.Msg {Data : packet }
75+ msg := dns.Msg {Data : response }
7676 if err := msg .Unpack (); err != nil {
7777 writer .WriteHeader (400 )
7878 return
7979 }
80- responseLen := len (response )
81- paddedLen := dohPaddedLen (responseLen )
82- padLen := paddedLen - responseLen
8380 if hasEDNS0Padding {
84- response , err = addEDNS0PaddingIfNoneFound (& msg , response , padLen )
81+ response , err = addLocalDoHResponsePadding (& msg )
8582 if err != nil {
8683 dlog .Critical (err )
8784 writer .WriteHeader (500 )
8885 return
8986 }
9087 } else {
88+ responseLen := len (response )
89+ padLen := dohPaddedLen (responseLen ) - responseLen
9190 pad := strings .Repeat ("X" , padLen )
9291 writer .Header ().Set ("X-Pad" , pad )
9392 }
@@ -97,6 +96,37 @@ func (handler localDoHHandler) ServeHTTP(writer http.ResponseWriter, request *ht
9796 writer .Write (response )
9897}
9998
99+ func addLocalDoHResponsePadding (msg * dns.Msg ) ([]byte , error ) {
100+ original := append ([]byte (nil ), msg .Data ... )
101+ if msg .UDPSize == 0 {
102+ msg .UDPSize = uint16 (MaxDNSPacketSize )
103+ }
104+ var paddingRR * dns.PADDING
105+ for _ , rr := range msg .Pseudo {
106+ if padding , ok := rr .(* dns.PADDING ); ok {
107+ paddingRR = padding
108+ paddingRR .Padding = ""
109+ break
110+ }
111+ }
112+ if paddingRR == nil {
113+ paddingRR = & dns.PADDING {}
114+ msg .Pseudo = append (msg .Pseudo , paddingRR )
115+ }
116+ if err := msg .Pack (); err != nil {
117+ return nil , err
118+ }
119+ if len (msg .Data ) > MaxDNSPacketSize {
120+ return original , nil
121+ }
122+ paddingLen := dohPaddedLen (len (msg .Data )) - len (msg .Data )
123+ paddingRR .Padding = strings .Repeat ("58" , paddingLen )
124+ if err := msg .Pack (); err != nil {
125+ return nil , err
126+ }
127+ return msg .Data , nil
128+ }
129+
100130func (proxy * Proxy ) localDoHListener (acceptPc * net.TCPListener ) {
101131 defer acceptPc .Close ()
102132 if len (proxy .localDoHCertFile ) == 0 || len (proxy .localDoHCertKeyFile ) == 0 {
0 commit comments