From ff846bd6e548c4b98845d609288f8c62b8fe3c34 Mon Sep 17 00:00:00 2001 From: yungtravla Date: Fri, 15 Jun 2018 14:08:37 +1000 Subject: [PATCH] Update http_proxy_js_response.go --- modules/http_proxy_js_response.go | 65 +++++++++++++++++++------------ 1 file changed, 40 insertions(+), 25 deletions(-) diff --git a/modules/http_proxy_js_response.go b/modules/http_proxy_js_response.go index 84fd7906..0931c51c 100644 --- a/modules/http_proxy_js_response.go +++ b/modules/http_proxy_js_response.go @@ -13,7 +13,7 @@ import ( type JSResponse struct { Status int ContentType string - Headers []JSHeader + Headers string Body string refHash string @@ -24,16 +24,16 @@ type JSResponse struct { func NewJSResponse(res *http.Response) *JSResponse { cType := "" - headers := make([]JSHeader, 0) + headers := "" code := 200 if res != nil { code = res.StatusCode for name, values := range res.Header { for _, value := range values { - headers = append(headers, JSHeader{name, value}) + headers += name + ": " + value + "\r\n" - if name == "Content-Type" { + if strings.ToLower(name) == "content-type" { cType = value } } @@ -54,11 +54,7 @@ func NewJSResponse(res *http.Response) *JSResponse { } func (j *JSResponse) NewHash() string { - 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 + return fmt.Sprintf("%d.%s.%s", j.Status, j.ContentType, j.Headers) } func (j *JSResponse) UpdateHash() { @@ -81,31 +77,44 @@ func (j *JSResponse) WasModified() bool { } func (j *JSResponse) GetHeader(name, deflt string) string { - name = strings.ToLower(name) - for _, h := range j.Headers { - if name == strings.ToLower(h.Name) { - return h.Value + headers := strings.Split(j.Headers, "\r\n") + for i := 0; i < len(headers); i++ { + header_name := header_regexp.ReplaceAllString(headers[i], "$1") + header_value := header_regexp.ReplaceAllString(headers[i], "$2") + + if strings.ToLower(name) == strings.ToLower(header_name) { + return header_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 + headers := strings.Split(j.Headers, "\r\n") + for i := 0; i < len(headers); i++ { + header_name := header_regexp.ReplaceAllString(headers[i], "$1") + header_value := header_regexp.ReplaceAllString(headers[i], "$2") + + if strings.ToLower(name) == strings.ToLower(header_name) { + old_header := header_name + ": " + header_value + "\r\n" + new_header := header_name + ": " + value + "\r\n" + j.Headers = strings.Replace(j.Headers, old_header, new_header, 1) return } } - j.Headers = append(j.Headers, JSHeader{name, value}) + j.Headers += name + ": " + value + "\r\n" } func (j *JSResponse) RemoveHeader(name string) { - name = strings.ToLower(name) - for i, h := range j.Headers { - if name == strings.ToLower(h.Name) { - j.Headers = append(j.Headers[:i], j.Headers[i+1:]...) + headers := strings.Split(j.Headers, "\r\n") + for i := 0; i < len(headers); i++ { + header_name := header_regexp.ReplaceAllString(headers[i], "$1") + header_value := header_regexp.ReplaceAllString(headers[i], "$2") + + if strings.ToLower(name) == strings.ToLower(header_name) { + removed_header := header_name + ": " + header_value + "\r\n" + j.Headers = strings.Replace(j.Headers, removed_header, "", 1) + return } } } @@ -117,11 +126,17 @@ func (j *JSResponse) ClearBody() { func (j *JSResponse) ToResponse(req *http.Request) (resp *http.Response) { resp = goproxy.NewResponse(req, j.ContentType, j.Status, j.Body) - if len(j.Headers) > 0 { - for _, h := range j.Headers { - resp.Header.Add(h.Name, h.Value) + + headers := strings.Split(j.Headers, "\r\n") + for i := 0; i < len(headers); i++ { + if headers[i] != "" { + header_name := header_regexp.ReplaceAllString(headers[i], "$1") + header_value := header_regexp.ReplaceAllString(headers[i], "$2") + + resp.Header.Add(header_name, header_value) } } + return }