Infer TTL from Date: and Expire: headers
Unfortunately, Google DNS sets Expire: to the same value as Date: So we may want to use Cache-Control instead.
This commit is contained in:
parent
458da8fa77
commit
ed60976dd2
|
@ -148,7 +148,7 @@ func (pluginsState *PluginsState) ApplyQueryPlugins(pluginsGlobals *PluginsGloba
|
||||||
return packet2, nil
|
return packet2, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pluginsState *PluginsState) ApplyResponsePlugins(pluginsGlobals *PluginsGlobals, packet []byte) ([]byte, error) {
|
func (pluginsState *PluginsState) ApplyResponsePlugins(pluginsGlobals *PluginsGlobals, packet []byte, ttl *uint32) ([]byte, error) {
|
||||||
if len(*pluginsGlobals.responsePlugins) == 0 {
|
if len(*pluginsGlobals.responsePlugins) == 0 {
|
||||||
return packet, nil
|
return packet, nil
|
||||||
}
|
}
|
||||||
|
@ -177,6 +177,9 @@ func (pluginsState *PluginsState) ApplyResponsePlugins(pluginsGlobals *PluginsGl
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pluginsGlobals.RUnlock()
|
pluginsGlobals.RUnlock()
|
||||||
|
if ttl != nil {
|
||||||
|
setMaxTTL(&msg, *ttl)
|
||||||
|
}
|
||||||
packet2, err := msg.PackBuffer(packet)
|
packet2, err := msg.PackBuffer(packet)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return packet, err
|
return packet, err
|
||||||
|
|
|
@ -5,6 +5,7 @@ import (
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"net"
|
"net"
|
||||||
|
"net/http"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
@ -263,6 +264,7 @@ func (proxy *Proxy) processIncomingQuery(serverInfo *ServerInfo, clientProto str
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if len(response) == 0 {
|
if len(response) == 0 {
|
||||||
|
var ttl *uint32
|
||||||
if serverInfo.Proto == StampProtoTypeDNSCrypt {
|
if serverInfo.Proto == StampProtoTypeDNSCrypt {
|
||||||
encryptedQuery, clientNonce, err := proxy.Encrypt(serverInfo, query, serverProto)
|
encryptedQuery, clientNonce, err := proxy.Encrypt(serverInfo, query, serverProto)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -293,6 +295,7 @@ func (proxy *Proxy) processIncomingQuery(serverInfo *ServerInfo, clientProto str
|
||||||
if len(response) >= MinDNSPacketSize {
|
if len(response) >= MinDNSPacketSize {
|
||||||
SetTransactionID(response, tid)
|
SetTransactionID(response, tid)
|
||||||
}
|
}
|
||||||
|
ttl = ttlFromHTTPResponse(proxy, resp)
|
||||||
} else {
|
} else {
|
||||||
dlog.Fatal("Unsupported protocol")
|
dlog.Fatal("Unsupported protocol")
|
||||||
}
|
}
|
||||||
|
@ -300,7 +303,7 @@ func (proxy *Proxy) processIncomingQuery(serverInfo *ServerInfo, clientProto str
|
||||||
serverInfo.noticeFailure(proxy)
|
serverInfo.noticeFailure(proxy)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
response, _ = pluginsState.ApplyResponsePlugins(&proxy.pluginsGlobals, response)
|
response, _ = pluginsState.ApplyResponsePlugins(&proxy.pluginsGlobals, response, ttl)
|
||||||
}
|
}
|
||||||
if len(response) < MinDNSPacketSize || len(response) > MaxDNSPacketSize {
|
if len(response) < MinDNSPacketSize || len(response) > MaxDNSPacketSize {
|
||||||
serverInfo.noticeFailure(proxy)
|
serverInfo.noticeFailure(proxy)
|
||||||
|
@ -329,3 +332,29 @@ func (proxy *Proxy) processIncomingQuery(serverInfo *ServerInfo, clientProto str
|
||||||
}
|
}
|
||||||
serverInfo.noticeSuccess(proxy)
|
serverInfo.noticeSuccess(proxy)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ttlFromHTTPResponse(proxy *Proxy, resp *http.Response) *uint32 {
|
||||||
|
expiresStr, dateStr := resp.Header.Get("Expires"), resp.Header.Get("Date")
|
||||||
|
if len(expiresStr) == 0 || len(dateStr) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
expires, err := http.ParseTime(expiresStr)
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
date, err := http.ParseTime(dateStr)
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if !expires.After(date) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
foundTTL := uint32(expires.Sub(date).Seconds())
|
||||||
|
if foundTTL < proxy.cacheMaxTTL {
|
||||||
|
foundTTL = proxy.cacheMinTTL
|
||||||
|
}
|
||||||
|
if foundTTL > proxy.cacheMaxTTL {
|
||||||
|
foundTTL = proxy.cacheMaxTTL
|
||||||
|
}
|
||||||
|
return &foundTTL
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue