From a53d561ddd3226b6173e56ab10af78bbece4292e Mon Sep 17 00:00:00 2001 From: buffermet <29265684+buffermet@users.noreply.github.com> Date: Wed, 9 Apr 2025 11:26:56 +0200 Subject: [PATCH 1/2] Add req.GetHeaders and res.GetHeaders, reduce overhead. --- modules/http_proxy/http_proxy_js_request.go | 20 ++++++++++++++++- modules/http_proxy/http_proxy_js_response.go | 23 ++++++++++++++++++-- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/modules/http_proxy/http_proxy_js_request.go b/modules/http_proxy/http_proxy_js_request.go index 1eee69b6..c0ba9f26 100644 --- a/modules/http_proxy/http_proxy_js_request.go +++ b/modules/http_proxy/http_proxy_js_request.go @@ -124,7 +124,6 @@ func (j *JSRequest) GetHeader(name, deflt string) string { if len(header_parts) != 0 && len(header_parts[0]) == 3 { header_name := string(header_parts[0][1]) header_value := string(header_parts[0][2]) - if strings.ToLower(name) == strings.ToLower(header_name) { return header_value } @@ -134,6 +133,25 @@ func (j *JSRequest) GetHeader(name, deflt string) string { return deflt } +func (j *JSRequest) GetHeaders(name string) []string { + name = strings.ToLower(name) + headers := strings.Split(j.Headers, "\r\n") + header_values := make([]string, 0, len(headers)) + for i := 0; i < len(headers); i++ { + if headers[i] != "" { + header_parts := header_regexp.FindAllSubmatch([]byte(headers[i]), 1) + if len(header_parts) != 0 && len(header_parts[0]) == 3 { + header_name := string(header_parts[0][1]) + header_value := string(header_parts[0][2]) + if name == strings.ToLower(header_name) { + header_values = append(header_values, header_value) + } + } + } + } + return header_values +} + func (j *JSRequest) SetHeader(name, value string) { name = strings.TrimSpace(name) value = strings.TrimSpace(value) diff --git a/modules/http_proxy/http_proxy_js_response.go b/modules/http_proxy/http_proxy_js_response.go index b464a979..0e46fa7f 100644 --- a/modules/http_proxy/http_proxy_js_response.go +++ b/modules/http_proxy/http_proxy_js_response.go @@ -98,6 +98,7 @@ func (j *JSResponse) CheckIfModifiedAndUpdateHash() bool { } func (j *JSResponse) GetHeader(name, deflt string) string { + name = strings.ToLower(name) headers := strings.Split(j.Headers, "\r\n") for i := 0; i < len(headers); i++ { if headers[i] != "" { @@ -105,8 +106,7 @@ func (j *JSResponse) GetHeader(name, deflt string) string { if len(header_parts) != 0 && len(header_parts[0]) == 3 { header_name := string(header_parts[0][1]) header_value := string(header_parts[0][2]) - - if strings.ToLower(name) == strings.ToLower(header_name) { + if name == strings.ToLower(header_name) { return header_value } } @@ -115,6 +115,25 @@ func (j *JSResponse) GetHeader(name, deflt string) string { return deflt } +func (j *JSResponse) GetHeaders(name string) []string { + name = strings.ToLower(name) + headers := strings.Split(j.Headers, "\r\n") + header_values := make([]string, 0, len(headers)) + for i := 0; i < len(headers); i++ { + if headers[i] != "" { + header_parts := header_regexp.FindAllSubmatch([]byte(headers[i]), 1) + if len(header_parts) != 0 && len(header_parts[0]) == 3 { + header_name := string(header_parts[0][1]) + header_value := string(header_parts[0][2]) + if name == strings.ToLower(header_name) { + header_values = append(header_values, header_value) + } + } + } + } + return header_values +} + func (j *JSResponse) SetHeader(name, value string) { name = strings.TrimSpace(name) value = strings.TrimSpace(value) From 04ed02f420789235c35df9281757a297b92ed263 Mon Sep 17 00:00:00 2001 From: buffermet <29265684+buffermet@users.noreply.github.com> Date: Wed, 9 Apr 2025 12:39:33 +0200 Subject: [PATCH 2/2] Reduce overhead. --- modules/http_proxy/http_proxy_js_request.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/http_proxy/http_proxy_js_request.go b/modules/http_proxy/http_proxy_js_request.go index c0ba9f26..563c9b33 100644 --- a/modules/http_proxy/http_proxy_js_request.go +++ b/modules/http_proxy/http_proxy_js_request.go @@ -117,6 +117,7 @@ func (j *JSRequest) CheckIfModifiedAndUpdateHash() bool { } func (j *JSRequest) GetHeader(name, deflt string) string { + name = strings.ToLower(name) headers := strings.Split(j.Headers, "\r\n") for i := 0; i < len(headers); i++ { if headers[i] != "" { @@ -124,7 +125,7 @@ func (j *JSRequest) GetHeader(name, deflt string) string { if len(header_parts) != 0 && len(header_parts[0]) == 3 { header_name := string(header_parts[0][1]) header_value := string(header_parts[0][2]) - if strings.ToLower(name) == strings.ToLower(header_name) { + if name == strings.ToLower(header_name) { return header_value } }