mirror of
https://github.com/projectdiscovery/nuclei.git
synced 2025-12-17 18:55:26 +00:00
45 lines
1.2 KiB
Go
45 lines
1.2 KiB
Go
package offlinehttp
|
|
|
|
import (
|
|
"bufio"
|
|
"errors"
|
|
"net/http"
|
|
"regexp"
|
|
"strings"
|
|
)
|
|
|
|
var noMinor = regexp.MustCompile(`HTTP/([0-9]) `)
|
|
|
|
// readResponseFromString reads a raw http response from a string.
|
|
func readResponseFromString(data string) (*http.Response, error) {
|
|
var final string
|
|
|
|
if strings.HasPrefix(data, "HTTP/") {
|
|
final = addMinorVersionToHTTP(data)
|
|
} else {
|
|
lastIndex := strings.LastIndex(data, "HTTP/")
|
|
if lastIndex == -1 {
|
|
return nil, errors.New("malformed raw http response")
|
|
}
|
|
final = data[lastIndex:] // choose last http/ in case of it being later.
|
|
|
|
final = addMinorVersionToHTTP(final)
|
|
}
|
|
return http.ReadResponse(bufio.NewReader(strings.NewReader(final)), nil)
|
|
}
|
|
|
|
// addMinorVersionToHTTP tries to add a minor version to http status header
|
|
// fixing the compatibility issue with go standard library.
|
|
func addMinorVersionToHTTP(data string) string {
|
|
matches := noMinor.FindAllStringSubmatch(data, 1)
|
|
if len(matches) == 0 {
|
|
return data
|
|
}
|
|
if len(matches[0]) < 2 {
|
|
return data
|
|
}
|
|
replacedVersion := strings.Replace(matches[0][0], matches[0][1], matches[0][1]+".0", 1)
|
|
data = strings.Replace(data, matches[0][0], replacedVersion, 1)
|
|
return data
|
|
}
|