Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
projectdiscovery
GitHub Repository: projectdiscovery/nuclei
Path: blob/dev/pkg/projectfile/project.go
2070 views
1
package projectfile
2
3
import (
4
"net/http"
5
"regexp"
6
7
"github.com/pkg/errors"
8
9
"github.com/projectdiscovery/hmap/store/hybrid"
10
)
11
12
var (
13
ErrNotFound = errors.New("not found")
14
regexUserAgent = regexp.MustCompile(`(?mi)\r\nUser-Agent: .+\r\n`)
15
regexDefaultInteract = regexp.MustCompile(`(?mi)[a-zA-Z1-9%.]+interact.sh`)
16
)
17
18
type Options struct {
19
Path string
20
Cleanup bool
21
}
22
23
type ProjectFile struct {
24
Path string
25
hm *hybrid.HybridMap
26
}
27
28
func New(options *Options) (*ProjectFile, error) {
29
var p ProjectFile
30
hOptions := hybrid.DefaultDiskOptions
31
hOptions.Path = options.Path
32
hOptions.Cleanup = options.Cleanup
33
var err error
34
p.hm, err = hybrid.New(hOptions)
35
if err != nil {
36
return nil, err
37
}
38
39
return &p, nil
40
}
41
42
func (pf *ProjectFile) cleanupData(data []byte) []byte {
43
// ignore all user agents
44
data = regexUserAgent.ReplaceAll(data, []byte("\r\n"))
45
// ignore interact markers
46
return regexDefaultInteract.ReplaceAll(data, []byte(""))
47
}
48
49
func (pf *ProjectFile) Get(req []byte) (*http.Response, error) {
50
reqHash, err := hash(pf.cleanupData(req))
51
if err != nil {
52
return nil, err
53
}
54
55
data, ok := pf.hm.Get(reqHash)
56
if !ok {
57
return nil, ErrNotFound
58
}
59
60
var httpRecord HTTPRecord
61
httpRecord.Response = newInternalResponse()
62
if err := unmarshal(data, &httpRecord); err != nil {
63
return nil, err
64
}
65
66
return fromInternalResponse(httpRecord.Response), nil
67
}
68
69
func (pf *ProjectFile) Set(req []byte, resp *http.Response, data []byte) error {
70
reqHash, err := hash(pf.cleanupData(req))
71
if err != nil {
72
return err
73
}
74
75
var httpRecord HTTPRecord
76
httpRecord.Request = req
77
httpRecord.Response = toInternalResponse(resp, data)
78
data, err = marshal(httpRecord)
79
if err != nil {
80
return err
81
}
82
83
return pf.hm.Set(reqHash, data)
84
}
85
86
func (pf *ProjectFile) Close() {
87
_ = pf.hm.Close()
88
}
89
90