Merge pull request #196 from bettercap/proxy_headers

refactor proxied header handling
This commit is contained in:
yungtravla 2018-03-21 20:10:18 +10:00 committed by GitHub
commit 8f1bcdfe70
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 42 additions and 25 deletions

View file

@ -34,11 +34,11 @@ func NewJSRequest(req *http.Request) *JSRequest {
headers := make([]JSHeader, 0)
cType := ""
for key, values := range req.Header {
for name, values := range req.Header {
for _, value := range values {
headers = append(headers, JSHeader{key, value})
headers = append(headers, JSHeader{name, value})
if key == "Content-Type" {
if name == "Content-Type" {
cType = value
}
}
@ -88,7 +88,7 @@ func (j *JSRequest) WasModified() bool {
return false
}
func (j *JSRequest) Header(name, deflt string) string {
func (j *JSRequest) GetHeader(name, deflt string) string {
name = strings.ToLower(name)
for _, h := range j.Headers {
if name == strings.ToLower(h.Name) {
@ -98,6 +98,17 @@ func (j *JSRequest) Header(name, deflt string) string {
return deflt
}
func (j *JSRequest) SetHeader(name, value string) {
name = strings.ToLower(name)
for i, h := range j.Headers {
if name == strings.ToLower(h.Name) {
j.Headers[i].Value = value
return
}
}
j.Headers = append(j.Headers, JSHeader{name, value})
}
func (j *JSRequest) ReadBody() string {
raw, err := ioutil.ReadAll(j.req.Body)
if err != nil {

View file

@ -8,14 +8,12 @@ import (
"strings"
"github.com/elazarl/goproxy"
"github.com/bettercap/bettercap/core"
)
type JSResponse struct {
Status int
ContentType string
Headers string
Headers []JSHeader
Body string
refHash string
@ -25,17 +23,18 @@ type JSResponse struct {
func NewJSResponse(res *http.Response) *JSResponse {
cType := ""
headers := ""
headers := make([]JSHeader, 0)
code := 200
if res != nil {
code = res.StatusCode
for name, values := range res.Header {
for _, value := range values {
headers = append(headers, JSHeader{name, value})
if name == "Content-Type" {
cType = value
}
headers += name + ": " + value + "\r\n"
}
}
}
@ -53,7 +52,11 @@ func NewJSResponse(res *http.Response) *JSResponse {
}
func (j *JSResponse) NewHash() string {
return fmt.Sprintf("%d.%s.%s", j.Status, j.ContentType, j.Headers)
hash := fmt.Sprintf("%d.%s", j.Status, j.ContentType)
for _, h := range j.Headers {
hash += fmt.Sprintf(".%s-%s", h.Name, h.Value)
}
return hash
}
func (j *JSResponse) UpdateHash() {
@ -73,29 +76,32 @@ func (j *JSResponse) WasModified() bool {
return false
}
func (j *JSResponse) Header(name, deflt string) string {
func (j *JSResponse) GetHeader(name, deflt string) string {
name = strings.ToLower(name)
for _, header := range strings.Split(j.Headers, "\n") {
parts := strings.SplitN(core.Trim(header), ":", 2)
if len(parts) == 2 && strings.ToLower(parts[0]) == name {
return parts[1]
for _, h := range j.Headers {
if name == strings.ToLower(h.Name) {
return h.Value
}
}
return deflt
}
func (j *JSResponse) SetHeader(name, value string) {
name = strings.ToLower(name)
for i, h := range j.Headers {
if name == strings.ToLower(h.Name) {
j.Headers[i].Value = value
return
}
}
j.Headers = append(j.Headers, JSHeader{name, value})
}
func (j *JSResponse) ToResponse(req *http.Request) (resp *http.Response) {
resp = goproxy.NewResponse(req, j.ContentType, j.Status, j.Body)
if j.Headers != "" {
for _, header := range strings.Split(j.Headers, "\n") {
header = core.Trim(header)
if header == "" {
continue
}
parts := strings.SplitN(header, ":", 2)
if len(parts) == 2 {
resp.Header.Add(parts[0], parts[1])
}
if len(j.Headers) > 0 {
for _, h := range j.Headers {
resp.Header.Add(h.Name, h.Value)
}
}
return