Skip to content

Commit d569cfe

Browse files
authored
fix(headless): merge extra headers (#6376)
* headless: fix extra headers overwrite * headless: set Accept-Language when no custom headers
1 parent 89de8a5 commit d569cfe

File tree

2 files changed

+44
-10
lines changed

2 files changed

+44
-10
lines changed

pkg/protocols/headless/engine/engine.go

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,13 @@ import (
2020

2121
// Browser is a browser structure for nuclei headless module
2222
type Browser struct {
23-
customAgent string
24-
tempDir string
25-
previousPIDs map[int32]struct{} // track already running PIDs
26-
engine *rod.Browser
27-
options *types.Options
28-
launcher *launcher.Launcher
23+
customAgent string
24+
defaultHeaders map[string]string
25+
tempDir string
26+
previousPIDs map[int32]struct{} // track already running PIDs
27+
engine *rod.Browser
28+
options *types.Options
29+
launcher *launcher.Launcher
2930

3031
// use getHTTPClient to get the http client
3132
httpClient *http.Client
@@ -95,6 +96,7 @@ func New(options *types.Options) (*Browser, error) {
9596
if browserErr := browser.Connect(); browserErr != nil {
9697
return nil, browserErr
9798
}
99+
defaultHeaders := make(map[string]string)
98100
customAgent := ""
99101
for _, option := range options.CustomHeaders {
100102
parts := strings.SplitN(option, ":", 2)
@@ -103,12 +105,20 @@ func New(options *types.Options) (*Browser, error) {
103105
}
104106
if strings.EqualFold(parts[0], "User-Agent") {
105107
customAgent = parts[1]
108+
} else {
109+
k := strings.TrimSpace(parts[0])
110+
v := strings.TrimSpace(parts[1])
111+
if k == "" || v == "" {
112+
continue
113+
}
114+
defaultHeaders[k] = v
106115
}
107116
}
108117

109118
engine := &Browser{
110119
tempDir: dataStore,
111120
customAgent: customAgent,
121+
defaultHeaders: defaultHeaders,
112122
engine: browser,
113123
options: options,
114124
httpClientOnce: &sync.Once{},
@@ -135,6 +145,30 @@ func (b *Browser) UserAgent() string {
135145
return b.customAgent
136146
}
137147

148+
// applyDefaultHeaders setsheaders passed via cli -H flag
149+
func (b *Browser) applyDefaultHeaders(p *rod.Page) error {
150+
pairs := make([]string, 0, len(b.defaultHeaders)*2+2)
151+
152+
hasAcceptLanguage := false
153+
for k := range b.defaultHeaders {
154+
if strings.EqualFold(k, "Accept-Language") {
155+
hasAcceptLanguage = true
156+
break
157+
}
158+
}
159+
if !hasAcceptLanguage {
160+
pairs = append(pairs, "Accept-Language", "en, en-GB, en-us;")
161+
}
162+
for k, v := range b.defaultHeaders {
163+
pairs = append(pairs, k, v)
164+
}
165+
if len(pairs) == 0 {
166+
return nil
167+
}
168+
_, err := p.SetExtraHeaders(pairs)
169+
return err
170+
}
171+
138172
func (b *Browser) getHTTPClient() (*http.Client, error) {
139173
var err error
140174
b.httpClientOnce.Do(func() {

pkg/protocols/headless/engine/page.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ func (i *Instance) Run(ctx *contextargs.Context, actions []*Action, payloads map
6161
}
6262
page = page.Timeout(options.Timeout)
6363

64+
if err = i.browser.applyDefaultHeaders(page); err != nil {
65+
return nil, nil, err
66+
}
67+
6468
if i.browser.customAgent != "" {
6569
if userAgentErr := page.SetUserAgent(&proto.NetworkSetUserAgentOverride{UserAgent: i.browser.customAgent}); userAgentErr != nil {
6670
return nil, nil, userAgentErr
@@ -130,10 +134,6 @@ func (i *Instance) Run(ctx *contextargs.Context, actions []*Action, payloads map
130134
return nil, nil, err
131135
}
132136

133-
if _, err := page.SetExtraHeaders([]string{"Accept-Language", "en, en-GB, en-us;"}); err != nil {
134-
return nil, nil, err
135-
}
136-
137137
// inject cookies
138138
// each http request is performed via the native go http client
139139
// we first inject the shared cookies

0 commit comments

Comments
 (0)