github.com/useflyent/fhttp@v0.0.0-20211004035111-333f430cfbbf/http2/header_order_test.go (about) 1 package http2 2 3 import ( 4 "bytes" 5 http "github.com/useflyent/fhttp" 6 "github.com/useflyent/fhttp/httptrace" 7 "log" 8 "strings" 9 "testing" 10 ) 11 12 func TestHeaderOrder(t *testing.T) { 13 req, err := http.NewRequest("POST", "https://www.httpbin.org/headers", nil) 14 if err != nil { 15 t.Fatalf(err.Error()) 16 } 17 req.Header = http.Header{ 18 "sec-ch-ua": {"\" Not;A Brand\";v=\"99\", \"Google Chrome\";v=\"91\", \"Chromium\";v=\"91\""}, 19 "accept": {"*/*"}, 20 "x-requested-with": {"XMLHttpRequest"}, 21 "sec-ch-ua-mobile": {"?0"}, 22 "user-agent": {"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36\", \"I shouldn't be here"}, 23 "content-type": {"application/json"}, 24 "origin": {"https://www.size.co.uk/"}, 25 "sec-fetch-site": {"same-origin"}, 26 "sec-fetch-mode": {"cors"}, 27 "sec-fetch-dest": {"empty"}, 28 "accept-language": {"en-US,en;q=0.9"}, 29 "accept-encoding": {"gzip, deflate, br"}, 30 "referer": {"https://www.size.co.uk/product/white-jordan-air-1-retro-high/16077886/"}, 31 http.HeaderOrderKey: { 32 "sec-ch-ua", 33 "accept", 34 "x-requested-with", 35 "sec-ch-ua-mobile", 36 "user-agent", 37 "content-type", 38 "sec-fetch-site", 39 "sec-fetch-mode", 40 "sec-fetch-dest", 41 "referer", 42 "accept-encoding", 43 "accept-language", 44 }, 45 http.PHeaderOrderKey: { 46 ":method", 47 ":authority", 48 ":scheme", 49 ":path", 50 }, 51 } 52 var b []byte 53 buf := bytes.NewBuffer(b) 54 err = req.Header.Write(buf) 55 if err != nil { 56 t.Fatalf(err.Error()) 57 } 58 arr := strings.Split(buf.String(), "\n") 59 var hdrs []string 60 for _, v := range arr { 61 a := strings.Split(v, ":") 62 if a[0] == "" { 63 continue 64 } 65 hdrs = append(hdrs, a[0]) 66 } 67 68 for i := range req.Header[http.HeaderOrderKey] { 69 if hdrs[i] != req.Header[http.HeaderOrderKey][i] { 70 t.Errorf("want: %s\ngot: %s\n", req.Header[http.HeaderOrderKey][i], hdrs[i]) 71 } 72 } 73 } 74 75 func TestHeaderOrder2(t *testing.T) { 76 hk := "" 77 trace := &httptrace.ClientTrace{ 78 WroteHeaderField: func(key string, values []string) { 79 hk += key + " " 80 }, 81 } 82 req, err := http.NewRequest("GET", "https://httpbin.org/#/Request_inspection/get_headers", nil) 83 if err != nil { 84 t.Fatalf(err.Error()) 85 } 86 req.Header.Add("experience", "pain") 87 req.Header.Add("grind", "harder") 88 req.Header.Add("live", "mas") 89 req.Header[http.HeaderOrderKey] = []string{"grind", "experience", "live"} 90 req.Header[http.PHeaderOrderKey] = []string{":method", ":authority", ":scheme", ":path"} 91 req = req.WithContext(httptrace.WithClientTrace(req.Context(), trace)) 92 tr := &Transport{} 93 resp, err := tr.RoundTrip(req) 94 if err != nil { 95 t.Fatal(err.Error()) 96 } 97 defer resp.Body.Close() 98 99 eq := strings.EqualFold(hk, ":method :authority :scheme :path grind experience live accept-encoding user-agent ") 100 if !eq { 101 t.Fatalf("Header order not set properly, \n Got %v \n Want: %v", hk, ":method :authority :scheme :path grind experience live accept-encoding user-agent") 102 } 103 } 104 105 func TestHeaderOrder3(t *testing.T) { 106 req, err := http.NewRequest("GET", "https://google.com", nil) 107 if err != nil { 108 t.Fatalf(err.Error()) 109 } 110 req.Header = http.Header{ 111 http.HeaderOrderKey: { 112 "sec-ch-ua", 113 "accept", 114 "x-requested-with", 115 "sec-ch-ua-mobile", 116 "user-agent", 117 "sec-fetch-site", 118 "sec-fetch-mode", 119 "sec-fetch-dest", 120 "referer", 121 "accept-encoding", 122 "accept-language", 123 "cookie", 124 }, 125 } 126 req.Header.Add("accept", "text / html, application/xhtml + xml, application / xml;q = 0.9, image/avif, image/webp, image/apng, * /*;q=0.8,application/signed-exchange;v=b3;q=0.9") 127 req.Header.Add("accept-encoding", "gzip, deflate, br") 128 req.Header.Add("accept-language", "en-GB,en-US;q=0.9,en;q=0.8") 129 req.Header.Add("cache-control", "no-cache") 130 req.Header.Add("pragma", "no-cache") 131 req.Header.Add("referer", "https://www.offspring.co.uk/") 132 req.Header.Add("sec-ch-ua", `" Not A;Brand"; v = "99", "Chromium"; v = "90", "Google Chrome"; v = "90"`) 133 req.Header.Add("sec-ch-ua-mobile", "?0") 134 req.Header.Add("sec-fetch-dest", "document") 135 req.Header.Add("sec-fetch-mode", "navigate") 136 req.Header.Add("sec-fetch-site", "same-origin") 137 req.Header.Add("sec-fetch-user", "?1") 138 req.Header.Add("upgrade-insecure-requests", "1") 139 req.Header.Add("user-agent", "Mozilla") 140 var hdrs string 141 trace := &httptrace.ClientTrace{WroteHeaderField: func(key string, value []string) { 142 hdrs += key + "\n" 143 }} 144 req = req.WithContext(httptrace.WithClientTrace(req.Context(), trace)) 145 tr := Transport{} 146 resp, err := tr.RoundTrip(req) 147 if err != nil { 148 t.Fatalf(err.Error()) 149 } 150 defer resp.Body.Close() 151 log.Println(hdrs) 152 }