Best Rod code snippet using rod.SetHeader
hijack.go
Source:hijack.go
...191 defer func() { _ = res.Body.Close() }()192 h.Response.payload.ResponseCode = res.StatusCode193 for k, vs := range res.Header {194 for _, v := range vs {195 h.Response.SetHeader(k, v)196 }197 }198 if loadBody {199 b, err := ioutil.ReadAll(res.Body)200 if err != nil {201 return err202 }203 h.Response.payload.Body = b204 }205 return nil206}207// HijackRequest context208type HijackRequest struct {209 event *proto.FetchRequestPaused210 req *http.Request211}212// Type of the resource213// èµæºçç±»å214func (ctx *HijackRequest) Type() proto.NetworkResourceType {215 return ctx.event.ResourceType216}217// Method of the request218// 请æ±çæ¹æ³219func (ctx *HijackRequest) Method() string {220 return ctx.event.Request.Method221}222// URL of the request223// 请æ±çURL224func (ctx *HijackRequest) URL() *url.URL {225 u, _ := url.Parse(ctx.event.Request.URL)226 return u227}228// Header via a key229// éè¿keyè·å¾ç¸åºç请æ±å¤´çå¼230func (ctx *HijackRequest) Header(key string) string {231 return ctx.event.Request.Headers[key].String()232}233// Headers of request234// 请æ±ç请æ±å¤´235func (ctx *HijackRequest) Headers() proto.NetworkHeaders {236 return ctx.event.Request.Headers237}238// Body of the request, devtools API doesn't support binary data yet, only string can be captured.239// 请æ±ä½ï¼devtools APIè¿ä¸æ¯æäºè¿å¶æ°æ®ï¼åªè½æè·å符串ã240func (ctx *HijackRequest) Body() string {241 return ctx.event.Request.PostData242}243// JSONBody of the request244// 请æ±çJSONBody245func (ctx *HijackRequest) JSONBody() gson.JSON {246 return gson.NewFrom(ctx.Body())247}248// Req returns the underlaying http.Request instance that will be used to send the request.249// Reqè¿åå°ç¨äºåé请æ±çhttp.Requestå®ä¾çåºå±ã250func (ctx *HijackRequest) Req() *http.Request {251 return ctx.req252}253// SetContext of the underlaying http.Request instance254// 设置åºå±http.Requestå®ä¾çä¸ä¸æã255func (ctx *HijackRequest) SetContext(c context.Context) *HijackRequest {256 ctx.req = ctx.req.WithContext(c)257 return ctx258}259// SetBody of the request, if obj is []byte or string, raw body will be used, else it will be encoded as json.260// 设置请æ±çæ£æï¼å¦æobjæ¯[]åèæå符串ï¼å°ä½¿ç¨åå§æ£æï¼å¦åå°è¢«ç¼ç 为jsonã261func (ctx *HijackRequest) SetBody(obj interface{}) *HijackRequest {262 var b []byte263 switch body := obj.(type) {264 case []byte:265 b = body266 case string:267 b = []byte(body)268 default:269 b = utils.MustToJSONBytes(body)270 }271 ctx.req.Body = ioutil.NopCloser(bytes.NewBuffer(b))272 return ctx273}274// IsNavigation determines whether the request is a navigation request275// IsNavigation ç¡®å®è¯·æ±æ¯å¦æ¯ä¸ä¸ªå¯¼èªè¯·æ±276func (ctx *HijackRequest) IsNavigation() bool {277 return ctx.Type() == proto.NetworkResourceTypeDocument278}279// HijackResponse context280type HijackResponse struct {281 payload *proto.FetchFulfillRequest282 fail *proto.FetchFailRequest283}284// Payload to respond the request from the browser.285// æ¥èªæµè§å¨è¯·æ±ååºç payload286func (ctx *HijackResponse) Payload() *proto.FetchFulfillRequest {287 return ctx.payload288}289// Body of the payload290// playload ç主ä½291func (ctx *HijackResponse) Body() string {292 return string(ctx.payload.Body)293}294// Headers returns the clone of response headers.295// è¿åååºå¤´çå
é296// If you want to modify the response headers use HijackResponse.SetHeader .297// å¦ææ³ä¿®æ¹ååºå¤´è¯·ä½¿ç¨ï¼HijackResponse.SetHeader298func (ctx *HijackResponse) Headers() http.Header {299 header := http.Header{}300 for _, h := range ctx.payload.ResponseHeaders {301 header.Add(h.Name, h.Value)302 }303 return header304}305// SetHeader of the payload via key-value pairs306// éè¿é®å¼å¯¹å¿ä¸º playload 设置ååºå¤´307func (ctx *HijackResponse) SetHeader(pairs ...string) *HijackResponse {308 for i := 0; i < len(pairs); i += 2 {309 ctx.payload.ResponseHeaders = append(ctx.payload.ResponseHeaders, &proto.FetchHeaderEntry{310 Name: pairs[i],311 Value: pairs[i+1],312 })313 }314 return ctx315}316// SetBody of the payload, if obj is []byte or string, raw body will be used, else it will be encoded as json.317// 设置ææè½½è·ç主ä½ï¼å¦æobjæ¯[]åèæå符串ï¼å°ä½¿ç¨åå§ä¸»ä½ï¼å¦åå°è¢«ç¼ç 为jsonã318func (ctx *HijackResponse) SetBody(obj interface{}) *HijackResponse {319 switch body := obj.(type) {320 case []byte:321 ctx.payload.Body = body...
web.go
Source:web.go
1package provider2import (3 "bytes"4 "context"5 "errors"6 "fmt"7 "io"8 "net/http"9 "net/url"10 "regexp"11 "sync"12 "github.com/PuerkitoBio/goquery"13 "github.com/go-rod/rod"14 "github.com/go-rod/rod/lib/launcher"15 "github.com/go-rod/rod/lib/proto"16)17// Rod is very sensitive and for now, the best approach is to have a mutex at the package level protecting all the18// operations.19var webBrowserMutex sync.Mutex // nolint: gochecknoglobals20type webClient interface {21 Do(req *http.Request) (*http.Response, error)22}23type webClientTransport struct {24 client webClient25}26func (w webClientTransport) RoundTrip(req *http.Request) (*http.Response, error) {27 return w.client.Do(req)28}29type webConfigRegex struct {30 expression regexp.Regexp31 key string32}33// WebConfig has the information to enhance the request.34type WebConfig struct {35 Header http.Header36}37// Web handle the verification of HTTP endpoints.38type Web struct {39 Config WebConfig40 ConfigOverwrite map[string]WebConfig41 browser *rod.Browser42 client webClient43 regex regexp.Regexp44 regexConfigOverwrite []webConfigRegex45}46// Init internal state.47func (w *Web) Init() error {48 if err := w.initRegex(); err != nil {49 return fmt.Errorf("fail to initialize the regex: %w", err)50 }51 if err := w.initRegexConfig(); err != nil {52 return fmt.Errorf("fail to initialize the regex config: %w", err)53 }54 w.initHTTP()55 if err := w.initBrowser(); err != nil {56 return fmt.Errorf("failed to initialize the browser: %w", err)57 }58 return nil59}60// Close the provider.61func (w *Web) Close() error {62 if err := w.browser.Close(); err != nil {63 return fmt.Errorf("failed to close the browser: %w", err)64 }65 return nil66}67// Authority checks if the web provider is responsible to process the entry.68func (w Web) Authority(uri string) bool {69 return w.regex.Match([]byte(uri))70}71// Valid check if the link is valid.72func (w Web) Valid(ctx context.Context, _, uri string) (bool, error) {73 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)74 if err != nil {75 return false, fmt.Errorf("fail to create the HTTP request: %w", err)76 }77 w.configRequest(req)78 resp, err := w.client.Do(req)79 if err != nil {80 return false, nil81 }82 defer resp.Body.Close()83 endpoint, err := url.Parse(uri)84 if err != nil {85 return false, fmt.Errorf("fail to parse uri: %w", err)86 }87 isValid := ((resp.StatusCode >= 200) && (resp.StatusCode < 300))88 if !isValid {89 return false, nil90 }91 validAnchor, err := w.validAnchor(resp.Body, endpoint.Fragment)92 if err != nil {93 return false, fmt.Errorf("fail to verify the anchor: %w", err)94 }95 if validAnchor {96 return true, nil97 }98 validAnchor, err = w.validAnchorBrowser(ctx, uri, endpoint.Fragment)99 if err != nil {100 return false, fmt.Errorf("fail to verify the anchor with a browser: %w", err)101 }102 return validAnchor, nil103}104func (w Web) validAnchor(body io.Reader, anchor string) (bool, error) {105 if anchor == "" {106 return true, nil107 }108 anchor = fmt.Sprintf("#%s", anchor)109 doc, err := goquery.NewDocumentFromReader(body)110 if err != nil {111 return false, fmt.Errorf("failt o parse the response: %w", err)112 }113 var found bool114 doc.Find("a").Each(func(_ int, selection *goquery.Selection) {115 if found {116 return117 }118 href, ok := selection.Attr("href")119 if !ok {120 return121 }122 found = (href == anchor)123 })124 return found, nil125}126func (w *Web) initRegex() error {127 expr := `^(http|https):\/\/`128 regex, err := regexp.Compile(expr)129 if err != nil {130 return fmt.Errorf("fail to compile the expression '%s': %w", expr, err)131 }132 w.regex = *regex133 return nil134}135func (w *Web) initRegexConfig() error {136 w.regexConfigOverwrite = make([]webConfigRegex, 0, len(w.regexConfigOverwrite))137 for key := range w.ConfigOverwrite {138 regex, err := regexp.Compile(key)139 if err != nil {140 return fmt.Errorf("fail to compile the expression '%s': %w", key, err)141 }142 w.regexConfigOverwrite = append(w.regexConfigOverwrite, webConfigRegex{key: key, expression: *regex})143 }144 return nil145}146func (w *Web) initHTTP() {147 w.client = &http.Client{148 Transport: webClientTransport{client: http.DefaultClient},149 CheckRedirect: func(req *http.Request, via []*http.Request) error {150 switch req.Response.StatusCode {151 case http.StatusPermanentRedirect, http.StatusMovedPermanently:152 return nil153 default:154 return errors.New("redirect not allowed")155 }156 },157 }158}159func (w *Web) initBrowser() error {160 webBrowserMutex.Lock()161 defer webBrowserMutex.Unlock()162 launcherURL, err := launcher.New().Headless(true).Launch()163 if err != nil {164 return fmt.Errorf("failed to launch the browser: %w", err)165 }166 w.browser = rod.New().ControlURL(launcherURL)167 if err = w.browser.Connect(); err != nil {168 return fmt.Errorf("failed to connect to the browser: %w", err)169 }170 return nil171}172func (w Web) validAnchorBrowser(ctx context.Context, endpoint string, anchor string) (_ bool, err error) {173 webBrowserMutex.Lock()174 defer webBrowserMutex.Unlock()175 pctx, pctxCancel := context.WithCancel(ctx)176 defer pctxCancel()177 page, err := w.browser.Page(proto.TargetCreateTarget{})178 if err != nil {179 return false, fmt.Errorf("failed to create the browser page: %w", err)180 }181 defer func() {182 if perr := page.Close(); perr != nil {183 err = fmt.Errorf("failed to close the browser tab: %w", perr)184 }185 }()186 if _, err = page.Context(pctx).SetExtraHeaders(w.genHeaders(endpoint)); err != nil {187 return false, fmt.Errorf("failed to set the headers at the browser page: %w", err)188 }189 if err := page.Navigate(endpoint); err != nil {190 return false, fmt.Errorf("failed to navigate to the page: %w", err)191 }192 if err := page.WaitLoad(); err != nil {193 return false, fmt.Errorf("failed to wait for the page to load: %w", err)194 }195 result, err := page.Eval("", "document.documentElement.innerHTML", nil)196 if err != nil {197 return false, fmt.Errorf("failed to execute the javascript at the page: %w", err)198 }199 return w.validAnchor(bytes.NewBufferString(result.Value.String()), anchor)200}201func (w Web) configRequest(r *http.Request) {202 setHeader := func(header http.Header) {203 for key, values := range header {204 for _, value := range values {205 r.Header.Set(key, value)206 }207 }208 }209 setHeader(w.Config.Header)210 endpoint := r.URL.String()211 for _, cfg := range w.regexConfigOverwrite {212 if cfg.expression.Match([]byte(endpoint)) {213 setHeader(w.ConfigOverwrite[cfg.key].Header)214 return215 }216 }217}218func (w Web) genHeaders(endpoint string) []string {219 header := make(http.Header)220 setHeader := func(source http.Header) {221 for key, values := range source {222 for _, value := range values {223 header.Set(key, value)224 }225 }226 }227 setHeader(w.Config.Header)228 for _, cfg := range w.regexConfigOverwrite {229 if cfg.expression.MatchString(endpoint) {230 setHeader(w.ConfigOverwrite[cfg.key].Header)231 break232 }233 }234 results := make([]string, 0, len(header)*2)235 for key := range header {236 results = append(results, key, header.Get(key))237 }238 return results239}...
testing.go
Source:testing.go
...90func injectData(ctx *rod.Hijack) {91 log.Println("Start: Intercept and modifying POST with data")92 //ctx.MustLoadResponse()93 body := "Injected response"94 ctx.Response.SetBody(body).SetHeader(95 "Access-Control-Allow-Origin", siteURL,96 "Access-Control-Expose-Headers", "Link",97 "Cache-Control", "public, max-age=60",98 "Content-Length", strconv.Itoa(len(body)),99 "Content-Type", "application/text",100 //"Date", "Mon, 16 May 2022 20:53:07 GMT",101 "Vary", "Origin",102 )103 log.Println("End: Intercept and modifying POST with data")104 //ctx.Response.Fail(proto.NetworkErrorReasonAddressUnreachable)105}106func injectEmpty(ctx *rod.Hijack) {107 log.Println("Start: Intercept and modifying POST with empty BODY")108 //ctx.MustLoadResponse()109 ctx.Response.SetBody([]byte{}).SetHeader(110 "Access-Control-Allow-Origin", siteURL,111 "Access-Control-Expose-Headers", "Link",112 "Cache-Control", "public, max-age=60",113 "Content-Length", "0",114 "Content-Type", "application/text",115 //"Date", "Mon, 16 May 2022 20:53:07 GMT",116 "Vary", "Origin",117 )118 log.Println("End: Intercept and modifying POST with empty BODY")119 //ctx.Response.Fail(proto.NetworkErrorReasonAddressUnreachable)120}...
SetHeader
Using AI Code Generation
1import "fmt"2type rod struct {3}4func (r *rod) SetHeader(length, diameter int) {5}6func main() {7r := &rod{}8r.SetHeader(10, 20)9fmt.Println(r.length, r.diameter)10}11import "fmt"12type rod struct {13}14func (r *rod) SetHeader(length, diameter int) {15}16func main() {17r := &rod{}18r.SetHeader(10, 20)19fmt.Println(r.length, r.diameter)20}
SetHeader
Using AI Code Generation
1import (2func main() {3 browser := rod.New().ControlURL(launcher.New().MustLaunch()).MustConnect()4 page := browser.MustPage("")5 page.MustSetHeader("User-Agent", "Rod")6 page.MustReload()7 page.MustWaitLoad()8 title := page.MustTitle()9 println(title)10}11import (12func main() {13 browser := rod.New().ControlURL(launcher.New().MustLaunch()).MustConnect()14 page := browser.MustPage("")15 page.MustSetExtraHeaders(map[string]string{16 })17 page.MustReload()18 page.MustWaitLoad()19 title := page.MustTitle()20 println(title)21}22import (23func main() {24 browser := rod.New().ControlURL(launcher.New().MustLaunch()).MustConnect()25 page := browser.MustPage("")26 page.MustSetExtraHeaders(map[string]string{27 })28 page.MustReload()29 page.MustWaitLoad()
SetHeader
Using AI Code Generation
1import (2func main() {3 Devtools(false)4 defer l.Cleanup()5 browser := rod.New().ControlURL(l).MustConnect()6 page.MustSetHeader("User-Agent", "Rod")7 fmt.Println(page.MustGetHeader("User-Agent"))8}9import (10func main() {11 Devtools(false)12 defer l.Cleanup()13 browser := rod.New().ControlURL(l).MustConnect()14 page.MustSetExtraHeaders(map[string]interface{}{"User-Agent": "Rod"})15 fmt.Println(page.MustGetHeader("User-Agent"))16}
SetHeader
Using AI Code Generation
1import (2func main() {3 page.SetHeader("X-My-Header", "My-Value")4 fmt.Println(page.MustElement("pre").MustText())5}6{7 "headers": {8 }9}10page.SetHeaders(map[string]string)11import (12func main() {13 page.SetHeaders(map[string]string{14 })15 fmt.Println(page.MustElement("pre").MustText())16}17{18 "headers": {19 }20}
SetHeader
Using AI Code Generation
1import (2func main() {3 rod := &z01.Rod{}4 rod.SetHeader("Rodrigo")5 fmt.Println(rod.Header)6}7import (8func main() {9 rod := &z01.Rod{}10 rod.SetHeader("Rodrigo")11 fmt.Println(rod.Header)12 rod.SetHeader("Rodrigo Diez")13 fmt.Println(rod.Header)14}15import (16func main() {17 rod := &z01.Rod{}18 rod.SetHeader("Rodrigo")19 fmt.Println(rod.Header)20 rod.SetHeader("Rodrigo Diez")21 fmt.Println(rod.Header)22 rod.SetHeader("Rodrigo Diez Gutierrez")23 fmt.Println(rod.Header)24}25import (26func main() {27 rod := &z01.Rod{}28 rod.SetHeader("Rodrigo")29 fmt.Println(rod.Header)30 rod.SetHeader("Rodrigo Diez")31 fmt.Println(rod.Header)32 rod.SetHeader("Rodrigo Diez Gutierrez")33 fmt.Println(rod.Header)34 rod.SetHeader("Rodrigo Diez Gutierrez 01")35 fmt.Println(rod.Header)36}37import (38func main() {39 rod := &z01.Rod{}40 rod.SetHeader("Rodrigo")41 fmt.Println(rod.Header)42 rod.SetHeader("Rodrigo Diez")43 fmt.Println(rod.Header)44 rod.SetHeader("Rodrigo Diez Gutierrez")45 fmt.Println(rod.Header)46 rod.SetHeader("Rodrigo
SetHeader
Using AI Code Generation
1import "fmt"2func main() {3 rod.SetHeader()4 fmt.Println("rod length:", rod.length)5 fmt.Println("rod diameter:", rod.diameter)6 fmt.Println("rod weight:", rod.weight)7}
SetHeader
Using AI Code Generation
1import (2func main() {3 browser := rod.New().ControlURL(launcher.New().MustLaunch()).MustConnect()4 page.MustSetHeader("X-My-Header", "1")5 fmt.Println(page.MustGetHeader("X-My-Header"))6}
SetHeader
Using AI Code Generation
1import (2func main() {3 browser := rod.New().Connect()4 page.SetHeader("User-Agent", "Rod")5 fmt.Println(page)6}
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!