mirror of
https://github.com/projectdiscovery/nuclei.git
synced 2025-12-17 20:05:27 +00:00
85 lines
2.0 KiB
Go
85 lines
2.0 KiB
Go
package engine
|
|
|
|
import (
|
|
"net/url"
|
|
"time"
|
|
|
|
"github.com/go-rod/rod"
|
|
"github.com/go-rod/rod/lib/proto"
|
|
)
|
|
|
|
// Page is a single page in an isolated browser instanace
|
|
type Page struct {
|
|
page *rod.Page
|
|
rules []requestRule
|
|
instance *Instance
|
|
router *rod.HijackRouter
|
|
}
|
|
|
|
// Run runs a list of actions by creating a new page in the browser.
|
|
func (i *Instance) Run(baseURL *url.URL, actions []*Action, timeout time.Duration) (map[string]string, *Page, error) {
|
|
page, err := i.engine.Page(proto.TargetCreateTarget{})
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
page = page.Timeout(timeout)
|
|
|
|
if i.browser.customAgent != "" {
|
|
if userAgentErr := page.SetUserAgent(&proto.NetworkSetUserAgentOverride{UserAgent: i.browser.customAgent}); userAgentErr != nil {
|
|
return nil, nil, userAgentErr
|
|
}
|
|
}
|
|
|
|
createdPage := &Page{page: page, instance: i}
|
|
router := page.HijackRequests()
|
|
if routerErr := router.Add("*", "", createdPage.routingRuleHandler); routerErr != nil {
|
|
return nil, nil, routerErr
|
|
}
|
|
createdPage.router = router
|
|
|
|
err = page.SetViewport(&proto.EmulationSetDeviceMetricsOverride{Viewport: &proto.PageViewport{
|
|
Scale: 1,
|
|
Width: float64(1920),
|
|
Height: float64(1080),
|
|
}})
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
_, err = page.SetExtraHeaders([]string{"Accept-Language", "en, en-GB, en-us;"})
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
go router.Run()
|
|
data, err := createdPage.ExecuteActions(baseURL, actions)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
return data, createdPage, nil
|
|
}
|
|
|
|
// Close closes a browser page
|
|
func (p *Page) Close() {
|
|
_ = p.router.Stop()
|
|
p.page.Close()
|
|
}
|
|
|
|
// Page returns the current page for the actions
|
|
func (p *Page) Page() *rod.Page {
|
|
return p.page
|
|
}
|
|
|
|
// Browser returns the browser that created the current page
|
|
func (p *Page) Browser() *rod.Browser {
|
|
return p.instance.engine
|
|
}
|
|
|
|
// URL returns the URL for the current page.
|
|
func (p *Page) URL() string {
|
|
info, err := p.page.Info()
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
return info.URL
|
|
}
|