Fix content type parsing error, improve regexp search performance, strip header names and values.

This commit is contained in:
buffermet 2020-10-04 16:35:28 +10:00
parent dd08976e8b
commit 0a0cefc5d8
2 changed files with 95 additions and 48 deletions

View file

@ -94,37 +94,57 @@ func (j *JSRequest) WasModified() bool {
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++ {
header_name := header_regexp.ReplaceAllString(headers[i], "$1") if headers[i] != "" {
header_value := header_regexp.ReplaceAllString(headers[i], "$2") 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 strings.ToLower(name) == strings.ToLower(header_name) { if strings.ToLower(name) == strings.ToLower(header_name) {
return header_value return header_value
} }
} }
}
}
return deflt return deflt
} }
func (j *JSRequest) SetHeader(name, value string) { func (j *JSRequest) SetHeader(name, value string) {
name = strings.TrimSpace(name)
value = strings.TrimSpace(value)
if strings.ToLower(name) == "content-type" {
j.ContentType = value;
}
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++ {
header_name := header_regexp.ReplaceAllString(headers[i], "$1") if headers[i] != "" {
header_value := header_regexp.ReplaceAllString(headers[i], "$2") 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 strings.ToLower(name) == strings.ToLower(header_name) { if strings.ToLower(name) == strings.ToLower(header_name) {
old_header := header_name + ": " + header_value + "\r\n" old_header := header_name + ": " + header_value + "\r\n"
new_header := header_name + ": " + value + "\r\n" new_header := name + ": " + value + "\r\n"
j.Headers = strings.Replace(j.Headers, old_header, new_header, 1) j.Headers = strings.Replace(j.Headers, old_header, new_header, 1)
return return
} }
} }
}
}
j.Headers += name + ": " + value + "\r\n" j.Headers += name + ": " + value + "\r\n"
} }
func (j *JSRequest) RemoveHeader(name string) { func (j *JSRequest) RemoveHeader(name 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++ {
header_name := header_regexp.ReplaceAllString(headers[i], "$1") if headers[i] != "" {
header_value := header_regexp.ReplaceAllString(headers[i], "$2") 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 strings.ToLower(name) == strings.ToLower(header_name) { if strings.ToLower(name) == strings.ToLower(header_name) {
removed_header := header_name + ": " + header_value + "\r\n" removed_header := header_name + ": " + header_value + "\r\n"
@ -133,6 +153,8 @@ func (j *JSRequest) RemoveHeader(name string) {
} }
} }
} }
}
}
func (j *JSRequest) ReadBody() string { func (j *JSRequest) ReadBody() string {
raw, err := ioutil.ReadAll(j.req.Body) raw, err := ioutil.ReadAll(j.req.Body)
@ -179,26 +201,26 @@ func (j *JSRequest) ToRequest() (req *http.Request) {
req, _ = http.NewRequest(j.Method, url, strings.NewReader(j.Body)) req, _ = http.NewRequest(j.Method, url, strings.NewReader(j.Body))
} }
hadType := false
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++ {
if headers[i] != "" { if headers[i] != "" {
header_name := header_regexp.ReplaceAllString(headers[i], "$1") header_parts := header_regexp.FindAllSubmatch([]byte(headers[i]), 1)
header_value := header_regexp.ReplaceAllString(headers[i], "$2") if len(header_parts) != 0 && len(header_parts[0]) == 3 {
header_name := string(header_parts[0][1])
header_value := string(header_parts[0][2])
req.Header.Set(header_name, header_value)
if strings.ToLower(header_name) == "content-type" { if strings.ToLower(header_name) == "content-type" {
hadType = true if header_value != j.ContentType {
req.Header.Set(header_name, j.ContentType)
continue
}
}
req.Header.Set(header_name, header_value)
} }
} }
} }
req.RemoteAddr = j.Client["IP"] req.RemoteAddr = j.Client["IP"]
if !hadType && j.ContentType != "" {
req.Header.Set("Content-Type", j.ContentType)
}
return return
} }

View file

@ -79,37 +79,57 @@ func (j *JSResponse) WasModified() bool {
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++ {
header_name := header_regexp.ReplaceAllString(headers[i], "$1") if headers[i] != "" {
header_value := header_regexp.ReplaceAllString(headers[i], "$2") 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 strings.ToLower(name) == strings.ToLower(header_name) { if strings.ToLower(name) == strings.ToLower(header_name) {
return header_value return header_value
} }
} }
}
}
return deflt return deflt
} }
func (j *JSResponse) SetHeader(name, value string) { func (j *JSResponse) SetHeader(name, value string) {
name = strings.TrimSpace(name)
value = strings.TrimSpace(value)
if strings.ToLower(name) == "content-type" {
j.ContentType = value
}
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++ {
header_name := header_regexp.ReplaceAllString(headers[i], "$1") if headers[i] != "" {
header_value := header_regexp.ReplaceAllString(headers[i], "$2") 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 strings.ToLower(name) == strings.ToLower(header_name) { if strings.ToLower(name) == strings.ToLower(header_name) {
old_header := header_name + ": " + header_value + "\r\n" old_header := header_name + ": " + header_value + "\r\n"
new_header := header_name + ": " + value + "\r\n" new_header := name + ": " + value + "\r\n"
j.Headers = strings.Replace(j.Headers, old_header, new_header, 1) j.Headers = strings.Replace(j.Headers, old_header, new_header, 1)
return return
} }
} }
}
}
j.Headers += name + ": " + value + "\r\n" j.Headers += name + ": " + value + "\r\n"
} }
func (j *JSResponse) RemoveHeader(name string) { func (j *JSResponse) RemoveHeader(name 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++ {
header_name := header_regexp.ReplaceAllString(headers[i], "$1") if headers[i] != "" {
header_value := header_regexp.ReplaceAllString(headers[i], "$2") 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 strings.ToLower(name) == strings.ToLower(header_name) { if strings.ToLower(name) == strings.ToLower(header_name) {
removed_header := header_name + ": " + header_value + "\r\n" removed_header := header_name + ": " + header_value + "\r\n"
@ -118,6 +138,8 @@ func (j *JSResponse) RemoveHeader(name string) {
} }
} }
} }
}
}
func (j *JSResponse) ClearBody() { func (j *JSResponse) ClearBody() {
j.Body = "" j.Body = ""
@ -130,12 +152,15 @@ func (j *JSResponse) ToResponse(req *http.Request) (resp *http.Response) {
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++ {
if headers[i] != "" { if headers[i] != "" {
header_name := header_regexp.ReplaceAllString(headers[i], "$1") header_parts := header_regexp.FindAllSubmatch([]byte(headers[i]), 1)
header_value := header_regexp.ReplaceAllString(headers[i], "$2") if len(header_parts) != 0 && len(header_parts[0]) == 3 {
header_name := string(header_parts[0][1])
header_value := string(header_parts[0][2])
resp.Header.Add(header_name, header_value) resp.Header.Add(header_name, header_value)
} }
} }
}
return return
} }