Merge pull request #1176 from bettercap/reduce_overhead

Reduce overhead for proxied HTTP/DNS packets
This commit is contained in:
Simone Margaritelli 2025-03-13 14:07:43 +01:00 committed by GitHub
commit fc02767e72
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 48 additions and 12 deletions

View file

@ -355,3 +355,11 @@ func (j *JSQuery) WasModified() bool {
// check if any of the fields has been changed // check if any of the fields has been changed
return j.NewHash() != j.refHash return j.NewHash() != j.refHash
} }
func (j *JSQuery) CheckIfModifiedAndUpdateHash() bool {
// check if query was changed and update its hash
newHash := j.NewHash()
wasModified := j.refHash != newHash
j.refHash = newHash
return wasModified
}

View file

@ -84,11 +84,9 @@ func (s *DnsProxyScript) OnRequest(req *dns.Msg, clientIP string) (jsreq, jsres
if _, err := s.Call("onRequest", jsreq, jsres); err != nil { if _, err := s.Call("onRequest", jsreq, jsres); err != nil {
log.Error("%s", err) log.Error("%s", err)
return nil, nil return nil, nil
} else if jsreq.WasModified() { } else if jsreq.CheckIfModifiedAndUpdateHash() {
jsreq.UpdateHash()
return jsreq, nil return jsreq, nil
} else if jsres.WasModified() { } else if jsres.CheckIfModifiedAndUpdateHash() {
jsres.UpdateHash()
return nil, jsres return nil, jsres
} }
} }
@ -104,8 +102,7 @@ func (s *DnsProxyScript) OnResponse(req, res *dns.Msg, clientIP string) (jsreq,
if _, err := s.Call("onResponse", jsreq, jsres); err != nil { if _, err := s.Call("onResponse", jsreq, jsres); err != nil {
log.Error("%s", err) log.Error("%s", err)
return nil, nil return nil, nil
} else if jsres.WasModified() { } else if jsres.CheckIfModifiedAndUpdateHash() {
jsres.UpdateHash()
return nil, jsres return nil, jsres
} }
} }

View file

@ -103,6 +103,19 @@ func (j *JSRequest) WasModified() bool {
return j.NewHash() != j.refHash return j.NewHash() != j.refHash
} }
func (j *JSRequest) CheckIfModifiedAndUpdateHash() bool {
newHash := j.NewHash()
// body was read
if j.bodyRead {
j.refHash = newHash
return true
}
// check if req was changed and update its hash
wasModified := j.refHash != newHash
j.refHash = newHash
return wasModified
}
func (j *JSRequest) GetHeader(name, deflt string) string { func (j *JSRequest) GetHeader(name, deflt string) string {
headers := strings.Split(j.Headers, "\r\n") headers := strings.Split(j.Headers, "\r\n")
for i := 0; i < len(headers); i++ { for i := 0; i < len(headers); i++ {

View file

@ -76,6 +76,27 @@ func (j *JSResponse) WasModified() bool {
return j.NewHash() != j.refHash return j.NewHash() != j.refHash
} }
func (j *JSResponse) CheckIfModifiedAndUpdateHash() bool {
newHash := j.NewHash()
if j.bodyRead {
// body was read
j.refHash = newHash
return true
} else if j.bodyClear {
// body was cleared manually
j.refHash = newHash
return true
} else if j.Body != "" {
// body was not read but just set
j.refHash = newHash
return true
}
// check if res was changed and update its hash
wasModified := j.refHash != newHash
j.refHash = newHash
return wasModified
}
func (j *JSResponse) GetHeader(name, deflt string) string { func (j *JSResponse) GetHeader(name, deflt string) string {
headers := strings.Split(j.Headers, "\r\n") headers := strings.Split(j.Headers, "\r\n")
for i := 0; i < len(headers); i++ { for i := 0; i < len(headers); i++ {

View file

@ -84,11 +84,9 @@ func (s *HttpProxyScript) OnRequest(original *http.Request) (jsreq *JSRequest, j
if _, err := s.Call("onRequest", jsreq, jsres); err != nil { if _, err := s.Call("onRequest", jsreq, jsres); err != nil {
log.Error("%s", err) log.Error("%s", err)
return nil, nil return nil, nil
} else if jsreq.WasModified() { } else if jsreq.CheckIfModifiedAndUpdateHash() {
jsreq.UpdateHash()
return jsreq, nil return jsreq, nil
} else if jsres.WasModified() { } else if jsres.CheckIfModifiedAndUpdateHash() {
jsres.UpdateHash()
return nil, jsres return nil, jsres
} }
} }
@ -104,8 +102,7 @@ func (s *HttpProxyScript) OnResponse(res *http.Response) (jsreq *JSRequest, jsre
if _, err := s.Call("onResponse", jsreq, jsres); err != nil { if _, err := s.Call("onResponse", jsreq, jsres); err != nil {
log.Error("%s", err) log.Error("%s", err)
return nil, nil return nil, nil
} else if jsres.WasModified() { } else if jsres.CheckIfModifiedAndUpdateHash() {
jsres.UpdateHash()
return nil, jsres return nil, jsres
} }
} }