package placeholder import ( "net/http" "net/url" "github.com/chromedp/cdproto/network" "github.com/chromedp/chromedp" "github.com/wallarm/gotestwaf/internal/scanner/clients/chrome/helpers" "github.com/wallarm/gotestwaf/internal/scanner/types" ) const UAHeader = "User-Agent" var _ Placeholder = (*UserAgent)(nil) var DefaultUserAgent = &UserAgent{name: "UserAgent"} type UserAgent struct { name string } func (p *UserAgent) NewPlaceholderConfig(map[any]any) (PlaceholderConfig, error) { return nil, nil } func (p *UserAgent) GetName() string { return p.name } func (p *UserAgent) CreateRequest(requestURL, payload string, config PlaceholderConfig, httpClientType types.HTTPClientType) (types.Request, error) { reqURL, err := url.Parse(requestURL) if err != nil { return nil, err } switch httpClientType { case types.GoHTTPClient: return p.prepareGoHTTPClientRequest(reqURL.String(), payload, config) case types.ChromeHTTPClient: return p.prepareChromeHTTPClientRequest(reqURL.String(), payload, config) default: return nil, types.NewUnknownHTTPClientError(httpClientType) } } func (p *UserAgent) prepareGoHTTPClientRequest(requestURL, payload string, config PlaceholderConfig) (*types.GoHTTPRequest, error) { req, err := http.NewRequest(http.MethodGet, requestURL, nil) if err != nil { return nil, err } req.Header.Set(UAHeader, payload) return &types.GoHTTPRequest{Req: req}, nil } func (p *UserAgent) prepareChromeHTTPClientRequest(requestURL, payload string, config PlaceholderConfig) (*types.ChromeDPTasks, error) { reqOptions := &helpers.RequestOptions{ Method: http.MethodGet, } task, responseMeta, err := helpers.GetFetchRequest(requestURL, reqOptions) if err != nil { return nil, err } tasks := &types.ChromeDPTasks{ Tasks: chromedp.Tasks{task}, UserAgentHeader: network.Headers{UAHeader: payload, "Test": "test"}, ResponseMeta: responseMeta, } return tasks, nil }